/[guile]/guile/guile-core/libguile/read.c
ViewVC logotype

Diff of /guile/guile-core/libguile/read.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.92 by mvo, Sun Nov 16 21:01:57 2003 UTC revision 1.93 by mvo, Sun Nov 30 00:57:03 2003 UTC
# Line 499  scm_lreadr (SCM *tok_buf, SCM port, SCM Line 499  scm_lreadr (SCM *tok_buf, SCM port, SCM
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':
# Line 524  scm_lreadr (SCM *tok_buf, SCM port, SCM Line 527  scm_lreadr (SCM *tok_buf, SCM port, SCM
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;

Legend:
Removed from v.1.92  
changed lines
  Added in v.1.93

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26