aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lread.c30
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 }