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:
		
							
								
								
									
										40
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								st.c
									
									
									
									
									
								
							@ -1306,23 +1306,18 @@ csiparse(void) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while(p < csiescseq.buf+csiescseq.len) {
 | 
						while(p < csiescseq.buf+csiescseq.len) {
 | 
				
			||||||
		np = NULL;
 | 
					 | 
				
			||||||
		v = strtol(p, &np, 10);
 | 
							v = strtol(p, &np, 10);
 | 
				
			||||||
 | 
							if(np == p)
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
		if(v == LONG_MAX || v == LONG_MIN)
 | 
							if(v == LONG_MAX || v == LONG_MIN)
 | 
				
			||||||
			v = -1;
 | 
								v = -1;
 | 
				
			||||||
		csiescseq.arg[csiescseq.narg] = v;
 | 
							csiescseq.arg[csiescseq.narg++] = v;
 | 
				
			||||||
		if(np != NULL)
 | 
							p = np;
 | 
				
			||||||
			p = np;
 | 
							if(*p != ';' || csiescseq.narg == ESC_ARG_SIZ)
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
		if(*p == ';' && csiescseq.narg+1 < ESC_ARG_SIZ) {
 | 
							p++;
 | 
				
			||||||
			csiescseq.narg++, p++;
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			csiescseq.mode = *p;
 | 
					 | 
				
			||||||
			csiescseq.narg++;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			return;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						csiescseq.mode = *p;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* for absolute user moves, when decom is set */
 | 
					/* for absolute user moves, when decom is set */
 | 
				
			||||||
@ -1930,16 +1925,13 @@ strhandle(void) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
strparse(void) {
 | 
					strparse(void) {
 | 
				
			||||||
	char *p = strescseq.buf, *np, *sp;
 | 
						char *p = strescseq.buf, *sp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	strescseq.narg = 0;
 | 
						strescseq.buf[strescseq.len] = '\0';
 | 
				
			||||||
	np = strtok_r(strescseq.buf, ";", &sp);
 | 
						for(p = strtok_r(p, ";", &sp); p; p = strtok_r(NULL, ";", &sp)) {
 | 
				
			||||||
	while(p < strescseq.buf+strescseq.len && np != NULL) {
 | 
							if(strescseq.narg == STR_ARG_SIZ)
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
		strescseq.args[strescseq.narg++] = p;
 | 
							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);
 | 
						printf("ESC%c", strescseq.type);
 | 
				
			||||||
	for(i = 0; i < strescseq.len; i++) {
 | 
						for(i = 0; i < strescseq.len; i++) {
 | 
				
			||||||
		c = strescseq.buf[i] & 0xff;
 | 
							c = strescseq.buf[i] & 0xff;
 | 
				
			||||||
		if(isprint(c)) {
 | 
							if(c == '\0') {
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							} else if(isprint(c)) {
 | 
				
			||||||
			putchar(c);
 | 
								putchar(c);
 | 
				
			||||||
		} else if(c == '\n') {
 | 
							} else if(c == '\n') {
 | 
				
			||||||
			printf("(\\n)");
 | 
								printf("(\\n)");
 | 
				
			||||||
@ -2039,7 +2033,7 @@ tputc(char *c, int len) {
 | 
				
			|||||||
			strhandle();
 | 
								strhandle();
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			if(strescseq.len + len < sizeof(strescseq.buf)) {
 | 
								if(strescseq.len + len < sizeof(strescseq.buf) - 1) {
 | 
				
			||||||
				memmove(&strescseq.buf[strescseq.len], c, len);
 | 
									memmove(&strescseq.buf[strescseq.len], c, len);
 | 
				
			||||||
				strescseq.len += len;
 | 
									strescseq.len += len;
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user