X-Git-Url: https://git.danieliu.xyz/?p=st.git;a=blobdiff_plain;f=st.c;h=58f79411839d948b46ccc6e55dfc60e7f99a72f0;hp=1a8fa1f52148d9c3c608807074fc261574b87be5;hb=69e32a6;hpb=ed132e11271d18a5d8aa163096bc6192c694bc47 diff --git a/st.c b/st.c index 1a8fa1f..58f7941 100644 --- a/st.c +++ b/st.c @@ -48,7 +48,6 @@ /* macros */ #define NUMMAXLEN(x) ((int)(sizeof(x) * 2.56 + 0.5) + 1) -#define DEFAULT(a, b) (a) = (a) ? (a) : (b) #define ISCONTROLC0(c) (BETWEEN(c, 0, 0x1f) || (c) == '\177') #define ISCONTROLC1(c) (BETWEEN(c, 0x80, 0x9f)) #define ISCONTROL(c) (ISCONTROLC0(c) || ISCONTROLC1(c)) @@ -124,8 +123,8 @@ static void sendbreak(const Arg *); /* config.h for applying patches and the configuration. */ #include "config.h" -static void execsh(void); -static void stty(void); +static void execsh(char **); +static void stty(char **); static void sigchld(int); static void csidump(void); @@ -189,14 +188,6 @@ Term term; Selection sel; int cmdfd; pid_t pid; -char **opt_cmd = NULL; -char *opt_class = NULL; -char *opt_embed = NULL; -char *opt_font = NULL; -char *opt_io = NULL; -char *opt_line = NULL; -char *opt_name = NULL; -char *opt_title = NULL; int oldbutton = 3; /* button event on startup: 3 = release */ static CSIEscape csiescseq; @@ -634,9 +625,9 @@ die(const char *errstr, ...) } void -execsh(void) +execsh(char **args) { - char **args, *sh, *prog; + char *sh, *prog; const struct passwd *pw; errno = 0; @@ -650,13 +641,13 @@ execsh(void) if ((sh = getenv("SHELL")) == NULL) sh = (pw->pw_shell[0]) ? pw->pw_shell : shell; - if (opt_cmd) - prog = opt_cmd[0]; + if (args) + prog = args[0]; else if (utmp) prog = utmp; else prog = sh; - args = (opt_cmd) ? opt_cmd : (char *[]) {prog, NULL}; + DEFAULT(args, ((char *[]) {prog, NULL})); unsetenv("COLUMNS"); unsetenv("LINES"); @@ -697,7 +688,7 @@ sigchld(int a) void -stty(void) +stty(char **args) { char cmd[_POSIX_ARG_MAX], **p, *q, *s; size_t n, siz; @@ -707,7 +698,7 @@ stty(void) memcpy(cmd, stty_args, n); q = cmd + n; siz = sizeof(cmd) - n; - for (p = opt_cmd; p && (s = *p); ++p) { + for (p = args; p && (s = *p); ++p) { if ((n = strlen(s)) > siz-1) die("stty parameter length too long\n"); *q++ = ' '; @@ -721,26 +712,26 @@ stty(void) } void -ttynew(void) +ttynew(char *line, char *out, char **args) { int m, s; struct winsize w = {term.row, term.col, 0, 0}; - if (opt_io) { + if (out) { term.mode |= MODE_PRINT; - iofd = (!strcmp(opt_io, "-")) ? - 1 : open(opt_io, O_WRONLY | O_CREAT, 0666); + iofd = (!strcmp(out, "-")) ? + 1 : open(out, O_WRONLY | O_CREAT, 0666); if (iofd < 0) { fprintf(stderr, "Error opening %s:%s\n", - opt_io, strerror(errno)); + out, strerror(errno)); } } - if (opt_line) { - if ((cmdfd = open(opt_line, O_RDWR)) < 0) + if (line) { + if ((cmdfd = open(line, O_RDWR)) < 0) die("open line failed: %s\n", strerror(errno)); dup2(cmdfd, 0); - stty(); + stty(args); return; } @@ -762,7 +753,7 @@ ttynew(void) die("ioctl TIOCSCTTY failed: %s\n", strerror(errno)); close(s); close(m); - execsh(); + execsh(args); break; default: close(s); @@ -1942,8 +1933,7 @@ void tprinter(char *s, size_t len) { if (iofd != -1 && xwrite(iofd, s, len) < 0) { - fprintf(stderr, "Error writing in %s:%s\n", - opt_io, strerror(errno)); + perror("Error writing to output file"); close(iofd); iofd = -1; } @@ -2532,7 +2522,7 @@ tresize(int col, int row) void resettitle(void) { - xsettitle(opt_title ? opt_title : "st"); + xsettitle(NULL); } void