From b879a4f884b10773fe50cebd671fe7d3a0733c5c Mon Sep 17 00:00:00 2001 From: Test_User Date: Wed, 4 Sep 2024 08:33:26 -0400 Subject: Hax's string stuff in its own repo, no more copying it everywhere --- .gitignore | 4 ++ Makefile | 116 +++++++++++++++++++++++++++++++++++++++++++++++ hax_string.h | 45 +++++++++++++++++++ hax_string_utils.c | 130 +++++++++++++++++++++++++++++++++++++++++++++++++++++ hax_string_utils.h | 38 ++++++++++++++++ 5 files changed, 333 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 hax_string.h create mode 100644 hax_string_utils.c create mode 100644 hax_string_utils.h 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 +# +# 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 +// +// 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 +#include +#include + +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 +// +// 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 +#include +#include + +#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 +// +// 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 +#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); -- cgit v1.2.3