Chameleon

Chameleon Svn Source Tree

Root/trunk/i386/libsaio/convert.c

1/*
2 * Convert.c
3 * Implement conversion utility functions
4 * Create UUID parsing functions and gather other conversion routines
5 * --Rek
6 */
7
8#include "convert.h"
9
10/** Transform a 16 bytes hexadecimal value UUID to a string */
11const char *getStringFromUUID(const EFI_CHAR8 *eUUID)
12{
13static char msg[UUID_LEN*2 + 8] = "";
14if (!eUUID) return "";
15const unsigned char * uuid = (unsigned char*) eUUID;
16snprintf(msg, sizeof(msg), "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
17 uuid[0], uuid[1], uuid[2], uuid[3],
18 uuid[4], uuid[5], uuid[6], uuid[7],
19 uuid[8], uuid[9], uuid[10],uuid[11],
20 uuid[12],uuid[13],uuid[14],uuid[15]);
21return msg ;
22}
23
24/** Parse an UUID string into an (EFI_CHAR8 *) buffer */
25EFI_CHAR8 *getUUIDFromString(const char *source)
26{
27if (!source)
28{
29return 0;
30}
31
32inti = strlen(source);
33if (i != 36)
34{ // e.g 00112233-4455-6677-8899-AABBCCDDEEFF
35verbose("[ERROR] UUID='%s' has incorrect length=%d. Use format: 00112233-4455-6677-8899-AABBCCDDEEFF.\n", source, i);
36return 0;
37}
38
39char*p = (char *)source;
40charbuf[3];
41static EFI_CHAR8 uuid[UUID_LEN+1] = "";
42
43buf[2] = '\0';
44for (i = 0; i < UUID_LEN; i++)
45{
46if (p[0] == '\0' || p[1] == '\0' || !isxdigit(p[0]) || !isxdigit(p[1]))
47{
48verbose("[ERROR] UUID='%s' syntax error.\n", source);
49return 0;
50}
51buf[0] = *p++;
52buf[1] = *p++;
53uuid[i] = (unsigned char) strtoul(buf, NULL, 16);
54if ((*p == '-') && ((i % 2) == 1) && (i < UUID_LEN - 1))
55{
56p++;
57}
58}
59uuid[UUID_LEN]='\0';
60
61if (*p != '\0')
62{
63verbose("[ERROR] UUID='%s' syntax error\n", source);
64return 0;
65}
66return uuid;
67}
68
69/** XXX AsereBLN replace by strtoul */
70uint32_t ascii_hex_to_int(char *buff)
71{
72uint32_tvalue = 0, i, digit;
73for(i = 0; i < strlen(buff); i++)
74{
75if (buff[i] >= 48 && buff[i] <= 57)// '0' through '9'
76digit = buff[i] - 48;
77else if (buff[i] >= 65 && buff[i] <= 70)// 'A' through 'F'
78digit = buff[i] - 55;
79else if (buff[i] >= 97 && buff[i] <= 102)// 'a' through 'f'
80digit = buff[i] - 87;
81else
82return value;
83
84value = digit + 16 * value;
85}
86returnvalue;
87}
88
89void *convertHexStr2Binary(const char *hexStr, int *outLength)
90{
91int len;
92char hexNibble;
93char hexByte[2];
94uint8_t binChar;
95uint8_t *binStr;
96int hexStrIdx, binStrIdx, hexNibbleIdx;
97
98len = strlen(hexStr);
99if (len > 1)
100{
101// the resulting binary will be the half size of the input hex string
102binStr = malloc(len / 2);
103if (!binStr)
104{
105*outLength = 0;
106return NULL;
107}
108bzero(binStr,len / 2 );
109
110binStrIdx = 0;
111hexNibbleIdx = 0;
112for (hexStrIdx = 0; hexStrIdx < len; hexStrIdx++)
113{
114hexNibble = hexStr[hexStrIdx];
115
116// ignore all chars except valid hex numbers
117if ( (hexNibble >= '0' && hexNibble <= '9') ||
118(hexNibble >= 'A' && hexNibble <= 'F') ||
119(hexNibble >= 'a' && hexNibble <= 'f') )
120{
121hexByte[hexNibbleIdx++] = hexNibble;
122
123// found both two nibbles, convert to binary
124if (hexNibbleIdx == 2)
125{
126binChar = 0;
127
128for (hexNibbleIdx = 0; (unsigned)hexNibbleIdx < sizeof(hexByte); hexNibbleIdx++)
129{
130if (hexNibbleIdx > 0)
131{
132binChar = binChar << 4;
133}
134
135if (hexByte[hexNibbleIdx] <= '9') binChar += hexByte[hexNibbleIdx] - '0';
136else if (hexByte[hexNibbleIdx] <= 'F') binChar += hexByte[hexNibbleIdx] - ('A' - 10);
137else if (hexByte[hexNibbleIdx] <= 'f') binChar += hexByte[hexNibbleIdx] - ('a' - 10);
138}
139
140binStr[binStrIdx++] = binChar;
141hexNibbleIdx = 0;
142}
143}
144}
145*outLength = binStrIdx;
146return binStr;
147}
148else
149{
150*outLength = 0;
151return NULL;
152}
153}
154
155// FIXME: can't use my original code here,
156// Ironically, trying to reuse convertHexStr2Binary() would RESET the system!
157/*
158static EFI_CHAR8 *getUUIDFromString2(const char * szInUUID)
159{
160 char szUUID[UUID_LEN+1], *p=szUUID;
161 int size=0;
162 void* ret;
163
164 if (!szInUUID || strlen(szInUUID)<UUID_LEN) return (EFI_CHAR8*) 0;
165
166 while(*szInUUID) if (*szInUUID!='-') *p++=*szInUUID++; else szInUUID++;
167 *p='\0';
168 ret = convertHexStr2Binary(szUUID, &size);
169 if (!ret || size!=UUID_LEN)
170 {
171 verbose("UUID: cannot convert string <%s> to valid UUID.\n", szUUID);
172 return (EFI_CHAR8*) 0;
173 }
174 return (EFI_CHAR8 *) ret; // new allocated buffer containing the converted string to bin
175}
176*/
177

Archive Download this file

Revision: 2636