fixed a problem with the ifdef-stack
This commit is contained in:
parent
831cdc7580
commit
754f9ce45d
4 changed files with 13 additions and 8 deletions
|
@ -30,6 +30,10 @@ PRIVATE char ifstack[IFDEPTH]; /* if-stack: the content of an entry is */
|
|||
/* 1 if a corresponding ELSE has been */
|
||||
/* encountered. */
|
||||
|
||||
int nestlevel = -1;
|
||||
int svnestlevel[30] = {-1};
|
||||
int nestcount;
|
||||
|
||||
PRIVATE char *
|
||||
GetIdentifier()
|
||||
{
|
||||
|
@ -261,7 +265,7 @@ do_include()
|
|||
}
|
||||
else {
|
||||
WorkingDir = getwdir(result);
|
||||
nestlevel = -1;
|
||||
svnestlevel[++nestcount] = nestlevel;
|
||||
FileName = result;
|
||||
LineNumber = 1;
|
||||
}
|
||||
|
@ -331,7 +335,7 @@ push_if()
|
|||
PRIVATE
|
||||
do_elif()
|
||||
{
|
||||
if (nestlevel < 0 || (ifstack[nestlevel])) {
|
||||
if (nestlevel <= svnestlevel[nestcount] || (ifstack[nestlevel])) {
|
||||
error("#elif without corresponding #if");
|
||||
PushBack();
|
||||
skipline();
|
||||
|
@ -348,7 +352,7 @@ do_else()
|
|||
{
|
||||
PushBack();
|
||||
skipline();
|
||||
if (nestlevel < 0 || (ifstack[nestlevel]))
|
||||
if (nestlevel <= svnestlevel[nestcount] || (ifstack[nestlevel]))
|
||||
error("#else without corresponding #if");
|
||||
else { /* mark this level as else-d */
|
||||
++(ifstack[nestlevel]);
|
||||
|
@ -361,7 +365,7 @@ do_endif()
|
|||
{
|
||||
PushBack();
|
||||
skipline();
|
||||
if (nestlevel-- < 0)
|
||||
if (nestlevel-- <= svnestlevel[nestcount])
|
||||
error("#endif without corresponding #if");
|
||||
}
|
||||
|
||||
|
|
|
@ -9,12 +9,10 @@ struct file_info {
|
|||
unsigned int fil_lino;
|
||||
char *fil_name;
|
||||
char *fil_wdir;
|
||||
int fil_nestlevel;
|
||||
};
|
||||
|
||||
#define LineNumber finfo.fil_lino
|
||||
#define FileName finfo.fil_name
|
||||
#define WorkingDir finfo.fil_wdir
|
||||
#define nestlevel finfo.fil_nestlevel
|
||||
|
||||
extern struct file_info finfo; /* input.c */
|
||||
|
|
|
@ -47,8 +47,12 @@ AtEoIT()
|
|||
|
||||
AtEoIF()
|
||||
{
|
||||
extern int nestlevel;
|
||||
extern int nestcount;
|
||||
extern int svnestlevel[];
|
||||
|
||||
if (nestlevel != -1) warning("missing #endif");
|
||||
if (nestlevel > svnestlevel[nestcount]) warning("missing #endif");
|
||||
else if (NoUnstack) warning("unexpected EOF");
|
||||
nestlevel = svnestlevel[nestcount--];
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -78,6 +78,5 @@ compile(argc, argv)
|
|||
fatal("%s: no source file %s\n", prog_name,
|
||||
source ? source : "stdin");
|
||||
if (source) WorkingDir = getwdir(dummy);
|
||||
nestlevel = -1;
|
||||
preprocess(source);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue