📄 preproc.c
字号:
/* File preproc.c: 2.3 (84/11/27,11:47:40) */
/*% cc -O -c %
*
*/
#include <stdio.h>
#include <string.h>
#include "defs.h"
#include "data.h"
#include "headers.h"
static char putmacnew(char c);
static FILE *fixiname();
static char keepch(char c);
static char putmac(char c);
static void toggle(char name, int onoff);
/*
* open an include file
*/
void doinclude(void) {
FILE *inp2;
InInclude = TRUE;
blanks();
if (inp2 = (FILE *)fixiname())
if (inclsp < INCLSIZ) {
inclstk[inclsp++] = input2;
input2 = inp2;
}
else {
fclose (inp2);
error("Too many nested includes");
}
else {
error("Could not open include file");
}
kill();
}
/*
* fixiname - remove "brackets" around include file name
*/
static FILE *fixiname(void) {
char c1, c2, *p, *ibp;
char buf[20];
FILE *fp;
char buf2[100];
ibp = &buf[0];
if ((c1 = gch()) != '"' && c1 != '<')
return (NULL);
for (p = line + lptr; *p && (*p != '\t') && (*p != ' ');)
*ibp++ = *p++;
c2 = *(--p);
if (c1 == '"' ? (c2 != '"') : (c2 != '>')) {
error("incorrect delimiter");
return (NULL);
}
*(--ibp) = 0;
fp = NULL;
if (c1 == '<') {
while (fp == NULL && (p = GetIncs("INCLUDE"))) {
strcpy(buf2, p);
if (strlen(buf2))
strcat(buf2, "\\");
strcat(buf2, buf);
fp = fopen(buf2, "r");
}
}
else
fp = fopen(buf, "r");
return (fp);
}
/*
* "asm" pseudo-statement
*
* enters mode where assembly language statements are passed
* intact through parser
*
*/
void doasm(void) {
int old_ctext;
old_ctext = ctext;
ctext = 0;
cmode = 0;
while (1) {
xinline();
if (match("#endasm"))
break;
if (feof(input))
break;
outstr(line); // leave errors up to aa90
nl();
}
kill();
cmode = 1;
ctext = old_ctext;
}
void dodefine(void) {
addmac();
}
void doundef(void) {
int mp;
char sname[NAMESIZE];
if (!symname(sname)) {
illname();
kill();
return;
}
if (mp = findmac(sname))
delmac(mp);
kill();
}
void preprocess(void) {
if (ifline())
return;
while (cpp())
;
}
void doifdef(int xifdef) {
char sname[NAMESIZE];
int k;
blanks();
++iflevel;
if (skiplevel)
return;
k = symname(sname) && findmac(sname);
if (k != xifdef)
skiplevel = iflevel;
}
int ifline(void) {
while (1) {
xinline();
if (feof(input))
return(1);
if (match("#ifdef")) {
doifdef(YES);
continue;
}
else
if (match("#ifndef")) {
doifdef(NO);
continue;
}
else
if (match("#else")) {
if (iflevel) {
if (skiplevel == iflevel)
skiplevel = 0;
else
if (skiplevel == 0)
skiplevel = iflevel;
}
else
noiferr();
continue;
}
else
if (match("#endif")) {
if (iflevel) {
if (skiplevel == iflevel)
skiplevel = 0;
iflevel--;
}
else
noiferr();
continue;
}
if (!skiplevel)
return(0);
}
}
void noiferr(void) {
error("No matching #if...");
}
int cpp(void) {
int k;
char c, sname[NAMESIZE];
int tog;
int cpped; /* non-zero if something expanded */
cpped = 0;
/* don't expand lines with preprocessor commands in them */
if (!cmode || line[0] == '#')
return(0);
mptr = lptr = 0;
while (ch()) {
if ((ch() == ' ') | (ch() == 9)) {
keepch(' ');
while ((ch () == ' ') | (ch () == 9))
gch();
}
else
if (ch() == '"') {
keepch(ch());
gch();
while (ch() != '"') {
if (ch() == 0) {
error("missing quote");
break;
}
if (ch() == '\\')
keepch(gch());
keepch(gch());
}
gch();
keepch('"');
}
else
if (ch() == 39) {
keepch(39);
gch();
while (ch() != 39) {
if (ch() == 0) {
error("missing apostrophe");
break;
}
if (ch() == '\\')
keepch(gch());
keepch(gch());
}
gch();
keepch(39);
}
else
if ((ch() == '/') & (nch() == '*')) {
inchar();
inchar();
while ((((c = ch()) == '*') & (nch() == '/')) == 0) {
if (c == '$') {
inchar();
tog = TRUE;
if (ch() == '-') {
tog = FALSE;
inchar();
}
if (alpha (c = ch())) {
inchar();
toggle(c, tog);
}
}
else {
if (ch() == 0)
xinline();
else
inchar();
if (feof(input))
break;
}
}
inchar();
inchar();
}
else
if ((ch() == '/') & (nch() == '/')) {
while (ch())
inchar();
}
else
if (an(ch())) {
k = 0;
while (an(ch())) {
if (k < NAMEMAX)
sname[k++] = ch();
gch();
}
sname[k] = 0;
if (k = findmac(sname)) {
cpped = 1;
while (c = macq[k++])
keepch(c);
}
else {
k = 0;
while (c = sname[k++])
keepch(c);
}
}
else
keepch(gch());
}
keepch(0);
if (mptr >= MPMAX)
error("line too long");
lptr = mptr = 0;
while (line[lptr++] = mline[mptr++])
;
lptr = 0;
return (cpped);
}
static char keepch(char c) {
mline[mptr] = c;
if (mptr < MPMAX)
mptr++;
return (c);
}
void defmac(char *s) {
kill();
strcpy(line, s);
addmac();
}
void addmac(void) {
char sname[NAMESIZE];
int k;
int mp;
if (!symname(sname)) {
illname();
kill();
return;
}
if (mp = findmac(sname)) {
error("Duplicate define");
delmac(mp);
}
k = 0;
while (putmac(sname[k++]))
;
while (ch() == ' ' || ch() == 9)
gch();
while (putmacnew(gch()))
;
if (macptr >= MACMAX)
error("macro table full");
}
void delmac(int mp) {
mp--;
mp--; /* step over previous null */
while (mp >= 0 && macq[mp])
macq[mp--] = '%';
}
static char putmacnew(char c) {
if (c == '/' && line[lptr] == '/') {
kill();
c = 0;
}
return putmac(c);
}
static char putmac(char c) {
macq[macptr] = c;
if (macptr < MACMAX)
macptr++;
return (c);
}
int findmac(char *sname) {
int k;
k = 0;
while (k < macptr) {
if (astreq(sname, macq + k, NAMEMAX)) {
while (macq[k++])
;
return (k);
}
while (macq[k++])
;
while (macq[k++])
;
}
return (0);
}
static void toggle(char name, int onoff) {
switch (name) {
case 'C':
ctext = onoff;
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -