]> git.armaanb.net Git - st.git/blobdiff - st.c
STREscape: don't trim prematurely
[st.git] / st.c
diff --git a/st.c b/st.c
index 48d65cab6c173afb2f5e14b3badf5b1836182576..50226d1677b230d290d9e802742e85f27dc1d4b4 100644 (file)
--- a/st.c
+++ b/st.c
@@ -16,7 +16,6 @@
 #include <termios.h>
 #include <unistd.h>
 #include <wchar.h>
-#include <wctype.h>
 
 #include "st.h"
 #include "win.h"
@@ -42,7 +41,7 @@
 #define ISCONTROLC0(c)         (BETWEEN(c, 0, 0x1f) || (c) == '\177')
 #define ISCONTROLC1(c)         (BETWEEN(c, 0x80, 0x9f))
 #define ISCONTROL(c)           (ISCONTROLC0(c) || ISCONTROLC1(c))
-#define ISDELIM(u)             ((iswspace(u) || iswpunct(u)) && wcschr(extrawordchars, u) == NULL)
+#define ISDELIM(u)             (u && wcschr(worddelimiters, u))
 
 enum term_mode {
        MODE_WRAP        = 1 << 0,
@@ -367,7 +366,7 @@ char
 base64dec_getc(const char **src)
 {
        while (**src && !isprint(**src)) (*src)++;
-       return *((*src)++);
+       return **src ? *((*src)++) : '=';  /* emulate padding if string ends */
 }
 
 char *
@@ -385,6 +384,10 @@ base64dec(const char *src)
                int c = base64_digits[(unsigned char) base64dec_getc(&src)];
                int d = base64_digits[(unsigned char) base64dec_getc(&src)];
 
+               /* invalid input. 'a' can be -1, e.g. if src is "\n" (c-str) */
+               if (a == -1 || b == -1)
+                       break;
+
                *dst++ = (a << 2) | ((b & 0x30) >> 4);
                if (c == -1)
                        break;
@@ -459,7 +462,7 @@ selextend(int col, int row, int type, int done)
        selnormalize();
        sel.type = type;
 
-       if (oldey != sel.oe.y || oldex != sel.oe.x || oldtype != sel.type)
+       if (oldey != sel.oe.y || oldex != sel.oe.x || oldtype != sel.type || sel.mode == SEL_EMPTY)
                tsetdirt(MIN(sel.nb.y, oldsby), MAX(sel.ne.y, oldsey));
 
        sel.mode = done ? SEL_IDLE : SEL_READY;
@@ -2327,7 +2330,7 @@ tputc(Rune u)
                if (term.esc&ESC_DCS && strescseq.len == 0 && u == 'q')
                        term.mode |= MODE_SIXEL;
 
-               if (strescseq.len+len >= sizeof(strescseq.buf)-1) {
+               if (strescseq.len+len >= sizeof(strescseq.buf)) {
                        /*
                         * Here is a bug in terminals. If the user never sends
                         * some code to stop the str or esc command, then st