shithub: MicroHs

Download patch

ref: 88b845ec25cb28b081ec98b2a2d1e345815b2f9b
parent: ec20032e86771290097d25e703682b452f474284
author: Lennart Augustsson <lennart@augustsson.net>
date: Fri Dec 22 15:11:53 EST 2023

Refactor reading strings.

--- a/src/runtime/eval.c
+++ b/src/runtime/eval.c
@@ -1298,6 +1298,38 @@
   }
 }
 
+char *
+parse_string(BFILE *f)
+{
+  size_t sz = 20;
+  char *buffer = MALLOC(sz);
+  size_t i;
+  int c;
+
+  if (!buffer)
+    memerr();
+  for(i = 0;;) {
+    c = f->getb(f);
+    if (c == '"')
+      break;
+    if (i >= sz) {
+      sz *= 2;
+      buffer = realloc(buffer, sz);
+      if (!buffer)
+        memerr();
+    }
+    if (c == '\\') {
+      buffer[i++] = (char)parse_int(f);
+      if (!gobble(f, '&'))
+        ERR("parse string");
+    } else {
+      buffer[i++] = c;
+    }
+  }
+  buffer[i++] = 0;
+  return realloc(buffer, i);
+}
+
 NODEPTR
 parse(BFILE *f)
 {
@@ -1372,26 +1404,7 @@
      * Special characters are encoded as \NNN&,
      * where NNN is the decimal value of the character */
     /* XXX assume there are no NULs in the string, and all fit in a char */
-    /* XXX allocation is a hack */
-    {
-      char *buffer = MALLOC(10000);
-      char *p = buffer;
-      for(;;) {
-        c = f->getb(f);
-        if (c == '"')
-          break;
-        if (c == '\\') {
-          *p++ = (char)parse_int(f);
-          if (!gobble(f, '&'))
-            ERR("parse string");
-        } else {
-          *p++ = c;
-        }
-      }
-      *p++ = 0;
-      r = mkStrNode(realloc(buffer, p - buffer));
-      return r;
-    }
+    return mkStrNode(parse_string(f));
   case '^':
     /* An FFI name */
     for (int j = 0; (buf[j] = getNT(f)); j++)
--