/* String search routines for XEmacs.
Copyright (C) 1985, 1986, 1987, 1992-1995 Free Software Foundation, Inc.
Copyright (C) 1995 Sun Microsystems, Inc.
+ Copyright (C) 1999,2000,2001 MORIOKA Tomohiko
This file is part of XEmacs.
Lisp_Object Vskip_chars_range_table;
static void set_search_regs (struct buffer *buf, Bufpos beg, Charcount len);
-/* #### according to comment in 21.5, unnecessary */
+static void clear_unused_search_regs (struct re_registers *regp, int no_sub);
static void save_search_regs (void);
static Bufpos simple_search (struct buffer *buf, Bufbyte *base_pat,
Bytecount len, Bytind pos, Bytind lim,
int negate = 0;
REGISTER int i;
#ifndef emacs
+#ifdef UTF2000
+ Lisp_Char_Table *syntax_table = XCHAR_TABLE (buf->syntax_table);
+#else
Lisp_Char_Table *syntax_table = XCHAR_TABLE (buf->mirror_syntax_table);
#endif
+#endif
Bufpos limit;
if (NILP (lim))
if (!EQ (noerror, Qt))
{
if (lim < BUF_BEGV (buf) || lim > BUF_ZV (buf))
- abort ();
+ ABORT ();
BUF_SET_PT (buf, lim);
return Qnil;
#if 0 /* This would be clean, but maybe programs depend on
}
if (np < BUF_BEGV (buf) || np > BUF_ZV (buf))
- abort ();
+ ABORT ();
BUF_SET_PT (buf, np);
{
switch (*s++)
{
+ /* ']' doesn't appear here because it's only special after ] */
case '.': case '*': case '+': case '?': case '[': case '^': case '$':
return 0;
case '\\':
{
case '|': case '(': case ')': case '`': case '\'': case 'b':
case 'B': case '<': case '>': case 'w': case 'W': case 's':
- case 'S': case '=':
+ case 'S': case '=': case '{': case '}':
#ifdef MULE
/* 97/2/25 jhod Added for category matches */
case 'c': case 'C':
if (len == 0)
{
set_search_regs (buf, bufpos, 0);
+ clear_unused_search_regs (&search_regs, 0);
return bufpos;
}
- /* Searching 0 times means don't move. */
+ /* Searching 0 times means noop---don't move, don't touch registers. */
if (n == 0)
return bufpos;
search_regs.start[i] += j;
search_regs.end[i] += j;
}
+ /* re_match (called from re_search et al) does this for us */
+ /* clear_unused_search_regs (search_regs, bufp->no_sub); */
XSETBUFFER (last_thing_searched, buf);
/* Set pos to the new position. */
pos = search_regs.start[0];
search_regs.start[i] += j;
search_regs.end[i] += j;
}
+ /* re_match (called from re_search et al) does this for us */
+ /* clear_unused_search_regs (search_regs, bufp->no_sub); */
XSETBUFFER (last_thing_searched, buf);
/* Set pos to the new position. */
pos = search_regs.end[0];
{
/* Keep track of which character set row
contains the characters that need translation. */
+#ifdef UTF2000
+ int charset_base_code = c >> 6;
+#else
int charset_base_code = c & ~CHAR_FIELD3_MASK;
+#endif
if (charset_base == -1)
charset_base = charset_base_code;
else if (charset_base != charset_base_code)
end = bytind_to_bufpos (buf, idx + buf_len);
}
set_search_regs (buf, beg, end - beg);
+ clear_unused_search_regs (&search_regs, 0);
return retval;
}
while (!BUFBYTE_FIRST_BYTE_P (*charstart))
charstart--;
untranslated = charptr_emchar (charstart);
+#ifdef UTF2000
+ if (charset_base == (untranslated >> 6))
+#else
if (charset_base == (untranslated & ~CHAR_FIELD3_MASK))
+#endif
{
ch = TRANSLATE (trt, untranslated);
if (!BUFBYTE_FIRST_BYTE_P (*ptr))
Bufpos bufend = bytind_to_bufpos (buf, bytstart + len);
set_search_regs (buf, bufstart, bufend - bufstart);
+ clear_unused_search_regs (&search_regs, 0);
}
if ((n -= direction) != 0)
Bufpos bufend = bytind_to_bufpos (buf, bytstart + len);
set_search_regs (buf, bufstart, bufend - bufstart);
+ clear_unused_search_regs (&search_regs, 0);
}
if ((n -= direction) != 0)
return bytind_to_bufpos (buf, pos);
}
-/* Record beginning BEG and end BEG + LEN
- for a match just found in the current buffer. */
+/* Record the whole-match data (beginning BEG and end BEG + LEN) and the
+ buffer for a match just found. */
static void
set_search_regs (struct buffer *buf, Bufpos beg, Charcount len)
XSETBUFFER (last_thing_searched, buf);
}
+/* Clear unused search registers so match data will be null.
+ REGP is a pointer to the register structure to clear, usually the global
+ search_regs.
+ NO_SUB is the number of subexpressions to allow for. (Does not count
+ the whole match, ie, for a string search NO_SUB == 0.)
+ It is an error if NO_SUB > REGP.num_regs - 1. */
+
+static void
+clear_unused_search_regs (struct re_registers *regp, int no_sub)
+{
+ /* This function has been Mule-ized. */
+ int i;
+
+ assert (no_sub >= 0 && no_sub < regp->num_regs);
+ for (i = no_sub + 1; i < regp->num_regs; i++)
+ regp->start[i] = regp->end[i] = -1;
+}
+
\f
/* Given a string of words separated by word delimiters,
compute a regexp that matches those exact words
Charcount i, len;
EMACS_INT punct_count = 0, word_count = 0;
struct buffer *buf = decode_buffer (buffer, 0);
+#ifdef UTF2000
+ Lisp_Char_Table *syntax_table = XCHAR_TABLE (buf->syntax_table);
+#else
Lisp_Char_Table *syntax_table = XCHAR_TABLE (buf->mirror_syntax_table);
+#endif
CHECK_STRING (string);
len = XSTRING_CHAR_LENGTH (string);
buf = XBUFFER (buffer);
}
+#ifdef UTF2000
+ syntax_table = XCHAR_TABLE (buf->syntax_table);
+#else
syntax_table = XCHAR_TABLE (buf->mirror_syntax_table);
+#endif
case_action = nochange; /* We tried an initialization */
/* but some C compilers blew it */
CHECK_INT (num);
n = XINT (num);
- if (n < 0 || n >= search_regs.num_regs)
+ if (n < 0 || search_regs.num_regs <= 0)
args_out_of_range (num, make_int (search_regs.num_regs));
- if (search_regs.num_regs == 0 ||
+ if (n >= search_regs.num_regs ||
search_regs.start[n] < 0)
return Qnil;
return make_int (beginningp ? search_regs.start[n] : search_regs.end[n]);
}
else
/* last_thing_searched must always be Qt, a buffer, or Qnil. */
- abort ();
+ ABORT ();
len = i;
}
int num_regs;
int length;
-#if 0
- /* #### according to 21.5 comment, unnecessary */
if (running_asynch_code)
save_search_regs ();
-#endif
CONCHECK_LIST (list);
return Qnil;
}
-/* #### according to 21.5 comment, unnecessary */
/* If non-zero the match data have been saved in saved_search_regs
during the execution of a sentinel or filter. */
static int search_regs_saved;
}
}
-/* #### according to 21.5 comment, unnecessary
- prototype in lisp.h, all calls in process.c */
/* Called upon exit from filters and sentinels. */
void
restore_match_data (void)