parse.c revision 1e3472c5f37ca3686dd69b079d4d02a302f5798d
11e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o/*
21e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o * parse.c --- UUID parsing
31e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o */
41e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
51e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#include <stdio.h>
61e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
71e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#include "uuidP.h"
81e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
91e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'oint uuid_parse(char *in, uuid_t uu)
101e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o{
111e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	struct uuid uuid;
121e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	int i;
131e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	char *cp, buf[3];
141e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
151e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	if (strlen(in) != 36)
161e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o		return -1;
171e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	for (i=0, cp = in; i <= 36; i++,cp++) {
181e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o		if ((i == 8) || (i == 13) || (i == 18) ||
191e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o		    (i == 23))
201e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o			if (*cp == '-')
211e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o				continue;
221e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o		if (i== 36)
231e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o			if (*cp == 0)
241e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o				continue;
251e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o		if (!isxdigit(*cp))
261e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o			return -1;
271e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	}
281e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	uuid.time_low = strtoul(in, NULL, 16);
291e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	uuid.time_mid = strtoul(in+9, NULL, 16);
301e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	uuid.time_hi_and_version = strtoul(in+14, NULL, 16);
311e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	uuid.clock_seq = strtoul(in+19, NULL, 16);
321e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	cp = in+24;
331e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	buf[2] = 0;
341e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	for (i=0; i < 6; i++) {
351e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o		buf[0] = *cp++;
361e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o		buf[1] = *cp++;
371e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o		uuid.node[i] = strtoul(buf, NULL, 16);
381e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	}
391e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
401e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	uuid_pack(&uuid, uu);
411e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	return 0;
421e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o}
43