Back to index

cell-binutils  2.17cvs20070401
Functions | Variables
arsup.c File Reference
#include "bfd.h"
#include "arsup.h"
#include "libiberty.h"
#include "bucomm.h"
#include "filenames.h"

Go to the source code of this file.

Functions

static void map_over_list (bfd *, void(*function)(bfd *, bfd *), struct list *)
static void ar_directory_doer (bfd *, bfd *)
static void ar_addlib_doer (bfd *, bfd *)
static void ar_directory_doer (bfd *abfd, bfd *ignore ATTRIBUTE_UNUSED)
void ar_directory (char *ar_name, struct list *list, char *output)
void prompt (void)
void maybequit (void)
void ar_open (char *name, int t)
void ar_addlib (char *name, struct list *list)
void ar_addmod (struct list *list)
void ar_clear (void)
void ar_delete (struct list *list)
void ar_save (void)
void ar_replace (struct list *list)
void ar_list (void)
void ar_end (void)
void ar_extract (struct list *list)

Variables

int verbose
static bfdobfd
static char * real_name
static FILE * outfile

Function Documentation

void ar_addlib ( char *  name,
struct list list 
)

Definition at line 223 of file arsup.c.

{
  if (obfd == NULL)
    {
      fprintf (stderr, _("%s: no output archive specified yet\n"), program_name);
      maybequit ();
    }
  else
    {
      bfd *arch;

      arch = open_inarch (name, (char *) NULL);
      if (arch != NULL)
       map_over_list (arch, ar_addlib_doer, list);

      /* Don't close the bfd, since it will make the elements disappear.  */
    }
}

Here is the call graph for this function:

static void ar_addlib_doer ( bfd abfd,
bfd prev 
) [static]

Definition at line 212 of file arsup.c.

{
  /* Add this module to the output bfd.  */
  if (prev != NULL)
    prev->next = abfd->next;

  abfd->next = obfd->archive_head;
  obfd->archive_head = abfd;
}

Here is the caller graph for this function:

void ar_addmod ( struct list list)

Definition at line 243 of file arsup.c.

{
  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;
       }
    }
}

Here is the call graph for this function:

void ar_clear ( void  )

Definition at line 274 of file arsup.c.

{
  if (obfd)
    obfd->archive_head = 0;
}
void ar_delete ( struct list list)

Definition at line 281 of file arsup.c.

{
  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);

             member = member->next;
           }

         if (!found)
           {
             fprintf (stderr, _("%s: can't find module file %s\n"),
                     program_name, list->name);
             maybequit ();
           }

         list = list->next;
       }
    }
}

Here is the call graph for this function:

void ar_directory ( char *  ar_name,
struct list list,
char *  output 
)

Definition at line 101 of file arsup.c.

{
  bfd *arch;

  arch = open_inarch (ar_name, (char *) NULL);
  if (output)
    {
      outfile = fopen(output,"w");
      if (outfile == 0)
       {
         outfile = stdout;
         fprintf (stderr,_("Can't open file %s\n"), output);
         output = 0;
       }
    }
  else
    outfile = stdout;

  map_over_list (arch, ar_directory_doer, list);

  bfd_close (arch);

  if (output)
   fclose (outfile);
}

Here is the call graph for this function:

static void ar_directory_doer ( bfd ,
bfd  
) [static]

Here is the caller graph for this function:

static void ar_directory_doer ( bfd abfd,
bfd *ignore  ATTRIBUTE_UNUSED 
) [static]

Definition at line 95 of file arsup.c.

Here is the call graph for this function:

void ar_end ( void  )

Definition at line 432 of file arsup.c.

{
  if (obfd)
    {
      bfd_cache_close (obfd);
      unlink (bfd_get_filename (obfd));
    }
}

Here is the call graph for this function:

void ar_extract ( struct list list)

Definition at line 442 of file arsup.c.

{
  if (!obfd)
    {
      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)
              {
                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;
       }
    }
}

Here is the call graph for this function:

void ar_list ( void  )

Definition at line 409 of file arsup.c.

{
  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);
    }
}

Here is the call graph for this function:

void ar_open ( char *  name,
int  t 
)

Definition at line 148 of file arsup.c.

{
  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))
           {
             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);
           }
       }

      bfd_set_format (obfd, bfd_archive);

      obfd->has_armap = 1;
    }
}

Here is the call graph for this function:

void ar_replace ( struct list list)

Definition at line 343 of file arsup.c.

{
  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
              *prev = abfd;
           }

         list = list->next;
       }
    }
}

Here is the call graph for this function:

void ar_save ( void  )

Definition at line 323 of file arsup.c.

{
  if (!obfd)
    {
      fprintf (stderr, _("%s: no open output archive\n"), program_name);
      maybequit ();
    }
  else
    {
      char *ofilename = xstrdup (bfd_get_filename (obfd));

      bfd_close (obfd);

      smart_rename (ofilename, real_name, 0);
      obfd = 0;
      free (ofilename);
    }
}

Here is the call graph for this function:

static void map_over_list ( bfd arch,
void(*)(bfd *, bfd *)  function,
struct list list 
) [static]

Definition at line 46 of file arsup.c.

{
  bfd *head;

  if (list == NULL)
    {
      bfd *next;

      head = arch->next;
      while (head != NULL)
       {
         next = head->next;
         function (head, (bfd *) NULL);
         head = next;
       }
    }
  else
    {
      struct list *ptr;

      /* This may appear to be a baroque way of accomplishing what we
        want.  however we have to iterate over the filenames in order
        to notice where a filename is requested but does not exist in
        the archive.  Ditto mapping over each file each time -- we
        want to hack multiple references.  */
      for (ptr = list; ptr; ptr = ptr->next)
       {
         bfd_boolean found = FALSE;
         bfd *prev = arch;

         for (head = arch->next; head; head = head->next)
           {
             if (head->filename != NULL
                && FILENAME_CMP (ptr->name, head->filename) == 0)
              {
                found = TRUE;
                function (head, prev);
              }
             prev = head;
           }
         if (! found)
           fprintf (stderr, _("No entry %s in archive.\n"), ptr->name);
       }
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:

void maybequit ( void  )

Definition at line 140 of file arsup.c.

{
  if (! interactive)
    xexit (9);
}

Here is the call graph for this function:

Here is the caller graph for this function:

void prompt ( void  )

Definition at line 128 of file arsup.c.

{
  extern int interactive;

  if (interactive)
    {
      printf ("AR >");
      fflush (stdout);
    }
}

Here is the call graph for this function:


Variable Documentation

bfd* obfd [static]

Definition at line 41 of file arsup.c.

FILE* outfile [static]

Definition at line 43 of file arsup.c.

char* real_name [static]

Definition at line 42 of file arsup.c.

Definition at line 88 of file ar.c.