vax decoding of indexed addressing mode
[deliverable/binutils-gdb.git] / binutils / arsup.c
index 7b01d377cc8caa88b0aa6adf061ca0f7edfdfe72..0836496180a36c7fad96d5e7a187407c1393c593 100644 (file)
@@ -1,12 +1,11 @@
 /* arsup.c - Archive support for MRI compatibility
 /* arsup.c - Archive support for MRI compatibility
-   Copyright 1992, 1994, 1995, 1996, 1997, 2000, 2002
-   Free Software Foundation, Inc.
+   Copyright (C) 1992-2019 Free Software Foundation, Inc.
 
    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
 
    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
+   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,
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -16,7 +15,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
 
    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.  */
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
 
 
 /* Contributed by Steve Chamberlain
 
 
 /* Contributed by Steve Chamberlain
    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 "bfd.h"
-#include "arsup.h"
 #include "libiberty.h"
 #include "libiberty.h"
-#include "bucomm.h"
 #include "filenames.h"
 #include "filenames.h"
+#include "bucomm.h"
+#include "arsup.h"
 
 static void map_over_list
 
 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 verbose;
+extern int deterministic;
+
+static bfd *obfd;
+static char *real_name;
+static FILE *outfile;
 
 static void
 
 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;
 
 {
   bfd *head;
 
@@ -50,10 +53,10 @@ map_over_list (arch, function, list)
     {
       bfd *next;
 
     {
       bfd *next;
 
-      head = arch->next;
+      head = arch->archive_next;
       while (head != NULL)
        {
       while (head != NULL)
        {
-         next = head->next;
+         next = head->archive_next;
          function (head, (bfd *) NULL);
          head = next;
        }
          function (head, (bfd *) NULL);
          head = next;
        }
@@ -69,15 +72,15 @@ map_over_list (arch, function, list)
         want to hack multiple references.  */
       for (ptr = list; ptr; ptr = ptr->next)
        {
         want to hack multiple references.  */
       for (ptr = list; ptr; ptr = ptr->next)
        {
-         boolean found = false;
+         bfd_boolean found = FALSE;
          bfd *prev = arch;
 
          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)
                {
            {
              if (head->filename != NULL
                  && FILENAME_CMP (ptr->name, head->filename) == 0)
                {
-                 found = true;
+                 found = TRUE;
                  function (head, prev);
                }
              prev = head;
                  function (head, prev);
                }
              prev = head;
@@ -89,21 +92,15 @@ map_over_list (arch, function, list)
 }
 
 
 }
 
 
-FILE *outfile;
 
 static void
 
 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, FALSE);
 }
 
 void
 }
 
 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;
 
 {
   bfd *arch;
 
@@ -130,7 +127,7 @@ ar_directory (ar_name, list, output)
 }
 
 void
 }
 
 void
-DEFUN_VOID(prompt)
+prompt (void)
 {
   extern int interactive;
 
 {
   extern int interactive;
 
@@ -142,28 +139,30 @@ DEFUN_VOID(prompt)
 }
 
 void
 }
 
 void
-maybequit ()
+maybequit (void)
 {
   if (! interactive)
     xexit (9);
 }
 
 
 {
   if (! interactive)
     xexit (9);
 }
 
 
-bfd *obfd;
-char *real_name;
-
 void
 void
-ar_open (name, t)
-  char *name;
-  int t;
+ar_open (char *name, int t)
 {
 {
-  char *tname = (char *) xmalloc (strlen (name) + 10);
+  char *tname;
   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).  */
   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);
+  if (asprintf (&tname, "%.*stmp-%s", (int) (bname - name), name, bname) == -1)
+    {
+      fprintf (stderr, _("%s: Can't allocate memory for temp name (%s)\n"),
+              program_name, strerror(errno));
+      maybequit ();
+      return;
+    }
+
   obfd = bfd_openw (tname, NULL);
 
   if (!obfd)
   obfd = bfd_openw (tname, NULL);
 
   if (!obfd)
@@ -192,7 +191,7 @@ ar_open (name, t)
              return;
            }
 
              return;
            }
 
