scc

simple C compiler
git clone git://git.2f30.org/scc
Log | Files | Refs | README | LICENSE

commit 5e7b55dcc252f28c5c21b347dadaa8209fd061bb
parent cd19be49d9666dc294084fbe4dcb5ff613aa2d56
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Tue, 21 Apr 2015 13:44:28 +0200

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.

Diffstat:
Mcc1/main.c | 60+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 59 insertions(+), 1 deletion(-)

diff --git 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 @@ extern void init_keywords(void), 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; }