Commit 759fd763 authored by Stefan Monnier's avatar Stefan Monnier

* src/doc.c (get_doc_string): Slightly relax the sanity checking.

* src/lread.c (skip_dyn_eof): New function.
(read1): Use it to skip the end of a file in response to #@00.
parent 027c0f75
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.
......
......@@ -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
{
......
......@@ -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
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment