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++)
--
⑨