-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

patched str.c in libr/util
- -- 
Stop talking and start compiling.
Linux user #557897
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.20 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQEcBAEBAgAGBQJSFOtgAAoJEK64IL1uI2hanFsIAJDejQLOxHKgISYdbWb6Km85
9FAyVVNNFijzmzHKDCpCd2QBYWRBWCJpo8lFzZZi8R8HwCVB2b7B6nFbr/Jm0dnu
pzn2jcxgTHXQWdU2LnPuYNLpo3C0bE6Y5hY0ZMz3XP3BzIL4knZTPFS9jPZFDYb+
x85R4a65SfcZvPM8t1nMzQI78yMbWRoEWqX3Q12TwPWcAmiy1ZMSYqVLlJ2BauDD
qMMj7tQl6S+GLLepMjkWFg2oT5AS4s1ncTbZ4OUpYRmy5W/HhtxN4KVH647fiKn4
7BY9Jx5vG+bcEVB3O9vJTO8lKq+p4aQ2gYuAq8hBboYMjRckzrFY1rkKUazt6Qg=
=2QLS
-----END PGP SIGNATURE-----
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>

#define ut8 uint8_t
#define ut16 uint16_t
#define ut32 uint32_t

// Must be merged inside strlen
int r_str_len_utf8 (const char *s) {
	int i = 0, j = 0;
	while (s[i]) {
		if ((s[i] & 0xc0) != 0x80) j++;
		i++;
	}
	return j;
}

//R_DOC r_mem_mem: Finds the needle of nlen size into the haystack of hlen size
//R_UNIT printf("%s\n", r_mem_mem("food is pure lame", 20, "is", 2));
const ut8 *r_mem_mem(const ut8 *haystack, int hlen, const ut8 *needle, int nlen) {
	int i, until = hlen-nlen+1;
	for (i=0; i<until; i++) {
		if (!memcmp (haystack+i, needle, nlen))
			return haystack+i;
	}
	return NULL;
}
/*
char* r_str_replace(char *str, const char *key, const char *val, int g) {
	int off, i;
	
	int klen = r_str_len_utf8 (key);
	int vlen0 = r_str_len_utf8 (val); // Counting symbols

	int vlen1 = strlen(val); // Counting bytes

	int slen = r_str_len_utf8 (str);

	char *new, *old, *p2, *p = str;
	for (i = 0; i < slen; ) {
		p = (char *)r_mem_mem (
			(const ut8*)str + i, slen - i,
			(const ut8*)key, klen);
		if (!p) break; // || !p[klen]) break;
		old = strdup (p+klen);
		slen += (vlen1-klen) + vlen1;
		off = (int)(size_t)(p-str);
		new = realloc (str, slen);
		if (!new) {
			printf ("realloc fail\n");
			free (str);
			free (old);
			str = NULL;
			break;
		}

		str = new;
		p = str+off;

		p2 = strdup(p + klen);
		memcpy (p + vlen1, p2, strlen(p2));

		memcpy (p, val, vlen1);

		memcpy (p+vlen1, old, r_str_len_utf8 (old)+1);

		i += off+vlen1;
		free (old);
		if (!g) break;
	}
	return str;
}
*/


char* r_str_replace(char *str, const char *key, const char *val, int g) {
  int off, i;
  int klen = strlen (key);
  int vlen = strlen (val);
  int slen = strlen (str);
  char *new, *old, *p = str;
  for (i=0; i<slen; ) {
    p = (char *)r_mem_mem (
			   (const ut8*)str + i, slen - i,
			   (const ut8*)key, klen);
    if (!p) break; // || !p[klen]) break;
    old = strdup (p+klen);
    slen += (vlen-klen) + 1;
    off = (int)(size_t)(p-str);
    //printf("%s\n", str);
    //printf("offset = %i\n", off);
    new = realloc (str, slen);
    if (!new) {
      printf ("realloc fail\n");
      free (str);
      free (old);
      str = NULL;
      break;
    }
    str = new;
    p = str+off;
    memcpy (p, val, vlen);
    memcpy (p+vlen, old, strlen (old)+1);
    i = off+vlen;
    //printf("%i:\t%s\n", i, str);
    free (old);
    if (!g) break;
  }
  return str;
}


int main(int argc, char **argv) {
	char *tst0 = "sd│gs = = #$% sdfg";
	char *tst1 = "|sf|fdfh|||dfg|";
	printf ( "%s\n", tst0);
	printf ( "%s\n", tst1);
	tst0 = r_str_replace (strdup (tst0), "=", "│", 1);
	tst1 = r_str_replace (strdup (tst1), "|", "│", 1);
	printf ( "%s\n", tst0);
	printf ( "%s\n", tst1);
	return EXIT_SUCCESS;
}

_______________________________________________
radare mailing list
[email protected]
http://lists.nopcode.org/listinfo.cgi/radare-nopcode.org

Reply via email to