diff options
Diffstat (limited to 'm4/utility.c')
-rw-r--r-- | m4/utility.c | 292 |
1 files changed, 0 insertions, 292 deletions
diff --git a/m4/utility.c b/m4/utility.c deleted file mode 100644 index 2063c6a3..00000000 --- a/m4/utility.c +++ /dev/null @@ -1,292 +0,0 @@ -/* GNU m4 -- A simple macro processor - Copyright (C) 1989-1994, 1998-1999, 2003, 2006-2010, 2013-2014, 2017 - Free Software Foundation, Inc. - - This file is part of GNU M4. - - GNU M4 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - GNU M4 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#include <config.h> - -#include "m4private.h" - -#include "exitfail.h" -#include "progname.h" -#include "quotearg.h" -#include "verror.h" -#include "xvasprintf.h" - -static const char *skip_space (m4 *, const char *); - - - -/* Give friendly warnings if a builtin macro is passed an - inappropriate number of arguments. MIN is the 0-based minimum - number of acceptable arguments, MAX is the 0-based maximum number - or UINT_MAX if not applicable, and SIDE_EFFECT is true if the macro - has side effects even if min is not satisfied. ARGC is the 1-based - count of supplied arguments, and CALLER is the name of the macro. - Return true if the macro is guaranteed to expand to the empty - string, false otherwise. */ -bool -m4_bad_argc (m4 *context, size_t argc, const m4_call_info *caller, size_t min, - size_t max, bool side_effect) -{ - if (argc - 1 < min) - { - m4_warn (context, 0, caller, _("too few arguments: %zu < %zu"), - argc - 1, min); - return !side_effect; - } - - if (argc - 1 > max) - { - m4_warn (context, 0, caller, _("extra arguments ignored: %zu > %zu"), - argc - 1, max); - } - - return false; -} - -static const char * -skip_space (m4 *context, const char *arg) -{ - while (m4_has_syntax (M4SYNTAX, *arg, M4_SYNTAX_SPACE)) - arg++; - return arg; -} - -/* The function m4_numeric_arg () converts ARG of length LEN to an int - pointed to by VALUEP. If the conversion fails, print error message - for CALLER. Return true iff conversion succeeds. */ -/* FIXME: Convert this to use gnulib's xstrtoimax, xstrtoumax. - Otherwise, we are arbitrarily limiting integer values. */ -bool -m4_numeric_arg (m4 *context, const m4_call_info *caller, const char *arg, - size_t len, int *valuep) -{ - char *endp; - - if (!len) - { - *valuep = 0; - m4_warn (context, 0, caller, _("empty string treated as 0")); - } - else - { - const char *str = skip_space (context, arg); - *valuep = strtol (str, &endp, 10); - if (endp - arg != len) - { - m4_warn (context, 0, caller, _("non-numeric argument %s"), - quotearg_style_mem (locale_quoting_style, arg, len)); - return false; - } - if (str != arg) - m4_warn (context, 0, caller, _("leading whitespace ignored")); - else if (errno == ERANGE) - m4_warn (context, 0, caller, _("numeric overflow detected")); - } - return true; -} - -/* Parse ARG of length LEN as a truth value. If ARG is NUL, use "" - instead; otherwise, ARG must have a NUL-terminator (even if it also - has embedded NUL). If LEN is SIZE_MAX, use the string length of - ARG. If unrecognized, issue a warning on behalf of CALLER and - return PREVIOUS; otherwise return the parsed value. */ -bool -m4_parse_truth_arg (m4 *context, const m4_call_info *caller, const char *arg, - size_t len, bool previous) -{ - /* 0, no, off, blank... */ - if (!arg || len == 0 - || arg[0] == '0' - || arg[0] == 'n' || arg[0] == 'N' - || ((arg[0] == 'o' || arg[0] == 'O') - && (arg[1] == 'f' || arg[1] == 'F'))) - return false; - /* 1, yes, on... */ - if (arg[0] == '1' - || arg[0] == 'y' || arg[0] == 'Y' - || ((arg[0] == 'o' || arg[0] == 'O') - && (arg[1] == 'n' || arg[1] == 'N'))) - return true; - m4_warn (context, 0, caller, _("unknown directive %s"), - quotearg_style_mem (locale_quoting_style, arg, len)); - return previous; -} - -/* Helper method to look up a symbol table entry given an argument. - Warn on behalf of ARGV if VALUE is not a text argument, or if - MUST_EXIST and no macro exists by the name in VALUE. Return the - result of the lookup, or NULL. */ -m4_symbol * -m4_symbol_value_lookup (m4 *context, m4_macro_args *argv, size_t i, - bool must_exist) -{ - m4_symbol *result = NULL; - if (m4_is_arg_text (argv, i)) - { - const char *name = M4ARG (i); - size_t len = M4ARGLEN (i); - result = m4_symbol_lookup (M4SYMTAB, name, len); - if (must_exist && !result - && m4_is_debug_bit (context, M4_DEBUG_TRACE_DEREF)) - m4_warn (context, 0, argv->info, _("undefined macro %s"), - quotearg_style_mem (locale_quoting_style, name, len)); - } - else - m4_warn (context, 0, argv->info, _("invalid macro name ignored")); - return result; -} - -/* Return an escaped version of the macro name corresponding to - CALLER, for use in error messages that do not use the m4_warn - machinery. This call occupies slot 0 of the quotearg - machinery. */ -const char *m4_info_name (const m4_call_info *caller) -{ - return quotearg_style_mem (locale_quoting_style, caller->name, - caller->name_len); -} - -/* Helper for all error reporting. Report message based on FORMAT and - ARGS, on behalf of CALLER (if any), otherwise at the global - position in CONTEXT. If ERRNUM, decode the errno value as part of - the message. If STATUS, exit immediately with that status. If - WARN, prepend 'warning: '. */ -static void -m4_verror_at_line (m4 *context, bool warn, int status, int errnum, - const m4_call_info *caller, const char *format, - va_list args) -{ - char *full = NULL; - char *safe_macro = NULL; - const char *macro = caller ? caller->name : NULL; - size_t len = caller ? caller->name_len : 0; - const char *file = caller ? caller->file : m4_get_current_file (context); - int line = caller ? caller->line : m4_get_current_line (context); - - assert (file || !line); - /* Sanitize MACRO, since we are turning around and using it in a - format string. The allocation is overly conservative, but - problematic macro names only occur via indir or changesyntax. */ - if (macro && memchr (macro, '%', len)) - { - char *p = safe_macro = xcharalloc (2 * len); - const char *end = macro + len; - while (macro != end) - { - if (*macro == '%') - { - *p++ = '%'; - len++; - } - *p++ = *macro++; - } - } - if (macro) - /* Use slot 1, so that the rest of the code can use the simpler - quotearg interface in slot 0. */ - macro = quotearg_n_mem (1, safe_macro ? safe_macro : macro, len); - /* Prepend warning and the macro name, as needed. But if that fails - for non-memory reasons (unlikely), then still use the original - format. */ - if (warn && macro) - full = xasprintf (_("warning: %s: %s"), macro, format); - else if (warn) - full = xasprintf (_("warning: %s"), format); - else if (macro) - full = xasprintf (_("%s: %s"), macro, format); - verror_at_line (status, errnum, line ? file : NULL, line, - full ? full : format, args); - free (full); - free (safe_macro); - if ((!warn || m4_get_fatal_warnings_opt (context)) - && !m4_get_exit_status (context)) - m4_set_exit_status (context, EXIT_FAILURE); -} - -/* Issue an error. The message is printf-style, based on FORMAT and - any other arguments, and the program name and location (if we are - currently parsing an input file) are automatically prepended. If - ERRNUM is non-zero, include strerror output in the message. If - CALLER, prepend the message with the macro where the message - occurred. If STATUS is non-zero, or if errors are fatal, call exit - immediately; otherwise, remember that an error occurred so that m4 - cannot exit with success later on.*/ -void -m4_error (m4 *context, int status, int errnum, const m4_call_info *caller, - const char *format, ...) -{ - va_list args; - va_start (args, format); - if (status == EXIT_SUCCESS && m4_get_warnings_exit_opt (context)) - status = EXIT_FAILURE; - m4_verror_at_line (context, false, status, errnum, caller, format, args); - va_end (args); -} - -/* Issue a warning, if they are not being suppressed. The message is - printf-style, based on FORMAT and any other arguments, and the - program name, location (if we are currently parsing an input file), - and "warning:" are automatically prepended. If ERRNUM is non-zero, - include strerror output in the message. If CALLER, prepend the - message with the macro where the message occurred. If warnings are - fatal, call exit immediately, otherwise exit status is - unchanged. */ -void -m4_warn (m4 *context, int errnum, const m4_call_info *caller, - const char *format, ...) -{ - if (!m4_get_suppress_warnings_opt (context)) - { - va_list args; - int status = EXIT_SUCCESS; - va_start (args, format); - if (m4_get_warnings_exit_opt (context)) - status = EXIT_FAILURE; - m4_verror_at_line (context, true, status, errnum, caller, format, args); - va_end (args); - } -} - -/* Wrap the gnulib progname module, to avoid exporting a global - variable from a library. Retrieve the program name for use in - error messages and the __program__ macro. */ -const char * -m4_get_program_name (void) -{ - return program_name; -} - -/* Wrap the gnulib progname module, to avoid exporting a global - variable from a library. Set the program name for use in error - messages and the __program__ macro to argv[0]. */ -void -m4_set_program_name (const char *name) -{ - set_program_name (name); -} - -/* Wrap the gnulib exitfail module, to avoid exporting a global - variable from a library. Set the exit status for use in gnulib - modules and atexit handlers. */ -void -m4_set_exit_failure (int status) -{ - exit_failure = status; -} |