diff options
Diffstat (limited to 'src/netascii.c')
-rw-r--r-- | src/netascii.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/netascii.c b/src/netascii.c new file mode 100644 index 0000000..606d257 --- /dev/null +++ b/src/netascii.c @@ -0,0 +1,52 @@ +#include <stdint.h> + +#include "inc/netascii.h" + +uint8_t is_netascii_char(char c) { + static const uint64_t LUT[4] = + {0xffffffff00003f81, + 0x7fffffffffffffff, + 0x00,0x00}; + int i = c / 64; + int e = i % 64; + return (LUT[i] >> e) & 1; +} + +/// WARNING! This function is NOT safe. Use only for strings you have already +/// verified are NULL terminated! +uint8_t is_netascii_str(char* str) { + for (uint64_t i = 0; str[i] != 0; i++) { + if (!is_netascii_char(str[i])) { + return 0; + } else { + if (str[i] == '\r') { + if (str[++i] != '\n') { + return 0; + } + } + } + } + return 1; +} + +uint8_t is_netascii_buf(char* buf, uint64_t len) { + for (uint64_t i = 0; i < len; i++) { + if (!is_netascii_char(buf[i])) { + return 0; + } else { + if (buf[i] == '\r') { + if ((i + 1) < len) { + switch (buf[++i]) { + case 0: case '\n': + break; + default: + return 0; + } + } else { + return 0; + } + } + } + } + return 1; +} |