X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;ds=sidebyside;f=binutils%2Farsup.c;h=9c6953ef8d9d216e158b562eb1f0ea68bf2cc3ae;hb=0cb112f7400187275da81a05a9ad0534f1430139;hp=7af77314b093db1989871a7ab2da618731295867;hpb=f462a9ea21643369d0dd4327c69c0a802cb3da35;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/arsup.c b/binutils/arsup.c index 7af77314b0..9c6953ef8d 100644 --- a/binutils/arsup.c +++ b/binutils/arsup.c @@ -1,50 +1,51 @@ /* arsup.c - Archive support for MRI compatibility - Copyright 1992, 1994, 1995, 1996, 1997, 2000 - Free Software Foundation, Inc. + Copyright 1992-2013 2008 Free Software Foundation, Inc. -This file is part of GNU Binutils. + This file is part of GNU Binutils. -This program 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 2 of the License, or -(at your option) any later version. + This program 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. -This program 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. + This program 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, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ /* Contributed by Steve Chamberlain - sac@cygnus.com + sac@cygnus.com -This file looks after requests from arparse.y, to provide the MRI -style librarian command syntax + 1 word LIST - -*/ + This file looks after requests from arparse.y, to provide the MRI + style librarian command syntax + 1 word LIST. */ +#include "sysdep.h" #include "bfd.h" -#include "arsup.h" #include "libiberty.h" -#include "bucomm.h" #include "filenames.h" +#include "bucomm.h" +#include "arsup.h" static void map_over_list - PARAMS ((bfd *, void (*function) (bfd *, bfd *), struct list *)); -static void ar_directory_doer PARAMS ((bfd *, bfd *)); -static void ar_addlib_doer PARAMS ((bfd *, bfd *)); + (bfd *, void (*function) (bfd *, bfd *), struct list *); +static void ar_directory_doer (bfd *, bfd *); +static void ar_addlib_doer (bfd *, bfd *); extern int verbose; +extern int deterministic; + +static bfd *obfd; +static char *real_name; +static FILE *outfile; static void -map_over_list (arch, function, list) - bfd *arch; - void (*function) PARAMS ((bfd *, bfd *)); - struct list *list; +map_over_list (bfd *arch, void (*function) (bfd *, bfd *), struct list *list) { bfd *head; @@ -52,10 +53,10 @@ map_over_list (arch, function, list) { bfd *next; - head = arch->next; + head = arch->archive_next; while (head != NULL) { - next = head->next; + next = head->archive_next; function (head, (bfd *) NULL); head = next; } @@ -71,15 +72,15 @@ map_over_list (arch, function, list) want to hack multiple references. */ for (ptr = list; ptr; ptr = ptr->next) { - boolean found = false; + bfd_boolean found = FALSE; bfd *prev = arch; - for (head = arch->next; head; head = head->next) + for (head = arch->archive_next; head; head = head->archive_next) { if (head->filename != NULL && FILENAME_CMP (ptr->name, head->filename) == 0) { - found = true; + found = TRUE; function (head, prev); } prev = head; @@ -91,22 +92,15 @@ map_over_list (arch, function, list) } -FILE *outfile; -/*ARGSUSED*/ static void -ar_directory_doer (abfd, ignore) - bfd *abfd; - bfd *ignore ATTRIBUTE_UNUSED; +ar_directory_doer (bfd *abfd, bfd *ignore ATTRIBUTE_UNUSED) { - print_arelt_descr(outfile, abfd, verbose); + print_arelt_descr(outfile, abfd, verbose); } void -ar_directory (ar_name, list, output) - char *ar_name; - struct list *list; - char *output; +ar_directory (char *ar_name, struct list *list, char *output) { bfd *arch; @@ -133,97 +127,103 @@ ar_directory (ar_name, list, output) } void -DEFUN_VOID(prompt) +prompt (void) { extern int interactive; + if (interactive) - { - printf("AR >"); - fflush(stdout); - } + { + printf ("AR >"); + fflush (stdout); + } } void -maybequit () +maybequit (void) { if (! interactive) xexit (9); } -bfd *obfd; -char *real_name ; void -DEFUN(ar_open,(name, t), - char *name AND - int t) - +ar_open (char *name, int t) { char *tname = (char *) xmalloc (strlen (name) + 10); const char *bname = lbasename (name); real_name = name; + /* Prepend tmp- to the beginning, to avoid file-name clashes after truncation on filesystems with limited namespaces (DOS). */ - sprintf(tname, "%.*stmp-%s", (int) (bname - name), name, bname); - obfd = bfd_openw(tname, NULL); - - if (!obfd) { - fprintf(stderr,_("%s: Can't open output archive %s\n"), program_name, - tname); - - maybequit(); - } - else { - if (!t) { - bfd **ptr; - bfd *element; - bfd *ibfd; - ibfd = bfd_openr(name, NULL); - if (!ibfd) { - fprintf(stderr,_("%s: Can't open input archive %s\n"), - program_name, name); - maybequit(); - return; - } - if (bfd_check_format(ibfd, bfd_archive) != true) { - fprintf(stderr,_("%s: file %s is not an archive\n"), program_name, - name); - maybequit(); - return; - } - ptr = &(obfd->archive_head); - element = bfd_openr_next_archived_file(ibfd, NULL); - - while (element) { - *ptr = element; - ptr = &element->next; - element = bfd_openr_next_archived_file(ibfd, element); - } + sprintf (tname, "%.*stmp-%s", (int) (bname - name), name, bname); + obfd = bfd_openw (tname, NULL); + + if (!obfd) + { + fprintf (stderr, + _("%s: Can't open output archive %s\n"), + program_name, tname); + + maybequit (); } + else + { + if (!t) + { + bfd **ptr; + bfd *element; + bfd *ibfd; - bfd_set_format(obfd, bfd_archive); + ibfd = bfd_openr (name, NULL); - obfd->has_armap = 1; - } -} + if (!ibfd) + { + fprintf (stderr,_("%s: Can't open input archive %s\n"), + program_name, name); + maybequit (); + return; + } + + if (!bfd_check_format(ibfd, bfd_archive)) + { + fprintf (stderr, + _("%s: file %s is not an archive\n"), + program_name, name); + maybequit (); + return; + } + ptr = &(obfd->archive_head); + element = bfd_openr_next_archived_file (ibfd, NULL); + + while (element) + { + *ptr = element; + ptr = &element->archive_next; + element = bfd_openr_next_archived_file (ibfd, element); + } + } + + bfd_set_format (obfd, bfd_archive); + + obfd->has_armap = 1; + obfd->is_thin_archive = 0; + } +} static void -ar_addlib_doer (abfd, prev) - bfd *abfd; - bfd *prev; +ar_addlib_doer (bfd *abfd, bfd *prev) { - /* Add this module to the output bfd */ + /* Add this module to the output bfd. */ if (prev != NULL) - prev->next = abfd->next; - abfd->next = obfd->archive_head; + prev->archive_next = abfd->archive_next; + + abfd->archive_next = obfd->archive_head; obfd->archive_head = abfd; } void -ar_addlib (name, list) - char *name; - struct list *list; +ar_addlib (char *name, struct list *list) { if (obfd == NULL) { @@ -238,224 +238,247 @@ ar_addlib (name, list) if (arch != NULL) map_over_list (arch, ar_addlib_doer, list); - /* Don't close the bfd, since it will make the elements disasppear */ + /* Don't close the bfd, since it will make the elements disappear. */ } } void -DEFUN(ar_addmod, (list), - struct list *list) +ar_addmod (struct list *list) { - if (!obfd) { - fprintf(stderr, _("%s: no open output archive\n"), program_name); - maybequit(); - } + if (!obfd) + { + fprintf (stderr, _("%s: no open output archive\n"), program_name); + maybequit (); + } else - { - while (list) { - bfd *abfd = bfd_openr(list->name, NULL); - if (!abfd) { - fprintf(stderr,_("%s: can't open file %s\n"), program_name, - list->name); - maybequit(); - } - else { - abfd->next = obfd->archive_head; - obfd->archive_head = abfd; - } - list = list->next; + { + while (list) + { + bfd *abfd = bfd_openr (list->name, NULL); + + if (!abfd) + { + fprintf (stderr, _("%s: can't open file %s\n"), + program_name, list->name); + maybequit (); + } + else + { + abfd->archive_next = obfd->archive_head; + obfd->archive_head = abfd; + } + list = list->next; + } } - } } - void -DEFUN_VOID(ar_clear) +ar_clear (void) { -if (obfd) - obfd->archive_head = 0; + if (obfd) + obfd->archive_head = 0; } void -DEFUN(ar_delete, (list), - struct list *list) +ar_delete (struct list *list) { - if (!obfd) { - fprintf(stderr, _("%s: no open output archive\n"), program_name); - maybequit(); - } + if (!obfd) + { + fprintf (stderr, _("%s: no open output archive\n"), program_name); + maybequit (); + } else - { - while (list) { - /* Find this name in the archive */ - bfd *member = obfd->archive_head; - bfd **prev = &(obfd->archive_head); - int found = 0; - while (member) { - if (FILENAME_CMP(member->filename, list->name) == 0) { - *prev = member->next; - found = 1; - } - else { - prev = &(member->next); + { + while (list) + { + /* Find this name in the archive. */ + bfd *member = obfd->archive_head; + bfd **prev = &(obfd->archive_head); + int found = 0; + + while (member) + { + if (FILENAME_CMP(member->filename, list->name) == 0) + { + *prev = member->archive_next; + found = 1; + } + else + prev = &(member->archive_next); + + member = member->archive_next; + } + + if (!found) + { + fprintf (stderr, _("%s: can't find module file %s\n"), + program_name, list->name); + maybequit (); + } + + list = list->next; } - member = member->next; - } - if (!found) { - fprintf(stderr,_("%s: can't find module file %s\n"), program_name, - list->name); - maybequit(); - } - list = list->next; } - } } - void -DEFUN_VOID(ar_save) +ar_save (void) { + if (!obfd) + { + fprintf (stderr, _("%s: no open output archive\n"), program_name); + maybequit (); + } + else + { + char *ofilename = xstrdup (bfd_get_filename (obfd)); - if (!obfd) { - fprintf(stderr, _("%s: no open output archive\n"), program_name); - maybequit(); - } - else { - char *ofilename = xstrdup (bfd_get_filename (obfd)); - bfd_close(obfd); - - rename (ofilename, real_name); - obfd = 0; - free(ofilename); - } -} + if (deterministic > 0) + obfd->flags |= BFD_DETERMINISTIC_OUTPUT; + bfd_close (obfd); + smart_rename (ofilename, real_name, 0); + obfd = 0; + free (ofilename); + } +} void -DEFUN(ar_replace, (list), - struct list *list) +ar_replace (struct list *list) { - if (!obfd) { - fprintf(stderr, _("%s: no open output archive\n"), program_name); - maybequit(); - } + if (!obfd) + { + fprintf (stderr, _("%s: no open output archive\n"), program_name); + maybequit (); + } else - { - while (list) { - /* Find this name in the archive */ - bfd *member = obfd->archive_head; - bfd **prev = &(obfd->archive_head); - int found = 0; - while (member) - { - if (FILENAME_CMP(member->filename, list->name) == 0) - { - /* Found the one to replace */ - bfd *abfd = bfd_openr(list->name, 0); - if (!abfd) - { - fprintf(stderr, _("%s: can't open file %s\n"), program_name, list->name); - maybequit(); - } - else { - *prev = abfd; - abfd->next = member->next; - found = 1; - } - } - else { - prev = &(member->next); - } - member = member->next; - } - if (!found) { - bfd *abfd = bfd_openr(list->name, 0); - fprintf(stderr,_("%s: can't find module file %s\n"), program_name, - list->name); - if (!abfd) - { - fprintf(stderr, _("%s: can't open file %s\n"), program_name, list->name); - maybequit(); - } - else + { + while (list) { - *prev = abfd; - } - } + /* Find this name in the archive. */ + bfd *member = obfd->archive_head; + bfd **prev = &(obfd->archive_head); + int found = 0; + + while (member) + { + if (FILENAME_CMP (member->filename, list->name) == 0) + { + /* Found the one to replace. */ + bfd *abfd = bfd_openr (list->name, 0); + + if (!abfd) + { + fprintf (stderr, _("%s: can't open file %s\n"), + program_name, list->name); + maybequit (); + } + else + { + *prev = abfd; + abfd->archive_next = member->archive_next; + found = 1; + } + } + else + { + prev = &(member->archive_next); + } + member = member->archive_next; + } + + if (!found) + { + bfd *abfd = bfd_openr (list->name, 0); - list = list->next; + fprintf (stderr,_("%s: can't find module file %s\n"), + program_name, list->name); + if (!abfd) + { + fprintf (stderr, _("%s: can't open file %s\n"), + program_name, list->name); + maybequit (); + } + else + *prev = abfd; + } + + list = list->next; + } } - } } -/* And I added this one */ +/* And I added this one. */ void -DEFUN_VOID(ar_list) +ar_list (void) { if (!obfd) - { - fprintf(stderr, _("%s: no open output archive\n"), program_name); - maybequit(); - } - else { - bfd *abfd; - outfile = stdout; - verbose =1 ; - printf(_("Current open archive is %s\n"), bfd_get_filename (obfd)); - for (abfd = obfd->archive_head; - abfd != (bfd *)NULL; - abfd = abfd->next) { - ar_directory_doer (abfd, (bfd *) NULL); + fprintf (stderr, _("%s: no open output archive\n"), program_name); + maybequit (); } - } -} + else + { + bfd *abfd; + outfile = stdout; + verbose =1 ; + printf (_("Current open archive is %s\n"), bfd_get_filename (obfd)); + + for (abfd = obfd->archive_head; + abfd != (bfd *)NULL; + abfd = abfd->archive_next) + ar_directory_doer (abfd, (bfd *) NULL); + } +} void -DEFUN_VOID(ar_end) +ar_end (void) { if (obfd) - { - fclose((FILE *)(obfd->iostream)); - unlink(bfd_get_filename (obfd)); - } + { + bfd_cache_close (obfd); + unlink (bfd_get_filename (obfd)); + } } + void -DEFUN(ar_extract,(list), - struct list *list) +ar_extract (struct list *list) { if (!obfd) - { - - fprintf(stderr, _("%s: no open archive\n"), program_name); - maybequit(); - } + { + fprintf (stderr, _("%s: no open archive\n"), program_name); + maybequit (); + } else - { - while (list) { - /* Find this name in the archive */ - bfd *member = obfd->archive_head; - int found = 0; - while (member && !found) - { - if (FILENAME_CMP(member->filename, list->name) == 0) + { + while (list) { - extract_file(member); - found = 1; - } - - member = member->next; - } - if (!found) { - bfd_openr(list->name, 0); - fprintf(stderr,_("%s: can't find module file %s\n"), program_name, - list->name); - - } - list = list->next; + /* Find this name in the archive. */ + bfd *member = obfd->archive_head; + int found = 0; + + while (member && !found) + { + if (FILENAME_CMP (member->filename, list->name) == 0) + { + extract_file (member); + found = 1; + } + + member = member->archive_next; + } + + if (!found) + { + bfd_openr (list->name, 0); + fprintf (stderr, _("%s: can't find module file %s\n"), + program_name, list->name); + } + + list = list->next; + } } - } }