gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnurl] 94/411: tool: update --help with categories


From: gnunet
Subject: [gnurl] 94/411: tool: update --help with categories
Date: Wed, 13 Jan 2021 01:18:29 +0100

This is an automated email from the git hooks/post-receive script.

nikita pushed a commit to branch master
in repository gnurl.

commit aa8777f63febca6a13f6b86e141a832232560037
Author: Emil Engler <me@emilengler.com>
AuthorDate: Wed Sep 2 20:11:20 2020 +0200

    tool: update --help with categories
    
    This commit is a part of "--help me if you can"
    
    Closes #5680
---
 src/tool_cfgable.h  |   1 +
 src/tool_getparam.c |   1 +
 src/tool_help.c     | 842 +++++++++++++++++++++++++++++++++++++---------------
 src/tool_help.h     |   2 +-
 src/tool_operate.c  |   2 +-
 5 files changed, 602 insertions(+), 246 deletions(-)

diff --git a/src/tool_cfgable.h b/src/tool_cfgable.h
index a3b8dd51b..489f9ca0e 100644
--- a/src/tool_cfgable.h
+++ b/src/tool_cfgable.h
@@ -312,6 +312,7 @@ struct GlobalConfig {
   bool parallel;
   long parallel_max;
   bool parallel_connect;
+  char *help_category;            /* The help category, if set */
   struct OperationConfig *first;
   struct OperationConfig *current;
   struct OperationConfig *last;   /* Always last in the struct */
diff --git a/src/tool_getparam.c b/src/tool_getparam.c
index 64c988122..a884f4b38 100644
--- a/src/tool_getparam.c
+++ b/src/tool_getparam.c
@@ -1777,6 +1777,7 @@ ParameterError getparameter(const char *flag, /* f or 
-long-flag */
 
     case 'h': /* h for help */
       if(toggle) {
+        global->help_category = nextarg;
         return PARAM_HELP_REQUESTED;
       }
       /* we now actually support --no-help too! */
diff --git a/src/tool_help.c b/src/tool_help.c
index c8b2f52c9..54a37e6b2 100644
--- a/src/tool_help.c
+++ b/src/tool_help.c
@@ -35,6 +35,76 @@
 #  define USE_WATT32
 #endif
 
+/*
+ * The bitmask output is generated with the following command
+ ------------------------------------------------------------
+  cd $srcroot/docs/cmdline-opts
+  ./gen.pl listcats *.d
+ */
+
+#define CURLHELP_HIDDEN 1u << 0u
+#define CURLHELP_AUTH 1u << 1u
+#define CURLHELP_CONNECTION 1u << 2u
+#define CURLHELP_CURL 1u << 3u
+#define CURLHELP_DNS 1u << 4u
+#define CURLHELP_FILE 1u << 5u
+#define CURLHELP_FTP 1u << 6u
+#define CURLHELP_HTTP 1u << 7u
+#define CURLHELP_IMAP 1u << 8u
+#define CURLHELP_IMPORTANT 1u << 9u
+#define CURLHELP_MISC 1u << 10u
+#define CURLHELP_OUTPUT 1u << 11u
+#define CURLHELP_POP3 1u << 12u
+#define CURLHELP_POST 1u << 13u
+#define CURLHELP_PROXY 1u << 14u
+#define CURLHELP_SCP 1u << 15u
+#define CURLHELP_SFTP 1u << 16u
+#define CURLHELP_SMTP 1u << 17u
+#define CURLHELP_SSH 1u << 18u
+#define CURLHELP_TELNET 1u << 19u
+#define CURLHELP_TFTP 1u << 20u
+#define CURLHELP_TLS 1u << 21u
+#define CURLHELP_UPLOAD 1u << 22u
+#define CURLHELP_VERBOSE 1u << 23u
+
+typedef unsigned int curlhelp_t;
+
+struct category_descriptors {
+  const char *opt;
+  const char *desc;
+  curlhelp_t category;
+};
+
+static const struct category_descriptors categories[] = {
+  {"auth", "Different types of authentication methods", CURLHELP_AUTH},
+  {"connection", "Low level networking operations",
+   CURLHELP_CONNECTION},
+  {"curl", "The command line tool itself", CURLHELP_CURL},
+  {"dns", "General DNS options", CURLHELP_DNS},
+  {"file", "FILE protocol options", CURLHELP_FILE},
+  {"ftp", "FTP protocol options", CURLHELP_FTP},
+  {"http", "HTTP and HTTPS protocol options", CURLHELP_HTTP},
+  {"imap", "IMAP protocol options", CURLHELP_IMAP},
+  /* important is left out because it is the default help page */
+  {"misc", "Options that don't fit into any other category", CURLHELP_MISC},
+  {"output", "The output of curl", CURLHELP_OUTPUT},
+  {"pop3", "POP3 protocol options", CURLHELP_POP3},
+  {"post", "HTTP Post specific options", CURLHELP_POST},
+  {"proxy", "All options related to proxies", CURLHELP_PROXY},
+  {"scp", "SCP protocol options", CURLHELP_SCP},
+  {"sftp", "SFTP protocol options", CURLHELP_SFTP},
+  {"smtp", "SMTP protocol options", CURLHELP_SMTP},
+  {"ssh", "SSH protocol options", CURLHELP_SSH},
+  {"telnet", "TELNET protocol options", CURLHELP_TELNET},
+  {"tftp", "TFTP protocol options", CURLHELP_TFTP},
+  {"tls", "All TLS/SSL related options", CURLHELP_TLS},
+  {"upload", "All options for uploads",
+   CURLHELP_UPLOAD},
+  {"verbose", "Options related to any kind of command line output of curl",
+   CURLHELP_VERBOSE},
+  {NULL, NULL, CURLHELP_HIDDEN}
+};
+
 /*
  * The help output is generated with the following command
  ---------------------------------------------------------
@@ -46,479 +116,714 @@
 struct helptxt {
   const char *opt;
   const char *desc;
+  curlhelp_t categories;
 };
 
 
 static const struct helptxt helptext[] = {
   {"    --abstract-unix-socket <path>",
-   "Connect via abstract Unix domain socket"},
+   "Connect via abstract Unix domain socket",
+   CURLHELP_CONNECTION},
   {"    --alt-svc <file name>",
-   "Enable alt-svc with this cache file"},
+   "Enable alt-svc with this cache file",
+   CURLHELP_HTTP},
   {"    --anyauth",
-   "Pick any authentication method"},
+   "Pick any authentication method",
+   CURLHELP_HTTP | CURLHELP_PROXY | CURLHELP_AUTH},
   {"-a, --append",
-   "Append to target file when uploading"},
+   "Append to target file when uploading",
+   CURLHELP_FTP | CURLHELP_SFTP},
   {"    --basic",
-   "Use HTTP Basic Authentication"},
+   "Use HTTP Basic Authentication",
+   CURLHELP_AUTH},
   {"    --cacert <file>",
-   "CA certificate to verify peer against"},
+   "CA certificate to verify peer against",
+   CURLHELP_TLS},
   {"    --capath <dir>",
-   "CA directory to verify peer against"},
+   "CA directory to verify peer against",
+   CURLHELP_TLS},
   {"-E, --cert <certificate[:password]>",
-   "Client certificate file and password"},
+   "Client certificate file and password",
+   CURLHELP_TLS},
   {"    --cert-status",
-   "Verify the status of the server certificate"},
+   "Verify the status of the server certificate",
+   CURLHELP_TLS},
   {"    --cert-type <type>",
-   "Certificate type (DER/PEM/ENG)"},
+   "Certificate type (DER/PEM/ENG)",
+   CURLHELP_TLS},
   {"    --ciphers <list of ciphers>",
-   "SSL ciphers to use"},
+   "SSL ciphers to use",
+   CURLHELP_TLS},
   {"    --compressed",
-   "Request compressed response"},
+   "Request compressed response",
+   CURLHELP_HTTP},
   {"    --compressed-ssh",
-   "Enable SSH compression"},
+   "Enable SSH compression",
+   CURLHELP_SCP | CURLHELP_SSH},
   {"-K, --config <file>",
-   "Read config from a file"},
+   "Read config from a file",
+   CURLHELP_CURL},
   {"    --connect-timeout <seconds>",
-   "Maximum time allowed for connection"},
+   "Maximum time allowed for connection",
+   CURLHELP_CONNECTION},
   {"    --connect-to <HOST1:PORT1:HOST2:PORT2>",
-   "Connect to host"},
+   "Connect to host",
+   CURLHELP_CONNECTION},
   {"-C, --continue-at <offset>",
-   "Resumed transfer offset"},
+   "Resumed transfer offset",
+   CURLHELP_CONNECTION},
   {"-b, --cookie <data|filename>",
-   "Send cookies from string/file"},
+   "Send cookies from string/file",
+   CURLHELP_HTTP},
   {"-c, --cookie-jar <filename>",
-   "Write cookies to <filename> after operation"},
+   "Write cookies to <filename> after operation",
+   CURLHELP_HTTP},
   {"    --create-dirs",
-   "Create necessary local directory hierarchy"},
+   "Create necessary local directory hierarchy",
+   CURLHELP_CURL},
   {"    --crlf",
-   "Convert LF to CRLF in upload"},
+   "Convert LF to CRLF in upload",
+   CURLHELP_FTP | CURLHELP_SMTP},
   {"    --crlfile <file>",
-   "Get a CRL list in PEM format from the given file"},
+   "Get a CRL list in PEM format from the given file",
+   CURLHELP_TLS},
   {"    --curves <algorithm list>",
-   "(EC) TLS key exchange algorithm(s) to request "},
+   "(EC) TLS key exchange algorithm(s) to request",
+   CURLHELP_TLS},
   {"-d, --data <data>",
-   "HTTP POST data"},
+   "HTTP POST data",
+   CURLHELP_IMPORTANT | CURLHELP_HTTP | CURLHELP_POST | CURLHELP_UPLOAD},
   {"    --data-ascii <data>",
-   "HTTP POST ASCII data"},
+   "HTTP POST ASCII data",
+   CURLHELP_HTTP | CURLHELP_POST | CURLHELP_UPLOAD},
   {"    --data-binary <data>",
-   "HTTP POST binary data"},
+   "HTTP POST binary data",
+   CURLHELP_HTTP | CURLHELP_POST | CURLHELP_UPLOAD},
   {"    --data-raw <data>",
-   "HTTP POST data, '@' allowed"},
+   "HTTP POST data, '@' allowed",
+   CURLHELP_HTTP | CURLHELP_POST | CURLHELP_UPLOAD},
   {"    --data-urlencode <data>",
-   "HTTP POST data url encoded"},
+   "HTTP POST data url encoded",
+   CURLHELP_HTTP | CURLHELP_POST | CURLHELP_UPLOAD},
   {"    --delegation <LEVEL>",
-   "GSS-API delegation permission"},
+   "GSS-API delegation permission",
+   CURLHELP_MISC},
   {"    --digest",
-   "Use HTTP Digest Authentication"},
+   "Use HTTP Digest Authentication",
+   CURLHELP_PROXY | CURLHELP_AUTH | CURLHELP_HTTP},
   {"-q, --disable",
-   "Disable .curlrc"},
+   "Disable .curlrc",
+   CURLHELP_CURL},
   {"    --disable-eprt",
-   "Inhibit using EPRT or LPRT"},
+   "Inhibit using EPRT or LPRT",
+   CURLHELP_FTP},
   {"    --disable-epsv",
-   "Inhibit using EPSV"},
+   "Inhibit using EPSV",
+   CURLHELP_FTP},
   {"    --disallow-username-in-url",
-   "Disallow username in url"},
+   "Disallow username in url",
+   CURLHELP_CURL | CURLHELP_HTTP},
   {"    --dns-interface <interface>",
-   "Interface to use for DNS requests"},
+   "Interface to use for DNS requests",
+   CURLHELP_DNS},
   {"    --dns-ipv4-addr <address>",
-   "IPv4 address to use for DNS requests"},
+   "IPv4 address to use for DNS requests",
+   CURLHELP_DNS},
   {"    --dns-ipv6-addr <address>",
-   "IPv6 address to use for DNS requests"},
+   "IPv6 address to use for DNS requests",
+   CURLHELP_DNS},
   {"    --dns-servers <addresses>",
-   "DNS server addrs to use"},
+   "DNS server addrs to use",
+   CURLHELP_DNS},
   {"    --doh-url <URL>",
-   "Resolve host names over DOH"},
+   "Resolve host names over DOH",
+   CURLHELP_DNS},
   {"-D, --dump-header <filename>",
-   "Write the received headers to <filename>"},
+   "Write the received headers to <filename>",
+   CURLHELP_HTTP | CURLHELP_FTP},
   {"    --egd-file <file>",
-   "EGD socket path for random data"},
+   "EGD socket path for random data",
+   CURLHELP_TLS},
   {"    --engine <name>",
-   "Crypto engine to use"},
+   "Crypto engine to use",
+   CURLHELP_TLS},
   {"    --etag-compare <file>",
-   "Pass an ETag from a file as a custom header"},
+   "Pass an ETag from a file as a custom header",
+   CURLHELP_HTTP},
   {"    --etag-save <file>",
-   "Parse ETag from a request and save it to a file"},
+   "Parse ETag from a request and save it to a file",
+   CURLHELP_HTTP},
   {"    --expect100-timeout <seconds>",
-   "How long to wait for 100-continue"},
+   "How long to wait for 100-continue",
+   CURLHELP_HTTP},
   {"-f, --fail",
-   "Fail silently (no output at all) on HTTP errors"},
+   "Fail silently (no output at all) on HTTP errors",
+   CURLHELP_IMPORTANT | CURLHELP_HTTP},
   {"    --fail-early",
-   "Fail on first transfer error, do not continue"},
+   "Fail on first transfer error, do not continue",
+   CURLHELP_CURL},
   {"    --false-start",
-   "Enable TLS False Start"},
+   "Enable TLS False Start",
+   CURLHELP_TLS},
   {"-F, --form <name=content>",
-   "Specify multipart MIME data"},
+   "Specify multipart MIME data",
+   CURLHELP_HTTP | CURLHELP_UPLOAD},
   {"    --form-string <name=string>",
-   "Specify multipart MIME data"},
+   "Specify multipart MIME data",
+   CURLHELP_HTTP | CURLHELP_UPLOAD},
   {"    --ftp-account <data>",
-   "Account data string"},
+   "Account data string",
+   CURLHELP_FTP | CURLHELP_AUTH},
   {"    --ftp-alternative-to-user <command>",
-   "String to replace USER [name]"},
+   "String to replace USER [name]",
+   CURLHELP_FTP},
   {"    --ftp-create-dirs",
-   "Create the remote dirs if not present"},
+   "Create the remote dirs if not present",
+   CURLHELP_FTP | CURLHELP_SFTP | CURLHELP_CURL},
   {"    --ftp-method <method>",
-   "Control CWD usage"},
+   "Control CWD usage",
+   CURLHELP_FTP},
   {"    --ftp-pasv",
-   "Use PASV/EPSV instead of PORT"},
+   "Use PASV/EPSV instead of PORT",
+   CURLHELP_FTP},
   {"-P, --ftp-port <address>",
-   "Use PORT instead of PASV"},
+   "Use PORT instead of PASV",
+   CURLHELP_FTP},
   {"    --ftp-pret",
-   "Send PRET before PASV"},
+   "Send PRET before PASV",
+   CURLHELP_FTP},
   {"    --ftp-skip-pasv-ip",
-   "Skip the IP address for PASV"},
+   "Skip the IP address for PASV",
+   CURLHELP_FTP},
   {"    --ftp-ssl-ccc",
-   "Send CCC after authenticating"},
+   "Send CCC after authenticating",
+   CURLHELP_FTP | CURLHELP_TLS},
   {"    --ftp-ssl-ccc-mode <active/passive>",
-   "Set CCC mode"},
+   "Set CCC mode",
+   CURLHELP_FTP | CURLHELP_TLS},
   {"    --ftp-ssl-control",
-   "Require SSL/TLS for FTP login, clear for transfer"},
+   "Require SSL/TLS for FTP login, clear for transfer",
+   CURLHELP_FTP | CURLHELP_TLS},
   {"-G, --get",
-   "Put the post data in the URL and use GET"},
+   "Put the post data in the URL and use GET",
+   CURLHELP_HTTP | CURLHELP_UPLOAD},
   {"-g, --globoff",
-   "Disable URL sequences and ranges using {} and []"},
+   "Disable URL sequences and ranges using {} and []",
+   CURLHELP_CURL},
   {"    --happy-eyeballs-timeout-ms <milliseconds>",
-   "Time for IPv6 before trying IPv4"},
+   "Time for IPv6 before trying IPv4",
+   CURLHELP_CONNECTION},
   {"    --haproxy-protocol",
-   "Send HAProxy PROXY protocol v1 header"},
+   "Send HAProxy PROXY protocol v1 header",
+   CURLHELP_HTTP | CURLHELP_PROXY},
   {"-I, --head",
-   "Show document info only"},
+   "Show document info only",
+   CURLHELP_HTTP | CURLHELP_FTP | CURLHELP_FILE},
   {"-H, --header <header/@file>",
-   "Pass custom header(s) to server"},
-  {"-h, --help",
-   "This help text"},
+   "Pass custom header(s) to server",
+   CURLHELP_HTTP},
+  {"-h, --help <category>",
+   "Get help for commands",
+   CURLHELP_IMPORTANT | CURLHELP_CURL},
   {"    --hostpubmd5 <md5>",
-   "Acceptable MD5 hash of the host public key"},
+   "Acceptable MD5 hash of the host public key",
+   CURLHELP_SFTP | CURLHELP_SCP},
   {"    --http0.9",
-   "Allow HTTP 0.9 responses"},
+   "Allow HTTP 0.9 responses",
+   CURLHELP_HTTP},
   {"-0, --http1.0",
-   "Use HTTP 1.0"},
+   "Use HTTP 1.0",
+   CURLHELP_HTTP},
   {"    --http1.1",
-   "Use HTTP 1.1"},
+   "Use HTTP 1.1",
+   CURLHELP_HTTP},
   {"    --http2",
-   "Use HTTP 2"},
+   "Use HTTP 2",
+   CURLHELP_HTTP},
   {"    --http2-prior-knowledge",
-   "Use HTTP 2 without HTTP/1.1 Upgrade"},
+   "Use HTTP 2 without HTTP/1.1 Upgrade",
+   CURLHELP_HTTP},
   {"    --http3",
-   "Use HTTP v3"},
+   "Use HTTP v3",
+   CURLHELP_HTTP},
   {"    --ignore-content-length",
-   "Ignore the size of the remote resource"},
+   "Ignore the size of the remote resource",
+   CURLHELP_HTTP | CURLHELP_FTP},
   {"-i, --include",
-   "Include protocol response headers in the output"},
+   "Include protocol response headers in the output",
+   CURLHELP_IMPORTANT | CURLHELP_VERBOSE},
   {"-k, --insecure",
-   "Allow insecure server connections when using SSL"},
+   "Allow insecure server connections when using SSL",
+   CURLHELP_TLS},
   {"    --interface <name>",
-   "Use network INTERFACE (or address)"},
+   "Use network INTERFACE (or address)",
+   CURLHELP_CONNECTION},
   {"-4, --ipv4",
-   "Resolve names to IPv4 addresses"},
+   "Resolve names to IPv4 addresses",
+   CURLHELP_CONNECTION | CURLHELP_DNS},
   {"-6, --ipv6",
-   "Resolve names to IPv6 addresses"},
+   "Resolve names to IPv6 addresses",
+   CURLHELP_CONNECTION | CURLHELP_DNS},
   {"-j, --junk-session-cookies",
-   "Ignore session cookies read from file"},
+   "Ignore session cookies read from file",
+   CURLHELP_HTTP},
   {"    --keepalive-time <seconds>",
-   "Interval time for keepalive probes"},
+   "Interval time for keepalive probes",
+   CURLHELP_CONNECTION},
   {"    --key <key>",
-   "Private key file name"},
+   "Private key file name",
+   CURLHELP_TLS | CURLHELP_SSH},
   {"    --key-type <type>",
-   "Private key file type (DER/PEM/ENG)"},
+   "Private key file type (DER/PEM/ENG)",
+   CURLHELP_TLS},
   {"    --krb <level>",
-   "Enable Kerberos with security <level>"},
+   "Enable Kerberos with security <level>",
+   CURLHELP_FTP},
   {"    --libcurl <file>",
-   "Dump libcurl equivalent code of this command line"},
+   "Dump libcurl equivalent code of this command line",
+   CURLHELP_CURL},
   {"    --limit-rate <speed>",
-   "Limit transfer speed to RATE"},
+   "Limit transfer speed to RATE",
+   CURLHELP_CONNECTION},
   {"-l, --list-only",
-   "List only mode"},
+   "List only mode",
+   CURLHELP_FTP | CURLHELP_POP3},
   {"    --local-port <num/range>",
-   "Force use of RANGE for local port numbers"},
+   "Force use of RANGE for local port numbers",
+   CURLHELP_CONNECTION},
   {"-L, --location",
-   "Follow redirects"},
+   "Follow redirects",
+   CURLHELP_HTTP},
   {"    --location-trusted",
-   "Like --location, and send auth to other hosts"},
+   "Like --location, and send auth to other hosts",
+   CURLHELP_HTTP | CURLHELP_AUTH},
   {"    --login-options <options>",
-   "Server login options"},
+   "Server login options",
+   CURLHELP_IMAP | CURLHELP_POP3 | CURLHELP_SMTP | CURLHELP_AUTH},
   {"    --mail-auth <address>",
-   "Originator address of the original email"},
+   "Originator address of the original email",
+   CURLHELP_SMTP},
   {"    --mail-from <address>",
-   "Mail from this address"},
+   "Mail from this address",
+   CURLHELP_SMTP},
   {"    --mail-rcpt <address>",
-   "Mail to this address"},
+   "Mail to this address",
+   CURLHELP_SMTP},
   {"    --mail-rcpt-allowfails",
-   "Allow RCPT TO command to fail for some recipients"},
+   "Allow RCPT TO command to fail for some recipients",
+   CURLHELP_SMTP},
   {"-M, --manual",
-   "Display the full manual"},
+   "Display the full manual",
+   CURLHELP_CURL},
   {"    --max-filesize <bytes>",
-   "Maximum file size to download"},
+   "Maximum file size to download",
+   CURLHELP_CONNECTION},
   {"    --max-redirs <num>",
-   "Maximum number of redirects allowed"},
+   "Maximum number of redirects allowed",
+   CURLHELP_HTTP},
   {"-m, --max-time <seconds>",
-   "Maximum time allowed for the transfer"},
+   "Maximum time allowed for the transfer",
+   CURLHELP_CONNECTION},
   {"    --metalink",
-   "Process given URLs as metalink XML file"},
+   "Process given URLs as metalink XML file",
+   CURLHELP_MISC},
   {"    --negotiate",
-   "Use HTTP Negotiate (SPNEGO) authentication"},
+   "Use HTTP Negotiate (SPNEGO) authentication",
+   CURLHELP_AUTH | CURLHELP_HTTP},
   {"-n, --netrc",
-   "Must read .netrc for user name and password"},
+   "Must read .netrc for user name and password",
+   CURLHELP_CURL},
   {"    --netrc-file <filename>",
-   "Specify FILE for netrc"},
+   "Specify FILE for netrc",
+   CURLHELP_CURL},
   {"    --netrc-optional",
-   "Use either .netrc or URL"},
+   "Use either .netrc or URL",
+   CURLHELP_CURL},
   {"-:, --next",
-   "Make next URL use its separate set of options"},
+   "Make next URL use its separate set of options",
+   CURLHELP_CURL},
   {"    --no-alpn",
-   "Disable the ALPN TLS extension"},
+   "Disable the ALPN TLS extension",
+   CURLHELP_TLS | CURLHELP_HTTP},
   {"-N, --no-buffer",
-   "Disable buffering of the output stream"},
+   "Disable buffering of the output stream",
+   CURLHELP_CURL},
   {"    --no-keepalive",
-   "Disable TCP keepalive on the connection"},
+   "Disable TCP keepalive on the connection",
+   CURLHELP_CONNECTION},
   {"    --no-npn",
-   "Disable the NPN TLS extension"},
+   "Disable the NPN TLS extension",
+   CURLHELP_TLS | CURLHELP_HTTP},
   {"    --no-progress-meter",
-   "Do not show the progress meter"},
+   "Do not show the progress meter",
+   CURLHELP_VERBOSE},
   {"    --no-sessionid",
-   "Disable SSL session-ID reusing"},
+   "Disable SSL session-ID reusing",
+   CURLHELP_TLS},
   {"    --noproxy <no-proxy-list>",
-   "List of hosts which do not use proxy"},
+   "List of hosts which do not use proxy",
+   CURLHELP_PROXY},
   {"    --ntlm",
-   "Use HTTP NTLM authentication"},
+   "Use HTTP NTLM authentication",
+   CURLHELP_AUTH | CURLHELP_HTTP},
   {"    --ntlm-wb",
-   "Use HTTP NTLM authentication with winbind"},
+   "Use HTTP NTLM authentication with winbind",
+   CURLHELP_AUTH | CURLHELP_HTTP},
   {"    --oauth2-bearer <token>",
-   "OAuth 2 Bearer Token"},
+   "OAuth 2 Bearer Token",
+   CURLHELP_AUTH},
   {"-o, --output <file>",
-   "Write to file instead of stdout"},
+   "Write to file instead of stdout",
+   CURLHELP_IMPORTANT | CURLHELP_CURL},
   {"    --output-dir <dir>",
-   "Directory to save files in"},
+   "Directory to save files in",
+   CURLHELP_CURL},
   {"-Z, --parallel",
-   "Perform transfers in parallel"},
+   "Perform transfers in parallel",
+   CURLHELP_CONNECTION | CURLHELP_CURL},
   {"    --parallel-immediate",
-   "Do not wait for multiplexing (with --parallel)"},
+   "Do not wait for multiplexing (with --parallel)",
+   CURLHELP_CONNECTION | CURLHELP_CURL},
   {"    --parallel-max",
-   "Maximum concurrency for parallel transfers"},
+   "Maximum concurrency for parallel transfers",
+   CURLHELP_CONNECTION | CURLHELP_CURL},
   {"    --pass <phrase>",
-   "Pass phrase for the private key"},
+   "Pass phrase for the private key",
+   CURLHELP_SSH | CURLHELP_TLS | CURLHELP_AUTH},
   {"    --path-as-is",
-   "Do not squash .. sequences in URL path"},
+   "Do not squash .. sequences in URL path",
+   CURLHELP_CURL},
   {"    --pinnedpubkey <hashes>",
-   "FILE/HASHES Public key to verify peer against"},
+   "FILE/HASHES Public key to verify peer against",
+   CURLHELP_TLS},
   {"    --post301",
-   "Do not switch to GET after following a 301"},
+   "Do not switch to GET after following a 301",
+   CURLHELP_HTTP | CURLHELP_POST},
   {"    --post302",
-   "Do not switch to GET after following a 302"},
+   "Do not switch to GET after following a 302",
+   CURLHELP_HTTP | CURLHELP_POST},
   {"    --post303",
-   "Do not switch to GET after following a 303"},
+   "Do not switch to GET after following a 303",
+   CURLHELP_HTTP | CURLHELP_POST},
   {"    --preproxy [protocol://]host[:port]",
-   "Use this proxy first"},
+   "Use this proxy first",
+   CURLHELP_PROXY},
   {"-#, --progress-bar",
-   "Display transfer progress as a bar"},
+   "Display transfer progress as a bar",
+   CURLHELP_VERBOSE},
   {"    --proto <protocols>",
-   "Enable/disable PROTOCOLS"},
+   "Enable/disable PROTOCOLS",
+   CURLHELP_CONNECTION | CURLHELP_CURL},
   {"    --proto-default <protocol>",
-   "Use PROTOCOL for any URL missing a scheme"},
+   "Use PROTOCOL for any URL missing a scheme",
+   CURLHELP_CONNECTION | CURLHELP_CURL},
   {"    --proto-redir <protocols>",
-   "Enable/disable PROTOCOLS on redirect"},
+   "Enable/disable PROTOCOLS on redirect",
+   CURLHELP_CONNECTION | CURLHELP_CURL},
   {"-x, --proxy [protocol://]host[:port]",
-   "Use this proxy"},
+   "Use this proxy",
+   CURLHELP_PROXY},
   {"    --proxy-anyauth",
-   "Pick any proxy authentication method"},
+   "Pick any proxy authentication method",
+   CURLHELP_PROXY | CURLHELP_AUTH},
   {"    --proxy-basic",
-   "Use Basic authentication on the proxy"},
+   "Use Basic authentication on the proxy",
+   CURLHELP_PROXY | CURLHELP_AUTH},
   {"    --proxy-cacert <file>",
-   "CA certificate to verify peer against for proxy"},
+   "CA certificate to verify peer against for proxy",
+   CURLHELP_PROXY | CURLHELP_TLS},
   {"    --proxy-capath <dir>",
-   "CA directory to verify peer against for proxy"},
+   "CA directory to verify peer against for proxy",
+   CURLHELP_PROXY | CURLHELP_TLS},
   {"    --proxy-cert <cert[:passwd]>",
-   "Set client certificate for proxy"},
+   "Set client certificate for proxy",
+   CURLHELP_PROXY | CURLHELP_TLS},
   {"    --proxy-cert-type <type>",
-   "Client certificate type for HTTPS proxy"},
+   "Client certificate type for HTTPS proxy",
+   CURLHELP_PROXY | CURLHELP_TLS},
   {"    --proxy-ciphers <list>",
-   "SSL ciphers to use for proxy"},
+   "SSL ciphers to use for proxy",
+   CURLHELP_PROXY | CURLHELP_TLS},
   {"    --proxy-crlfile <file>",
-   "Set a CRL list for proxy"},
+   "Set a CRL list for proxy",
+   CURLHELP_PROXY | CURLHELP_TLS},
   {"    --proxy-digest",
-   "Use Digest authentication on the proxy"},
+   "Use Digest authentication on the proxy",
+   CURLHELP_PROXY | CURLHELP_TLS},
   {"    --proxy-header <header/@file>",
-   "Pass custom header(s) to proxy"},
+   "Pass custom header(s) to proxy",
+   CURLHELP_PROXY},
   {"    --proxy-insecure",
-   "Do HTTPS proxy connections without verifying the proxy"},
+   "Do HTTPS proxy connections without verifying the proxy",
+   CURLHELP_PROXY | CURLHELP_TLS},
   {"    --proxy-key <key>",
-   "Private key for HTTPS proxy"},
+   "Private key for HTTPS proxy",
+   CURLHELP_PROXY | CURLHELP_TLS},
   {"    --proxy-key-type <type>",
-   "Private key file type for proxy"},
+   "Private key file type for proxy",
+   CURLHELP_PROXY | CURLHELP_TLS},
   {"    --proxy-negotiate",
-   "Use HTTP Negotiate (SPNEGO) authentication on the proxy"},
+   "Use HTTP Negotiate (SPNEGO) authentication on the proxy",
+   CURLHELP_PROXY | CURLHELP_AUTH},
   {"    --proxy-ntlm",
-   "Use NTLM authentication on the proxy"},
+   "Use NTLM authentication on the proxy",
+   CURLHELP_PROXY | CURLHELP_AUTH},
   {"    --proxy-pass <phrase>",
-   "Pass phrase for the private key for HTTPS proxy"},
+   "Pass phrase for the private key for HTTPS proxy",
+   CURLHELP_PROXY | CURLHELP_TLS | CURLHELP_AUTH},
   {"    --proxy-pinnedpubkey <hashes>",
-   "FILE/HASHES public key to verify proxy with"},
+   "FILE/HASHES public key to verify proxy with",
+   CURLHELP_PROXY | CURLHELP_TLS},
   {"    --proxy-service-name <name>",
-   "SPNEGO proxy service name"},
+   "SPNEGO proxy service name",
+   CURLHELP_PROXY | CURLHELP_TLS},
   {"    --proxy-ssl-allow-beast",
-   "Allow security flaw for interop for HTTPS proxy"},
+   "Allow security flaw for interop for HTTPS proxy",
+   CURLHELP_PROXY | CURLHELP_TLS},
   {"    --proxy-tls13-ciphers <ciphersuite list>",
-   "TLS 1.3 proxy cipher suites"},
+   "TLS 1.3 proxy cipher suites",
+   CURLHELP_PROXY | CURLHELP_TLS},
   {"    --proxy-tlsauthtype <type>",
-   "TLS authentication type for HTTPS proxy"},
+   "TLS authentication type for HTTPS proxy",
+   CURLHELP_PROXY | CURLHELP_TLS | CURLHELP_AUTH},
   {"    --proxy-tlspassword <string>",
-   "TLS password for HTTPS proxy"},
+   "TLS password for HTTPS proxy",
+   CURLHELP_PROXY | CURLHELP_TLS | CURLHELP_AUTH},
   {"    --proxy-tlsuser <name>",
-   "TLS username for HTTPS proxy"},
+   "TLS username for HTTPS proxy",
+   CURLHELP_PROXY | CURLHELP_TLS | CURLHELP_AUTH},
   {"    --proxy-tlsv1",
-   "Use TLSv1 for HTTPS proxy"},
+   "Use TLSv1 for HTTPS proxy",
+   CURLHELP_PROXY | CURLHELP_TLS | CURLHELP_AUTH},
   {"-U, --proxy-user <user:password>",
-   "Proxy user and password"},
+   "Proxy user and password",
+   CURLHELP_PROXY | CURLHELP_AUTH},
   {"    --proxy1.0 <host[:port]>",
-   "Use HTTP/1.0 proxy on given port"},
+   "Use HTTP/1.0 proxy on given port",
+   CURLHELP_PROXY},
   {"-p, --proxytunnel",
-   "Operate through an HTTP proxy tunnel (using CONNECT)"},
+   "Operate through an HTTP proxy tunnel (using CONNECT)",
+   CURLHELP_PROXY},
   {"    --pubkey <key>",
-   "SSH Public key file name"},
+   "SSH Public key file name",
+   CURLHELP_SFTP | CURLHELP_SCP | CURLHELP_AUTH},
   {"-Q, --quote",
-   "Send command(s) to server before transfer"},
+   "Send command(s) to server before transfer",
+   CURLHELP_FTP | CURLHELP_SFTP},
   {"    --random-file <file>",
-   "File for reading random data from"},
+   "File for reading random data from",
+   CURLHELP_MISC},
   {"-r, --range <range>",
-   "Retrieve only the bytes within RANGE"},
+   "Retrieve only the bytes within RANGE",
+   CURLHELP_HTTP | CURLHELP_FTP | CURLHELP_SFTP | CURLHELP_FILE},
   {"    --raw",
-   "Do HTTP \"raw\"; no transfer decoding"},
+   "Do HTTP \"raw\"; no transfer decoding",
+   CURLHELP_HTTP},
   {"-e, --referer <URL>",
-   "Referrer URL"},
+   "Referrer URL",
+   CURLHELP_HTTP},
   {"-J, --remote-header-name",
-   "Use the header-provided filename"},
+   "Use the header-provided filename",
+   CURLHELP_OUTPUT},
   {"-O, --remote-name",
-   "Write output to a file named as the remote file"},
+   "Write output to a file named as the remote file",
+   CURLHELP_IMPORTANT | CURLHELP_OUTPUT},
   {"    --remote-name-all",
-   "Use the remote file name for all URLs"},
+   "Use the remote file name for all URLs",
+   CURLHELP_OUTPUT},
   {"-R, --remote-time",
-   "Set the remote file's time on the local output"},
+   "Set the remote file's time on the local output",
+   CURLHELP_OUTPUT},
   {"-X, --request <command>",
-   "Specify request command to use"},
+   "Specify request command to use",
+   CURLHELP_CONNECTION},
   {"    --request-target",
-   "Specify the target for this request"},
+   "Specify the target for this request",
+   CURLHELP_HTTP},
   {"    --resolve <host:port:addr[,addr]...>",
-   "Resolve the host+port to this address"},
+   "Resolve the host+port to this address",
+   CURLHELP_CONNECTION},
   {"    --retry <num>",
-   "Retry request if transient problems occur"},
+   "Retry request if transient problems occur",
+   CURLHELP_CURL},
   {"    --retry-all-errors",
-   "Retry all errors (use with --retry)"},
+   "Retry all errors (use with --retry)",
+   CURLHELP_CURL},
   {"    --retry-connrefused",
-   "Retry on connection refused (use with --retry)"},
+   "Retry on connection refused (use with --retry)",
+   CURLHELP_CURL},
   {"    --retry-delay <seconds>",
-   "Wait time between retries"},
+   "Wait time between retries",
+   CURLHELP_CURL},
   {"    --retry-max-time <seconds>",
-   "Retry only within this period"},
+   "Retry only within this period",
+   CURLHELP_CURL},
   {"    --sasl-authzid <identity>",
-   "Identity for SASL PLAIN authentication"},
+   "Identity for SASL PLAIN authentication",
+   CURLHELP_AUTH},
   {"    --sasl-ir",
-   "Enable initial response in SASL authentication"},
+   "Enable initial response in SASL authentication",
+   CURLHELP_AUTH},
   {"    --service-name <name>",
-   "SPNEGO service name"},
+   "SPNEGO service name",
+   CURLHELP_MISC},
   {"-S, --show-error",
-   "Show error even when -s is used"},
+   "Show error even when -s is used",
+   CURLHELP_CURL},
   {"-s, --silent",
-   "Silent mode"},
+   "Silent mode",
+   CURLHELP_IMPORTANT | CURLHELP_VERBOSE},
   {"    --socks4 <host[:port]>",
-   "SOCKS4 proxy on given host + port"},
+   "SOCKS4 proxy on given host + port",
+   CURLHELP_PROXY},
   {"    --socks4a <host[:port]>",
-   "SOCKS4a proxy on given host + port"},
+   "SOCKS4a proxy on given host + port",
+   CURLHELP_PROXY},
   {"    --socks5 <host[:port]>",
-   "SOCKS5 proxy on given host + port"},
+   "SOCKS5 proxy on given host + port",
+   CURLHELP_PROXY},
   {"    --socks5-basic",
-   "Enable username/password auth for SOCKS5 proxies"},
+   "Enable username/password auth for SOCKS5 proxies",
+   CURLHELP_PROXY | CURLHELP_AUTH},
   {"    --socks5-gssapi",
-   "Enable GSS-API auth for SOCKS5 proxies"},
+   "Enable GSS-API auth for SOCKS5 proxies",
+   CURLHELP_PROXY | CURLHELP_AUTH},
   {"    --socks5-gssapi-nec",
-   "Compatibility with NEC SOCKS5 server"},
+   "Compatibility with NEC SOCKS5 server",
+   CURLHELP_PROXY | CURLHELP_AUTH},
   {"    --socks5-gssapi-service <name>",
-   "SOCKS5 proxy service name for GSS-API"},
+   "SOCKS5 proxy service name for GSS-API",
+   CURLHELP_PROXY | CURLHELP_AUTH},
   {"    --socks5-hostname <host[:port]>",
-   "SOCKS5 proxy, pass host name to proxy"},
+   "SOCKS5 proxy, pass host name to proxy",
+   CURLHELP_PROXY},
   {"-Y, --speed-limit <speed>",
-   "Stop transfers slower than this"},
+   "Stop transfers slower than this",
+   CURLHELP_CONNECTION},
   {"-y, --speed-time <seconds>",
-   "Trigger 'speed-limit' abort after this time"},
+   "Trigger 'speed-limit' abort after this time",
+   CURLHELP_CONNECTION},
   {"    --ssl",
-   "Try SSL/TLS"},
+   "Try SSL/TLS",
+   CURLHELP_TLS},
   {"    --ssl-allow-beast",
-   "Allow security flaw to improve interop"},
+   "Allow security flaw to improve interop",
+   CURLHELP_TLS},
   {"    --ssl-no-revoke",
-   "Disable cert revocation checks (Schannel)"},
+   "Disable cert revocation checks (Schannel)",
+   CURLHELP_TLS},
   {"    --ssl-reqd",
-   "Require SSL/TLS"},
+   "Require SSL/TLS",
+   CURLHELP_TLS},
   {"    --ssl-revoke-best-effort",
-   "Ignore missing/offline cert CRL dist points"},
+   "Ignore missing/offline cert CRL dist points",
+   CURLHELP_TLS},
   {"-2, --sslv2",
-   "Use SSLv2"},
+   "Use SSLv2",
+   CURLHELP_TLS},
   {"-3, --sslv3",
-   "Use SSLv3"},
+   "Use SSLv3",
+   CURLHELP_TLS},
   {"    --stderr",
-   "Where to redirect stderr"},
+   "Where to redirect stderr",
+   CURLHELP_VERBOSE},
   {"    --styled-output",
-   "Enable styled output for HTTP headers"},
+   "Enable styled output for HTTP headers",
+   CURLHELP_VERBOSE},
   {"    --suppress-connect-headers",
-   "Suppress proxy CONNECT response headers"},
+   "Suppress proxy CONNECT response headers",
+   CURLHELP_MISC},
   {"    --tcp-fastopen",
-   "Use TCP Fast Open"},
+   "Use TCP Fast Open",
+   CURLHELP_CONNECTION},
   {"    --tcp-nodelay",
-   "Use the TCP_NODELAY option"},
+   "Use the TCP_NODELAY option",
+   CURLHELP_CONNECTION},
   {"-t, --telnet-option <opt=val>",
-   "Set telnet option"},
+   "Set telnet option",
+   CURLHELP_TELNET},
   {"    --tftp-blksize <value>",
-   "Set TFTP BLKSIZE option"},
+   "Set TFTP BLKSIZE option",
+   CURLHELP_TFTP},
   {"    --tftp-no-options",
-   "Do not send any TFTP options"},
+   "Do not send any TFTP options",
+   CURLHELP_TFTP},
   {"-z, --time-cond <time>",
-   "Transfer based on a time condition"},
+   "Transfer based on a time condition",
+   CURLHELP_HTTP | CURLHELP_FTP},
   {"    --tls-max <VERSION>",
-   "Set maximum allowed TLS version"},
+   "Set maximum allowed TLS version",
+   CURLHELP_TLS},
   {"    --tls13-ciphers <ciphersuite list>",
-   "TLS 1.3 cipher suites to use"},
+   "TLS 1.3 cipher suites to use",
+   CURLHELP_TLS},
   {"    --tlsauthtype <type>",
-   "TLS authentication type"},
+   "TLS authentication type",
+   CURLHELP_TLS | CURLHELP_AUTH},
   {"    --tlspassword",
-   "TLS password"},
+   "TLS password",
+   CURLHELP_TLS | CURLHELP_AUTH},
   {"    --tlsuser <name>",
-   "TLS user name"},
+   "TLS user name",
+   CURLHELP_TLS | CURLHELP_AUTH},
   {"-1, --tlsv1",
-   "Use TLSv1.0 or greater"},
+   "Use TLSv1.0 or greater",
+   CURLHELP_TLS},
   {"    --tlsv1.0",
-   "Use TLSv1.0 or greater"},
+   "Use TLSv1.0 or greater",
+   CURLHELP_TLS},
   {"    --tlsv1.1",
-   "Use TLSv1.1 or greater"},
+   "Use TLSv1.1 or greater",
+   CURLHELP_TLS},
   {"    --tlsv1.2",
-   "Use TLSv1.2 or greater"},
+   "Use TLSv1.2 or greater",
+   CURLHELP_TLS},
   {"    --tlsv1.3",
-   "Use TLSv1.3 or greater"},
+   "Use TLSv1.3 or greater",
+   CURLHELP_TLS},
   {"    --tr-encoding",
-   "Request compressed transfer encoding"},
+   "Request compressed transfer encoding",
+   CURLHELP_HTTP},
   {"    --trace <file>",
-   "Write a debug trace to FILE"},
+   "Write a debug trace to FILE",
+   CURLHELP_VERBOSE},
   {"    --trace-ascii <file>",
-   "Like --trace, but without hex output"},
+   "Like --trace, but without hex output",
+   CURLHELP_VERBOSE},
   {"    --trace-time",
-   "Add time stamps to trace/verbose output"},
+   "Add time stamps to trace/verbose output",
+   CURLHELP_VERBOSE},
   {"    --unix-socket <path>",
-   "Connect through this Unix domain socket"},
+   "Connect through this Unix domain socket",
+   CURLHELP_CONNECTION},
   {"-T, --upload-file <file>",
-   "Transfer local FILE to destination"},
+   "Transfer local FILE to destination",
+   CURLHELP_IMPORTANT | CURLHELP_UPLOAD},
   {"    --url <url>",
-   "URL to work with"},
+   "URL to work with",
+   CURLHELP_CURL},
   {"-B, --use-ascii",
-   "Use ASCII/text transfer"},
+   "Use ASCII/text transfer",
+   CURLHELP_MISC},
   {"-u, --user <user:password>",
-   "Server user and password"},
+   "Server user and password",
+   CURLHELP_IMPORTANT | CURLHELP_AUTH},
   {"-A, --user-agent <name>",
-   "Send User-Agent <name> to server"},
+   "Send User-Agent <name> to server",
+   CURLHELP_IMPORTANT | CURLHELP_HTTP},
   {"-v, --verbose",
-   "Make the operation more talkative"},
+   "Make the operation more talkative",
+   CURLHELP_IMPORTANT | CURLHELP_VERBOSE},
   {"-V, --version",
-   "Show version number and quit"},
+   "Show version number and quit",
+   CURLHELP_IMPORTANT | CURLHELP_CURL},
   {"-w, --write-out <format>",
-   "Use output FORMAT after completion"},
+   "Use output FORMAT after completion",
+   CURLHELP_VERBOSE},
   {"    --xattr",
-   "Store metadata in extended file attributes"},
-  { NULL, NULL }
+   "Store metadata in extended file attributes",
+   CURLHELP_MISC},
+  { NULL, NULL, CURLHELP_HIDDEN }
 };
 
 #ifdef NETWARE
@@ -563,16 +868,65 @@ static const struct feat feats[] = {
   {"alt-svc",        CURL_VERSION_ALTSVC},
 };
 
-void tool_help(void)
+static void print_category(curlhelp_t category)
+{
+  unsigned int i;
+  for(i = 0; helptext[i].opt; ++i)
+    if(helptext[i].categories & category) {
+      printf(" %-19s %s\n", helptext[i].opt, helptext[i].desc);
+    }
+}
+
+/* Prints category if found. If not, it returns 1 */
+static int get_category_content(const char *category)
+{
+  unsigned int i;
+  for(i = 0; categories[i].opt; ++i)
+    if(curl_strequal(categories[i].opt, category)) {
+      printf("%s: %s\n", categories[i].opt, categories[i].desc);
+      print_category(categories[i].category);
+      return 0;
+    }
+  return 1;
+}
+
+/* Prints all categories and their description */
+static void get_categories(void)
+{
+  unsigned int i;
+  for(i = 0; categories[i].opt; ++i)
+    printf(" %-11s %s\n", categories[i].opt, categories[i].desc);
+}
+
+
+void tool_help(const char *category)
 {
-  int i;
   puts("Usage: curl [options...] <url>");
-  for(i = 0; helptext[i].opt; i++) {
-    printf(" %-19s %s\n", helptext[i].opt, helptext[i].desc);
-#ifdef PRINT_LINES_PAUSE
-    if(i && ((i % PRINT_LINES_PAUSE) == 0))
-      tool_pressanykey();
-#endif
+  /* If no category was provided */
+  if(!category) {
+    const char *category_note = "\nThis is not the full help, this "
+    "menu is stripped into categories.\nUse \"--help category\" to get "
+    "an overview of all categories.\nFor all options use the manual"
+    " or \"--help all\".";
+    print_category(CURLHELP_IMPORTANT);
+    puts(category_note);
+    return;
+  }
+  /* Lets print everything if "all" was provided */
+  if(curl_strequal(category, "all")) {
+    /* Print everything except hidden */
+    print_category(~(CURLHELP_HIDDEN));
+    return;
+  }
+  /* Lets handle the string "category" differently to not print an errormsg */
+  if(curl_strequal(category, "category")) {
+    get_categories();
+    return;
+  }
+  /* Otherwise print category and handle the case if the cat was not found */
+  if(get_category_content(category)) {
+    puts("Invalid category provided, here is a list of all categories:\n");
+    get_categories();
   }
 }
 
diff --git a/src/tool_help.h b/src/tool_help.h
index bfb5dcdf3..6c507d4cc 100644
--- a/src/tool_help.h
+++ b/src/tool_help.h
@@ -23,7 +23,7 @@
  ***************************************************************************/
 #include "tool_setup.h"
 
-void tool_help(void);
+void tool_help(const char *category);
 void tool_list_engines(void);
 void tool_version_info(void);
 
diff --git a/src/tool_operate.c b/src/tool_operate.c
index 1fe7637d2..517ad1f62 100644
--- a/src/tool_operate.c
+++ b/src/tool_operate.c
@@ -2536,7 +2536,7 @@ CURLcode operate(struct GlobalConfig *global, int argc, 
argv_item_t argv[])
 
       /* Check if we were asked for the help */
       if(res == PARAM_HELP_REQUESTED)
-        tool_help();
+        tool_help(global->help_category);
       /* Check if we were asked for the manual */
       else if(res == PARAM_MANUAL_REQUESTED)
         hugehelp();

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]