From 78c3cebc389a2b0d426d74900a65b8656edb426d Mon Sep 17 00:00:00 2001 From: Dirk Engling Date: Mon, 26 Oct 2026 18:13:27 +0100 Subject: Third run of making variable and function names more readable, integer scans and ip parsers --- ot_scan.c | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) (limited to 'ot_scan.c') diff --git a/ot_scan.c b/ot_scan.c index a96f82b..c4b951a 100644 --- a/ot_scan.c +++ b/ot_scan.c @@ -11,7 +11,7 @@ /* Opentracker */ #include "ot_scan.h" -size_t scan_udec(const char *src, uint64_t *dest, uint64_t max) { +size_t scan_uint(const char *src, uint64_t *dest, uint64_t max) { unsigned long long value; char *end; @@ -28,9 +28,9 @@ size_t scan_udec(const char *src, uint64_t *dest, uint64_t max) { return (size_t)(end - src); } -size_t scan_udec_bencode(const char *src, uint64_t *dest, uint64_t max) { +size_t scan_uint_bencode(const char *src, uint64_t *dest, uint64_t max) { uint64_t value; - size_t consumed = scan_udec(src, &value, max); + size_t consumed = scan_uint(src, &value, max); /* bencode writes no leading zeros, so anything longer than a single digit must not begin with one. */ @@ -42,3 +42,26 @@ size_t scan_udec_bencode(const char *src, uint64_t *dest, uint64_t max) { return consumed; } + +int scan_int(const char *src, size_t len, int64_t *dest) { + int64_t value = 0; + int negate = 0; + + if (len && *src == '-') + --len, ++src, negate = 1; + if (!len) + return -1; + + while (len--) { + if (*src < '0' || *src > '9') + return -1; + /* A twenty character field of nines does not fit, and silently wrapping + would magically heal a nonsense announce */ + if (value > (INT64_MAX - (*src - '0')) / 10) + return -1; + value = 10 * value + (*src++ - '0'); + } + + *dest = negate ? -value : value; + return 0; +} -- cgit v1.3