ref: 5e7b55dcc252f28c5c21b347dadaa8209fd061bb
parent: cd19be49d9666dc294084fbe4dcb5ff613aa2d56
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Tue Apr 21 09:44:28 EDT 2015
Add option parser for cc1 This was something should be done long time ago, but I was too lazy. At this moment we only support -w to enable warnings, and -o to indicate what is the file where the intermediate code must be written.
--- a/cc1/main.c
+++ b/cc1/main.c
@@ -1,6 +1,9 @@
#include <inttypes.h>
#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
#include "../inc/cc.h"
#include "cc1.h"
@@ -10,14 +13,69 @@
uint8_t npromote, warnings;
+static uint8_t noerror;
+static char *output;
+
+static void
+clean(void)
+{
+ if (noerror)
+ return;
+ if (output)
+ remove(output);
+}
+
+static void
+usage(void)
+{
+ fputs("usage: cc1 [-w] [-o output] [input]\n", stderr);
+ exit(1);
+}
+
int
main(int argc, char *argv[])
{
+ char c, *input, *cp;
+
+ atexit(clean);
+repeat:
+ --argc, ++argv;
+ if (*argv && argv[0][0] == '-' && argv[0][1] != '-') {
+ for (cp = &argv[0][1]; (c = *cp); cp++) {
+ switch (c) {
+ case 'w':
+ warnings = 1;
+ break;
+ case 'o':
+ if (!*++argv || argv[0][0] == '-')
+ usage();
+ --argc;
+ output = *argv;
+ break;
+ default:
+ usage();
+ }
+ }
+ goto repeat;
+ }
+
+ if (output) {
+ if (!freopen(output, "w", stdout))
+ die("error opening output:%s", strerror(errno));
+ }
+ input = *argv;
+ if (argc > 1)
+ usage();
init_keywords();
init_expr();
- open_file(NULL);
+ open_file(input);
for (next(); yytoken != EOFTOK; extdecl());
/* nothing */;
+ if (ferror(stdin) || ferror(stdout)) {
+ die("error reading/writing from input/output:%s",
+ strerror(errno));
+ }
+ noerror = 1;
return 0;
}