diff options
Diffstat (limited to 'samsung-ipc/util.c')
-rw-r--r-- | samsung-ipc/util.c | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/samsung-ipc/util.c b/samsung-ipc/util.c new file mode 100644 index 0000000..c6dce60 --- /dev/null +++ b/samsung-ipc/util.c @@ -0,0 +1,118 @@ +/** + * This file is part of libsamsung-ipc. + * + * Copyright (C) 2010-2011 Joerie de Gram <j.de.gram@gmail.com> + * + * libsamsung-ipc is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * libsamsung-ipc is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with libsamsung-ipc. If not, see <http://www.gnu.org/licenses/>. + * + */ + +#include <stdio.h> +#include <string.h> +#include <ctype.h> + +#if defined(ANDROID) && !defined(LOG_STDOUT) + +#define LOG_TAG "RIL" +#include <utils/Log.h> +#define printf LOGI + +#endif + +void hex_dump(void *data, int size) +{ + /* dumps size bytes of *data to stdout. Looks like: + * [0000] 75 6E 6B 6E 6F 77 6E 20 + * 30 FF 00 00 00 00 39 00 unknown 0.....9. + * (in a single line of course) + */ + + unsigned char *p = data; + unsigned char c; + int n; + char bytestr[4] = {0}; + char addrstr[10] = {0}; + char hexstr[ 16*3 + 5] = {0}; + char charstr[16*1 + 5] = {0}; + for(n=1;n<=size;n++) { + if (n%16 == 1) { + /* store address for this line */ + snprintf(addrstr, sizeof(addrstr), "%.4x", + ((unsigned int)p-(unsigned int)data) ); + } + + c = *p; + if (isalnum(c) == 0) { + c = '.'; + } + + /* store hex str (for left side) */ + snprintf(bytestr, sizeof(bytestr), "%02X ", *p); + strncat(hexstr, bytestr, sizeof(hexstr)-strlen(hexstr)-1); + + /* store char str (for right side) */ + snprintf(bytestr, sizeof(bytestr), "%c", c); + strncat(charstr, bytestr, sizeof(charstr)-strlen(charstr)-1); + + if(n%16 == 0) { + /* line completed */ + printf("[%4.4s] %-50.50s %s\n", addrstr, hexstr, charstr); + hexstr[0] = 0; + charstr[0] = 0; + } else if(n%8 == 0) { + /* half line: add whitespaces */ + strncat(hexstr, " ", sizeof(hexstr)-strlen(hexstr)-1); + strncat(charstr, " ", sizeof(charstr)-strlen(charstr)-1); + } + p++; /* next byte */ + } + + if (strlen(hexstr) > 0) { + /* print rest of buffer if not empty */ + printf("[%4.4s] %-50.50s %s\n", addrstr, hexstr, charstr); + } +} + +const char *plmn_lookup(const char *plmn) +{ + unsigned int mcc, mnc; + sscanf(plmn, "%3u%2u", &mcc, &mnc); + + switch(mcc) { + case 204: + switch(mnc) { + case 1: return "VastMobiel"; + case 2: return "Tele2"; + case 4: return "Vodafone"; + case 8: case 10: return "KPN"; + case 12: return "Telfort"; + case 16: case 20: return "T-Mobile"; + } + } + + return NULL; +} + +char *plmn_string(const char *plmn) +{ + int length = (plmn[5] == '#') ? 6 : 7; + + char *plmn_str = (char*)malloc(length); + + memcpy(plmn_str, plmn, length); + plmn_str[length-1] = '\0'; + + return plmn_str; +} + |