Chameleon

Chameleon Svn Source Tree

Root/branches/ErmaC/Enoch/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;
16sprintf(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) return 0;
28
29char*p = (char *)source;
30inti;
31charbuf[3];
32static EFI_CHAR8 uuid[UUID_LEN+1]="";
33
34buf[2] = '\0';
35for (i=0; i<UUID_LEN; i++)
36{
37if (p[0] == '\0' || p[1] == '\0' || !isxdigit(p[0]) || !isxdigit(p[1]))
38{
39verbose("[ERROR] UUID='%s' syntax error\n", source);
40return 0;
41}
42buf[0] = *p++;
43buf[1] = *p++;
44uuid[i] = (unsigned char) strtoul(buf, NULL, 16);
45if (*p == '-' && (i % 2) == 1 && i < UUID_LEN - 1)
46{
47p++;
48}
49}
50uuid[UUID_LEN]='\0';
51
52if (*p != '\0')
53{
54verbose("[ERROR] UUID='%s' syntax error\n", source);
55return 0;
56}
57return uuid;
58}
59
60/** XXX AsereBLN replace by strtoul */
61uint32_t ascii_hex_to_int(char *buff)
62{
63uint32_tvalue = 0, i, digit;
64for(i = 0; i < strlen(buff); i++)
65{
66if (buff[i] >= 48 && buff[i] <= 57)// '0' through '9'
67digit = buff[i] - 48;
68else if (buff[i] >= 65 && buff[i] <= 70)// 'A' through 'F'
69digit = buff[i] - 55;
70else if (buff[i] >= 97 && buff[i] <= 102)// 'a' through 'f'
71digit = buff[i] - 87;
72else
73return value;
74
75value = digit + 16 * value;
76}
77returnvalue;
78}
79
80void *convertHexStr2Binary(const char *hexStr, int *outLength)
81{
82int len;
83char hexNibble;
84char hexByte[2];
85uint8_t binChar;
86uint8_t *binStr;
87int hexStrIdx, binStrIdx, hexNibbleIdx;
88
89len = strlen(hexStr);
90if (len > 1)
91{
92// the resulting binary will be the half size of the input hex string
93binStr = malloc(len / 2);
94
95binStrIdx = 0;
96hexNibbleIdx = 0;
97for (hexStrIdx = 0; hexStrIdx < len; hexStrIdx++)
98{
99hexNibble = hexStr[hexStrIdx];
100
101// ignore all chars except valid hex numbers
102if ( (hexNibble >= '0' && hexNibble <= '9') ||
103(hexNibble >= 'A' && hexNibble <= 'F') ||
104(hexNibble >= 'a' && hexNibble <= 'f') )
105{
106hexByte[hexNibbleIdx++] = hexNibble;
107
108// found both two nibbles, convert to binary
109if (hexNibbleIdx == 2)
110{
111binChar = 0;
112
113for (hexNibbleIdx = 0; hexNibbleIdx < sizeof(hexByte); hexNibbleIdx++)
114{
115if (hexNibbleIdx > 0)
116{
117binChar = binChar << 4;
118}
119
120if (hexByte[hexNibbleIdx] <= '9') binChar += hexByte[hexNibbleIdx] - '0';
121else if (hexByte[hexNibbleIdx] <= 'F') binChar += hexByte[hexNibbleIdx] - ('A' - 10);
122else if (hexByte[hexNibbleIdx] <= 'f') binChar += hexByte[hexNibbleIdx] - ('a' - 10);
123}
124
125binStr[binStrIdx++] = binChar;
126hexNibbleIdx = 0;
127}
128}
129}
130*outLength = binStrIdx;
131return binStr;
132}
133else
134{
135*outLength = 0;
136return NULL;
137}
138}
139
140// FIXME: can't use my original code here,
141// Ironically, trying to reuse convertHexStr2Binary() would RESET the system!
142/*
143static EFI_CHAR8* getUUIDFromString2(const char * szInUUID)
144{
145 char szUUID[UUID_LEN+1], *p=szUUID;
146 int size=0;
147 void* ret;
148
149 if (!szInUUID || strlen(szInUUID)<UUID_LEN) return (EFI_CHAR8*) 0;
150
151 while(*szInUUID) if (*szInUUID!='-') *p++=*szInUUID++; else szInUUID++;
152 *p='\0';
153 ret = convertHexStr2Binary(szUUID, &size);
154 if (!ret || size!=UUID_LEN)
155 {
156 verbose("UUID: cannot convert string <%s> to valid UUID.\n", szUUID);
157 return (EFI_CHAR8*) 0;
158 }
159 return (EFI_CHAR8*) ret; // new allocated buffer containing the converted string to bin
160}
161*/
162

Archive Download this file

Revision: 2471