12 bool compile_warning = true;
14 static void compile_diagnostic(const char *type, const char *fmt, va_list va) {
15 fprintf(stderr, "%s %s: ", lexer_marker(), type);
16 vfprintf(stderr, fmt, va);
17 fprintf(stderr, "\n");
20 void compile_error(const char *fmt, ...) {
23 compile_diagnostic("error", fmt, a);
28 void compile_warn(const char *fmt, ...) {
34 compile_diagnostic("warning", fmt, a);
38 void compile_ice(const char *fmt, ...) {
41 compile_diagnostic("internal error", fmt, a);
44 /* flush all streams */
49 int compile_begin(bool dump) {
52 list_t *block = parse_run();
55 for (list_iterator_t *it = list_iterator(block); !list_iterator_end(it); index++) {
56 printf("# block %zu\n", index);
58 gen_toplevel(list_iterator_next(it));
60 printf("%s", ast_string(list_iterator_next(it)));
66 static bool parse_option(const char *optname, int *cargc, char ***cargv, char **out, int ds, bool split) {
69 size_t len = strlen(optname);
71 if (strncmp(argv[0]+ds, optname, len))
74 /* it's --optname, check how the parameter is supplied */
75 if (argv[0][ds+len] == '=') {
76 *out = argv[0]+ds+len+1;
80 if (!split || argc < ds) /* no parameter was provided, or only single-arg form accepted */
83 /* using --opt param */
91 int main(int argc, char **argv) {
93 char *standard = NULL;
99 if (argv[0][0] == '-') {
100 if (parse_option("std", &argc, &argv, &standard, 1, false))
104 if (!strcmp(*argv, "--dump-ast")) {
109 fprintf(stderr, "unknown option: %s\n", argv[argc-1]);
114 if (!strcmp(standard, "licec")) opt_std_set(STANDARD_LICEC);
115 else if (!strcmp(standard, "gnuc")) opt_std_set(STANDARD_GNUC);
116 else if (!strcmp(standard, "c90")) opt_std_set(STANDARD_C90);
117 else if (!strcmp(standard, "c99")) opt_std_set(STANDARD_C99);
118 else if (!strcmp(standard, "c11")) opt_std_set(STANDARD_C11);
119 else if (!strcmp(standard, "kandr")) opt_std_set(STANDARD_KANDR);
121 fprintf(stderr, "unknown standard: %s\n", standard);
126 return compile_begin(dumpast);