core: Bump MAX_STRING to 524288
authorJan Nieuwenhuizen <janneke@gnu.org>
Sat, 15 Dec 2018 09:34:57 +0000 (10:34 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sat, 15 Dec 2018 09:34:57 +0000 (10:34 +0100)
* src/strings.c (MAX_STRING): Bump to 524288.
(assert_max_string): New function.
(list_to_cstring, string_append, read_string): Use it.
* src/reader.c (reader_read_string): Use it.

src/reader.c
src/strings.c

index 86254ff8a9c1bcec6dec18aa36b9522fa72421db..3dfd3b04f201e031ddc9fdfd725e6eb2652cd9be 100644 (file)
@@ -69,7 +69,6 @@ reader_end_of_word_p (int c)
 SCM
 reader_read_identifier_or_number (int c)
 {
-  char buf[MAX_STRING];
   int i = 0;
   long n = 0;
   int negative_p = 0;
@@ -82,7 +81,7 @@ reader_read_identifier_or_number (int c)
     }
   while (isdigit (c))
     {
-      buf[i++] = c;
+      g_buf[i++] = c;
       n *= 10;
       n += c - '0';
       c = readchar ();
@@ -97,12 +96,12 @@ reader_read_identifier_or_number (int c)
   /* Fallthrough: Note that `4a', `+1b' are identifiers */
   while (!reader_end_of_word_p (c))
     {
-      buf[i++] = c;
+      g_buf[i++] = c;
       c = readchar ();
     }
   unreadchar (c);
-  buf[i] = 0;
-  return cstring_to_symbol (buf);
+  g_buf[i] = 0;
+  return cstring_to_symbol (g_buf);
 }
 
 SCM
@@ -433,12 +432,12 @@ reader_read_hex ()
 SCM
 reader_read_string ()
 {
-  char buf[MAX_STRING];
   size_t i = 0;
   int c;
   do
     {
-      assert (i < MAX_STRING);
+      if (i > MAX_STRING)
+        assert_max_string (i, "reader_read_string", g_buf);
       c = readchar ();
       if (c == '"')
         break;
@@ -472,11 +471,11 @@ reader_read_string ()
           else if (c == 'x')
             c = VALUE (reader_read_hex ());
         }
-      buf[i++] = c;
+      g_buf[i++] = c;
     }
   while (1);
-  buf[i] = 0;
-  return make_string (buf, i);
+  g_buf[i] = 0;
+  return make_string (g_buf, i);
 }
 
 int g_tiny = 0;
index 86828461ce6c2f82803a116ebe225d9dcea5ef6f..4aa80f52f29429222964d605c39f888bfe1e3078 100644 (file)
  * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <string.h>
+#define MAX_STRING 524288
+char g_buf[MAX_STRING];
 
-#define MAX_STRING 4096
+void
+assert_max_string (size_t i, char const* msg, char* string)
+{
+  if (i > MAX_STRING) // Mes must be able to make g_buf
+    {
+      eputs (msg);
+      eputs (":string too long[");
+      eputs (itoa (i));
+      eputs ("]:");
+      string[MAX_STRING-1] = 0;
+      eputs (string);
+      error (cell_symbol_system_error, cell_f);
+    }
+}
 
 char const*
 list_to_cstring (SCM list, size_t* size)
 {
-  static char buf[MAX_STRING];
   size_t i = 0;
-  char *p = buf;
+  char *p = g_buf;
   while (list != cell_nil)
     {
-      assert (i < MAX_STRING);
-      buf[i++] = VALUE (car (list));
+      if (i > MAX_STRING)
+        assert_max_string (i, "list_to_string", g_buf);
+      g_buf[i++] = VALUE (car (list));
       list = cdr (list);
     }
-  buf[i] = 0;
+  g_buf[i] = 0;
   *size = i;
-  return buf;
+  return g_buf;
 }
 
 size_t
@@ -71,7 +85,8 @@ make_bytes (char const* s, size_t length)
 SCM
 make_string (char const* s, size_t length)
 {
-  assert (length < HALFLONG_MAX);
+  if (length > MAX_STRING)
+    assert_max_string (length, "make_string", s);
   SCM x = make_cell__ (TSTRING, length, 0);
   SCM v = make_bytes (s, length);
   CDR (x) = v;
@@ -230,25 +245,24 @@ read_string (SCM port) ///((arity . n))
   if (TYPE (port) == TPAIR && TYPE (car (port)) == TNUMBER)
     g_stdin = VALUE (CAR (port));
   int c = readchar ();
-  static char buf[MAX_STRING];
   size_t i = 0;
   while (c != -1)
     {
-      assert (i < MAX_STRING);
-      buf[i++] = c;
+      if (i > MAX_STRING)
+        assert_max_string (i, "read_string", g_buf);
+      g_buf[i++] = c;
       c = readchar ();
     }
-  buf[i] = 0;
+  g_buf[i] = 0;
   g_stdin = fd;
-  return make_string (buf, i);
+  return make_string (g_buf, i);
 }
 
 SCM
 string_append (SCM x) ///((arity . n))
 {
-  static char buf[MAX_STRING];
-  char const *p = buf;
-  buf[0] = 0;
+  char const *p = g_buf;
+  g_buf[0] = 0;
   size_t size = 0;
   while (x != cell_nil)
     {
@@ -257,10 +271,11 @@ string_append (SCM x) ///((arity . n))
       memcpy (p, CSTRING (string), LENGTH (string) + 1);
       p += LENGTH (string);
       size += LENGTH (string);
-      assert (size < MAX_STRING);
+      if (size > MAX_STRING)
+        assert_max_string (size, "string_append", g_buf);
       x = CDR (x);
     }
-  return make_string (buf, size);
+  return make_string (g_buf, size);
 }
 
 SCM
@@ -277,7 +292,7 @@ string_ref (SCM str, SCM k)
   assert (TYPE (k) == TNUMBER);
   size_t size = LENGTH (str);
   size_t i = VALUE (k);
-  if (i >= size)
+  if (i > size)
     error (cell_symbol_system_error, cons (MAKE_STRING0 ("value out of range"), k));
   char const *p = CSTRING (str);
   return MAKE_CHAR (p[i]);