Root/
Source at commit 1793 created 12 years 5 months ago. By blackosx, Attempt to overcome issue 211 by revising the code to remove all package .svn files before function makeSubstitutions() is called. The line it replaces should work but I can't figure out why it doesn't... | |
---|---|
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 |