📄 preproc.c
字号:
--global_flag;
return incldepth == 0;
}
/*
* Undefine
*/
int doundef(void)
{
getsym();
if (!ifskip)
undef2();
return(incldepth == 0);
}
int undef2(void)
{
if (lastst != id)
generror(ERR_IDEXPECT,0,0);
else {
SYM **p = (SYM **)LookupHash(unmangid,defhash,HASHTABLESIZE);
if (p) {
*p = (*p)->next;
}
}
}
void getdefsym(void)
{
if (backupchar != -1) {
lastst = backupchar;
backupchar = -1;
return;
}
restart: /* we come back here after comments */
while(iswhitespacechar(lastch))
getch();
if( lastch == -1)
lastst = eof;
else if(isdigit(lastch))
getnum();
else if(isstartchar(lastch)) {
lptr--;
defid(unmangid,&lptr,0);
lastch = *lptr++;
lastst = id;
}
else if (getsym2())
goto restart;
}
int defid(short *name, short **p, char *q)
/*
* Get an identifier during macro replacement
*/
{
int count = 0,i=0;
while (issymchar(**p)) {
if (count < 100) {
name[count++] = *(*p);
if (q)
i+=installphichar(*(*p),q,i);
}
(*p)++;
}
if (q) {
if ((q[i-1] & 0xf0) == 0x90)
q[i-1] = 0x90;
q[i] = '\0';
}
name[count] = 0;
return(count);
}
/*
* Insert a replacement string
*/
int definsert(short *end, short *begin, short * text, int len, int replen)
{
short *q;
int i,p, r;
int val;
if (begin != inputline)
if (*(begin-1) == '#') {
if (*(begin-2) != '#') {
begin--;
replen++;
r = pstrlen(text);
text[r++] = '\"';
text[r] = 0;
for (i=r; i >= 0; i--)
text[i+1] = text[i];
*text = '\"';
}
}
p = pstrlen(text);
val = p - replen;
r = pstrlen(begin);
if (val + strlen(begin) >= len-1) {
generror(ERR_MACROSUBS,0,0);
return(-8000);
}
if (val > 0)
for (q = begin + r+1; q >= end; q--)
*(q+val) = *q;
else
if (val < 0) {
r = pstrlen(end)+1;
for (q = end; q < end+r; q++ )
*(q+val) = *q;
}
for (i=0; i < p; i++)
begin[i] = text[i];
return(val);
}
/* replace macro args */
int defreplace(short *macro, int count, short **oldargs, short **newargs)
{
int i,rv;
int instring = 0;
short narg[1024];
short name[100];
short *p=macro,*q;
while (*p) {
if (*p == instring)
instring = 0;
else if (*p == '\'' || *p == '"')
instring = *p;
else if (!instring && isstartchar(*p)) {
q = p;
defid(name,&p,0);
for (i=0; i < count; i++)
if (!pstrcmp(name,oldargs[i])) {
pstrcpy(narg,newargs[i]);
if ((rv = definsert(p,q,narg,1024-(q-macro),p-q)) == -8000)
return(FALSE);
else {
p += rv;
break;
}
}
}
p++;
}
return(TRUE);
}
/* Handlers for default macros */
void cnvt(short *out,char *in)
{
while (*in)
*out++=*in++;
*out = 0;
}
void filemac(short *string)
{
char str1[40];
sprintf(str1,"\"%s\"",infile);
cnvt(string,str1);
}
void datemac(short *string)
{
char str1[40];
struct tm *t1;
time_t t2;
time(&t2);
t1 = localtime(&t2);
strftime(str1,40,"\"%b %d %Y\"",t1);
cnvt(string,str1);
}
void timemac(short *string)
{
char str1[40];
struct tm *t1;
time_t t2;
time(&t2);
t1 = localtime(&t2);
str1[0] = '"';
strftime(str1,40,"\"%X\"",t1);
cnvt(string,str1);
}
void linemac(short *string)
{
char str1[40];
sprintf(str1,"%d",lineno);
cnvt(string,str1);
}
/* Scan for default macros and replace them */
void defmacroreplace(short *macro, short *name)
{
int i;
macro[0] = 0;
for (i=0; i < INGROWNMACROS; i++)
if (!strcmp(name,ingrownmacros[i].s)) {
(ingrownmacros[i].func)(macro);
break;
}
}
/* Scan line for macros and do replacements */
void defcheck(short *line)
{
short macro[1024];
short name[100];
short *args[40];
char ascii[60];
int tryagain = TRUE, changed = FALSE, waiting = FALSE,rv;
short *p = line,*q;
SYM *sp;
while (tryagain) {
p = line;
tryagain = FALSE;
while(*p) {
q = p;
if (*p == '"') {
waiting = !waiting;
p++;
}
else if (waiting)
p++;
else if (isstartchar(*p)) {
defid(name,&p,ascii);
if ((sp = search(ascii,&defsyms)) != 0) {
DEFSTRUCT *def = sp->value.s;
pstrcpy(macro,def->string);
if (def->argcount) {
int count = 0;
short *q = p;
while (iswhitespacechar(*q))
q++;
if (*q++ != '(')
goto join;
p = q;
if (def->argcount > 1) {
do {
short *nm = name;
int nestedparen = 0;
while (((*p != ',' && *p != ')') || nestedparen) && *p != '\n') {
if (*p == '(')
nestedparen++;
if (*p == ')' && nestedparen)
nestedparen--;
*nm++ = *p++;
}
while (iswhitespacechar(*(nm-1)))
nm--;
*nm = 0;
nm = name;
while (iswhitespacechar(*nm))
nm++;
args[count++] = plitlate(nm);
} while (*p++ == ',');
}
else while (iswhitespacechar(*p++));
if (*(p-1) != ')' || count != def->argcount-1) {
generror(ERR_MACROSUBS,0,0);
return;
}
/* Can't replace if tokenizing next */
if (*p == '#' && *(p+1) == '#')
continue;
if (count == 0)
goto insert;
if (!defreplace(macro,count,def->args,args))
return;
}
insert:
if ((rv=definsert(p,q,macro,4096-(q-line),p-q))==-8000)
return;
p+=rv;
changed = tryagain = TRUE;
}
else {
join:
defmacroreplace(macro,ascii);
if (macro[0]) {
if ((rv=definsert(p,q,macro,4096-(q-line),p-q))==-8000)
return;
p += rv;
changed = TRUE;
}
}
}
else p++;
}
}
/* Token pasting */
if (changed) {
p = q = line;
while (*p) {
if (*p == '#' && *(p+1) == '#')
p+=2;
else
*q++ = *p++;
}
*q = 0;
}
}
static void repdefines(short *lptr)
/*
* replace 'defined' keyword in #IF and #ELIF statements
*/
{
short *q = lptr;
short name[40];
char ascii[60];
while (*lptr) {
if (!pstrncmp(lptr,defkw,7)) {
lptr +=7;
if (*lptr == '(')
lptr++;
else
expecttoken(openpa,0);
while(iswhitespacechar(*lptr))
lptr++;
defid(name,&lptr,ascii);
while(iswhitespacechar(*lptr))
lptr++;
if (*lptr == ')')
lptr++;
else
expecttoken(closepa,0);
if (search(ascii,&defsyms) != 0)
*q++ = '1';
else
*q++ = '0';
*q++ = ' ';
}
else {
*q++ = *lptr++;
}
}
*q = 0;
}
void pushif(void)
/* Push an if context */
{
IFSTRUCT *p;
global_flag++;
p = xalloc(sizeof(IFSTRUCT));
global_flag--;
p->link = ifs;
p->iflevel = ifskip;
p->elsetaken = elsetaken;
elsetaken = FALSE;
ifs = p;
}
void popif(void)
/* Pop an if context */
{
if (ifs) {
ifskip = ifs->iflevel;
elsetaken = ifs->elsetaken;
ifs = ifs->link;
}
else {
ifskip = 0;
elsetaken = 0;
}
}
void ansieol(void)
{
if (prm_ansi) {
while (iswhitespacechar(*lptr))
lptr++;
if (*lptr) {
lastch = *lptr;
lastst = kw_if;
generror(ERR_UNEXPECT,0,0);
}
}
}
int doifdef (int flag)
/* Handle IFDEF */
{
SYM *sp;
getch();
while(isspace(lastch))
getch();
if (!isstartchar(lastch)) {
generror(ERR_IDEXPECT,0,0);
return incldepth == 0;
}
else
getid();
sp = search(unmangid,&defsyms);
pushif();
if (sp && !flag || !sp && flag)
ifskip = TRUE;
ansieol();
return(incldepth == 0);
}
int doif(int flag)
/* Handle #if */
{
getsym();
pushif();
cantnewline = TRUE;
if (!intexpr(0))
ifskip = TRUE;
cantnewline = FALSE;
ansieol();
return(incldepth == 0);
}
int doelif(void)
/* Handle #elif */
{
int is;
getsym();
cantnewline = TRUE;
is = !intexpr(0);
cantnewline = FALSE;
if (ifs) {
if (!ifs->iflevel)
ifskip = !ifskip || is || elsetaken;
if (!ifskip)
elsetaken = TRUE;
}
else
generror(ERR_PREPROCMATCH,0,0);
ansieol();
return(incldepth == 0);
}
/* handle else */
int doelse(void)
{
if (ifs) {
if (!ifs->iflevel)
ifskip = !ifskip || elsetaken;
}
else
generror(ERR_PREPROCMATCH,0,0);
ansieol();
return(incldepth == 0);
}
/* HAndle endif */
int doendif(void)
{
if (!ifs)
generror(ERR_PREPROCMATCH,0,0);
popif();
ansieol();
return(incldepth == 0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -