From aabda2da07cdaa4d5ed277fce7d99da42499df1e Mon Sep 17 00:00:00 2001 From: David MacKenzie Date: Mon, 24 Jan 1994 23:33:23 +0000 Subject: [PATCH] * format.c (bfd_check_format_matches): New function. (bfd_check_format): Call it. (bfd_matching_formats): Function removed. * targets.c: Replace the vector added on Jan 21 with a count of entries in default_vector. * bfd-in2.h: Regenerated. --- bfd/ChangeLog | 9 +++++ bfd/bfd-in2.h | 4 +- bfd/format.c | 105 +++++++++++++++++++++++++++++++++----------------- bfd/targets.c | 10 ++--- 4 files changed, 84 insertions(+), 44 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b9eba0ce541..63c3a9fdd07 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +Mon Jan 24 14:41:23 1994 David J. Mackenzie (djm@thepub.cygnus.com) + + * format.c (bfd_check_format_matches): New function. + (bfd_check_format): Call it. + (bfd_matching_formats): Function removed. + * targets.c: Replace the vector added on Jan 21 with a count of + entries in default_vector. + * bfd-in2.h: Regenerated. + Mon Jan 24 12:38:54 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) * elf32-hppa.c (hppa_elf_gen_reloc_type): Typo (== for =). diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 4f9573f77c5..691678437f7 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -2057,8 +2057,8 @@ bfd_target_list PARAMS ((void)); boolean bfd_check_format PARAMS ((bfd *abfd, bfd_format format)); -char ** -bfd_matching_formats PARAMS (()); +boolean +bfd_check_format_matches PARAMS ((bfd *abfd, bfd_format format, char ***matching)); boolean bfd_set_format PARAMS ((bfd *abfd, bfd_format format)); diff --git a/bfd/format.c b/bfd/format.c index 310a305c903..ad7bc81f6b4 100644 --- a/bfd/format.c +++ b/bfd/format.c @@ -45,7 +45,7 @@ SECTION #include "libbfd.h" /* IMPORT from targets.c. */ -extern char *matching_vector[]; +extern CONST size_t bfd_default_vector_entries; /* FUNCTION @@ -83,15 +83,43 @@ DESCRIPTION o <> - more than one backend recognised the file format. +*/ + +boolean +bfd_check_format (abfd, format) + bfd *abfd; + bfd_format format; +{ + return bfd_check_format_matches (abfd, format, NULL); +} + +/* +FUNCTION + bfd_check_format_matches + +SYNOPSIS + boolean bfd_check_format_matches(bfd *abfd, bfd_format format, char ***matching); +DESCRIPTION + Like <>, except when it returns false with + <> set to <>. In that + case, if @var{matching} is not NULL, it will be filled in with + a NULL-terminated list of the names of the formats that matched, + allocated with <>. + Then the user may choose a format and try again. + + When done with the list that @var{matching} points to, the caller + should free it. */ boolean -DEFUN(bfd_check_format,(abfd, format), - bfd *abfd AND - bfd_format format) +bfd_check_format_matches (abfd, format, matching) + bfd *abfd; + bfd_format format; + char ***matching; { bfd_target **target, *save_targ, *right_targ; + char **matching_vector; int match_count; if (!bfd_read_p (abfd) || @@ -110,7 +138,13 @@ DEFUN(bfd_check_format,(abfd, format), save_targ = abfd->xvec; match_count = 0; - matching_vector[0] = NULL; + if (matching) + { + *matching = matching_vector = + bfd_xmalloc_by_size_t (sizeof (char *) * + (bfd_default_vector_entries + 1)); + matching_vector[0] = NULL; + } right_targ = 0; @@ -125,6 +159,8 @@ DEFUN(bfd_check_format,(abfd, format), right_targ = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd)); if (right_targ) { abfd->xvec = right_targ; /* Set the target as returned */ + if (matching) + free (matching_vector); return true; /* File position has moved, BTW */ } } @@ -141,16 +177,23 @@ DEFUN(bfd_check_format,(abfd, format), temp = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd)); if (temp) { /* This format checks out as ok! */ right_targ = temp; - matching_vector[match_count++] = temp->name; - matching_vector[match_count] = NULL; + match_count++; + if (matching) + { + matching_vector[match_count] = temp->name; + matching_vector[match_count] = NULL; + } /* If this is the default target, accept it, even if other targets might match. People who want those other targets have to set the GNUTARGET variable. */ if (temp == default_vector[0]) { match_count = 1; - matching_vector[0] = temp->name; - matching_vector[1] = NULL; + if (matching) + { + matching_vector[0] = temp->name; + matching_vector[1] = NULL; + } break; } #ifdef GNU960 @@ -165,42 +208,32 @@ DEFUN(bfd_check_format,(abfd, format), } else if (bfd_error != wrong_format) { abfd->xvec = save_targ; abfd->format = bfd_unknown; + if (matching && bfd_error != file_ambiguously_recognized) + free (matching_vector); return false; } } if (match_count == 1) { abfd->xvec = right_targ; /* Change BFD's target permanently */ + if (matching) + free (matching_vector); return true; /* File position has moved, BTW */ } abfd->xvec = save_targ; /* Restore original target type */ abfd->format = bfd_unknown; /* Restore original format */ - bfd_error = ((match_count == 0) ? file_not_recognized : - file_ambiguously_recognized); + if (match_count == 0) + { + bfd_error = file_not_recognized; + if (matching) + free (matching_vector); + } + else + bfd_error = file_ambiguously_recognized; return false; } -/* -FUNCTION - bfd_matching_formats - -SYNOPSIS - char **bfd_matching_formats(); - -DESCRIPTION - If a call to <> returns - <>, you can call this function - afterward to return a NULL-terminated list of the names of - the formats that matched. - Then you can choose one and try again. */ - -char ** -bfd_matching_formats () -{ - return &matching_vector[0]; -} - /* FUNCTION bfd_set_format @@ -217,9 +250,9 @@ DESCRIPTION */ boolean -DEFUN(bfd_set_format,(abfd, format), - bfd *abfd AND - bfd_format format) +bfd_set_format (abfd, format) + bfd *abfd; + bfd_format format; { if (bfd_read_p (abfd) || @@ -258,8 +291,8 @@ DESCRIPTION */ CONST char * -DEFUN(bfd_format_string,(format), - bfd_format format) +bfd_format_string (format) + bfd_format format; { if (((int)format <(int) bfd_unknown) || ((int)format >=(int) bfd_type_end)) diff --git a/bfd/targets.c b/bfd/targets.c index 9d1e58cfe63..1e90f3ad936 100644 --- a/bfd/targets.c +++ b/bfd/targets.c @@ -573,12 +573,10 @@ bfd_target *default_vector[] = { NULL }; -/* When there is an ambiguous match, bfd_check_format puts the names - of the matching targets in this array. - It is declared here so we can give it the same number of entries - (+ a terminating NULL) as the number of possible targets. */ -char *matching_vector[sizeof(target_vector)/sizeof(*target_vector) + 1]; - +/* When there is an ambiguous match, bfd_check_format_ambig puts the names + of the matching targets in an array. This variable is the maximum + number of entries that array could possibly need. */ +CONST size_t bfd_default_vector_entries = sizeof(target_vector)/sizeof(*target_vector); /* FUNCTION -- 2.30.2