Home
       main.c - scc - simple c99 compiler
  HTML git clone git://git.simple-cc.org/scc
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
   DIR README
   DIR LICENSE
       ---
       main.c (1502B)
       ---
            1 #include <setjmp.h>
            2 #include <stdio.h>
            3 #include <stdlib.h>
            4 #include <string.h>
            5 #include <errno.h>
            6 
            7 #include <scc/arg.h>
            8 #include <scc/scc.h>
            9 
           10 #include "cc1.h"
           11 
           12 char *argv0;
           13 
           14 int warnings;
           15 jmp_buf recover;
           16 
           17 int onlycpp, onlyheader;
           18 
           19 
           20 extern int failure;
           21 
           22 static void
           23 defmacro(char *macro)
           24 {
           25         char *p = strchr(macro, '=');
           26 
           27         if (p)
           28                 *p++ = '\0';
           29         else
           30                 p = "1";
           31 
           32         defdefine(macro, p, "command-line");
           33 }
           34 
           35 static void
           36 usage(void)
           37 {
           38         fputs("usage: cc1 [-Ewd] [-D def[=val]]... [-U def]... "
           39               "[-I dir]... [-a architecture] [input]\n", stderr);
           40         exit(1);
           41 }
           42 
           43 int
           44 main(int argc, char *argv[])
           45 {
           46         int i;
           47         static struct items uflags, dflags, iflags;
           48 
           49         ARGBEGIN {
           50         case 'a':
           51                 architecture = EARGF(usage());
           52                 break;
           53         case 'D':
           54                 newitem(&dflags, EARGF(usage()));
           55                 break;
           56         case 'M':
           57                 onlyheader = 1;
           58                 break;
           59         case 'E':
           60                 onlycpp = 1;
           61                 break;
           62         case 'I':
           63                 newitem(&iflags, EARGF(usage()));
           64                 break;
           65         case 'U':
           66                 newitem(&uflags, EARGF(usage()));
           67                 break;
           68         case 'd':
           69                 DBGON();
           70                 break;
           71         case 'w':
           72                 warnings = 1;
           73                 break;
           74         default:
           75                 usage();
           76         } ARGEND
           77 
           78         if (argc > 1)
           79                 usage();
           80 
           81         isyms();
           82         icode();
           83         iarch();
           84         icpp();
           85 
           86         for (i = 0; i < iflags.n; ++i)
           87                 incdir(iflags.s[i]);
           88 
           89         for (i = 0; i < dflags.n; ++i)
           90                 defmacro(dflags.s[i]);
           91 
           92         for (i = 0; i < uflags.n; ++i)
           93                 undefmacro(uflags.s[i]);
           94 
           95         if (*argv)
           96                 addinput(IFILE, *argv, FAIL);
           97         else
           98                 addinput(ISTDIN, NULL, FAIL);
           99 
          100         if (onlycpp || onlyheader) {
          101                 outcpp();
          102         } else {
          103                 next();
          104                 while (yytoken != EOFTOK)
          105                         decl();
          106         }
          107 
          108         return failure;
          109 }