Fixing bugs in the strtol and strtok_r replacements.
Thanks "Roberto E. Vargas Caballero" <k0ga@shike2.com> for the comments!
This commit is contained in:
		
							parent
							
								
									7cb0d95509
								
							
						
					
					
						commit
						7d32471eff
					
				
							
								
								
									
										40
									
								
								st.c
								
								
								
								
							
							
						
						
									
										40
									
								
								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 {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue