Xinqi Bao's Git

Using strtol with overflow checking.
[st.git] / st.c
diff --git a/st.c b/st.c
index 2ebb15b..23c4caf 100644 (file)
--- a/st.c
+++ b/st.c
@@ -266,9 +266,10 @@ typedef struct {
 } Shortcut;
 
 /* function definitions used in config.h */
-static void xzoom(const Arg *);
-static void selpaste(const Arg *);
+static void clippaste(const Arg *);
 static void numlock(const Arg *);
+static void selpaste(const Arg *);
+static void xzoom(const Arg *);
 
 /* Config.h for applying patches and the configuration. */
 #include "config.h"
@@ -830,7 +831,17 @@ selpaste(const Arg *dummy) {
                        xw.win, CurrentTime);
 }
 
-void selclear(XEvent *e) {
+void
+clippaste(const Arg *dummy) {
+       Atom clipboard;
+
+       clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0);
+       XConvertSelection(xw.dpy, clipboard, sel.xtarget, XA_PRIMARY,
+                       xw.win, CurrentTime);
+}
+
+void
+selclear(XEvent *e) {
        if(sel.bx == -1)
                return;
        sel.bx = -1;
@@ -1285,17 +1296,22 @@ tnewline(int first_col) {
 void
 csiparse(void) {
        /* int noarg = 1; */
-       char *p = csiescseq.buf;
+       char *p = csiescseq.buf, *np;
+       long int v;
 
        csiescseq.narg = 0;
        if(*p == '?')
                csiescseq.priv = 1, p++;
 
        while(p < csiescseq.buf+csiescseq.len) {
-               while(isdigit(*p)) {
-                       csiescseq.arg[csiescseq.narg] *= 10;
-                       csiescseq.arg[csiescseq.narg] += *p++ - '0'/*, noarg = 0 */;
-               }
+               np = NULL;
+               v = strtol(p, &np, 10);
+               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 {
@@ -2105,7 +2121,8 @@ tputc(char *c, int len) {
                        if(BETWEEN(ascii, 0x40, 0x7E)
                                        || csiescseq.len >= ESC_BUF_SIZ) {
                                term.esc = 0;
-                               csiparse(), csihandle();
+                               csiparse();
+                               csihandle();
                        }
                } else if(term.esc & ESC_STR_END) {
                        term.esc = 0;