diff options
author | H. Peter Anvin <hpa@zytor.com> | 2019-06-06 20:53:17 -0700 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2019-06-06 20:53:17 -0700 |
commit | fdeb3b0d018f4c0ce5e16c0620287af806873543 (patch) | |
tree | abb43e13e940bf0a7d10a7698e827350684bd3bc /asm/error.c | |
parent | 186f9a0514f466c36677b515622ba1c4fa96e32d (diff) | |
download | nasm-fdeb3b0d018f4c0ce5e16c0620287af806873543.tar.gz |
Add group aliases for all prefixed warnings.
For example, -w+float will now enable all warnings with names staring
with float-*.
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Diffstat (limited to 'asm/error.c')
-rw-r--r-- | asm/error.c | 73 |
1 files changed, 42 insertions, 31 deletions
diff --git a/asm/error.c b/asm/error.c index 4e86a0d7..b4ff8bad 100644 --- a/asm/error.c +++ b/asm/error.c @@ -172,18 +172,18 @@ void reset_warnings(void) *! specifies any warning not included in any specific warning class. * *!all [all] all possible warnings - *! is an alias for \e{all} suppressible warning classes. - *! Thus, \c{-w+all} enables all available warnings, and \c{-w-all} - *! disables warnings entirely (since NASM 2.13). + *! is an group alias for \e{all} warning classes. Thus, \c{-w+all} + *! enables all available warnings, and \c{-w-all} disables warnings + *! entirely (since NASM 2.13). */ bool set_warning_status(const char *value) { enum warn_action { WID_OFF, WID_ON, WID_RESET }; enum warn_action action; - const char *name; + const struct warning_alias *wa; + size_t vlen; bool ok = false; uint8_t mask; - int i; value = nasm_skip_spaces(value); @@ -235,37 +235,48 @@ bool set_warning_status(const char *value) } } - name = value ? value : "<none>"; if (value && !nasm_stricmp(value, "all")) value = NULL; + vlen = value ? strlen(value) : 0; + /* This is inefficient, but it shouldn't matter... */ - for (i = 1; i < WARN_IDX_ALL; i++) { - if (!value || !nasm_stricmp(value, warning_name[i])) { - ok = true; /* At least one action taken */ - switch (action) { - case WID_OFF: - warning_state[i] &= ~mask; - break; - case WID_ON: - warning_state[i] |= mask; - break; - case WID_RESET: - warning_state[i] &= ~mask; - warning_state[i] |= - warning_state_init->state[i] & mask; - break; - } - } - } + for (wa = warning_alias; wa < &warning_alias[NUM_WARNING_ALIAS]; wa++) { + enum warn_index i = wa->warning; - if (!ok) { - /*! - *!unknown-warning [off] unknown warning in -W/-w or warning directive - *! warns about a \c{-w} or \c{-W} option or a \c{[WARNING]} directive - *! that contains an unknown warning name or is otherwise not possible to process. - */ - nasm_warn(WARN_UNKNOWN_WARNING, "unknown warning name: %s", name); + if (value) { + char sep; + + if (nasm_strnicmp(value, wa->name, vlen)) + continue; /* Not a prefix */ + + sep = wa->name[vlen]; + if (sep != '\0' && sep != '-') + continue; /* Not a valid prefix */ + } + + ok = true; /* At least one action taken */ + switch (action) { + case WID_OFF: + warning_state[i] &= ~mask; + break; + case WID_ON: + warning_state[i] |= mask; + break; + case WID_RESET: + warning_state[i] &= ~mask; + warning_state[i] |= warning_state_init->state[i] & mask; + break; + } + } + + if (!ok && value) { + /*! + *!unknown-warning [off] unknown warning in -W/-w or warning directive + *! warns about a \c{-w} or \c{-W} option or a \c{[WARNING]} directive + *! that contains an unknown warning name or is otherwise not possible to process. + */ + nasm_warn(WARN_UNKNOWN_WARNING, "unknown warning name: %s", value); } return ok; |