* ldlang.c (lang_reasonable_defaults): Remove.
[deliverable/binutils-gdb.git] / binutils / ar.c
index b85d62ecf0d7ba26fd543c04a1be5e5f038230a0..6cc7941db126d9479de43600b0b29df3cb1ef626 100644 (file)
@@ -1,6 +1,6 @@
 /* ar.c - Archive modify and extract.
    Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-   2001, 2002, 2003
+   2001, 2002, 2003, 2004
    Free Software Foundation, Inc.
 
    This file is part of GNU Binutils.
@@ -353,6 +353,7 @@ main (int argc, char **argv)
   char *inarch_filename;
   int show_version;
   int i;
+  int do_posix = 0;
 
 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
   setlocale (LC_MESSAGES, "");
@@ -459,107 +460,125 @@ main (int argc, char **argv)
   if (argc < 2)
     usage (0);
 
-  arg_ptr = argv[1];
+  arg_index = 1;
+  arg_ptr = argv[arg_index];
 
   if (*arg_ptr == '-')
-    ++arg_ptr;                 /* compatibility */
+    {
+      /* When the first option starts with '-' we support POSIX-compatible
+        option parsing.  */
+      do_posix = 1;
+      ++arg_ptr;                       /* compatibility */
+    }
 
-  while ((c = *arg_ptr++) != '\0')
+  do
     {
-      switch (c)
+      while ((c = *arg_ptr++) != '\0')
        {
-       case 'd':
-       case 'm':
-       case 'p':
-       case 'q':
-       case 'r':
-       case 't':
-       case 'x':
-         if (operation != none)
-           fatal (_("two different operation options specified"));
          switch (c)
            {
            case 'd':
-             operation = delete;
-             operation_alters_arch = TRUE;
-             break;
            case 'm':
-             operation = move;
-             operation_alters_arch = TRUE;
-             break;
            case 'p':
-             operation = print_files;
-             break;
            case 'q':
-             operation = quick_append;
-             operation_alters_arch = TRUE;
-             break;
            case 'r':
-             operation = replace;
-             operation_alters_arch = TRUE;
-             break;
            case 't':
-             operation = print_table;
-             break;
            case 'x':
-             operation = extract;
+             if (operation != none)
+               fatal (_("two different operation options specified"));
+             switch (c)
+               {
+               case 'd':
+                 operation = delete;
+                 operation_alters_arch = TRUE;
+                 break;
+               case 'm':
+                 operation = move;
+                 operation_alters_arch = TRUE;
+                 break;
+               case 'p':
+                 operation = print_files;
+                 break;
+               case 'q':
+                 operation = quick_append;
+                 operation_alters_arch = TRUE;
+                 break;
+               case 'r':
+                 operation = replace;
+                 operation_alters_arch = TRUE;
+                 break;
+               case 't':
+                 operation = print_table;
+                 break;
+               case 'x':
+                 operation = extract;
+                 break;
+               }
+           case 'l':
+             break;
+           case 'c':
+             silent_create = 1;
+             break;
+           case 'o':
+             preserve_dates = 1;
+             break;
+           case 'V':
+             show_version = TRUE;
+             break;
+           case 's':
+             write_armap = 1;
+             break;
+           case 'S':
+             write_armap = -1;
+             break;
+           case 'u':
+             newer_only = 1;
+             break;
+           case 'v':
+             verbose = 1;
+             break;
+           case 'a':
+             postype = pos_after;
+             break;
+           case 'b':
+             postype = pos_before;
+             break;
+           case 'i':
+             postype = pos_before;
              break;
+           case 'M':
+             mri_mode = 1;
+             break;
+           case 'N':
+             counted_name_mode = TRUE;
+             break;
+           case 'f':
+             ar_truncate = TRUE;
+             break;
+           case 'P':
+             full_pathname = TRUE;
+             break;
+           default:
+             /* xgettext:c-format */
+             non_fatal (_("illegal option -- %c"), c);
+             usage (0);
            }
-       case 'l':
-         break;
-       case 'c':
-         silent_create = 1;
-         break;
-       case 'o':
-         preserve_dates = 1;
-         break;
-       case 'V':
-         show_version = TRUE;
-         break;
-       case 's':
-         write_armap = 1;
-         break;
-       case 'S':
-         write_armap = -1;
-         break;
-       case 'u':
-         newer_only = 1;
-         break;
-       case 'v':
-         verbose = 1;
-         break;
-       case 'a':
-         postype = pos_after;
-         break;
-       case 'b':
-         postype = pos_before;
-         break;
-       case 'i':
-         postype = pos_before;
-         break;
-       case 'M':
-         mri_mode = 1;
-         break;
-       case 'N':
-         counted_name_mode = TRUE;
-         break;
-       case 'f':
-         ar_truncate = TRUE;
-         break;
-       case 'P':
-         full_pathname = TRUE;
-         break;
-       default:
-         /* xgettext:c-format */
-         non_fatal (_("illegal option -- %c"), c);
-         usage (0);
        }
+
+      /* With POSIX-compatible option parsing continue with the next
+        argument if it starts with '-'.  */
+      if (do_posix && arg_index + 1 < argc && argv[arg_index + 1][0] == '-')
+       arg_ptr = argv[++arg_index] + 1;
+      else
+       do_posix = 0;
     }
+  while (do_posix);
 
   if (show_version)
     print_version ("ar");
 
-  if (argc < 3)
+  ++arg_index;
+  if (arg_index >= argc)
     usage (0);
 
   if (mri_mode)
@@ -578,7 +597,7 @@ main (int argc, char **argv)
       if ((operation == none || operation == print_table)
          && write_armap == 1)
        {
-         ranlib_only (argv[2]);
+         ranlib_only (argv[arg_index]);
          xexit (0);
        }
 
@@ -588,8 +607,6 @@ main (int argc, char **argv)
       if (newer_only && operation != replace)
        fatal (_("`u' is only meaningful with the `r' option."));
 
-      arg_index = 2;
-
       if (postype != pos_default)
        posname = argv[arg_index++];
 
@@ -918,7 +935,12 @@ extract_file (bfd *abfd)
   chmod (bfd_get_filename (abfd), buf.st_mode);
 
   if (preserve_dates)
-    set_times (bfd_get_filename (abfd), &buf);
+    {
+      /* Set access time to modification time.  Only st_mtime is
+        initialized by bfd_stat_arch_elt.  */
+      buf.st_atime = buf.st_mtime;
+      set_times (bfd_get_filename (abfd), &buf);
+    }
 
   free (cbuf);
 }
@@ -1251,7 +1273,7 @@ static void
 replace_members (bfd *arch, char **files_to_move, bfd_boolean quick)
 {
   bfd_boolean changed = FALSE;
-  bfd **after_bfd;             /* New entries go after this one */
+  bfd **after_bfd;             /* New entries go after this one */
   bfd *current;
   bfd **current_ptr;
 
@@ -1308,8 +1330,7 @@ replace_members (bfd *arch, char **files_to_move, bfd_boolean quick)
       /* Add to the end of the archive.  */
       after_bfd = get_pos_bfd (&arch->next, pos_end, NULL);
 
-      if (get_file_size (* files_to_move) > 0
-         && ar_emul_append (after_bfd, *files_to_move, verbose))
+      if (ar_emul_append (after_bfd, *files_to_move, verbose))
        changed = TRUE;
 
     next_file:;
This page took 0.029764 seconds and 4 git commands to generate.