static inline ut8 rgbnum (const char ch, const char cl) { ut8 h = 0; ut8 l = 0; r_hex_to_byte (&h, ch); r_hex_to_byte (&l, cl); return h*16+l; }
R_API int r_hex_str2bin(const char *in, ut8 *out) { unsigned int len = 0, j = 0; const char *ptr; ut8 c = 0, d = 0; if (!memcmp (in, "0x", 2)) in += 2; for (ptr = in; ; ptr++) { /* ignored chars */ if (*ptr==':' || *ptr=='\n' || *ptr=='\t' || *ptr=='\r' || *ptr==' ') continue; if (j==2) { out[len] = c; len++; c = j = 0; if (ptr[0]==' ') continue; } /* break after len++ */ if (ptr[0] == '\0') break; d = c; if (ptr[0]=='0' && ptr[1]=='x' ){ //&& c==0) { ut64 addr = r_num_get (NULL, ptr); unsigned int addr32 = (ut32) addr; if (addr & ~0xFFFFFFFF) { // 64 bit fun } else { // 32 bit fun ut8 *addrp = (ut8*) &addr32; // XXX always copy in native endian? out[len++] = addrp[0]; out[len++] = addrp[1]; out[len++] = addrp[2]; out[len++] = addrp[3]; while (*ptr && *ptr!=' ' && *ptr!='\t') ptr++; j = 0; } continue; } if (r_hex_to_byte (&c, ptr[0])) { //eprintf("binstr: Invalid hexa string at %d ('0x%02x') (%s).\n", (int)(ptr-in), ptr[0], in); return -1; } c |= d; if (j++ == 0) c <<= 4; } // has nibbles. requires a mask if (j) { out[len] = c; len = -len; } return (int)len; }
R_API int r_str_unescape(char *buf) { unsigned char ch = 0, ch2 = 0; int err = 0; int i; for (i = 0; buf[i]; i++) { if (buf[i] != '\\') { continue; } if (buf[i+1] == 'e') { buf[i] = 0x1b; memmove (buf + i + 1, buf + i + 2, strlen (buf + i + 2) + 1); } else if (buf[i + 1] == '\\') { buf[i] = '\\'; memmove (buf + i + 1, buf + i + 2, strlen (buf + i + 2) + 1); } else if (buf[i+1] == 'r') { buf[i] = 0x0d; memmove (buf + i + 1, buf + i + 2, strlen (buf + i + 2) + 1); } else if (buf[i+1] == 'n') { buf[i] = 0x0a; memmove (buf + i + 1, buf + i + 2, strlen (buf + i + 2) + 1); } else if (buf[i + 1] == 'x') { err = ch2 = ch = 0; if (!buf[i + 2] || !buf[i + 3]) { eprintf ("Unexpected end of string.\n"); return 0; } err |= r_hex_to_byte (&ch, buf[i + 2]); err |= r_hex_to_byte (&ch2, buf[i + 3]); if (err) { eprintf ("Error: Non-hexadecimal chars in input.\n"); return 0; // -1? } buf[i] = (ch << 4) + ch2; memmove (buf + i + 1, buf + i + 4, strlen (buf + i + 4) + 1); } else { eprintf ("'\\x' expected.\n"); return 0; // -1? } } return i; }
// (0A) => 10 || -1 (on error) R_API int r_hex_pair2bin(const char *arg) { ut8 *ptr, c = 0, d = 0; ut32 j = 0; for (ptr = (ut8*)arg; ;ptr = ptr + 1) { if (!*ptr || *ptr==' ' || j==2) break; d = c; if (*ptr!='.' && r_hex_to_byte (&c, *ptr)) { eprintf ("Invalid hexa string at char '%c' (%s).\n", *ptr, arg); return -1; } c |= d; if (j++ == 0) c <<= 4; } return (int)c; }
static inline ut8 rgbnum(const char ch1, const char ch2) { ut8 r = 0, r2 = 0; r_hex_to_byte (&r, ch1); r_hex_to_byte (&r2, ch2); return r << 4 | r2; }
static inline ut8 rgbnum (const char ch) { ut8 r; r_hex_to_byte (&r, ch); return r*16; }
R_API int r_hex_str2bin(const char *in, ut8 *out) { int len = 0, j = 0; const char *ptr; ut8 c = 0, d = 0; int outbuf = 0; if (!in || !*in) return 0; if (!memcmp (in, "0x", 2)) in += 2; if (!out) { outbuf = 1; out = malloc (strlen (in)); } for (ptr = in; ; ptr++) { /* comments */ if (*ptr=='#') { while (*ptr && *ptr != '\n') ptr++; if (!ptr[0]) break; ptr--; continue; } if (*ptr == '/' && ptr[1]=='*') { while (*ptr && ptr[1]) { if (*ptr == '*' && ptr[1]=='/') break; ptr++; } if (!ptr[0] || !ptr[1]) break; ptr++; continue; } /* ignored chars */ if (*ptr==':' || *ptr=='\n' || *ptr=='\t' || *ptr=='\r' || *ptr==' ') continue; if (j==2) { out[len] = c; len++; c = j = 0; if (ptr[0]==' ') continue; } /* break after len++ */ if (ptr[0] == '\0') break; d = c; if (ptr[0]=='0' && ptr[1]=='x' ){ //&& c==0) { ut64 addr = r_num_get (NULL, ptr); unsigned int addr32 = (ut32) addr; if (addr & ~0xFFFFFFFF) { // 64 bit fun } else { // 32 bit fun ut8 *addrp = (ut8*) &addr32; // XXX always copy in native endian? out[len++] = addrp[0]; out[len++] = addrp[1]; out[len++] = addrp[2]; out[len++] = addrp[3]; while (*ptr && *ptr!=' ' && *ptr!='\t') ptr++; j = 0; } /* Go back one character, the loop head does ptr++. */ ptr--; continue; } if (r_hex_to_byte (&c, ptr[0])) { //eprintf("binstr: Invalid hexa string at %d ('0x%02x') (%s).\n", (int)(ptr-in), ptr[0], in); goto beach; } c |= d; if (j++ == 0) c <<= 4; } // has nibbles. requires a mask beach: if (j) { out[len] = c; len = -len; } if (outbuf) { free (out); } return (int)len; }