new function stralloc
authorRalph Ronnquist <ralph.ronnquist@gmail.com>
Thu, 11 Nov 2021 08:08:18 +0000 (19:08 +1100)
committerRalph Ronnquist <ralph.ronnquist@gmail.com>
Thu, 11 Nov 2021 08:08:18 +0000 (19:08 +1100)
stringmem.c
stringmem.h

index 303add79f6621dbb8d7b8f2e1c568b9faf72ea12..1a6bf00e89d6e0f43c79e1a668e155c9d850509e 100644 (file)
@@ -11,13 +11,27 @@ static struct {
     char *end;
 } heap;
 
-char *strjoin(const char *first,...) {
-    va_list ap;
+static inline void strinitialize() {
     if ( heap.base == 0 ) {
        heap.base = (char*) malloc( STRINGSPACE );
        heap.current = heap.base;
        heap.end = heap.base + STRINGSPACE;
     }
+}
+
+extern char *stralloc(int size) {
+    strinitialize();
+    if ( heap.current + size >= heap.end ) {
+       heap.current = heap.base;
+    }
+    char *start = heap.current;
+    heap.current += size;
+    return start;
+}
+
+char *strjoin(const char *first,...) {
+    va_list ap;
+    strinitialize();
     char *start = heap.current;
     const char *p = first;
     size_t size = strlen( first ) + 1;
@@ -29,7 +43,7 @@ char *strjoin(const char *first,...) {
     if ( size > BIGSTRING ) {
        start = (char*) malloc( size );
     } else {
-       if ( heap.current + size > heap.end ) {
+       if ( heap.current + size >= heap.end ) {
            heap.current = heap.base;
        }
        start = heap.current;
index c25218f1996dff9e5642ed8c012402af92ff4c6d..1a3f695116d8f31d5f5044a0ca914f2647340535 100644 (file)
@@ -1,6 +1,9 @@
 
-// Concatenate strigns onto the heap if possible, or malloc new.
+// Concatenate strings onto the heap if possible, or malloc new.
 extern char *strjoin(const char *first,...);
 
+// Allocate buffer space from the heap
+extern char *stralloc(int size);
+
 // Dispose memory possibly within the string heap
 extern void strfree(char *p);