summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorDanny Holman <dholman@gymli.org>2023-07-26 11:40:36 -0500
committerDanny Holman <dholman@gymli.org>2023-07-26 11:40:36 -0500
commitf3d50195e43fd33e7f36e4e55a84af790b7de5d1 (patch)
tree271f11ccb2297375245df5f9783ca31d84dd5c52 /common
parentee0f0f95d6972e66c56812e0e3abe9275d5f0fdc (diff)
common: create the common directory
Create a directory for files that are shared between the reference client and server. Refactor the build scripts to reflect this restructuring. Signed-off-by: Danny Holman <dholman@gymli.org>
Diffstat (limited to 'common')
-rw-r--r--common/include/util.h13
-rw-r--r--common/src/util.c84
2 files changed, 97 insertions, 0 deletions
diff --git a/common/include/util.h b/common/include/util.h
new file mode 100644
index 0000000..39c130b
--- /dev/null
+++ b/common/include/util.h
@@ -0,0 +1,13 @@
+#ifndef MRAT_UTIL_H
+#define MRAT_UTIL_H
+
+#include <stddef.h>
+
+#define container_of(ptr, type, member) ({ \
+ const typeof(((type*)0)->member)*__mptr = (ptr); \
+ (type*)((char*)__mptr - offsetof(type, member)); })
+
+char* str_strip(char *str);
+char** str_split(char *str, const char *delim);
+
+#endif
diff --git a/common/src/util.c b/common/src/util.c
new file mode 100644
index 0000000..63eefa2
--- /dev/null
+++ b/common/src/util.c
@@ -0,0 +1,84 @@
+#include <util.h>
+#include <string.h>
+#include <stdlib.h>
+
+char* str_rstrip(char *str) {
+ size_t len = strlen(str) - 1;
+ int brakes = 1;
+ while (brakes) {
+ switch (str[len]) {
+ case '\r':
+ str[len] = '\0';
+ len--;
+ break;
+ case '\n':
+ str[len] = '\0';
+ len--;
+ break;
+ case '\t':
+ str[len] = '\0';
+ len--;
+ break;
+ case ' ':
+ str[len] = '\0';
+ len--;
+ break;
+ default:
+ brakes = 0;
+ break;
+ }
+ }
+ return str;
+}
+
+char* str_lstrip(char *str) {
+ int brakes = 1;
+ while (brakes) {
+ switch (str[0]) {
+ case '\r':
+ str[0] = '\0';
+ str++;
+ break;
+ case '\n':
+ str[0] = '\0';
+ str++;
+ break;
+ case '\t':
+ str[0] = '\0';
+ str++;
+ break;
+ case ' ':
+ str[0] = '\0';
+ str++;
+ break;
+ default:
+ brakes = 0;
+ break;
+ }
+ }
+ return str;
+}
+
+char* str_strip(char *str) {
+ str_rstrip(str);
+ str_lstrip(str);
+ return str;
+}
+
+char** str_split(char *str, const char *delim) {
+ size_t count = 0;
+ char **ret = NULL;
+ char *token;
+ char *saveptr;
+ token = strtok_r(str, delim, &saveptr);
+ while (token != NULL) {
+ count++;
+ ret = realloc(ret, sizeof(char*) * count);
+ ret[count-1] = strdup(str_strip(token));
+ token = strtok_r(NULL, delim, &saveptr);
+ }
+ count++;
+ ret = realloc(ret, sizeof(char*) * count);
+ ret[count-1] = NULL;
+ return ret;
+}