radare2/libr/cons/grep.c
pancake 255191c670 * Some more work on r_cons_grep
* Minor refactor in TODO file
* Display xref data (Cx/CX are broken atm)
* Added Vx command
* Compare flag names with ut64 hashnames (faster execution)
* Swap d->i and x->d print formats
* Hint in r_str_cmp
2010-06-25 11:22:14 +02:00

295 lines
7.0 KiB
C

/* radare - LGPL - Copyright 2009-2010 pancake<nopcode.org> */
#include <r_cons.h>
// XXX: needs to be rewritten/reviewed to work for columns and rows
R_API void r_cons_grep(const char *str) {
RCons *cons;
char *optr, *tptr;
char buf[1024];
char *ptr, *ptr2, *ptr3;
cons = r_cons_singleton ();
cons->grep.counter = 0;
cons->grep.token = -1;
/* set grep string */
if (str != NULL && *str) {
if (*str == '!') {
cons->grep.neg = 1;
str = str + 1;
} else cons->grep.neg = 0;
if (*str == '?') {
cons->grep.counter = 1;
str = str + 1;
}
ptr = buf;
strncpy (ptr, str, sizeof (buf));
ptr3 = strchr (ptr, '['); // column number
if (ptr3) {
ptr3[0]='\0';
cons->grep.token = atoi (ptr3+1);
if (cons->grep.token<0)
cons->grep.token = 0;
}
ptr2 = strchr (ptr, ':'); // line number
if (ptr2) {
ptr2[0]='\0';
cons->grep.line = atoi (ptr2+1);
}
cons->grep.nstrings = 0;
if (*ptr) {
free (cons->grep.str);
cons->grep.str = (char *)strdup (ptr);
/* set the rest of words to grep */
cons->grep.nstrings = 0;
// TODO: refactor this ugly loop
optr = cons->grep.str;
tptr = strchr (optr, '!');
while (tptr) {
tptr[0] = '\0';
// TODO: check if keyword > 64
strncpy (cons->grep.strings[cons->grep.nstrings], optr, 63);
cons->grep.nstrings++;
optr = tptr+1;
tptr = strchr (optr, '!');
}
strncpy (cons->grep.strings[cons->grep.nstrings], optr, 63);
cons->grep.nstrings++;
ptr = optr;
}
} else {
cons->grep.token = -1;
cons->grep.line = -1;
cons->grep.str = NULL;
cons->grep.nstrings = 0;
}
}
// Quite inefficient and hacky algorithm.. must optimize
R_API int r_cons_grepbuf(char *buf, int len) {
char *p, *ptr = buf;
int ret = 0;
int l = 0;
for (;(((int)(size_t)(buf-ptr))<len);) {
p = strchr (ptr, '\n');
if (p) {
*p = '\0';
l = p-ptr;
} else l = strlen (ptr);
if (l>0) {
ret = r_cons_grep_line (ptr, l);
if (!p) break;
*p = '\n';
//if (ret != l)
//memcpy (ptr+ret, p+1, len- (buf-ptr));
if (ret>0)
ptr += ret;
else break;
} else ptr++;
}
return ret;
}
/* TODO: use const char * instead ..strdup at the beggining? */
// TODO: this must be a filter like the html one
R_API int r_cons_grep_line(char *buf, int len) {
RCons *cons = r_cons_singleton ();
const char delims[6][2] = { "|", "/", "\\", ",", ";", "\t" };
int donotline = 0;
int i, j, hit = 0;
cons->lines++;
if (cons->grep.nstrings>0) {
//return len+1;
if (cons->lastline==NULL)
cons->lastline = cons->buffer;
for (i=0; i<cons->grep.nstrings; i++) {
cons->grep.str = cons->grep.strings[i];
if ( (!cons->grep.neg && strstr (buf, cons->grep.str))
|| (cons->grep.neg && !strstr (buf, cons->grep.str))) {
hit = 1;
break;
}
}
}cons->lastline = buf;
if (hit) {
if (cons->grep.line != -1) {
if (cons->grep.line==cons->lines-1) {
cons->lastline = buf+len;
} else donotline = 1;
}
} else donotline = 1;
if (donotline) {
//eprintf ("\naaa GREPSTRING (%s) hit=%d (%d)\n\n", cons->lastline, hit, len);
cons->buffer_len -= strlen (cons->lastline)-len;
cons->lastline[0] = '\0';
len = 0;
} else {
//eprintf ("\nzzz GREPSTRING (%s) hit=%d (%d)\n\n", cons->lastline, hit, len);
if (cons->grep.token != -1) {
char *tok = NULL;
char ptr[1024];
//eprintf ("TOEKEN (%s)\n", cons->lastline);
strcpy (ptr, buf); //cons->lastline);
for (i=0; i<len; i++) for (j=0; j<6; j++)
if (ptr[i] == delims[j][0])
ptr[i] = ' ';
tok = ptr;
for (i=0; tok!=NULL && i<=cons->grep.token; i++) {
if (i==0) tok = (char *)strtok (ptr, " ");
else tok = (char *)strtok (NULL, " ");
}
if (tok) {
// XXX remove strlen here!
cons->buffer_len -= strlen (cons->lastline)-len;
len = strlen (tok);
memcpy (cons->lastline, tok, len);
if (cons->lastline[len-1]!='\n')
memcpy (cons->lastline+len, "\n", 2);
}
}
}
return len+1;
}
// XXX: rename char *r_cons_filter_html(const char *ptr)
R_API int r_cons_html_print(const char *ptr) {
const char *str = ptr;
int color = 0;
int esc = 0;
int len = 0;
int inv = 0;
for (;ptr[0]; ptr = ptr + 1) {
if (ptr[0] == '\n') {
printf ("<br />");
fflush (stdout);
}
if (ptr[0] == 0x1b) {
esc = 1;
write (1, str, ptr-str);
str = ptr + 1;
continue;
}
if (esc == 1) {
// \x1b[2J
if (ptr[0] != '[') {
eprintf ("Oops invalid escape char\n");
esc = 0;
str = ptr + 1;
continue;
}
esc = 2;
continue;
} else
if (esc == 2) {
if (ptr[0]=='2'&&ptr[1]=='J') {
ptr = ptr +1;
printf ("<hr />\n"); fflush(stdout);
esc = 0;
str = ptr;
continue;
} else
if (ptr[0]=='0'&&ptr[1]==';'&&ptr[2]=='0') {
ptr = ptr + 4;
r_cons_gotoxy (0,0);
esc = 0;
str = ptr;
continue;
} else
if (ptr[0]=='0'&&ptr[1]=='m') {
ptr = ptr + 1;
str = ptr + 1;
inv = 0;
esc = 0;
continue;
// reset color
} else
if (ptr[0]=='7'&&ptr[1]=='m') {
inv = 128;
ptr = ptr + 1;
str = ptr + 1;
esc = 0;
continue;
// reset color
} else
if (ptr[0]=='3' && ptr[2]=='m') {
color = 1;
switch(ptr[1]) {
case '0': // BLACK
printf ("<font color=black>"); fflush(stdout);
break;
case '1': // RED
printf ("<font color=red>"); fflush(stdout);
break;
case '2': // GREEN
printf ("<font color=green>"); fflush(stdout);
break;
case '3': // YELLOW
printf ("<font color=yellow>"); fflush(stdout);
break;
case '4': // BLUE
printf ("<font color=blue>"); fflush(stdout);
break;
case '5': // MAGENTA
printf ("<font color=magenta>"); fflush(stdout);
break;
case '6': // TURQOISE
printf ("<font color=#0ae>"); fflush(stdout);
break;
case '7': // WHITE
printf ("<font color=white>"); fflush(stdout);
break;
case '8': // GRAY
printf ("<font color=#777>"); fflush(stdout);
break;
case '9': // ???
break;
}
ptr = ptr + 1;
str = ptr + 2;
esc = 0;
continue;
} else
if (ptr[0]=='4' && ptr[2]=='m') {
/* background color */
switch (ptr[1]) {
case '0': // BLACK
printf ("<font style='background-color:#000'>"); fflush(stdout);
break;
case '1': // RED
printf ("<font style='background-color:#f00'>"); fflush(stdout);
break;
case '2': // GREEN
printf ("<font style='background-color:#0f0'>"); fflush(stdout);
break;
case '3': // YELLOW
printf ("<font style='background-color:#ff0'>"); fflush(stdout);
break;
case '4': // BLUE
printf ("<font style='background-color:#00f'>"); fflush(stdout);
break;
case '5': // MAGENTA
printf ("<font style='background-color:#f0f'>"); fflush(stdout);
break;
case '6': // TURQOISE
printf ("<font style='background-color:#aaf'>"); fflush(stdout);
break;
case '7': // WHITE
printf ("<font style='background-color:#fff'>"); fflush(stdout);
break;
case '8': // GRAY
printf ("<font style='background-color:#777'>"); fflush(stdout);
break;
case '9': // ???
break;
}
}
}
len++;
}
write (1, str, ptr-str);
return len;
}