scc-as.c - scc - simple c99 compiler
(HTM) git clone git://git.simple-cc.org/scc
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Submodules
(DIR) README
(DIR) LICENSE
---
scc-as.c (1467B)
---
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
10 char *argv0;
11
12 static char *arch, *format, *prefix, *outfile;
13 static int debug;
14
15 static void
16 usage(void)
17 {
18 fputs("usage: as [-o outfile][-m arch][-f format] file ...\n",
19 stderr);
20 exit(EXIT_FAILURE);
21 }
22
23 int
24 main(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
86 toolong:
87 fputs("as: too long command line\n", stderr);
88 exit(EXIT_FAILURE);
89 }