use guile-snarf for subr definition
[bpt/emacs.git] / src / search.c
index 9708730..3abb49c 100644 (file)
@@ -1416,7 +1416,7 @@ search_buffer (Lisp_Object string, ptrdiff_t pos, ptrdiff_t pos_byte,
 
                      while (boyer_moore_ok)
                        {
-                         if (ASCII_BYTE_P (inverse))
+                         if (ASCII_CHAR_P (inverse))
                            {
                              if (this_char_base > 0)
                                boyer_moore_ok = 0;
@@ -1827,7 +1827,7 @@ boyer_moore (EMACS_INT n, unsigned char *base_pat,
             matching with CHAR_BASE are to be checked.  */
          int ch = -1;
 
-         if (ASCII_BYTE_P (*ptr) || ! multibyte)
+         if (ASCII_CHAR_P (*ptr) || ! multibyte)
            ch = *ptr;
          else if (char_base
                   && ((pat_end - ptr) == 1 || CHAR_HEAD_P (ptr[1])))
@@ -2578,7 +2578,7 @@ since only regular expressions have distinguished subexpressions.  */)
       substed_alloc_size = (length <= (STRING_BYTES_BOUND - 100) / 2
                            ? length * 2 + 100
                            : STRING_BYTES_BOUND);
-      substed = xmalloc (substed_alloc_size);
+      substed = xmalloc_atomic (substed_alloc_size);
       substed_len = 0;
 
       /* Go thru NEWTEXT, producing the actual text to insert in
@@ -2596,7 +2596,7 @@ since only regular expressions have distinguished subexpressions.  */)
            {
              FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c, newtext, pos, pos_byte);
              if (!buf_multibyte)
-               c = multibyte_char_to_unibyte (c);
+               c = CHAR_TO_BYTE8 (c);
            }
          else
            {
@@ -2619,7 +2619,7 @@ since only regular expressions have distinguished subexpressions.  */)
                  FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c, newtext,
                                                      pos, pos_byte);
                  if (!buf_multibyte && !ASCII_CHAR_P (c))
-                   c = multibyte_char_to_unibyte (c);
+                   c = CHAR_TO_BYTE8 (c);
                }
              else
                {
@@ -2679,18 +2679,8 @@ since only regular expressions have distinguished subexpressions.  */)
        }
 
       if (really_changed)
-       {
-         if (buf_multibyte)
-           {
-             ptrdiff_t nchars =
-               multibyte_chars_in_text (substed, substed_len);
-
-             newtext = make_multibyte_string ((char *) substed, nchars,
-                                              substed_len);
-           }
-         else
-           newtext = make_unibyte_string ((char *) substed, substed_len);
-       }
+       newtext = make_specified_string ((const char *) substed, -1,
+                                        substed_len, buf_multibyte);
       xfree (substed);
     }
 
@@ -3209,11 +3199,10 @@ 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 region_cache *nlcache;
+  struct buffer *buf, *old = NULL;
   ptrdiff_t shortage, nl_count_cache, nl_count_buf;
   Lisp_Object cache_newlines, buf_newlines, val;
-  ptrdiff_t from, from_byte, found, i;
+  ptrdiff_t from, found, i;
 
   if (NILP (buffer))
     buf = current_buffer;
@@ -3221,6 +3210,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;
@@ -3230,58 +3220,77 @@ 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;
 }
 \f
 void
 syms_of_search (void)
 {
+#include "search.x"
+
   register int i;
 
   for (i = 0; i < REGEXP_CACHE_SIZE; ++i)
     {
       searchbufs[i].buf.allocated = 100;
-      searchbufs[i].buf.buffer = xmalloc (100);
+      searchbufs[i].buf.buffer = xmalloc_atomic (100);
       searchbufs[i].buf.fastmap = searchbufs[i].fastmap;
       searchbufs[i].regexp = Qnil;
       searchbufs[i].whitespace_regexp = Qnil;
@@ -3327,22 +3336,4 @@ such as `looking-at', `string-match', `re-search-forward', etc.,
 do not set the match data.  The proper way to use this variable
 is to bind it with `let' around a small expression.  */);
   Vinhibit_changing_match_data = Qnil;
-
-  defsubr (&Slooking_at);
-  defsubr (&Sposix_looking_at);
-  defsubr (&Sstring_match);
-  defsubr (&Sposix_string_match);
-  defsubr (&Ssearch_forward);
-  defsubr (&Ssearch_backward);
-  defsubr (&Sre_search_forward);
-  defsubr (&Sre_search_backward);
-  defsubr (&Sposix_search_forward);
-  defsubr (&Sposix_search_backward);
-  defsubr (&Sreplace_match);
-  defsubr (&Smatch_beginning);
-  defsubr (&Smatch_end);
-  defsubr (&Smatch_data);
-  defsubr (&Sset_match_data);
-  defsubr (&Sregexp_quote);
-  defsubr (&Snewline_cache_check);
 }