X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=st.c;h=8b5ba644af423de6932eec728ccf475d63e3761d;hb=1c1621da699adae49a4344b145f856dacb57270c;hp=23c4cafa3a7bc6bdcb2116558583405e44699d95;hpb=37863356b00cd41c24e10243121649473b98824f;p=st.git diff --git a/st.c b/st.c index 23c4caf..8b5ba64 100644 --- a/st.c +++ b/st.c @@ -796,7 +796,7 @@ selcopy(void) { } /* \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; } @@ -1295,32 +1295,29 @@ tnewline(int first_col) { 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 */ @@ -1928,23 +1925,14 @@ strhandle(void) { 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 @@ -1955,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)"); @@ -2043,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 {