fixed a problem with the ifdef-stack
authorceriel <none@none>
Thu, 20 Aug 1987 18:12:31 +0000 (18:12 +0000)
committerceriel <none@none>
Thu, 20 Aug 1987 18:12:31 +0000 (18:12 +0000)
util/cpp/domacro.c
util/cpp/file_info.h
util/cpp/input.c
util/cpp/main.c

index 665233e..aa8cd71 100644 (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");
 }
 
index cc6c663..241c8de 100644 (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 */
index 78aca5b..55789ca 100644 (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;
 }
index ac04bca..e9585cf 100644 (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);
 }