X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Futils.c;h=284fbbb834783191df980711c5f5ab81b2b91a24;hb=0ae1c716a162ce43a63c16c37aa8c6caaa484650;hp=3915b58c047499ada2bbdf8ede3174a06316e5ac;hpb=c765fdb902fd6dbdeaa476b49592a4d9f835d983;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/utils.c b/gdb/utils.c index 3915b58c04..284fbbb834 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -1,6 +1,6 @@ /* General utility routines for GDB, the GNU debugger. - Copyright (C) 1986-2014 Free Software Foundation, Inc. + Copyright (C) 1986-2015 Free Software Foundation, Inc. This file is part of GDB. @@ -62,7 +62,7 @@ #include "readline/readline.h" -#include +#include "gdb_sys_time.h" #include #include "gdb_usleep.h" @@ -182,7 +182,7 @@ make_cleanup_dyn_string_delete (dyn_string_t arg) static void do_bfd_close_cleanup (void *arg) { - gdb_bfd_unref (arg); + gdb_bfd_unref ((bfd *) arg); } struct cleanup * @@ -191,29 +191,12 @@ make_cleanup_bfd_unref (bfd *abfd) return make_cleanup (do_bfd_close_cleanup, abfd); } -static void -do_close_cleanup (void *arg) -{ - int *fd = arg; - - close (*fd); -} - -struct cleanup * -make_cleanup_close (int fd) -{ - int *saved_fd = xmalloc (sizeof (fd)); - - *saved_fd = fd; - return make_cleanup_dtor (do_close_cleanup, saved_fd, xfree); -} - /* Helper function which does the work for make_cleanup_fclose. */ static void do_fclose_cleanup (void *arg) { - FILE *file = arg; + FILE *file = (FILE *) arg; fclose (file); } @@ -231,7 +214,7 @@ make_cleanup_fclose (FILE *file) static void do_obstack_free (void *arg) { - struct obstack *ob = arg; + struct obstack *ob = (struct obstack *) arg; obstack_free (ob, NULL); } @@ -247,7 +230,7 @@ make_cleanup_obstack_free (struct obstack *obstack) static void do_ui_file_delete (void *arg) { - ui_file_delete (arg); + ui_file_delete ((struct ui_file *) arg); } struct cleanup * @@ -261,7 +244,7 @@ make_cleanup_ui_file_delete (struct ui_file *arg) static void do_ui_out_redirect_pop (void *arg) { - struct ui_out *uiout = arg; + struct ui_out *uiout = (struct ui_out *) arg; if (ui_out_redirect (uiout, NULL) < 0) warning (_("Cannot restore redirection of the current output protocol")); @@ -279,7 +262,7 @@ make_cleanup_ui_out_redirect_pop (struct ui_out *uiout) static void do_free_section_addr_info (void *arg) { - free_section_addr_info (arg); + free_section_addr_info ((struct section_addr_info *) arg); } struct cleanup * @@ -297,7 +280,8 @@ struct restore_integer_closure static void restore_integer (void *p) { - struct restore_integer_closure *closure = p; + struct restore_integer_closure *closure + = (struct restore_integer_closure *) p; *(closure->variable) = closure->value; } @@ -308,8 +292,7 @@ restore_integer (void *p) struct cleanup * make_cleanup_restore_integer (int *variable) { - struct restore_integer_closure *c = - xmalloc (sizeof (struct restore_integer_closure)); + struct restore_integer_closure *c = XNEW (struct restore_integer_closure); c->variable = variable; c->value = *variable; @@ -331,7 +314,7 @@ make_cleanup_restore_uinteger (unsigned int *variable) static void do_unpush_target (void *arg) { - struct target_ops *ops = arg; + struct target_ops *ops = (struct target_ops *) arg; unpush_target (ops); } @@ -349,7 +332,7 @@ make_cleanup_unpush_target (struct target_ops *ops) static void do_htab_delete_cleanup (void *htab_voidp) { - htab_t htab = htab_voidp; + htab_t htab = (htab_t) htab_voidp; htab_delete (htab); } @@ -371,7 +354,8 @@ struct restore_ui_file_closure static void do_restore_ui_file (void *p) { - struct restore_ui_file_closure *closure = p; + struct restore_ui_file_closure *closure + = (struct restore_ui_file_closure *) p; *(closure->variable) = closure->value; } @@ -412,7 +396,7 @@ make_cleanup_value_free_to_mark (struct value *mark) static void do_value_free (void *value) { - value_free (value); + value_free ((struct value *) value); } /* Free VALUE. */ @@ -428,7 +412,7 @@ make_cleanup_value_free (struct value *value) static void do_free_so (void *arg) { - struct so_list *so = arg; + struct so_list *so = (struct so_list *) arg; free_so (so); } @@ -446,7 +430,7 @@ make_cleanup_free_so (struct so_list *so) static void do_restore_current_language (void *p) { - enum language saved_lang = (uintptr_t) p; + enum language saved_lang = (enum language) (uintptr_t) p; set_language (saved_lang); } @@ -492,7 +476,7 @@ make_cleanup_clear_parser_state (struct parser_state **p) void free_current_contents (void *ptr) { - void **location = ptr; + void **location = (void **) ptr; if (location == NULL) internal_error (__FILE__, __LINE__, @@ -877,8 +861,8 @@ add_internal_problem_command (struct internal_problem *problem) char *set_doc; char *show_doc; - set_cmd_list = xmalloc (sizeof (*set_cmd_list)); - show_cmd_list = xmalloc (sizeof (*set_cmd_list)); + set_cmd_list = XNEW (struct cmd_list_element *); + show_cmd_list = XNEW (struct cmd_list_element *); *set_cmd_list = NULL; *show_cmd_list = NULL; @@ -1058,6 +1042,18 @@ quit (void) #endif } +/* See defs.h. */ + +void +maybe_quit (void) +{ + if (check_quit_flag () || sync_quit_force_run) + quit (); + if (deprecated_interactive_hook) + deprecated_interactive_hook (); + target_check_pending_interrupt (); +} + /* Called when a memory allocation fails, with the number of bytes of memory requested in SIZE. */ @@ -1108,10 +1104,27 @@ print_spaces (int n, struct ui_file *file) /* Print a host address. */ void -gdb_print_host_address (const void *addr, struct ui_file *stream) +gdb_print_host_address_1 (const void *addr, struct ui_file *stream) { fprintf_filtered (stream, "%s", host_address_to_string (addr)); } + +/* See utils.h. */ + +char * +make_hex_string (const gdb_byte *data, size_t length) +{ + char *result = (char *) xmalloc (length * 2 + 1); + char *p; + size_t i; + + p = result; + for (i = 0; i < length; ++i) + p += xsnprintf (p, 3, "%02x", data[i]); + *p = '\0'; + return result; +} + /* A cleanup function that calls regfree. */ @@ -1119,7 +1132,7 @@ gdb_print_host_address (const void *addr, struct ui_file *stream) static void do_regfree_cleanup (void *r) { - regfree (r); + regfree ((regex_t *) r); } /* Create a new cleanup that frees the compiled regular expression R. */ @@ -1137,7 +1150,7 @@ char * get_regcomp_error (int code, regex_t *rx) { size_t length = regerror (code, rx, NULL, 0); - char *result = xmalloc (length); + char *result = (char *) xmalloc (length); regerror (code, rx, result, length); return result; @@ -1181,12 +1194,11 @@ compile_rx_or_error (regex_t *pattern, const char *rx, const char *message) static int ATTRIBUTE_PRINTF (1, 0) defaulted_query (const char *ctlstr, const char defchar, va_list args) { - int answer; int ans2; int retval; int def_value; char def_answer, not_def_answer; - char *y_string, *n_string, *question; + char *y_string, *n_string, *question, *prompt; /* Used to add duration we waited for user to respond to prompt_for_continue_wait_time. */ struct timeval prompt_started, prompt_ended, prompt_delta; @@ -1246,62 +1258,31 @@ defaulted_query (const char *ctlstr, const char defchar, va_list args) /* Format the question outside of the loop, to avoid reusing args. */ question = xstrvprintf (ctlstr, args); + prompt = xstrprintf (_("%s%s(%s or %s) %s"), + annotation_level > 1 ? "\n\032\032pre-query\n" : "", + question, y_string, n_string, + annotation_level > 1 ? "\n\032\032query\n" : ""); + xfree (question); /* Used for calculating time spend waiting for user. */ gettimeofday (&prompt_started, NULL); while (1) { - wrap_here (""); /* Flush any buffered output. */ - gdb_flush (gdb_stdout); - - if (annotation_level > 1) - printf_filtered (("\n\032\032pre-query\n")); - - fputs_filtered (question, gdb_stdout); - printf_filtered (_("(%s or %s) "), y_string, n_string); + char *response, answer; - if (annotation_level > 1) - printf_filtered (("\n\032\032query\n")); - - wrap_here (""); gdb_flush (gdb_stdout); + response = gdb_readline_wrapper (prompt); - answer = fgetc (stdin); - - /* We expect fgetc to block until a character is read. But - this may not be the case if the terminal was opened with - the NONBLOCK flag. In that case, if there is nothing to - read on stdin, fgetc returns EOF, but also sets the error - condition flag on stdin and errno to EAGAIN. With a true - EOF, stdin's error condition flag is not set. - - A situation where this behavior was observed is a pseudo - terminal on AIX. */ - while (answer == EOF && ferror (stdin) && errno == EAGAIN) - { - /* Not a real EOF. Wait a little while and try again until - we read something. */ - clearerr (stdin); - gdb_usleep (10000); - answer = fgetc (stdin); - } - - clearerr (stdin); /* in case of C-d */ - if (answer == EOF) /* C-d */ + if (response == NULL) /* C-d */ { printf_filtered ("EOF [assumed %c]\n", def_answer); retval = def_value; break; } - /* Eat rest of input line, to EOF or newline. */ - if (answer != '\n') - do - { - ans2 = fgetc (stdin); - clearerr (stdin); - } - while (ans2 != EOF && ans2 != '\n' && ans2 != '\r'); + + answer = response[0]; + xfree (response); if (answer >= 'a') answer -= 040; @@ -1316,8 +1297,7 @@ defaulted_query (const char *ctlstr, const char defchar, va_list args) specify the required input or have it default by entering nothing. */ if (answer == def_answer - || (defchar != '\0' && - (answer == '\n' || answer == '\r' || answer == EOF))) + || (defchar != '\0' && answer == '\0')) { retval = def_value; break; @@ -1333,7 +1313,7 @@ defaulted_query (const char *ctlstr, const char defchar, va_list args) timeval_add (&prompt_for_continue_wait_time, &prompt_for_continue_wait_time, &prompt_delta); - xfree (question); + xfree (prompt); if (annotation_level > 1) printf_filtered (("\n\032\032post-query\n")); return retval; @@ -1515,7 +1495,7 @@ parse_escape (struct gdbarch *gdbarch, const char **string_ptr) /* Print the character C on STREAM as part of the contents of a literal string whose delimiter is QUOTER. Note that this routine should only - be call for printing things which are independent of the language + be called for printing things which are independent of the language of the program being debugged. printchar will normally escape backslashes and instances of QUOTER. If @@ -1697,8 +1677,9 @@ init_page_info (void) Only try to use tgetnum function if rl_get_screen_size did not return a useful value. */ if (((rows <= 0) && (tgetnum ("li") < 0)) - /* Also disable paging if inside EMACS. */ - || getenv ("EMACS")) + /* Also disable paging if inside Emacs. $EMACS was used + before Emacs v25.1, $INSIDE_EMACS is used since then. */ + || getenv ("EMACS") || getenv ("INSIDE_EMACS")) { /* The number of lines per page is not mentioned in the terminal description or EMACS evironment variable is set. This probably @@ -1712,6 +1693,9 @@ init_page_info (void) #endif } + /* We handle SIGWINCH ourselves. */ + rl_catch_sigwinch = 0; + set_screen_size (); set_width (); } @@ -1811,6 +1795,18 @@ set_height_command (char *args, int from_tty, struct cmd_list_element *c) set_screen_size (); } +/* See utils.h. */ + +void +set_screen_width_and_height (int width, int height) +{ + lines_per_page = height; + chars_per_line = width; + + set_screen_size (); + set_width (); +} + /* Wait, so the user can read what's on the screen. Prompt the user to continue by pressing RETURN. */ @@ -2003,7 +1999,7 @@ puts_filtered_tabular (char *string, int width, int right) if (right) spaces += width - stringlen; - spacebuf = alloca (spaces + 1); + spacebuf = (char *) alloca (spaces + 1); spacebuf[spaces] = '\0'; while (spaces--) spacebuf[spaces] = ' '; @@ -2679,25 +2675,12 @@ subset_compare (char *string_to_compare, char *template_string) if (template_string != (char *) NULL && string_to_compare != (char *) NULL && strlen (string_to_compare) <= strlen (template_string)) match = - (strncmp - (template_string, string_to_compare, strlen (string_to_compare)) == 0); + (startswith (template_string, string_to_compare)); else match = 0; return match; } -static void -pagination_on_command (char *arg, int from_tty) -{ - pagination_enabled = 1; -} - -static void -pagination_off_command (char *arg, int from_tty) -{ - pagination_enabled = 0; -} - static void show_debug_timestamp (struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value) @@ -2729,8 +2712,6 @@ Setting this to \"unlimited\" or zero causes GDB never pause during output."), show_lines_per_page, &setlist, &showlist); - init_page_info (); - add_setshow_boolean_cmd ("pagination", class_support, &pagination_enabled, _("\ Set state of GDB output pagination."), _("\ @@ -2742,14 +2723,6 @@ Turning pagination off is an alternative to \"set height unlimited\"."), show_pagination_enabled, &setlist, &showlist); - if (xdb_commands) - { - add_com ("am", class_support, pagination_on_command, - _("Enable pagination")); - add_com ("sm", class_support, pagination_off_command, - _("Disable pagination")); - } - add_setshow_boolean_cmd ("sevenbit-strings", class_support, &sevenbit_strings, _("\ Set printing of 8-bit characters in strings as \\nnn."), _("\ @@ -2811,7 +2784,7 @@ print_core_address (struct gdbarch *gdbarch, CORE_ADDR address) hashval_t core_addr_hash (const void *ap) { - const CORE_ADDR *addrp = ap; + const CORE_ADDR *addrp = (const CORE_ADDR *) ap; return *addrp; } @@ -2821,8 +2794,8 @@ core_addr_hash (const void *ap) int core_addr_eq (const void *ap, const void *bp) { - const CORE_ADDR *addr_ap = ap; - const CORE_ADDR *addr_bp = bp; + const CORE_ADDR *addr_ap = (const CORE_ADDR *) ap; + const CORE_ADDR *addr_bp = (const CORE_ADDR *) bp; return *addr_ap == *addr_bp; } @@ -2868,84 +2841,48 @@ string_to_core_addr (const char *my_string) char * gdb_realpath (const char *filename) { - /* Method 1: The system has a compile time upper bound on a filename - path. Use that and realpath() to canonicalize the name. This is - the most common case. Note that, if there isn't a compile time - upper bound, you want to avoid realpath() at all costs. */ -#if defined (HAVE_REALPATH) && defined (PATH_MAX) - { - char buf[PATH_MAX]; - const char *rp = realpath (filename, buf); +/* On most hosts, we rely on canonicalize_file_name to compute + the FILENAME's realpath. + + But the situation is slightly more complex on Windows, due to some + versions of GCC which were reported to generate paths where + backlashes (the directory separator) were doubled. For instance: + c:\\some\\double\\slashes\\dir + ... instead of ... + c:\some\double\slashes\dir + Those double-slashes were getting in the way when comparing paths, + for instance when trying to insert a breakpoint as follow: + (gdb) b c:/some/double/slashes/dir/foo.c:4 + No source file named c:/some/double/slashes/dir/foo.c:4. + (gdb) b c:\some\double\slashes\dir\foo.c:4 + No source file named c:\some\double\slashes\dir\foo.c:4. + To prevent this from happening, we need this function to always + strip those extra backslashes. While canonicalize_file_name does + perform this simplification, it only works when the path is valid. + Since the simplification would be useful even if the path is not + valid (one can always set a breakpoint on a file, even if the file + does not exist locally), we rely instead on GetFullPathName to + perform the canonicalization. */ - if (rp == NULL) - rp = filename; - return xstrdup (rp); - } -#endif /* HAVE_REALPATH */ - - /* Method 2: The host system (i.e., GNU) has the function - canonicalize_file_name() which malloc's a chunk of memory and - returns that, use that. */ -#if defined(HAVE_CANONICALIZE_FILE_NAME) - { - char *rp = canonicalize_file_name (filename); - - if (rp == NULL) - return xstrdup (filename); - else - return rp; - } -#endif - - /* FIXME: cagney/2002-11-13: - - Method 2a: Use realpath() with a NULL buffer. Some systems, due - to the problems described in method 3, have modified their - realpath() implementation so that it will allocate a buffer when - NULL is passed in. Before this can be used, though, some sort of - configure time test would need to be added. Otherwize the code - will likely core dump. */ - - /* Method 3: Now we're getting desperate! The system doesn't have a - compile time buffer size and no alternative function. Query the - OS, using pathconf(), for the buffer limit. Care is needed - though, some systems do not limit PATH_MAX (return -1 for - pathconf()) making it impossible to pass a correctly sized buffer - to realpath() (it could always overflow). On those systems, we - skip this. */ -#if defined (HAVE_REALPATH) && defined (_PC_PATH_MAX) && defined(HAVE_ALLOCA) - { - /* Find out the max path size. */ - long path_max = pathconf ("/", _PC_PATH_MAX); - - if (path_max > 0) - { - /* PATH_MAX is bounded. */ - char *buf = alloca (path_max); - char *rp = realpath (filename, buf); - - return xstrdup (rp ? rp : filename); - } - } -#endif - - /* The MS Windows method. If we don't have realpath, we assume we - don't have symlinks and just canonicalize to a Windows absolute - path. GetFullPath converts ../ and ./ in relative paths to - absolute paths, filling in current drive if one is not given - or using the current directory of a specified drive (eg, "E:foo"). - It also converts all forward slashes to back slashes. */ - /* The file system is case-insensitive but case-preserving. - So we do not lowercase the path. Otherwise, we might not - be able to display the original casing in a given path. */ #if defined (_WIN32) { char buf[MAX_PATH]; DWORD len = GetFullPathName (filename, MAX_PATH, buf, NULL); + /* The file system is case-insensitive but case-preserving. + So it is important we do not lowercase the path. Otherwise, + we might not be able to display the original casing in a given + path. */ if (len > 0 && len < MAX_PATH) return xstrdup (buf); } +#else + { + char *rp = canonicalize_file_name (filename); + + if (rp != NULL) + return rp; + } #endif /* This system is a lost cause, just dup the buffer. */ @@ -2968,7 +2905,7 @@ gdb_realpath_keepfile (const char *filename) if (base_name == filename) return xstrdup (filename); - dir_name = alloca ((size_t) (base_name - filename + 2)); + dir_name = (char *) alloca ((size_t) (base_name - filename + 2)); /* Allocate enough space to store the dir_name + plus one extra character sometimes needed under Windows (see below), and then the closing \000 character. */ @@ -3040,23 +2977,6 @@ align_down (ULONGEST v, int n) return (v & -n); } -/* See utils.h. */ - -LONGEST -gdb_sign_extend (LONGEST value, int bit) -{ - gdb_assert (bit >= 1 && bit <= 8 * sizeof (LONGEST)); - - if (((value >> (bit - 1)) & 1) != 0) - { - LONGEST signbit = ((LONGEST) 1) << (bit - 1); - - value = (value ^ signbit) - signbit; - } - - return value; -} - /* Allocation function for the libiberty hash table which uses an obstack. The obstack is passed as DATA. */ @@ -3081,105 +3001,6 @@ dummy_obstack_deallocate (void *object, void *data) return; } -/* The bit offset of the highest byte in a ULONGEST, for overflow - checking. */ - -#define HIGH_BYTE_POSN ((sizeof (ULONGEST) - 1) * HOST_CHAR_BIT) - -/* True (non-zero) iff DIGIT is a valid digit in radix BASE, - where 2 <= BASE <= 36. */ - -static int -is_digit_in_base (unsigned char digit, int base) -{ - if (!isalnum (digit)) - return 0; - if (base <= 10) - return (isdigit (digit) && digit < base + '0'); - else - return (isdigit (digit) || tolower (digit) < base - 10 + 'a'); -} - -static int -digit_to_int (unsigned char c) -{ - if (isdigit (c)) - return c - '0'; - else - return tolower (c) - 'a' + 10; -} - -/* As for strtoul, but for ULONGEST results. */ - -ULONGEST -strtoulst (const char *num, const char **trailer, int base) -{ - unsigned int high_part; - ULONGEST result; - int minus = 0; - int i = 0; - - /* Skip leading whitespace. */ - while (isspace (num[i])) - i++; - - /* Handle prefixes. */ - if (num[i] == '+') - i++; - else if (num[i] == '-') - { - minus = 1; - i++; - } - - if (base == 0 || base == 16) - { - if (num[i] == '0' && (num[i + 1] == 'x' || num[i + 1] == 'X')) - { - i += 2; - if (base == 0) - base = 16; - } - } - - if (base == 0 && num[i] == '0') - base = 8; - - if (base == 0) - base = 10; - - if (base < 2 || base > 36) - { - errno = EINVAL; - return 0; - } - - result = high_part = 0; - for (; is_digit_in_base (num[i], base); i += 1) - { - result = result * base + digit_to_int (num[i]); - high_part = high_part * base + (unsigned int) (result >> HIGH_BYTE_POSN); - result &= ((ULONGEST) 1 << HIGH_BYTE_POSN) - 1; - if (high_part > 0xff) - { - errno = ERANGE; - result = ~ (ULONGEST) 0; - high_part = 0; - minus = 0; - break; - } - } - - if (trailer != NULL) - *trailer = &num[i]; - - result = result + ((ULONGEST) high_part << HIGH_BYTE_POSN); - if (minus) - return -result; - else - return result; -} - /* Simple, portable version of dirname that does not modify its argument. */ @@ -3195,7 +3016,7 @@ ldirname (const char *filename) if (base == filename) return NULL; - dirname = xmalloc (base - filename + 2); + dirname = (char *) xmalloc (base - filename + 2); memcpy (dirname, filename, base - filename); /* On DOS based file systems, convert "d:foo" to "d:.", so that we @@ -3261,7 +3082,7 @@ gdb_bfd_errmsg (bfd_error_type error_tag, char **matching) + strlen (AMBIGUOUS_MESS2); for (p = matching; *p; p++) ret_len += strlen (*p) + 1; - ret = xmalloc (ret_len + 1); + ret = (char *) xmalloc (ret_len + 1); retp = ret; make_cleanup (xfree, ret); @@ -3327,41 +3148,52 @@ make_bpstat_clear_actions_cleanup (void) int producer_is_gcc_ge_4 (const char *producer) { - const char *cs; int major, minor; - if (producer == NULL) - { - /* For unknown compilers expect their behavior is not compliant. For GCC - this case can also happen for -gdwarf-4 type units supported since - gcc-4.5. */ - - return -1; - } + if (! producer_is_gcc (producer, &major, &minor)) + return -1; + if (major < 4) + return -1; + if (major > 4) + return INT_MAX; + return minor; +} - /* Skip any identifier after "GNU " - such as "C++" or "Java". */ +/* Returns nonzero if the given PRODUCER string is GCC and sets the MAJOR + and MINOR versions when not NULL. Returns zero if the given PRODUCER + is NULL or it isn't GCC. */ - if (strncmp (producer, "GNU ", strlen ("GNU ")) != 0) - { - /* For non-GCC compilers expect their behavior is not compliant. */ +int +producer_is_gcc (const char *producer, int *major, int *minor) +{ + const char *cs; - return -1; - } - cs = &producer[strlen ("GNU ")]; - while (*cs && !isdigit (*cs)) - cs++; - if (sscanf (cs, "%d.%d", &major, &minor) != 2) + if (producer != NULL && startswith (producer, "GNU ")) { - /* Not recognized as GCC. */ - - return -1; + int maj, min; + + if (major == NULL) + major = &maj; + if (minor == NULL) + minor = &min; + + /* Skip any identifier after "GNU " - such as "C11" "C++" or "Java". + A full producer string might look like: + "GNU C 4.7.2" + "GNU Fortran 4.8.2 20140120 (Red Hat 4.8.2-16) -mtune=generic ..." + "GNU C++14 5.0.0 20150123 (experimental)" + */ + cs = &producer[strlen ("GNU ")]; + while (*cs && !isspace (*cs)) + cs++; + if (*cs && isspace (*cs)) + cs++; + if (sscanf (cs, "%d.%d", major, minor) == 2) + return 1; } - if (major < 4) - return -1; - if (major > 4) - return INT_MAX; - return minor; + /* Not recognized as GCC. */ + return 0; } /* Helper for make_cleanup_free_char_ptr_vec. */ @@ -3369,7 +3201,7 @@ producer_is_gcc_ge_4 (const char *producer) static void do_free_char_ptr_vec (void *arg) { - VEC (char_ptr) *char_ptr_vec = arg; + VEC (char_ptr) *char_ptr_vec = (VEC (char_ptr) *) arg; free_char_ptr_vec (char_ptr_vec); } @@ -3412,7 +3244,8 @@ substitute_path_component (char **stringp, const char *from, const char *to) { char *string_new; - string_new = xrealloc (string, (strlen (string) + to_len + 1)); + string_new + = (char *) xrealloc (string, (strlen (string) + to_len + 1)); /* Relocate the current S pointer. */ s = s - string + string_new; @@ -3473,9 +3306,9 @@ wait_to_die_with_timeout (pid_t pid, int *status, int timeout) sa.sa_flags = 0; sigaction (SIGALRM, &sa, &old_sa); #else - void (*ofunc) (); + sighandler_t ofunc; - ofunc = (void (*)()) signal (SIGALRM, sigalrm_handler); + ofunc = signal (SIGALRM, sigalrm_handler); #endif alarm (timeout); @@ -3523,14 +3356,14 @@ gdb_filename_fnmatch (const char *pattern, const char *string, int flags) /* Replace '\' by '/' in both strings. */ - pattern_slash = alloca (strlen (pattern) + 1); + pattern_slash = (char *) alloca (strlen (pattern) + 1); strcpy (pattern_slash, pattern); pattern = pattern_slash; for (; *pattern_slash != 0; pattern_slash++) if (IS_DIR_SEPARATOR (*pattern_slash)) *pattern_slash = '/'; - string_slash = alloca (strlen (string) + 1); + string_slash = (char *) alloca (strlen (string) + 1); strcpy (string_slash, string); string = string_slash; for (; *string_slash != 0; string_slash++)