the -U option did not work properly; call do_undef() now
authoreck <none@none>
Wed, 18 Apr 1990 16:40:17 +0000 (16:40 +0000)
committereck <none@none>
Wed, 18 Apr 1990 16:40:17 +0000 (16:40 +0000)
lang/cem/cemcom.ansi/domacro.c
lang/cem/cemcom.ansi/options.c
lang/cem/cpp.ansi/domacro.c
lang/cem/cpp.ansi/options.c

index 8561bae..ffd3fb2 100644 (file)
@@ -123,7 +123,7 @@ domacro()
                        do_pragma();
                        break;
                case K_UNDEF:                           /* "undef"      */
-                       do_undef();
+                       do_undef((struct idf *) 0);
                        break;
                default:
                        /* invalid word seen after the '#'      */
@@ -422,12 +422,14 @@ do_ifdef(how)
                SkipToNewLine();
 }
 
-do_undef()
+/* argidf != NULL when the undef came from a -U option */
+do_undef(argidf)
+       struct idf *argidf;
 {
-       register struct idf *id;
+       register struct idf *id = argidf;
 
        /* Forget a macro definition.   */
-       if (id = GetIdentifier(1)) {
+       if (id || (id = GetIdentifier(1))) {
                if (id->id_macro) { /* forget the macro */
                        if (id->id_macro->mc_flag & NOUNDEF) {
                                lexerror("it is not allowed to undef %s", id->id_text);
@@ -437,7 +439,7 @@ do_undef()
                                id->id_macro = (struct macro *) 0;
                        }
                } /* else: don't complain */
-               SkipToNewLine();
+               if (!argidf) SkipToNewLine();
        }
        else
                lexerror("illegal #undef construction");
index 19878b0..3e35067 100644 (file)
@@ -224,14 +224,7 @@ deleted, is now a debug-flag
                
        case 'U' :      {       /* -Uname :     undefine predefined     */
 #ifndef NOPP
-               register struct idf *idef;
-
-               if (*text)      {
-                       if ((idef = str2idf(text))->id_macro) {
-                               free_macro(idef->id_macro);
-                               idef->id_macro = (struct macro *) 0;
-                       }
-               }
+               if (*text) do_undef(str2idf(text));
 #else NOPP
                warning("-U option ignored");
 #endif NOPP
index 89c054e..86d17b0 100644 (file)
@@ -133,7 +133,7 @@ domacro()
                        do_pragma();
                        break;
                case K_UNDEF:                           /* "undef"      */
-                       do_undef();
+                       do_undef((char *)0);
                        break;
                default:
                        /* invalid word seen after the '#'      */
@@ -439,13 +439,15 @@ do_ifdef(how)
                SkipToNewLine();
 }
 
-do_undef()
+/* argstr != NULL when the undef came from a -U option */
+do_undef(argstr)
+       char *argstr;
 {
        register struct idf *id;
-       register char *str;
+       register char *str = argstr;
 
        /* Forget a macro definition.   */
-       if (str = GetIdentifier(1)) {
+       if (str || (str = GetIdentifier(1))) {
                if ((id = findidf(str)) && id->id_macro) {
                        if (id->id_macro->mc_flag & NOUNDEF) {
                                error("it is not allowed to #undef %s", str);
@@ -455,8 +457,10 @@ do_undef()
                                id->id_macro = (struct macro *) 0;
                        }
                } /* else: don't complain */
-               free(str);
-               SkipToNewLine();
+               if (!argstr){
+                       free(str);
+                       SkipToNewLine();
+               }
        }
        else
                error("illegal #undef construction");
index a32bfe0..d3533d6 100644 (file)
@@ -109,14 +109,7 @@ do_option(text)
                options['P'] = 1;
                break;
        case 'U' :      /* -Uname :     undefine predefined     */
-               if (*text)      {
-                       register struct idf *idef = findidf(text);
-
-                       if (idef && idef->id_macro) {
-                               free_macro(idef->id_macro);
-                               idef->id_macro = (struct macro *) 0;
-                       }
-               }
+               if (*text) do_undef(text);
                break;
        }
 }