do_pragma();
break;
case K_UNDEF: /* "undef" */
- do_undef();
+ do_undef((struct idf *) 0);
break;
default:
/* invalid word seen after the '#' */
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);
id->id_macro = (struct macro *) 0;
}
} /* else: don't complain */
- SkipToNewLine();
+ if (!argidf) SkipToNewLine();
}
else
lexerror("illegal #undef construction");
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
do_pragma();
break;
case K_UNDEF: /* "undef" */
- do_undef();
+ do_undef((char *)0);
break;
default:
/* invalid word seen after the '#' */
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);
id->id_macro = (struct macro *) 0;
}
} /* else: don't complain */
- free(str);
- SkipToNewLine();
+ if (!argstr){
+ free(str);
+ SkipToNewLine();
+ }
}
else
error("illegal #undef construction");
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;
}
}