}
/* \n at the end of every selected line except for the last one */
if(is_selected && y < sel.e.y)
- *ptr++ = '\n';
+ *ptr++ = '\r';
}
*ptr = 0;
}
void
csiparse(void) {
- /* int noarg = 1; */
char *p = csiescseq.buf, *np;
long int v;
csiescseq.narg = 0;
- if(*p == '?')
- csiescseq.priv = 1, p++;
+ if(*p == '?') {
+ csiescseq.priv = 1;
+ p++;
+ }
while(p < csiescseq.buf+csiescseq.len) {
np = NULL;
v = strtol(p, &np, 10);
+ if(np == p)
+ v = 0;
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 */
void
strparse(void) {
- /*
- * TODO: Implement parsing like for CSI when required.
- * Format: ESC type cmd ';' arg0 [';' argn] ESC \
- */
- int narg = 0;
- char *start = strescseq.buf, *end = start + strescseq.len;
- strescseq.args[0] = start;
- while(start < end && narg < LEN(strescseq.args)) {
- start = memchr(start, ';', end - start);
- if(!start)
- break;
- *start++ = '\0';
- if(start < end) {
- strescseq.args[++narg] = start;
- }
+ char *p = strescseq.buf, *sp;
+
+ 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;
}
- strescseq.narg = narg + 1;
}
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)");
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 {