core; reader_read_string: Support escaped characters.

* src/reader.c (reader_read_string): Support escaped characters.
This commit is contained in:
Jan Nieuwenhuizen 2018-04-22 00:33:50 +02:00
parent cf1704f5b3
commit 3f943c8cfa
No known key found for this signature in database
GPG Key ID: F3C1A0D9C1D65273
2 changed files with 48 additions and 5 deletions

View File

@ -523,15 +523,20 @@ error (SCM key, SCM x)
} }
SCM SCM
cstring_to_list (char const* s) string_to_list (char const* s, int i)
{ {
SCM p = cell_nil; SCM p = cell_nil;
int i = strlen (s);
while (i--) while (i--)
p = cons (MAKE_CHAR (s[i]), p); p = cons (MAKE_CHAR (s[i]), p);
return p; return p;
} }
SCM
cstring_to_list (char const* s)
{
return string_to_list (s, strlen (s));
}
// extra lib // extra lib
SCM SCM
assert_defined (SCM x, SCM e) ///((internal)) assert_defined (SCM x, SCM e) ///((internal))

View File

@ -369,7 +369,7 @@ reader_read_string ()
if (c == '"' || i > 1022) if (c == '"' || i > 1022)
{ {
buf[i] = 0; buf[i] = 0;
lst = append2 (lst, cstring_to_list (buf)); lst = append2 (lst, string_to_list (buf, i));
i = 0; i = 0;
if (c == '"') if (c == '"')
break; break;
@ -379,16 +379,54 @@ reader_read_string ()
int p = peekchar (); int p = peekchar ();
if (p == '\\' || p == '"') if (p == '\\' || p == '"')
buf[i++] = getchar (); buf[i++] = getchar ();
else if (p == 'n') else if (p == '0')
{ {
getchar (); 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') else if (p == 't')
{ {
getchar (); getchar ();
buf[i++] = '\t'; 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__ #if 0 // !__MESC__
else if (c == EOF) else if (c == EOF)