2 #define __STDC_WANT_LIB_EXT2__ 1
10 #define ADS ":::AGSsemble " VERSION " by rofl0r:::"
12 static int usage(char *argv0
) {
13 fprintf(stderr
, ADS
"\nusage:\n%s [-E] [-i file.i] [-I includedir] [-D preproc define] file.s [file.o]\n"
14 "pass an ags assembly filename.\n"
15 "-E: invoke built-in C preprocessor 'tinycpp' on the input file before assembling\n"
16 "-I includedir - add include dir for CPP\n"
17 "-D define - add define for CPP\n"
18 "-i file save preprocessor output to file\n"
19 "if optional second filename is ommited, will write into file.o\n", argv0
);
23 static FILE *freopen_r(FILE *f
, char **buf
, size_t *size
) {
26 return fmemopen(*buf
, *size
, "r");
29 int main(int argc
, char** argv
) {
30 struct cpp
* cpp
= cpp_new();
31 char *tmp
, *cppoutfn
= 0;
33 while ((c
= getopt(argc
, argv
, "Ei:I:D:")) != EOF
) switch(c
) {
34 case 'E': flags
|= 1; break;
35 case 'i': cppoutfn
= optarg
; break;
36 case 'I': cpp_add_includedir(cpp
, optarg
); break;
38 if((tmp
= strchr(optarg
, '='))) *tmp
= ' ';
39 cpp_add_define(cpp
, optarg
);
41 default: return usage(argv
[0]);
43 if(!argv
[optind
]) return usage(argv
[0]);
44 char* file
= argv
[optind
];
45 char out
[256], *outn
;
47 size_t l
= strlen(file
);
49 snprintf(out
, 256, "%s", file
);
50 p
= strrchr(out
, '.');
56 } else outn
= argv
[optind
+1];
57 if(!strcmp(outn
, file
)) {
58 fprintf(stderr
, "error: input and output file (%s) identical!\n", file
);
62 FILE *in
= fopen(file
, "r");
64 fprintf(stderr
, "error opening file %s\n", file
);
69 struct FILE_container
{
74 if(!cppoutfn
) output
.f
= open_memstream(&output
.buf
, &output
.len
);
75 else output
.f
= fopen(cppoutfn
, "w");
76 fprintf(stdout
, "preprocessing %s ...", file
);
77 int ret
= cpp_run(cpp
, in
, output
.f
, file
);
79 fprintf(stdout
, "FAIL\n");
82 fprintf(stdout
, "OK\n");
84 if(!cppoutfn
) in
= freopen_r(output
.f
, &output
.buf
, &output
.len
);
87 in
= fopen(cppoutfn
, "r");
90 // cpp_free(cpp); // FIXME this crashes on windows, find out why
93 AS_open_stream(a
, in
);
95 fprintf(stdout
, "assembling %s -> %s ... ", file
, outn
);
96 int ret
= AS_assemble(a
, outn
);
99 if(!ret
) fprintf(stdout
, "FAIL\n");
100 else fprintf(stdout
, "OK\n");