mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-20 11:40:18 +02:00
(scm_lreadr): Signal an error for invalid escape sequences in strings.
Code cleanups too.
This commit is contained in:
parent
7dd3f110af
commit
b645ea8c7e
1 changed files with 18 additions and 16 deletions
|
@ -499,6 +499,9 @@ scm_lreadr (SCM *tok_buf, SCM port, SCM *copy)
|
||||||
{
|
{
|
||||||
case EOF:
|
case EOF:
|
||||||
goto str_eof;
|
goto str_eof;
|
||||||
|
case '"':
|
||||||
|
case '\\':
|
||||||
|
break;
|
||||||
case '\n':
|
case '\n':
|
||||||
continue;
|
continue;
|
||||||
case '0':
|
case '0':
|
||||||
|
@ -524,28 +527,27 @@ scm_lreadr (SCM *tok_buf, SCM port, SCM *copy)
|
||||||
break;
|
break;
|
||||||
case 'x':
|
case 'x':
|
||||||
{
|
{
|
||||||
int a, b, a_09 = 0, b_09 = 0, a_AF = 0, b_AF = 0, a_af = 0,
|
int a, b;
|
||||||
b_af = 0;
|
|
||||||
a = scm_getc (port);
|
a = scm_getc (port);
|
||||||
if (a == EOF) goto str_eof;
|
if (a == EOF) goto str_eof;
|
||||||
b = scm_getc (port);
|
b = scm_getc (port);
|
||||||
if (b == EOF) goto str_eof;
|
if (b == EOF) goto str_eof;
|
||||||
if ('0' <= a && a <= '9') a_09 = 1;
|
if ('0' <= a && a <= '9') a -= '0';
|
||||||
else if ('A' <= a && a <= 'F') a_AF = 1;
|
else if ('A' <= a && a <= 'F') a = a - 'A' + 10;
|
||||||
else if ('a' <= a && a <= 'f') a_af = 1;
|
else if ('a' <= a && a <= 'f') a = a - 'a' + 10;
|
||||||
if ('0' <= b && b <= '9') b_09 = 1;
|
else goto bad_escaped;
|
||||||
else if ('A' <= b && b <= 'F') b_AF = 1;
|
if ('0' <= b && b <= '9') b -= '0';
|
||||||
else if ('a' <= b && b <= 'f') b_af = 1;
|
else if ('A' <= b && b <= 'F') b = b - 'A' + 10;
|
||||||
if ((a_09 || a_AF || a_af) && (b_09 || b_AF || b_af))
|
else if ('a' <= b && b <= 'f') b = b - 'a' + 10;
|
||||||
c = (a_09? a - '0': a_AF? a - 'A' + 10: a - 'a' + 10) * 16
|
else goto bad_escaped;
|
||||||
+ (b_09? b - '0': b_AF? b - 'A' + 10: b - 'a' + 10);
|
c = a * 16 + b;
|
||||||
else
|
|
||||||
{
|
|
||||||
scm_ungetc (b, port);
|
|
||||||
scm_ungetc (a, port);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
default:
|
||||||
|
bad_escaped:
|
||||||
|
scm_input_error(FUNC_NAME, port,
|
||||||
|
"illegal character in escape sequence: ~S",
|
||||||
|
scm_list_1 (SCM_MAKE_CHAR (c)));
|
||||||
}
|
}
|
||||||
SCM_STRING_CHARS (*tok_buf)[j] = c;
|
SCM_STRING_CHARS (*tok_buf)[j] = c;
|
||||||
++j;
|
++j;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue