changeset 1966:bcc34323a475

(read1--strings with properties case): Detect end of list, and invalid syntax, using recursive read1 calls. (read1): Handle reading strings with properties.
author Richard M. Stallman <rms@gnu.org>
date Mon, 01 Mar 1993 08:58:52 +0000
parents 2bdbd6ed2430
children 239a8c1cb40f
files src/lread.c
diffstat 1 files changed, 43 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/lread.c	Mon Mar 01 08:57:31 1993 +0000
+++ b/src/lread.c	Mon Mar 01 08:58:52 1993 +0000
@@ -899,11 +899,51 @@
 	{
 	  /* Accept compiled functions at read-time so that we don't have to
 	     build them using function calls.  */
-	  Lisp_Object tmp = read_vector (readcharfun);
-	  return Fmake_byte_code (XVECTOR(tmp)->size, XVECTOR (tmp)->contents);
+	  Lisp_Object tmp;
+	  tmp = read_vector (readcharfun);
+	  return Fmake_byte_code (XVECTOR (tmp)->size,
+				  XVECTOR (tmp)->contents);
 	}
+#ifdef USE_TEXT_PROPERTIES
+      if (c == '(')
+	{
+	  Lisp_Object tmp;
+	  struct gcpro gcpro1;
+
+	  /* Read the string itself.  */
+	  tmp = read1 (readcharfun);
+	  if (XTYPE (tmp) != Lisp_String)
+	    Fsignal (Qinvalid_read_syntax, Fcons (make_string ("#", 1), Qnil));
+	  GCPRO1 (tmp);
+	  /* Read the intervals and their properties.  */
+	  while (1)
+	    {
+	      Lisp_Object beg, end, plist;
+
+	      beg = read1 (readcharfun);
+	      if (XTYPE (beg) == Lisp_Internal)
+		{
+		  if (XINT (beg) == ')')
+		    break;
+		  Fsignal (Qinvalid_read_syntax, Fcons (make_string ("invalid string property list", 28), Qnil));
+		}
+	      end = read1 (readcharfun);
+	      if (XTYPE (end) == Lisp_Internal)
+		Fsignal (Qinvalid_read_syntax,
+			 Fcons (make_string ("invalid string property list", 28), Qnil));
+		
+	      plist = read1 (readcharfun);
+	      if (XTYPE (plist) == Lisp_Internal)
+		Fsignal (Qinvalid_read_syntax,
+			 Fcons (make_string ("invalid string property list", 28), Qnil));
+	      Fset_text_properties (beg, end, plist, tmp);
+	    }
+	  UNGCPRO;
+	  return tmp;
+	}
+#endif
       UNREAD (c);
-      return Fsignal (Qinvalid_read_syntax, Fcons (make_string ("#", 1), Qnil));
+      Fsignal (Qinvalid_read_syntax, Fcons (make_string ("#", 1), Qnil));
 
     case ';':
       while ((c = READCHAR) >= 0 && c != '\n');