-         if (bfd_check_format(ibfd, bfd_archive) != true)
+         if (!bfd_check_format(ibfd, bfd_archive))
            {
              fprintf (stderr,
                       _("%s: file %s is not an archive\n"),
            {
              fprintf (stderr,
                       _("%s: file %s is not an archive\n"),
@@ -207,7 +206,7 @@ ar_open (name, t)
          while (element)
            {
              *ptr = element;
          while (element)
            {
              *ptr = element;
-             ptr = &element->next;
+             ptr = &element->archive_next;
              element = bfd_openr_next_archived_file (ibfd, element);
            }
        }
              element = bfd_openr_next_archived_file (ibfd, element);
            }
        }
@@ -215,26 +214,23 @@ ar_open (name, t)
       bfd_set_format (obfd, bfd_archive);
 
       obfd->has_armap = 1;
       bfd_set_format (obfd, bfd_archive);
 
       obfd->has_armap = 1;
+      obfd->is_thin_archive = 0;
     }
 }
 
 static void
     }
 }
 
 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.  */
   if (prev != NULL)
 {
   /* Add this module to the output bfd.  */
   if (prev != NULL)
-    prev->next = abfd->next;
+    prev->archive_next = abfd->archive_next;
 
 
-  abfd->next = obfd->archive_head;
+  abfd->archive_next = obfd->archive_head;
   obfd->archive_head = abfd;
 }
 
 void
   obfd->archive_head = abfd;
 }
 
 void
