Skip to content

Commit 6213aa0

Browse files
authored
One less recursion and other minor fixes in rcons
1 parent 98093b3 commit 6213aa0

File tree

1 file changed

+26
-10
lines changed

1 file changed

+26
-10
lines changed

libr/cons/grep.c

+26-10
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,20 @@
1111
#define I(x) r_cons_singleton ()->x
1212

1313
static char *strchr_ns(char *s, const char ch) {
14-
char *p = strchr (s, ch);
15-
if (p && p > s) {
16-
char *prev = p - 1;
17-
if (*prev == '\\') {
18-
memmove (prev, p, strlen (p) + 1);
19-
return strchr_ns (p, ch);
14+
if (!s) {
15+
return NULL;
16+
}
17+
18+
char *p;
19+
while ((p = strchr (s, ch)) != NULL) {
20+
if (p > s && *(p - 1) == '\\') {
21+
memmove (p - 1, p, strlen (p) + 1);
22+
s = p;
23+
} else {
24+
return p;
2025
}
2126
}
22-
return p;
27+
return NULL;
2328
}
2429

2530
static void r_cons_grep_word_free(RConsGrepWord *gw) {
@@ -369,8 +374,9 @@ R_API void r_cons_grep_expression(const char *str) {
369374
if (!grep->str) {
370375
grep->str = (char *)strdup (ptr);
371376
} else {
372-
grep->str = r_str_append (grep->str, ",");
373-
grep->str = r_str_append (grep->str, ptr);
377+
char *s = r_str_newf (",%s", ptr);
378+
grep->str = r_str_append (grep->str, s);
379+
free (s);
374380
}
375381
do {
376382
optr = ptr;
@@ -483,7 +489,14 @@ static int cmp(const void *a, const void *b) {
483489
const char *ca = r_str_trim_head_ro (a);
484490
const char *cb = r_str_trim_head_ro (b);
485491
if (!a || !b) {
486-
return (int) (size_t) ((char *) a - (char *) b);
492+
ptrdiff_t diff = (char*)a - (char*)b;
493+
if (diff > INT_MAX) {
494+
return INT_MAX;
495+
}
496+
if (diff < INT_MIN) {
497+
return INT_MIN;
498+
}
499+
return (int)diff;
487500
}
488501
RConsContext *ctx = r_cons_context ();
489502
if (ctx->sorted_column > 0) {
@@ -730,6 +743,9 @@ R_API void r_cons_grepbuf(void) {
730743
char *sbuf = r_str_ndup (cons->context->buffer, cons->context->buffer_len);
731744
if (sbuf) {
732745
char *res = r_str_tokenize_json (sbuf);
746+
if (!res) {
747+
return;
748+
}
733749
char *nres = r_print_json_indent (res, I(context->color_mode), " ", NULL);
734750
free (res);
735751
res = r_str_newf ("%s\n", nres);

0 commit comments

Comments
 (0)