annotate lib/argp-help.c @ 17463:203c036eb0c6

bootstrap: support checksum utils without a --status option * build-aux/bootstrap: Only look for sha1sum if updating po files. Add sha1 to the list of supported checksum utils since it's now supported through adjustments below. (update_po_files): Remove the use of --status in a way that will suppress all error messages, but since this is only used to minimize updates, it shouldn't cause an issue. Exit early if there is a problem updating the po file checksums. (find_tool): Remove the check for --version support as this is optional as per commit 86186b17. Don't even check for the presence of the command as if that is needed, it's supported through configuring prerequisites in bootstrap.conf. Prompt that when a tool isn't found, one can define an environment variable to add to the hardcoded search list.
author Pádraig Brady <P@draigBrady.com>
date Thu, 08 Aug 2013 11:08:49 +0100 (2013-08-08)
parents 6550127da196
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16358
a712776b11ce maint: spelling fixes
Paul Eggert <eggert@cs.ucla.edu>
parents: 16235
diff changeset
1 /* Hierarchical argument parsing help output
17249
e542fd46ad6f maint: update all copyright year number ranges
Eric Blake <eblake@redhat.com>
parents: 16948
diff changeset
2 Copyright (C) 1995-2005, 2007, 2009-2013 Free Software Foundation, Inc.
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
3 This file is part of the GNU C Library.
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
4 Written by Miles Bader <miles@gnu.ai.mit.edu>.
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
5
9309
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 9000
diff changeset
6 This program is free software: you can redistribute it and/or modify
4419
9b828c973b9d Get lib/argp* from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4385
diff changeset
7 it under the terms of the GNU General Public License as published by
9309
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 9000
diff changeset
8 the Free Software Foundation; either version 3 of the License, or
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 9000
diff changeset
9 (at your option) any later version.
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
10
4419
9b828c973b9d Get lib/argp* from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4385
diff changeset
11 This program is distributed in the hope that it will be useful,
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
4419
9b828c973b9d Get lib/argp* from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4385
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9b828c973b9d Get lib/argp* from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4385
diff changeset
14 GNU General Public License for more details.
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
15
9309
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 9000
diff changeset
16 You should have received a copy of the GNU General Public License
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 9000
diff changeset
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
18
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
19 #ifndef _GNU_SOURCE
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
20 # define _GNU_SOURCE 1
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
21 #endif
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
22
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
23 #ifdef HAVE_CONFIG_H
6259
96c32553b4c6 Use a consistent style for including <config.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
24 # include <config.h>
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
25 #endif
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
26
5067
1407b63897fd Simplify argp by assuming alloca module.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5000
diff changeset
27 #include <alloca.h>
5187
5cb548b39529 Use "gettext.h" instead of its complicated substitute.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5161
diff changeset
28 #include <errno.h>
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
29 #include <stddef.h>
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
30 #include <stdlib.h>
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
31 #include <string.h>
16948
14d27052b3d8 argp, regex: Ensure strcasecmp gets declared.
Bruno Haible <bruno@clisp.org>
parents: 16358
diff changeset
32 #include <strings.h>
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
33 #include <assert.h>
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
34 #include <stdarg.h>
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
35 #include <ctype.h>
5000
fb87c5f96c33 update from glibc
Karl Berry <karl@freefriends.org>
parents: 4888
diff changeset
36 #include <limits.h>
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
37 #ifdef USE_IN_LIBIO
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
38 # include <wchar.h>
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
39 #endif
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
40
5187
5cb548b39529 Use "gettext.h" instead of its complicated substitute.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5161
diff changeset
41 #ifdef _LIBC
5cb548b39529 Use "gettext.h" instead of its complicated substitute.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5161
diff changeset
42 # include <libintl.h>
5cb548b39529 Use "gettext.h" instead of its complicated substitute.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5161
diff changeset
43 # undef dgettext
5cb548b39529 Use "gettext.h" instead of its complicated substitute.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5161
diff changeset
44 # define dgettext(domain, msgid) \
5cb548b39529 Use "gettext.h" instead of its complicated substitute.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5161
diff changeset
45 INTUSE(__dcgettext) (domain, msgid, LC_MESSAGES)
5cb548b39529 Use "gettext.h" instead of its complicated substitute.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5161
diff changeset
46 #else
5cb548b39529 Use "gettext.h" instead of its complicated substitute.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5161
diff changeset
47 # include "gettext.h"
4767
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
48 #endif
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
49
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
50 #include "argp.h"
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
51 #include "argp-fmtstream.h"
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
52 #include "argp-namefrob.h"
4736
60f76c3e517a updates from libc,automake
Karl Berry <karl@freefriends.org>
parents: 4536
diff changeset
53
60f76c3e517a updates from libc,automake
Karl Berry <karl@freefriends.org>
parents: 4536
diff changeset
54 #ifndef SIZE_MAX
60f76c3e517a updates from libc,automake
Karl Berry <karl@freefriends.org>
parents: 4536
diff changeset
55 # define SIZE_MAX ((size_t) -1)
4767
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
56 #endif
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
57
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
58 /* User-selectable (using an environment variable) formatting parameters.
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
59
16235
18a38c9615f0 In commentary, do not use ` to quote.
Paul Eggert <eggert@cs.ucla.edu>
parents: 16234
diff changeset
60 These may be specified in an environment variable called 'ARGP_HELP_FMT',
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
61 with a contents like: VAR1=VAL1,VAR2=VAL2,BOOLVAR2,no-BOOLVAR2
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
62 Where VALn must be a positive integer. The list of variables is in the
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
63 UPARAM_NAMES vector, below. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
64
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
65 /* Default parameters. */
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
66 #define DUP_ARGS 0 /* True if option argument can be duplicated. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
67 #define DUP_ARGS_NOTE 1 /* True to print a note about duplicate args. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
68 #define SHORT_OPT_COL 2 /* column in which short options start */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
69 #define LONG_OPT_COL 6 /* column in which long options start */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
70 #define DOC_OPT_COL 2 /* column in which doc options start */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
71 #define OPT_DOC_COL 29 /* column in which option text starts */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
72 #define HEADER_COL 1 /* column in which group headers are printed */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
73 #define USAGE_INDENT 12 /* indentation of wrapped usage lines */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
74 #define RMARGIN 79 /* right margin used for wrapping */
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
75
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
76 /* User-selectable (using an environment variable) formatting parameters.
16235
18a38c9615f0 In commentary, do not use ` to quote.
Paul Eggert <eggert@cs.ucla.edu>
parents: 16234
diff changeset
77 They must all be of type 'int' for the parsing code to work. */
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
78 struct uparams
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
79 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
80 /* If true, arguments for an option are shown with both short and long
16235
18a38c9615f0 In commentary, do not use ` to quote.
Paul Eggert <eggert@cs.ucla.edu>
parents: 16234
diff changeset
81 options, even when a given option has both, e.g. '-x ARG, --longx=ARG'.
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
82 If false, then if an option has both, the argument is only shown with
16235
18a38c9615f0 In commentary, do not use ` to quote.
Paul Eggert <eggert@cs.ucla.edu>
parents: 16234
diff changeset
83 the long one, e.g., '-x, --longx=ARG', and a message indicating that
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
84 this really means both is printed below the options. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
85 int dup_args;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
86
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
87 /* This is true if when DUP_ARGS is false, and some duplicate arguments have
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
88 been suppressed, an explanatory message should be printed. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
89 int dup_args_note;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
90
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
91 /* Various output columns. */
10095
60ed1a52905e remove trailing blanks
Jim Meyering <meyering@redhat.com>
parents: 9309
diff changeset
92 int short_opt_col; /* column in which short options start */
60ed1a52905e remove trailing blanks
Jim Meyering <meyering@redhat.com>
parents: 9309
diff changeset
93 int long_opt_col; /* column in which long options start */
6484
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
94 int doc_opt_col; /* column in which doc options start */
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
95 int opt_doc_col; /* column in which option text starts */
10095
60ed1a52905e remove trailing blanks
Jim Meyering <meyering@redhat.com>
parents: 9309
diff changeset
96 int header_col; /* column in which group headers are printed */
6484
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
97 int usage_indent; /* indentation of wrapped usage lines */
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
98 int rmargin; /* right margin used for wrapping */
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
99
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
100 int valid; /* True when the values in here are valid. */
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
101 };
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
102
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
103 /* This is a global variable, as user options are only ever read once. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
104 static struct uparams uparams = {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
105 DUP_ARGS, DUP_ARGS_NOTE,
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
106 SHORT_OPT_COL, LONG_OPT_COL, DOC_OPT_COL, OPT_DOC_COL, HEADER_COL,
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
107 USAGE_INDENT, RMARGIN,
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
108 0
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
109 };
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
110
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
111 /* A particular uparam, and what the user name is. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
112 struct uparam_name
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
113 {
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
114 const char *name; /* User name. */
16235
18a38c9615f0 In commentary, do not use ` to quote.
Paul Eggert <eggert@cs.ucla.edu>
parents: 16234
diff changeset
115 int is_bool; /* Whether it's 'boolean'. */
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
116 size_t uparams_offs; /* Location of the (int) field in UPARAMS. */
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
117 };
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
118
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
119 /* The name-field mappings we know about. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
120 static const struct uparam_name uparam_names[] =
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
121 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
122 { "dup-args", 1, offsetof (struct uparams, dup_args) },
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
123 { "dup-args-note", 1, offsetof (struct uparams, dup_args_note) },
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
124 { "short-opt-col", 0, offsetof (struct uparams, short_opt_col) },
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
125 { "long-opt-col", 0, offsetof (struct uparams, long_opt_col) },
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
126 { "doc-opt-col", 0, offsetof (struct uparams, doc_opt_col) },
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
127 { "opt-doc-col", 0, offsetof (struct uparams, opt_doc_col) },
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
128 { "header-col", 0, offsetof (struct uparams, header_col) },
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
129 { "usage-indent", 0, offsetof (struct uparams, usage_indent) },
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
130 { "rmargin", 0, offsetof (struct uparams, rmargin) },
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
131 { 0 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
132 };
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
133
6484
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
134 static void
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
135 validate_uparams (const struct argp_state *state, struct uparams *upptr)
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
136 {
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
137 const struct uparam_name *up;
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
138
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
139 for (up = uparam_names; up->name; up++)
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
140 {
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
141 if (up->is_bool
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
142 || up->uparams_offs == offsetof (struct uparams, rmargin))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
143 continue;
6484
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
144 if (*(int *)((char *)upptr + up->uparams_offs) >= upptr->rmargin)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
145 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
146 __argp_failure (state, 0, 0,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
147 dgettext (state->root_argp->argp_domain,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
148 "\
6701
a8a962f83d04 (validate_uparams): Fix typo
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6577
diff changeset
149 ARGP_HELP_FMT: %s value is less than or equal to %s"),
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
150 "rmargin", up->name);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
151 return;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
152 }
6484
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
153 }
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
154 uparams = *upptr;
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
155 uparams.valid = 1;
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
156 }
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
157
16358
a712776b11ce maint: spelling fixes
Paul Eggert <eggert@cs.ucla.edu>
parents: 16235
diff changeset
158 /* Read user options from the environment, and fill in UPARAMS appropriately. */
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
159 static void
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
160 fill_in_uparams (const struct argp_state *state)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
161 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
162 const char *var = getenv ("ARGP_HELP_FMT");
6484
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
163 struct uparams new_params = uparams;
10095
60ed1a52905e remove trailing blanks
Jim Meyering <meyering@redhat.com>
parents: 9309
diff changeset
164
8506
04518e040836 Cast the argument of <ctype.h> functions to 'unsigned char'.
Bruno Haible <bruno@clisp.org>
parents: 7296
diff changeset
165 #define SKIPWS(p) do { while (isspace ((unsigned char) *p)) p++; } while (0);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
166
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
167 if (var)
6484
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
168 {
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
169 /* Parse var. */
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
170 while (*var)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
171 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
172 SKIPWS (var);
10095
60ed1a52905e remove trailing blanks
Jim Meyering <meyering@redhat.com>
parents: 9309
diff changeset
173
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
174 if (isalpha ((unsigned char) *var))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
175 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
176 size_t var_len;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
177 const struct uparam_name *un;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
178 int unspec = 0, val = 0;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
179 const char *arg = var;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
180
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
181 while (isalnum ((unsigned char) *arg) || *arg == '-' || *arg == '_')
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
182 arg++;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
183 var_len = arg - var;
10095
60ed1a52905e remove trailing blanks
Jim Meyering <meyering@redhat.com>
parents: 9309
diff changeset
184
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
185 SKIPWS (arg);
10095
60ed1a52905e remove trailing blanks
Jim Meyering <meyering@redhat.com>
parents: 9309
diff changeset
186
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
187 if (*arg == '\0' || *arg == ',')
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
188 unspec = 1;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
189 else if (*arg == '=')
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
190 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
191 arg++;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
192 SKIPWS (arg);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
193 }
10095
60ed1a52905e remove trailing blanks
Jim Meyering <meyering@redhat.com>
parents: 9309
diff changeset
194
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
195 if (unspec)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
196 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
197 if (var[0] == 'n' && var[1] == 'o' && var[2] == '-')
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
198 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
199 val = 0;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
200 var += 3;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
201 var_len -= 3;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
202 }
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
203 else
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
204 val = 1;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
205 }
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
206 else if (isdigit ((unsigned char) *arg))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
207 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
208 val = atoi (arg);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
209 while (isdigit ((unsigned char) *arg))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
210 arg++;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
211 SKIPWS (arg);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
212 }
10095
60ed1a52905e remove trailing blanks
Jim Meyering <meyering@redhat.com>
parents: 9309
diff changeset
213
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
214 for (un = uparam_names; un->name; un++)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
215 if (strlen (un->name) == var_len
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
216 && strncmp (var, un->name, var_len) == 0)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
217 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
218 if (unspec && !un->is_bool)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
219 __argp_failure (state, 0, 0,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
220 dgettext (state->root_argp->argp_domain,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
221 "\
6484
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
222 %.*s: ARGP_HELP_FMT parameter requires a value"),
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
223 (int) var_len, var);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
224 else if (val < 0)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
225 __argp_failure (state, 0, 0,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
226 dgettext (state->root_argp->argp_domain,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
227 "\
6484
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
228 %.*s: ARGP_HELP_FMT parameter must be positive"),
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
229 (int) var_len, var);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
230 else
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
231 *(int *)((char *)&new_params + un->uparams_offs) = val;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
232 break;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
233 }
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
234 if (! un->name)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
235 __argp_failure (state, 0, 0,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
236 dgettext (state->root_argp->argp_domain, "\
6484
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
237 %.*s: Unknown ARGP_HELP_FMT parameter"),
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
238 (int) var_len, var);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
239
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
240 var = arg;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
241 if (*var == ',')
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
242 var++;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
243 }
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
244 else if (*var)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
245 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
246 __argp_failure (state, 0, 0,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
247 dgettext (state->root_argp->argp_domain,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
248 "Garbage in ARGP_HELP_FMT: %s"), var);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
249 break;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
250 }
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
251 }
6484
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
252 validate_uparams (state, &new_params);
0346b7d45837 (fill_in_uparams): Check if the constructed
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6473
diff changeset
253 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
254 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
255
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
256 /* Returns true if OPT hasn't been marked invisible. Visibility only affects
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
257 whether OPT is displayed or used in sorting, not option shadowing. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
258 #define ovisible(opt) (! ((opt)->flags & OPTION_HIDDEN))
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
259
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
260 /* Returns true if OPT is an alias for an earlier option. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
261 #define oalias(opt) ((opt)->flags & OPTION_ALIAS)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
262
14774
70d101744577 maint: correct misuse of "a" and "an"
Jim Meyering <meyering@redhat.com>
parents: 14350
diff changeset
263 /* Returns true if OPT is a documentation-only entry. */
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
264 #define odoc(opt) ((opt)->flags & OPTION_DOC)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
265
5276
ce6b492917db (canon_doc_option): Fixed coredump if *name==NULL
Paul Eggert <eggert@cs.ucla.edu>
parents: 5187
diff changeset
266 /* Returns true if OPT should not be translated */
ce6b492917db (canon_doc_option): Fixed coredump if *name==NULL
Paul Eggert <eggert@cs.ucla.edu>
parents: 5187
diff changeset
267 #define onotrans(opt) ((opt)->flags & OPTION_NO_TRANS)
ce6b492917db (canon_doc_option): Fixed coredump if *name==NULL
Paul Eggert <eggert@cs.ucla.edu>
parents: 5187
diff changeset
268
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
269 /* Returns true if OPT is the end-of-list marker for a list of options. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
270 #define oend(opt) __option_is_end (opt)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
271
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
272 /* Returns true if OPT has a short option. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
273 #define oshort(opt) __option_is_short (opt)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
274
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
275 /*
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
276 The help format for a particular option is like:
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
277
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
278 -xARG, -yARG, --long1=ARG, --long2=ARG Documentation...
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
279
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
280 Where ARG will be omitted if there's no argument, for this option, or
16358
a712776b11ce maint: spelling fixes
Paul Eggert <eggert@cs.ucla.edu>
parents: 16235
diff changeset
281 will be surrounded by "[" and "]" appropriately if the argument is
a712776b11ce maint: spelling fixes
Paul Eggert <eggert@cs.ucla.edu>
parents: 16235
diff changeset
282 optional. The documentation string is word-wrapped appropriately, and if
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
283 the list of options is long enough, it will be started on a separate line.
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
284 If there are no short options for a given option, the first long option is
16358
a712776b11ce maint: spelling fixes
Paul Eggert <eggert@cs.ucla.edu>
parents: 16235
diff changeset
285 indented slightly in a way that's supposed to make most long options appear
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
286 to be in a separate column.
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
287
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
288 For example, the following output (from ps):
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
289
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
290 -p PID, --pid=PID List the process PID
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
291 --pgrp=PGRP List processes in the process group PGRP
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
292 -P, -x, --no-parent Include processes without parents
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
293 -Q, --all-fields Don't elide unusable fields (normally if there's
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
294 some reason ps can't print a field for any
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
295 process, it's removed from the output entirely)
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
296 -r, --reverse, --gratuitously-long-reverse-option
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
297 Reverse the order of any sort
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
298 --session[=SID] Add the processes from the session SID (which
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
299 defaults to the sid of the current process)
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
300
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
301 Here are some more options:
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
302 -f ZOT, --foonly=ZOT Glork a foonly
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
303 -z, --zaza Snit a zar
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
304
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
305 -?, --help Give this help list
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
306 --usage Give a short usage message
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
307 -V, --version Print program version
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
308
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
309 The struct argp_option array for the above could look like:
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
310
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
311 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
312 {"pid", 'p', "PID", 0, "List the process PID"},
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
313 {"pgrp", OPT_PGRP, "PGRP", 0, "List processes in the process group PGRP"},
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
314 {"no-parent", 'P', 0, 0, "Include processes without parents"},
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
315 {0, 'x', 0, OPTION_ALIAS},
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
316 {"all-fields",'Q', 0, 0, "Don't elide unusable fields (normally"
4536
3358eb550c86 Leave whitespace alone when importing, undoing that part of yesterday's
Paul Eggert <eggert@cs.ucla.edu>
parents: 4533
diff changeset
317 " if there's some reason ps can't"
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
318 " print a field for any process, it's"
4536
3358eb550c86 Leave whitespace alone when importing, undoing that part of yesterday's
Paul Eggert <eggert@cs.ucla.edu>
parents: 4533
diff changeset
319 " removed from the output entirely)" },
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
320 {"reverse", 'r', 0, 0, "Reverse the order of any sort"},
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
321 {"gratuitously-long-reverse-option", 0, 0, OPTION_ALIAS},
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
322 {"session", OPT_SESS, "SID", OPTION_ARG_OPTIONAL,
4536
3358eb550c86 Leave whitespace alone when importing, undoing that part of yesterday's
Paul Eggert <eggert@cs.ucla.edu>
parents: 4533
diff changeset
323 "Add the processes from the session"
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
324 " SID (which defaults to the sid of"
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
325 " the current process)" },
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
326
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
327 {0,0,0,0, "Here are some more options:"},
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
328 {"foonly", 'f', "ZOT", 0, "Glork a foonly"},
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
329 {"zaza", 'z', 0, 0, "Snit a zar"},
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
330
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
331 {0}
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
332 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
333
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
334 Note that the last three options are automatically supplied by argp_parse,
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
335 unless you tell it not to with ARGP_NO_HELP.
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
336
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
337 */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
338
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
339 /* Returns true if CH occurs between BEG and END. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
340 static int
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
341 find_char (char ch, char *beg, char *end)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
342 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
343 while (beg < end)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
344 if (*beg == ch)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
345 return 1;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
346 else
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
347 beg++;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
348 return 0;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
349 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
350
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
351 struct hol_cluster; /* fwd decl */
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
352
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
353 struct hol_entry
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
354 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
355 /* First option. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
356 const struct argp_option *opt;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
357 /* Number of options (including aliases). */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
358 unsigned num;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
359
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
360 /* A pointers into the HOL's short_options field, to the first short option
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
361 letter for this entry. The order of the characters following this point
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
362 corresponds to the order of options pointed to by OPT, and there are at
14775
a152da4489c4 maint: replace misused "a" with "an"
Jim Meyering <meyering@redhat.com>
parents: 14774
diff changeset
363 most NUM. A short option recorded in an option following OPT is only
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
364 valid if it occurs in the right place in SHORT_OPTIONS (otherwise it's
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
365 probably been shadowed by some other entry). */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
366 char *short_options;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
367
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
368 /* Entries are sorted by their group first, in the order:
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
369 1, 2, ..., n, 0, -m, ..., -2, -1
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
370 and then alphabetically within each group. The default is 0. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
371 int group;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
372
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
373 /* The cluster of options this entry belongs to, or 0 if none. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
374 struct hol_cluster *cluster;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
375
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
376 /* The argp from which this option came. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
377 const struct argp *argp;
8793
0d10c63d2bd3 (struct hol_entry): New member `ord'.
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 8764
diff changeset
378
0d10c63d2bd3 (struct hol_entry): New member `ord'.
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 8764
diff changeset
379 /* Position in the array */
0d10c63d2bd3 (struct hol_entry): New member `ord'.
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 8764
diff changeset
380 unsigned ord;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
381 };
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
382
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
383 /* A cluster of entries to reflect the argp tree structure. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
384 struct hol_cluster
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
385 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
386 /* A descriptive header printed before options in this cluster. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
387 const char *header;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
388
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
389 /* Used to order clusters within the same group with the same parent,
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
390 according to the order in which they occurred in the parent argp's child
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
391 list. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
392 int index;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
393
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
394 /* How to sort this cluster with respect to options and other clusters at the
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
395 same depth (clusters always follow options in the same group). */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
396 int group;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
397
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
398 /* The cluster to which this cluster belongs, or 0 if it's at the base
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
399 level. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
400 struct hol_cluster *parent;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
401
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
402 /* The argp from which this cluster is (eventually) derived. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
403 const struct argp *argp;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
404
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
405 /* The distance this cluster is from the root. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
406 int depth;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
407
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
408 /* Clusters in a given hol are kept in a linked list, to make freeing them
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
409 possible. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
410 struct hol_cluster *next;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
411 };
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
412
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
413 /* A list of options for help. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
414 struct hol
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
415 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
416 /* An array of hol_entry's. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
417 struct hol_entry *entries;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
418 /* The number of entries in this hol. If this field is zero, the others
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
419 are undefined. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
420 unsigned num_entries;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
421
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
422 /* A string containing all short options in this HOL. Each entry contains
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
423 pointers into this string, so the order can't be messed with blindly. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
424 char *short_options;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
425
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
426 /* Clusters of entries in this hol. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
427 struct hol_cluster *clusters;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
428 };
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
429
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
430 /* Create a struct hol from the options in ARGP. CLUSTER is the
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
431 hol_cluster in which these entries occur, or 0, if at the root. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
432 static struct hol *
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
433 make_hol (const struct argp *argp, struct hol_cluster *cluster)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
434 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
435 char *so;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
436 const struct argp_option *o;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
437 const struct argp_option *opts = argp->options;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
438 struct hol_entry *entry;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
439 unsigned num_short_options = 0;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
440 struct hol *hol = malloc (sizeof (struct hol));
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
441
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
442 assert (hol);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
443
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
444 hol->num_entries = 0;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
445 hol->clusters = 0;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
446
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
447 if (opts)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
448 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
449 int cur_group = 0;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
450
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
451 /* The first option must not be an alias. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
452 assert (! oalias (opts));
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
453
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
454 /* Calculate the space needed. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
455 for (o = opts; ! oend (o); o++)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
456 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
457 if (! oalias (o))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
458 hol->num_entries++;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
459 if (oshort (o))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
460 num_short_options++; /* This is an upper bound. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
461 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
462
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
463 hol->entries = malloc (sizeof (struct hol_entry) * hol->num_entries);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
464 hol->short_options = malloc (num_short_options + 1);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
465
5000
fb87c5f96c33 update from glibc
Karl Berry <karl@freefriends.org>
parents: 4888
diff changeset
466 assert (hol->entries && hol->short_options);
5161
24371bb8c5a8 (make_hol, hol_append): Don't assume that
Paul Eggert <eggert@cs.ucla.edu>
parents: 5067
diff changeset
467 if (SIZE_MAX <= UINT_MAX)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
468 assert (hol->num_entries <= SIZE_MAX / sizeof (struct hol_entry));
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
469
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
470 /* Fill in the entries. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
471 so = hol->short_options;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
472 for (o = opts, entry = hol->entries; ! oend (o); entry++)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
473 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
474 entry->opt = o;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
475 entry->num = 0;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
476 entry->short_options = so;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
477 entry->group = cur_group =
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
478 o->group
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
479 ? o->group
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
480 : ((!o->name && !o->key)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
481 ? cur_group + 1
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
482 : cur_group);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
483 entry->cluster = cluster;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
484 entry->argp = argp;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
485
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
486 do
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
487 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
488 entry->num++;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
489 if (oshort (o) && ! find_char (o->key, hol->short_options, so))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
490 /* O has a valid short option which hasn't already been used.*/
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
491 *so++ = o->key;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
492 o++;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
493 }
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
494 while (! oend (o) && oalias (o));
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
495 }
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
496 *so = '\0'; /* null terminated so we can find the length */
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
497 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
498
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
499 return hol;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
500 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
501
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
502 /* Add a new cluster to HOL, with the given GROUP and HEADER (taken from the
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
503 associated argp child list entry), INDEX, and PARENT, and return a pointer
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
504 to it. ARGP is the argp that this cluster results from. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
505 static struct hol_cluster *
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
506 hol_add_cluster (struct hol *hol, int group, const char *header, int index,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
507 struct hol_cluster *parent, const struct argp *argp)
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
508 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
509 struct hol_cluster *cl = malloc (sizeof (struct hol_cluster));
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
510 if (cl)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
511 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
512 cl->group = group;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
513 cl->header = header;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
514
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
515 cl->index = index;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
516 cl->parent = parent;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
517 cl->argp = argp;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
518 cl->depth = parent ? parent->depth + 1 : 0;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
519
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
520 cl->next = hol->clusters;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
521 hol->clusters = cl;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
522 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
523 return cl;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
524 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
525
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
526 /* Free HOL and any resources it uses. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
527 static void
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
528 hol_free (struct hol *hol)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
529 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
530 struct hol_cluster *cl = hol->clusters;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
531
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
532 while (cl)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
533 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
534 struct hol_cluster *next = cl->next;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
535 free (cl);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
536 cl = next;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
537 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
538
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
539 if (hol->num_entries > 0)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
540 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
541 free (hol->entries);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
542 free (hol->short_options);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
543 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
544
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
545 free (hol);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
546 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
547
4419
9b828c973b9d Get lib/argp* from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4385
diff changeset
548 static int
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
549 hol_entry_short_iterate (const struct hol_entry *entry,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
550 int (*func)(const struct argp_option *opt,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
551 const struct argp_option *real,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
552 const char *domain, void *cookie),
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
553 const char *domain, void *cookie)
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
554 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
555 unsigned nopts;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
556 int val = 0;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
557 const struct argp_option *opt, *real = entry->opt;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
558 char *so = entry->short_options;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
559
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
560 for (opt = real, nopts = entry->num; nopts > 0 && !val; opt++, nopts--)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
561 if (oshort (opt) && *so == opt->key)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
562 {
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
563 if (!oalias (opt))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
564 real = opt;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
565 if (ovisible (opt))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
566 val = (*func)(opt, real, domain, cookie);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
567 so++;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
568 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
569
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
570 return val;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
571 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
572
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
573 static inline int
14350
4cf3b58aaf12 Don't interfere with a program's definition of __attribute__.
Bruno Haible <bruno@clisp.org>
parents: 14079
diff changeset
574 #if __GNUC__ >= 3
4767
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
575 __attribute__ ((always_inline))
14350
4cf3b58aaf12 Don't interfere with a program's definition of __attribute__.
Bruno Haible <bruno@clisp.org>
parents: 14079
diff changeset
576 #endif
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
577 hol_entry_long_iterate (const struct hol_entry *entry,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
578 int (*func)(const struct argp_option *opt,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
579 const struct argp_option *real,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
580 const char *domain, void *cookie),
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
581 const char *domain, void *cookie)
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
582 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
583 unsigned nopts;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
584 int val = 0;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
585 const struct argp_option *opt, *real = entry->opt;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
586
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
587 for (opt = real, nopts = entry->num; nopts > 0 && !val; opt++, nopts--)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
588 if (opt->name)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
589 {
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
590 if (!oalias (opt))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
591 real = opt;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
592 if (ovisible (opt))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
593 val = (*func)(opt, real, domain, cookie);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
594 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
595
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
596 return val;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
597 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
598
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
599 /* Iterator that returns true for the first short option. */
9000
cee3977e16f7 (until_short): Remove `inline' qualifier.
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 8793
diff changeset
600 static int
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
601 until_short (const struct argp_option *opt, const struct argp_option *real,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
602 const char *domain, void *cookie)
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
603 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
604 return oshort (opt) ? opt->key : 0;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
605 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
606
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
607 /* Returns the first valid short option in ENTRY, or 0 if there is none. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
608 static char
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
609 hol_entry_first_short (const struct hol_entry *entry)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
610 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
611 return hol_entry_short_iterate (entry, until_short,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
612 entry->argp->argp_domain, 0);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
613 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
614
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
615 /* Returns the first valid long option in ENTRY, or 0 if there is none. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
616 static const char *
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
617 hol_entry_first_long (const struct hol_entry *entry)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
618 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
619 const struct argp_option *opt;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
620 unsigned num;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
621 for (opt = entry->opt, num = entry->num; num > 0; opt++, num--)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
622 if (opt->name && ovisible (opt))
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
623 return opt->name;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
624 return 0;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
625 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
626
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
627 /* Returns the entry in HOL with the long option name NAME, or 0 if there is
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
628 none. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
629 static struct hol_entry *
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
630 hol_find_entry (struct hol *hol, const char *name)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
631 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
632 struct hol_entry *entry = hol->entries;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
633 unsigned num_entries = hol->num_entries;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
634
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
635 while (num_entries-- > 0)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
636 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
637 const struct argp_option *opt = entry->opt;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
638 unsigned num_opts = entry->num;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
639
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
640 while (num_opts-- > 0)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
641 if (opt->name && ovisible (opt) && strcmp (opt->name, name) == 0)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
642 return entry;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
643 else
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
644 opt++;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
645
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
646 entry++;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
647 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
648
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
649 return 0;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
650 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
651
17415
6550127da196 argp: typo fix
Alexandre Duret-Lutz <adl@lrde.epita.fr>
parents: 17249
diff changeset
652 /* If an entry with the long option NAME occurs in HOL, set its special
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
653 sort position to GROUP. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
654 static void
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
655 hol_set_group (struct hol *hol, const char *name, int group)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
656 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
657 struct hol_entry *entry = hol_find_entry (hol, name);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
658 if (entry)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
659 entry->group = group;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
660 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
661
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
662 /* Order by group: 0, 1, 2, ..., n, -m, ..., -2, -1.
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
663 EQ is what to return if GROUP1 and GROUP2 are the same. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
664 static int
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
665 group_cmp (int group1, int group2, int eq)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
666 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
667 if (group1 == group2)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
668 return eq;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
669 else if ((group1 < 0 && group2 < 0) || (group1 >= 0 && group2 >= 0))
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
670 return group1 - group2;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
671 else
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
672 return group2 - group1;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
673 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
674
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
675 /* Compare clusters CL1 & CL2 by the order that they should appear in
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
676 output. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
677 static int
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
678 hol_cluster_cmp (const struct hol_cluster *cl1, const struct hol_cluster *cl2)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
679 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
680 /* If one cluster is deeper than the other, use its ancestor at the same
8756
8a62dff89d5a (hol_cluster_cmp): Reverse comparison. Change proposed by Sven Verdoolaege.
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 8506
diff changeset
681 level, so that finding the common ancestor is straightforward.
10095
60ed1a52905e remove trailing blanks
Jim Meyering <meyering@redhat.com>
parents: 9309
diff changeset
682
8756
8a62dff89d5a (hol_cluster_cmp): Reverse comparison. Change proposed by Sven Verdoolaege.
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 8506
diff changeset
683 clN->depth > 0 means that clN->parent != NULL (see hol_add_cluster) */
8a62dff89d5a (hol_cluster_cmp): Reverse comparison. Change proposed by Sven Verdoolaege.
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 8506
diff changeset
684 while (cl1->depth > cl2->depth)
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
685 cl1 = cl1->parent;
8756
8a62dff89d5a (hol_cluster_cmp): Reverse comparison. Change proposed by Sven Verdoolaege.
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 8506
diff changeset
686 while (cl2->depth > cl1->depth)
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
687 cl2 = cl2->parent;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
688
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
689 /* Now reduce both clusters to their ancestors at the point where both have
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
690 a common parent; these can be directly compared. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
691 while (cl1->parent != cl2->parent)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
692 cl1 = cl1->parent, cl2 = cl2->parent;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
693
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
694 return group_cmp (cl1->group, cl2->group, cl2->index - cl1->index);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
695 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
696
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
697 /* Return the ancestor of CL that's just below the root (i.e., has a parent
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
698 of 0). */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
699 static struct hol_cluster *
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
700 hol_cluster_base (struct hol_cluster *cl)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
701 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
702 while (cl->parent)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
703 cl = cl->parent;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
704 return cl;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
705 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
706
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
707 /* Return true if CL1 is a child of CL2. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
708 static int
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
709 hol_cluster_is_child (const struct hol_cluster *cl1,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
710 const struct hol_cluster *cl2)
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
711 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
712 while (cl1 && cl1 != cl2)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
713 cl1 = cl1->parent;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
714 return cl1 == cl2;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
715 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
716
14775
a152da4489c4 maint: replace misused "a" with "an"
Jim Meyering <meyering@redhat.com>
parents: 14774
diff changeset
717 /* Given the name of an OPTION_DOC option, modifies NAME to start at the tail
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
718 that should be used for comparisons, and returns true iff it should be
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
719 treated as a non-option. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
720 static int
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
721 canon_doc_option (const char **name)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
722 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
723 int non_opt;
5276
ce6b492917db (canon_doc_option): Fixed coredump if *name==NULL
Paul Eggert <eggert@cs.ucla.edu>
parents: 5187
diff changeset
724
ce6b492917db (canon_doc_option): Fixed coredump if *name==NULL
Paul Eggert <eggert@cs.ucla.edu>
parents: 5187
diff changeset
725 if (!*name)
ce6b492917db (canon_doc_option): Fixed coredump if *name==NULL
Paul Eggert <eggert@cs.ucla.edu>
parents: 5187
diff changeset
726 non_opt = 1;
ce6b492917db (canon_doc_option): Fixed coredump if *name==NULL
Paul Eggert <eggert@cs.ucla.edu>
parents: 5187
diff changeset
727 else
ce6b492917db (canon_doc_option): Fixed coredump if *name==NULL
Paul Eggert <eggert@cs.ucla.edu>
parents: 5187
diff changeset
728 {
ce6b492917db (canon_doc_option): Fixed coredump if *name==NULL
Paul Eggert <eggert@cs.ucla.edu>
parents: 5187
diff changeset
729 /* Skip initial whitespace. */
8506
04518e040836 Cast the argument of <ctype.h> functions to 'unsigned char'.
Bruno Haible <bruno@clisp.org>
parents: 7296
diff changeset
730 while (isspace ((unsigned char) **name))
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
731 (*name)++;
16235
18a38c9615f0 In commentary, do not use ` to quote.
Paul Eggert <eggert@cs.ucla.edu>
parents: 16234
diff changeset
732 /* Decide whether this looks like an option (leading '-') or not. */
5276
ce6b492917db (canon_doc_option): Fixed coredump if *name==NULL
Paul Eggert <eggert@cs.ucla.edu>
parents: 5187
diff changeset
733 non_opt = (**name != '-');
ce6b492917db (canon_doc_option): Fixed coredump if *name==NULL
Paul Eggert <eggert@cs.ucla.edu>
parents: 5187
diff changeset
734 /* Skip until part of name used for sorting. */
8506
04518e040836 Cast the argument of <ctype.h> functions to 'unsigned char'.
Bruno Haible <bruno@clisp.org>
parents: 7296
diff changeset
735 while (**name && !isalnum ((unsigned char) **name))
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
736 (*name)++;
5276
ce6b492917db (canon_doc_option): Fixed coredump if *name==NULL
Paul Eggert <eggert@cs.ucla.edu>
parents: 5187
diff changeset
737 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
738 return non_opt;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
739 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
740
8793
0d10c63d2bd3 (struct hol_entry): New member `ord'.
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 8764
diff changeset
741 #define HOL_ENTRY_PTRCMP(a,b) ((a)->ord < (b)->ord ? -1 : 1)
8764
b675774a0b22 (hol_entry_cmp): Option sorting algorithm
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 8756
diff changeset
742
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
743 /* Order ENTRY1 & ENTRY2 by the order which they should appear in a help
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
744 listing. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
745 static int
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
746 hol_entry_cmp (const struct hol_entry *entry1,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
747 const struct hol_entry *entry2)
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
748 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
749 /* The group numbers by which the entries should be ordered; if either is
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
750 in a cluster, then this is just the group within the cluster. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
751 int group1 = entry1->group, group2 = entry2->group;
8764
b675774a0b22 (hol_entry_cmp): Option sorting algorithm
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 8756
diff changeset
752 int rc;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
753
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
754 if (entry1->cluster != entry2->cluster)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
755 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
756 /* The entries are not within the same cluster, so we can't compare them
16358
a712776b11ce maint: spelling fixes
Paul Eggert <eggert@cs.ucla.edu>
parents: 16235
diff changeset
757 directly, we have to use the appropriate clustering level too. */
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
758 if (! entry1->cluster)
16235
18a38c9615f0 In commentary, do not use ` to quote.
Paul Eggert <eggert@cs.ucla.edu>
parents: 16234
diff changeset
759 /* ENTRY1 is at the "base level", not in a cluster, so we have to
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
760 compare it's group number with that of the base cluster in which
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
761 ENTRY2 resides. Note that if they're in the same group, the
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
762 clustered option always comes laster. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
763 return group_cmp (group1, hol_cluster_base (entry2->cluster)->group, -1);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
764 else if (! entry2->cluster)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
765 /* Likewise, but ENTRY2's not in a cluster. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
766 return group_cmp (hol_cluster_base (entry1->cluster)->group, group2, 1);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
767 else
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
768 /* Both entries are in clusters, we can just compare the clusters. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
769 return (rc = hol_cluster_cmp (entry1->cluster, entry2->cluster)) ?
13051
094f6cfdb5c3 Minor formatting changes.
Bruno Haible <bruno@clisp.org>
parents: 12559
diff changeset
770 rc : HOL_ENTRY_PTRCMP (entry1, entry2);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
771 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
772 else if (group1 == group2)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
773 /* The entries are both in the same cluster and group, so compare them
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
774 alphabetically. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
775 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
776 int short1 = hol_entry_first_short (entry1);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
777 int short2 = hol_entry_first_short (entry2);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
778 int doc1 = odoc (entry1->opt);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
779 int doc2 = odoc (entry2->opt);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
780 const char *long1 = hol_entry_first_long (entry1);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
781 const char *long2 = hol_entry_first_long (entry2);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
782
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
783 if (doc1)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
784 doc1 = canon_doc_option (&long1);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
785 if (doc2)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
786 doc2 = canon_doc_option (&long2);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
787
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
788 if (doc1 != doc2)
16235
18a38c9615f0 In commentary, do not use ` to quote.
Paul Eggert <eggert@cs.ucla.edu>
parents: 16234
diff changeset
789 /* "documentation" options always follow normal options (or
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
790 documentation options that *look* like normal options). */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
791 return doc1 - doc2;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
792 else if (!short1 && !short2 && long1 && long2)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
793 /* Only long options. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
794 return (rc = __strcasecmp (long1, long2)) ?
13051
094f6cfdb5c3 Minor formatting changes.
Bruno Haible <bruno@clisp.org>
parents: 12559
diff changeset
795 rc : HOL_ENTRY_PTRCMP (entry1, entry2);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
796 else
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
797 /* Compare short/short, long/short, short/long, using the first
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
798 character of long options. Entries without *any* valid
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
799 options (such as options with OPTION_HIDDEN set) will be put
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
800 first, but as they're not displayed, it doesn't matter where
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
801 they are. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
802 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
803 unsigned char first1 = short1 ? short1 : long1 ? *long1 : 0;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
804 unsigned char first2 = short2 ? short2 : long2 ? *long2 : 0;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
805 /* Use tolower, not _tolower, since only the former is
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
806 guaranteed to work on something already lower case. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
807 int lower_cmp = tolower (first1) - tolower (first2);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
808 /* Compare ignoring case, except when the options are both the
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
809 same letter, in which case lower-case always comes first. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
810 return lower_cmp ? lower_cmp :
13051
094f6cfdb5c3 Minor formatting changes.
Bruno Haible <bruno@clisp.org>
parents: 12559
diff changeset
811 (rc = first2 - first1) ?
094f6cfdb5c3 Minor formatting changes.
Bruno Haible <bruno@clisp.org>
parents: 12559
diff changeset
812 rc : HOL_ENTRY_PTRCMP (entry1, entry2);
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
813 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
814 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
815 else
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
816 /* Within the same cluster, but not the same group, so just compare
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
817 groups. */
13051
094f6cfdb5c3 Minor formatting changes.
Bruno Haible <bruno@clisp.org>
parents: 12559
diff changeset
818 return group_cmp (group1, group2, HOL_ENTRY_PTRCMP (entry1, entry2));
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
819 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
820
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
821 /* Version of hol_entry_cmp with correct signature for qsort. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
822 static int
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
823 hol_entry_qcmp (const void *entry1_v, const void *entry2_v)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
824 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
825 return hol_entry_cmp (entry1_v, entry2_v);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
826 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
827
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
828 /* Sort HOL by group and alphabetically by option name (with short options
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
829 taking precedence over long). Since the sorting is for display purposes
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
830 only, the shadowing of options isn't effected. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
831 static void
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
832 hol_sort (struct hol *hol)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
833 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
834 if (hol->num_entries > 0)
8793
0d10c63d2bd3 (struct hol_entry): New member `ord'.
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 8764
diff changeset
835 {
0d10c63d2bd3 (struct hol_entry): New member `ord'.
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 8764
diff changeset
836 unsigned i;
0d10c63d2bd3 (struct hol_entry): New member `ord'.
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 8764
diff changeset
837 struct hol_entry *e;
0d10c63d2bd3 (struct hol_entry): New member `ord'.
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 8764
diff changeset
838 for (i = 0, e = hol->entries; i < hol->num_entries; i++, e++)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
839 e->ord = i;
8793
0d10c63d2bd3 (struct hol_entry): New member `ord'.
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 8764
diff changeset
840 qsort (hol->entries, hol->num_entries, sizeof (struct hol_entry),
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
841 hol_entry_qcmp);
8793
0d10c63d2bd3 (struct hol_entry): New member `ord'.
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 8764
diff changeset
842 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
843 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
844
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
845 /* Append MORE to HOL, destroying MORE in the process. Options in HOL shadow
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
846 any in MORE with the same name. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
847 static void
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
848 hol_append (struct hol *hol, struct hol *more)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
849 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
850 struct hol_cluster **cl_end = &hol->clusters;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
851
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
852 /* Steal MORE's cluster list, and add it to the end of HOL's. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
853 while (*cl_end)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
854 cl_end = &(*cl_end)->next;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
855 *cl_end = more->clusters;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
856 more->clusters = 0;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
857
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
858 /* Merge entries. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
859 if (more->num_entries > 0)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
860 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
861 if (hol->num_entries == 0)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
862 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
863 hol->num_entries = more->num_entries;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
864 hol->entries = more->entries;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
865 hol->short_options = more->short_options;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
866 more->num_entries = 0; /* Mark MORE's fields as invalid. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
867 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
868 else
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
869 /* Append the entries in MORE to those in HOL, taking care to only add
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
870 non-shadowed SHORT_OPTIONS values. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
871 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
872 unsigned left;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
873 char *so, *more_so;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
874 struct hol_entry *e;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
875 unsigned num_entries = hol->num_entries + more->num_entries;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
876 struct hol_entry *entries =
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
877 malloc (num_entries * sizeof (struct hol_entry));
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
878 unsigned hol_so_len = strlen (hol->short_options);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
879 char *short_options =
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
880 malloc (hol_so_len + strlen (more->short_options) + 1);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
881
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
882 assert (entries && short_options);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
883 if (SIZE_MAX <= UINT_MAX)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
884 assert (num_entries <= SIZE_MAX / sizeof (struct hol_entry));
4736
60f76c3e517a updates from libc,automake
Karl Berry <karl@freefriends.org>
parents: 4536
diff changeset
885
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
886 __mempcpy (__mempcpy (entries, hol->entries,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
887 hol->num_entries * sizeof (struct hol_entry)),
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
888 more->entries,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
889 more->num_entries * sizeof (struct hol_entry));
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
890
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
891 __mempcpy (short_options, hol->short_options, hol_so_len);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
892
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
893 /* Fix up the short options pointers from HOL. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
894 for (e = entries, left = hol->num_entries; left > 0; e++, left--)
16135
a947b7cecbfe Avoid subtracting two pointers that don't point into the same block.
Matthew Wala <wala1@illinois.edu>
parents: 14838
diff changeset
895 e->short_options =
a947b7cecbfe Avoid subtracting two pointers that don't point into the same block.
Matthew Wala <wala1@illinois.edu>
parents: 14838
diff changeset
896 short_options + (e->short_options - hol->short_options);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
897
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
898 /* Now add the short options from MORE, fixing up its entries
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
899 too. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
900 so = short_options + hol_so_len;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
901 more_so = more->short_options;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
902 for (left = more->num_entries; left > 0; e++, left--)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
903 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
904 int opts_left;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
905 const struct argp_option *opt;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
906
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
907 e->short_options = so;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
908
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
909 for (opts_left = e->num, opt = e->opt; opts_left; opt++, opts_left--)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
910 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
911 int ch = *more_so;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
912 if (oshort (opt) && ch == opt->key)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
913 /* The next short option in MORE_SO, CH, is from OPT. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
914 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
915 if (! find_char (ch, short_options,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
916 short_options + hol_so_len))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
917 /* The short option CH isn't shadowed by HOL's options,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
918 so add it to the sum. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
919 *so++ = ch;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
920 more_so++;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
921 }
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
922 }
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
923 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
924
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
925 *so = '\0';
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
926
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
927 free (hol->entries);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
928 free (hol->short_options);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
929
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
930 hol->entries = entries;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
931 hol->num_entries = num_entries;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
932 hol->short_options = short_options;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
933 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
934 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
935
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
936 hol_free (more);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
937 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
938
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
939 /* Inserts enough spaces to make sure STREAM is at column COL. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
940 static void
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
941 indent_to (argp_fmtstream_t stream, unsigned col)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
942 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
943 int needed = col - __argp_fmtstream_point (stream);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
944 while (needed-- > 0)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
945 __argp_fmtstream_putc (stream, ' ');
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
946 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
947
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
948 /* Output to STREAM either a space, or a newline if there isn't room for at
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
949 least ENSURE characters before the right margin. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
950 static void
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
951 space (argp_fmtstream_t stream, size_t ensure)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
952 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
953 if (__argp_fmtstream_point (stream) + ensure
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
954 >= __argp_fmtstream_rmargin (stream))
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
955 __argp_fmtstream_putc (stream, '\n');
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
956 else
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
957 __argp_fmtstream_putc (stream, ' ');
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
958 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
959
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
960 /* If the option REAL has an argument, we print it in using the printf
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
961 format REQ_FMT or OPT_FMT depending on whether it's a required or
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
962 optional argument. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
963 static void
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
964 arg (const struct argp_option *real, const char *req_fmt, const char *opt_fmt,
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
965 const char *domain, argp_fmtstream_t stream)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
966 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
967 if (real->arg)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
968 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
969 if (real->flags & OPTION_ARG_OPTIONAL)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
970 __argp_fmtstream_printf (stream, opt_fmt,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
971 dgettext (domain, real->arg));
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
972 else
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
973 __argp_fmtstream_printf (stream, req_fmt,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
974 dgettext (domain, real->arg));
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
975 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
976 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
977
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
978 /* Helper functions for hol_entry_help. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
979
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
980 /* State used during the execution of hol_help. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
981 struct hol_help_state
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
982 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
983 /* PREV_ENTRY should contain the previous entry printed, or 0. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
984 struct hol_entry *prev_entry;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
985
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
986 /* If an entry is in a different group from the previous one, and SEP_GROUPS
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
987 is true, then a blank line will be printed before any output. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
988 int sep_groups;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
989
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
990 /* True if a duplicate option argument was suppressed (only ever set if
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
991 UPARAMS.dup_args is false). */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
992 int suppressed_dup_arg;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
993 };
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
994
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
995 /* Some state used while printing a help entry (used to communicate with
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
996 helper functions). See the doc for hol_entry_help for more info, as most
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
997 of the fields are copied from its arguments. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
998 struct pentry_state
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
999 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1000 const struct hol_entry *entry;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1001 argp_fmtstream_t stream;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1002 struct hol_help_state *hhstate;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1003
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1004 /* True if nothing's been printed so far. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1005 int first;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1006
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1007 /* If non-zero, the state that was used to print this help. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1008 const struct argp_state *state;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1009 };
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1010
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1011 /* If a user doc filter should be applied to DOC, do so. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1012 static const char *
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1013 filter_doc (const char *doc, int key, const struct argp *argp,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1014 const struct argp_state *state)
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1015 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1016 if (argp->help_filter)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1017 /* We must apply a user filter to this output. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1018 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1019 void *input = __argp_input (argp, state);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1020 return (*argp->help_filter) (key, doc, input);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1021 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1022 else
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1023 /* No filter. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1024 return doc;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1025 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1026
16358
a712776b11ce maint: spelling fixes
Paul Eggert <eggert@cs.ucla.edu>
parents: 16235
diff changeset
1027 /* Prints STR as a header line, with the margin lines set appropriately, and
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1028 notes the fact that groups should be separated with a blank line. ARGP is
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1029 the argp that should dictate any user doc filtering to take place. Note
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1030 that the previous wrap margin isn't restored, but the left margin is reset
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1031 to 0. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1032 static void
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1033 print_header (const char *str, const struct argp *argp,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1034 struct pentry_state *pest)
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1035 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1036 const char *tstr = dgettext (argp->argp_domain, str);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1037 const char *fstr = filter_doc (tstr, ARGP_KEY_HELP_HEADER, argp, pest->state);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1038
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1039 if (fstr)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1040 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1041 if (*fstr)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1042 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1043 if (pest->hhstate->prev_entry)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1044 /* Precede with a blank line. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1045 __argp_fmtstream_putc (pest->stream, '\n');
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1046 indent_to (pest->stream, uparams.header_col);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1047 __argp_fmtstream_set_lmargin (pest->stream, uparams.header_col);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1048 __argp_fmtstream_set_wmargin (pest->stream, uparams.header_col);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1049 __argp_fmtstream_puts (pest->stream, fstr);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1050 __argp_fmtstream_set_lmargin (pest->stream, 0);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1051 __argp_fmtstream_putc (pest->stream, '\n');
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1052 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1053
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1054 pest->hhstate->sep_groups = 1; /* Separate subsequent groups. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1055 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1056
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1057 if (fstr != tstr)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1058 free ((char *) fstr);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1059 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1060
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1061 /* Inserts a comma if this isn't the first item on the line, and then makes
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1062 sure we're at least to column COL. If this *is* the first item on a line,
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1063 prints any pending whitespace/headers that should precede this line. Also
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1064 clears FIRST. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1065 static void
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1066 comma (unsigned col, struct pentry_state *pest)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1067 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1068 if (pest->first)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1069 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1070 const struct hol_entry *pe = pest->hhstate->prev_entry;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1071 const struct hol_cluster *cl = pest->entry->cluster;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1072
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1073 if (pest->hhstate->sep_groups && pe && pest->entry->group != pe->group)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1074 __argp_fmtstream_putc (pest->stream, '\n');
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1075
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1076 if (cl && cl->header && *cl->header
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1077 && (!pe
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1078 || (pe->cluster != cl
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1079 && !hol_cluster_is_child (pe->cluster, cl))))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1080 /* If we're changing clusters, then this must be the start of the
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1081 ENTRY's cluster unless that is an ancestor of the previous one
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1082 (in which case we had just popped into a sub-cluster for a bit).
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1083 If so, then print the cluster's header line. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1084 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1085 int old_wm = __argp_fmtstream_wmargin (pest->stream);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1086 print_header (cl->header, cl->argp, pest);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1087 __argp_fmtstream_set_wmargin (pest->stream, old_wm);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1088 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1089
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1090 pest->first = 0;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1091 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1092 else
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1093 __argp_fmtstream_puts (pest->stream, ", ");
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1094
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1095 indent_to (pest->stream, col);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1096 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1097
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1098 /* Print help for ENTRY to STREAM. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1099 static void
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1100 hol_entry_help (struct hol_entry *entry, const struct argp_state *state,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1101 argp_fmtstream_t stream, struct hol_help_state *hhstate)
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1102 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1103 unsigned num;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1104 const struct argp_option *real = entry->opt, *opt;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1105 char *so = entry->short_options;
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1106 int have_long_opt = 0; /* We have any long options. */
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1107 /* Saved margins. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1108 int old_lm = __argp_fmtstream_set_lmargin (stream, 0);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1109 int old_wm = __argp_fmtstream_wmargin (stream);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1110 /* PEST is a state block holding some of our variables that we'd like to
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1111 share with helper functions. */
5616
468bfd52146d Avoid using non-constant initializers for struct pentry_state.
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 5276
diff changeset
1112 struct pentry_state pest;
468bfd52146d Avoid using non-constant initializers for struct pentry_state.
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 5276
diff changeset
1113
468bfd52146d Avoid using non-constant initializers for struct pentry_state.
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 5276
diff changeset
1114 pest.entry = entry;
468bfd52146d Avoid using non-constant initializers for struct pentry_state.
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 5276
diff changeset
1115 pest.stream = stream;
468bfd52146d Avoid using non-constant initializers for struct pentry_state.
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 5276
diff changeset
1116 pest.hhstate = hhstate;
468bfd52146d Avoid using non-constant initializers for struct pentry_state.
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 5276
diff changeset
1117 pest.first = 1;
468bfd52146d Avoid using non-constant initializers for struct pentry_state.
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 5276
diff changeset
1118 pest.state = state;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1119
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1120 if (! odoc (real))
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1121 for (opt = real, num = entry->num; num > 0; opt++, num--)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1122 if (opt->name && ovisible (opt))
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1123 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1124 have_long_opt = 1;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1125 break;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1126 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1127
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1128 /* First emit short options. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1129 __argp_fmtstream_set_wmargin (stream, uparams.short_opt_col); /* For truly bizarre cases. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1130 for (opt = real, num = entry->num; num > 0; opt++, num--)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1131 if (oshort (opt) && opt->key == *so)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1132 /* OPT has a valid (non shadowed) short option. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1133 {
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1134 if (ovisible (opt))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1135 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1136 comma (uparams.short_opt_col, &pest);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1137 __argp_fmtstream_putc (stream, '-');
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1138 __argp_fmtstream_putc (stream, *so);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1139 if (!have_long_opt || uparams.dup_args)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1140 arg (real, " %s", "[%s]", state->root_argp->argp_domain, stream);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1141 else if (real->arg)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1142 hhstate->suppressed_dup_arg = 1;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1143 }
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1144 so++;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1145 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1146
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1147 /* Now, long options. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1148 if (odoc (real))
16235
18a38c9615f0 In commentary, do not use ` to quote.
Paul Eggert <eggert@cs.ucla.edu>
parents: 16234
diff changeset
1149 /* A "documentation" option. */
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1150 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1151 __argp_fmtstream_set_wmargin (stream, uparams.doc_opt_col);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1152 for (opt = real, num = entry->num; num > 0; opt++, num--)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1153 if (opt->name && *opt->name && ovisible (opt))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1154 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1155 comma (uparams.doc_opt_col, &pest);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1156 /* Calling dgettext here isn't quite right, since sorting will
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1157 have been done on the original; but documentation options
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1158 should be pretty rare anyway... */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1159 __argp_fmtstream_puts (stream,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1160 onotrans (opt) ?
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1161 opt->name :
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1162 dgettext (state->root_argp->argp_domain,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1163 opt->name));
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1164 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1165 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1166 else
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1167 /* A real long option. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1168 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1169 int first_long_opt = 1;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1170
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1171 __argp_fmtstream_set_wmargin (stream, uparams.long_opt_col);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1172 for (opt = real, num = entry->num; num > 0; opt++, num--)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1173 if (opt->name && ovisible (opt))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1174 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1175 comma (uparams.long_opt_col, &pest);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1176 __argp_fmtstream_printf (stream, "--%s", opt->name);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1177 if (first_long_opt || uparams.dup_args)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1178 arg (real, "=%s", "[=%s]", state->root_argp->argp_domain,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1179 stream);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1180 else if (real->arg)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1181 hhstate->suppressed_dup_arg = 1;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1182 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1183 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1184
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1185 /* Next, documentation strings. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1186 __argp_fmtstream_set_lmargin (stream, 0);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1187
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1188 if (pest.first)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1189 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1190 /* Didn't print any switches, what's up? */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1191 if (!oshort (real) && !real->name)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1192 /* This is a group header, print it nicely. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1193 print_header (real->doc, entry->argp, &pest);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1194 else
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1195 /* Just a totally shadowed option or null header; print nothing. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1196 goto cleanup; /* Just return, after cleaning up. */
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1197 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1198 else
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1199 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1200 const char *tstr = real->doc ? dgettext (state->root_argp->argp_domain,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1201 real->doc) : 0;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1202 const char *fstr = filter_doc (tstr, real->key, entry->argp, state);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1203 if (fstr && *fstr)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1204 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1205 unsigned int col = __argp_fmtstream_point (stream);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1206
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1207 __argp_fmtstream_set_lmargin (stream, uparams.opt_doc_col);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1208 __argp_fmtstream_set_wmargin (stream, uparams.opt_doc_col);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1209
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1210 if (col > (unsigned int) (uparams.opt_doc_col + 3))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1211 __argp_fmtstream_putc (stream, '\n');
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1212 else if (col >= (unsigned int) uparams.opt_doc_col)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1213 __argp_fmtstream_puts (stream, " ");
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1214 else
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1215 indent_to (stream, uparams.opt_doc_col);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1216
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1217 __argp_fmtstream_puts (stream, fstr);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1218 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1219 if (fstr && fstr != tstr)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1220 free ((char *) fstr);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1221
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1222 /* Reset the left margin. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1223 __argp_fmtstream_set_lmargin (stream, 0);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1224 __argp_fmtstream_putc (stream, '\n');
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1225 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1226
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1227 hhstate->prev_entry = entry;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1228
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1229 cleanup:
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1230 __argp_fmtstream_set_lmargin (stream, old_lm);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1231 __argp_fmtstream_set_wmargin (stream, old_wm);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1232 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1233
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1234 /* Output a long help message about the options in HOL to STREAM. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1235 static void
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1236 hol_help (struct hol *hol, const struct argp_state *state,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1237 argp_fmtstream_t stream)
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1238 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1239 unsigned num;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1240 struct hol_entry *entry;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1241 struct hol_help_state hhstate = { 0, 0, 0 };
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1242
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1243 for (entry = hol->entries, num = hol->num_entries; num > 0; entry++, num--)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1244 hol_entry_help (entry, state, stream, &hhstate);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1245
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1246 if (hhstate.suppressed_dup_arg && uparams.dup_args_note)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1247 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1248 const char *tstr = dgettext (state->root_argp->argp_domain, "\
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1249 Mandatory or optional arguments to long options are also mandatory or \
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1250 optional for any corresponding short options.");
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1251 const char *fstr = filter_doc (tstr, ARGP_KEY_HELP_DUP_ARGS_NOTE,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1252 state ? state->root_argp : 0, state);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1253 if (fstr && *fstr)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1254 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1255 __argp_fmtstream_putc (stream, '\n');
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1256 __argp_fmtstream_puts (stream, fstr);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1257 __argp_fmtstream_putc (stream, '\n');
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1258 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1259 if (fstr && fstr != tstr)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1260 free ((char *) fstr);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1261 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1262 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1263
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1264 /* Helper functions for hol_usage. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1265
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1266 /* If OPT is a short option without an arg, append its key to the string
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1267 pointer pointer to by COOKIE, and advance the pointer. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1268 static int
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1269 add_argless_short_opt (const struct argp_option *opt,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1270 const struct argp_option *real,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1271 const char *domain, void *cookie)
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1272 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1273 char **snao_end = cookie;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1274 if (!(opt->arg || real->arg)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1275 && !((opt->flags | real->flags) & OPTION_NO_USAGE))
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1276 *(*snao_end)++ = opt->key;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1277 return 0;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1278 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1279
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1280 /* If OPT is a short option with an arg, output a usage entry for it to the
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1281 stream pointed at by COOKIE. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1282 static int
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1283 usage_argful_short_opt (const struct argp_option *opt,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1284 const struct argp_option *real,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1285 const char *domain, void *cookie)
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1286 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1287 argp_fmtstream_t stream = cookie;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1288 const char *arg = opt->arg;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1289 int flags = opt->flags | real->flags;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1290
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1291 if (! arg)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1292 arg = real->arg;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1293
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1294 if (arg && !(flags & OPTION_NO_USAGE))
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1295 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1296 arg = dgettext (domain, arg);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1297
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1298 if (flags & OPTION_ARG_OPTIONAL)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1299 __argp_fmtstream_printf (stream, " [-%c[%s]]", opt->key, arg);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1300 else
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1301 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1302 /* Manually do line wrapping so that it (probably) won't
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1303 get wrapped at the embedded space. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1304 space (stream, 6 + strlen (arg));
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1305 __argp_fmtstream_printf (stream, "[-%c %s]", opt->key, arg);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1306 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1307 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1308
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1309 return 0;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1310 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1311
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1312 /* Output a usage entry for the long option opt to the stream pointed at by
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1313 COOKIE. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1314 static int
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1315 usage_long_opt (const struct argp_option *opt,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1316 const struct argp_option *real,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1317 const char *domain, void *cookie)
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1318 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1319 argp_fmtstream_t stream = cookie;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1320 const char *arg = opt->arg;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1321 int flags = opt->flags | real->flags;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1322
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1323 if (! arg)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1324 arg = real->arg;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1325
6577
d41048afd9bb (usage_long_opt): Do not print DOC options.
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6484
diff changeset
1326 if (! (flags & OPTION_NO_USAGE) && !odoc (opt))
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1327 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1328 if (arg)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1329 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1330 arg = dgettext (domain, arg);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1331 if (flags & OPTION_ARG_OPTIONAL)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1332 __argp_fmtstream_printf (stream, " [--%s[=%s]]", opt->name, arg);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1333 else
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1334 __argp_fmtstream_printf (stream, " [--%s=%s]", opt->name, arg);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1335 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1336 else
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1337 __argp_fmtstream_printf (stream, " [--%s]", opt->name);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1338 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1339
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1340 return 0;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1341 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1342
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1343 /* Print a short usage description for the arguments in HOL to STREAM. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1344 static void
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1345 hol_usage (struct hol *hol, argp_fmtstream_t stream)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1346 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1347 if (hol->num_entries > 0)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1348 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1349 unsigned nentries;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1350 struct hol_entry *entry;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1351 char *short_no_arg_opts = alloca (strlen (hol->short_options) + 1);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1352 char *snao_end = short_no_arg_opts;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1353
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1354 /* First we put a list of short options without arguments. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1355 for (entry = hol->entries, nentries = hol->num_entries
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1356 ; nentries > 0
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1357 ; entry++, nentries--)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1358 hol_entry_short_iterate (entry, add_argless_short_opt,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1359 entry->argp->argp_domain, &snao_end);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1360 if (snao_end > short_no_arg_opts)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1361 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1362 *snao_end++ = 0;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1363 __argp_fmtstream_printf (stream, " [-%s]", short_no_arg_opts);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1364 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1365
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1366 /* Now a list of short options *with* arguments. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1367 for (entry = hol->entries, nentries = hol->num_entries
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1368 ; nentries > 0
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1369 ; entry++, nentries--)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1370 hol_entry_short_iterate (entry, usage_argful_short_opt,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1371 entry->argp->argp_domain, stream);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1372
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1373 /* Finally, a list of long options (whew!). */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1374 for (entry = hol->entries, nentries = hol->num_entries
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1375 ; nentries > 0
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1376 ; entry++, nentries--)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1377 hol_entry_long_iterate (entry, usage_long_opt,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1378 entry->argp->argp_domain, stream);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1379 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1380 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1381
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1382 /* Make a HOL containing all levels of options in ARGP. CLUSTER is the
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1383 cluster in which ARGP's entries should be clustered, or 0. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1384 static struct hol *
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1385 argp_hol (const struct argp *argp, struct hol_cluster *cluster)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1386 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1387 const struct argp_child *child = argp->children;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1388 struct hol *hol = make_hol (argp, cluster);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1389 if (child)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1390 while (child->argp)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1391 {
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1392 struct hol_cluster *child_cluster =
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1393 ((child->group || child->header)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1394 /* Put CHILD->argp within its own cluster. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1395 ? hol_add_cluster (hol, child->group, child->header,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1396 child - argp->children, cluster, argp)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1397 /* Just merge it into the parent's cluster. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1398 : cluster);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1399 hol_append (hol, argp_hol (child->argp, child_cluster)) ;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1400 child++;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1401 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1402 return hol;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1403 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1404
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1405 /* Calculate how many different levels with alternative args strings exist in
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1406 ARGP. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1407 static size_t
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1408 argp_args_levels (const struct argp *argp)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1409 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1410 size_t levels = 0;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1411 const struct argp_child *child = argp->children;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1412
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1413 if (argp->args_doc && strchr (argp->args_doc, '\n'))
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1414 levels++;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1415
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1416 if (child)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1417 while (child->argp)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1418 levels += argp_args_levels ((child++)->argp);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1419
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1420 return levels;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1421 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1422
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1423 /* Print all the non-option args documented in ARGP to STREAM. Any output is
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1424 preceded by a space. LEVELS is a pointer to a byte vector the length
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1425 returned by argp_args_levels; it should be initialized to zero, and
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1426 updated by this routine for the next call if ADVANCE is true. True is
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1427 returned as long as there are more patterns to output. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1428 static int
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1429 argp_args_usage (const struct argp *argp, const struct argp_state *state,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1430 char **levels, int advance, argp_fmtstream_t stream)
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1431 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1432 char *our_level = *levels;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1433 int multiple = 0;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1434 const struct argp_child *child = argp->children;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1435 const char *tdoc = dgettext (argp->argp_domain, argp->args_doc), *nl = 0;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1436 const char *fdoc = filter_doc (tdoc, ARGP_KEY_HELP_ARGS_DOC, argp, state);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1437
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1438 if (fdoc)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1439 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1440 const char *cp = fdoc;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1441 nl = __strchrnul (cp, '\n');
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1442 if (*nl != '\0')
16235
18a38c9615f0 In commentary, do not use ` to quote.
Paul Eggert <eggert@cs.ucla.edu>
parents: 16234
diff changeset
1443 /* This is a "multi-level" args doc; advance to the correct position
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1444 as determined by our state in LEVELS, and update LEVELS. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1445 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1446 int i;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1447 multiple = 1;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1448 for (i = 0; i < *our_level; i++)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1449 cp = nl + 1, nl = __strchrnul (cp, '\n');
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1450 (*levels)++;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1451 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1452
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1453 /* Manually do line wrapping so that it (probably) won't get wrapped at
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1454 any embedded spaces. */
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1455 space (stream, 1 + nl - cp);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1456
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1457 __argp_fmtstream_write (stream, cp, nl - cp);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1458 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1459 if (fdoc && fdoc != tdoc)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1460 free ((char *)fdoc); /* Free user's modified doc string. */
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1461
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1462 if (child)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1463 while (child->argp)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1464 advance = !argp_args_usage ((child++)->argp, state, levels, advance, stream);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1465
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1466 if (advance && multiple)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1467 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1468 /* Need to increment our level. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1469 if (*nl)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1470 /* There's more we can do here. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1471 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1472 (*our_level)++;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1473 advance = 0; /* Our parent shouldn't advance also. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1474 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1475 else if (*our_level > 0)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1476 /* We had multiple levels, but used them up; reset to zero. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1477 *our_level = 0;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1478 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1479
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1480 return !advance;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1481 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1482
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1483 /* Print the documentation for ARGP to STREAM; if POST is false, then
16358
a712776b11ce maint: spelling fixes
Paul Eggert <eggert@cs.ucla.edu>
parents: 16235
diff changeset
1484 everything preceding a '\v' character in the documentation strings (or
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1485 the whole string, for those with none) is printed, otherwise, everything
16235
18a38c9615f0 In commentary, do not use ` to quote.
Paul Eggert <eggert@cs.ucla.edu>
parents: 16234
diff changeset
1486 following the '\v' character (nothing for strings without). Each separate
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1487 bit of documentation is separated a blank line, and if PRE_BLANK is true,
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1488 then the first is as well. If FIRST_ONLY is true, only the first
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1489 occurrence is output. Returns true if anything was output. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1490 static int
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1491 argp_doc (const struct argp *argp, const struct argp_state *state,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1492 int post, int pre_blank, int first_only,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1493 argp_fmtstream_t stream)
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1494 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1495 const char *text;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1496 const char *inp_text;
7277
e6927185dbdf (argp_doc): Split the untranslated doc string on '\v',
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6701
diff changeset
1497 size_t inp_text_len = 0;
7280
52bafe778735 Make sure the string is always translated
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 7277
diff changeset
1498 const char *trans_text;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1499 void *input = 0;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1500 int anything = 0;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1501 const struct argp_child *child = argp->children;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1502
7277
e6927185dbdf (argp_doc): Split the untranslated doc string on '\v',
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6701
diff changeset
1503 if (argp->doc)
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1504 {
7277
e6927185dbdf (argp_doc): Split the untranslated doc string on '\v',
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6701
diff changeset
1505 char *vt = strchr (argp->doc, '\v');
e6927185dbdf (argp_doc): Split the untranslated doc string on '\v',
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6701
diff changeset
1506 if (vt)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1507 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1508 if (post)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1509 inp_text = vt + 1;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1510 else
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1511 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1512 inp_text_len = vt - argp->doc;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1513 inp_text = __strndup (argp->doc, inp_text_len);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1514 }
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1515 }
7277
e6927185dbdf (argp_doc): Split the untranslated doc string on '\v',
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6701
diff changeset
1516 else
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1517 inp_text = post ? 0 : argp->doc;
7296
33903d90fa2b (argp_doc): Make sure NULL is not passed to dgettext
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 7280
diff changeset
1518 trans_text = inp_text ? dgettext (argp->argp_domain, inp_text) : NULL;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1519 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1520 else
7280
52bafe778735 Make sure the string is always translated
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 7277
diff changeset
1521 trans_text = inp_text = 0;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1522
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1523 if (argp->help_filter)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1524 /* We have to filter the doc strings. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1525 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1526 input = __argp_input (argp, state);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1527 text =
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1528 (*argp->help_filter) (post
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1529 ? ARGP_KEY_HELP_POST_DOC
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1530 : ARGP_KEY_HELP_PRE_DOC,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1531 trans_text, input);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1532 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1533 else
7280
52bafe778735 Make sure the string is always translated
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 7277
diff changeset
1534 text = (const char *) trans_text;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1535
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1536 if (text)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1537 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1538 if (pre_blank)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1539 __argp_fmtstream_putc (stream, '\n');
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1540
7277
e6927185dbdf (argp_doc): Split the untranslated doc string on '\v',
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6701
diff changeset
1541 __argp_fmtstream_puts (stream, text);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1542
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1543 if (__argp_fmtstream_point (stream) > __argp_fmtstream_lmargin (stream))
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1544 __argp_fmtstream_putc (stream, '\n');
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1545
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1546 anything = 1;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1547 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1548
7280
52bafe778735 Make sure the string is always translated
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 7277
diff changeset
1549 if (text && text != trans_text)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1550 free ((char *) text); /* Free TEXT returned from the help filter. */
7277
e6927185dbdf (argp_doc): Split the untranslated doc string on '\v',
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6701
diff changeset
1551
e6927185dbdf (argp_doc): Split the untranslated doc string on '\v',
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6701
diff changeset
1552 if (inp_text && inp_text_len)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1553 free ((char *) inp_text); /* We copied INP_TEXT, so free it now. */
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1554
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1555 if (post && argp->help_filter)
14775
a152da4489c4 maint: replace misused "a" with "an"
Jim Meyering <meyering@redhat.com>
parents: 14774
diff changeset
1556 /* Now see if we have to output an ARGP_KEY_HELP_EXTRA text. */
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1557 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1558 text = (*argp->help_filter) (ARGP_KEY_HELP_EXTRA, 0, input);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1559 if (text)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1560 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1561 if (anything || pre_blank)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1562 __argp_fmtstream_putc (stream, '\n');
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1563 __argp_fmtstream_puts (stream, text);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1564 free ((char *) text);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1565 if (__argp_fmtstream_point (stream)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1566 > __argp_fmtstream_lmargin (stream))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1567 __argp_fmtstream_putc (stream, '\n');
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1568 anything = 1;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1569 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1570 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1571
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1572 if (child)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1573 while (child->argp && !(first_only && anything))
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1574 anything |=
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1575 argp_doc ((child++)->argp, state,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1576 post, anything || pre_blank, first_only,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1577 stream);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1578
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1579 return anything;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1580 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1581
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1582 /* Output a usage message for ARGP to STREAM. If called from
16358
a712776b11ce maint: spelling fixes
Paul Eggert <eggert@cs.ucla.edu>
parents: 16235
diff changeset
1583 argp_state_help, STATE is the relevant parsing state. FLAGS are from the
16235
18a38c9615f0 In commentary, do not use ` to quote.
Paul Eggert <eggert@cs.ucla.edu>
parents: 16234
diff changeset
1584 set ARGP_HELP_*. NAME is what to use wherever a "program name" is
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1585 needed. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1586 static void
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1587 _help (const struct argp *argp, const struct argp_state *state, FILE *stream,
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1588 unsigned flags, char *name)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1589 {
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1590 int anything = 0; /* Whether we've output anything. */
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1591 struct hol *hol = 0;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1592 argp_fmtstream_t fs;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1593
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1594 if (! stream)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1595 return;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1596
4767
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1597 #if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1598 __flockfile (stream);
4767
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1599 #endif
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1600
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1601 if (! uparams.valid)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1602 fill_in_uparams (state);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1603
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1604 fs = __argp_make_fmtstream (stream, 0, uparams.rmargin, 0);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1605 if (! fs)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1606 {
4767
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1607 #if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1608 __funlockfile (stream);
4767
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1609 #endif
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1610 return;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1611 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1612
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1613 if (flags & (ARGP_HELP_USAGE | ARGP_HELP_SHORT_USAGE | ARGP_HELP_LONG))
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1614 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1615 hol = argp_hol (argp, 0);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1616
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1617 /* If present, these options always come last. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1618 hol_set_group (hol, "help", -1);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1619 hol_set_group (hol, "version", -1);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1620
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1621 hol_sort (hol);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1622 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1623
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1624 if (flags & (ARGP_HELP_USAGE | ARGP_HELP_SHORT_USAGE))
16235
18a38c9615f0 In commentary, do not use ` to quote.
Paul Eggert <eggert@cs.ucla.edu>
parents: 16234
diff changeset
1625 /* Print a short "Usage:" message. */
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1626 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1627 int first_pattern = 1, more_patterns;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1628 size_t num_pattern_levels = argp_args_levels (argp);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1629 char *pattern_levels = alloca (num_pattern_levels);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1630
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1631 memset (pattern_levels, 0, num_pattern_levels);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1632
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1633 do
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1634 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1635 int old_lm;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1636 int old_wm = __argp_fmtstream_set_wmargin (fs, uparams.usage_indent);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1637 char *levels = pattern_levels;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1638
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1639 if (first_pattern)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1640 __argp_fmtstream_printf (fs, "%s %s",
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1641 dgettext (argp->argp_domain, "Usage:"),
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1642 name);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1643 else
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1644 __argp_fmtstream_printf (fs, "%s %s",
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1645 dgettext (argp->argp_domain, " or: "),
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1646 name);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1647
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1648 /* We set the lmargin as well as the wmargin, because hol_usage
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1649 manually wraps options with newline to avoid annoying breaks. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1650 old_lm = __argp_fmtstream_set_lmargin (fs, uparams.usage_indent);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1651
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1652 if (flags & ARGP_HELP_SHORT_USAGE)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1653 /* Just show where the options go. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1654 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1655 if (hol->num_entries > 0)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1656 __argp_fmtstream_puts (fs, dgettext (argp->argp_domain,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1657 " [OPTION...]"));
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1658 }
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1659 else
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1660 /* Actually print the options. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1661 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1662 hol_usage (hol, fs);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1663 flags |= ARGP_HELP_SHORT_USAGE; /* But only do so once. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1664 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1665
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1666 more_patterns = argp_args_usage (argp, state, &levels, 1, fs);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1667
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1668 __argp_fmtstream_set_wmargin (fs, old_wm);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1669 __argp_fmtstream_set_lmargin (fs, old_lm);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1670
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1671 __argp_fmtstream_putc (fs, '\n');
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1672 anything = 1;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1673
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1674 first_pattern = 0;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1675 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1676 while (more_patterns);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1677 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1678
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1679 if (flags & ARGP_HELP_PRE_DOC)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1680 anything |= argp_doc (argp, state, 0, 0, 1, fs);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1681
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1682 if (flags & ARGP_HELP_SEE)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1683 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1684 __argp_fmtstream_printf (fs, dgettext (argp->argp_domain, "\
16234
f9b906545e2f Use ', not `, for quoting output.
Paul Eggert <eggert@cs.ucla.edu>
parents: 16201
diff changeset
1685 Try '%s --help' or '%s --usage' for more information.\n"),
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1686 name, name);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1687 anything = 1;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1688 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1689
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1690 if (flags & ARGP_HELP_LONG)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1691 /* Print a long, detailed help message. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1692 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1693 /* Print info about all the options. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1694 if (hol->num_entries > 0)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1695 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1696 if (anything)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1697 __argp_fmtstream_putc (fs, '\n');
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1698 hol_help (hol, state, fs);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1699 anything = 1;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1700 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1701 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1702
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1703 if (flags & ARGP_HELP_POST_DOC)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1704 /* Print any documentation strings at the end. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1705 anything |= argp_doc (argp, state, 1, anything, 0, fs);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1706
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1707 if ((flags & ARGP_HELP_BUG_ADDR) && argp_program_bug_address)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1708 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1709 if (anything)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1710 __argp_fmtstream_putc (fs, '\n');
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1711 __argp_fmtstream_printf (fs, dgettext (argp->argp_domain,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1712 "Report bugs to %s.\n"),
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1713 argp_program_bug_address);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1714 anything = 1;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1715 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1716
4767
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1717 #if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1718 __funlockfile (stream);
4767
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1719 #endif
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1720
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1721 if (hol)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1722 hol_free (hol);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1723
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1724 __argp_fmtstream_free (fs);
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1725 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1726
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1727 /* Output a usage message for ARGP to STREAM. FLAGS are from the set
16235
18a38c9615f0 In commentary, do not use ` to quote.
Paul Eggert <eggert@cs.ucla.edu>
parents: 16234
diff changeset
1728 ARGP_HELP_*. NAME is what to use wherever a "program name" is needed. */
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1729 void __argp_help (const struct argp *argp, FILE *stream,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1730 unsigned flags, char *name)
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1731 {
5634
df0a8c05ca58 (__argp_help): Create a fake struct argp_state and
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 5620
diff changeset
1732 struct argp_state state;
df0a8c05ca58 (__argp_help): Create a fake struct argp_state and
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 5620
diff changeset
1733 memset (&state, 0, sizeof state);
df0a8c05ca58 (__argp_help): Create a fake struct argp_state and
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 5620
diff changeset
1734 state.root_argp = argp;
df0a8c05ca58 (__argp_help): Create a fake struct argp_state and
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 5620
diff changeset
1735 _help (argp, &state, stream, flags, name);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1736 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1737 #ifdef weak_alias
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1738 weak_alias (__argp_help, argp_help)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1739 #endif
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1740
5187
5cb548b39529 Use "gettext.h" instead of its complicated substitute.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5161
diff changeset
1741 #if ! (defined _LIBC || HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME)
4767
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1742 char *
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1743 __argp_short_program_name (void)
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1744 {
5187
5cb548b39529 Use "gettext.h" instead of its complicated substitute.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5161
diff changeset
1745 # if HAVE_DECL_PROGRAM_INVOCATION_NAME
6473
39f26cf09cc9 (__argp_base_name): New function
Sergey Poznyakoff <gray@gnu.org.ua>
parents: 6259
diff changeset
1746 return __argp_base_name (program_invocation_name);
4767
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1747 # else
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1748 /* FIXME: What now? Miles suggests that it is better to use NULL,
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1749 but currently the value is passed on directly to fputs_unlocked,
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1750 so that requires more changes. */
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1751 # if __GNUC__
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1752 # warning No reasonable value to return
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1753 # endif /* __GNUC__ */
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1754 return "";
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1755 # endif
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1756 }
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1757 #endif
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1758
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1759 /* Output, if appropriate, a usage message for STATE to STREAM. FLAGS are
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1760 from the set ARGP_HELP_*. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1761 void
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1762 __argp_state_help (const struct argp_state *state, FILE *stream, unsigned flags)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1763 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1764 if ((!state || ! (state->flags & ARGP_NO_ERRS)) && stream)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1765 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1766 if (state && (state->flags & ARGP_LONG_ONLY))
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1767 flags |= ARGP_HELP_LONG_ONLY;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1768
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1769 _help (state ? state->root_argp : 0, state, stream, flags,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1770 state ? state->name : __argp_short_program_name ());
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1771
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1772 if (!state || ! (state->flags & ARGP_NO_EXIT))
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1773 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1774 if (flags & ARGP_HELP_EXIT_ERR)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1775 exit (argp_err_exit_status);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1776 if (flags & ARGP_HELP_EXIT_OK)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1777 exit (0);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1778 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1779 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1780 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1781 #ifdef weak_alias
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1782 weak_alias (__argp_state_help, argp_state_help)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1783 #endif
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1784
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1785 /* If appropriate, print the printf string FMT and following args, preceded
16235
18a38c9615f0 In commentary, do not use ` to quote.
Paul Eggert <eggert@cs.ucla.edu>
parents: 16234
diff changeset
1786 by the program name and ':', to stderr, and followed by a "Try ... --help"
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1787 message, then exit (1). */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1788 void
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1789 __argp_error (const struct argp_state *state, const char *fmt, ...)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1790 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1791 if (!state || !(state->flags & ARGP_NO_ERRS))
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1792 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1793 FILE *stream = state ? state->err_stream : stderr;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1794
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1795 if (stream)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1796 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1797 va_list ap;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1798
4767
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1799 #if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1800 __flockfile (stream);
4767
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1801 #endif
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1802
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1803 va_start (ap, fmt);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1804
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1805 #ifdef USE_IN_LIBIO
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1806 if (_IO_fwide (stream, 0) > 0)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1807 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1808 char *buf;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1809
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1810 if (__asprintf (&buf, fmt, ap) < 0)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1811 buf = NULL;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1812
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1813 __fwprintf (stream, L"%s: %s\n",
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1814 state ? state->name : __argp_short_program_name (),
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1815 buf);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1816
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1817 free (buf);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1818 }
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1819 else
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1820 #endif
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1821 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1822 fputs_unlocked (state
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1823 ? state->name : __argp_short_program_name (),
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1824 stream);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1825 putc_unlocked (':', stream);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1826 putc_unlocked (' ', stream);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1827
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1828 vfprintf (stream, fmt, ap);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1829
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1830 putc_unlocked ('\n', stream);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1831 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1832
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1833 __argp_state_help (state, stream, ARGP_HELP_STD_ERR);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1834
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1835 va_end (ap);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1836
4767
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1837 #if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1838 __funlockfile (stream);
4767
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1839 #endif
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1840 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1841 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1842 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1843 #ifdef weak_alias
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1844 weak_alias (__argp_error, argp_error)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1845 #endif
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1846
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1847 /* Similar to the standard gnu error-reporting function error(), but will
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1848 respect the ARGP_NO_EXIT and ARGP_NO_ERRS flags in STATE, and will print
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1849 to STATE->err_stream. This is useful for argument parsing code that is
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1850 shared between program startup (when exiting is desired) and runtime
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1851 option parsing (when typically an error code is returned instead). The
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1852 difference between this function and argp_error is that the latter is for
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1853 *parsing errors*, and the former is for other problems that occur during
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1854 parsing but don't reflect a (syntactic) problem with the input. */
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1855 void
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1856 __argp_failure (const struct argp_state *state, int status, int errnum,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1857 const char *fmt, ...)
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1858 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1859 if (!state || !(state->flags & ARGP_NO_ERRS))
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1860 {
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1861 FILE *stream = state ? state->err_stream : stderr;
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1862
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1863 if (stream)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1864 {
4767
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1865 #if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1866 __flockfile (stream);
4767
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1867 #endif
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1868
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1869 #ifdef USE_IN_LIBIO
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1870 if (_IO_fwide (stream, 0) > 0)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1871 __fwprintf (stream, L"%s",
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1872 state ? state->name : __argp_short_program_name ());
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1873 else
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1874 #endif
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1875 fputs_unlocked (state
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1876 ? state->name : __argp_short_program_name (),
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1877 stream);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1878
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1879 if (fmt)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1880 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1881 va_list ap;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1882
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1883 va_start (ap, fmt);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1884 #ifdef USE_IN_LIBIO
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1885 if (_IO_fwide (stream, 0) > 0)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1886 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1887 char *buf;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1888
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1889 if (__asprintf (&buf, fmt, ap) < 0)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1890 buf = NULL;
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1891
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1892 __fwprintf (stream, L": %s", buf);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1893
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1894 free (buf);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1895 }
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1896 else
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1897 #endif
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1898 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1899 putc_unlocked (':', stream);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1900 putc_unlocked (' ', stream);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1901
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1902 vfprintf (stream, fmt, ap);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1903 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1904
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1905 va_end (ap);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1906 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1907
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1908 if (errnum)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1909 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1910 char buf[200];
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1911
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1912 #ifdef USE_IN_LIBIO
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1913 if (_IO_fwide (stream, 0) > 0)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1914 __fwprintf (stream, L": %s",
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1915 __strerror_r (errnum, buf, sizeof (buf)));
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1916 else
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1917 #endif
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1918 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1919 char const *s = NULL;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1920 putc_unlocked (':', stream);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1921 putc_unlocked (' ', stream);
14838
1d39813ecc60 argp: Allow coexistence with strerror_r-posix module.
Bruno Haible <bruno@clisp.org>
parents: 14775
diff changeset
1922 #if _LIBC || (HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P && !defined strerror_r)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1923 s = __strerror_r (errnum, buf, sizeof buf);
5187
5cb548b39529 Use "gettext.h" instead of its complicated substitute.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5161
diff changeset
1924 #elif HAVE_DECL_STRERROR_R
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1925 if (__strerror_r (errnum, buf, sizeof buf) == 0)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1926 s = buf;
4767
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1927 #endif
5187
5cb548b39529 Use "gettext.h" instead of its complicated substitute.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5161
diff changeset
1928 #if !_LIBC
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1929 if (! s && ! (s = strerror (errnum)))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1930 s = dgettext (state->root_argp->argp_domain,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1931 "Unknown system error");
5187
5cb548b39529 Use "gettext.h" instead of its complicated substitute.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5161
diff changeset
1932 #endif
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1933 fputs (s, stream);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1934 }
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1935 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1936
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1937 #ifdef USE_IN_LIBIO
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1938 if (_IO_fwide (stream, 0) > 0)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1939 putwc_unlocked (L'\n', stream);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1940 else
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1941 #endif
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1942 putc_unlocked ('\n', stream);
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1943
4767
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1944 #if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1945 __funlockfile (stream);
4767
0a9cf348c2ec argp update from libc
Karl Berry <karl@freefriends.org>
parents: 4736
diff changeset
1946 #endif
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1947
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1948 if (status && (!state || !(state->flags & ARGP_NO_EXIT)))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1949 exit (status);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12079
diff changeset
1950 }
4385
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1951 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1952 }
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1953 #ifdef weak_alias
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1954 weak_alias (__argp_failure, argp_failure)
1c170fb33fa6 argp facility from glibc-20030610.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1955 #endif