Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}
Exemple #4
0
// (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;
}
Exemple #5
0
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;
}
Exemple #6
0
static inline ut8 rgbnum (const char ch) {
	ut8 r;
	r_hex_to_byte (&r, ch);
	return r*16;
}
Exemple #7
0
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;
}