core: New functions to help parsing of status lines.
authorWerner Koch <wk@gnupg.org>
Sat, 21 May 2016 08:21:06 +0000 (10:21 +0200)
committerWerner Koch <wk@gnupg.org>
Sat, 21 May 2016 08:31:20 +0000 (10:31 +0200)
* src/conversion.c (_gpgme_split_fields): New.
(_gpgme_strtoul_field): New.
--

Signed-off-by: Werner Koch <wk@gnupg.org>
src/conversion.c
src/util.h

index 0992225..c2b27a1 100644 (file)
@@ -317,6 +317,53 @@ _gpgme_encode_percent_string (const char *src, char **destp, size_t len)
 }
 
 
+/* Split a string into space delimited fields and remove leading and
+ * trailing spaces from each field.  A pointer to the each field is
+ * stored in ARRAY.  Stop splitting at ARRAYSIZE fields.  The function
+ * modifies STRING.  The number of parsed fields is returned.
+ */
+int
+_gpgme_split_fields (char *string, char **array, int arraysize)
+{
+  int n = 0;
+  char *p, *pend;
+
+  for (p = string; *p == ' '; p++)
+    ;
+  do
+    {
+      if (n == arraysize)
+        break;
+      array[n++] = p;
+      pend = strchr (p, ' ');
+      if (!pend)
+        break;
+      *pend++ = 0;
+      for (p = pend; *p == ' '; p++)
+        ;
+    }
+  while (*p);
+
+  return n;
+}
+
+/* Convert the field STRING into an unsigned long value.  Check for
+ * trailing garbage.  */
+gpgme_error_t
+_gpgme_strtoul_field (const char *string, unsigned long *result)
+{
+  char *endp;
+
+  gpg_err_set_errno (0);
+  *result = strtoul (string, &endp, 0);
+  if (errno)
+    return gpg_error_from_syserror ();
+  if (endp == string || *endp)
+    return gpg_error (GPG_ERR_INV_VALUE);
+  return 0;
+}
+
+
 #ifdef HAVE_W32_SYSTEM
 static time_t
 _gpgme_timegm (struct tm *tm)
index 365f1d8..9c62f57 100644 (file)
@@ -124,6 +124,15 @@ gpgme_error_t _gpgme_decode_percent_string (const char *src, char **destp,
 gpgme_error_t _gpgme_encode_percent_string (const char *src, char **destp,
                                            size_t len);
 
+/* Split a string into space delimited fields and remove leading and
+ * trailing spaces from each field.  A pointer to the each field is
+ * stored in ARRAY.  Stop splitting at ARRAYSIZE fields.  The function
+ * modifies STRING.  The number of parsed fields is returned.  */
+int _gpgme_split_fields (char *string, char **array, int arraysize);
+
+/* Convert the field STRING into an unsigned long value.  Check for
+ * trailing garbage.  */
+gpgme_error_t _gpgme_strtoul_field (const char *string, unsigned long *result);
 
 /* Parse the string TIMESTAMP into a time_t.  The string may either be
    seconds since Epoch or in the ISO 8601 format like