gdb/
[deliverable/binutils-gdb.git] / binutils / binemul.c
index 35587db26bebdcf368c40c1e60c111d095685c3d..6bfcb15a85997f2aa014176e5b04ac8e5e370a93 100644 (file)
@@ -1,5 +1,6 @@
 /* Binutils emulation layer.
 /* Binutils emulation layer.
-   Copyright 2002, 2003, 2005, 2007, 2008 Free Software Foundation, Inc.
+   Copyright 2002, 2003, 2005, 2007, 2008, 2010
+   Free Software Foundation, Inc.
    Written by Tom Rix, Red Hat Inc.
 
    This file is part of GNU Binutils.
    Written by Tom Rix, Red Hat Inc.
 
    This file is part of GNU Binutils.
@@ -50,9 +51,16 @@ ar_emul_append (bfd **after_bfd, char *file_name, const char *target,
 }
 
 static bfd_boolean
 }
 
 static bfd_boolean
-do_ar_emul_default_append (bfd **after_bfd, bfd *new_bfd,
-                          bfd_boolean verbose, bfd_boolean flatten)
-  {
+any_ok (bfd *new_bfd ATTRIBUTE_UNUSED)
+{
+  return TRUE;
+}
+
+bfd_boolean
+do_ar_emul_append (bfd **after_bfd, bfd *new_bfd,
+                  bfd_boolean verbose, bfd_boolean flatten,
+                  bfd_boolean (*check) (bfd *))
+{
   /* When flattening, add the members of an archive instead of the
      archive itself.  */
   if (flatten && bfd_check_format (new_bfd, bfd_archive))
   /* When flattening, add the members of an archive instead of the
      archive itself.  */
   if (flatten && bfd_check_format (new_bfd, bfd_archive))
@@ -64,7 +72,7 @@ do_ar_emul_default_append (bfd **after_bfd, bfd *new_bfd,
            elt;
            elt = bfd_openr_next_archived_file (new_bfd, elt))
         {
            elt;
            elt = bfd_openr_next_archived_file (new_bfd, elt))
         {
-          if (do_ar_emul_default_append (after_bfd, elt, verbose, TRUE))
+          if (do_ar_emul_append (after_bfd, elt, verbose, TRUE, check))
             {
               added = TRUE;
               after_bfd = &((*after_bfd)->archive_next);
             {
               added = TRUE;
               after_bfd = &((*after_bfd)->archive_next);
@@ -74,6 +82,9 @@ do_ar_emul_default_append (bfd **after_bfd, bfd *new_bfd,
       return added;
     }
 
       return added;
     }
 
+  if (!check (new_bfd))
+    return FALSE;
+
   AR_EMUL_APPEND_PRINT_VERBOSE (verbose, new_bfd->filename);
 
   new_bfd->archive_next = *after_bfd;
   AR_EMUL_APPEND_PRINT_VERBOSE (verbose, new_bfd->filename);
 
   new_bfd->archive_next = *after_bfd;
@@ -91,7 +102,7 @@ ar_emul_default_append (bfd **after_bfd, char *file_name,
 
   new_bfd = bfd_openr (file_name, target);
   AR_EMUL_ELEMENT_CHECK (new_bfd, file_name);
 
   new_bfd = bfd_openr (file_name, target);
   AR_EMUL_ELEMENT_CHECK (new_bfd, file_name);
-  return do_ar_emul_default_append (after_bfd, new_bfd, verbose, flatten);
+  return do_ar_emul_append (after_bfd, new_bfd, verbose, flatten, any_ok);
 }
 
 bfd_boolean
 }
 
 bfd_boolean
@@ -109,15 +120,15 @@ bfd_boolean
 ar_emul_default_replace (bfd **after_bfd, char *file_name,
                         const char *target, bfd_boolean verbose)
 {
 ar_emul_default_replace (bfd **after_bfd, char *file_name,
                         const char *target, bfd_boolean verbose)
 {
-  bfd *temp;
+  bfd *new_bfd;
 
 
-  temp = *after_bfd;
-  *after_bfd = bfd_openr (file_name, target);
+  new_bfd = bfd_openr (file_name, target);
+  AR_EMUL_ELEMENT_CHECK (new_bfd, file_name);
 
 
-  AR_EMUL_ELEMENT_CHECK (*after_bfd, file_name);
   AR_EMUL_REPLACE_PRINT_VERBOSE (verbose, file_name);
 
   AR_EMUL_REPLACE_PRINT_VERBOSE (verbose, file_name);
 
-  (*after_bfd)->archive_next = temp;
+  new_bfd->archive_next = *after_bfd;
+  *after_bfd = new_bfd;
 
   return TRUE;
 }
 
   return TRUE;
 }
This page took 0.025791 seconds and 4 git commands to generate.