499 |
{ |
{ |
500 |
case EOF: |
case EOF: |
501 |
goto str_eof; |
goto str_eof; |
502 |
|
case '"': |
503 |
|
case '\\': |
504 |
|
break; |
505 |
case '\n': |
case '\n': |
506 |
continue; |
continue; |
507 |
case '0': |
case '0': |
527 |
break; |
break; |
528 |
case 'x': |
case 'x': |
529 |
{ |
{ |
530 |
int a, b, a_09 = 0, b_09 = 0, a_AF = 0, b_AF = 0, a_af = 0, |
int a, b; |
|
b_af = 0; |
|
531 |
a = scm_getc (port); |
a = scm_getc (port); |
532 |
if (a == EOF) goto str_eof; |
if (a == EOF) goto str_eof; |
533 |
b = scm_getc (port); |
b = scm_getc (port); |
534 |
if (b == EOF) goto str_eof; |
if (b == EOF) goto str_eof; |
535 |
if ('0' <= a && a <= '9') a_09 = 1; |
if ('0' <= a && a <= '9') a -= '0'; |
536 |
else if ('A' <= a && a <= 'F') a_AF = 1; |
else if ('A' <= a && a <= 'F') a = a - 'A' + 10; |
537 |
else if ('a' <= a && a <= 'f') a_af = 1; |
else if ('a' <= a && a <= 'f') a = a - 'a' + 10; |
538 |
if ('0' <= b && b <= '9') b_09 = 1; |
else goto bad_escaped; |
539 |
else if ('A' <= b && b <= 'F') b_AF = 1; |
if ('0' <= b && b <= '9') b -= '0'; |
540 |
else if ('a' <= b && b <= 'f') b_af = 1; |
else if ('A' <= b && b <= 'F') b = b - 'A' + 10; |
541 |
if ((a_09 || a_AF || a_af) && (b_09 || b_AF || b_af)) |
else if ('a' <= b && b <= 'f') b = b - 'a' + 10; |
542 |
c = (a_09? a - '0': a_AF? a - 'A' + 10: a - 'a' + 10) * 16 |
else goto bad_escaped; |
543 |
+ (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); |
|
|
} |
|
544 |
break; |
break; |
545 |
} |
} |
546 |
|
default: |
547 |
|
bad_escaped: |
548 |
|
scm_input_error(FUNC_NAME, port, |
549 |
|
"illegal character in escape sequence: ~S", |
550 |
|
scm_list_1 (SCM_MAKE_CHAR (c))); |
551 |
} |
} |
552 |
SCM_STRING_CHARS (*tok_buf)[j] = c; |
SCM_STRING_CHARS (*tok_buf)[j] = c; |
553 |
++j; |
++j; |