parse.c revision efc6f628e15de95bcd13e4f0ee223cb42115d520
1cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines/* 2cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * parse.c --- UUID parsing 3cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * 4cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * Copyright (C) 1996, 1997 Theodore Ts'o. 5cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * 6cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * %Begin-Header% 7cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * Redistribution and use in source and binary forms, with or without 8cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * modification, are permitted provided that the following conditions 9cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * are met: 10cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * 1. Redistributions of source code must retain the above copyright 11cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * notice, and the entire permission notice in its entirety, 12cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * including the disclaimer of warranties. 13cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * 2. Redistributions in binary form must reproduce the above copyright 14cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * notice, this list of conditions and the following disclaimer in the 15cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * documentation and/or other materials provided with the distribution. 16cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * 3. The name of the author may not be used to endorse or promote 17cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * products derived from this software without specific prior 18cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * written permission. 19cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * 20cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED 21cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 22cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF 23cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE 24cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 26cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 27cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 28cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 30cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH 31cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * DAMAGE. 32cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * %End-Header% 33cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines */ 34cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 35cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include <stdlib.h> 36cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include <stdio.h> 37cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include <ctype.h> 38cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include <string.h> 39cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 40cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "uuidP.h" 41cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 42cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesint uuid_parse(const char *in, uuid_t uu) 43cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines{ 44cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines struct uuid uuid; 45cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines int i; 46cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const char *cp; 47cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines char buf[3]; 48cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 49cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (strlen(in) != 36) 50cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return -1; 51cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines for (i=0, cp = in; i <= 36; i++,cp++) { 52cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if ((i == 8) || (i == 13) || (i == 18) || 53cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines (i == 23)) { 54cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (*cp == '-') 55cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines continue; 56cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines else 57cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return -1; 58cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 59cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (i== 36) 60cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (*cp == 0) 61cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines continue; 62cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (!isxdigit(*cp)) 63cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return -1; 64cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 65cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines uuid.time_low = strtoul(in, NULL, 16); 66cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines uuid.time_mid = strtoul(in+9, NULL, 16); 67cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines uuid.time_hi_and_version = strtoul(in+14, NULL, 16); 68cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines uuid.clock_seq = strtoul(in+19, NULL, 16); 69cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines cp = in+24; 70cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines buf[2] = 0; 71cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines for (i=0; i < 6; i++) { 72cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines buf[0] = *cp++; 73cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines buf[1] = *cp++; 74cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines uuid.node[i] = strtoul(buf, NULL, 16); 75cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 76cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 77cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines uuid_pack(&uuid, uu); 78cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return 0; 79cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 80cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines