diff options
| -rw-r--r-- | st.c | 40 | 
1 files changed, 17 insertions, 23 deletions
| @@ -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 { | 
