scc

Simple C99 Compiler
Log | Files | Refs | README | LICENSE

commit b29bf1f729a168c028821069ea4bb46000c82f96
parent c9609c601b47b56b6e1843141a121fd207be61f1
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Tue, 31 May 2016 08:41:49 +0200

Merge remote-tracking branch 'origin/master'

Diffstat:
driver/posix/scc.c | 60++++++++++++++++++++++++++++++++----------------------------
1 file changed, 32 insertions(+), 28 deletions(-)

diff --git a/driver/posix/scc.c b/driver/posix/scc.c @@ -14,6 +14,7 @@ #include "../../inc/arg.h" #include "../../inc/cc.h" +#define ADDARG(t, p) ((tools[t].args[++tools[t].nargs]) = (p)) #define NARGS 64 enum { @@ -23,7 +24,7 @@ enum { NR_TOOLS, }; -static struct { +static struct tool { char cmd[PATH_MAX]; char *args[NARGS]; int nargs; @@ -53,64 +54,67 @@ terminate(void) } int -settool(int tool, int pipeout) +settool(int t, int pipeout) { + struct tool *tool = &tools[t]; int fds[2], n; static int fdin; - switch (tool) { + switch (t) { case CC1: case CC2: - n = snprintf(tools[tool].bin, sizeof(tools[tool].bin), - arch ? "%s-%s" : "%s", tools[tool].name, arch); - if (n < 0 || n >= sizeof(tools[tool].bin)) + n = snprintf(tool->bin, sizeof(tool->bin), + arch ? "%s-%s" : "%s", tool->name, arch); + if (n < 0 || n >= sizeof(tool->bin)) die("scc: target tool name too long"); - n = snprintf(tools[tool].cmd, sizeof(tools[tool].cmd), - "%s/libexec/scc/%s", PREFIX, tools[tool].bin); - if (n < 0 || n >= sizeof(tools[tool].cmd)) + n = snprintf(tool->cmd, sizeof(tool->cmd), + "%s/libexec/scc/%s", PREFIX, tool->bin); + if (n < 0 || n >= sizeof(tool->cmd)) die("scc: target tool path too long"); break; default: break; } - tools[tool].args[0] = tools[tool].bin; + tool->args[0] = tool->bin; if (fdin) { - tools[tool].in = fdin; + tool->in = fdin; fdin = 0; } if (pipeout) { if (pipe(fds)) die("scc: pipe: %s", strerror(errno)); - tools[tool].out = fds[1]; + tool->out = fds[1]; fdin = fds[0]; } - return tool; + return t; } void -spawn(int tool) +spawn(int t) { - switch (tools[tool].pid = fork()) { + struct tool *tool = &tools[t]; + + switch (tool->pid = fork()) { case -1: - die("scc: %s: %s", tools[tool].name, strerror(errno)); + die("scc: %s: %s", tool->name, strerror(errno)); case 0: - if (tools[tool].out) - dup2(tools[tool].out, 1); - if (tools[tool].in) - dup2(tools[tool].in, 0); - execvp(tools[tool].cmd, tools[tool].args); + if (tool->out) + dup2(tool->out, 1); + if (tool->in) + dup2(tool->in, 0); + execvp(tool->cmd, tool->args); fprintf(stderr, "scc: execv %s: %s\n", - tools[tool].cmd, strerror(errno)); + tool->cmd, strerror(errno)); _exit(1); default: - if (tools[tool].in) - close(tools[tool].in); - if (tools[tool].out) - close(tools[tool].out); + if (tool->in) + close(tool->in); + if (tool->out) + close(tool->out); break; } } @@ -134,7 +138,7 @@ main(int argc, char *argv[]) ARGBEGIN { case 'E': Eflag = 1; - tools[CC1].args[++tools[CC1].nargs] = "-E"; + ADDARG(CC1, "-E"); break; case 'm': arch = EARGF(usage()); @@ -149,7 +153,7 @@ main(int argc, char *argv[]) if (!argc) die("scc: fatal error: no input files"); - tools[CC1].args[++tools[CC1].nargs] = *argv; + ADDARG(CC1, *argv); if (Eflag) { spawn(settool(CC1, 0));