changeset 2018:7c970ef8949d

(read_escape): Handle M-, C- and S- for new convention. (read1): Move the meta bit to the right place for a string.
author Richard M. Stallman <rms@gnu.org>
date Fri, 05 Mar 1993 23:57:00 +0000
parents ffa43acb7de7
children c9585b37467c
files src/lread.c
diffstat 1 files changed, 25 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/lread.c	Fri Mar 05 23:56:43 1993 +0000
+++ b/src/lread.c	Fri Mar 05 23:57:00 1993 +0000
@@ -766,6 +766,8 @@
       return '\007';
     case 'b':
       return '\b';
+    case 'd':
+      return 0177;
     case 'e':
       return 033;
     case 'f':
@@ -788,7 +790,16 @@
       c = READCHAR;
       if (c == '\\')
 	c = read_escape (readcharfun);
-      return c | 0200;
+      return c | CHAR_META;
+
+    case 'S':
+      c = READCHAR;
+      if (c != '-')
+	error ("Invalid escape character syntax");
+      c = READCHAR;
+      if (c == '\\')
+	c = read_escape (readcharfun);
+      return c | CHAR_SHIFT;
 
     case 'C':
       c = READCHAR;
@@ -798,10 +809,16 @@
       c = READCHAR;
       if (c == '\\')
 	c = read_escape (readcharfun);
-      if (c == '?')
-	return 0177;
+      if ((c & 0177) == '?')
+	return 0177 | c;
+      /* ASCII control chars are made from letters (both cases),
+	 as well as the non-letters within 0100...0137.  */
+      else if ((c & 0137) >= 0101 && (c & 0137) <= 0132)
+	return (c & (037 | ~0177));
+      else if ((c & 0177) >= 0100 && (c & 0177) <= 0137)
+	return (c & (037 | ~0177));
       else
-	return (c & (0200 | 037));
+	return c | CHAR_CTL;
 
     case '0':
     case '1':
@@ -989,11 +1006,14 @@
 	    if (c == '\\')
 	      c = read_escape (readcharfun);
 	    /* c is -1 if \ newline has just been seen */
-	    if (c < 0)
+	    if (c == -1)
 	      {
 		if (p == read_buffer)
 		  cancel = 1;
 	      }
+	    else if (c & CHAR_META)
+	      /* Move the meta bit to the right place for a string.  */
+	      *p++ = (c & ~CHAR_META) | 0x80;
 	    else
 	      *p++ = c;
 	  }