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 */
|
/* 1 if a corresponding ELSE has been */
|
||||||
/* encountered. */
|
/* encountered. */
|
||||||
|
|
||||||
|
int nestlevel = -1;
|
||||||
|
int svnestlevel[30] = {-1};
|
||||||
|
int nestcount;
|
||||||
|
|
||||||
PRIVATE char *
|
PRIVATE char *
|
||||||
GetIdentifier()
|
GetIdentifier()
|
||||||
{
|
{
|
||||||
|
@ -261,7 +265,7 @@ do_include()
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
WorkingDir = getwdir(result);
|
WorkingDir = getwdir(result);
|
||||||
nestlevel = -1;
|
svnestlevel[++nestcount] = nestlevel;
|
||||||
FileName = result;
|
FileName = result;
|
||||||
LineNumber = 1;
|
LineNumber = 1;
|
||||||
}
|
}
|
||||||
|
@ -331,7 +335,7 @@ push_if()
|
||||||
PRIVATE
|
PRIVATE
|
||||||
do_elif()
|
do_elif()
|
||||||
{
|
{
|
||||||
if (nestlevel < 0 || (ifstack[nestlevel])) {
|
if (nestlevel <= svnestlevel[nestcount] || (ifstack[nestlevel])) {
|
||||||
error("#elif without corresponding #if");
|
error("#elif without corresponding #if");
|
||||||
PushBack();
|
PushBack();
|
||||||
skipline();
|
skipline();
|
||||||
|
@ -348,7 +352,7 @@ do_else()
|
||||||
{
|
{
|
||||||
PushBack();
|
PushBack();
|
||||||
skipline();
|
skipline();
|
||||||
if (nestlevel < 0 || (ifstack[nestlevel]))
|
if (nestlevel <= svnestlevel[nestcount] || (ifstack[nestlevel]))
|
||||||
error("#else without corresponding #if");
|
error("#else without corresponding #if");
|
||||||
else { /* mark this level as else-d */
|
else { /* mark this level as else-d */
|
||||||
++(ifstack[nestlevel]);
|
++(ifstack[nestlevel]);
|
||||||
|
@ -361,7 +365,7 @@ do_endif()
|
||||||
{
|
{
|
||||||
PushBack();
|
PushBack();
|
||||||
skipline();
|
skipline();
|
||||||
if (nestlevel-- < 0)
|
if (nestlevel-- <= svnestlevel[nestcount])
|
||||||
error("#endif without corresponding #if");
|
error("#endif without corresponding #if");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,12 +9,10 @@ struct file_info {
|
||||||
unsigned int fil_lino;
|
unsigned int fil_lino;
|
||||||
char *fil_name;
|
char *fil_name;
|
||||||
char *fil_wdir;
|
char *fil_wdir;
|
||||||
int fil_nestlevel;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define LineNumber finfo.fil_lino
|
#define LineNumber finfo.fil_lino
|
||||||
#define FileName finfo.fil_name
|
#define FileName finfo.fil_name
|
||||||
#define WorkingDir finfo.fil_wdir
|
#define WorkingDir finfo.fil_wdir
|
||||||
#define nestlevel finfo.fil_nestlevel
|
|
||||||
|
|
||||||
extern struct file_info finfo; /* input.c */
|
extern struct file_info finfo; /* input.c */
|
||||||
|
|
|
@ -47,8 +47,12 @@ AtEoIT()
|
||||||
|
|
||||||
AtEoIF()
|
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");
|
else if (NoUnstack) warning("unexpected EOF");
|
||||||
|
nestlevel = svnestlevel[nestcount--];
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,6 +78,5 @@ compile(argc, argv)
|
||||||
fatal("%s: no source file %s\n", prog_name,
|
fatal("%s: no source file %s\n", prog_name,
|
||||||
source ? source : "stdin");
|
source ? source : "stdin");
|
||||||
if (source) WorkingDir = getwdir(dummy);
|
if (source) WorkingDir = getwdir(dummy);
|
||||||
nestlevel = -1;
|
|
||||||
preprocess(source);
|
preprocess(source);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue