core; reader_read_string: Support escaped characters.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sat, 21 Apr 2018 22:33:50 +0000 (00:33 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sat, 21 Apr 2018 22:33:50 +0000 (00:33 +0200)
* src/reader.c (reader_read_string): Support escaped characters.

src/mes.c
src/reader.c

index fd2f457fb2f639f72b2e5be07b7f7854b8f41767..3eeb1852d39377d60ab9885290aabceff6d5e16f 100644 (file)
--- a/src/mes.c
+++ b/src/mes.c
@@ -523,15 +523,20 @@ error (SCM key, SCM x)
 }
 
 SCM
-cstring_to_list (char const* s)
+string_to_list (char const* s, int i)
 {
   SCM p = cell_nil;
-  int i = strlen (s);
   while (i--)
     p = cons (MAKE_CHAR (s[i]), p);
   return p;
 }
 
+SCM
+cstring_to_list (char const* s)
+{
+  return string_to_list (s, strlen (s));
+}
+
 // \f extra lib
 SCM
 assert_defined (SCM x, SCM e) ///((internal))
index e27cdd77668b44d07e8f07f955744c6e4a7ff68b..e0cebea0255412c79e1954faddce83a78d76a6da 100644 (file)
@@ -369,7 +369,7 @@ reader_read_string ()
       if (c == '"' || i > 1022)
         {
           buf[i] = 0;
-          lst = append2 (lst, cstring_to_list (buf));
+          lst = append2 (lst, string_to_list (buf, i));
           i = 0;
           if (c == '"')
             break;
@@ -379,16 +379,54 @@ reader_read_string ()
           int p = peekchar ();
           if (p == '\\' || p == '"')
             buf[i++] = getchar ();
-          else if (p == 'n')
+          else if (p == '0')
             {
               getchar ();
-              buf[i++] = '\n';
+              buf[i++] = '\0';
+            }
+          else if (p == 'a')
+            {
+              getchar ();
+              buf[i++] = '\a';
+            }
+          else if (p == 'b')
+            {
+              getchar ();
+              buf[i++] = '\b';
             }
           else if (p == 't')
             {
               getchar ();
               buf[i++] = '\t';
             }
+          else if (p == 'n')
+            {
+              getchar ();
+              buf[i++] = '\n';
+            }
+          else if (p == 'v')
+            {
+              getchar ();
+              buf[i++] = '\v';
+            }
+          else if (p == 'f')
+            {
+              getchar ();
+              buf[i++] = '\f';
+            }
+          else if (p == 'r')
+            {
+              getchar ();
+              //Nyacc bug
+              //buf[i++] = '\r';
+              buf[i++] = 13;
+            }
+          else if (p == 'e')
+            {
+              getchar ();
+              //buf[i++] = '\e';
+              buf[i++] = 27;
+            }
         }
 #if 0 // !__MESC__
       else if (c == EOF)