parse.c revision ce2722f86de298ad1a8965f55a453b5723d2b2b9
11e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o/*
21e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o * parse.c --- UUID parsing
319c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o *
419c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * Copyright (C) 1996, 1997 Theodore Ts'o.
519c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o *
619c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * %Begin-Header%
73030daa8aba89830fb0623be01e507bffd636399Theodore Ts'o * This file may be redistributed under the terms of the GNU
83030daa8aba89830fb0623be01e507bffd636399Theodore Ts'o * Library General Public License.
919c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * %End-Header%
101e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o */
111e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
1219c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o#include <stdlib.h>
131e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#include <stdio.h>
1419c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o#include <ctype.h>
15b1416db3227b4b7192ee0d2d3ff6e00e92e9d3e2Theodore Ts'o#include <string.h>
161e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
171e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#include "uuidP.h"
181e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
19ce2722f86de298ad1a8965f55a453b5723d2b2b9Theodore Ts'oint uuid_parse(const char *in, uuid_t uu)
201e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o{
21ce2722f86de298ad1a8965f55a453b5723d2b2b9Theodore Ts'o	struct uuid	uuid;
22ce2722f86de298ad1a8965f55a453b5723d2b2b9Theodore Ts'o	int 		i;
23ce2722f86de298ad1a8965f55a453b5723d2b2b9Theodore Ts'o	const char	*cp;
24ce2722f86de298ad1a8965f55a453b5723d2b2b9Theodore Ts'o	char		buf[3];
251e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
261e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	if (strlen(in) != 36)
271e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o		return -1;
281e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	for (i=0, cp = in; i <= 36; i++,cp++) {
291e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o		if ((i == 8) || (i == 13) || (i == 18) ||
301e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o		    (i == 23))
311e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o			if (*cp == '-')
321e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o				continue;
331e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o		if (i== 36)
341e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o			if (*cp == 0)
351e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o				continue;
361e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o		if (!isxdigit(*cp))
371e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o			return -1;
381e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	}
391e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	uuid.time_low = strtoul(in, NULL, 16);
401e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	uuid.time_mid = strtoul(in+9, NULL, 16);
411e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	uuid.time_hi_and_version = strtoul(in+14, NULL, 16);
421e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	uuid.clock_seq = strtoul(in+19, NULL, 16);
431e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	cp = in+24;
441e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	buf[2] = 0;
451e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	for (i=0; i < 6; i++) {
461e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o		buf[0] = *cp++;
471e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o		buf[1] = *cp++;
481e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o		uuid.node[i] = strtoul(buf, NULL, 16);
491e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	}
501e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
511e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	uuid_pack(&uuid, uu);
521e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	return 0;
531e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o}
54