[Pkg-gnupg-commit] [libassuan] 259/437: Extended HELP command.

Eric Dorland eric at moszumanska.debian.org
Fri May 22 05:33:51 UTC 2015


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

eric pushed a commit to branch master
in repository libassuan.

commit 8b30641f35200d82897cd659d180e4423a803e85
Author: Werner Koch <wk at gnupg.org>
Date:   Wed Nov 4 10:00:24 2009 +0000

    Extended HELP command.
---
 ChangeLog            |  5 +++++
 NEWS                 |  6 ++++--
 src/ChangeLog        |  8 ++++++++
 src/Makefile.am      |  2 +-
 src/assuan-defs.h    |  1 +
 src/assuan-handler.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++------
 src/assuan.h         |  9 ++++++---
 tests/fdpassing.c    |  2 +-
 8 files changed, 77 insertions(+), 13 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 7253adc..7ac8f1f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2009-11-04  Werner Koch  <wk at g10code.com>
+
+	* tests/fdpassing.c (register_commands): Add NULL arg to
+	assuan_register_command.
+
 2009-10-16  Marcus Brinkmann  <marcus at g10code.de>
 
 	* autogen.sh: Remove --with-pth-prefix from configure invocation.
diff --git a/NEWS b/NEWS
index 5fba70c..ee8c260 100644
--- a/NEWS
+++ b/NEWS
@@ -14,7 +14,8 @@ Noteworthy changes in version 1.1.0 (unreleased)
    of NULL, you have to provide a non-NULL ARGV argument and check
    that against "server" or "client" to determine which end you got
    after fork().  If you use the assuan sock interface, you must call
-   assuan_sock_init after setting global context defaults.
+   assuan_sock_init after setting global context defaults.  Add a NULL
+   as the last arg to assuan_register_command.
 
  * Pth support has changed.  This now follows the same style as
    libgcrypt by setting system hook callbacks.
@@ -68,11 +69,12 @@ ASSUAN_SYSTEM_PTH              NEW
 assuan_sock_init               NEW
 assuan_sock_deinit             NEW
 assuan_handler_t	       NEW
+assuan_register_command        CHANGED: Add arg HELP_STRING.
 assuan_register_bye_notify     CHANGED: Handler gets line and returns err now.
 assuan_register_reset_notify   CHANGED: Handler gets line and returns err now.
 assuan_register_cancel_notify  CHANGED: Handler gets line and returns err now.
 assuan_register_input_notify   CHANGED: Handler returns error now.
-assuan_register_output_notify   CHANGED: Handler returns error now.
+assuan_register_output_notify  CHANGED: Handler returns error now.
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
diff --git a/src/ChangeLog b/src/ChangeLog
index 4b41e33..0b766d9 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,11 @@
+2009-11-04  Werner Koch  <wk at g10code.com>
+
+	* Makefile.am (common_sources): Add debug.h.
+
+	* assuan-defs.h (cmdtbl_s): Add field HELPSTR.
+	* assuan-handler.c (assuan_register_command): Add arg HELP_STRING.
+	(std_handler_help): Print the help.
+
 2009-11-02  Marcus Brinkmann  <marcus at g10code.de>
 
 	* assuan.h (assuan_handler_t): New type.
diff --git a/src/Makefile.am b/src/Makefile.am
index bfbcfec..0d6ec0b 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -39,7 +39,7 @@ common_sources = \
 	assuan.c \
 	context.c \
 	system.c \
-	debug.c \
+	debug.c debug.h \
 	conversion.c \
 	assuan-error.c \
 	assuan-buffer.c \
diff --git a/src/assuan-defs.h b/src/assuan-defs.h
index 56867a6..648b881 100644
--- a/src/assuan-defs.h
+++ b/src/assuan-defs.h
@@ -53,6 +53,7 @@ struct cmdtbl_s
 {
   const char *name;
   assuan_handler_t handler;
+  const char *helpstr;
 };
 
 
