aboutsummaryrefslogtreecommitdiff
path: root/util.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-03-10 00:03:21 -0500
committerBruce Hill <bruce@bruce-hill.com>2024-03-10 00:03:21 -0500
commita33f73061776d6814f67fecd230c0706bc1ff10c (patch)
tree7f47f83f783f5b08a02bdd940988d9637102e6e4 /util.c
parentb639f01294f8c528ad0597a179f7e426bccdfb80 (diff)
Rearranging some files
Diffstat (limited to 'util.c')
-rw-r--r--util.c84
1 files changed, 0 insertions, 84 deletions
diff --git a/util.c b/util.c
deleted file mode 100644
index 16ef7aaf..00000000
--- a/util.c
+++ /dev/null
@@ -1,84 +0,0 @@
-#include <ctype.h>
-#include <gc.h>
-#include <gc/cord.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "util.h"
-
-public char *heap_strn(const char *str, size_t len)
-{
- if (!str) return NULL;
- if (len == 0) return "";
- char *heaped = GC_MALLOC_ATOMIC(len + 1);
- memcpy(heaped, str, len);
- heaped[len] = '\0';
- return heaped;
-}
-
-public char *heap_str(const char *str)
-{
- if (!str) return NULL;
- return heap_strn(str, strlen(str));
-}
-
-public char *heap_strf(const char *fmt, ...)
-{
- va_list args;
- va_start(args, fmt);
- char *tmp = NULL;
- int len = vasprintf(&tmp, fmt, args);
- if (len < 0) return NULL;
- va_end(args);
- char *ret = heap_strn(tmp, (size_t)len);
- free(tmp);
- return ret;
-}
-
-// Name mangling algorithm to produce valid identifiers:
-// Escape individual chars as "_x%02X"
-// Things being escaped:
-// - Leading digit
-// - Non alphanumeric/non-underscore characters
-// - "_" when followed by "x" and two uppercase hex digits
-public char *mangle(const char *name)
-{
- size_t len = 0;
- for (const char *p = name; *p; p++) {
- if ((!isalnum(*p) && *p != '_') // Non-identifier character
- || (p == name && isdigit(*p)) // Leading digit
- || (p[0] == '_' && p[1] == 'x' && strspn(p+2, "ABCDEF0123456789") >= 2)) { // Looks like hex escape
- len += strlen("_x00"); // Hex escape
- } else {
- len += 1;
- }
- }
- char *mangled = GC_MALLOC_ATOMIC(len + 1);
- char *dest = mangled;
- for (const char *src = name; *src; src++) {
- if ((!isalnum(*src) && *src != '_') // Non-identifier character
- || (src == name && isdigit(*src)) // Leading digit
- || (src[0] == '_' && src[1] == 'x' && strspn(src+2, "ABCDEF0123456789") >= 2)) { // Looks like hex escape
- dest += sprintf(dest, "_x%02X", *src); // Hex escape
- } else {
- *(dest++) = *src;
- }
- }
- mangled[len] = '\0';
- return mangled;
-}
-
-CORD CORD_asprintf(CORD fmt, ...)
-{
- va_list args;
- va_start(args, fmt);
- CORD c = NULL;
- CORD_vsprintf(&c, fmt, args);
- va_end(args);
- return c;
-}
-
-
-// vim: ts=4 sw=0 et cino=L2,l1,(0,W4,m1,\:0