Xinqi Bao's Git
projects
/
st.git
/ blobdiff
summary
|
log
|
commit
|
diff
|
tree
raw
|
inline
| side by side
Do not eat ESC character if control string is not properly terminated.
[st.git]
/
st.c
diff --git
a/st.c
b/st.c
index
ff9bdd8
..
d2261e2
100644
(file)
--- a/
st.c
+++ b/
st.c
@@
-149,7
+149,7
@@
enum charset {
enum escape_state {
ESC_START = 1,
ESC_CSI = 2,
enum escape_state {
ESC_START = 1,
ESC_CSI = 2,
- ESC_STR = 4, /* D
SC
, OSC, PM, APC */
+ ESC_STR = 4, /* D
CS
, OSC, PM, APC */
ESC_ALTCHARSET = 8,
ESC_STR_END = 16, /* a final string was encountered */
ESC_TEST = 32, /* Enter in test mode */
ESC_ALTCHARSET = 8,
ESC_STR_END = 16, /* a final string was encountered */
ESC_TEST = 32, /* Enter in test mode */
@@
-375,7
+375,7
@@
static void tmoveto(int, int);
static void tmoveato(int, int);
static void tnew(int, int);
static void tnewline(int);
static void tmoveato(int, int);
static void tnew(int, int);
static void tnewline(int);
-static void tputtab(
bool
);
+static void tputtab(
int
);
static void tputc(char *, int);
static void treset(void);
static int tresize(int, int);
static void tputc(char *, int);
static void treset(void);
static int tresize(int, int);
@@
-452,7
+452,7
@@
static char utf8encodebyte(long, size_t);
static size_t utf8len(char *);
static size_t utf8validate(long *, size_t);
static size_t utf8len(char *);
static size_t utf8validate(long *, size_t);
-static ssize_t xwrite(int, char *, size_t);
+static ssize_t xwrite(int, c
onst c
har *, size_t);
static void *xmalloc(size_t);
static void *xrealloc(void *, size_t);
static char *xstrdup(char *);
static void *xmalloc(size_t);
static void *xrealloc(void *, size_t);
static char *xstrdup(char *);
@@
-518,7
+518,7
@@
static Fontcache frc[16];
static int frclen = 0;
ssize_t
static int frclen = 0;
ssize_t
-xwrite(int fd, char *s, size_t len) {
+xwrite(int fd, c
onst c
har *s, size_t len) {
size_t aux = len;
while(len > 0) {
size_t aux = len;
while(len > 0) {
@@
-992,7
+992,7
@@
selnotify(XEvent *e) {
}
/*
}
/*
- * As seen in
selcopy
:
+ * As seen in
getsel
:
* Line endings are inconsistent in the terminal and GUI world
* copy and pasting. When receiving some selection data,
* replace all '\n' with '\r'.
* Line endings are inconsistent in the terminal and GUI world
* copy and pasting. When receiving some selection data,
* replace all '\n' with '\r'.
@@
-1270,7
+1270,7
@@
ttyread(void) {
void
ttywrite(const char *s, size_t n) {
void
ttywrite(const char *s, size_t n) {
- if(write(cmdfd, s, n) == -1)
+ if(
x
write(cmdfd, s, n) == -1)
die("write error on tty: %s\n", strerror(errno));
}
die("write error on tty: %s\n", strerror(errno));
}
@@
-1781,7
+1781,6
@@
tsetmode(bool priv, bool set, int *args, int narg) {
for(lim = args + narg; args < lim; ++args) {
if(priv) {
switch(*args) {
for(lim = args + narg; args < lim; ++args) {
if(priv) {
switch(*args) {
- break;
case 1: /* DECCKM -- Cursor key */
MODBIT(term.mode, set, MODE_APPCURSOR);
break;
case 1: /* DECCKM -- Cursor key */
MODBIT(term.mode, set, MODE_APPCURSOR);
break;
@@
-1996,8
+1995,7
@@
csihandle(void) {
break;
case 'I': /* CHT -- Cursor Forward Tabulation <n> tab stops */
DEFAULT(csiescseq.arg[0], 1);
break;
case 'I': /* CHT -- Cursor Forward Tabulation <n> tab stops */
DEFAULT(csiescseq.arg[0], 1);
- while(csiescseq.arg[0]--)
- tputtab(1);
+ tputtab(csiescseq.arg[0]);
break;
case 'J': /* ED -- Clear screen */
selclear(NULL);
break;
case 'J': /* ED -- Clear screen */
selclear(NULL);
@@
-2065,8
+2063,7
@@
csihandle(void) {
break;
case 'Z': /* CBT -- Cursor Backward Tabulation <n> tab stops */
DEFAULT(csiescseq.arg[0], 1);
break;
case 'Z': /* CBT -- Cursor Backward Tabulation <n> tab stops */
DEFAULT(csiescseq.arg[0], 1);
- while(csiescseq.arg[0]--)
- tputtab(0);
+ tputtab(-csiescseq.arg[0]);
break;
case 'd': /* VPA -- Move to <row> */
DEFAULT(csiescseq.arg[0], 1);
break;
case 'd': /* VPA -- Move to <row> */
DEFAULT(csiescseq.arg[0], 1);
@@
-2172,7
+2169,7
@@
strhandle(void) {
case 'k': /* old title set compatibility */
xsettitle(strescseq.args[0]);
return;
case 'k': /* old title set compatibility */
xsettitle(strescseq.args[0]);
return;
- case 'P': /* D
SC
-- Device Control String */
+ case 'P': /* D
CS
-- Device Control String */
case '_': /* APC -- Application Program Command */
case '^': /* PM -- Privacy Message */
return;
case '_': /* APC -- Application Program Command */
case '^': /* PM -- Privacy Message */
return;
@@
-2281,19
+2278,17
@@
tdump(void) {
}
void
}
void
-tputtab(
bool forward
) {
+tputtab(
int n
) {
uint x = term.c.x;
uint x = term.c.x;
- if(forward) {
- if(x == term.col)
- return;
- for(++x; x < term.col && !term.tabs[x]; ++x)
- /* nothing */ ;
- } else {
- if(x == 0)
- return;
- for(--x; x > 0 && !term.tabs[x]; --x)
- /* nothing */ ;
+ if(n > 0) {
+ while(x < term.col && n--)
+ for(++x; x < term.col && !term.tabs[x]; ++x)
+ /* nothing */ ;
+ } else if(n < 0) {
+ while(x > 0 && n++)
+ for(--x; x > 0 && !term.tabs[x]; --x)
+ /* nothing */ ;
}
tmoveto(x, term.c.y);
}
}
tmoveto(x, term.c.y);
}
@@
-2303,7
+2298,7
@@
techo(char *buf, int len) {
for(; len > 0; buf++, len--) {
char c = *buf;
for(; len > 0; buf++, len--) {
char c = *buf;
- if(
c < 0x20 || c == 0177
) { /* control code */
+ if(
BETWEEN(c, 0x00, 0x1f) || c == 0x7f
) { /* control code */
if(c != '\n' && c != '\r' && c != '\t') {
c ^= '\x40';
tputc("^", 1);
if(c != '\n' && c != '\r' && c != '\t') {
c ^= '\x40';
tputc("^", 1);
@@
-2457,10
+2452,6
@@
tputc(char *c, int len) {
csiparse();
csihandle();
}
csiparse();
csihandle();
}
- } else if(term.esc & ESC_STR_END) {
- term.esc = 0;
- if(ascii == '\\')
- strhandle();
} else if(term.esc & ESC_ALTCHARSET) {
tdeftran(ascii);
tselcs();
} else if(term.esc & ESC_ALTCHARSET) {
tdeftran(ascii);
tselcs();
@@
-2550,7
+2541,9
@@
tputc(char *c, int len) {
tcursor(CURSOR_LOAD);
term.esc = 0;
break;
tcursor(CURSOR_LOAD);
term.esc = 0;
break;
- case '\\': /* ST -- Stop */
+ case '\\': /* ST -- String Terminator */
+ if(term.esc & ESC_STR_END)
+ strhandle();
term.esc = 0;
break;
default:
term.esc = 0;
break;
default:
@@
-2678,7
+2671,9
@@
tresize(int col, int row) {
if(0 < col && minrow < row) {
tclearregion(0, minrow, col - 1, row - 1);
}
if(0 < col && minrow < row) {
tclearregion(0, minrow, col - 1, row - 1);
}
+ tcursor(CURSOR_SAVE);
tswapscreen();
tswapscreen();
+ tcursor(CURSOR_LOAD);
} while(orig != term.line);
return (slide > 0);
} while(orig != term.line);
return (slide > 0);