diff --git a/src/assuan-handler.c b/src/assuan-handler.c
index a39c006..dd5bfda 100644
--- a/src/assuan-handler.c
+++ b/src/assuan-handler.c
@@ -155,12 +155,55 @@ std_handler_help (assuan_context_t ctx, char *line)
 {
   unsigned int i;
   char buf[ASSUAN_LINELENGTH];
+  const char *helpstr;
+  size_t n;
 
-  for (i = 0; i < ctx->cmdtbl_used; i++)
+  n = strcspn (line, " \t\n");
+  if (!n)
+    {
+      /* Print all commands.  If a help string is available and that
+         starts with the command name, print the first line of the
+         help string.  */
+      for (i = 0; i < ctx->cmdtbl_used; i++)
+        {
+          n = strlen (ctx->cmdtbl[i].name);
+          helpstr = ctx->cmdtbl[i].helpstr; 
+          if (helpstr
+              && !strncmp (ctx->cmdtbl[i].name, helpstr, n)
+              && (!helpstr[n] || helpstr[n] == '\n' || helpstr[n] == ' ')
+              && (n = strcspn (helpstr, "\n"))          )
+            snprintf (buf, sizeof (buf), "# %.*s", (int)n, helpstr);
+          else
+            snprintf (buf, sizeof (buf), "# %s", ctx->cmdtbl[i].name);
+          buf[ASSUAN_LINELENGTH - 1] = '\0';
+          assuan_write_line (ctx, buf);
+        }
+    }
+  else
     {
-      snprintf (buf, sizeof (buf), "# %s", ctx->cmdtbl[i].name);
-      buf[ASSUAN_LINELENGTH - 1] = '\0';
-      assuan_write_line (ctx, buf);
+      /* Print the help for the given command.  */
+      int c = line[n];
+      line[n] = 0;
+      for (i=0; ctx->cmdtbl[i].name; i++)
+        if (!my_strcasecmp (line, ctx->cmdtbl[i].name))
+          break;
+      line[n] = c;
+      if (!ctx->cmdtbl[i].name)
+        return PROCESS_DONE (ctx, set_error (ctx,GPG_ERR_UNKNOWN_COMMAND,NULL));
+      helpstr = ctx->cmdtbl[i].helpstr; 
+      if (!helpstr)
+        return PROCESS_DONE (ctx, set_error (ctx, GPG_ERR_NOT_FOUND, NULL));
+      do
+        {
+          n = strcspn (helpstr, "\n");
+          snprintf (buf, sizeof (buf), "# %.*s", (int)n, helpstr);
+          helpstr += n;
+          if (*helpstr == '\n')
+            helpstr++;
+          buf[ASSUAN_LINELENGTH - 1] = '\0';
+          assuan_write_line (ctx, buf);
+        }
+      while (*helpstr);
     }
 
   return PROCESS_DONE (ctx, 0);
@@ -275,6 +318,7 @@ static struct {
  * @cmd_name: A string with the command name
  * @handler: The handler function to be called or NULL to use a default
  *           handler.
+ * HELPSTRING
  * 
  * Register a handler to be used for a given command.  Note that
  * several default handlers are already regsitered with a new context.
@@ -284,7 +328,7 @@ static struct {
  **/
 gpg_error_t
 assuan_register_command (assuan_context_t ctx, const char *cmd_name,
-                         assuan_handler_t handler)
+                         assuan_handler_t handler, const char *help_string)
 {
   int i;
   const char *s;
@@ -332,6 +376,7 @@ assuan_register_command (assuan_context_t ctx, const char *cmd_name,
 
   ctx->cmdtbl[ctx->cmdtbl_used].name = cmd_name;
   ctx->cmdtbl[ctx->cmdtbl_used].handler = handler;
+  ctx->cmdtbl[ctx->cmdtbl_used].helpstr = help_string;
   ctx->cmdtbl_used++;
   return 0;
 }
@@ -424,7 +469,7 @@ _assuan_register_std_commands (assuan_context_t ctx)
     {
       if (std_cmd_table[i].always)
         {
-          rc = assuan_register_command (ctx, std_cmd_table[i].name, NULL);
+          rc = assuan_register_command (ctx, std_cmd_table[i].name, NULL, NULL);
           if (rc)
             return rc;
         }
diff --git a/src/assuan.h b/src/assuan.h
index 935ec00..defd0b6 100644
--- a/src/assuan.h
+++ b/src/assuan.h
@@ -305,9 +305,11 @@ typedef gpg_error_t (*assuan_handler_t) (assuan_context_t, char *);
 /*-- assuan-handler.c --*/
 gpg_error_t assuan_register_command (assuan_context_t ctx,
 				     const char *cmd_string,
-				     assuan_handler_t handler);
+				     assuan_handler_t handler,
+                                     const char *help_string);
 gpg_error_t assuan_register_post_cmd_notify (assuan_context_t ctx,
-					     void (*fnc)(assuan_context_t, gpg_error_t));
+					     void (*fnc)(assuan_context_t,
+                                                         gpg_error_t));
 gpg_error_t assuan_register_bye_notify (assuan_context_t ctx,
 					assuan_handler_t handler);
 gpg_error_t assuan_register_reset_notify (assuan_context_t ctx,
@@ -321,7 +323,8 @@ gpg_error_t assuan_register_output_notify (assuan_context_t ctx,
 
 gpg_error_t assuan_register_option_handler (assuan_context_t ctx,
 					    gpg_error_t (*fnc)(assuan_context_t,
-							       const char*, const char*));
+							       const char*,
+                                                               const char*));
 
 gpg_error_t assuan_process (assuan_context_t ctx);
 gpg_error_t assuan_process_next (assuan_context_t ctx);
diff --git a/tests/fdpassing.c b/tests/fdpassing.c
index 7197ff7..132a953 100644
--- a/tests/fdpassing.c
+++ b/tests/fdpassing.c
@@ -88,7 +88,7 @@ register_commands (assuan_context_t ctx)
 
   for (i=0; table[i].name; i++)
     {
-      rc = assuan_register_command (ctx, table[i].name, table[i].handler);
+      rc = assuan_register_command (ctx, table[i].name, table[i].handler, NULL);
       if (rc)
         return rc;
     }

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-gnupg/libassuan.git



More information about the Pkg-gnupg-commit mailing list