1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-20 19:50:24 +02:00

(scm_lreadr): Signal an error for invalid escape sequences in strings.

Code cleanups too.
This commit is contained in:
Marius Vollmer 2003-11-30 00:57:03 +00:00
parent 7dd3f110af
commit b645ea8c7e

View file

@ -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;