(isunordered): Rename local variables to ensure correct code.
[kopensolaris-gnu/glibc.git] / argp / argp-help.c
index b17c56d..8faacd5 100644 (file)
@@ -458,6 +458,7 @@ hol_add_cluster (struct hol *hol, int group, const char *header, int index,
       cl->index = index;
       cl->parent = parent;
       cl->argp = argp;
+      cl->depth = parent ? parent->depth + 1 : 0;
 
       cl->next = hol->clusters;
       hol->clusters = cl;
@@ -777,7 +778,7 @@ hol_append (struct hol *hol, struct hol *more)
        more->num_entries = 0;  /* Mark MORE's fields as invalid.  */
       }
     else
-      /* append the entries in MORE to those in HOL, taking care to only add
+      /* Append the entries in MORE to those in HOL, taking care to only add
         non-shadowed SHORT_OPTIONS values.  */
       {
        unsigned left;
@@ -790,12 +791,12 @@ hol_append (struct hol *hol, struct hol *more)
        char *short_options =
          malloc (hol_so_len + strlen (more->short_options) + 1);
 
-       memcpy (entries, hol->entries,
-               hol->num_entries * sizeof (struct hol_entry));
-       memcpy (entries + hol->num_entries, more->entries,
-               more->num_entries * sizeof (struct hol_entry));
+       __mempcpy (__mempcpy (entries, hol->entries,
+                             hol->num_entries * sizeof (struct hol_entry)),
+                  more->entries,
+                  more->num_entries * sizeof (struct hol_entry));
 
-       memcpy (short_options, hol->short_options, hol_so_len);
+       __mempcpy (short_options, hol->short_options, hol_so_len);
 
        /* Fix up the short options pointers from HOL.  */
        for (e = entries, left = hol->num_entries; left > 0; e++, left--)
@@ -921,7 +922,7 @@ filter_doc (const char *doc, int key, const struct argp *argp,
     }
   else
     /* No filter.  */
-    return (char *)doc;
+    return doc;
 }
 
 /* Prints STR as a header line, with the margin lines set appropiately, and
@@ -973,8 +974,10 @@ comma (unsigned col, struct pentry_state *pest)
       if (pest->hhstate->sep_groups && pe && pest->entry->group != pe->group)
        __argp_fmtstream_putc (pest->stream, '\n');
 
-      if (pe && cl && pe->cluster != cl && cl->header && *cl->header
-         && !hol_cluster_is_child (pe->cluster, cl))
+      if (cl && cl->header && *cl->header
+         && (!pe
+             || (pe->cluster != cl
+                 && !hol_cluster_is_child (pe->cluster, cl))))
        /* If we're changing clusters, then this must be the start of the
           ENTRY's cluster unless that is an ancestor of the previous one
           (in which case we had just popped into a sub-cluster for a bit).
@@ -1133,7 +1136,7 @@ hol_help (struct hol *hol, const struct argp_state *state,
 Mandatory or optional arguments to long options are also mandatory or \
 optional for any corresponding short options.");
       const char *fstr = filter_doc (tstr, ARGP_KEY_HELP_DUP_ARGS_NOTE,
-                                    state ? state->argp : 0, state);
+                                    state ? state->root_argp : 0, state);
       if (fstr && *fstr)
        {
          __argp_fmtstream_putc (stream, '\n');
@@ -1305,17 +1308,19 @@ argp_args_levels (const struct argp *argp)
    updated by this routine for the next call if ADVANCE is true.  True is
    returned as long as there are more patterns to output.  */
 static int
-argp_args_usage (const struct argp *argp, char **levels, int advance,
-                argp_fmtstream_t stream)
+argp_args_usage (const struct argp *argp, const struct argp_state *state,
+                char **levels, int advance, argp_fmtstream_t stream)
 {
   char *our_level = *levels;
   int multiple = 0;
   const struct argp_child *child = argp->children;
-  const char *doc = gettext (argp->args_doc), *nl = 0;
+  const char *tdoc = gettext (argp->args_doc), *nl = 0;
+  const char *fdoc = filter_doc (tdoc, ARGP_KEY_HELP_ARGS_DOC, argp, state);
 
-  if (doc)
+  if (fdoc)
     {
-      nl = strchr (doc, '\n');
+      const char *cp = fdoc;
+      nl = strchr (cp, '\n');
       if (nl)
        /* This is a `multi-level' args doc; advance to the correct position
           as determined by our state in LEVELS, and update LEVELS.  */
@@ -1323,22 +1328,24 @@ argp_args_usage (const struct argp *argp, char **levels, int advance,
          int i;
          multiple = 1;
          for (i = 0; i < *our_level; i++)
-           doc = nl + 1, nl = strchr (doc, '\n');
+           cp = nl + 1, nl = strchr (cp, '\n');
          (*levels)++;
        }
       if (! nl)
-       nl = doc + strlen (doc);
+       nl = cp + strlen (cp);
 
       /* Manually do line wrapping so that it (probably) won't get wrapped at
         any embedded spaces.  */
-      space (stream, 1 + nl - doc);
+      space (stream, 1 + nl - cp);
 
-      __argp_fmtstream_write (stream, doc, nl - doc);
+      __argp_fmtstream_write (stream, cp, nl - cp);
     }
+  if (fdoc && fdoc != tdoc)
+    free ((char *)fdoc);       /* Free user's modified doc string.  */
 
   if (child)
     while (child->argp)
-      advance = !argp_args_usage ((child++)->argp, levels, advance, stream);
+      advance = !argp_args_usage ((child++)->argp, state, levels, advance, stream);
 
   if (advance && multiple)
     /* Need to increment our level.  */
@@ -1493,7 +1500,7 @@ _help (const struct argp *argp, const struct argp_state *state, FILE *stream,
       do
        {
          int old_lm;
-         int old_wm = __argp_fmtstream_set_wmargin (fs, USAGE_INDENT);
+         int old_wm = __argp_fmtstream_set_wmargin (fs, uparams.usage_indent);
          char *levels = pattern_levels;
 
          __argp_fmtstream_printf (fs, "%s %s",
@@ -1502,7 +1509,7 @@ _help (const struct argp *argp, const struct argp_state *state, FILE *stream,
 
          /* We set the lmargin as well as the wmargin, because hol_usage
             manually wraps options with newline to avoid annoying breaks.  */
-         old_lm = __argp_fmtstream_set_lmargin (fs, USAGE_INDENT);
+         old_lm = __argp_fmtstream_set_lmargin (fs, uparams.usage_indent);
 
          if (flags & ARGP_HELP_SHORT_USAGE)
            /* Just show where the options go.  */
@@ -1517,7 +1524,7 @@ _help (const struct argp *argp, const struct argp_state *state, FILE *stream,
              flags |= ARGP_HELP_SHORT_USAGE; /* But only do so once.  */
            }
 
-         more_patterns = argp_args_usage (argp, &levels, 1, fs);
+         more_patterns = argp_args_usage (argp, state, &levels, 1, fs);
 
          __argp_fmtstream_set_wmargin (fs, old_wm);
          __argp_fmtstream_set_lmargin (fs, old_lm);
@@ -1594,7 +1601,7 @@ __argp_state_help (const struct argp_state *state, FILE *stream, unsigned flags)
       if (state && (state->flags & ARGP_LONG_ONLY))
        flags |= ARGP_HELP_LONG_ONLY;
 
-      _help (state ? state->argp : 0, state, stream, flags,
+      _help (state ? state->root_argp : 0, state, stream, flags,
             state ? state->name : program_invocation_short_name);
 
       if (!state || ! (state->flags & ARGP_NO_EXIT))