fixed a problem with the ifdef-stack

This commit is contained in:
ceriel 1987-08-20 18:12:31 +00:00
parent 831cdc7580
commit 754f9ce45d
4 changed files with 13 additions and 8 deletions

View file

@ -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");
}

View file

@ -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 */

View file

@ -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;
}

View file

@ -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);
}