mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-02-08 08:43:52 -08:00
* 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.
This commit is contained in:
parent
027c0f7538
commit
759fd76395
3 changed files with 41 additions and 9 deletions
|
|
@ -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.
|
||||
|
|
|
|||
22
src/doc.c
22
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
|
||||
{
|
||||
|
|
|
|||
21
src/lread.c
21
src/lread.c
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue