Mercurial > pidgin
comparison src/protocols/qq/utils.c @ 14049:8294485b79db
[gaim-migrate @ 16662]
Enhanced protocol testing tools, primarily by designing a more useful interface for sending customized packets.
committer: Tailor Script <tailor@pidgin.im>
| author | Mark Huetsch <markhuetsch> |
|---|---|
| date | Mon, 07 Aug 2006 06:17:13 +0000 |
| parents | ef8490f9e823 |
| children | 51f71ad82141 |
comparison
equal
deleted
inserted
replaced
| 14048:9c4bec886220 | 14049:8294485b79db |
|---|---|
| 197 { | 197 { |
| 198 GString *stripped; | 198 GString *stripped; |
| 199 gchar *ret; | 199 gchar *ret; |
| 200 int i; | 200 int i; |
| 201 | 201 |
| 202 g_return_val_if_fail(buffer != NULL, NULL); | |
| 203 | |
| 202 stripped = g_string_new(""); | 204 stripped = g_string_new(""); |
| 203 for (i=0; i<strlen(buffer); i++) { | 205 for (i=0; i<strlen(buffer); i++) { |
| 204 if ((int) buffer[i] != 32) { | 206 if ((int) buffer[i] != 32) { |
| 205 g_string_append_c(stripped, buffer[i]); | 207 g_string_append_c(stripped, buffer[i]); |
| 206 } | 208 } |
| 212 } | 214 } |
| 213 | 215 |
| 214 /* Dumps an ASCII hex string to a string of bytes. The return should be freed later. | 216 /* Dumps an ASCII hex string to a string of bytes. The return should be freed later. |
| 215 * Returns NULL if a string with an odd number of nibbles is passed in or if buffer | 217 * Returns NULL if a string with an odd number of nibbles is passed in or if buffer |
| 216 * isn't a valid hex string */ | 218 * isn't a valid hex string */ |
| 217 guint8 *hex_str_to_bytes(const gchar *buffer) | 219 guint8 *hex_str_to_bytes(const gchar *buffer, gint *out_len) |
| 218 { | 220 { |
| 219 gchar *hex_str, *hex_buffer, *cursor, tmp; | 221 gchar *hex_str, *hex_buffer, *cursor, tmp; |
| 220 guint8 *bytes, nibble1, nibble2; | 222 guint8 *bytes, nibble1, nibble2; |
| 221 gint index, len; | 223 gint index; |
| 222 | 224 |
| 225 g_return_val_if_fail(buffer != NULL, NULL); | |
| 226 | |
| 223 hex_buffer = strstrip(buffer); | 227 hex_buffer = strstrip(buffer); |
| 224 | 228 |
| 225 if (strlen(hex_buffer) % 2 != 0) { | 229 if (strlen(hex_buffer) % 2 != 0) { |
| 226 gaim_debug(GAIM_DEBUG_WARNING, "QQ", | 230 gaim_debug(GAIM_DEBUG_WARNING, "QQ", |
| 227 "Unable to convert an odd number of nibbles to a string of bytes!\n"); | 231 "Unable to convert an odd number of nibbles to a string of bytes!\n"); |
| 231 bytes = g_newa(guint8, strlen(hex_buffer) / 2); | 235 bytes = g_newa(guint8, strlen(hex_buffer) / 2); |
| 232 hex_str = g_ascii_strdown(hex_buffer, -1); | 236 hex_str = g_ascii_strdown(hex_buffer, -1); |
| 233 g_free(hex_buffer); | 237 g_free(hex_buffer); |
| 234 index = 0; | 238 index = 0; |
| 235 for (cursor = hex_str; cursor < hex_str + sizeof(gchar) * (strlen(hex_str)) - 1; cursor++) { | 239 for (cursor = hex_str; cursor < hex_str + sizeof(gchar) * (strlen(hex_str)) - 1; cursor++) { |
| 236 if (g_ascii_isdigit(*cursor)) {tmp = *cursor; nibble1 = atoi(&tmp); } | 240 if (g_ascii_isdigit(*cursor)) { |
| 237 else if (g_ascii_isalpha(*cursor) && (gint) *cursor - 87 < 16) | 241 tmp = *cursor; nibble1 = atoi(&tmp); |
| 242 } else if (g_ascii_isalpha(*cursor) && (gint) *cursor - 87 < 16) { | |
| 238 nibble1 = (gint) *cursor - 87; | 243 nibble1 = (gint) *cursor - 87; |
| 239 else { | 244 } else { |
| 240 gaim_debug(GAIM_DEBUG_WARNING, "QQ", | 245 gaim_debug(GAIM_DEBUG_WARNING, "QQ", |
| 241 "Invalid char found in hex string!\n"); | 246 "Invalid char found in hex string!\n"); |
| 242 g_free(hex_str); | 247 g_free(hex_str); |
| 243 return NULL; | 248 return NULL; |
| 244 } | 249 } |
| 245 nibble1 = nibble1 << 4; | 250 nibble1 = nibble1 << 4; |
| 246 cursor++; | 251 cursor++; |
| 247 if (g_ascii_isdigit(*cursor)) {tmp = *cursor; nibble2 = atoi(&tmp); } | 252 if (g_ascii_isdigit(*cursor)) { |
| 248 else if (g_ascii_isalpha(*cursor) && (gint) (*cursor - 87) < 16) | 253 tmp = *cursor; nibble2 = atoi(&tmp); |
| 254 } else if (g_ascii_isalpha(*cursor) && (gint) (*cursor - 87) < 16) { | |
| 249 nibble2 = (gint) *cursor - 87; | 255 nibble2 = (gint) *cursor - 87; |
| 250 else { | 256 } else { |
| 257 gaim_debug(GAIM_DEBUG_WARNING, "QQ", | |
| 258 "Invalid char found in hex string!\n"); | |
| 251 g_free(hex_str); | 259 g_free(hex_str); |
| 252 return NULL; | 260 return NULL; |
| 253 } | 261 } |
| 254 bytes[index++] = nibble1 + nibble2; | 262 bytes[index++] = nibble1 + nibble2; |
| 255 } | 263 } |
| 256 len = strlen(hex_str) / 2; | 264 *out_len = strlen(hex_str) / 2; |
| 257 g_free(hex_str); | 265 g_free(hex_str); |
| 258 return g_memdup(bytes, len); | 266 return g_memdup(bytes, *out_len); |
| 259 } | 267 } |
| 260 | 268 |
| 261 /* Dumps a chunk of raw data into an ASCII hex string. The return should be freed later. */ | 269 /* Dumps a chunk of raw data into an ASCII hex string. The return should be freed later. */ |
| 262 gchar *hex_dump_to_str(const guint8 *buffer, gint bytes) | 270 gchar *hex_dump_to_str(const guint8 *buffer, gint bytes) |
| 263 { | 271 { |
