about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/netascii.c52
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;
+}