/* ar.c - Archive modify and extract.
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- 2001, 2002
+ 2001, 2002, 2003
Free Software Foundation, Inc.
This file is part of GNU Binutils.
should have long options too. GNU ar used to check file against filesystem
in quick_update and replace operations (would check mtime). Doesn't warn
when name truncated. No way to specify pos_end. Error messages should be
- more consistant. */
+ more consistent. */
#include "bfd.h"
#include "libiberty.h"
/* Kludge declaration from BFD! This is ugly! FIXME! XXX */
struct ar_hdr *
- bfd_special_undocumented_glue PARAMS ((bfd * abfd, const char *filename));
+ bfd_special_undocumented_glue (bfd * abfd, const char *filename);
/* Static declarations */
-static void
-mri_emul PARAMS ((void));
-
-static const char *
-normalize PARAMS ((const char *, bfd *));
-
-static void
-remove_output PARAMS ((void));
-
-static void
-map_over_members PARAMS ((bfd *, void (*)(bfd *), char **, int));
-
-static void
-print_contents PARAMS ((bfd * member));
-
-static void
-delete_members PARAMS ((bfd *, char **files_to_delete));
+static void mri_emul (void);
+static const char *normalize (const char *, bfd *);
+static void remove_output (void);
+static void map_over_members (bfd *, void (*)(bfd *), char **, int);
+static void print_contents (bfd * member);
+static void delete_members (bfd *, char **files_to_delete);
#if 0
-static void
-do_quick_append PARAMS ((const char *archive_filename,
- char **files_to_append));
+static void do_quick_append
+ (const char *archive_filename, char **files_to_append);
#endif
-static void
-move_members PARAMS ((bfd *, char **files_to_move));
-
-static void
-replace_members PARAMS ((bfd *, char **files_to_replace, boolean quick));
-
-static void
-print_descr PARAMS ((bfd * abfd));
-
-static void
-write_archive PARAMS ((bfd *));
-
-static void
-ranlib_only PARAMS ((const char *archname));
-
-static void
-ranlib_touch PARAMS ((const char *archname));
-
-static void
-usage PARAMS ((int));
+static void move_members (bfd *, char **files_to_move);
+static void replace_members
+ (bfd *, char **files_to_replace, bfd_boolean quick);
+static void print_descr (bfd * abfd);
+static void write_archive (bfd *);
+static void ranlib_only (const char *archname);
+static void ranlib_touch (const char *archname);
+static void usage (int);
\f
/** Globals and flags */
/* Controls the writing of an archive symbol table (in BSD: a __.SYMDEF
member). -1 means we've been explicitly asked to not write a symbol table;
- +1 means we've been explictly asked to write it;
+ +1 means we've been explicitly asked to write it;
0 is the default.
Traditionally, the default in BSD has been to not write the table.
However, for POSIX.2 compliance the default is now to write a symbol table
} postype = pos_default;
static bfd **
-get_pos_bfd PARAMS ((bfd **, enum pos, const char *));
+get_pos_bfd (bfd **, enum pos, const char *);
-/* For extract/delete only. If COUNTED_NAME_MODE is true, we only
+/* For extract/delete only. If COUNTED_NAME_MODE is TRUE, we only
extract the COUNTED_NAME_COUNTER instance of that name. */
-static boolean counted_name_mode = 0;
+static bfd_boolean counted_name_mode = 0;
static int counted_name_counter = 0;
/* Whether to truncate names of files stored in the archive. */
-static boolean ar_truncate = false;
+static bfd_boolean ar_truncate = FALSE;
/* Whether to use a full file name match when searching an archive.
This is convenient for archives created by the Microsoft lib
program. */
-static boolean full_pathname = false;
+static bfd_boolean full_pathname = FALSE;
int interactive = 0;
static void
-mri_emul ()
+mri_emul (void)
{
interactive = isatty (fileno (stdin));
yyparse ();
whose name matches one in FILES. */
static void
-map_over_members (arch, function, files, count)
- bfd *arch;
- void (*function) PARAMS ((bfd *));
- char **files;
- int count;
+map_over_members (bfd *arch, void (*function)(bfd *), char **files, int count)
{
bfd *head;
int match_count;
for (; count > 0; files++, count--)
{
- boolean found = false;
+ bfd_boolean found = FALSE;
match_count = 0;
for (head = arch->next; head; head = head->next)
continue;
}
- found = true;
+ found = TRUE;
function (head);
}
}
}
}
\f
-boolean operation_alters_arch = false;
+bfd_boolean operation_alters_arch = FALSE;
static void
-usage (help)
- int help;
+usage (int help)
{
FILE *s;
name which we will use in an archive. */
static const char *
-normalize (file, abfd)
- const char *file;
- bfd *abfd;
+normalize (const char *file, bfd *abfd)
{
const char *filename;
static bfd *output_bfd = NULL;
static void
-remove_output ()
+remove_output (void)
{
if (output_filename != NULL)
{
- if (output_bfd != NULL && output_bfd->iostream != NULL)
- fclose ((FILE *) (output_bfd->iostream));
+ if (output_bfd != NULL)
+ bfd_cache_close (output_bfd);
if (output_file != NULL)
fclose (output_file);
unlink (output_filename);
/* The option parsing should be in its own function.
It will be when I have getopt working. */
-int main PARAMS ((int, char **));
+int main (int, char **);
int
-main (argc, argv)
- int argc;
- char **argv;
+main (int argc, char **argv)
{
char *arg_ptr;
char c;
if (is_ranlib)
{
- boolean touch = false;
+ bfd_boolean touch = FALSE;
if (argc < 2
|| strcmp (argv[1], "--help") == 0
if (strcmp (argv[1], "-t") == 0)
{
++arg_index;
- touch = true;
+ touch = TRUE;
}
while (arg_index < argc)
{
{
case 'd':
operation = delete;
- operation_alters_arch = true;
+ operation_alters_arch = TRUE;
break;
case 'm':
operation = move;
- operation_alters_arch = true;
+ operation_alters_arch = TRUE;
break;
case 'p':
operation = print_files;
break;
case 'q':
operation = quick_append;
- operation_alters_arch = true;
+ operation_alters_arch = TRUE;
break;
case 'r':
operation = replace;
- operation_alters_arch = true;
+ operation_alters_arch = TRUE;
break;
case 't':
operation = print_table;
preserve_dates = 1;
break;
case 'V':
- show_version = true;
+ show_version = TRUE;
break;
case 's':
write_armap = 1;
mri_mode = 1;
break;
case 'N':
- counted_name_mode = true;
+ counted_name_mode = TRUE;
break;
case 'f':
- ar_truncate = true;
+ ar_truncate = TRUE;
break;
case 'P':
- full_pathname = true;
+ full_pathname = TRUE;
break;
default:
/* xgettext:c-format */
}
bfd *
-open_inarch (archive_filename, file)
- const char *archive_filename;
- const char *file;
+open_inarch (const char *archive_filename, const char *file)
{
const char *target;
bfd **last_one;
|| ! bfd_set_format (arch, bfd_archive)
|| ! bfd_close (arch))
bfd_fatal (archive_filename);
+ else if (!silent_create)
+ non_fatal (_("creating %s"), archive_filename);
/* If we die creating a new archive, don't leave it around. */
output_filename = archive_filename;
}
static void
-print_contents (abfd)
- bfd *abfd;
+print_contents (bfd *abfd)
{
int ncopied = 0;
char *cbuf = xmalloc (BUFSIZE);
if (verbose)
/* xgettext:c-format */
- printf (_("\n<member %s>\n\n"), bfd_get_filename (abfd));
+ printf (_("\n<%s>\n\n"), bfd_get_filename (abfd));
bfd_seek (abfd, (file_ptr) 0, SEEK_SET);
Gilmore */
void
-extract_file (abfd)
- bfd *abfd;
+extract_file (bfd *abfd)
{
FILE *ostream;
char *cbuf = xmalloc (BUFSIZE);
/* Just do it quickly; don't worry about dups, armap, or anything like that */
static void
-do_quick_append (archive_filename, files_to_append)
- const char *archive_filename;
- char **files_to_append;
+do_quick_append (const char *archive_filename, char **files_to_append)
{
FILE *ofile, *ifile;
char *buf = xmalloc (BUFSIZE);
long tocopy, thistime;
bfd *temp;
struct stat sbuf;
- boolean newfile = false;
+ bfd_boolean newfile = FALSE;
bfd_set_error (bfd_error_no_error);
if (stat (archive_filename, &sbuf) != 0)
bfd_fatal (archive_filename);
#endif
- newfile = true;
+ newfile = TRUE;
}
ofile = fopen (archive_filename, FOPEN_AUB);
{
bfd_fatal (archive_filename);
}
- if (newfile == false)
+ if (!newfile)
{
- if (bfd_check_format (temp, bfd_archive) != true)
+ if (!bfd_check_format (temp, bfd_archive))
/* xgettext:c-format */
fatal (_("%s is not an archive"), archive_filename);
}
if (ar_truncate)
temp->flags |= BFD_TRADITIONAL_FORMAT;
- /* assume it's an achive, go straight to the end, sans $200 */
+ /* assume it's an archive, go straight to the end, sans $200 */
fseek (ofile, 0, 2);
for (; files_to_append && *files_to_append; ++files_to_append)
#endif /* 0 */
static void
-write_archive (iarch)
- bfd *iarch;
+write_archive (bfd *iarch)
{
bfd *obfd;
char *old_name, *new_name;
obfd->flags |= BFD_TRADITIONAL_FORMAT;
}
- if (bfd_set_archive_head (obfd, contents_head) != true)
+ if (!bfd_set_archive_head (obfd, contents_head))
bfd_fatal (old_name);
if (!bfd_close (obfd))
and should be a pos value. */
static bfd **
-get_pos_bfd (contents, default_pos, default_posname)
- bfd **contents;
- enum pos default_pos;
- const char *default_posname;
+get_pos_bfd (bfd **contents, enum pos default_pos, const char *default_posname)
{
bfd **after_bfd = contents;
enum pos realpos;
}
static void
-delete_members (arch, files_to_delete)
- bfd *arch;
- char **files_to_delete;
+delete_members (bfd *arch, char **files_to_delete)
{
bfd **current_ptr_ptr;
- boolean found;
- boolean something_changed = false;
+ bfd_boolean found;
+ bfd_boolean something_changed = FALSE;
int match_count;
for (; *files_to_delete != NULL; ++files_to_delete)
if (!strcmp (*files_to_delete, "__.SYMDEF"))
{
- arch->has_armap = false;
+ arch->has_armap = FALSE;
write_armap = -1;
continue;
}
- found = false;
+ found = FALSE;
match_count = 0;
current_ptr_ptr = &(arch->next);
while (*current_ptr_ptr)
}
else
{
- found = true;
- something_changed = true;
+ found = TRUE;
+ something_changed = TRUE;
if (verbose)
printf ("d - %s\n",
*files_to_delete);
current_ptr_ptr = &((*current_ptr_ptr)->next);
}
- if (verbose && found == false)
+ if (verbose && !found)
{
/* xgettext:c-format */
printf (_("No member named `%s'\n"), *files_to_delete);
;
}
- if (something_changed == true)
+ if (something_changed)
write_archive (arch);
else
output_filename = NULL;
/* Reposition existing members within an archive */
static void
-move_members (arch, files_to_move)
- bfd *arch;
- char **files_to_move;
+move_members (bfd *arch, char **files_to_move)
{
bfd **after_bfd; /* New entries go after this one */
bfd **current_ptr_ptr; /* cdr pointer into contents */
/* Ought to default to replacing in place, but this is existing practice! */
static void
-replace_members (arch, files_to_move, quick)
- bfd *arch;
- char **files_to_move;
- boolean quick;
+replace_members (bfd *arch, char **files_to_move, bfd_boolean quick)
{
- boolean changed = false;
+ bfd_boolean changed = FALSE;
bfd **after_bfd; /* New entries go after this one */
bfd *current;
bfd **current_ptr;
{
/* Snip out this entry from the chain. */
*current_ptr = (*current_ptr)->next;
- changed = true;
+ changed = TRUE;
}
goto next_file;
/* Add to the end of the archive. */
after_bfd = get_pos_bfd (&arch->next, pos_end, NULL);
- if (ar_emul_append (after_bfd, *files_to_move, verbose))
- changed = true;
+
+ if (get_file_size (* files_to_move) > 0
+ && ar_emul_append (after_bfd, *files_to_move, verbose))
+ changed = TRUE;
next_file:;
}
static void
-ranlib_only (archname)
- const char *archname;
+ranlib_only (const char *archname)
{
bfd *arch;
+ if (get_file_size (archname) < 1)
+ return;
write_armap = 1;
arch = open_inarch (archname, (char *) NULL);
if (arch == NULL)
/* Update the timestamp of the symbol map of an archive. */
static void
-ranlib_touch (archname)
- const char *archname;
+ranlib_touch (const char *archname)
{
#ifdef __GO32__
/* I don't think updating works on go32. */
bfd *arch;
char **matching;
+ if (get_file_size (archname) < 1)
+ return;
f = open (archname, O_RDWR | O_BINARY, 0);
if (f < 0)
{
/* Things which are interesting to map over all or some of the files: */
static void
-print_descr (abfd)
- bfd *abfd;
+print_descr (bfd *abfd)
{
print_arelt_descr (stdout, abfd, verbose);
}