agsex: make OPT_FLAGS overridable
[rofl0r-agsutils.git] / agssemble.c
blob49a70078bc759db568a566a5fb81f29dab460a12
1 #define _GNU_SOURCE
2 #include "Assembler.h"
3 #include "DataFile.h"
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <unistd.h>
7 #include "version.h"
8 #define ADS ":::AGSsemble " VERSION " by rofl0r:::"
10 static int usage(char *argv0) {
11 dprintf(2, ADS "\nusage:\n%s [-E] file.s [file.o]\npass an ags assembly filename.\n"
12 "-E: invoke C preprocessor 'cpp' on the input file before assembling\n"
13 "if optional second filename is ommited, will write into file.o\n", argv0);
14 return 1;
17 int main(int argc, char** argv) {
18 int flags = 0, c;
19 while ((c = getopt(argc, argv, "E")) != EOF) switch(c) {
20 case 'E': flags |= 1; break;
21 default: return usage(argv[0]);
23 if(!argv[optind]) return usage(argv[0]);
24 char* file = argv[optind];
25 char out [256], *outn, tmp[256];
26 if(!argv[optind+1]) {
27 size_t l = strlen(file);
28 char *p;
29 snprintf(out, 256, "%s", file);
30 p = strrchr(out, '.');
31 if(!p) p = out + l;
32 *(p++) = '.';
33 *(p++) = 'o';
34 *p = 0;
35 outn = out;
36 } else outn = argv[optind+1];
38 if(flags & 1) {
39 snprintf(tmp, sizeof tmp, "%s.i", file);
40 dprintf(1, "preprocessing %s -> %s ...", file, tmp);
41 char cmd[1024];
42 snprintf(cmd, sizeof cmd, "cpp %s > %s", file, tmp);
43 int ret = system(cmd);
44 if(ret) {
45 dprintf(1, "FAIL\n");
46 return ret;
48 dprintf(1, "OK\n");
49 file = tmp;
52 AS a_b, *a = &a_b;
53 AS_open(a, file);
55 dprintf(1, "assembling %s -> %s ... ", file, outn);
56 int ret = AS_assemble(a, outn);
57 AS_close(a);
59 if(!ret) dprintf(1, "FAIL\n");
60 else dprintf(1, "OK\n");
61 return !ret;