aboutsummaryrefslogtreecommitdiffstats
path: root/st.c
diff options
context:
space:
mode:
authorChristoph Lohmann <20h@r-36.net>2013-02-26 18:19:44 +0100
committerChristoph Lohmann <20h@r-36.net>2013-02-26 18:19:44 +0100
commit7d32471efffa825f52d24930b5ee617105f9c83e (patch)
tree1f41bfde8b4eac27473d78e9b60ede16ee1b0354 /st.c
parent7cb0d95509d1b2837e4fa7d131f497800b20d22c (diff)
downloadst-7d32471efffa825f52d24930b5ee617105f9c83e.tar.gz
Fixing bugs in the strtol and strtok_r replacements.
Thanks "Roberto E. Vargas Caballero" <k0ga@shike2.com> for the comments!
Diffstat (limited to 'st.c')
-rw-r--r--st.c40
1 files changed, 17 insertions, 23 deletions
diff --git a/st.c b/st.c
index 7ddce0c..9f5793c 100644
--- 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 {
remember that computers suck.