st

my customized branch of st - synced with upstream git://git.suckless.org/st
git clone git://git.jakekoroman.com/st
Log | 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 {