scc

A fork of https://git.simple-cc.org/scc/ for Qute

git clone https://git.8pit.net/scc.git

 1#include <stdio.h>
 2#include <stdlib.h>
 3
 4#include <scc/arg.h>
 5#include <scc/config.h>
 6#include <scc/scc.h>
 7
 8#define MAXCMD 400
 9
10char *argv0;
11
12static char *arch, *format, *prefix, *outfile;
13static int debug;
14
15static void
16usage(void)
17{
18	fputs("usage: as [-o outfile][-m arch][-f format] file ...\n",
19	      stderr);
20	exit(EXIT_FAILURE);
21}
22
23int
24main(int argc, char *argv[])
25{
26	int cnt, len, rem, r;
27	char cmd[MAXCMD];
28
29	if (!(arch = getenv("ARCH")))
30		arch = ARCH;
31	if (!(format = getenv("FORMAT")))
32		format = FORMAT;
33	if (!(prefix = getenv("SCCPREFIX")))
34		prefix = PREFIX;
35
36	ARGBEGIN {
37	case 'o':
38		outfile = EARGF(usage());
39		break;
40	case 'm':
41		arch = EARGF(usage());
42		break;
43	case 'f':
44		format = EARGF(usage());
45		break;
46	case 'd':
47		debug = 1;
48		break;
49	} ARGEND
50
51	if (argc < 1)
52		usage();
53
54	r = snprintf(cmd, sizeof(cmd), "%s/libexec/scc/as-%s", prefix, arch);
55	if (r < 0 || r >= sizeof(cmd))
56		goto toolong;
57
58	cnt = r;
59	rem = sizeof(cmd) - cnt;
60	if (outfile) {
61		r = snprintf(cmd + cnt, rem, " -o %s", outfile);
62		if (r < 0 || r >= rem)
63			goto toolong;
64		rem -= r;
65		cnt += r;
66	}
67
68	for ( ; *argv; ++argv) {
69		r = snprintf(cmd + cnt, rem, " %s", *argv);
70		if (r < 0 || r >= rem)
71			goto toolong;
72		rem -= r;
73		cnt += r;
74	}
75
76	if (debug)
77		fprintf(stderr, "as: command line '%s'\n", cmd);
78
79	r = system(cmd);
80	if (r == 0)
81		return 0;
82	if (r < 0)
83		perror("as");
84	exit(EXIT_FAILURE);
85
86toolong:
87	fputs("as: too long command line\n", stderr);
88	exit(EXIT_FAILURE);
89}