* src/doc.c (get_doc_string): Slightly relax the sanity checking.
authorStefan Monnier <monnier@iro.umontreal.ca>
Thu, 9 May 2013 18:30:46 +0000 (14:30 -0400)
committerStefan Monnier <monnier@iro.umontreal.ca>
Thu, 9 May 2013 18:30:46 +0000 (14:30 -0400)
* src/lread.c (skip_dyn_eof): New function.
(read1): Use it to skip the end of a file in response to #@00.

src/ChangeLog
src/doc.c
src/lread.c

index 95b15a0..f668582 100644 (file)
@@ -1,3 +1,10 @@
+2013-05-09  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * lread.c (skip_dyn_eof): New function.
+       (read1): Use it to skip the end of a file in response to #@00.
+
+       * doc.c (get_doc_string): Slightly relax the sanity checking.
+
 2013-05-09  Jan Djärv  <jan.h.d@swipnet.se>
 
        * nsfns.m: Include IOGraphicsLib.h if Cocoa.
index 7234fb3..770cb1e 100644 (file)
--- a/src/doc.c
+++ b/src/doc.c
@@ -215,14 +215,20 @@ get_doc_string (Lisp_Object filepos, bool unibyte, bool definition)
   if (CONSP (filepos))
     {
       int test = 1;
-      if (get_doc_string_buffer[offset - test++] != ' ')
-       return Qnil;
-      while (get_doc_string_buffer[offset - test] >= '0'
-            && get_doc_string_buffer[offset - test] <= '9')
-       test++;
-      if (get_doc_string_buffer[offset - test++] != '@'
-         || get_doc_string_buffer[offset - test] != '#')
-       return Qnil;
+      /* A dynamic docstring should be either at the very beginning of a "#@
+        comment" or right after a dynamic docstring delimiter (in case we
+        pack several such docstrings within the same comment).  */
+      if (get_doc_string_buffer[offset - test] != '\037')
+       {
+         if (get_doc_string_buffer[offset - test++] != ' ')
+           return Qnil;
+         while (get_doc_string_buffer[offset - test] >= '0'
+                && get_doc_string_buffer[offset - test] <= '9')
+           test++;
+         if (get_doc_string_buffer[offset - test++] != '@'
+             || get_doc_string_buffer[offset - test] != '#')
+           return Qnil;
+       }
     }
   else
     {
index 272f252..1582166 100644 (file)
@@ -378,6 +378,19 @@ skip_dyn_bytes (Lisp_Object readcharfun, ptrdiff_t n)
     }
 }
 
+static void
+skip_dyn_eof (Lisp_Object readcharfun)
+{
+  if (FROM_FILE_P (readcharfun))
+    {
+      block_input ();          /* FIXME: Not sure if it's needed.  */
+      fseek (instream, 0, SEEK_END);
+      unblock_input ();
+    }
+  else
+    while (READCHAR >= 0);
+}
+
 /* Unread the character C in the way appropriate for the stream READCHARFUN.
    If the stream is a user function, call it with the char as argument.  */
 
@@ -2622,7 +2635,7 @@ read1 (Lisp_Object readcharfun, int *pch, bool first_in_list)
       if (c == '@')
        {
          enum { extra = 100 };
-         ptrdiff_t i, nskip = 0;
+         ptrdiff_t i, nskip = 0, digits = 0;
 
          /* Read a decimal integer.  */
          while ((c = READCHAR) >= 0
@@ -2630,8 +2643,14 @@ read1 (Lisp_Object readcharfun, int *pch, bool first_in_list)
            {
              if ((STRING_BYTES_BOUND - extra) / 10 <= nskip)
                string_overflow ();
+             digits++;
              nskip *= 10;
              nskip += c - '0';
+             if (digits == 2 && nskip == 0)
+               { /* We've just seen #@00, which means "skip to end".  */
+                 skip_dyn_eof (readcharfun);
+                 return Qnil;
+               }
            }
          if (nskip > 0)
            /* We can't use UNREAD here, because in the code below we side-step