Root/
Source at commit 429 created 13 years 9 months ago. By meklort, Updated module system. Hooks can now be used within modules when cetaion functions are called in chameleon. Note that onle two hooks currently exist, more need to be added. I also updated the HelloWorld module to use a hook instead of print out right away. | |
---|---|
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 |