OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [binutils-2.20.1/] [binutils-2.20.1-or32-1.0rc1/] [binutils/] [arsup.c] - Diff between revs 205 and 521

Only display areas with differences | Details | Blame | View Log

Rev 205 Rev 521
/* arsup.c - Archive support for MRI compatibility
/* arsup.c - Archive support for MRI compatibility
   Copyright 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003,
   Copyright 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003,
   2004, 2005, 2007, 2008 Free Software Foundation, Inc.
   2004, 2005, 2007, 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
   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
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.
   (at your option) any later version.
 
 
   This program is distributed in the hope that it will be useful,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   You should have received a copy of the GNU General Public License
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   along with this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */
   MA 02110-1301, USA.  */
 
 
 
 
/* Contributed by Steve Chamberlain
/* Contributed by Steve Chamberlain
   sac@cygnus.com
   sac@cygnus.com
 
 
   This file looks after requests from arparse.y, to provide the MRI
   This file looks after requests from arparse.y, to provide the MRI
   style librarian command syntax + 1 word LIST.  */
   style librarian command syntax + 1 word LIST.  */
 
 
#include "sysdep.h"
#include "sysdep.h"
#include "bfd.h"
#include "bfd.h"
#include "libiberty.h"
#include "libiberty.h"
#include "filenames.h"
#include "filenames.h"
#include "bucomm.h"
#include "bucomm.h"
#include "arsup.h"
#include "arsup.h"
 
 
static void map_over_list
static void map_over_list
  (bfd *, void (*function) (bfd *, bfd *), struct list *);
  (bfd *, void (*function) (bfd *, bfd *), struct list *);
