From ae035800d37ad4602606ff5291b279fe94cc8a6a Mon Sep 17 00:00:00 2001 From: 0x1eef <0x1eef@protonmail.com> Date: Wed, 20 Sep 2023 05:42:02 -0300 Subject: [PATCH] Add isinetaddr4.c improvements --- src/isinetaddr4.c | 58 +++++++++++++++++++---------------------------- 1 file changed, 23 insertions(+), 35 deletions(-) diff --git a/src/isinetaddr4.c b/src/isinetaddr4.c index 1945865..0417ba1 100644 --- a/src/isinetaddr4.c +++ b/src/isinetaddr4.c @@ -4,66 +4,54 @@ #include #include -static int in_range(char buf[4], int min, int max); -static void register_octet(int *octets, char *buf, int *buflen); -static void register_digit(char digit, int *digits, char *buf, int *buflen); +static const int MAX_BUFLEN = 3; +static const int MAX_OCTETS = 4; +static const int MAX_DIGITLEN = 12; +static const int MAX_STRLEN = 16; +static const char SEP = '.'; + +static int in_range(char buf[MAX_BUFLEN]); int isinetaddr4(const char *str) { - char buf[4]; + char buf[MAX_BUFLEN + 1]; int digits = 0, octets = 1, buflen = 0; - size_t len = (str == NULL ? 0 : strnlen(str, 16)); + size_t len = (str == NULL ? 0 : strnlen(str, MAX_STRLEN)); + buf[MAX_BUFLEN] = '\0'; for (size_t l = 0; l < len; l++) { - if (str[l] == '.') { + if (str[l] == SEP) { if (buflen == 0) { return 0; - } else if (!in_range(buf, 0, 255)) { + } else if (!in_range(buf)) { return 0; } else { - register_octet(&octets, buf, &buflen); + buflen = 0; + bzero(buf, MAX_BUFLEN); + octets++; } } else if (isdigit(str[l])) { - if (buflen == 3) { + if (buflen == MAX_BUFLEN) { return 0; } else { - register_digit(str[l], &digits, buf, &buflen); + buf[buflen++] = str[l]; + digits++; } } else { return 0; } } - if (octets == 4) { - return buflen > 0 && digits <= 12 && in_range(buf, 0, 255); + if (octets == MAX_OCTETS) { + return digits <= MAX_DIGITLEN && buflen > 0 && in_range(buf); } else { return 0; } } static int -in_range(char buf[4], int min, int max) +in_range(char buf[MAX_BUFLEN]) { - char *err; - long r; - errno = 0; - r = strtol(buf, &err, 10); - return *err == '\0' && errno == 0 && (r >= min && r <= max); -} - -static void -register_octet(int *octets, char *buf, int *buflen) -{ - *buflen = 0; - (*octets)++; - bzero(buf, 3); - buf[3] = '\0'; -} - -static void -register_digit(char digit, int *digits, char *buf, int *buflen) -{ - buf[(*buflen)++] = digit; - buf[*buflen] = '\0'; - (*digits)++; + int n = atoi(buf); + return n >= 0 && n <= 255; }