summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorAlejandro Colomar <alx@nginx.com>2023-08-24 01:12:27 +0200
committerAlejandro Colomar <alx@kernel.org>2023-12-19 15:01:46 +0100
commit22dc158a03762c22d75fca7500c32799130f21a7 (patch)
treeb2fe4675bb6a32e91f7c333f9c3deb784fca5415 /src
parent13dedafc71925d73ef83d0848271bd5e77f6b14b (diff)
downloadunit-22dc158a03762c22d75fca7500c32799130f21a7.tar.gz
unit-22dc158a03762c22d75fca7500c32799130f21a7.tar.bz2
String: added nxt_atoul().
This is similar to atoi(3) in usage, except that: - It's safe (doesn't have Undefined Behavior). - It receives a nxt_str_t instead of a string. - The base is 0, not 10. Errors are reported with the same error codes as in strtou(3bsd), but they are reported via errno, instead of passing a pointer to an int. Signed-off-by: Alejandro Colomar <alx@kernel.org>
Diffstat (limited to 'src')
-rw-r--r--src/nxt_string.c38
-rw-r--r--src/nxt_string.h3
2 files changed, 41 insertions, 0 deletions
diff --git a/src/nxt_string.c b/src/nxt_string.c
index ed4ff955..3a3fd5bf 100644
--- a/src/nxt_string.c
+++ b/src/nxt_string.c
@@ -8,8 +8,13 @@
#include <nxt_main.h>
#include <errno.h>
+#include <stdio.h>
#include <stdlib.h>
+#include <nxt_unit_cdefs.h>
+
+#include "nxt_string.h"
+
static inline unsigned long nxt_strtoul_noneg(const char *nptr,
char **restrict endptr, int base);
@@ -852,6 +857,39 @@ nxt_base64_decode(u_char *dst, u_char *src, size_t length)
}
+unsigned long
+nxt_atoul(const nxt_str_t *s)
+{
+ int e;
+ char *endptr;
+ unsigned long ul;
+ char buf[BUFSIZ];
+
+ if (s == NULL || s->length >= nxt_nitems(buf)) {
+ errno = ECANCELED;
+ return 0;
+ }
+
+ stpcpy(nxt_cpymem(buf, s->start, s->length), "");
+
+ e = errno;
+ errno = 0;
+ ul = nxt_strtoul_noneg(buf, &endptr, 0);
+
+ if (endptr == buf) {
+ errno = ECANCELED;
+ } else if (errno == ERANGE) {
+ errno = ERANGE;
+ } else if (*endptr == '\0') {
+ errno = ENOTSUP;
+ } else {
+ errno = e;
+ }
+
+ return ul;
+}
+
+
static inline unsigned long
nxt_strtoul_noneg(const char *nptr, char **restrict endptr, int base)
{
diff --git a/src/nxt_string.h b/src/nxt_string.h
index 18ea5490..8afdc1e7 100644
--- a/src/nxt_string.h
+++ b/src/nxt_string.h
@@ -161,6 +161,9 @@ NXT_EXPORT nxt_bool_t nxt_is_complex_uri_encoded(u_char *s, size_t length);
NXT_EXPORT ssize_t nxt_base64_decode(u_char *dst, u_char *src, size_t length);
+NXT_EXPORT unsigned long nxt_atoul(const nxt_str_t *s);
+
+
extern const uint8_t nxt_hex2int[256];