common: New function string_to_u64.
authorWerner Koch <wk@gnupg.org>
Thu, 11 Aug 2016 18:46:51 +0000 (20:46 +0200)
committerWerner Koch <wk@gnupg.org>
Thu, 11 Aug 2016 19:32:55 +0000 (21:32 +0200)
* common/stringhelp.c (string_to_u64): New.
* dirmngr/http.c (longcounter_t): Remove.
(struct cookie_s): Change content_length to uint64_t.
(parse_response): Use string_to_u64.
--

Meanwhile we allow some C99 features including stdint.h.  Thus we can
simplify things now.

Signed-off-by: Werner Koch <wk@gnupg.org>
common/exechelp-posix.c
common/stringhelp.c
common/stringhelp.h
dirmngr/http.c

index b1b56f3..943f20a 100644 (file)
@@ -36,9 +36,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
-#ifdef HAVE_STDINT_H
-# include <stdint.h>
-#endif
+#include <stdint.h>
 #include <string.h>
 #include <errno.h>
 #include <assert.h>
index 990fc35..b5d9f4c 100644 (file)
@@ -58,6 +58,7 @@
 
 #define tohex_lower(n) ((n) < 10 ? ((n) + '0') : (((n) - 10) + 'a'))
 
+
 /* Sometimes we want to avoid mixing slashes and backslashes on W32
    and prefer backslashes.  There is usual no problem with mixing
    them, however a very few W32 API calls can't grok plain slashes.
@@ -660,6 +661,25 @@ compare_filenames (const char *a, const char *b)
 }
 
 
+/* Convert a base-10 number in STRING into a 64 bit unsigned int
+ * value.  Leading white spaces are skipped but no error checking is
+ * done.  Thus it is similar to atoi(). */
+uint64_t
+string_to_u64 (const char *string)
+{
+  uint64_t val = 0;
+
+  while (spacep (string))
+    string++;
+  for (; digitp (string); string++)
+    {
+      val *= 10;
+      val += *string - '0';
+    }
+  return val;
+}
+
+
 /* Convert 2 hex characters at S to a byte value.  Return this value
    or -1 if there is an error. */
 int
index adf2f20..79d2284 100644 (file)
@@ -33,6 +33,7 @@
 #ifndef GNUPG_COMMON_STRINGHELP_H
 #define GNUPG_COMMON_STRINGHELP_H
 
+#include <stdint.h>
 #include "types.h"
 
 /*-- stringhelp.c --*/
@@ -59,6 +60,7 @@ char *make_absfilename_try (const char *first_part,
                             ...) GPGRT_ATTR_SENTINEL(0);
 int compare_filenames( const char *a, const char *b );
 
+uint64_t string_to_u64 (const char *string);
 int hextobyte (const char *s);
 
 size_t utf8_charcount (const char *s, int len);
index a512e9a..ac8238c 100644 (file)
                         "01234567890@"                 \
                         "!\"#$%&'()*+,-./:;<=>?[\\]^_{|}~"
 
-/* A long counter type.  */
-#ifdef HAVE_STRTOULL
-typedef unsigned long long longcounter_t;
-# define counter_strtoul(a) strtoull ((a), NULL, 10)
-#else
-typedef unsigned long longcounter_t;
-# define counter_strtoul(a) strtoul ((a), NULL, 10)
-#endif
-
 #if HTTP_USE_NTBTLS
 typedef ntbtls_t         tls_session_t;
 # define USE_TLS 1
@@ -206,7 +197,7 @@ struct cookie_s
 
   /* The remaining content length and a flag telling whether to use
      the content length.  */
-  longcounter_t content_length;
+  uint64_t content_length;
   unsigned int content_length_valid:1;
 };
 typedef struct cookie_s *cookie_t;
@@ -2170,7 +2161,7 @@ parse_response (http_t hd)
       if (s)
         {
           cookie->content_length_valid = 1;
-          cookie->content_length = counter_strtoul (s);
+          cookie->content_length = string_to_u64 (s);
         }
     }