📄 lcc.c
字号:
/*
* 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 + -