diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lread.c | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/src/lread.c b/src/lread.c index 24671290ab3..049a9bd0b62 100644 --- a/src/lread.c +++ b/src/lread.c | |||
| @@ -766,6 +766,8 @@ read_escape (readcharfun) | |||
| 766 | return '\007'; | 766 | return '\007'; |
| 767 | case 'b': | 767 | case 'b': |
| 768 | return '\b'; | 768 | return '\b'; |
| 769 | case 'd': | ||
| 770 | return 0177; | ||
| 769 | case 'e': | 771 | case 'e': |
| 770 | return 033; | 772 | return 033; |
| 771 | case 'f': | 773 | case 'f': |
| @@ -788,7 +790,16 @@ read_escape (readcharfun) | |||
| 788 | c = READCHAR; | 790 | c = READCHAR; |
| 789 | if (c == '\\') | 791 | if (c == '\\') |
| 790 | c = read_escape (readcharfun); | 792 | c = read_escape (readcharfun); |
| 791 | return c | 0200; | 793 | return c | CHAR_META; |
| 794 | |||
| 795 | case 'S': | ||
| 796 | c = READCHAR; | ||
| 797 | if (c != '-') | ||
| 798 | error ("Invalid escape character syntax"); | ||
| 799 | c = READCHAR; | ||
| 800 | if (c == '\\') | ||
| 801 | c = read_escape (readcharfun); | ||
| 802 | return c | CHAR_SHIFT; | ||
| 792 | 803 | ||
| 793 | case 'C': | 804 | case 'C': |
| 794 | c = READCHAR; | 805 | c = READCHAR; |
| @@ -798,10 +809,16 @@ read_escape (readcharfun) | |||
| 798 | c = READCHAR; | 809 | c = READCHAR; |
| 799 | if (c == '\\') | 810 | if (c == '\\') |
| 800 | c = read_escape (readcharfun); | 811 | c = read_escape (readcharfun); |
| 801 | if (c == '?') | 812 | if ((c & 0177) == '?') |
| 802 | return 0177; | 813 | return 0177 | c; |
| 814 | /* ASCII control chars are made from letters (both cases), | ||
| 815 | as well as the non-letters within 0100...0137. */ | ||
| 816 | else if ((c & 0137) >= 0101 && (c & 0137) <= 0132) | ||
| 817 | return (c & (037 | ~0177)); | ||
| 818 | else if ((c & 0177) >= 0100 && (c & 0177) <= 0137) | ||
| 819 | return (c & (037 | ~0177)); | ||
| 803 | else | 820 | else |
| 804 | return (c & (0200 | 037)); | 821 | return c | CHAR_CTL; |
| 805 | 822 | ||
| 806 | case '0': | 823 | case '0': |
| 807 | case '1': | 824 | case '1': |
| @@ -989,11 +1006,14 @@ read1 (readcharfun) | |||
| 989 | if (c == '\\') | 1006 | if (c == '\\') |
| 990 | c = read_escape (readcharfun); | 1007 | c = read_escape (readcharfun); |
| 991 | /* c is -1 if \ newline has just been seen */ | 1008 | /* c is -1 if \ newline has just been seen */ |
| 992 | if (c < 0) | 1009 | if (c == -1) |
| 993 | { | 1010 | { |
| 994 | if (p == read_buffer) | 1011 | if (p == read_buffer) |
| 995 | cancel = 1; | 1012 | cancel = 1; |
| 996 | } | 1013 | } |
| 1014 | else if (c & CHAR_META) | ||
| 1015 | /* Move the meta bit to the right place for a string. */ | ||
| 1016 | *p++ = (c & ~CHAR_META) | 0x80; | ||
| 997 | else | 1017 | else |
| 998 | *p++ = c; | 1018 | *p++ = c; |
| 999 | } | 1019 | } |