diff options
Diffstat (limited to 'gdb/utils.h')
-rw-r--r-- | gdb/utils.h | 168 |
1 files changed, 146 insertions, 22 deletions
diff --git a/gdb/utils.h b/gdb/utils.h index 3347c23..6d33e8d 100644 --- a/gdb/utils.h +++ b/gdb/utils.h @@ -31,7 +31,24 @@ extern void initialize_utils (void); extern int sevenbit_strings; -extern int strcmp_iw (const char *, const char *); +/* Do a strncmp() type operation on STRING1 and STRING2, ignoring any + differences in whitespace. STRING2_LEN is STRING2's length. + Returns 0 if STRING1 matches STRING2_LEN characters of STRING2, + non-zero otherwise (slightly different than strncmp()'s range of + return values). */ +extern int strncmp_iw (const char *string1, const char *string2, + size_t string2_len); + +/* Do a strcmp() type operation on STRING1 and STRING2, ignoring any + differences in whitespace. Returns 0 if they match, non-zero if + they don't (slightly different than strcmp()'s range of return + values). + + As an extra hack, string1=="FOO(ARGS)" matches string2=="FOO". + This "feature" is useful when searching for matching C++ function + names (such as if the user types 'break FOO', where FOO is a + mangled C++ function). */ +extern int strcmp_iw (const char *string1, const char *string2); extern int strcmp_iw_ordered (const char *, const char *); @@ -42,6 +59,14 @@ extern int subset_compare (const char *, const char *); int compare_positive_ints (const void *ap, const void *bp); int compare_strings (const void *ap, const void *bp); +/* Compare C strings for std::sort. */ + +static inline bool +compare_cstrings (const char *str1, const char *str2) +{ + return strcmp (str1, str2) < 0; +} + /* A wrapper for bfd_errmsg to produce a more helpful error message in the case of bfd_error_file_ambiguously recognized. MATCHING, if non-NULL, is the corresponding argument to @@ -60,15 +85,125 @@ extern int parse_pid_to_attach (const char *args); extern int parse_escape (struct gdbarch *, const char **); -char **gdb_buildargv (const char *); - -/* Cleanup utilities. */ +/* A wrapper for an array of char* that was allocated in the way that + 'buildargv' does, and should be freed with 'freeargv'. */ -extern struct cleanup *make_cleanup_freeargv (char **); +class gdb_argv +{ +public: -struct ui_out; -extern struct cleanup * - make_cleanup_ui_out_redirect_pop (struct ui_out *uiout); + /* A constructor that initializes to NULL. */ + + gdb_argv () + : m_argv (NULL) + { + } + + /* A constructor that calls buildargv on STR. STR may be NULL, in + which case this object is initialized with a NULL array. If + buildargv fails due to out-of-memory, call malloc_failure. + Therefore, the value is guaranteed to be non-NULL, unless the + parameter itself is NULL. */ + + explicit gdb_argv (const char *str) + : m_argv (NULL) + { + reset (str); + } + + /* A constructor that takes ownership of an existing array. */ + + explicit gdb_argv (char **array) + : m_argv (array) + { + } + + gdb_argv (const gdb_argv &) = delete; + gdb_argv &operator= (const gdb_argv &) = delete; + + ~gdb_argv () + { + freeargv (m_argv); + } + + /* Call buildargv on STR, storing the result in this object. Any + previous state is freed. STR may be NULL, in which case this + object is reset with a NULL array. If buildargv fails due to + out-of-memory, call malloc_failure. Therefore, the value is + guaranteed to be non-NULL, unless the parameter itself is + NULL. */ + + void reset (const char *str); + + /* Return the underlying array. */ + + char **get () + { + return m_argv; + } + + /* Return the underlying array, transferring ownership to the + caller. */ + + char **release () + { + char **result = m_argv; + m_argv = NULL; + return result; + } + + /* Return the number of items in the array. */ + + int count () const + { + return countargv (m_argv); + } + + /* Index into the array. */ + + char *operator[] (int arg) + { + gdb_assert (m_argv != NULL); + return m_argv[arg]; + } + + /* The iterator type. */ + + typedef char **iterator; + + /* Return an iterator pointing to the start of the array. */ + + iterator begin () + { + return m_argv; + } + + /* Return an iterator pointing to the end of the array. */ + + iterator end () + { + return m_argv + count (); + } + + bool operator!= (std::nullptr_t) + { + return m_argv != NULL; + } + + bool operator== (std::nullptr_t) + { + return m_argv == NULL; + } + +private: + + /* The wrapped array. */ + + char **m_argv; +}; + + +/* Cleanup utilities. */ struct section_addr_info; extern struct cleanup *(make_cleanup_free_section_addr_info @@ -76,8 +211,6 @@ extern struct cleanup *(make_cleanup_free_section_addr_info /* For make_cleanup_close see common/filestuff.h. */ -extern struct cleanup *make_cleanup_fclose (FILE *file); - extern struct cleanup *make_cleanup_restore_integer (int *variable); extern struct cleanup *make_cleanup_restore_uinteger (unsigned int *variable); @@ -87,11 +220,6 @@ extern struct cleanup *make_cleanup_unpush_target (struct target_ops *ops); extern struct cleanup *make_cleanup_value_free_to_mark (struct value *); extern struct cleanup *make_cleanup_value_free (struct value *); -struct so_list; -extern struct cleanup *make_cleanup_free_so (struct so_list *so); - -extern struct cleanup *make_cleanup_restore_current_language (void); - /* A deleter for a hash table. */ struct htab_deleter { @@ -104,10 +232,6 @@ struct htab_deleter /* 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 - (struct parser_state **p); - extern void free_current_contents (void *); extern void init_page_info (void); @@ -120,11 +244,11 @@ extern struct cleanup *make_bpstat_clear_actions_cleanup (void); /* Path utilities. */ -extern char *gdb_realpath (const char *); +extern gdb::unique_xmalloc_ptr<char> gdb_realpath (const char *); -extern char *gdb_realpath_keepfile (const char *); +extern gdb::unique_xmalloc_ptr<char> gdb_realpath_keepfile (const char *); -extern char *gdb_abspath (const char *); +extern gdb::unique_xmalloc_ptr<char> gdb_abspath (const char *); extern int gdb_filename_fnmatch (const char *pattern, const char *string, int flags); |