/* *INDENT-OFF* */ /* ATTRIBUTE_PRINTF confuses indent, avoid running it
for now. */
/* I/O, string, cleanup, and other random utilities for GDB.
- Copyright (C) 1986-2015 Free Software Foundation, Inc.
+ Copyright (C) 1986-2017 Free Software Foundation, Inc.
This file is part of GDB.
#define UTILS_H
#include "exceptions.h"
+#include "common/scoped_restore.h"
+#include <chrono>
extern void initialize_utils (void);
extern int subset_compare (char *, char *);
-ULONGEST strtoulst (const char *num, const char **trailer, int base);
-
int compare_positive_ints (const void *ap, const void *bp);
int compare_strings (const void *ap, const void *bp);
/* Reset the prompt_for_continue clock. */
void reset_prompt_for_continue_wait_time (void);
/* Return the time spent in prompt_for_continue. */
-struct timeval get_prompt_for_continue_wait_time (void);
+std::chrono::steady_clock::duration get_prompt_for_continue_wait_time ();
\f
/* Parsing utilites. */
extern struct cleanup *make_cleanup_freeargv (char **);
-struct dyn_string;
-extern struct cleanup *make_cleanup_dyn_string_delete (struct dyn_string *);
-
-struct ui_file;
-extern struct cleanup *make_cleanup_ui_file_delete (struct ui_file *);
-
struct ui_out;
extern struct cleanup *
make_cleanup_ui_out_redirect_pop (struct ui_out *uiout);
extern struct cleanup *make_cleanup_fclose (FILE *file);
-extern struct cleanup *make_cleanup_bfd_unref (bfd *abfd);
-
struct obstack;
extern struct cleanup *make_cleanup_obstack_free (struct obstack *obstack);
struct target_ops;
extern struct cleanup *make_cleanup_unpush_target (struct target_ops *ops);
-extern struct cleanup *
- make_cleanup_restore_ui_file (struct ui_file **variable);
-
extern struct cleanup *make_cleanup_value_free_to_mark (struct value *);
extern struct cleanup *make_cleanup_value_free (struct value *);
extern struct cleanup *make_cleanup_restore_current_language (void);
-extern struct cleanup *make_cleanup_htab_delete (htab_t htab);
+/* A deleter for a hash table. */
+struct htab_deleter
+{
+ void operator() (htab *ptr) const
+ {
+ htab_delete (ptr);
+ }
+};
+
+/* A unique_ptr wrapper for htab_t. */
+typedef std::unique_ptr<htab, htab_deleter> htab_up;
struct parser_state;
extern struct cleanup *make_cleanup_clear_parser_state
extern void substitute_path_component (char **stringp, const char *from,
const char *to);
-char *ldirname (const char *filename);
+std::string ldirname (const char *filename);
+
+extern int count_path_elements (const char *path);
+
+extern const char *strip_leading_path_elements (const char *path, int n);
\f
/* GDB output, ui_file utilities. */
extern void begin_line (void);
-extern void wrap_here (char *);
+extern void wrap_here (const char *);
extern void reinitialize_more_filter (void);
extern int pagination_enabled;
-/* Global ui_file streams. These are all defined in main.c. */
+extern struct ui_file **current_ui_gdb_stdout_ptr (void);
+extern struct ui_file **current_ui_gdb_stdin_ptr (void);
+extern struct ui_file **current_ui_gdb_stderr_ptr (void);
+extern struct ui_file **current_ui_gdb_stdlog_ptr (void);
+
+/* The current top level's ui_file streams. */
+
/* Normal results */
-extern struct ui_file *gdb_stdout;
+#define gdb_stdout (*current_ui_gdb_stdout_ptr ())
/* Input stream */
-extern struct ui_file *gdb_stdin;
+#define gdb_stdin (*current_ui_gdb_stdin_ptr ())
/* Serious error notifications */
-extern struct ui_file *gdb_stderr;
+#define gdb_stderr (*current_ui_gdb_stderr_ptr ())
/* Log/debug/trace messages that should bypass normal stdout/stderr
filtering. For moment, always call this stream using
*_unfiltered. In the very near future that restriction shall be
removed - either call shall be unfiltered. (cagney 1999-06-13). */
-extern struct ui_file *gdb_stdlog;
+#define gdb_stdlog (*current_ui_gdb_stdlog_ptr ())
+
+/* Truly global ui_file streams. These are all defined in main.c. */
+
/* Target output that should bypass normal stdout/stderr filtering.
For moment, always call this stream using *_unfiltered. In the
very near future that restriction shall be removed - either call
extern int filtered_printing_initialized (void);
/* Display the host ADDR on STREAM formatted as ``0x%x''. */
-extern void gdb_print_host_address (const void *addr, struct ui_file *stream);
+extern void gdb_print_host_address_1 (const void *addr, struct ui_file *stream);
+
+/* Wrapper that avoids adding a pointless cast to all callers. */
+#define gdb_print_host_address(ADDR, STREAM) \
+ gdb_print_host_address_1 ((const void *) ADDR, STREAM)
/* Convert CORE_ADDR to string in platform-specific manner.
This is usually formatted similar to 0x%lx. */
extern char *warning_pre_print;
-extern void error_stream (struct ui_file *) ATTRIBUTE_NORETURN;
+extern void error_stream (const string_file &) ATTRIBUTE_NORETURN;
extern void demangler_vwarning (const char *file, int line,
const char *, va_list ap)