st

fork of suckless's simple terminal
Index Commits Files Refs README LICENSE
commit 7d32471efffa825f52d24930b5ee617105f9c83e
parent 7cb0d95509d1b2837e4fa7d131f497800b20d22c
Author: Christoph Lohmann <20h@r-36.net>
Date:   Tue, 26 Feb 2013 18:19:44 +0100

Fixing bugs in the strtol and strtok_r replacements.

Thanks "Roberto E. Vargas Caballero" <k0ga@shike2.com> for the comments!

Diffstat:
Mst.c | 40+++++++++++++++++-----------------------
1 file changed, 17 insertions(+), 23 deletions(-)
diff --git a/st.c b/st.c
@@ -1306,23 +1306,18 @@ csiparse(void) {
     }
 
     while(p < csiescseq.buf+csiescseq.len) {
-        np = NULL;
         v = strtol(p, &np, 10);
+        if(np == p)
+            break;
         if(v == LONG_MAX || v == LONG_MIN)
             v = -1;
-        csiescseq.arg[csiescseq.narg] = v;
-        if(np != NULL)
-            p = np;
-
-        if(*p == ';' && csiescseq.narg+1 < ESC_ARG_SIZ) {
-            csiescseq.narg++, p++;
-        } else {
-            csiescseq.mode = *p;
-            csiescseq.narg++;
-
-            return;
-        }
+        csiescseq.arg[csiescseq.narg++] = v;
+        p = np;
+        if(*p != ';' || csiescseq.narg == ESC_ARG_SIZ)
+            break;
+        p++;
     }
+    csiescseq.mode = *p;
 }
 
 /* for absolute user moves, when decom is set */
@@ -1930,16 +1925,13 @@ strhandle(void) {
 
 void
 strparse(void) {
-    char *p = strescseq.buf, *np, *sp;
+    char *p = strescseq.buf, *sp;
 
-    strescseq.narg = 0;
-    np = strtok_r(strescseq.buf, ";", &sp);
-    while(p < strescseq.buf+strescseq.len && np != NULL) {
+    strescseq.buf[strescseq.len] = '\0';
+    for(p = strtok_r(p, ";", &sp); p; p = strtok_r(NULL, ";", &sp)) {
+        if(strescseq.narg == STR_ARG_SIZ)
+            return;
         strescseq.args[strescseq.narg++] = p;
-
-        np = strtok_r(NULL, ";", &sp);
-        if(np != NULL)
-            p = np;
     }
 }
 
@@ -1951,7 +1943,9 @@ strdump(void) {
     printf("ESC%c", strescseq.type);
     for(i = 0; i < strescseq.len; i++) {
         c = strescseq.buf[i] & 0xff;
-        if(isprint(c)) {
+        if(c == '\0') {
+            return;
+        } else if(isprint(c)) {
             putchar(c);
         } else if(c == '\n') {
             printf("(\\n)");
@@ -2039,7 +2033,7 @@ tputc(char *c, int len) {
             strhandle();
             break;
         default:
-            if(strescseq.len + len < sizeof(strescseq.buf)) {
+            if(strescseq.len + len < sizeof(strescseq.buf) - 1) {
                 memmove(&strescseq.buf[strescseq.len], c, len);
                 strescseq.len += len;
             } else {