summaryrefslogtreecommitdiff
path: root/m4/debug.c
diff options
context:
space:
mode:
Diffstat (limited to 'm4/debug.c')
-rw-r--r--m4/debug.c260
1 files changed, 0 insertions, 260 deletions
diff --git a/m4/debug.c b/m4/debug.c
deleted file mode 100644
index eb0e32fd..00000000
--- a/m4/debug.c
+++ /dev/null
@@ -1,260 +0,0 @@
-/* GNU m4 -- A simple macro processor
- Copyright (C) 1991-1994, 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 <sys/stat.h>
-#include <stdarg.h>
-
-#include "m4private.h"
-#include "close-stream.h"
-
-static void set_debug_file (m4 *, const m4_call_info *, FILE *);
-
-
-
-/* Function to decode the debugging flags OPTS of length LEN; or
- SIZE_MAX if OPTS is NUL-terminated. If OPTS is NULL, use the
- default flags. Used by main while processing option -d, and by the
- builtin debugmode (). */
-int
-m4_debug_decode (m4 *context, const char *opts, size_t len)
-{
- int previous = context->debug_level;
- int level;
- char mode = '\0';
-
- if (!opts)
- opts = "";
- if (len == SIZE_MAX)
- len = strlen (opts);
- if (!len)
- level = M4_DEBUG_TRACE_DEFAULT | previous;
- else
- {
- if (*opts == '-' || *opts == '+')
- {
- len--;
- mode = *opts++;
- }
- for (level = 0; len--; opts++)
- {
- switch (*opts)
- {
- case 'a':
- level |= M4_DEBUG_TRACE_ARGS;
- break;
-
- case 'e':
- level |= M4_DEBUG_TRACE_EXPANSION;
- break;
-
- case 'q':
- level |= M4_DEBUG_TRACE_QUOTE;
- break;
-
- case 't':
- level |= M4_DEBUG_TRACE_ALL;
- break;
-
- case 'l':
- level |= M4_DEBUG_TRACE_LINE;
- break;
-
- case 'f':
- level |= M4_DEBUG_TRACE_FILE;
- break;
-
- case 'p':
- level |= M4_DEBUG_TRACE_PATH;
- break;
-
- case 'c':
- level |= M4_DEBUG_TRACE_CALL;
- break;
-
- case 'i':
- level |= M4_DEBUG_TRACE_INPUT;
- break;
-
- case 'x':
- level |= M4_DEBUG_TRACE_CALLID;
- break;
-
- case 'm':
- level |= M4_DEBUG_TRACE_MODULE;
- break;
-
- case 's':
- level |= M4_DEBUG_TRACE_STACK;
- break;
-
- case 'd':
- level |= M4_DEBUG_TRACE_DEREF;
- break;
-
- case 'o':
- level |= M4_DEBUG_TRACE_OUTPUT_DUMPDEF;
- break;
-
- case 'V':
- level |= M4_DEBUG_TRACE_VERBOSE;
- break;
-
- default:
- return -1;
- }
- }
- }
-
- switch (mode)
- {
- case '\0':
- /* Replace old level. */
- break;
-
- case '-':
- /* Subtract flags. */
- level = previous & ~level;
- break;
-
- case '+':
- /* Add flags. */
- level |= previous;
- break;
-
- default:
- assert (!"m4_debug_decode");
- }
- context->debug_level = level;
- return level;
-}
-
-/* Change the debug output stream to FP. If the underlying file is the
- same as stdout, use stdout instead so that debug messages appear in the
- correct relative position. Report errors on behalf of CALLER. */
-static void
-set_debug_file (m4 *context, const m4_call_info *caller, FILE *fp)
-{
- FILE *debug_file;
- struct stat stdout_stat, debug_stat;
-
- assert (context);
-
- debug_file = m4_get_debug_file (context);
- if (debug_file != NULL && debug_file != stderr && debug_file != stdout
- && close_stream (debug_file) != 0)
- m4_error (context, 0, errno, caller, _("error writing to debug stream"));
-
- debug_file = fp;
- m4_set_debug_file (context, fp);
-
- if (debug_file != NULL && debug_file != stdout)
- {
- if (fstat (fileno (stdout), &stdout_stat) < 0)
- return;
- if (fstat (fileno (debug_file), &debug_stat) < 0)
- return;
-
- /* mingw has a bug where fstat on a regular file reports st_ino
- of 0. On normal system, st_ino should never be 0. */
- if (stdout_stat.st_ino == debug_stat.st_ino
- && stdout_stat.st_dev == debug_stat.st_dev
- && stdout_stat.st_ino != 0)
- {
- if (debug_file != stderr && close_stream (debug_file) != 0)
- m4_error (context, 0, errno, caller,
- _("error writing to debug stream"));
- m4_set_debug_file (context, stdout);
- }
- }
-}
-
-/* Change the debug output to file NAME. If NAME is NULL, debug
- output is reverted to stderr, and if empty debug output is
- discarded. Return true iff the output stream was changed. Report
- errors on behalf of CALLER. */
-bool
-m4_debug_set_output (m4 *context, const m4_call_info *caller, const char *name)
-{
- FILE *fp;
-
- assert (context);
-
- if (name == NULL)
- set_debug_file (context, caller, stderr);
- else if (*name == '\0')
- set_debug_file (context, caller, NULL);
- else
- {
- fp = fopen (name, "a");
- if (fp == NULL)
- return false;
-
- if (set_cloexec_flag (fileno (fp), true) != 0)
- m4_warn (context, errno, caller,
- _("cannot protect debug file across forks"));
- set_debug_file (context, caller, fp);
- }
- return true;
-}
-
-/* Print the header of a one-line debug message, starting with "m4debug:". */
-void
-m4_debug_message_prefix (m4 *context)
-{
- FILE *debug_file;
-
- assert (context);
-
- debug_file = m4_get_debug_file (context);
- fputs ("m4debug:", debug_file);
- if (m4_get_current_line (context))
- {
- if (m4_is_debug_bit (context, M4_DEBUG_TRACE_FILE))
- xfprintf (debug_file, "%s:", m4_get_current_file (context));
- if (m4_is_debug_bit (context, M4_DEBUG_TRACE_LINE))
- xfprintf (debug_file, "%d:", m4_get_current_line (context));
- }
- putc (' ', debug_file);
-}
-
-/* If the current debug mode includes MODE, and there is a current
- debug file, then output a debug message described by FORMAT. A
- message header is supplied, as well as a trailing newline. */
-void
-m4_debug_message (m4 *context, int mode, const char *format, ...)
-{
- /* Check that mode has exactly one bit set. */
- assert (mode && (mode & (mode - 1)) == 0);
- assert (format);
-
- if (m4_get_debug_file (context) != NULL
- && m4_is_debug_bit (context, mode))
- {
- va_list args;
-
- m4_debug_message_prefix (context);
- va_start (args, format);
- xvfprintf (m4_get_debug_file (context), format, args);
- va_end (args);
- putc ('\n', m4_get_debug_file (context));
- }
-}