Utilize stdbool.h
This commit is contained in:
parent
c41c1eda34
commit
33de77f32c
5 changed files with 29 additions and 25 deletions
|
@ -10,8 +10,8 @@ extend [testcases](test/) that help verify safety and correctness.
|
|||
### IPv4
|
||||
|
||||
The following example demonstrates the `isinetaddr4` function with
|
||||
both valid and invalid inputs. The `isinetaddr4` function returns 1
|
||||
when the input given is a valid IPv4 address, and otherwise returns 0.
|
||||
both valid and invalid inputs. The `isinetaddr4` function returns `true`
|
||||
when the input given is a valid IPv4 address, and otherwise returns `false`.
|
||||
|
||||
```C
|
||||
#include <isinetaddr.h>
|
||||
|
@ -121,8 +121,8 @@ foobar is an invalid IPv4 address.
|
|||
### IPv6
|
||||
|
||||
The following example demonstrates the `isinetaddr6` function with
|
||||
both valid and invalid inputs. The `isinetaddr6` function returns 1
|
||||
when the input given is a valid IPv6 address, and otherwise returns 0.
|
||||
both valid and invalid inputs. The `isinetaddr6` function returns `true`
|
||||
when the input given is a valid IPv6 address, and otherwise returns `false`.
|
||||
|
||||
```C
|
||||
#include <isinetaddr.h>
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#pragma once
|
||||
int isinetaddr4(const char *str);
|
||||
int iscidraddr4(const char *str);
|
||||
int isinetaddr6(const char *str);
|
||||
#include <stdbool.h>
|
||||
bool isinetaddr4(const char *str);
|
||||
bool iscidraddr4(const char *str);
|
||||
bool isinetaddr6(const char *str);
|
||||
|
|
|
@ -2,10 +2,11 @@
|
|||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
static int in_range(char buf[4], int min, int max);
|
||||
static bool in_range(char buf[4], int min, int max);
|
||||
|
||||
int
|
||||
bool
|
||||
iscidraddr4(const char *str)
|
||||
{
|
||||
size_t offset = 0;
|
||||
|
@ -29,14 +30,14 @@ iscidraddr4(const char *str)
|
|||
}
|
||||
}
|
||||
|
||||
static int
|
||||
static bool
|
||||
in_range(char buf[4], int min, int max)
|
||||
{
|
||||
char *err;
|
||||
long r;
|
||||
errno = 0;
|
||||
if (strnlen(buf, 1) == 0) {
|
||||
return 0;
|
||||
return false;
|
||||
} else {
|
||||
r = strtol(buf, &err, 10);
|
||||
return *err == '\0' && errno == 0 && (r >= min && r <= max);
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <isinetaddr.h>
|
||||
|
||||
static const int MAX_BUFLEN = 3;
|
||||
|
@ -8,9 +9,9 @@ static const int MAX_OCTETS = 4;
|
|||
static const int MAX_DIGITLEN = 12;
|
||||
static const int MAX_STRLEN = 16;
|
||||
static const char SEP = '.';
|
||||
static int within_range(char buf[MAX_BUFLEN]);
|
||||
static bool within_range(char buf[MAX_BUFLEN]);
|
||||
|
||||
int
|
||||
bool
|
||||
isinetaddr4(const char *str)
|
||||
{
|
||||
char buf[MAX_BUFLEN + 1];
|
||||
|
@ -21,31 +22,31 @@ isinetaddr4(const char *str)
|
|||
for (size_t i = 0; i < len; i++) {
|
||||
if (str[i] == SEP) {
|
||||
if (octets == MAX_OCTETS || buflen == 0) {
|
||||
return 0;
|
||||
return false;
|
||||
} else {
|
||||
buflen = 0;
|
||||
bzero(buf, MAX_BUFLEN);
|
||||
}
|
||||
} else if (isdigit(str[i])) {
|
||||
if (buflen == MAX_BUFLEN) {
|
||||
return 0;
|
||||
return false;
|
||||
} else {
|
||||
buf[buflen++] = str[i];
|
||||
digits++;
|
||||
if (!within_range(buf)) {
|
||||
return 0;
|
||||
return false;
|
||||
} else if (str[i-1] == SEP) {
|
||||
octets++;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return octets == MAX_OCTETS && digits <= MAX_DIGITLEN;
|
||||
}
|
||||
|
||||
static int
|
||||
static bool
|
||||
within_range(char buf[MAX_BUFLEN])
|
||||
{
|
||||
int n = atoi(buf);
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <isinetaddr.h>
|
||||
|
||||
static const int MAX_DIGITLEN = 4;
|
||||
|
@ -9,26 +10,26 @@ static const int MAX_HEXDIGITS = 32;
|
|||
static const int MAX_STRLEN = 40;
|
||||
static const char SEP = ':';
|
||||
|
||||
static int has_consecutive_chars(const char *str, char c, int n);
|
||||
static bool has_consecutive_chars(const char *str, char c, int n);
|
||||
static char* expand(const char *str, size_t strlen, char *new_str, size_t headlen);
|
||||
|
||||
int
|
||||
bool
|
||||
isinetaddr6(const char *str)
|
||||
{
|
||||
int hextets = 1, digitlen = 0, hexdigits = 0;
|
||||
size_t len = (str == NULL ? 0 : strnlen(str, MAX_STRLEN));
|
||||
|
||||
if (len == 0) {
|
||||
return 0;
|
||||
return false;
|
||||
} else if (strncasecmp(str, "::ffff", 6) == 0) {
|
||||
return isinetaddr4(&str[7]);
|
||||
}
|
||||
for (size_t i = 0; i < len; i++) {
|
||||
if (has_consecutive_chars(&str[i], SEP, 3)) {
|
||||
return 0;
|
||||
return false;
|
||||
} else if (has_consecutive_chars(&str[i], SEP, 2)) {
|
||||
if (i == 0 && isinetaddr4(&str[3])) {
|
||||
return 1;
|
||||
return true;
|
||||
} else {
|
||||
char new_str[MAX_STRLEN];
|
||||
return isinetaddr6(expand(str, len, new_str, i));
|
||||
|
@ -44,13 +45,13 @@ isinetaddr6(const char *str)
|
|||
hextets++;
|
||||
}
|
||||
} else {
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return hextets == MAX_HEXTETS && hexdigits <= MAX_HEXDIGITS;
|
||||
}
|
||||
|
||||
static int
|
||||
static bool
|
||||
has_consecutive_chars(const char *str, char c, int n)
|
||||
{
|
||||
for (int i = 0; i < n; i++) {
|
||||
|
|
Loading…
Reference in a new issue