summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2014-04-23 18:21:25 +0300
committerEli Zaretskii <eliz@gnu.org>2014-04-23 18:21:25 +0300
commit80d982d7ad6bbaab40731b60756da0f126311be0 (patch)
tree57e1639296b4cab531edf502e0cb02cb69153662
parent05452dc497b4de96edc7379f52c9863696e1c297 (diff)
downloademacs-80d982d7ad6bbaab40731b60756da0f126311be0.tar.gz
Fix debugging code for checking the newline cache.
src/search.c (Fnewline_cache_check): Don't try to count newlines outside the buffer's restriction, as find_newline doesn't support that.
-rw-r--r--src/ChangeLog6
-rw-r--r--src/search.c56
2 files changed, 43 insertions, 19 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 6e2f7057b75..0c8fa7b31d7 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,9 @@
+2014-04-23 Eli Zaretskii <eliz@gnu.org>
+
+ * search.c (Fnewline_cache_check): Don't try to count newlines
+ outside the buffer's restriction, as find_newline doesn't support
+ that.
+
2014-04-22 Paul Eggert <eggert@cs.ucla.edu>
Port to GCC 4.9.0 with --enable-gcc-warnings.
diff --git a/src/search.c b/src/search.c
index ab390faf82e..0a693daa15e 100644
--- a/src/search.c
+++ b/src/search.c
@@ -3209,7 +3209,7 @@ the first based on the cache, the second based on actually scanning
the buffer. If the buffer doesn't have a cache, the value is nil. */)
(Lisp_Object buffer)
{
- struct buffer *buf;
+ struct buffer *buf, *old = NULL;
ptrdiff_t shortage, nl_count_cache, nl_count_buf;
Lisp_Object cache_newlines, buf_newlines, val;
ptrdiff_t from, found, i;
@@ -3220,6 +3220,7 @@ the buffer. If the buffer doesn't have a cache, the value is nil. */)
{
CHECK_BUFFER (buffer);
buf = XBUFFER (buffer);
+ old = current_buffer;
}
if (buf->base_buffer)
buf = buf->base_buffer;
@@ -3229,46 +3230,63 @@ the buffer. If the buffer doesn't have a cache, the value is nil. */)
|| buf->newline_cache == NULL)
return Qnil;
+ /* find_newline can only work on the current buffer. */
+ if (old != NULL)
+ set_buffer_internal_1 (buf);
+
/* How many newlines are there according to the cache? */
- find_newline (BUF_BEG (buf), BUF_BEG_BYTE (buf),
- BUF_Z (buf), BUF_Z_BYTE (buf),
+ find_newline (BEGV, BEGV_BYTE, ZV, ZV_BYTE,
TYPE_MAXIMUM (ptrdiff_t), &shortage, NULL, true);
nl_count_cache = TYPE_MAXIMUM (ptrdiff_t) - shortage;
/* Create vector and populate it. */
cache_newlines = make_uninit_vector (nl_count_cache);
- for (from = BUF_BEG( buf), found = from, i = 0;
- from < BUF_Z (buf);
- from = found, i++)
+
+ if (nl_count_cache)
{
- ptrdiff_t from_byte = CHAR_TO_BYTE (from);
+ for (from = BEGV, found = from, i = 0; from < ZV; from = found, i++)
+ {
+ ptrdiff_t from_byte = CHAR_TO_BYTE (from);
- found = find_newline (from, from_byte, 0, -1, 1, &shortage, NULL, true);
- if (shortage == 0)
- ASET (cache_newlines, i, make_number (found - 1));
+ found = find_newline (from, from_byte, 0, -1, 1, &shortage,
+ NULL, true);
+ if (shortage != 0 || i >= nl_count_cache)
+ break;
+ ASET (cache_newlines, i, make_number (found - 1));
+ }
+ /* Fill the rest of slots with an invalid position. */
+ for ( ; i < nl_count_cache; i++)
+ ASET (cache_newlines, i, make_number (-1));
}
/* Now do the same, but without using the cache. */
- find_newline1 (BUF_BEG (buf), BUF_BEG_BYTE (buf),
- BUF_Z (buf), BUF_Z_BYTE (buf),
+ find_newline1 (BEGV, BEGV_BYTE, ZV, ZV_BYTE,
TYPE_MAXIMUM (ptrdiff_t), &shortage, NULL, true);
nl_count_buf = TYPE_MAXIMUM (ptrdiff_t) - shortage;
buf_newlines = make_uninit_vector (nl_count_buf);
- for (from = BUF_BEG( buf), found = from, i = 0;
- from < BUF_Z (buf);
- from = found, i++)
+ if (nl_count_buf)
{
- ptrdiff_t from_byte = CHAR_TO_BYTE (from);
+ for (from = BEGV, found = from, i = 0; from < ZV; from = found, i++)
+ {
+ ptrdiff_t from_byte = CHAR_TO_BYTE (from);
- found = find_newline1 (from, from_byte, 0, -1, 1, &shortage, NULL, true);
- if (shortage == 0)
- ASET (buf_newlines, i, make_number (found - 1));
+ found = find_newline1 (from, from_byte, 0, -1, 1, &shortage,
+ NULL, true);
+ if (shortage != 0 || i >= nl_count_buf)
+ break;
+ ASET (buf_newlines, i, make_number (found - 1));
+ }
+ for ( ; i < nl_count_buf; i++)
+ ASET (buf_newlines, i, make_number (-1));
}
/* Construct the value and return it. */
val = make_uninit_vector (2);
ASET (val, 0, cache_newlines);
ASET (val, 1, buf_newlines);
+
+ if (old != NULL)
+ set_buffer_internal_1 (old);
return val;
}