diff --git a/src/conversion.c b/src/conversion.c index 0992225b..c2b27a16 100644 --- a/src/conversion.c +++ b/src/conversion.c @@ -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) diff --git a/src/util.h b/src/util.h index 365f1d83..9c62f57d 100644 --- a/src/util.h +++ b/src/util.h @@ -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