summaryrefslogtreecommitdiff
path: root/asm/error.c
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2019-06-06 20:53:17 -0700
committerH. Peter Anvin <hpa@zytor.com>2019-06-06 20:53:17 -0700
commitfdeb3b0d018f4c0ce5e16c0620287af806873543 (patch)
treeabb43e13e940bf0a7d10a7698e827350684bd3bc /asm/error.c
parent186f9a0514f466c36677b515622ba1c4fa96e32d (diff)
downloadnasm-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.c73
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;