Xinqi Bao's Git

-e flag handles arguments.
[st.git] / st.c
diff --git a/st.c b/st.c
index 8e3d72f..d43c30c 100644 (file)
--- a/st.c
+++ b/st.c
@@ -23,7 +23,7 @@
 
 #if   defined(__linux)
  #include <pty.h>
-#elif defined(__OpenBSD__) || defined(__NetBSD__)
+#elif defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__)
  #include <util.h>
 #elif defined(__FreeBSD__) || defined(__DragonFly__)
  #include <libutil.h>
@@ -405,7 +405,7 @@ bpress(XEvent *e) {
 void
 selcopy(void) {
        char *str, *ptr;
-       int ls, x, y, sz, sl;
+       int x, y, sz, sl, ls = 0;
 
        if(sel.bx == -1)
                str = NULL;
@@ -545,11 +545,15 @@ die(const char *errstr, ...) {
 
 void
 execsh(void) {
-       char *args[] = {getenv("SHELL"), "-i", NULL};
+       char **args;
+       char *envshell = getenv("SHELL");
+       DEFAULT(envshell, "sh");
+
        if(opt_cmd)
-               args[0] = opt_cmd, args[1] = NULL;
+               args = (char*[]){"sh", "-c", opt_cmd, NULL};
        else
-               DEFAULT(args[0], SHELL);
+               args = (char*[]){envshell, "-i", NULL};
+       
        putenv("TERM="TNAME);
        execvp(args[0], args);
 }
@@ -606,24 +610,31 @@ dump(char c) {
 
 void
 ttyread(void) {
-       char buf[BUFSIZ], *ptr;
+       static char buf[BUFSIZ];
+       static int buflen = 0; 
+       char *ptr;
        char s[UTF_SIZ];
-       int ret, br;
-       static int buflen = 0;
-       long u;
+       int charsize; /* size of utf8 char in bytes */
+       long utf8c;
+       int ret;
 
+       /* append read bytes to unprocessed bytes */
        if((ret = read(cmdfd, buf+buflen, LEN(buf)-buflen)) < 0)
                die("Couldn't read from shell: %s\n", SERRNO);
-       else {
-               buflen += ret;
-               for(ptr=buf; buflen>=UTF_SIZ||isfullutf8(ptr,buflen); buflen-=br) {
-                       br = utf8decode(ptr, &u);
-                       utf8encode(&u, s);
-                       tputc(s);
-                       ptr += br;
-               }
-               memcpy(buf, ptr, buflen);
+
+       /* process every complete utf8 char */
+       buflen += ret;
+       ptr = buf;
+       while(buflen >= UTF_SIZ || isfullutf8(ptr,buflen)) {
+               charsize = utf8decode(ptr, &utf8c);
+               utf8encode(&utf8c, s);
+               tputc(s);
+               ptr    += charsize;
+               buflen -= charsize;
        }
+
+       /* keep any uncomplete utf8 char for the next call */
+       memmove(buf, ptr, buflen);
 }
 
 void
@@ -1774,7 +1785,6 @@ kpress(XEvent *ev) {
                        /* 3. X lookup  */
                default:
                        if(len > 0) {
-                               buf[sizeof(buf)-1] = '\0';
                                if(meta && len == 1)
                                        ttywrite("\033", 1);
                                ttywrite(buf, len);