diff src/lread.c @ 13146:6182d95acd14

(read1): Handle chartables and boolvectors.
author Richard M. Stallman <rms@gnu.org>
date Sat, 07 Oct 1995 22:01:39 +0000
parents cd0e7903d0a9
children 0f83b9eb5478
line wrap: on
line diff
--- a/src/lread.c	Sat Oct 07 22:00:06 1995 +0000
+++ b/src/lread.c	Sat Oct 07 22:01:39 1995 +0000
@@ -1180,6 +1180,46 @@
 
     case '#':
       c = READCHAR;
+      if (c == '^')
+	{
+	  c = READCHAR;
+	  if (c == '[')
+	    {
+	      Lisp_Object tmp;
+	      tmp = read_vector (readcharfun);
+	      if (XVECTOR (tmp)->size < CHAR_TABLE_STANDARD_SLOTS
+		  || XVECTOR (tmp)->size > CHAR_TABLE_STANDARD_SLOTS + 10)
+		error ("Invalid size char-table");
+	      XSETCHAR_TABLE (tmp, XCHAR_TABLE (tmp));
+	      return tmp;
+	    }
+	  Fsignal (Qinvalid_read_syntax, Fcons (make_string ("#^", 2), Qnil));
+	}
+      if (c == '&')
+	{
+	  Lisp_Object length;
+	  length = read1 (readcharfun, pch, first_in_list);
+	  c = READCHAR;
+	  if (c == '"')
+	    {
+	      Lisp_Object tmp, val;
+	      int bits_per_char = INTBITS / sizeof (int);
+	      int size_in_chars = ((XFASTINT (length) + bits_per_char)
+				   / bits_per_char);
+
+	      UNREAD (c);
+	      tmp = read1 (readcharfun, pch, first_in_list);
+	      if (size_in_chars != XSTRING (tmp)->size)
+		Fsignal (Qinvalid_read_syntax,
+			 Fcons (make_string ("#&", 2), Qnil));
+		
+	      val = Fmake_bool_vector (length, Qnil);
+	      bcopy (XSTRING (tmp)->data, XBOOL_VECTOR (val)->data,
+		     size_in_chars);
+	      return val;
+	    }
+	  Fsignal (Qinvalid_read_syntax, Fcons (make_string ("#&", 2), Qnil));
+	}
       if (c == '[')
 	{
 	  /* Accept compiled functions at read-time so that we don't have to