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

View 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)