Root/
Source at commit 214 created 13 years 5 months ago. By ifabio, update to chameleon trunk 630, and now the pakage folder is the same as blackosx branch, also add Icon "building" into buildpkg script, and add mint theme info into the English localizable.strings. | |
---|---|
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 */␊ |
11 | const char * getStringFromUUID(const EFI_CHAR8* eUUID)␊ |
12 | {␊ |
13 | static char msg[UUID_LEN*2 + 8] = "";␊ |
14 | if (!eUUID) return "";␊ |
15 | const unsigned char * uuid = (unsigned char*) eUUID;␊ |
16 | sprintf(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]);␊ |
21 | return msg ;␊ |
22 | }␊ |
23 | ␊ |
24 | /** Parse an UUID string into an (EFI_CHAR8*) buffer */␊ |
25 | EFI_CHAR8* getUUIDFromString(const char *source)␊ |
26 | {␊ |
27 | if (!source) return 0;␊ |
28 | ␊ |
29 | ␉char␉*p = (char *)source;␊ |
30 | ␉int␉i;␊ |
31 | ␉char␉buf[3];␊ |
32 | ␉static EFI_CHAR8 uuid[UUID_LEN+1]="";␊ |
33 | ␊ |
34 | ␉buf[2] = '\0';␊ |
35 | ␉for (i=0; i<UUID_LEN; i++) {␊ |
36 | ␉␉if (p[0] == '\0' || p[1] == '\0' || !isxdigit(p[0]) || !isxdigit(p[1])) {␊ |
37 | ␉␉␉verbose("[ERROR] UUID='%s' syntax error\n", source);␊ |
38 | ␉␉␉return 0;␊ |
39 | ␉␉}␊ |
40 | ␉␉buf[0] = *p++;␊ |
41 | ␉␉buf[1] = *p++;␊ |
42 | ␉␉uuid[i] = (unsigned char) strtoul(buf, NULL, 16);␊ |
43 | ␉␉if (*p == '-' && (i % 2) == 1 && i < UUID_LEN - 1) {␊ |
44 | ␉␉␉p++;␊ |
45 | ␉␉}␊ |
46 | ␉}␊ |
47 | ␉uuid[UUID_LEN]='\0';␊ |
48 | ␊ |
49 | ␉if (*p != '\0') {␊ |
50 | ␉␉verbose("[ERROR] UUID='%s' syntax error\n", source);␊ |
51 | ␉␉return 0;␊ |
52 | ␉}␊ |
53 | ␉return uuid;␊ |
54 | }␊ |
55 | ␊ |
56 | /** XXX AsereBLN replace by strtoul */␊ |
57 | uint32_t ascii_hex_to_int(char *buff) ␊ |
58 | {␊ |
59 | ␉uint32_t␉value = 0, i, digit;␊ |
60 | ␉for(i = 0; i < strlen(buff); i++)␊ |
61 | ␉{␊ |
62 | ␉␉if (buff[i] >= 48 && buff[i] <= 57)␉␉␉// '0' through '9'␊ |
63 | ␉␉␉digit = buff[i] - 48;␉␊ |
64 | ␉␉else if (buff[i] >= 65 && buff[i] <= 70)␉// 'A' through 'F'␊ |
65 | ␉␉␉digit = buff[i] - 55;␊ |
66 | ␉␉else if (buff[i] >= 97 && buff[i] <= 102)␉// 'a' through 'f'␊ |
67 | ␉␉␉digit = buff[i] - 87;␊ |
68 | ␉␉else␊ |
69 | ␉␉␉return value;␊ |
70 | ␉␉␊ |
71 | ␉␉value = digit + 16 * value;␊ |
72 | ␉}␊ |
73 | ␉return␉value;␊ |
74 | }␊ |
75 | ␊ |
76 | void *convertHexStr2Binary(const char *hexStr, int *outLength)␊ |
77 | {␊ |
78 | int len;␊ |
79 | char hexNibble;␊ |
80 | char hexByte[2];␊ |
81 | uint8_t binChar;␊ |
82 | uint8_t *binStr;␊ |
83 | int hexStrIdx, binStrIdx, hexNibbleIdx;␊ |
84 | ␊ |
85 | len = strlen(hexStr);␊ |
86 | if (len > 1)␊ |
87 | {␊ |
88 | // the resulting binary will be the half size of the input hex string␊ |
89 | binStr = malloc(len / 2);␊ |
90 | binStrIdx = 0;␊ |
91 | hexNibbleIdx = 0;␊ |
92 | for (hexStrIdx = 0; hexStrIdx < len; hexStrIdx++)␊ |
93 | {␊ |
94 | hexNibble = hexStr[hexStrIdx];␊ |
95 | ␊ |
96 | // ignore all chars except valid hex numbers␊ |
97 | if (hexNibble >= '0' && hexNibble <= '9'␊ |
98 | || hexNibble >= 'A' && hexNibble <= 'F'␊ |
99 | || hexNibble >= 'a' && hexNibble <= 'f')␊ |
100 | {␊ |
101 | hexByte[hexNibbleIdx++] = hexNibble;␊ |
102 | ␊ |
103 | // found both two nibbles, convert to binary␊ |
104 | if (hexNibbleIdx == 2)␊ |
105 | {␊ |
106 | binChar = 0;␊ |
107 | ␊ |
108 | for (hexNibbleIdx = 0; hexNibbleIdx < sizeof(hexByte); hexNibbleIdx++)␊ |
109 | {␊ |
110 | if (hexNibbleIdx > 0) binChar = binChar << 4;␊ |
111 | ␊ |
112 | if (hexByte[hexNibbleIdx] <= '9') binChar += hexByte[hexNibbleIdx] - '0';␊ |
113 | else if (hexByte[hexNibbleIdx] <= 'F') binChar += hexByte[hexNibbleIdx] - ('A' - 10);␊ |
114 | else if (hexByte[hexNibbleIdx] <= 'f') binChar += hexByte[hexNibbleIdx] - ('a' - 10);␊ |
115 | }␊ |
116 | ␊ |
117 | binStr[binStrIdx++] = binChar;␉␉␉␉␉␉␊ |
118 | hexNibbleIdx = 0;␊ |
119 | }␊ |
120 | }␊ |
121 | }␊ |
122 | *outLength = binStrIdx;␊ |
123 | return binStr;␊ |
124 | }␊ |
125 | else␊ |
126 | {␊ |
127 | *outLength = 0;␊ |
128 | return NULL;␊ |
129 | }␊ |
130 | }␊ |
131 | ␊ |
132 | // FIXME: can't use my original code here,␊ |
133 | // Ironically, trying to reuse convertHexStr2Binary() would RESET the system!␊ |
134 | /*␊ |
135 | static EFI_CHAR8* getUUIDFromString2(const char * szInUUID)␊ |
136 | {␊ |
137 | char szUUID[UUID_LEN+1], *p=szUUID;␊ |
138 | int size=0;␊ |
139 | void* ret;␊ |
140 | ␊ |
141 | if (!szInUUID || strlen(szInUUID)<UUID_LEN) return (EFI_CHAR8*) 0;␊ |
142 | ␊ |
143 | while(*szInUUID) if (*szInUUID!='-') *p++=*szInUUID++; else szInUUID++;␊ |
144 | *p='\0';␊ |
145 | ret = convertHexStr2Binary(szUUID, &size);␊ |
146 | if (!ret || size!=UUID_LEN) ␊ |
147 | {␊ |
148 | verbose("UUID: cannot convert string <%s> to valid UUID.\n", szUUID);␊ |
149 | return (EFI_CHAR8*) 0;␊ |
150 | }␊ |
151 | return (EFI_CHAR8*) ret; // new allocated buffer containing the converted string to bin␊ |
152 | }␊ |
153 | */␊ |
154 |