From 3f943c8cfacb41bf4b3a7f6bec7655d6fea72177 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Sun, 22 Apr 2018 00:33:50 +0200 Subject: [PATCH] core; reader_read_string: Support escaped characters. * src/reader.c (reader_read_string): Support escaped characters. --- src/mes.c | 9 +++++++-- src/reader.c | 44 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/src/mes.c b/src/mes.c index fd2f457f..3eeb1852 100644 --- 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)); +} + // extra lib SCM assert_defined (SCM x, SCM e) ///((internal)) diff --git a/src/reader.c b/src/reader.c index e27cdd77..e0cebea0 100644 --- a/src/reader.c +++ b/src/reader.c @@ -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)