common: New functions get_option_value and ascii_strupr.
authorWerner Koch <wk@gnupg.org>
Fri, 8 Feb 2019 08:32:55 +0000 (09:32 +0100)
committerWerner Koch <wk@gnupg.org>
Fri, 8 Feb 2019 10:13:33 +0000 (11:13 +0100)
* common/server-help.c (get_option_value): New.
* common/stringhelp.c (ascii_strupr): New.

Signed-off-by: Werner Koch <wk@gnupg.org>
common/server-help.c
common/server-help.h
common/stringhelp.c
common/stringhelp.h

index 53a888a..e5a69e0 100644 (file)
 #include <config.h>
 #include <string.h>
 
-#include "server-help.h"
 #include "util.h"
+#include "server-help.h"
+
+
+static GPGRT_INLINE gpg_error_t
+my_error (int e)
+{
+  return gpg_err_make (default_errsource, (e));
+}
+
+static GPGRT_INLINE gpg_error_t
+my_error_from_syserror (void)
+{
+  return gpg_err_make (default_errsource, gpg_err_code_from_syserror ());
+}
+
 
 /* Skip over options in LINE.
 
@@ -114,6 +128,40 @@ has_option_name (const char *line, const char *name)
 }
 
 
+/* Parse an option with the format "--NAME=VALUE" which must occur in
+ * LINE before a double-dash.  LINE is written to but not modified by
+ * this function.  If the option is found and has a value the value is
+ * stored as a malloced string at R_VALUE.  If the option was not
+ * found or an error occurred NULL is stored there.  Note that
+ * currently the value must be a string without any space; we may
+ * eventually update this function to allow for a quoted value.  */
+gpg_error_t
+get_option_value (char *line, const char *name, char **r_value)
+{
+  char *p, *pend;
+  int c;
+
+  *r_value = NULL;
+
+  p = (char*)has_option_name (line, name);
+  if (!p || p >= skip_options (line))
+    return 0;
+
+  if (*p != '=' || !p[1] || spacep (p+1))
+    return my_error (GPG_ERR_INV_ARG);
+  p++;
+  for (pend = p; *pend && !spacep (pend); pend++)
+    ;
+  c = *pend;
+  *pend = 0;
+  *r_value = xtrystrdup (p);
+  *pend = c;
+  if (!p)
+    return my_error_from_syserror ();
+  return 0;
+}
+
+
 /* Return a pointer to the argument of the option with NAME.  If such
    an option is not given, NULL is returned. */
 char *
index 9e3d7ad..9d2f4cf 100644 (file)
@@ -55,6 +55,14 @@ int has_leading_option (const char *line, const char *name);
    or a space.  */
 const char *has_option_name (const char *line, const char *name);
 
+/* Same as has_option_name but ignores all options after a "--" and
+ * does not return a const char ptr.  */
+char *has_leading_option_name (char *line, const char *name);
+
+/* Parse an option with the format "--NAME=VALUE" and return the value
+ * as a malloced string.  */
+gpg_error_t get_option_value (char *line, const char *name, char **r_value);
+
 /* Return a pointer to the argument of the option with NAME.  If such
    an option is not given, NULL is returned. */
 char *option_value (const char *line, const char *name);
index 751e571..dd17116 100644 (file)
@@ -810,6 +810,19 @@ ascii_strlwr (char *s)
   return s;
 }
 
+/* Upcase all ASCII characters in S.  */
+char *
+ascii_strupr (char *s)
+{
+  char *p = s;
+
+  for (p=s; *p; p++ )
+    if (isascii (*p) && *p >= 'a' && *p <= 'z')
+      *p &= ~0x20;
+
+  return s;
+}
+
 int
 ascii_strcasecmp( const char *a, const char *b )
 {
index 5b07af9..7df6c76 100644 (file)
@@ -76,6 +76,7 @@ int ascii_islower (int c);
 int ascii_toupper (int c);
 int ascii_tolower (int c);
 char *ascii_strlwr (char *s);
+char *ascii_strupr (char *s);
 int ascii_strcasecmp( const char *a, const char *b );
 int ascii_strncasecmp (const char *a, const char *b, size_t n);
 int ascii_memcasecmp( const void *a, const void *b, size_t n );