Index: guile-core/libguile/read.c =================================================================== RCS file: /cvsroot/guile/guile/guile-core/libguile/read.c,v retrieving revision 1.92 diff -u -r1.92 read.c --- guile-core/libguile/read.c 16 Nov 2003 21:01:57 -0000 1.92 +++ guile-core/libguile/read.c 25 Nov 2003 17:06:09 -0000 @@ -524,28 +524,27 @@ break; case 'x': { - int a, b, a_09 = 0, b_09 = 0, a_AF = 0, b_AF = 0, a_af = 0, - b_af = 0; + int a, b; a = scm_getc (port); if (a == EOF) goto str_eof; b = scm_getc (port); if (b == EOF) goto str_eof; - if ('0' <= a && a <= '9') a_09 = 1; - else if ('A' <= a && a <= 'F') a_AF = 1; - else if ('a' <= a && a <= 'f') a_af = 1; - if ('0' <= b && b <= '9') b_09 = 1; - else if ('A' <= b && b <= 'F') b_AF = 1; - else if ('a' <= b && b <= 'f') b_af = 1; - if ((a_09 || a_AF || a_af) && (b_09 || b_AF || b_af)) - c = (a_09? a - '0': a_AF? a - 'A' + 10: a - 'a' + 10) * 16 - + (b_09? b - '0': b_AF? b - 'A' + 10: b - 'a' + 10); - else - { - scm_ungetc (b, port); - scm_ungetc (a, port); - } + if ('0' <= a && a <= '9') a -= '0'; + else if ('A' <= a && a <= 'F') a = a - 'A' + 10; + else if ('a' <= a && a <= 'f') a = a - 'a' + 10; + else goto bad_escaped; + if ('0' <= b && b <= '9') b -= '0'; + else if ('A' <= b && b <= 'F') b = b - 'A' + 10; + else if ('a' <= b && b <= 'f') b = b - 'a' + 10; + else goto bad_escaped; + c = a * 16 + b; 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; ++j;