static void ar_directory_doer (bfd *, bfd *);
static void ar_directory_doer (bfd *, bfd *);
static void ar_addlib_doer (bfd *, bfd *);
static void ar_addlib_doer (bfd *, bfd *);
 
 
extern int verbose;
extern int verbose;
 
 
static bfd *obfd;
static bfd *obfd;
static char *real_name;
static char *real_name;
static FILE *outfile;
static FILE *outfile;
 
 
static void
static void
map_over_list (bfd *arch, void (*function) (bfd *, bfd *), struct list *list)
map_over_list (bfd *arch, void (*function) (bfd *, bfd *), struct list *list)
{
{
  bfd *head;
  bfd *head;
 
 
  if (list == NULL)
  if (list == NULL)
    {
    {
      bfd *next;
      bfd *next;
 
 
      head = arch->archive_next;
      head = arch->archive_next;
      while (head != NULL)
      while (head != NULL)
        {
        {
          next = head->archive_next;
          next = head->archive_next;
          function (head, (bfd *) NULL);
          function (head, (bfd *) NULL);
          head = next;
          head = next;
        }
        }
    }
    }
  else
  else
    {
    {
      struct list *ptr;
      struct list *ptr;
 
 
      /* This may appear to be a baroque way of accomplishing what we
      /* This may appear to be a baroque way of accomplishing what we
         want.  however we have to iterate over the filenames in order
         want.  however we have to iterate over the filenames in order
         to notice where a filename is requested but does not exist in
         to notice where a filename is requested but does not exist in
         the archive.  Ditto mapping over each file each time -- we
         the archive.  Ditto mapping over each file each time -- we
         want to hack multiple references.  */
         want to hack multiple references.  */
      for (ptr = list; ptr; ptr = ptr->next)
      for (ptr = list; ptr; ptr = ptr->next)
        {
        {
          bfd_boolean found = FALSE;
          bfd_boolean found = FALSE;
          bfd *prev = arch;
          bfd *prev = arch;
 
 
          for (head = arch->archive_next; head; head = head->archive_next)
          for (head = arch->archive_next; head; head = head->archive_next)
            {
            {
              if (head->filename != NULL
              if (head->filename != NULL
                  && FILENAME_CMP (ptr->name, head->filename) == 0)
                  && FILENAME_CMP (ptr->name, head->filename) == 0)
                {
                {
                  found = TRUE;
                  found = TRUE;
                  function (head, prev);
                  function (head, prev);
                }
                }
              prev = head;
              prev = head;
            }
            }
          if (! found)
          if (! found)
            fprintf (stderr, _("No entry %s in archive.\n"), ptr->name);
            fprintf (stderr, _("No entry %s in archive.\n"), ptr->name);
        }
        }
    }
    }
}
}
 
 
 
 
 
 
static void
static void
ar_directory_doer (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
void
ar_directory (char *ar_name, struct list *list, char *output)
ar_directory (char *ar_name, struct list *list, char *output)
{
{
  bfd *arch;
  bfd *arch;
 
 
  arch = open_inarch (ar_name, (char *) NULL);
  arch = open_inarch (ar_name, (char *) NULL);
  if (output)
  if (output)
    {
    {
      outfile = fopen(output,"w");
      outfile = fopen(output,"w");
      if (outfile == 0)
      if (outfile == 0)
        {
        {
          outfile = stdout;
          outfile = stdout;
          fprintf (stderr,_("Can't open file %s\n"), output);
          fprintf (stderr,_("Can't open file %s\n"), output);
          output = 0;
          output = 0;
        }
        }
    }
    }
  else
  else
    outfile = stdout;
    outfile = stdout;
 
 
  map_over_list (arch, ar_directory_doer, list);
  map_over_list (arch, ar_directory_doer, list);
 
 
  bfd_close (arch);
  bfd_close (arch);
 
 
  if (output)
  if (output)
   fclose (outfile);
   fclose (outfile);
}
}
 
 
void
void
prompt (void)
prompt (void)
{
{
  extern int interactive;
  extern int interactive;
 
 
  if (interactive)
  if (interactive)
    {
    {
      printf ("AR >");
      printf ("AR >");
      fflush (stdout);
      fflush (stdout);
    }
    }
}
}
 
 
void
void
maybequit (void)
maybequit (void)
{
{
  if (! interactive)
  if (! interactive)
    xexit (9);
    xexit (9);
}
}
 
 
 
 
void
void
ar_open (char *name, int t)
ar_open (char *name, int t)
{
{
  char *tname = (char *) xmalloc (strlen (name) + 10);
  char *tname = (char *) xmalloc (strlen (name) + 10);
  const char *bname = lbasename (name);
  const char *bname = lbasename (name);
  real_name = name;
  real_name = name;
 
 
  /* Prepend tmp- to the beginning, to avoid file-name clashes after
  /* Prepend tmp- to the beginning, to avoid file-name clashes after
     truncation on filesystems with limited namespaces (DOS).  */
     truncation on filesystems with limited namespaces (DOS).  */
  sprintf (tname, "%.*stmp-%s", (int) (bname - name), name, bname);
  sprintf (tname, "%.*stmp-%s", (int) (bname - name), name, bname);
  obfd = bfd_openw (tname, NULL);
  obfd = bfd_openw (tname, NULL);
 
 
  if (!obfd)
  if (!obfd)
    {
    {
      fprintf (stderr,
      fprintf (stderr,
               _("%s: Can't open output archive %s\n"),
               _("%s: Can't open output archive %s\n"),
               program_name,  tname);
               program_name,  tname);
 
 
      maybequit ();
      maybequit ();
    }
    }
  else
  else
    {
    {
      if (!t)
      if (!t)
        {
        {
          bfd **ptr;
          bfd **ptr;
          bfd *element;
          bfd *element;
          bfd *ibfd;
          bfd *ibfd;
 
 
          ibfd = bfd_openr (name, NULL);
          ibfd = bfd_openr (name, NULL);
 
 
          if (!ibfd)
          if (!ibfd)
            {
            {
              fprintf (stderr,_("%s: Can't open input archive %s\n"),
              fprintf (stderr,_("%s: Can't open input archive %s\n"),
                       program_name, name);
                       program_name, name);
              maybequit ();
              maybequit ();
              return;
              return;
            }
            }
 
 
          if (!bfd_check_format(ibfd, bfd_archive))
          if (!bfd_check_format(ibfd, bfd_archive))
            {
            {
              fprintf (stderr,
              fprintf (stderr,
                       _("%s: file %s is not an archive\n"),
                       _("%s: file %s is not an archive\n"),
                       program_name, name);
                       program_name, name);
              maybequit ();
              maybequit ();
              return;
              return;
            }
            }
 
 
          ptr = &(obfd->archive_head);
          ptr = &(obfd->archive_head);
          element = bfd_openr_next_archived_file (ibfd, NULL);
          element = bfd_openr_next_archived_file (ibfd, NULL);
 
 
          while (element)
          while (element)
            {
            {
              *ptr = element;
              *ptr = element;
              ptr = &element->archive_next;
              ptr = &element->archive_next;
              element = bfd_openr_next_archived_file (ibfd, element);
              element = bfd_openr_next_archived_file (ibfd, element);
            }
            }
        }
        }
 
 
      bfd_set_format (obfd, bfd_archive);
      bfd_set_format (obfd, bfd_archive);
 
 
      obfd->has_armap = 1;
      obfd->has_armap = 1;
      obfd->is_thin_archive = 0;
      obfd->is_thin_archive = 0;
    }
    }
}
}
 
 
static void
static void
ar_addlib_doer (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)
  if (prev != NULL)
    prev->archive_next = abfd->archive_next;
    prev->archive_next = abfd->archive_next;
 
 
  abfd->archive_next = obfd->archive_head;
  abfd->archive_next = obfd->archive_head;
  obfd->archive_head = abfd;
  obfd->archive_head = abfd;
}
}
 
 
void
void
ar_addlib (char *name, struct list *list)
ar_addlib (char *name, struct list *list)
{
{
  if (obfd == NULL)
  if (obfd == NULL)
    {
    {
      fprintf (stderr, _("%s: no output archive specified yet\n"), program_name);
      fprintf (stderr, _("%s: no output archive specified yet\n"), program_name);
      maybequit ();
      maybequit ();
    }
    }
  else
  else
    {
    {
      bfd *arch;
      bfd *arch;
 
 
      arch = open_inarch (name, (char *) NULL);
      arch = open_inarch (name, (char *) NULL);
      if (arch != NULL)
      if (arch != NULL)
        map_over_list (arch, ar_addlib_doer, list);
        map_over_list (arch, ar_addlib_doer, list);
 
 
      /* Don't close the bfd, since it will make the elements disappear.  */
      /* Don't close the bfd, since it will make the elements disappear.  */
    }
    }
}
}
 
 
void
void
ar_addmod (struct list *list)
ar_addmod (struct list *list)
{
{
  if (!obfd)
  if (!obfd)
    {
    {
      fprintf (stderr, _("%s: no open output archive\n"), program_name);
      fprintf (stderr, _("%s: no open output archive\n"), program_name);
      maybequit ();
      maybequit ();
    }
    }
  else
  else
    {
    {
      while (list)
      while (list)
        {
        {
          bfd *abfd = bfd_openr (list->name, NULL);
          bfd *abfd = bfd_openr (list->name, NULL);
 
 
          if (!abfd)
          if (!abfd)
            {
            {
              fprintf (stderr, _("%s: can't open file %s\n"),
              fprintf (stderr, _("%s: can't open file %s\n"),
                       program_name, list->name);
                       program_name, list->name);
              maybequit ();
              maybequit ();
            }
            }
          else
          else
            {
            {
              abfd->archive_next = obfd->archive_head;
              abfd->archive_next = obfd->archive_head;
              obfd->archive_head = abfd;
              obfd->archive_head = abfd;
            }
            }
          list = list->next;
          list = list->next;
        }
        }
    }
    }
}
}
 
 
 
 
void
void
ar_clear (void)
ar_clear (void)
{
{
  if (obfd)
  if (obfd)
    obfd->archive_head = 0;
    obfd->archive_head = 0;
}
}
 
 
void
void
ar_delete (struct list *list)
ar_delete (struct list *list)
{
{
  if (!obfd)
  if (!obfd)
    {
    {
      fprintf (stderr, _("%s: no open output archive\n"), program_name);
      fprintf (stderr, _("%s: no open output archive\n"), program_name);
      maybequit ();
      maybequit ();
    }
    }
  else
  else
    {
    {
      while (list)
      while (list)
        {
        {
          /* Find this name in the archive.  */
          /* Find this name in the archive.  */
          bfd *member = obfd->archive_head;
          bfd *member = obfd->archive_head;
          bfd **prev = &(obfd->archive_head);
          bfd **prev = &(obfd->archive_head);
          int found = 0;
          int found = 0;
 
 
          while (member)
          while (member)
            {
            {
              if (FILENAME_CMP(member->filename, list->name) == 0)
              if (FILENAME_CMP(member->filename, list->name) == 0)
                {
                {
                  *prev = member->archive_next;
                  *prev = member->archive_next;
                  found = 1;
                  found = 1;
                }
                }
              else
              else
                prev = &(member->archive_next);
                prev = &(member->archive_next);
 
 
              member = member->archive_next;
              member = member->archive_next;
            }
            }
 
 
          if (!found)
          if (!found)
            {
            {
              fprintf (stderr, _("%s: can't find module file %s\n"),
              fprintf (stderr, _("%s: can't find module file %s\n"),
                       program_name, list->name);
                       program_name, list->name);
              maybequit ();
              maybequit ();
            }
            }
 
 
          list = list->next;
          list = list->next;
        }
        }
    }
    }
}
}
 
 
void
void
ar_save (void)
ar_save (void)
{
{
  if (!obfd)
  if (!obfd)
    {
    {
      fprintf (stderr, _("%s: no open output archive\n"), program_name);
      fprintf (stderr, _("%s: no open output archive\n"), program_name);
      maybequit ();
      maybequit ();
    }
    }
  else
  else
    {
    {
      char *ofilename = xstrdup (bfd_get_filename (obfd));
      char *ofilename = xstrdup (bfd_get_filename (obfd));
 
 
      bfd_close (obfd);
      bfd_close (obfd);
 
 
      smart_rename (ofilename, real_name, 0);
      smart_rename (ofilename, real_name, 0);
      obfd = 0;
      obfd = 0;
      free (ofilename);
      free (ofilename);
    }
    }
}
}
 
 
void
void
ar_replace (struct list *list)
ar_replace (struct list *list)
{
{
  if (!obfd)
  if (!obfd)
    {
    {
      fprintf (stderr, _("%s: no open output archive\n"), program_name);
      fprintf (stderr, _("%s: no open output archive\n"), program_name);
      maybequit ();
      maybequit ();
    }
    }
  else
  else
    {
    {
      while (list)
      while (list)
        {
        {
          /* Find this name in the archive.  */
          /* Find this name in the archive.  */
          bfd *member = obfd->archive_head;
          bfd *member = obfd->archive_head;
          bfd **prev = &(obfd->archive_head);
          bfd **prev = &(obfd->archive_head);
          int found = 0;
          int found = 0;
 
 
          while (member)
          while (member)
            {
            {
              if (FILENAME_CMP (member->filename, list->name) == 0)
              if (FILENAME_CMP (member->filename, list->name) == 0)
                {
                {
                  /* Found the one to replace.  */
                  /* Found the one to replace.  */
                  bfd *abfd = bfd_openr (list->name, 0);
                  bfd *abfd = bfd_openr (list->name, 0);
 
 
                  if (!abfd)
                  if (!abfd)
                    {
                    {
                      fprintf (stderr, _("%s: can't open file %s\n"),
                      fprintf (stderr, _("%s: can't open file %s\n"),
                               program_name, list->name);
                               program_name, list->name);
                      maybequit ();
                      maybequit ();
                    }
                    }
                  else
                  else
                    {
                    {
                      *prev = abfd;
                      *prev = abfd;
                      abfd->archive_next = member->archive_next;
                      abfd->archive_next = member->archive_next;
                      found = 1;
                      found = 1;
                    }
                    }
                }
                }
              else
              else
                {
                {
                  prev = &(member->archive_next);
                  prev = &(member->archive_next);
                }
                }
              member = member->archive_next;
              member = member->archive_next;
            }
            }
 
 
          if (!found)
          if (!found)
            {
            {
              bfd *abfd = bfd_openr (list->name, 0);
              bfd *abfd = bfd_openr (list->name, 0);
 
 
              fprintf (stderr,_("%s: can't find module file %s\n"),
              fprintf (stderr,_("%s: can't find module file %s\n"),
                       program_name, list->name);
                       program_name, list->name);
              if (!abfd)
              if (!abfd)
                {
                {
                  fprintf (stderr, _("%s: can't open file %s\n"),
                  fprintf (stderr, _("%s: can't open file %s\n"),
                           program_name, list->name);
                           program_name, list->name);
                  maybequit ();
                  maybequit ();
                }
                }
              else
              else
                *prev = abfd;
                *prev = abfd;
            }
            }
 
 
          list = list->next;
          list = list->next;
        }
        }
    }
    }
}
}
 
 
/* And I added this one.  */
/* And I added this one.  */
void
void
ar_list (void)
ar_list (void)
{
{
  if (!obfd)
  if (!obfd)
    {
    {
      fprintf (stderr, _("%s: no open output archive\n"), program_name);
      fprintf (stderr, _("%s: no open output archive\n"), program_name);
      maybequit ();
      maybequit ();
    }
    }
  else
  else
    {
    {
      bfd *abfd;
      bfd *abfd;
 
 
      outfile = stdout;
      outfile = stdout;
      verbose =1 ;
      verbose =1 ;
      printf (_("Current open archive is %s\n"), bfd_get_filename (obfd));
      printf (_("Current open archive is %s\n"), bfd_get_filename (obfd));
 
 
      for (abfd = obfd->archive_head;
      for (abfd = obfd->archive_head;
           abfd != (bfd *)NULL;
           abfd != (bfd *)NULL;
           abfd = abfd->archive_next)
           abfd = abfd->archive_next)
        ar_directory_doer (abfd, (bfd *) NULL);
        ar_directory_doer (abfd, (bfd *) NULL);
    }
    }
}
}
 
 
void
void
ar_end (void)
ar_end (void)
{
{
  if (obfd)
  if (obfd)
    {
    {
      bfd_cache_close (obfd);
      bfd_cache_close (obfd);
      unlink (bfd_get_filename (obfd));
      unlink (bfd_get_filename (obfd));
    }
    }
}
}
 
 
void
void
ar_extract (struct list *list)
ar_extract (struct list *list)
{
{
  if (!obfd)
  if (!obfd)
    {
    {
      fprintf (stderr, _("%s: no open archive\n"), program_name);
      fprintf (stderr, _("%s: no open archive\n"), program_name);
      maybequit ();
      maybequit ();
    }
    }
  else
  else
    {
    {
      while (list)
      while (list)
        {
        {
          /* Find this name in the archive.  */
          /* Find this name in the archive.  */
          bfd *member = obfd->archive_head;
          bfd *member = obfd->archive_head;
          int found = 0;
          int found = 0;
 
 
          while (member && !found)
          while (member && !found)
            {
            {
              if (FILENAME_CMP (member->filename, list->name) == 0)
              if (FILENAME_CMP (member->filename, list->name) == 0)
                {
                {
                  extract_file (member);
                  extract_file (member);
                  found = 1;
                  found = 1;
                }
                }
 
 
              member = member->archive_next;
              member = member->archive_next;
            }
            }
 
 
          if (!found)
          if (!found)
            {
            {
              bfd_openr (list->name, 0);
              bfd_openr (list->name, 0);
              fprintf (stderr, _("%s: can't find module file %s\n"),
              fprintf (stderr, _("%s: can't find module file %s\n"),
                       program_name, list->name);
                       program_name, list->name);
            }
            }
 
 
          list = list->next;
          list = list->next;
        }
        }
    }
    }
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.