Chameleon Applications

Chameleon Applications Svn Source Tree

Root/branches/iFabio/i386/libsaio/convert.c

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 */
11const 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 */
25EFI_CHAR8* getUUIDFromString(const char *source)
26{
27 if (!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++) {
36if (p[0] == '\0' || p[1] == '\0' || !isxdigit(p[0]) || !isxdigit(p[1])) {
37verbose("[ERROR] UUID='%s' syntax error\n", source);
38return 0;
39}
40buf[0] = *p++;
41buf[1] = *p++;
42uuid[i] = (unsigned char) strtoul(buf, NULL, 16);
43if (*p == '-' && (i % 2) == 1 && i < UUID_LEN - 1) {
44p++;
45}
46}
47uuid[UUID_LEN]='\0';
48
49if (*p != '\0') {
50verbose("[ERROR] UUID='%s' syntax error\n", source);
51return 0;
52}
53return uuid;
54}
55
56/** XXX AsereBLN replace by strtoul */
57uint32_t ascii_hex_to_int(char *buff)
58{
59uint32_tvalue = 0, i, digit;
60for(i = 0; i < strlen(buff); i++)
61{
62if (buff[i] >= 48 && buff[i] <= 57)// '0' through '9'
63digit = buff[i] - 48;
64else if (buff[i] >= 65 && buff[i] <= 70)// 'A' through 'F'
65digit = buff[i] - 55;
66else if (buff[i] >= 97 && buff[i] <= 102)// 'a' through 'f'
67digit = buff[i] - 87;
68else
69return value;
70
71value = digit + 16 * value;
72}
73returnvalue;
74}
75
76void *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/*
135static 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

Archive Download this file

Revision: 214