⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcc.c

📁 LSI C-86 compiler,小日本写的C语言编译器
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
 * lcc.c - LSI C compiler driver, for 8086
 */


static char rcsID[] = "$Header: /mnt2/proj/lsic/ver3/lcc/RCS/lcc.c,v 1.1 91/06/10 19:44:24 kmori Exp $";


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdarg.h>

#pragma checksp

typedef	char	bool;
#define	YES	1
#define	NO	0



extern	char Program[];
extern void version();



bool Nonexec = NO;
int Verilev = 0;
int Warnlev = 1;
int State = 0;
char *Exec_dir;
char *Temp_dir;

char out[100], assem[100], w[100], temp1[100], temp2[100], temp3[100];

char *cppargv[100];
char **pcpp = cppargv;
char *cfargv[100];
char **pcf = cfargv;
char *cgargv[100];
char **pcg = cgargv;
char *ipargv[100];
char *rargv[100];
char **pr = rargv;
char *ldargv[1000];
char **pld = ldargv;
char *msopt[100];
char **pmsop = msopt;
char *firstsrc;

bool Cflag = NO;
bool Sflag = NO;
bool STflag = NO;
bool SCflag = NO;
bool Pflag = NO;
bool Gflag = NO;
int Olevel = 0;
bool Mslink = NO;
bool Jap = NO;
bool CommentNest = NO;
bool ImplicitInt = NO;


int no;
char MemModel = 's';






void usage()
{
	fprintf(stderr, "\n");
#ifdef	SMALLONLY
	fprintf(stderr, "---- S-Model ONLY ----\n");
	fprintf(stderr,
"Usage: %s [-afile][-c][-Dname[=value]][-g][-h][-Idir][-jN][-k linkopt]\n\
           [-llibrary][-Ldir][-m][-mslink][-nX][-noconf][-nomslink]\n\
           [-o output][-O][-p][-S[C]][-Tdir][-vN][-wN][-Xdir][-yN][-z]\n\
           sourcefile...\n\
\n\
soucefile: one of: *.c *.a86 *.asm *.obj *.lib\n", Program);
#else
	fprintf(stderr,
"Usage: %s [-afile][-c][-Dname[=value]][-g][-h][-Idir][-jN][-k linkopt]\n\
           [-llibrary][-Ldir][-m][-m[spdl]][-mslink][-nX][-noconf][-nomslink]\n\
           [-o output][-O][-p][-S[C]][-Tdir][-vN][-wN][-Xdir][-yN][-z]\n\
           sourcefile...\n\
\n\
soucefile: one of: *.c *.a86 *.asm *.obj *.lib\n", Program);
#endif
}



void xexit(int rc)
{
#ifdef	CPM
	if (rc)
		unlink("a:$$$.sub");
#endif
	exit(rc);
}


FILE *efopen(char *file, char *mode)
{
	FILE *fp;

	if ((fp = fopen(file, mode)) == NULL) {
		fprintf(stderr, "%s: ", Program);
		perror(file);
		xexit(1);
	}
	return (fp);
}



int strcmpc(char *s, char *t)
{
	while (tolower(*s) == tolower(*t)) {
		if (*s == '\0')
			return (0);
		s++;
		t++;
	}
	return (*s - *t);
}



char *strsave(char *s)
{
	char *p;

	p = malloc(strlen(s) + 1);
	if (p == NULL) {
		fprintf(stderr, "%s: Out of memory\n", Program);
		xexit(1);
	}
	return (strcpy(p, s));
}



char	*tobacksl(char *buf)
{
	char	*p;

	for (p = buf; *p; p++)
		if (*p == '/')
			*p = '\\';
	return (buf);
}



char *addsl(char *buf)
{
	if (buf[0] != '\0') {
		switch (buf[strlen(buf) - 1]) {
		case ':': case '/': case '\\':
			break;
		default:
			strcat(buf, "/");
		}
	}
	return (buf);
}


int pgetc(FILE *fp)
{
	static char *pushback /* = NULL */;
	int c, d;
	char varname[100], *p;

	for (;;) {
		if (pushback) {
			if ((c = *pushback++) != '\0')
				return (c);
			pushback = NULL;
		}
		c = getc(fp);
		if (c != '$' || (c = getc(fp)) == '$')
			return (c);
		/* environment variable */
		p = varname;
		if ((d = c) == '{')
			c = getc(fp);
		while (c != EOF	&& (d == '{' ? c != '}'
					     : isalpha(c) || isdigit(c) )) {
			if (p < varname + sizeof(varname) - 1)
				*p++ = c;
			c = getc(fp);
		}
		if (d != '{')
			ungetc(c, fp);
		*p = '\0';
		pushback = getenv(varname);
	}
}


