scc

A fork of https://git.simple-cc.org/scc/ for Qute

git clone https://git.8pit.net/scc.git

  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
 12char *argv0;
 13
 14int warnings;
 15jmp_buf recover;
 16
 17int onlycpp, onlyheader;
 18
 19
 20extern int failure;
 21
 22static void
 23defmacro(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
 35static void
 36usage(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
 43int
 44main(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}