1 /* Binutils emulation layer. 2 Copyright (C) 2002-2014 Free Software Foundation, Inc. 3 Written by Tom Rix, Red Hat Inc. 4 5 This file is part of GNU Binutils. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 20 MA 02110-1301, USA. */ 21 22 #include "binemul.h" 23 24 extern bin_emulation_xfer_type bin_dummy_emulation; 25 26 void 27 ar_emul_usage (FILE *fp) 28 { 29 if (bin_dummy_emulation.ar_usage) 30 bin_dummy_emulation.ar_usage (fp); 31 } 32 33 void 34 ar_emul_default_usage (FILE *fp) 35 { 36 AR_EMUL_USAGE_PRINT_OPTION_HEADER (fp); 37 /* xgettext:c-format */ 38 fprintf (fp, _(" No emulation specific options\n")); 39 } 40 41 bfd_boolean 42 ar_emul_append (bfd **after_bfd, char *file_name, const char *target, 43 bfd_boolean verbose, bfd_boolean flatten) 44 { 45 if (bin_dummy_emulation.ar_append) 46 return bin_dummy_emulation.ar_append (after_bfd, file_name, target, 47 verbose, flatten); 48 49 return FALSE; 50 } 51 52 static bfd_boolean 53 any_ok (bfd *new_bfd ATTRIBUTE_UNUSED) 54 { 55 return TRUE; 56 } 57 58 bfd_boolean 59 do_ar_emul_append (bfd **after_bfd, bfd *new_bfd, 60 bfd_boolean verbose, bfd_boolean flatten, 61 bfd_boolean (*check) (bfd *)) 62 { 63 /* When flattening, add the members of an archive instead of the 64 archive itself. */ 65 if (flatten && bfd_check_format (new_bfd, bfd_archive)) 66 { 67 bfd *elt; 68 bfd_boolean added = FALSE; 69 70 for (elt = bfd_openr_next_archived_file (new_bfd, NULL); 71 elt; 72 elt = bfd_openr_next_archived_file (new_bfd, elt)) 73 { 74 if (do_ar_emul_append (after_bfd, elt, verbose, TRUE, check)) 75 { 76 added = TRUE; 77 after_bfd = &((*after_bfd)->archive_next); 78 } 79 } 80 81 return added; 82 } 83 84 if (!check (new_bfd)) 85 return FALSE; 86 87 AR_EMUL_APPEND_PRINT_VERBOSE (verbose, new_bfd->filename); 88 89 new_bfd->archive_next = *after_bfd; 90 *after_bfd = new_bfd; 91 92 return TRUE; 93 } 94 95 bfd_boolean 96 ar_emul_default_append (bfd **after_bfd, char *file_name, 97 const char *target, bfd_boolean verbose, 98 bfd_boolean flatten) 99 { 100 bfd *new_bfd; 101 102 new_bfd = bfd_openr (file_name, target); 103 AR_EMUL_ELEMENT_CHECK (new_bfd, file_name); 104 return do_ar_emul_append (after_bfd, new_bfd, verbose, flatten, any_ok); 105 } 106 107 bfd_boolean 108 ar_emul_replace (bfd **after_bfd, char *file_name, const char *target, 109 bfd_boolean verbose) 110 { 111 if (bin_dummy_emulation.ar_replace) 112 return bin_dummy_emulation.ar_replace (after_bfd, file_name, 113 target, verbose); 114 115 return FALSE; 116 } 117 118 bfd_boolean 119 ar_emul_default_replace (bfd **after_bfd, char *file_name, 120 const char *target, bfd_boolean verbose) 121 { 122 bfd *new_bfd; 123 124 new_bfd = bfd_openr (file_name, target); 125 AR_EMUL_ELEMENT_CHECK (new_bfd, file_name); 126 127 AR_EMUL_REPLACE_PRINT_VERBOSE (verbose, file_name); 128 129 new_bfd->archive_next = *after_bfd; 130 *after_bfd = new_bfd; 131 132 return TRUE; 133 } 134 135 bfd_boolean 136 ar_emul_parse_arg (char *arg) 137 { 138 if (bin_dummy_emulation.ar_parse_arg) 139 return bin_dummy_emulation.ar_parse_arg (arg); 140 141 return FALSE; 142 } 143 144 bfd_boolean 145 ar_emul_default_parse_arg (char *arg ATTRIBUTE_UNUSED) 146 { 147 return FALSE; 148 } 149