Fixed segv in gpg-agent (command marktrusted).
[gnupg.git] / jnlib / argparse.c
index 2d46884..443a1e7 100644 (file)
@@ -1,6 +1,6 @@
 /* [argparse.c wk 17.06.97] Argument Parser for option handling
  * Copyright (C) 1998, 1999, 2000, 2001, 2006
- *               2007  Free Software Foundation, Inc.
+ *               2007, 2008  Free Software Foundation, Inc.
  *
  * This file is part of JNLIB.
  *
@@ -149,65 +149,71 @@ static void show_version(void);
 static void
 initialize( ARGPARSE_ARGS *arg, const char *filename, unsigned *lineno )
 {
-    if( !(arg->flags & (1<<15)) ) { /* initialize this instance */
-       arg->internal.idx = 0;
-       arg->internal.last = NULL;
-       arg->internal.inarg = 0;
-       arg->internal.stopped = 0;
-       arg->internal.aliases = NULL;
-       arg->internal.cur_alias = NULL;
-       arg->err = 0;
-       arg->flags |= 1<<15; /* mark initialized */
-       if( *arg->argc < 0 )
-           jnlib_log_bug("Invalid argument for ArgParse\n");
+  if( !(arg->flags & (1<<15)) ) 
+    { 
+      /* Initialize this instance. */
+      arg->internal.idx = 0;
+      arg->internal.last = NULL;
+      arg->internal.inarg = 0;
+      arg->internal.stopped = 0;
+      arg->internal.aliases = NULL;
+      arg->internal.cur_alias = NULL;
+      arg->err = 0;
+      arg->flags |= 1<<15; /* Mark as initialized.  */
+      if ( *arg->argc < 0 )
+        jnlib_log_bug ("invalid argument for arg_parsee\n");
     }
-
-
-    if( arg->err ) { /* last option was erroneous */
-       const char *s;
-
-       if( filename ) {
-           if( arg->r_opt == -6 )
-               s = "argument not expected\n";
-           else if( arg->r_opt == -5 )
-               s = "read error\n";
-           else if( arg->r_opt == -4 )
-               s = "keyword too long\n";
-           else if( arg->r_opt == -3 )
-               s = "missing argument\n";
-           else if( arg->r_opt == -7 )
-               s = "invalid command\n";
-           else if( arg->r_opt == -10 )
-               s = "invalid alias definition\n";
-           else
-               s = "invalid option\n";
-           jnlib_log_error("%s:%u: %s\n", filename, *lineno, s);
+  
+  
+  if (arg->err)
+    {
+      /* Last option was erroneous.  */
+      const char *s;
+      
+      if (filename)
+        {
+          if ( arg->r_opt == -6 )
+            s = _("argument not expected");
+          else if ( arg->r_opt == -5 )
+            s = _("read error");
+          else if ( arg->r_opt == -4 )
+            s = _("keyword too long");
+          else if ( arg->r_opt == -3 )
+            s = _("missing argument");
+          else if ( arg->r_opt == -7 )
+            s = _("invalid command");
+          else if ( arg->r_opt == -10 )
+            s = _("invalid alias definition");
+          else
+            s = _("invalid option");
+          jnlib_log_error ("%s:%u: %s\n", filename, *lineno, s);
        }
-       else {
-            s = arg->internal.last? arg->internal.last:"[??]";
+      else 
+        {
+          s = arg->internal.last? arg->internal.last:"[??]";
             
-           if( arg->r_opt == -3 )
-              jnlib_log_error ("Missing argument for option \"%.50s\"\n", s);
-           else if( arg->r_opt == -6 )
-              jnlib_log_error ("Option \"%.50s\" does not expect an argument\n",
-                               s );
-           else if( arg->r_opt == -7 )
-              jnlib_log_error ("Invalid command \"%.50s\"\n", s);
-           else if( arg->r_opt == -8 )
-              jnlib_log_error ("Option \"%.50s\" is ambiguous\n", s);
-           else if( arg->r_opt == -9 )
-              jnlib_log_error ("Command \"%.50s\" is ambiguous\n",s );
-           else
-              jnlib_log_error ("Invalid option \"%.50s\"\n", s);
+          if ( arg->r_opt == -3 )
+            jnlib_log_error (_("missing argument for option \"%.50s\"\n"), s);
+          else if ( arg->r_opt == -6 )
+            jnlib_log_error (_("option \"%.50s\" does not expect an "
+                               "argument\n"), s );
+          else if ( arg->r_opt == -7 )
+            jnlib_log_error (_("invalid command \"%.50s\"\n"), s);
+          else if ( arg->r_opt == -8 )
+            jnlib_log_error (_("option \"%.50s\" is ambiguous\n"), s);
+          else if ( arg->r_opt == -9 )
+            jnlib_log_error (_("command \"%.50s\" is ambiguous\n"),s );
+          else
+            jnlib_log_error (_("invalid option \"%.50s\"\n"), s);
        }
-       if( arg->err != 1 )
-           exit(2);
-       arg->err = 0;
+      if ( arg->err != 1 )
+        exit (2);
+      arg->err = 0;
     }
 
-    /* clearout the return value union */
-    arg->r.ret_str = NULL;
-    arg->r.ret_long= 0;
+  /* Zero out the return value union.  */
+  arg->r.ret_str = NULL;
+  arg->r.ret_long = 0;
 }
 
 
@@ -890,6 +896,8 @@ show_version()
 void
 usage (int level)
 {
+  const char *p;
+
   if (!level)
     {
       fprintf(stderr,"%s %s; %s\n", strusage(11), strusage(13), strusage (14));
@@ -897,7 +905,10 @@ usage (int level)
     }
   else if (level == 1)
     {
-      fputs (strusage (40), stderr);
+      p = strusage (40);
+      fputs (p, stderr);
+      if (*p && p[strlen(p)] != '\n')
+        putc ('\n', stderr);
       exit (2);
     }
   else if (level == 2) 
@@ -940,7 +951,7 @@ strusage( int level )
         break;
       case 11: p = "foo"; break;
       case 13: p = "0.0"; break;
-      case 14: p = "Copyright (C) 2007 Free Software Foundation, Inc."; break;
+      case 14: p = "Copyright (C) 2008 Free Software Foundation, Inc."; break;
       case 15: p =
 "This is free software: you are free to change and redistribute it.\n"
 "There is NO WARRANTY, to the extent permitted by law.\n";