X-Git-Url: https://git.xinqibao.xyz/st.git/blobdiff_plain/00ba6969f863c75536910a0138b5161bbd0638c9..732b9601ed2543b1fa6acbc08ddc05818279265f:/st.c?ds=inline diff --git a/st.c b/st.c index 8e3d72f..d43c30c 100644 --- a/st.c +++ b/st.c @@ -23,7 +23,7 @@ #if defined(__linux) #include -#elif defined(__OpenBSD__) || defined(__NetBSD__) +#elif defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__) #include #elif defined(__FreeBSD__) || defined(__DragonFly__) #include @@ -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);