Fix the [warning] directive

Fix multiple bugs in the [warning] directive:

- Only parsed on pass 1
- "-" was interpreted as "+"
This commit is contained in:
H. Peter Anvin 2009-01-05 09:08:06 -08:00
parent f5fb723495
commit f1e46600d2

56
nasm.c
View file

@ -1394,37 +1394,35 @@ static void assemble_file(char *fname, StrList **depend_ptr)
ofmt->current_dfmt->debug_directive(debugid, p);
break;
case D_WARNING: /* [WARNING {+|-|*}warn-name] */
if (pass1 == 1) {
while (*value && nasm_isspace(*value))
value++;
while (*value && nasm_isspace(*value))
value++;
switch(*value) {
case '-': validid = 1; value++; break;
case '+': validid = 1; value++; break;
case '*': validid = 2; value++; break;
default: validid = 1; break;
}
switch(*value) {
case '-': validid = 0; value++; break;
case '+': validid = 1; value++; break;
case '*': validid = 2; value++; break;
default: validid = 1; break;
}
for (i = 1; i <= ERR_WARN_MAX; i++)
if (!nasm_stricmp(value, warnings[i].name))
break;
if (i <= ERR_WARN_MAX) {
switch(validid) {
case 0:
warning_on[i] = false;
break;
case 1:
warning_on[i] = true;
break;
case 2:
warning_on[i] = warning_on_global[i];
break;
}
}
else
report_error(ERR_NONFATAL,
"invalid warning id in WARNING directive");
}
for (i = 1; i <= ERR_WARN_MAX; i++)
if (!nasm_stricmp(value, warnings[i].name))
break;
if (i <= ERR_WARN_MAX) {
switch(validid) {
case 0:
warning_on[i] = false;
break;
case 1:
warning_on[i] = true;
break;
case 2:
warning_on[i] = warning_on_global[i];
break;
}
}
else
report_error(ERR_NONFATAL,
"invalid warning id in WARNING directive");
break;
case D_CPU: /* [CPU] */
cpu = get_cpu(value);