summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore4
-rw-r--r--Makefile116
-rw-r--r--hax_string.h45
-rw-r--r--hax_string_utils.c130
-rw-r--r--hax_string_utils.h38
5 files changed, 333 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..22f6201
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+.makeopts
+*.o
+*.so
+*.a
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..724e119
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,116 @@
+# Makefile for hax's string stuff
+#
+# Written by: Test_User <hax@andrewyu.org>
+#
+# This is free and unencumbered software released into the public
+# domain.
+#
+# Anyone is free to copy, modify, publish, use, compile, sell, or
+# distribute this software, either in source code form or as a compiled
+# binary, for any purpose, commercial or non-commercial, and by any
+# means.
+#
+# In jurisdictions that recognize copyright laws, the author or authors
+# of this software dedicate any and all copyright interest in the
+# software to the public domain. We make this dedication for the benefit
+# of the public at large and to the detriment of our heirs and
+# successors. We intend this dedication to be an overt act of
+# relinquishment in perpetuity of all present and future rights to this
+# software under copyright law.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+
+ORIGINAL_CFLAGS := $(CFLAGS)
+ORIGINAL_LDFLAGS := $(LDFLAGS)
+
+INCLUDEFLAGS =
+
+LDFLAGS =
+
+.makeopts:
+ > .makeopts
+ printf '%s\n' 'LAST_SAFE_STACK = $(SAFE_STACK)' >> .makeopts
+ printf '%s\n' 'LAST_CFLAGS = $(ORIGINAL_CFLAGS)' >> .makeopts
+ printf '%s\n' 'LAST_LDFLAGS = $(ORIGINAL_LDFLAGS)' >> .makeopts
+ printf '%s\n' 'LAST_CC = $(CC)' >> .makeopts
+
+$(shell [ -e .makeopts ] || > .makeopts)
+
+include .makeopts
+
+rebuild = 0
+
+# tabs not allowed :(
+ifneq ($(SAFE_STACK),)
+ifneq ($(SAFE_STACK),$(LAST_SAFE_STACK))
+rebuild = 1
+endif
+else
+SAFE_STACK := $(LAST_SAFE_STACK)
+endif
+
+ifneq ($(ORIGINAL_CFLAGS),)
+ifneq ($(ORIGINAL_CFLAGS),$(LAST_CFLAGS))
+rebuild = 1
+endif
+else
+ORIGINAL_CFLAGS := $(LAST_CFLAGS)
+CFLAGS += $(LAST_CFLAGS)
+endif
+
+ifneq ($(ORIGINAL_LDFLAGS),)
+ifneq ($(ORIGINAL_LDFLAGS),$(LAST_LDFLAGS))
+rebuild = 1
+endif
+else
+ORIGINAL_LDFLAGS := $(LAST_LDFLAGS)
+LDFLAGS += $(LAST_LDFLAGS)
+endif
+
+ifneq ($(CC),)
+ifneq ($(CC),$(LAST_CC))
+rebuild = 1
+endif
+else
+CC := $(LAST_CC)
+endif
+
+ifeq ($(rebuild),1)
+.PHONY: .makeopts
+endif
+
+CFLAGS += $(INCLUDEFLAGS) -fPIC -fno-plt -D_REENTRANT -ggdb3 -Wall -Wextra -Wsign-conversion -Wno-unknown-warning-option -Wno-unused-parameter -Wno-implicit-fallthrough -Wno-alloc-size -std=gnu99
+
+ifeq ($(SAFE_STACK),1)
+CFLAGS += -fstack-check
+endif
+
+
+
+DEPS = $(shell $(CC) $(CFLAGS) -M -MT $(1).$(2) $(1).c | sed 's_\\$$__') .makeopts Makefile
+
+
+.PHONY: all clean
+all: libhax_string_utils.a libhax_string_utils.so
+
+%.o: %.c
+ $(CC) $(CFLAGS) -c $< -o $@
+
+lib%.so: %.o
+ $(LD) $(LDFLAGS) -shared $< -o $@
+
+lib%.a: %.o
+ $(AR) rcs $@ $<
+
+$(call DEPS,hax_string_utils,o)
+
+clean:
+ for file in `find . -name '*.so'`; do $(RM) $$file; done
+ for file in `find . -name '*.o'`; do $(RM) $$file; done
+ for file in `find . -name '*.a'`; do $(RM) $$file; done
diff --git a/hax_string.h b/hax_string.h
new file mode 100644
index 0000000..f0c3947
--- /dev/null
+++ b/hax_string.h
@@ -0,0 +1,45 @@
+// Hax's strings
+//
+// Written by: Test_User <hax@andrewyu.org>
+//
+// This is free and unencumbered software released into the public
+// domain.
+//
+// Anyone is free to copy, modify, publish, use, compile, sell, or
+// distribute this software, either in source code form or as a compiled
+// binary, for any purpose, commercial or non-commercial, and by any
+// means.
+//
+// In jurisdictions that recognize copyright laws, the author or authors
+// of this software dedicate any and all copyright interest in the
+// software to the public domain. We make this dedication for the benefit
+// of the public at large and to the detriment of our heirs and
+// successors. We intend this dedication to be an overt act of
+// relinquishment in perpetuity of all present and future rights to this
+// software under copyright law.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+
+#pragma once
+
+#include <stddef.h>
+#include <string.h>
+#include <unistd.h>
+
+struct string {
+ char *data;
+ size_t len;
+};
+
+#define STRING(x) (struct string){x, sizeof(x)-1}
+#define NULSTR(x) (struct string){x, strlen(x)}
+
+#define STRING_EQ(x, y) ((x).len == (y).len && memcmp((x).data, (y).data, (x).len) == 0)
+
+#define WRITES(x, y) write((x), (y).data, (y).len)
diff --git a/hax_string_utils.c b/hax_string_utils.c
new file mode 100644
index 0000000..5112c0c
--- /dev/null
+++ b/hax_string_utils.c
@@ -0,0 +1,130 @@
+// Hax's string utils
+//
+// Written by: Test_User <hax@andrewyu.org>
+//
+// This is free and unencumbered software released into the public
+// domain.
+//
+// Anyone is free to copy, modify, publish, use, compile, sell, or
+// distribute this software, either in source code form or as a compiled
+// binary, for any purpose, commercial or non-commercial, and by any
+// means.
+//
+// In jurisdictions that recognize copyright laws, the author or authors
+// of this software dedicate any and all copyright interest in the
+// software to the public domain. We make this dedication for the benefit
+// of the public at large and to the detriment of our heirs and
+// successors. We intend this dedication to be an overt act of
+// relinquishment in perpetuity of all present and future rights to this
+// software under copyright law.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "hax_string.h"
+#include "hax_string_utils.h"
+
+size_t str_to_unsigned(struct string str, char *err) {
+ if (str.len == 0) {
+ *err = 1;
+ return 0;
+ }
+
+ size_t val = 0;
+ while (str.len > 0) {
+ switch(str.data[0]) {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if (val > ((size_t)-1)/10) {
+ *err = 1;
+ return 0;
+ }
+ val *= 10;
+ if (val > (-((size_t)((unsigned char)str.data[0] - 0x30) + 1))) {
+ *err = 1;
+ return 0;
+ }
+ val += (unsigned char)str.data[0] - 0x30;
+ break;
+ default:
+ *err = 1;
+ return 0;
+ }
+
+ str.data++;
+ str.len--;
+ }
+
+ *err = 0;
+ return val;
+}
+
+int unsigned_to_str(size_t number, struct string *str) {
+ size_t len = 0;
+ {
+ size_t tmp = number;
+ do {
+ len++;
+ } while ((tmp = tmp / 10) != 0);
+ }
+
+ void *tmp = malloc(len);
+ if (!tmp)
+ return 1;
+
+ str->data = tmp;
+ str->len = len;
+
+ for (size_t i = len; i > 0; i--) {
+ str->data[i - 1] = (char)((number % 10) + 0x30);
+ number = number / 10;
+ }
+
+ return 0;
+}
+
+int str_clone(struct string *dest, struct string source) {
+ dest->data = malloc(source.len);
+ if (!dest->data)
+ return 1;
+ memcpy(dest->data, source.data, source.len);
+ dest->len = source.len;
+
+ return 0;
+}
+
+int str_combine(struct string *dest, size_t count, struct string *sources) {
+ size_t len = 0;
+ for (size_t i = 0; i < count; i++)
+ len += sources[i].len;
+
+ dest->data = malloc(len);
+ if (!dest->data && len != 0)
+ return 1;
+ dest->len = len;
+
+ size_t offset = 0;
+ for (size_t i = 0; i < count; i++) {
+ memcpy(&(dest->data[offset]), sources[i].data, sources[i].len);
+ offset += sources[i].len;
+ }
+
+ return 0;
+}
diff --git a/hax_string_utils.h b/hax_string_utils.h
new file mode 100644
index 0000000..f0e067e
--- /dev/null
+++ b/hax_string_utils.h
@@ -0,0 +1,38 @@
+// Header for hax's string utils
+//
+// Written by: Test_User <hax@andrewyu.org>
+//
+// This is free and unencumbered software released into the public
+// domain.
+//
+// Anyone is free to copy, modify, publish, use, compile, sell, or
+// distribute this software, either in source code form or as a compiled
+// binary, for any purpose, commercial or non-commercial, and by any
+// means.
+//
+// In jurisdictions that recognize copyright laws, the author or authors
+// of this software dedicate any and all copyright interest in the
+// software to the public domain. We make this dedication for the benefit
+// of the public at large and to the detriment of our heirs and
+// successors. We intend this dedication to be an overt act of
+// relinquishment in perpetuity of all present and future rights to this
+// software under copyright law.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+
+#pragma once
+
+#include <stddef.h>
+#include "hax_string.h"
+
+size_t str_to_unsigned(struct string str, char *err);
+int unsigned_to_str(size_t number, struct string *str);
+
+int str_clone(struct string *dest, struct string source);
+int str_combine(struct string *dest, size_t count, struct string *sources);