-ar_addlib (name, list)
-     char *name;
-     struct list *list;
+ar_addlib (char *name, struct list *list)
 {
   if (obfd == NULL)
     {
 {
   if (obfd == NULL)
     {
@@ -249,13 +245,12 @@ ar_addlib (name, list)
       if (arch != NULL)
        map_over_list (arch, ar_addlib_doer, 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
     }
 }
 
 void
-ar_addmod (list)
-     struct list *list;
+ar_addmod (struct list *list)
 {
   if (!obfd)
     {
 {
   if (!obfd)
     {
@@ -266,8 +261,13 @@ ar_addmod (list)
     {
       while (list)
        {
     {
       while (list)
        {
-         bfd *abfd = bfd_openr (list->name, NULL);
+         bfd *abfd;
 
 
+#if BFD_SUPPORTS_PLUGINS         
+         abfd = bfd_openr (list->name, "plugin");
+#else
+         abfd = bfd_openr (list->name, NULL);
+#endif
          if (!abfd)
            {
              fprintf (stderr, _("%s: can't open file %s\n"),
          if (!abfd)
            {
              fprintf (stderr, _("%s: can't open file %s\n"),
@@ -276,7 +276,7 @@ ar_addmod (list)
            }
          else
            {
            }
          else
            {
-             abfd->next = obfd->archive_head;
+             abfd->archive_next = obfd->archive_head;
              obfd->archive_head = abfd;
            }
          list = list->next;
              obfd->archive_head = abfd;
            }
          list = list->next;
@@ -286,15 +286,14 @@ ar_addmod (list)
 
 
 void
 
 
 void
-ar_clear ()
+ar_clear (void)
 {
   if (obfd)
     obfd->archive_head = 0;
 }
 
 void
 {
   if (obfd)
     obfd->archive_head = 0;
 }
 
 void
-ar_delete (list)
-     struct list *list;
+ar_delete (struct list *list)
 {
   if (!obfd)
     {
 {
   if (!obfd)
     {
@@ -314,13 +313,13 @@ ar_delete (list)
            {
              if (FILENAME_CMP(member->filename, list->name) == 0)
                {
            {
              if (FILENAME_CMP(member->filename, list->name) == 0)
                {
-                 *prev = member->next;
+                 *prev = member->archive_next;
                  found = 1;
                }
              else
                  found = 1;
                }
              else
-               prev = &(member->next);
+               prev = &(member->archive_next);
 
 
-             member = member->next;
+             member = member->archive_next;
            }
 
          if (!found)
            }
 
          if (!found)
@@ -336,7 +335,7 @@ ar_delete (list)
 }
 
 void
 }
 
 void
-ar_save ()
+ar_save (void)
 {
   if (!obfd)
     {
 {
   if (!obfd)
     {
@@ -347,17 +346,19 @@ ar_save ()
     {
       char *ofilename = xstrdup (bfd_get_filename (obfd));
 
     {
       char *ofilename = xstrdup (bfd_get_filename (obfd));
 
+      if (deterministic > 0)
+        obfd->flags |= BFD_DETERMINISTIC_OUTPUT;
+
       bfd_close (obfd);
 
       bfd_close (obfd);
 
-      rename (ofilename, real_name);
+      smart_rename (ofilename, real_name, 0);
       obfd = 0;
       free (ofilename);
     }
 }
 
 void
       obfd = 0;
       free (ofilename);
     }
 }
 
 void
-ar_replace (list)
-     struct list *list;
+ar_replace (struct list *list)
 {
   if (!obfd)
     {
 {
   if (!obfd)
     {
@@ -378,7 +379,7 @@ ar_replace (list)
              if (FILENAME_CMP (member->filename, list->name) == 0)
                {
                  /* Found the one to replace.  */
              if (FILENAME_CMP (member->filename, list->name) == 0)
                {
                  /* Found the one to replace.  */
-                 bfd *abfd = bfd_openr (list->name, 0);
+                 bfd *abfd = bfd_openr (list->name, NULL);
 
                  if (!abfd)
                    {
 
                  if (!abfd)
                    {
@@ -389,20 +390,20 @@ ar_replace (list)
                  else
                    {
                      *prev = abfd;
                  else
                    {
                      *prev = abfd;
-                     abfd->next = member->next;
+                     abfd->archive_next = member->archive_next;
                      found = 1;
                    }
                }
              else
                {
                      found = 1;
                    }
                }
              else
                {
-                 prev = &(member->next);
+                 prev = &(member->archive_next);
                }
                }
-             member = member->next;
+             member = member->archive_next;
            }
 
          if (!found)
            {
            }
 
          if (!found)
            {
-             bfd *abfd = bfd_openr (list->name, 0);
+             bfd *abfd = bfd_openr (list->name, NULL);
 
              fprintf (stderr,_("%s: can't find module file %s\n"),
                       program_name, list->name);
 
              fprintf (stderr,_("%s: can't find module file %s\n"),
                       program_name, list->name);
@@ -423,7 +424,7 @@ ar_replace (list)
 
 /* And I added this one.  */
 void
 
 /* And I added this one.  */
 void
-ar_list ()
+ar_list (void)
 {
   if (!obfd)
     {
 {
   if (!obfd)
     {
@@ -440,24 +441,23 @@ ar_list ()
 
       for (abfd = obfd->archive_head;
           abfd != (bfd *)NULL;
 
       for (abfd = obfd->archive_head;
           abfd != (bfd *)NULL;
-          abfd = abfd->next)
+          abfd = abfd->archive_next)
        ar_directory_doer (abfd, (bfd *) NULL);
     }
 }
 
 void
        ar_directory_doer (abfd, (bfd *) NULL);
     }
 }
 
 void
-ar_end ()
+ar_end (void)
 {
   if (obfd)
     {
 {
   if (obfd)
     {
-      fclose ((FILE *)(obfd->iostream));
+      bfd_cache_close (obfd);
       unlink (bfd_get_filename (obfd));
     }
 }
 
 void
       unlink (bfd_get_filename (obfd));
     }
 }
 
 void
-ar_extract (list)
-     struct list *list;
+ar_extract (struct list *list)
 {
   if (!obfd)
     {
 {
   if (!obfd)
     {
@@ -480,12 +480,12 @@ ar_extract (list)
                  found = 1;
                }
 
                  found = 1;
                }
 
-             member = member->next;
+             member = member->archive_next;
            }
 
          if (!found)
            {
            }
 
          if (!found)
            {
-             bfd_openr (list->name, 0);
+             bfd_openr (list->name, NULL);
              fprintf (stderr, _("%s: can't find module file %s\n"),
                       program_name, list->name);
            }
              fprintf (stderr, _("%s: can't find module file %s\n"),
                       program_name, list->name);
            }
This page took 0.029145 seconds and 4 git commands to generate.