# st

Unnamed repository; edit this file 'description' to name the repository.

| 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 {