From 526f90d972da9de677e807017515e81c5a2e594a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se>
Date: Mon, 27 Nov 2000 21:55:37 +0100
Subject: [PATCH] * src/argp/argp-help.c: #define __mempcpy if needed. Use
 unsigned arguments to the ctype macros. Handle systems where
 program_invocation_name and program_invocation_short_name doesn't exist. *
 src/argp/argp-help.c (short_program_name): New function.

Rev: src/argp/argp-help.c:1.11
---
 src/argp/argp-help.c | 47 +++++++++++++++++++++++++++++++++-----------
 1 file changed, 35 insertions(+), 12 deletions(-)

diff --git a/src/argp/argp-help.c b/src/argp/argp-help.c
index 684278299..01aaf5377 100644
--- a/src/argp/argp-help.c
+++ b/src/argp/argp-help.c
@@ -84,6 +84,9 @@ char *alloca ();
 # ifndef __strchrnul
 #  define __strchrnul strchrnul
 # endif
+# ifndef __mempcpy
+#  define __mempcpy mempcpy
+# endif
 /* FIXME: __strndup is a macro expanding to a call of the function
  * __strndup which is not declared properly. */
 # ifndef __strndup
@@ -225,9 +228,11 @@ static const struct uparam_name uparam_names[] =
 static void
 fill_in_uparams (const struct argp_state *state)
 {
+  /* FIXME: Can we define var as a pointer to _unsigned_ char,
+   * or will that clash with the getenv() prototype? */
   const char *var = getenv ("ARGP_HELP_FMT");
 
-#define SKIPWS(p) do { while (isspace (*p)) p++; } while (0);
+#define SKIPWS(p) do { while (isspace ( (unsigned) *p)) p++; } while (0);
 
   if (var)
     /* Parse var. */
@@ -235,14 +240,14 @@ fill_in_uparams (const struct argp_state *state)
       {
 	SKIPWS (var);
 
-	if (isalpha (*var))
+	if (isalpha ( (unsigned) *var))
 	  {
 	    size_t var_len;
 	    const struct uparam_name *un;
 	    int unspec = 0, val = 0;
 	    const char *arg = var;
 
-	    while (isalnum (*arg) || *arg == '-' || *arg == '_')
+	    while (isalnum ( (unsigned) *arg) || *arg == '-' || *arg == '_')
 	      arg++;
 	    var_len = arg - var;
 
@@ -267,10 +272,10 @@ fill_in_uparams (const struct argp_state *state)
 		else
 		  val = 1;
 	      }
-	    else if (isdigit (*arg))
+	    else if (isdigit ( (unsigned) *arg))
 	      {
 		val = atoi (arg);
-		while (isdigit (*arg))
+		while (isdigit ( (unsigned) *arg))
 		  arg++;
 		SKIPWS (arg);
 	      }
@@ -764,12 +769,12 @@ canon_doc_option (const char **name)
 {
   int non_opt;
   /* Skip initial whitespace.  */
-  while (isspace (**name))
+  while (isspace ( (unsigned) **name))
     (*name)++;
   /* Decide whether this looks like an option (leading `-') or not.  */
   non_opt = (**name != '-');
   /* Skip until part of name used for sorting.  */
-  while (**name && !isalnum (**name))
+  while (**name && !isalnum ( (unsigned) **name))
     (*name)++;
   return non_opt;
 }
@@ -834,9 +839,9 @@ hol_entry_cmp (const struct hol_entry *entry1,
 	  char first1 = short1 ? short1 : long1 ? *long1 : 0;
 	  char first2 = short2 ? short2 : long2 ? *long2 : 0;
 #ifdef _tolower
-	  int lower_cmp = _tolower (first1) - _tolower (first2);
+	  int lower_cmp = _tolower ( (unsigned) first1) - _tolower ( (unsigned) first2);
 #else
-	  int lower_cmp = tolower (first1) - tolower (first2);
+	  int lower_cmp = tolower ( (unsigned) first1) - tolower ( (unsigned) first2);
 #endif
 	  /* Compare ignoring case, except when the options are both the
 	     same letter, in which case lower-case always comes first.  */
@@ -1735,6 +1740,24 @@ void __argp_help (const struct argp *argp, FILE *stream,
 weak_alias (__argp_help, argp_help)
 #endif
 
+static const char *
+short_program_name(const struct argp_state *state)
+{
+  if (state)
+    return state->name;
+#if HAVE_PROGRAM_INVOCATION_SHORT_NAME
+  return program_invocation_short_name;
+#elif HAVE_PROGRAM_INVOCATION_NAME
+  {
+    const char *short_name = strrchr(program_invocation_name, '/');
+    return short_name ? short_name + 1 : program_invocation_name;
+  }
+#else
+  /* FIXME: What now? */
+  return "";
+#endif
+}
+
 /* Output, if appropriate, a usage message for STATE to STREAM.  FLAGS are
    from the set ARGP_HELP_*.  */
 void
@@ -1746,7 +1769,7 @@ __argp_state_help (const struct argp_state *state, FILE *stream, unsigned flags)
 	flags |= ARGP_HELP_LONG_ONLY;
 
       _help (state ? state->root_argp : 0, state, stream, flags,
-	     state ? state->name : program_invocation_short_name);
+	     short_program_name(state));
 
       if (!state || ! (state->flags & ARGP_NO_EXIT))
 	{
@@ -1777,7 +1800,7 @@ __argp_error (const struct argp_state *state, const char *fmt, ...)
 
 	  __flockfile (stream);
 
-	  fputs_unlocked (state ? state->name : program_invocation_short_name,
+	  fputs_unlocked (short_program_name(state),
 			  stream);
 	  putc_unlocked (':', stream);
 	  putc_unlocked (' ', stream);
@@ -1818,7 +1841,7 @@ __argp_failure (const struct argp_state *state, int status, int errnum,
 	{
 	  __flockfile (stream);
 
-	  fputs_unlocked (state ? state->name : program_invocation_short_name,
+	  fputs_unlocked (short_program_name(state),
 			  stream);
 
 	  if (fmt)
-- 
GitLab