📄 input.c
字号:
#include "c.h"
int strcmpi(char *,char *);
static void pragma ARGS((void));
static void resynch ARGS((void));
static int bsize;
static unsigned char buffer[MAXLINE + 1 + BUFSIZE + 1];
int infd; /* input file descriptor */
unsigned char *cp; /* current input character */
char *file; /* current input file name */
char *firstfile; /* first input file */
unsigned char *limit; /* points to last character + 1 */
char *line; /* current line */
int lineno; /* line number of current line */
void inputInit(void)
{
limit = cp = &buffer[MAXLINE + 1];
bsize = -1;
lineno = 0;
file = NULL;
fillbuf();
if (cp >= limit)
cp = limit;
nextline();
}
void nextline(void)
{
do {
if (cp >= limit) {
fillbuf();
if (cp >= limit)
cp = limit;
if (cp == limit)
return;
}
else
lineno++;
for (line = (char *) cp; *cp == ' ' || *cp == '\t'; cp++);
} while (*cp == '\n' && cp == limit);
if (*cp == '#') {
resynch();
nextline();
}
}
void fillbuf(void)
{
if (bsize == 0)
return;
if (cp >= limit)
cp = &buffer[MAXLINE + 1];
else {
int n = limit - cp;
unsigned char *s = &buffer[MAXLINE + 1] - n;
assert(s >= buffer);
line = (char *) s - ((char *) cp - line);
while (cp < limit)
*s++ = *cp++;
cp = &buffer[MAXLINE + 1] - n;
}
bsize = ReadFromCpp(&buffer[MAXLINE + 1], BUFSIZE);
if (bsize < 0) {
error(StrTab[219]);// <read error\n>
exit(1);
}
limit = &buffer[MAXLINE + 1 + bsize];
*limit = '\n';
}
/* inputstring - arrange to read str as next input */
void inputstring(char *str)
{
limit = cp = &buffer[MAXLINE + 1];
while ((*limit++ = *str++) != 0);
*--limit = '\n';
bsize = 0;
}
/* pragma - handle #pragma ref id... */
static void pragma(void)
{
t = gettok();
if (t != ID) return; /* remain compatible with pragmas for other compilers */
if (strcmp(token, StrTab[220]) == 0) {// <ref>
for (;;) {
while (*cp == ' ' || *cp == '\t')
cp++;
if (*cp == '\n' || *cp == 0)
break;
if ((t = gettok()) == ID && tsym) {
tsym->ref++;
use(tsym, src);
}
}
return;
}
if (strcmpi(token,StrTab[221]) == 0) {// <pack>
ProcessPragmaPack();
}
if (strcmpi(token,StrTab[222]) == 0) {// <section>
ProcessSection();
}
if (strcmpi(token,StrTab[223]) == 0) {// <optimize>
ProcessOptimize();
}
if (strcmpi(token,StrTab[435]) == 0) {// <density>
ProcessPragmaDensity();
}
}
/* resynch - set line number/file name in # n [ "file" ] and #pragma ... */
static void resynch(void)
{
for (cp++; *cp == ' ' || *cp == '\t';)
cp++;
if (limit - cp < MAXLINE)
fillbuf();
if (strncmp((char *) cp, StrTab[224], 6) == 0) {// <pragma>
cp += 6;
pragma();
}
else if (*cp >= '0' && *cp <= '9') {
line: for (lineno = 0; *cp >= '0' && *cp <= '9';)
lineno = 10 * lineno + *cp++ - '0';
lineno--;
while (*cp == ' ' || *cp == '\t')
cp++;
if (*cp == '"') {
file = (char *) ++cp;
while (*cp && *cp != '"' && *cp != '\n')
cp++;
file = stringn(file, (char *) cp - file);
if (*cp == '\n')
warning(StrTab[225]);// <missing \" in preprocessor line\n>
if (firstfile == 0)
firstfile = file;
}
}
else if (strncmp((char *) cp, StrTab[226], 4) == 0) {// <line>
for (cp += 4; *cp == ' ' || *cp == '\t';)
cp++;
if (*cp >= '0' && *cp <= '9')
goto line;
if (Aflag >= 2)
warning(StrTab[227]);// <unrecognized control line\n>
}
else if (Aflag >= 2 && *cp != '\n')
warning(StrTab[228]);// <unrecognized control line\n>
while (*cp)
if (*cp++ == '\n')
if (cp == limit + 1)
nextline();
else
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -