Home | History | Annotate | Download | only in src
      1 /* Options common to ar and ranlib.
      2    Copyright (C) 2012 Red Hat, Inc.
      3    This file is part of elfutils.
      4 
      5    This file is free software; you can redistribute it and/or modify
      6    it under the terms of the GNU General Public License as published by
      7    the Free Software Foundation; either version 3 of the License, or
      8    (at your option) any later version.
      9 
     10    elfutils is distributed in the hope that it will be useful, but
     11    WITHOUT ANY WARRANTY; without even the implied warranty of
     12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13    GNU General Public License for more details.
     14 
     15    You should have received a copy of the GNU General Public License
     16    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     17 
     18 #ifdef HAVE_CONFIG_H
     19 # include <config.h>
     20 #endif
     21 
     22 #include <argp.h>
     23 #include <libintl.h>
     24 
     25 #include "arlib.h"
     26 
     27 bool arlib_deterministic_output = DEFAULT_AR_DETERMINISTIC;
     28 
     29 static const struct argp_option options[] =
     30   {
     31     { NULL, 'D', NULL, 0,
     32       N_("Use zero for uid, gid, and date in archive members."), 0 },
     33     { NULL, 'U', NULL, 0,
     34       N_("Use actual uid, gid, and date in archive members."), 0 },
     35 
     36     { NULL, 0, NULL, 0, NULL, 0 }
     37   };
     38 
     39 static error_t
     40 parse_opt (int key, char *arg __attribute__ ((unused)),
     41            struct argp_state *state __attribute__ ((unused)))
     42 {
     43   switch (key)
     44     {
     45     case 'D':
     46       arlib_deterministic_output = true;
     47       break;
     48 
     49     case 'U':
     50       arlib_deterministic_output = false;
     51       break;
     52 
     53     default:
     54       return ARGP_ERR_UNKNOWN;
     55     }
     56   return 0;
     57 }
     58 
     59 static char *
     60 help_filter (int key, const char *text, void *input __attribute__ ((unused)))
     61 {
     62   inline char *text_for_default (void)
     63   {
     64     char *new_text;
     65     if (unlikely (asprintf (&new_text, gettext ("%s (default)"), text) < 0))
     66       return (char *) text;
     67     return new_text;
     68   }
     69 
     70   switch (key)
     71     {
     72     case 'D':
     73       if (DEFAULT_AR_DETERMINISTIC)
     74         return text_for_default ();
     75       break;
     76     case 'U':
     77       if (! DEFAULT_AR_DETERMINISTIC)
     78         return text_for_default ();
     79       break;
     80     }
     81 
     82   return (char *) text;
     83 }
     84 
     85 static const struct argp argp =
     86   {
     87     options, parse_opt, NULL, NULL, NULL, help_filter, NULL
     88   };
     89 
     90 const struct argp_child arlib_argp_children[] =
     91   {
     92     { &argp, 0, "", 2 },
     93     { NULL, 0, NULL, 0 }
     94   };
     95