char **addoptf(char **xargv, char *file, char ***argvp)
{
	FILE *fp;
	int c;
	char token[256], *p;
	char **ap;

	fp = efopen(file, "r");
	for (;;) {
		do {
			c = pgetc(fp);
		} while (isspace(c));
		if (c == EOF)
			break;
		if (c == '#') {
		/* skip comment */
			while (c != EOF && c != '\n')
				c = pgetc(fp);
		} else if (c == '&' && argvp != NULL) {
		/* place command line arguments here */
			for (ap = *argvp; *ap; ap++) {
				if (**ap == '@')
					xargv = addoptf(xargv, *ap + 1, NULL);
				else
					*xargv++ = *ap;
			}
			*argvp = ap;
		} else {
		/* ordinary argument */
			p = token;
			while (c != EOF && !isspace(c)) {
				if (p < token + sizeof(token) - 1)
					*p++ = c;
				c = pgetc(fp);
			}
			*p = '\0';
			*xargv++ = strsave(token);
		}
	}
	fclose(fp);
	return (xargv);
}



int	xcallv(char *name, char *argv[])
{
	int	i, n;
	char buf[100];

	if (Nonexec || Verilev != 0) {
		fprintf(stderr, "%s", name);
		for (i = 1; argv[i] != NULL; i++)
			fprintf(stderr, " %s", argv[i]);
		putc('\n', stderr);
	}
	if (! Nonexec) {
		fflush(stdout);
#ifndef	CPM
		dup2(2, 5);
		dup2(1, 2);
#endif
		n = spawnv(0, strcat(addsl(strcpy(buf, Exec_dir)), name), argv);
		if (n == -1)
			n = spawnvp(0, name, argv);
#ifndef	CPM
		dup2(5, 2);
#endif
		if (n < 0) {
			fprintf(stderr, "%s: can't exec: %s: %s\n",
					Program, buf, strerror(errno));
			xexit(1);
		}
		if (n == 2 && Warnlev < 2)
			n = 0;
		if (n != 0)
			State = 1;
		return (n);
	}
	return (0);
}



int	xcall(char *name, ...)
{
	va_list	p;

	va_start(p, name);
	return (xcallv(name, (char **)p));
}



void delete(char *name)
{
	if (! Nonexec)
		unlink(name);
}



char *suffix(char *s)
{
	char	c, *p;

	p = NULL;
	while (c = *s) {
		if (c == '/' || c == ':' || c == '\\')
			p = NULL;
		else if (c == '.')
			p = s;
		s++;
	}
	return (p != NULL ? p : s);
}


char *replace_suffix(char *buf, char *str, char *suf)
{
	strcpy(suffix(strcpy(buf, str)), suf);
	return (buf);
}



char *objname(char *s)
{
	static char obj[100];

	if (Cflag && out[0] != '\0')
		return (out);
	else
		return (replace_suffix(obj, s, ".obj"));
}



void compile_c(char *s)
{
	char	**p;

	/* generate c command */
	/* cpp */
	p = pcpp;
	if (Warnlev == 0)
		*p++ = "-w";
	if (Jap)
		*p++ = "-j";
	if (CommentNest)
		*p++ = "-c";
	*p++ = "-o";
	*p++ = strcat(addsl(strcpy(temp1, Temp_dir)), "1.$$$");
	*p++ = replace_suffix(w, s, ".c");
	*p = NULL;
	if (xcallv("cpp", cppargv)) {
		delete(temp1);
		return;
	}
	/* cf */
	p = pcf;
	*p++ = "-chct";
	if (Warnlev == 0)
		*p++ = "-w";
	else if (ImplicitInt)
		*p++ = "-wi";
	if (Jap)
		*p++ = "-j";
	*p++ = temp1;
	strcat(addsl(strcpy(temp2, Temp_dir)), "2.$$$");
	if (STflag) {
		if (out[0] != '\0')
			strcpy(temp2, out);
		else
			replace_suffix(temp2, s, ".t");
	}
	*p++ = temp2;
	*p++ = strcat(addsl(strcpy(temp3, Temp_dir)), "3.$$$");
	*p = NULL;
	if (xcallv("cf", cfargv)) {
		delete(temp1);
		delete(temp2);
		delete(temp3);
		return;
	}
	delete(temp1);
	delete(temp3);
	if (STflag)
		return;
	/* cg */
	p = pcg;
	if (Verilev >= 2)
		*p++ = "-v";
	if (Pflag || Gflag || SCflag)
		*p++ = "-g";
	*p++ = temp2;
	strcat(addsl(strcpy(assem, Temp_dir)), "3.$$$");
	if (Sflag && !SCflag) {
		if (out[0] != '\0')
			strcpy(assem, out);
		else
			replace_suffix(assem, s, ".a86");
	}
	*p++ = assem;
	*p = NULL;
	if (xcallv("cg86", cgargv)) {
		delete(temp2);
		delete(assem);
		return;
	}
	delete(temp2);
	/* merc */
	if (SCflag) {
		xcall("merc", "merc", "-o",
			out[0] ? out : replace_suffix(w, s, ".a86"),
			assem, NULL);
		delete(assem);
	}
	if (Sflag)
		return;
	/* ip86 */
	if (Pflag) {
		p = ipargv;
		*p++ = "ip86";
		if (Gflag)
			*p++ = "-g";
		*p++ = assem;
		*p++ = temp2;
		*p++ = s;
		*p = NULL;
		xcallv("ip86", ipargv);
		delete(assem);
		strcpy(assem, temp2);
	}
	/* r86 */
	p = pr;
	*p++ = "-o";
	*p++ = objname(s);
	*p++ = "-m";
	*p++ = s;
	if (Olevel == 0)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -