1#include <stdio.h>2#include <stdlib.h>34#include <scc/arg.h>5#include <scc/config.h>6#include <scc/scc.h>78#define MAXCMD 400910char *argv0;1112static char *arch, *format, *prefix, *outfile;13static int debug;1415static void16usage(void)17{18 fputs("usage: as [-o outfile][-m arch][-f format] file ...\n",19 stderr);20 exit(EXIT_FAILURE);21}2223int24main(int argc, char *argv[])25{26 int cnt, len, rem, r;27 char cmd[MAXCMD];2829 if (!(arch = getenv("ARCH")))30 arch = ARCH;31 if (!(format = getenv("FORMAT")))32 format = FORMAT;33 if (!(prefix = getenv("SCCPREFIX")))34 prefix = PREFIX;3536 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 } ARGEND5051 if (argc < 1)52 usage();5354 r = snprintf(cmd, sizeof(cmd), "%s/libexec/scc/as-%s", prefix, arch);55 if (r < 0 || r >= sizeof(cmd))56 goto toolong;5758 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 }6768 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 }7576 if (debug)77 fprintf(stderr, "as: command line '%s'\n", cmd);7879 r = system(cmd);80 if (r == 0)81 return 0;82 if (r < 0)83 perror("as");84 exit(EXIT_FAILURE);8586toolong:87 fputs("as: too long command line\n", stderr);88 exit(EXIT_FAILURE);89}