annotate src/search.c @ 502:7039e6323819

[xemacs-hg @ 2001-05-04 22:41:46 by ben] ----------------------- byte-comp warning fixes ----------------- New functions for cleanly eliminating byte-compiler warnings. Their definitions require no changes at all in bytecomp.el, meaning that any package that wants to use them and be compatible with older versions of XEmacs need only copy the code and rename the functions (i.e. prefix them with the package name). Eliminate byte-compiler warnings using the new functions in bytecomp-runtime.el. Move coding-system-put,get,category, since they're not Mule-specific and are used in prefer-coding-system. font.el was incredibly ugly. Clean it up. Avoid using defsubst for any exported functions, to avoid possible compatibility problems if we later change the internal interface. (It happened before, with face accessors, between 19.8 and 19.9). Fix tons of warnings. Clean up (new function gpm-is-supported-p eliminates duplicate code in gpm-create/delete-device-hook) and eliminate warnings. ---------- make byte-recompile-directory work in the --------- core `lisp' dir, even in the absence of a Mule XEmacs (i.e. make it skip the Mule files rather than trying to compile them). now you should be able to do `touch *.el' in the `lisp' dir, then M-x byte-recompile-directory, and get no warnings. Avoid trying to compile Mule files in byte-recompile-directory when we're not in a Mule XEmacs, since we're highly likely to get syntax errors. Add a coding-system cookie to all Mule files so that byte-recompile-directory ignores them. Magic cookie function moved to files.el from code-files.el (for use by bytecomp even in a non-coding-system XEmacs), and changed names and semantics for use by bytecomp. NOTE: IMO this is an internal function that we can change as we like (and there is absolutely no code anywhere else using the function). ---------------- GUI improvements: menus, help ------------------- Rearrange order of keymap declarations to be alphabetical. Improve help on help to include all bindings, and group by category. Add bindings for new Info commands. Remove warnings. Use command-hyper-apropos in place of command-apropos. Add a function to do the equivalent of command-apropos. Evals its help-text argument so you can put expressions there. Used now by help-for-help. Add binding to continue text searches. Expand index searches to work over multiple info documents. Add commands to search text/index in User and Lispref. Add new entry, "Uncomment Region" (parallels "Comment Out Region"). Redo Help menu; add bindings for new Info commands to search the index or text of the User and Lispref manuals. Add command for mark-paragraph, activate-region. Make Edit->R accelerator be rectangle, not register (more commonly used), and put rectangle first. Fix the Edit Init File entry to never load the .elc file. Simplify the default-popup-menu. Add Cmds->Tabs menu. Use kp-left not kp_left, etc. ---------------- Miscellaneous bug fixes/cleanup ------------------- byte-compiler-options: Correct doc string. easy-menu-do-define: fix extra quote. fill-paragraph-or-region:Rewrite to be more correct -- use call-interactively so that we always get exactly the same behavior as if the functions were called directly. No need to fiddle with zmacs-region-stays, now that bogus clearing of it (2001-04-28 src/ChangeLog) is removed. Put dialog titles back in -- this time correctly. Fix various other problems with leaks and such. key-sequence-list-description: Clean up fun to always correctly canonicalize. Clean up Kinsoku comments, synch comment-region with FSF 20.7. * simple.el (region-exists-p): * simple.el (region-active-p): Add comment about which one is correct to use in menu specs. * sound.el (load-sound-file): Minor code clean up. * startup.el: * startup.el (command-line-early): * startup.el (initial-scratch-message): Comment changes. Add info about sample.init.el to splash screen. Improve initial-scratch-message and clarify purpose of Scratch buffer. Fix byte-compile warning. ------------------------ Added features ------------------------- Add new variable to control whether etags checks all parent directories for tag files. (On by default.) * hash-table.el: New file, useful utility functions. * dumped-lisp.el (preloaded-file-list): Dump hash-table.el. ------------ notable bug fix: Windows event code -------------- Get critical quit working. ------------ notable bug fix and new feature: regex code -------------- Shy groups were implemented in a horrible, half-assed way that would cause them to screw up regex searching in most cases. Fixed to work correctly. Also extended back-reference syntax past 9. Only is recognized as such if there are at least that many non-shy groups; and optionally will warn about such uses, to catch old code that might be using them differently. (Added variable to control this in search.c -- `warn-about-possibly-incompatible-back- references', on by default for the moment. Declared in lisp.h. ---------------- process/SIGIO improvements ------------------- define USE_GETADDRINFO to replace more complex conditional, and use it. the code conditionalized on this in unix_open_network_stream had *serious* problems handling errors. it's now fixed, and major amounts of duplicate code between the two versions were combined. don't disable SIGIO and other interrupts unless CONNECT_NEEDS_SLOWED_INTERRUPTS is defined -- don't penalize OS's without bugs. similarly for a freebsd bug that was affecting all OS's. * s\ultrix.h: define CONNECT_NEEDS_SLOWED_INTERRUPTS, since that's the OS mentioned as having a kernel bug. * sysdep.c (request_sigio_on_device): * sysdep.c (unrequest_sigio_on_device): fix SIGIO problems on Linux. add check for O_ASYNC in case it's defined and FASYNC isn't. add comment about other ways to do SIGIO on Linux. * callproc.c (Fold_call_process_internal): * process.c (Fstart_process_internal): Deal with the possibility that `default-directory' doesn't have terminating slash. Correct comments about vfork. ---------------- Miscellaneous bug fixes/cleanup ------------------- * callint.c (Finteractive): Add lots of documentation -- exactly what the Lisp equivalents of all the interactive specs are. * console.h (struct console): change type of quit_char to Emchar. * event-msw.c (lstream_type_create_mswindows_selectable): spacing change. Eliminate events-mod.h and combine into events.h. * emacs.c: * emacs.c (make_arg_list_1): * emacs.c (main_1): A couple of char->Extbyte changes, add a comment. * glyphs-msw.c: Correct indentation of function defns to not exceed 80 cols. Try (sort of) to fix some code that sets the colors of the progress gauge. (Commented out) * keymap.c (syms_of_keymap): use DEFSYMBOL. * process.c (read_process_output): No need to fiddle with zmacs_region_stays, now that bogus clearing of it (see below) is removed. * search.c (Freplace_match): warning fix.
author ben
date Fri, 04 May 2001 22:42:35 +0000
parents ccaeb2a3c329
children 167135c7a7ae
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* String search routines for XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1985, 1986, 1987, 1992-1995 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 Copyright (C) 1995 Sun Microsystems, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 along with XEmacs; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 /* Synched up with: FSF 19.29, except for region-cache stuff. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 /* Hacked on for Mule by Ben Wing, December 1994 and August 1995. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 /* This file has been Mule-ized except for the TRT stuff. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 #include "lisp.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 #include "buffer.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 #include "insdel.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 #include "opaque.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 #ifdef REGION_CACHE_NEEDS_WORK
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 #include "region-cache.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 #include "syntax.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 #include <sys/types.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 #include "regex.h"
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
41 #include "casetab.h"
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
42 #include "chartab.h"
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
43
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
44 #define TRANSLATE(table, pos) \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
45 (!NILP (table) ? TRT_TABLE_OF (table, (Emchar) pos) : pos)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 #define REGEXP_CACHE_SIZE 20
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 /* If the regexp is non-nil, then the buffer contains the compiled form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 of that regexp, suitable for searching. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
51 struct regexp_cache
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
52 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 struct regexp_cache *next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 Lisp_Object regexp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 struct re_pattern_buffer buf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 char fastmap[0400];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 /* Nonzero means regexp was compiled to do full POSIX backtracking. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 char posix;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 /* The instances of that struct. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 static struct regexp_cache searchbufs[REGEXP_CACHE_SIZE];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 /* The head of the linked list; points to the most recently used buffer. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 static struct regexp_cache *searchbuf_head;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 /* Every call to re_match, etc., must pass &search_regs as the regs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 argument unless you can show it is unnecessary (i.e., if re_match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 is certainly going to be called again before region-around-match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 can be called).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 Since the registers are now dynamically allocated, we need to make
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 sure not to refer to the Nth register before checking that it has
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 been allocated by checking search_regs.num_regs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 The regex code keeps track of whether it has allocated the search
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 buffer using bits in the re_pattern_buffer. This means that whenever
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 you compile a new pattern, it completely forgets whether it has
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 allocated any registers, and will allocate new registers the next
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 time you call a searching or matching function. Therefore, we need
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 to call re_set_registers after compiling a new pattern or after
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 setting the match registers, so that the regex functions will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 able to free or re-allocate it properly. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 /* Note: things get trickier under Mule because the values returned from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 the regexp routines are in Bytinds but we need them to be in Bufpos's.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 We take the easy way out for the moment and just convert them immediately.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 We could be more clever by not converting them until necessary, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 that gets real ugly real fast since the buffer might have changed and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 the positions might be out of sync or out of range.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 static struct re_registers search_regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 /* The buffer in which the last search was performed, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 Qt if the last search was done in a string;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 Qnil if no searching has been done yet. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 static Lisp_Object last_thing_searched;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 /* error condition signalled when regexp compile_pattern fails */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 Lisp_Object Qinvalid_regexp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 /* Regular expressions used in forward/backward-word */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 Lisp_Object Vforward_word_regexp, Vbackward_word_regexp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 469
diff changeset
107 int warn_about_possibly_incompatible_back_references;
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 469
diff changeset
108
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 /* range table for use with skip_chars. Only needed for Mule. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 Lisp_Object Vskip_chars_range_table;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 static void set_search_regs (struct buffer *buf, Bufpos beg, Charcount len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 static void save_search_regs (void);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
114 static Bufpos simple_search (struct buffer *buf, Bufbyte *base_pat,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
115 Bytecount len, Bytind pos, Bytind lim,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
116 EMACS_INT n, Lisp_Object trt);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
117 static Bufpos boyer_moore (struct buffer *buf, Bufbyte *base_pat,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
118 Bytecount len, Bytind pos, Bytind lim,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
119 EMACS_INT n, Lisp_Object trt,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
120 Lisp_Object inverse_trt, int charset_base);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 static Bufpos search_buffer (struct buffer *buf, Lisp_Object str,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 Bufpos bufpos, Bufpos buflim, EMACS_INT n, int RE,
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
123 Lisp_Object trt, Lisp_Object inverse_trt,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 int posix);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 matcher_overflow (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 error ("Stack overflow in regexp matcher");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 /* Compile a regexp and signal a Lisp error if anything goes wrong.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 PATTERN is the pattern to compile.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 CP is the place to put the result.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 TRANSLATE is a translation table for ignoring case, or NULL for none.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 REGP is the structure that says where to store the "register"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 values that will result from matching this pattern.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 If it is 0, we should compile the pattern not to record any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 subexpression bounds.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 POSIX is nonzero if we want full backtracking (POSIX style)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 for this pattern. 0 means backtrack only enough to get a valid match. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 compile_pattern_1 (struct regexp_cache *cp, Lisp_Object pattern,
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
145 Lisp_Object translate, struct re_registers *regp, int posix,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 Error_behavior errb)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
148 const char *val;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 reg_syntax_t old;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 cp->regexp = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 cp->buf.translate = translate;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 cp->posix = posix;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 old = re_set_syntax (RE_SYNTAX_EMACS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 | (posix ? 0 : RE_NO_POSIX_BACKTRACKING));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
156 val = (const char *)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 re_compile_pattern ((char *) XSTRING_DATA (pattern),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 XSTRING_LENGTH (pattern), &cp->buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 re_set_syntax (old);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 if (val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 maybe_signal_error (Qinvalid_regexp, list1 (build_string (val)),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 Qsearch, errb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 cp->regexp = Fcopy_sequence (pattern);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 /* Compile a regexp if necessary, but first check to see if there's one in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 the cache.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 PATTERN is the pattern to compile.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 TRANSLATE is a translation table for ignoring case, or NULL for none.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 REGP is the structure that says where to store the "register"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 values that will result from matching this pattern.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 If it is 0, we should compile the pattern not to record any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 subexpression bounds.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 POSIX is nonzero if we want full backtracking (POSIX style)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 for this pattern. 0 means backtrack only enough to get a valid match. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 struct re_pattern_buffer *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 compile_pattern (Lisp_Object pattern, struct re_registers *regp,
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
184 Lisp_Object translate, int posix, Error_behavior errb)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 struct regexp_cache *cp, **cpp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 for (cpp = &searchbuf_head; ; cpp = &cp->next)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 cp = *cpp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 if (!NILP (Fstring_equal (cp->regexp, pattern))
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
192 && EQ (cp->buf.translate, translate)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 && cp->posix == posix)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 /* If we're at the end of the cache, compile into the last cell. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 if (cp->next == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 if (!compile_pattern_1 (cp, pattern, translate, regp, posix,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 errb))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 /* When we get here, cp (aka *cpp) contains the compiled pattern,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 either because we found it in the cache or because we just compiled it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 Move it to the front of the queue to mark it as most recently used. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 *cpp = cp->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 cp->next = searchbuf_head;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 searchbuf_head = cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 /* Advise the searching functions about the space we have allocated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 for register data. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 if (regp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 re_set_registers (&cp->buf, regp, regp->num_regs, regp->start, regp->end);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 return &cp->buf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 /* Error condition used for failing searches */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 Lisp_Object Qsearch_failed;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 signal_failure (Lisp_Object arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
227 for (;;)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
228 Fsignal (Qsearch_failed, list1 (arg));
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
229 return Qnil; /* Not reached. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 /* Convert the search registers from Bytinds to Bufpos's. Needs to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 done after each regexp match that uses the search regs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 We could get a potential speedup by not converting the search registers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 until it's really necessary, e.g. when match-data or replace-match is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 called. However, this complexifies the code a lot (e.g. the buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 could have changed and the Bytinds stored might be invalid) and is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 probably not a great time-saver. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 fixup_search_regs_for_buffer (struct buffer *buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 int num_regs = search_regs.num_regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 for (i = 0; i < num_regs; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 if (search_regs.start[i] >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 search_regs.start[i] = bytind_to_bufpos (buf, search_regs.start[i]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 if (search_regs.end[i] >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 search_regs.end[i] = bytind_to_bufpos (buf, search_regs.end[i]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 /* Similar but for strings. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 fixup_search_regs_for_string (Lisp_Object string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 int num_regs = search_regs.num_regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 /* #### bytecount_to_charcount() is not that efficient. This function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 could be faster if it did its own conversion (using INC_CHARPTR()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 and such), because the register ends are likely to be somewhat ordered.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 (Even if not, you could sort them.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 Think about this if this function is a time hog, which it's probably
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 not. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 for (i = 0; i < num_regs; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 if (search_regs.start[i] > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 search_regs.start[i] =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 bytecount_to_charcount (XSTRING_DATA (string),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 search_regs.start[i]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 if (search_regs.end[i] > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 search_regs.end[i] =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 bytecount_to_charcount (XSTRING_DATA (string),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 search_regs.end[i]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 looking_at_1 (Lisp_Object string, struct buffer *buf, int posix)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 /* This function has been Mule-ized, except for the trt table handling. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 Lisp_Object val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 Bytind p1, p2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 Bytecount s1, s2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 REGISTER int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 struct re_pattern_buffer *bufp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 if (running_asynch_code)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 save_search_regs ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 CHECK_STRING (string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 bufp = compile_pattern (string, &search_regs,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 (!NILP (buf->case_fold_search)
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
304 ? XCASE_TABLE_DOWNCASE (buf->case_table) : Qnil),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 posix, ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 /* Get pointers and sizes of the two strings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 that make up the visible portion of the buffer. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 p1 = BI_BUF_BEGV (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 p2 = BI_BUF_CEILING_OF (buf, p1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 s1 = p2 - p1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 s2 = BI_BUF_ZV (buf) - p2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
317 regex_match_object = Qnil;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 regex_emacs_buffer = buf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 i = re_match_2 (bufp, (char *) BI_BUF_BYTE_ADDRESS (buf, p1),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 s1, (char *) BI_BUF_BYTE_ADDRESS (buf, p2), s2,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 BI_BUF_PT (buf) - BI_BUF_BEGV (buf), &search_regs,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 BI_BUF_ZV (buf) - BI_BUF_BEGV (buf));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 if (i == -2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 matcher_overflow ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 val = (0 <= i ? Qt : Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 if (NILP (val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 int num_regs = search_regs.num_regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 for (i = 0; i < num_regs; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 if (search_regs.start[i] >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 search_regs.start[i] += BI_BUF_BEGV (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 search_regs.end[i] += BI_BUF_BEGV (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 XSETBUFFER (last_thing_searched, buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 fixup_search_regs_for_buffer (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 DEFUN ("looking-at", Flooking_at, 1, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 Return t if text after point matches regular expression REGEXP.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 This function modifies the match data that `match-beginning',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 `match-end' and `match-data' access; save and restore the match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 data if you want to preserve them.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 Optional argument BUFFER defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 (regexp, buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 return looking_at_1 (regexp, decode_buffer (buffer, 0), 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 DEFUN ("posix-looking-at", Fposix_looking_at, 1, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 Return t if text after point matches regular expression REGEXP.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 Find the longest match, in accord with Posix regular expression rules.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 This function modifies the match data that `match-beginning',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 `match-end' and `match-data' access; save and restore the match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 data if you want to preserve them.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 Optional argument BUFFER defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 (regexp, buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 return looking_at_1 (regexp, decode_buffer (buffer, 0), 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 string_match_1 (Lisp_Object regexp, Lisp_Object string, Lisp_Object start,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 struct buffer *buf, int posix)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 /* This function has been Mule-ized, except for the trt table handling. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 Bytecount val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 Charcount s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 struct re_pattern_buffer *bufp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 if (running_asynch_code)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 save_search_regs ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 CHECK_STRING (regexp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 CHECK_STRING (string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 if (NILP (start))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 s = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 Charcount len = XSTRING_CHAR_LENGTH (string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 CHECK_INT (start);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 s = XINT (start);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 if (s < 0 && -s <= len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 s = len + s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 else if (0 > s || s > len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 args_out_of_range (string, start);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 bufp = compile_pattern (regexp, &search_regs,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 (!NILP (buf->case_fold_search)
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
403 ? XCASE_TABLE_DOWNCASE (buf->case_table) : Qnil),
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
404 0, ERROR_ME);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 Bytecount bis = charcount_to_bytecount (XSTRING_DATA (string), s);
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
408 regex_match_object = string;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 regex_emacs_buffer = buf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 val = re_search (bufp, (char *) XSTRING_DATA (string),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 XSTRING_LENGTH (string), bis,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 XSTRING_LENGTH (string) - bis,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 &search_regs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 if (val == -2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 matcher_overflow ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 if (val < 0) return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 last_thing_searched = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 fixup_search_regs_for_string (string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 return make_int (bytecount_to_charcount (XSTRING_DATA (string), val));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 DEFUN ("string-match", Fstring_match, 2, 4, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 Return index of start of first match for REGEXP in STRING, or nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 If third arg START is non-nil, start search at that index in STRING.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 For index of first char beyond the match, do (match-end 0).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 `match-end' and `match-beginning' also give indices of substrings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 matched by parenthesis constructs in the pattern.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 Optional arg BUFFER controls how case folding is done (according to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 the value of `case-fold-search' in that buffer and that buffer's case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 tables) and defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 (regexp, string, start, buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 return string_match_1 (regexp, string, start, decode_buffer (buffer, 0), 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 DEFUN ("posix-string-match", Fposix_string_match, 2, 4, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 Return index of start of first match for REGEXP in STRING, or nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 Find the longest match, in accord with Posix regular expression rules.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 If third arg START is non-nil, start search at that index in STRING.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 For index of first char beyond the match, do (match-end 0).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 `match-end' and `match-beginning' also give indices of substrings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 matched by parenthesis constructs in the pattern.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 Optional arg BUFFER controls how case folding is done (according to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 the value of `case-fold-search' in that buffer and that buffer's case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 tables) and defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 (regexp, string, start, buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 return string_match_1 (regexp, string, start, decode_buffer (buffer, 0), 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 /* Match REGEXP against STRING, searching all of STRING,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 and return the index of the match, or negative on failure.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 This does not clobber the match data. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 Bytecount
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
461 fast_string_match (Lisp_Object regexp, const Bufbyte *nonreloc,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 Lisp_Object reloc, Bytecount offset,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 Bytecount length, int case_fold_search,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 Error_behavior errb, int no_quit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 /* This function has been Mule-ized, except for the trt table handling. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 Bytecount val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 Bufbyte *newnonreloc = (Bufbyte *) nonreloc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 struct re_pattern_buffer *bufp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 bufp = compile_pattern (regexp, 0,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 (case_fold_search
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
473 ? XCASE_TABLE_DOWNCASE (current_buffer->case_table)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
474 : Qnil),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 0, errb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 if (!bufp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 return -1; /* will only do this when errb != ERROR_ME */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 if (!no_quit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 no_quit_in_re_search = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 fixup_internal_substring (nonreloc, reloc, offset, &length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 if (!NILP (reloc))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 if (no_quit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 newnonreloc = XSTRING_DATA (reloc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 /* QUIT could relocate RELOC. Therefore we must alloca()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 and copy. No way around this except some serious
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 rewriting of re_search(). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 newnonreloc = (Bufbyte *) alloca (length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 memcpy (newnonreloc, XSTRING_DATA (reloc), length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 /* #### evil current-buffer dependency */
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
500 regex_match_object = reloc;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 regex_emacs_buffer = current_buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 val = re_search (bufp, (char *) newnonreloc + offset, length, 0,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 length, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 no_quit_in_re_search = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 Bytecount
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 fast_lisp_string_match (Lisp_Object regex, Lisp_Object string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 return fast_string_match (regex, 0, string, 0, -1, 0, ERROR_ME, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 #ifdef REGION_CACHE_NEEDS_WORK
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 /* The newline cache: remembering which sections of text have no newlines. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 /* If the user has requested newline caching, make sure it's on.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 Otherwise, make sure it's off.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 This is our cheezy way of associating an action with the change of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 state of a buffer-local variable. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 newline_cache_on_off (struct buffer *buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 if (NILP (buf->cache_long_line_scans))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 /* It should be off. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 if (buf->newline_cache)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 free_region_cache (buf->newline_cache);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 buf->newline_cache = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 /* It should be on. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 if (buf->newline_cache == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 buf->newline_cache = new_region_cache ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 /* Search in BUF for COUNT instances of the character TARGET between
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 START and END.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 If COUNT is positive, search forwards; END must be >= START.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 If COUNT is negative, search backwards for the -COUNTth instance;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 END must be <= START.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 If COUNT is zero, do anything you please; run rogue, for all I care.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 If END is zero, use BEGV or ZV instead, as appropriate for the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 direction indicated by COUNT.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 If we find COUNT instances, set *SHORTAGE to zero, and return the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 position after the COUNTth match. Note that for reverse motion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 this is not the same as the usual convention for Emacs motion commands.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 If we don't find COUNT instances before reaching END, set *SHORTAGE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 to the number of TARGETs left unfound, and return END.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 If ALLOW_QUIT is non-zero, call QUIT periodically. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 static Bytind
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 bi_scan_buffer (struct buffer *buf, Emchar target, Bytind st, Bytind en,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 EMACS_INT count, EMACS_INT *shortage, int allow_quit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 /* This function has been Mule-ized. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 Bytind lim = en > 0 ? en :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 ((count > 0) ? BI_BUF_ZV (buf) : BI_BUF_BEGV (buf));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 /* #### newline cache stuff in this function not yet ported */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 assert (count != 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 if (shortage)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 *shortage = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 if (count > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 /* Due to the Mule representation of characters in a buffer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 we can simply search for characters in the range 0 - 127
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 directly. For other characters, we do it the "hard" way.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 Note that this way works for all characters but the other
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 way is faster. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 if (target >= 0200)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 while (st < lim && count > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 if (BI_BUF_FETCH_CHAR (buf, st) == target)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 count--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 INC_BYTIND (buf, st);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 while (st < lim && count > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 Bytind ceil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 Bufbyte *bufptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 ceil = BI_BUF_CEILING_OF (buf, st);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 ceil = min (lim, ceil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 bufptr = (Bufbyte *) memchr (BI_BUF_BYTE_ADDRESS (buf, st),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 (int) target, ceil - st);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 if (bufptr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 count--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 st = BI_BUF_PTR_BYTE_POS (buf, bufptr) + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 st = ceil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 if (shortage)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 *shortage = count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 if (allow_quit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 return st;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 if (target >= 0200)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 while (st > lim && count < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 DEC_BYTIND (buf, st);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 if (BI_BUF_FETCH_CHAR (buf, st) == target)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 count++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 while (st > lim && count < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 Bytind floor;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 Bufbyte *bufptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 Bufbyte *floorptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 floor = BI_BUF_FLOOR_OF (buf, st);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 floor = max (lim, floor);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 /* No memrchr() ... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 bufptr = BI_BUF_BYTE_ADDRESS_BEFORE (buf, st);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 floorptr = BI_BUF_BYTE_ADDRESS (buf, floor);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 while (bufptr >= floorptr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 st--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 /* At this point, both ST and BUFPTR refer to the same
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 character. When the loop terminates, ST will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 always point to the last character we tried. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 if (* (unsigned char *) bufptr == (unsigned char) target)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 count++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 bufptr--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 if (shortage)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 *shortage = -count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 if (allow_quit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 if (count)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 return st;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 /* We found the character we were looking for; we have to return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 the position *after* it due to the strange way that the return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676 value is defined. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677 INC_BYTIND (buf, st);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 return st;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683 Bufpos
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684 scan_buffer (struct buffer *buf, Emchar target, Bufpos start, Bufpos end,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 EMACS_INT count, EMACS_INT *shortage, int allow_quit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 Bytind bi_retval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688 Bytind bi_start, bi_end;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 bi_start = bufpos_to_bytind (buf, start);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 if (end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692 bi_end = bufpos_to_bytind (buf, end);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 bi_end = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695 bi_retval = bi_scan_buffer (buf, target, bi_start, bi_end, count,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696 shortage, allow_quit);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 return bytind_to_bufpos (buf, bi_retval);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700 Bytind
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 bi_find_next_newline_no_quit (struct buffer *buf, Bytind from, int count)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 return bi_scan_buffer (buf, '\n', from, 0, count, 0, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 Bufpos
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 find_next_newline_no_quit (struct buffer *buf, Bufpos from, int count)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709 return scan_buffer (buf, '\n', from, 0, count, 0, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 Bufpos
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 find_next_newline (struct buffer *buf, Bufpos from, int count)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 return scan_buffer (buf, '\n', from, 0, count, 0, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 Bytind
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
719 bi_find_next_emchar_in_string (Lisp_String* str, Emchar target, Bytind st,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 EMACS_INT count)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722 /* This function has been Mule-ized. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723 Bytind lim = string_length (str) -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724 Bufbyte* s = string_data (str);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726 assert (count >= 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 /* Due to the Mule representation of characters in a buffer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730 we can simply search for characters in the range 0 - 127
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 directly. For other characters, we do it the "hard" way.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 Note that this way works for all characters but the other
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 way is faster. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 if (target >= 0200)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 while (st < lim && count > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738 if (string_char (str, st) == target)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739 count--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 INC_CHARBYTIND (s, st);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 while (st < lim && count > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 Bufbyte *bufptr = (Bufbyte *) memchr (charptr_n_addr (s, st),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749 (int) target, lim - st);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750 if (bufptr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 count--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 st = (Bytind)(bufptr - s) + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756 st = lim;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 return st;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 /* Like find_next_newline, but returns position before the newline,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763 not after, and only search up to TO. This isn't just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764 find_next_newline (...)-1, because you might hit TO. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765 Bufpos
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 find_before_next_newline (struct buffer *buf, Bufpos from, Bufpos to, int count)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 EMACS_INT shortage;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 Bufpos pos = scan_buffer (buf, '\n', from, to, count, &shortage, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 if (shortage == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 pos--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 return pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 skip_chars (struct buffer *buf, int forwardp, int syntaxp,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 Lisp_Object string, Lisp_Object lim)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 /* This function has been Mule-ized. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 REGISTER Bufbyte *p, *pend;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783 REGISTER Emchar c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 /* We store the first 256 chars in an array here and the rest in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 a range table. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786 unsigned char fastmap[0400];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 int negate = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788 REGISTER int i;
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
789 #ifndef emacs
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
790 Lisp_Char_Table *syntax_table = XCHAR_TABLE (buf->mirror_syntax_table);
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
791 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 Bufpos limit;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794 if (NILP (lim))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 limit = forwardp ? BUF_ZV (buf) : BUF_BEGV (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798 CHECK_INT_COERCE_MARKER (lim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 limit = XINT (lim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 /* In any case, don't allow scan outside bounds of buffer. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 if (limit > BUF_ZV (buf)) limit = BUF_ZV (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
803 if (limit < BUF_BEGV (buf)) limit = BUF_BEGV (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
804 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806 CHECK_STRING (string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
807 p = XSTRING_DATA (string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
808 pend = p + XSTRING_LENGTH (string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809 memset (fastmap, 0, sizeof (fastmap));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811 Fclear_range_table (Vskip_chars_range_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813 if (p != pend && *p == '^')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 negate = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 p++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819 /* Find the characters specified and set their elements of fastmap.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820 If syntaxp, each character counts as itself.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821 Otherwise, handle backslashes and ranges specially */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823 while (p != pend)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 c = charptr_emchar (p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 INC_CHARPTR (p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 if (syntaxp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 if (c < 0400 && syntax_spec_code[c] < (unsigned char) Smax)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
830 fastmap[c] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
831 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832 signal_simple_error ("Invalid syntax designator",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833 make_char (c));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837 if (c == '\\')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
838 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839 if (p == pend) break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
840 c = charptr_emchar (p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841 INC_CHARPTR (p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
842 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843 if (p != pend && *p == '-')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845 Emchar cend;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 p++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 if (p == pend) break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 cend = charptr_emchar (p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 while (c <= cend && c < 0400)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 fastmap[c] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 c++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855 if (c <= cend)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 Fput_range_table (make_int (c), make_int (cend), Qt,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857 Vskip_chars_range_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858 INC_CHARPTR (p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 if (c < 0400)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 fastmap[c] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 Fput_range_table (make_int (c), make_int (c), Qt,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866 Vskip_chars_range_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871 if (syntaxp && fastmap['-'] != 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 fastmap[' '] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 /* If ^ was the first character, complement the fastmap.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 We don't complement the range table, however; we just use negate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 in the comparisons below. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878 if (negate)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 for (i = 0; i < (int) (sizeof fastmap); i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880 fastmap[i] ^= 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883 Bufpos start_point = BUF_PT (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
884
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885 if (syntaxp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886 {
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
887 SETUP_SYNTAX_CACHE_FOR_BUFFER (buf, BUF_PT (buf), forwardp ? 1 : -1);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888 /* All syntax designators are normal chars so nothing strange
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889 to worry about */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
890 if (forwardp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
891 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892 while (BUF_PT (buf) < limit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
893 && fastmap[(unsigned char)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894 syntax_code_spec
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
895 [(int) SYNTAX_FROM_CACHE (syntax_table,
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
896 BUF_FETCH_CHAR
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
897 (buf, BUF_PT (buf)))]])
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
898 {
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
899 BUF_SET_PT (buf, BUF_PT (buf) + 1);
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
900 UPDATE_SYNTAX_CACHE_FORWARD (BUF_PT (buf));
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
901 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
903 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905 while (BUF_PT (buf) > limit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
906 && fastmap[(unsigned char)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907 syntax_code_spec
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
908 [(int) SYNTAX_FROM_CACHE (syntax_table,
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
909 BUF_FETCH_CHAR
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
910 (buf, BUF_PT (buf) - 1))]])
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
911 {
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
912 BUF_SET_PT (buf, BUF_PT (buf) - 1);
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
913 UPDATE_SYNTAX_CACHE_BACKWARD (BUF_PT (buf) - 1);
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
914 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
916 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
917 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
918 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
919 if (forwardp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
921 while (BUF_PT (buf) < limit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
922 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
923 Emchar ch = BUF_FETCH_CHAR (buf, BUF_PT (buf));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
924 if ((ch < 0400) ? fastmap[ch] :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
925 (NILP (Fget_range_table (make_int (ch),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
926 Vskip_chars_range_table,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927 Qnil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
928 == negate))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
929 BUF_SET_PT (buf, BUF_PT (buf) + 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
930 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
931 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
932 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
933 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
934 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
935 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936 while (BUF_PT (buf) > limit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
937 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938 Emchar ch = BUF_FETCH_CHAR (buf, BUF_PT (buf) - 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
939 if ((ch < 0400) ? fastmap[ch] :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940 (NILP (Fget_range_table (make_int (ch),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941 Vskip_chars_range_table,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942 Qnil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943 == negate))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
944 BUF_SET_PT (buf, BUF_PT (buf) - 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
945 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
946 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
947 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 return make_int (BUF_PT (buf) - start_point);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 DEFUN ("skip-chars-forward", Fskip_chars_forward, 1, 3, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
956 Move point forward, stopping before a char not in STRING, or at pos LIMIT.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
957 STRING is like the inside of a `[...]' in a regular expression
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958 except that `]' is never special and `\\' quotes `^', `-' or `\\'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 Thus, with arg "a-zA-Z", this skips letters stopping before first nonletter.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 With arg "^a-zA-Z", skips nonletters stopping before first letter.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 Returns the distance traveled, either zero or positive.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
963 Optional argument BUFFER defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
965 (string, limit, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
967 return skip_chars (decode_buffer (buffer, 0), 1, 0, string, limit);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
968 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
970 DEFUN ("skip-chars-backward", Fskip_chars_backward, 1, 3, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
971 Move point backward, stopping after a char not in STRING, or at pos LIMIT.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972 See `skip-chars-forward' for details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973 Returns the distance traveled, either zero or negative.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
974
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975 Optional argument BUFFER defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
977 (string, limit, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
979 return skip_chars (decode_buffer (buffer, 0), 0, 0, string, limit);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983 DEFUN ("skip-syntax-forward", Fskip_syntax_forward, 1, 3, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
984 Move point forward across chars in specified syntax classes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
985 SYNTAX is a string of syntax code characters.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
986 Stop before a char whose syntax is not in SYNTAX, or at position LIMIT.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987 If SYNTAX starts with ^, skip characters whose syntax is NOT in SYNTAX.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988 This function returns the distance traveled, either zero or positive.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
989
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
990 Optional argument BUFFER defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
992 (syntax, limit, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
994 return skip_chars (decode_buffer (buffer, 0), 1, 1, syntax, limit);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
996
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
997 DEFUN ("skip-syntax-backward", Fskip_syntax_backward, 1, 3, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
998 Move point backward across chars in specified syntax classes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
999 SYNTAX is a string of syntax code characters.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1000 Stop on reaching a char whose syntax is not in SYNTAX, or at position LIMIT.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1001 If SYNTAX starts with ^, skip characters whose syntax is NOT in SYNTAX.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1002 This function returns the distance traveled, either zero or negative.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1003
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1004 Optional argument BUFFER defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1005 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1006 (syntax, limit, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1008 return skip_chars (decode_buffer (buffer, 0), 0, 1, syntax, limit);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1009 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012 /* Subroutines of Lisp buffer search functions. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014 static Lisp_Object
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1015 search_command (Lisp_Object string, Lisp_Object limit, Lisp_Object noerror,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016 Lisp_Object count, Lisp_Object buffer, int direction,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017 int RE, int posix)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1019 /* This function has been Mule-ized, except for the trt table handling. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020 REGISTER Bufpos np;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 Bufpos lim;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022 EMACS_INT n = direction;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023 struct buffer *buf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1024
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025 if (!NILP (count))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 CHECK_INT (count);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028 n *= XINT (count);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1030
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031 buf = decode_buffer (buffer, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032 CHECK_STRING (string);
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1033 if (NILP (limit))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 lim = n > 0 ? BUF_ZV (buf) : BUF_BEGV (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1037 CHECK_INT_COERCE_MARKER (limit);
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1038 lim = XINT (limit);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1039 if (n > 0 ? lim < BUF_PT (buf) : lim > BUF_PT (buf))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1040 error ("Invalid search limit (wrong side of point)");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041 if (lim > BUF_ZV (buf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1042 lim = BUF_ZV (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1043 if (lim < BUF_BEGV (buf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1044 lim = BUF_BEGV (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1045 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1046
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 np = search_buffer (buf, string, BUF_PT (buf), lim, n, RE,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048 (!NILP (buf->case_fold_search)
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1049 ? XCASE_TABLE_CANON (buf->case_table)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1050 : Qnil),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1051 (!NILP (buf->case_fold_search)
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1052 ? XCASE_TABLE_EQV (buf->case_table)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1053 : Qnil), posix);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1054
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1055 if (np <= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1056 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1057 if (NILP (noerror))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1058 return signal_failure (string);
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1059 if (!EQ (noerror, Qt))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1060 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1061 if (lim < BUF_BEGV (buf) || lim > BUF_ZV (buf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1063 BUF_SET_PT (buf, lim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1064 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1065 #if 0 /* This would be clean, but maybe programs depend on
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1066 a value of nil here. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1067 np = lim;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1071 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074 if (np < BUF_BEGV (buf) || np > BUF_ZV (buf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1075 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1076
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1077 BUF_SET_PT (buf, np);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1078
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1079 return make_int (np);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1080 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1082 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1083 trivial_regexp_p (Lisp_Object regexp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1084 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1085 /* This function has been Mule-ized. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1086 Bytecount len = XSTRING_LENGTH (regexp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1087 Bufbyte *s = XSTRING_DATA (regexp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1088 while (--len >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1089 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1090 switch (*s++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1091 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1092 case '.': case '*': case '+': case '?': case '[': case '^': case '$':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1093 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1094 case '\\':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1095 if (--len < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1096 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1097 switch (*s++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1098 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1099 case '|': case '(': case ')': case '`': case '\'': case 'b':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1100 case 'B': case '<': case '>': case 'w': case 'W': case 's':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101 case 'S': case '=':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1102 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1103 /* 97/2/25 jhod Added for category matches */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1104 case 'c': case 'C':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1105 #endif /* MULE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1106 case '1': case '2': case '3': case '4': case '5':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1107 case '6': case '7': case '8': case '9':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1108 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1109 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1110 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1111 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1112 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1113 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1114
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1115 /* Search for the n'th occurrence of STRING in BUF,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1116 starting at position BUFPOS and stopping at position BUFLIM,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1117 treating PAT as a literal string if RE is false or as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1118 a regular expression if RE is true.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1119
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1120 If N is positive, searching is forward and BUFLIM must be greater
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1121 than BUFPOS.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1122 If N is negative, searching is backward and BUFLIM must be less
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123 than BUFPOS.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1124
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1125 Returns -x if only N-x occurrences found (x > 0),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1126 or else the position at the beginning of the Nth occurrence
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1127 (if searching backward) or the end (if searching forward).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1128
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1129 POSIX is nonzero if we want full backtracking (POSIX style)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1130 for this pattern. 0 means backtrack only enough to get a valid match. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1131 static Bufpos
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1132 search_buffer (struct buffer *buf, Lisp_Object string, Bufpos bufpos,
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1133 Bufpos buflim, EMACS_INT n, int RE, Lisp_Object trt,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1134 Lisp_Object inverse_trt, int posix)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1135 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1136 /* This function has been Mule-ized, except for the trt table handling. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1137 Bytecount len = XSTRING_LENGTH (string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138 Bufbyte *base_pat = XSTRING_DATA (string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1139 REGISTER EMACS_INT i, j;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1140 Bytind p1, p2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1141 Bytecount s1, s2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1142 Bytind pos, lim;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1143
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144 if (running_asynch_code)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1145 save_search_regs ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1146
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1147 /* Null string is found at starting position. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1148 if (len == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1149 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1150 set_search_regs (buf, bufpos, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1151 return bufpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1152 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1153
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1154 /* Searching 0 times means don't move. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1155 if (n == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1156 return bufpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1157
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1158 pos = bufpos_to_bytind (buf, bufpos);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1159 lim = bufpos_to_bytind (buf, buflim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1160 if (RE && !trivial_regexp_p (string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1161 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1162 struct re_pattern_buffer *bufp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1163
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1164 bufp = compile_pattern (string, &search_regs, trt, posix,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1165 ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1166
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1167 /* Get pointers and sizes of the two strings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1168 that make up the visible portion of the buffer. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1169
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1170 p1 = BI_BUF_BEGV (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1171 p2 = BI_BUF_CEILING_OF (buf, p1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1172 s1 = p2 - p1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1173 s2 = BI_BUF_ZV (buf) - p2;
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
1174 regex_match_object = Qnil;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1175
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1176 while (n < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1177 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1178 Bytecount val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1179 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1180 regex_emacs_buffer = buf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1181 val = re_search_2 (bufp,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1182 (char *) BI_BUF_BYTE_ADDRESS (buf, p1), s1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1183 (char *) BI_BUF_BYTE_ADDRESS (buf, p2), s2,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1184 pos - BI_BUF_BEGV (buf), lim - pos, &search_regs,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1185 pos - BI_BUF_BEGV (buf));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1186
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1187 if (val == -2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1188 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1189 matcher_overflow ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1190 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1191 if (val >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1192 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1193 int num_regs = search_regs.num_regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1194 j = BI_BUF_BEGV (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1195 for (i = 0; i < num_regs; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1196 if (search_regs.start[i] >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1197 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1198 search_regs.start[i] += j;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1199 search_regs.end[i] += j;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1200 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1201 XSETBUFFER (last_thing_searched, buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1202 /* Set pos to the new position. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1203 pos = search_regs.start[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1204 fixup_search_regs_for_buffer (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1205 /* And bufpos too. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1206 bufpos = search_regs.start[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1207 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1208 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1209 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1210 return n;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1211 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1212 n++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1213 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1214 while (n > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1215 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1216 Bytecount val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1217 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1218 regex_emacs_buffer = buf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1219 val = re_search_2 (bufp,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1220 (char *) BI_BUF_BYTE_ADDRESS (buf, p1), s1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1221 (char *) BI_BUF_BYTE_ADDRESS (buf, p2), s2,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1222 pos - BI_BUF_BEGV (buf), lim - pos, &search_regs,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1223 lim - BI_BUF_BEGV (buf));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1224 if (val == -2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1225 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1226 matcher_overflow ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1227 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1228 if (val >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1229 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1230 int num_regs = search_regs.num_regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1231 j = BI_BUF_BEGV (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1232 for (i = 0; i < num_regs; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1233 if (search_regs.start[i] >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1234 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1235 search_regs.start[i] += j;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1236 search_regs.end[i] += j;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1237 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1238 XSETBUFFER (last_thing_searched, buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1239 /* Set pos to the new position. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1240 pos = search_regs.end[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1241 fixup_search_regs_for_buffer (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1242 /* And bufpos too. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1243 bufpos = search_regs.end[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1244 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1245 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1246 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1247 return 0 - n;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1248 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1249 n--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1250 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1251 return bufpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1252 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1253 else /* non-RE case */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1254 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1255 int charset_base = -1;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1256 int boyer_moore_ok = 1;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1257 Bufbyte *pat = 0;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1258 Bufbyte *patbuf = alloca_array (Bufbyte, len * MAX_EMCHAR_LEN);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1259 pat = patbuf;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1260 #ifdef MULE
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1261 while (len > 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1262 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1263 Bufbyte tmp_str[MAX_EMCHAR_LEN];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1264 Emchar c, translated, inverse;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1265 Bytecount orig_bytelen, new_bytelen, inv_bytelen;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1266
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1267 /* If we got here and the RE flag is set, it's because
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1268 we're dealing with a regexp known to be trivial, so the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1269 backslash just quotes the next character. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1270 if (RE && *base_pat == '\\')
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1271 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1272 len--;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1273 base_pat++;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1274 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1275 c = charptr_emchar (base_pat);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1276 translated = TRANSLATE (trt, c);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1277 inverse = TRANSLATE (inverse_trt, c);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1278
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1279 orig_bytelen = charcount_to_bytecount (base_pat, 1);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1280 inv_bytelen = set_charptr_emchar (tmp_str, inverse);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1281 new_bytelen = set_charptr_emchar (tmp_str, translated);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1282
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1283
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1284 if (new_bytelen != orig_bytelen || inv_bytelen != orig_bytelen)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1285 boyer_moore_ok = 0;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1286 if (translated != c || inverse != c)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1287 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1288 /* Keep track of which character set row
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1289 contains the characters that need translation. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1290 int charset_base_code = c & ~CHAR_FIELD3_MASK;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1291 if (charset_base == -1)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1292 charset_base = charset_base_code;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1293 else if (charset_base != charset_base_code)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1294 /* If two different rows appear, needing translation,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1295 then we cannot use boyer_moore search. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1296 boyer_moore_ok = 0;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1297 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1298 memcpy (pat, tmp_str, new_bytelen);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1299 pat += new_bytelen;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1300 base_pat += orig_bytelen;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1301 len -= orig_bytelen;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1302 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1303 #else /* not MULE */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1304 while (--len >= 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1305 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1306 /* If we got here and the RE flag is set, it's because
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1307 we're dealing with a regexp known to be trivial, so the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1308 backslash just quotes the next character. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1309 if (RE && *base_pat == '\\')
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1310 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1311 len--;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1312 base_pat++;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1313 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1314 *pat++ = TRANSLATE (trt, *base_pat++);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1315 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1316 #endif /* MULE */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1317 len = pat - patbuf;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1318 pat = base_pat = patbuf;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1319 if (boyer_moore_ok)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1320 return boyer_moore (buf, base_pat, len, pos, lim, n,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1321 trt, inverse_trt, charset_base);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1322 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1323 return simple_search (buf, base_pat, len, pos, lim, n, trt);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1324 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1325 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1326
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1327 /* Do a simple string search N times for the string PAT,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1328 whose length is LEN/LEN_BYTE,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1329 from buffer position POS/POS_BYTE until LIM/LIM_BYTE.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1330 TRT is the translation table.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1331
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1332 Return the character position where the match is found.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1333 Otherwise, if M matches remained to be found, return -M.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1334
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1335 This kind of search works regardless of what is in PAT and
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1336 regardless of what is in TRT. It is used in cases where
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1337 boyer_moore cannot work. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1338
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1339 static Bufpos
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1340 simple_search (struct buffer *buf, Bufbyte *base_pat, Bytecount len_byte,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1341 Bytind idx, Bytind lim, EMACS_INT n, Lisp_Object trt)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1342 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1343 int forward = n > 0;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1344 Bytecount buf_len = 0; /* Shut up compiler. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1345
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1346 if (lim > idx)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1347 while (n > 0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1348 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1349 while (1)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1350 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1351 Bytecount this_len = len_byte;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1352 Bytind this_idx = idx;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1353 Bufbyte *p = base_pat;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1354 if (idx >= lim)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1355 goto stop;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1356
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1357 while (this_len > 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1358 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1359 Emchar pat_ch, buf_ch;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1360 Bytecount pat_len;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1361
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1362 pat_ch = charptr_emchar (p);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1363 buf_ch = BI_BUF_FETCH_CHAR (buf, this_idx);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1364
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1365 buf_ch = TRANSLATE (trt, buf_ch);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1366
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1367 if (buf_ch != pat_ch)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1368 break;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1369
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1370 pat_len = charcount_to_bytecount (p, 1);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1371 p += pat_len;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1372 this_len -= pat_len;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1373 INC_BYTIND (buf, this_idx);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1374 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1375 if (this_len == 0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1376 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1377 buf_len = this_idx - idx;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1378 idx = this_idx;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1379 break;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1380 }
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1381 INC_BYTIND (buf, idx);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1382 }
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1383 n--;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1384 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1385 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1386 while (n < 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1387 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1388 while (1)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1389 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1390 Bytecount this_len = len_byte;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1391 Bytind this_idx = idx;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1392 Bufbyte *p;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1393 if (idx <= lim)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1394 goto stop;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1395 p = base_pat + len_byte;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1396
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1397 while (this_len > 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1398 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1399 Emchar pat_ch, buf_ch;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1400
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1401 DEC_CHARPTR (p);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1402 DEC_BYTIND (buf, this_idx);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1403 pat_ch = charptr_emchar (p);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1404 buf_ch = BI_BUF_FETCH_CHAR (buf, this_idx);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1405
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1406 buf_ch = TRANSLATE (trt, buf_ch);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1407
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1408 if (buf_ch != pat_ch)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1409 break;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1410
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1411 this_len -= charcount_to_bytecount (p, 1);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1412 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1413 if (this_len == 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1414 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1415 buf_len = idx - this_idx;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1416 idx = this_idx;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1417 break;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1418 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1419 DEC_BYTIND (buf, idx);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1420 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1421 n++;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1422 }
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1423 stop:
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1424 if (n == 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1425 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1426 Bufpos beg, end, retval;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1427 if (forward)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1428 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1429 beg = bytind_to_bufpos (buf, idx - buf_len);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1430 retval = end = bytind_to_bufpos (buf, idx);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1431 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1432 else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1433 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1434 retval = beg = bytind_to_bufpos (buf, idx);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1435 end = bytind_to_bufpos (buf, idx + buf_len);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1436 }
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1437 set_search_regs (buf, beg, end - beg);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1438
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1439 return retval;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1440 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1441 else if (n > 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1442 return -n;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1443 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1444 return n;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1445 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1447 /* Do Boyer-Moore search N times for the string PAT,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1448 whose length is LEN/LEN_BYTE,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1449 from buffer position POS/POS_BYTE until LIM/LIM_BYTE.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1450 DIRECTION says which direction we search in.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1451 TRT and INVERSE_TRT are translation tables.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1452
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1453 This kind of search works if all the characters in PAT that have
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1454 nontrivial translation are the same aside from the last byte. This
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1455 makes it possible to translate just the last byte of a character,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1456 and do so after just a simple test of the context.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1457
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1458 If that criterion is not satisfied, do not call this function. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1459
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1460 static Bufpos
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1461 boyer_moore (struct buffer *buf, Bufbyte *base_pat, Bytecount len,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1462 Bytind pos, Bytind lim, EMACS_INT n, Lisp_Object trt,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1463 Lisp_Object inverse_trt, int charset_base)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1464 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1465 /* #### Someone really really really needs to comment the workings
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1466 of this junk somewhat better.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1467
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1468 BTW "BM" stands for Boyer-Moore, which is one of the standard
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1469 string-searching algorithms. It's the best string-searching
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1470 algorithm out there, provided that:
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1471
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1472 a) You're not fazed by algorithm complexity. (Rabin-Karp, which
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1473 uses hashing, is much much easier to code but not as fast.)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1474 b) You can freely move backwards in the string that you're
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1475 searching through.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1476
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1477 As the comment below tries to explain (but garbles in typical
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1478 programmer-ese), the idea is that you don't have to do a
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1479 string match at every successive position in the text. For
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1480 example, let's say the pattern is "a very long string". We
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1481 compare the last character in the string (`g') with the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1482 corresponding character in the text. If it mismatches, and
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1483 it is, say, `z', then we can skip forward by the entire
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1484 length of the pattern because `z' does not occur anywhere
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1485 in the pattern. If the mismatching character does occur
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1486 in the pattern, we can usually still skip forward by more
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1487 than one: e.g. if it is `l', then we can skip forward
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1488 by the length of the substring "ong string" -- i.e. the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1489 largest end section of the pattern that does not contain
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1490 the mismatched character. So what we do is compute, for
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1491 each possible character, the distance we can skip forward
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1492 (the "stride") and use it in the string matching. This
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1493 is what the BM_tab holds. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1494 REGISTER EMACS_INT *BM_tab;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1495 EMACS_INT *BM_tab_base;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1496 REGISTER Bytecount dirlen;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1497 EMACS_INT infinity;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1498 Bytind limit;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1499 Bytecount stride_for_teases = 0;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1500 REGISTER EMACS_INT i, j;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1501 Bufbyte *pat, *pat_end;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1502 REGISTER Bufbyte *cursor, *p_limit, *ptr2;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1503 Bufbyte simple_translate[0400];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1504 REGISTER int direction = ((n > 0) ? 1 : -1);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1505 #ifdef MULE
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1506 Bufbyte translate_prev_byte = 0;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1507 Bufbyte translate_anteprev_byte = 0;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1508 #endif
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1509 #ifdef C_ALLOCA
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1510 EMACS_INT BM_tab_space[0400];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1511 BM_tab = &BM_tab_space[0];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1512 #else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1513 BM_tab = alloca_array (EMACS_INT, 256);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1514 #endif
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1515
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1516 /* The general approach is that we are going to maintain that we
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1517 know the first (closest to the present position, in whatever
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1518 direction we're searching) character that could possibly be
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1519 the last (furthest from present position) character of a
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1520 valid match. We advance the state of our knowledge by
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1521 looking at that character and seeing whether it indeed
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1522 matches the last character of the pattern. If it does, we
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1523 take a closer look. If it does not, we move our pointer (to
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1524 putative last characters) as far as is logically possible.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1525 This amount of movement, which I call a stride, will be the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1526 length of the pattern if the actual character appears nowhere
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1527 in the pattern, otherwise it will be the distance from the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1528 last occurrence of that character to the end of the pattern.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1529 As a coding trick, an enormous stride is coded into the table
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1530 for characters that match the last character. This allows
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1531 use of only a single test, a test for having gone past the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1532 end of the permissible match region, to test for both
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1533 possible matches (when the stride goes past the end
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1534 immediately) and failure to match (where you get nudged past
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1535 the end one stride at a time).
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1536
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1537 Here we make a "mickey mouse" BM table. The stride of the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1538 search is determined only by the last character of the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1539 putative match. If that character does not match, we will
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1540 stride the proper distance to propose a match that
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1541 superimposes it on the last instance of a character that
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1542 matches it (per trt), or misses it entirely if there is
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1543 none. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1544
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1545 dirlen = len * direction;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1546 infinity = dirlen - (lim + pos + len + len) * direction;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1547 /* Record position after the end of the pattern. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1548 pat_end = base_pat + len;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1549 if (direction < 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1550 base_pat = pat_end - 1;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1551 BM_tab_base = BM_tab;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1552 BM_tab += 0400;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1553 j = dirlen; /* to get it in a register */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1554 /* A character that does not appear in the pattern induces a
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1555 stride equal to the pattern length. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1556 while (BM_tab_base != BM_tab)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1557 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1558 *--BM_tab = j;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1559 *--BM_tab = j;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1560 *--BM_tab = j;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1561 *--BM_tab = j;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1562 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1563 /* We use this for translation, instead of TRT itself. We
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1564 fill this in to handle the characters that actually occur
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1565 in the pattern. Others don't matter anyway! */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1566 xzero (simple_translate);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1567 for (i = 0; i < 0400; i++)
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 460
diff changeset
1568 simple_translate[i] = (Bufbyte) i;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1569 i = 0;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1570 while (i != infinity)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1571 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1572 Bufbyte *ptr = base_pat + i;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1573 i += direction;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1574 if (i == dirlen)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1575 i = infinity;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1576 if (!NILP (trt))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1577 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1578 #ifdef MULE
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1579 Emchar ch, untranslated;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1580 int this_translated = 1;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1581
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1582 /* Is *PTR the last byte of a character? */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1583 if (pat_end - ptr == 1 || BUFBYTE_FIRST_BYTE_P (ptr[1]))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1584 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1585 Bufbyte *charstart = ptr;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1586 while (!BUFBYTE_FIRST_BYTE_P (*charstart))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1587 charstart--;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1588 untranslated = charptr_emchar (charstart);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1589 if (charset_base == (untranslated & ~CHAR_FIELD3_MASK))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1590 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1591 ch = TRANSLATE (trt, untranslated);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1592 if (!BUFBYTE_FIRST_BYTE_P (*ptr))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1593 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1594 translate_prev_byte = ptr[-1];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1595 if (!BUFBYTE_FIRST_BYTE_P (translate_prev_byte))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1596 translate_anteprev_byte = ptr[-2];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1597 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1598 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1599 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1600 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1601 this_translated = 0;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1602 ch = *ptr;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1603 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1604 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1605 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1606 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1607 ch = *ptr;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1608 this_translated = 0;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1609 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1610 if (ch > 0400)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1611 j = ((unsigned char) ch | 0200);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1612 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1613 j = (unsigned char) ch;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1614
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1615 if (i == infinity)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1616 stride_for_teases = BM_tab[j];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1617 BM_tab[j] = dirlen - i;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1618 /* A translation table is accompanied by its inverse --
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1619 see comment following downcase_table for details */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1620 if (this_translated)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1621 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1622 Emchar starting_ch = ch;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1623 EMACS_INT starting_j = j;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1624 while (1)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1625 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1626 ch = TRANSLATE (inverse_trt, ch);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1627 if (ch > 0400)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1628 j = ((unsigned char) ch | 0200);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1629 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1630 j = (unsigned char) ch;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1631
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1632 /* For all the characters that map into CH,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1633 set up simple_translate to map the last byte
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1634 into STARTING_J. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1635 simple_translate[j] = starting_j;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1636 if (ch == starting_ch)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1637 break;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1638 BM_tab[j] = dirlen - i;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1639 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1640 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1641 #else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1642 EMACS_INT k;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1643 j = *ptr;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1644 k = (j = TRANSLATE (trt, j));
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1645 if (i == infinity)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1646 stride_for_teases = BM_tab[j];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1647 BM_tab[j] = dirlen - i;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1648 /* A translation table is accompanied by its inverse --
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1649 see comment following downcase_table for details */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1650
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1651 while ((j = TRANSLATE (inverse_trt, j)) != k)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1652 {
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 460
diff changeset
1653 simple_translate[j] = (Bufbyte) k;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1654 BM_tab[j] = dirlen - i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1655 }
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1656 #endif
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1657 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1658 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1659 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1660 j = *ptr;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1661
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1662 if (i == infinity)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1663 stride_for_teases = BM_tab[j];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1664 BM_tab[j] = dirlen - i;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1665 }
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1666 /* stride_for_teases tells how much to stride if we get a
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1667 match on the far character but are subsequently
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1668 disappointed, by recording what the stride would have been
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1669 for that character if the last character had been
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1670 different. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1671 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1672 infinity = dirlen - infinity;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1673 pos += dirlen - ((direction > 0) ? direction : 0);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1674 /* loop invariant - pos points at where last char (first char if
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1675 reverse) of pattern would align in a possible match. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1676 while (n != 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1677 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1678 Bytind tail_end;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1679 Bufbyte *tail_end_ptr;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1680 /* It's been reported that some (broken) compiler thinks
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1681 that Boolean expressions in an arithmetic context are
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1682 unsigned. Using an explicit ?1:0 prevents this. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1683 if ((lim - pos - ((direction > 0) ? 1 : 0)) * direction < 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1684 return n * (0 - direction);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1685 /* First we do the part we can by pointers (maybe
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1686 nothing) */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1687 QUIT;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1688 pat = base_pat;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1689 limit = pos - dirlen + direction;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1690 /* XEmacs change: definitions of CEILING_OF and FLOOR_OF
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1691 have changed. See buffer.h. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1692 limit = ((direction > 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1693 ? BI_BUF_CEILING_OF (buf, limit) - 1
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1694 : BI_BUF_FLOOR_OF (buf, limit + 1));
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1695 /* LIMIT is now the last (not beyond-last!) value POS can
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1696 take on without hitting edge of buffer or the gap. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1697 limit = ((direction > 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1698 ? min (lim - 1, min (limit, pos + 20000))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1699 : max (lim, max (limit, pos - 20000)));
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1700 tail_end = BI_BUF_CEILING_OF (buf, pos);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1701 tail_end_ptr = BI_BUF_BYTE_ADDRESS (buf, tail_end);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1702
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1703 if ((limit - pos) * direction > 20)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1704 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1705 p_limit = BI_BUF_BYTE_ADDRESS (buf, limit);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1706 ptr2 = (cursor = BI_BUF_BYTE_ADDRESS (buf, pos));
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1707 /* In this loop, pos + cursor - ptr2 is the surrogate
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1708 for pos */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1709 while (1) /* use one cursor setting as long as i can */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1710 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1711 if (direction > 0) /* worth duplicating */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1712 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1713 /* Use signed comparison if appropriate to make
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1714 cursor+infinity sure to be > p_limit.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1715 Assuming that the buffer lies in a range of
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1716 addresses that are all "positive" (as ints)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1717 or all "negative", either kind of comparison
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1718 will work as long as we don't step by
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1719 infinity. So pick the kind that works when
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1720 we do step by infinity. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1721 if ((EMACS_INT) (p_limit + infinity) >
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1722 (EMACS_INT) p_limit)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1723 while ((EMACS_INT) cursor <=
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1724 (EMACS_INT) p_limit)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1725 cursor += BM_tab[*cursor];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1726 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1727 while ((EMACS_UINT) cursor <=
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1728 (EMACS_UINT) p_limit)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1729 cursor += BM_tab[*cursor];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1730 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1731 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1732 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1733 if ((EMACS_INT) (p_limit + infinity) <
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1734 (EMACS_INT) p_limit)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1735 while ((EMACS_INT) cursor >=
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1736 (EMACS_INT) p_limit)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1737 cursor += BM_tab[*cursor];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1738 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1739 while ((EMACS_UINT) cursor >=
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1740 (EMACS_UINT) p_limit)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1741 cursor += BM_tab[*cursor];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1742 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1743 /* If you are here, cursor is beyond the end of the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1744 searched region. This can happen if you match on
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1745 the far character of the pattern, because the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1746 "stride" of that character is infinity, a number
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1747 able to throw you well beyond the end of the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1748 search. It can also happen if you fail to match
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1749 within the permitted region and would otherwise
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1750 try a character beyond that region */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1751 if ((cursor - p_limit) * direction <= len)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1752 break; /* a small overrun is genuine */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1753 cursor -= infinity; /* large overrun = hit */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1754 i = dirlen - direction;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1755 if (!NILP (trt))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1756 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1757 while ((i -= direction) + direction != 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1758 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1759 #ifdef MULE
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1760 Emchar ch;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1761 cursor -= direction;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1762 /* Translate only the last byte of a character. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1763 if ((cursor == tail_end_ptr
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1764 || BUFBYTE_FIRST_BYTE_P (cursor[1]))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1765 && (BUFBYTE_FIRST_BYTE_P (cursor[0])
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1766 || (translate_prev_byte == cursor[-1]
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1767 && (BUFBYTE_FIRST_BYTE_P (translate_prev_byte)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1768 || translate_anteprev_byte == cursor[-2]))))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1769 ch = simple_translate[*cursor];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1770 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1771 ch = *cursor;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1772 if (pat[i] != ch)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1773 break;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1774 #else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1775 if (pat[i] != TRANSLATE (trt, *(cursor -= direction)))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1776 break;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1777 #endif
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1778 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1779 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1780 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1781 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1782 while ((i -= direction) + direction != 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1783 if (pat[i] != *(cursor -= direction))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1784 break;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1785 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1786 cursor += dirlen - i - direction; /* fix cursor */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1787 if (i + direction == 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1788 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1789 cursor -= direction;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1790
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1791 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1792 Bytind bytstart = (pos + cursor - ptr2 +
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1793 ((direction > 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1794 ? 1 - len : 0));
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1795 Bufpos bufstart = bytind_to_bufpos (buf, bytstart);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1796 Bufpos bufend = bytind_to_bufpos (buf, bytstart + len);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1797
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1798 set_search_regs (buf, bufstart, bufend - bufstart);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1799 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1800
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1801 if ((n -= direction) != 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1802 cursor += dirlen; /* to resume search */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1803 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1804 return ((direction > 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1805 ? search_regs.end[0] : search_regs.start[0]);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1806 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1807 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1808 cursor += stride_for_teases; /* <sigh> we lose - */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1809 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1810 pos += cursor - ptr2;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1811 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1812 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1813 /* Now we'll pick up a clump that has to be done the hard
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1814 way because it covers a discontinuity */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1815 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1816 /* XEmacs change: definitions of CEILING_OF and FLOOR_OF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1817 have changed. See buffer.h. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1818 limit = ((direction > 0)
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1819 ? BI_BUF_CEILING_OF (buf, pos - dirlen + 1) - 1
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1820 : BI_BUF_FLOOR_OF (buf, pos - dirlen));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1821 limit = ((direction > 0)
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1822 ? min (limit + len, lim - 1)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1823 : max (limit - len, lim));
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1824 /* LIMIT is now the last value POS can have
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1825 and still be valid for a possible match. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1826 while (1)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1827 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1828 /* This loop can be coded for space rather than
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1829 speed because it will usually run only once.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1830 (the reach is at most len + 21, and typically
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1831 does not exceed len) */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1832 while ((limit - pos) * direction >= 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1833 /* *not* BI_BUF_FETCH_CHAR. We are working here
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1834 with bytes, not characters. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1835 pos += BM_tab[*BI_BUF_BYTE_ADDRESS (buf, pos)];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1836 /* now run the same tests to distinguish going off
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1837 the end, a match or a phony match. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1838 if ((pos - limit) * direction <= len)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1839 break; /* ran off the end */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1840 /* Found what might be a match.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1841 Set POS back to last (first if reverse) char pos. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1842 pos -= infinity;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1843 i = dirlen - direction;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1844 while ((i -= direction) + direction != 0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1845 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1846 #ifdef MULE
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1847 Emchar ch;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1848 Bufbyte *ptr;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1849 #endif
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1850 pos -= direction;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1851 #ifdef MULE
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1852 ptr = BI_BUF_BYTE_ADDRESS (buf, pos);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1853 if ((ptr == tail_end_ptr
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1854 || BUFBYTE_FIRST_BYTE_P (ptr[1]))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1855 && (BUFBYTE_FIRST_BYTE_P (ptr[0])
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1856 || (translate_prev_byte == ptr[-1]
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1857 && (BUFBYTE_FIRST_BYTE_P (translate_prev_byte)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1858 || translate_anteprev_byte == ptr[-2]))))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1859 ch = simple_translate[*ptr];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1860 else
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1861 ch = *ptr;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1862 if (pat[i] != ch)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1863 break;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1864
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1865 #else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1866 if (pat[i] != TRANSLATE (trt,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1867 *BI_BUF_BYTE_ADDRESS (buf, pos)))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1868 break;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1869 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1870 }
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1871 /* Above loop has moved POS part or all the way back
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1872 to the first char pos (last char pos if reverse).
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1873 Set it once again at the last (first if reverse)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1874 char. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1875 pos += dirlen - i- direction;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1876 if (i + direction == 0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1877 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1878 pos -= direction;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1879
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1880 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1881 Bytind bytstart = (pos +
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1882 ((direction > 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1883 ? 1 - len : 0));
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1884 Bufpos bufstart = bytind_to_bufpos (buf, bytstart);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1885 Bufpos bufend = bytind_to_bufpos (buf, bytstart + len);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1886
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1887 set_search_regs (buf, bufstart, bufend - bufstart);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1888 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1889
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1890 if ((n -= direction) != 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1891 pos += dirlen; /* to resume search */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1892 else
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1893 return ((direction > 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1894 ? search_regs.end[0] : search_regs.start[0]);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1895 }
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1896 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1897 pos += stride_for_teases;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1898 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1899 }
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1900 /* We have done one clump. Can we continue? */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1901 if ((lim - pos) * direction < 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1902 return (0 - n) * direction;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1903 }
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1904 return bytind_to_bufpos (buf, pos);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1905 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1906
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1907 /* Record beginning BEG and end BEG + LEN
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1908 for a match just found in the current buffer. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1909
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1910 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1911 set_search_regs (struct buffer *buf, Bufpos beg, Charcount len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1912 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1913 /* This function has been Mule-ized. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1914 /* Make sure we have registers in which to store
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1915 the match position. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1916 if (search_regs.num_regs == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1917 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1918 search_regs.start = xnew (regoff_t);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1919 search_regs.end = xnew (regoff_t);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1920 search_regs.num_regs = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1921 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1922
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1923 search_regs.start[0] = beg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1924 search_regs.end[0] = beg + len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1925 XSETBUFFER (last_thing_searched, buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1926 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1927
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1928
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1929 /* Given a string of words separated by word delimiters,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1930 compute a regexp that matches those exact words
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1931 separated by arbitrary punctuation. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1932
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1933 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1934 wordify (Lisp_Object buffer, Lisp_Object string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1935 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1936 Charcount i, len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1937 EMACS_INT punct_count = 0, word_count = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1938 struct buffer *buf = decode_buffer (buffer, 0);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1939 Lisp_Char_Table *syntax_table = XCHAR_TABLE (buf->mirror_syntax_table);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1940
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1941 CHECK_STRING (string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1942 len = XSTRING_CHAR_LENGTH (string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1943
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1944 for (i = 0; i < len; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1945 if (!WORD_SYNTAX_P (syntax_table, string_char (XSTRING (string), i)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1946 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1947 punct_count++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1948 if (i > 0 && WORD_SYNTAX_P (syntax_table,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1949 string_char (XSTRING (string), i - 1)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1950 word_count++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1951 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1952 if (WORD_SYNTAX_P (syntax_table, string_char (XSTRING (string), len - 1)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1953 word_count++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1954 if (!word_count) return build_string ("");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1955
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1956 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1957 /* The following value is an upper bound on the amount of storage we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1958 need. In non-Mule, it is exact. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1959 Bufbyte *storage =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1960 (Bufbyte *) alloca (XSTRING_LENGTH (string) - punct_count +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1961 5 * (word_count - 1) + 4);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1962 Bufbyte *o = storage;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1963
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1964 *o++ = '\\';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1965 *o++ = 'b';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1966
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1967 for (i = 0; i < len; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1968 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1969 Emchar ch = string_char (XSTRING (string), i);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1970
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1971 if (WORD_SYNTAX_P (syntax_table, ch))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1972 o += set_charptr_emchar (o, ch);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1973 else if (i > 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1974 && WORD_SYNTAX_P (syntax_table,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1975 string_char (XSTRING (string), i - 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1976 && --word_count)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1977 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1978 *o++ = '\\';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1979 *o++ = 'W';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1980 *o++ = '\\';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1981 *o++ = 'W';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1982 *o++ = '*';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1983 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1984 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1985
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1986 *o++ = '\\';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1987 *o++ = 'b';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1988
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1989 return make_string (storage, o - storage);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1990 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1991 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1992
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1993 DEFUN ("search-backward", Fsearch_backward, 1, 5, "sSearch backward: ", /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1994 Search backward from point for STRING.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1995 Set point to the beginning of the occurrence found, and return point.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1996
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1997 Optional second argument LIMIT bounds the search; it is a buffer
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1998 position. The match found must not extend before that position.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1999 The value nil is equivalent to (point-min).
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2000
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2001 Optional third argument NOERROR, if t, means just return nil (no
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2002 error) if the search fails. If neither nil nor t, set point to LIMIT
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2003 and return nil.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2004
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2005 Optional fourth argument COUNT is a repeat count--search for
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2006 successive occurrences.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2007
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2008 Optional fifth argument BUFFER specifies the buffer to search in and
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2009 defaults to the current buffer.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2010
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2011 See also the functions `match-beginning', `match-end' and `replace-match'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2012 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2013 (string, limit, noerror, count, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2014 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2015 return search_command (string, limit, noerror, count, buffer, -1, 0, 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2016 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2017
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2018 DEFUN ("search-forward", Fsearch_forward, 1, 5, "sSearch: ", /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2019 Search forward from point for STRING.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2020 Set point to the end of the occurrence found, and return point.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2021
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2022 Optional second argument LIMIT bounds the search; it is a buffer
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2023 position. The match found must not extend after that position. The
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2024 value nil is equivalent to (point-max).
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2025
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2026 Optional third argument NOERROR, if t, means just return nil (no
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2027 error) if the search fails. If neither nil nor t, set point to LIMIT
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2028 and return nil.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2029
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2030 Optional fourth argument COUNT is a repeat count--search for
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2031 successive occurrences.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2032
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2033 Optional fifth argument BUFFER specifies the buffer to search in and
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2034 defaults to the current buffer.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2035
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2036 See also the functions `match-beginning', `match-end' and `replace-match'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2037 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2038 (string, limit, noerror, count, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2039 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2040 return search_command (string, limit, noerror, count, buffer, 1, 0, 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2041 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2042
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2043 DEFUN ("word-search-backward", Fword_search_backward, 1, 5,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2044 "sWord search backward: ", /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2045 Search backward from point for STRING, ignoring differences in punctuation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2046 Set point to the beginning of the occurrence found, and return point.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2047
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2048 Optional second argument LIMIT bounds the search; it is a buffer
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2049 position. The match found must not extend before that position.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2050 The value nil is equivalent to (point-min).
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2051
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2052 Optional third argument NOERROR, if t, means just return nil (no
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2053 error) if the search fails. If neither nil nor t, set point to LIMIT
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2054 and return nil.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2055
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2056 Optional fourth argument COUNT is a repeat count--search for
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2057 successive occurrences.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2058
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2059 Optional fifth argument BUFFER specifies the buffer to search in and
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2060 defaults to the current buffer.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2061
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2062 See also the functions `match-beginning', `match-end' and `replace-match'.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2063 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2064 (string, limit, noerror, count, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2065 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2066 return search_command (wordify (buffer, string), limit, noerror, count,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2067 buffer, -1, 1, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2068 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2069
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2070 DEFUN ("word-search-forward", Fword_search_forward, 1, 5, "sWord search: ", /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2071 Search forward from point for STRING, ignoring differences in punctuation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2072 Set point to the end of the occurrence found, and return point.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2073
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2074 Optional second argument LIMIT bounds the search; it is a buffer
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2075 position. The match found must not extend after that position. The
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2076 value nil is equivalent to (point-max).
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2077
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2078 Optional third argument NOERROR, if t, means just return nil (no
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2079 error) if the search fails. If neither nil nor t, set point to LIMIT
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2080 and return nil.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2081
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2082 Optional fourth argument COUNT is a repeat count--search for
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2083 successive occurrences.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2084
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2085 Optional fifth argument BUFFER specifies the buffer to search in and
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2086 defaults to the current buffer.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2087
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2088 See also the functions `match-beginning', `match-end' and `replace-match'.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2089 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2090 (string, limit, noerror, count, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2091 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2092 return search_command (wordify (buffer, string), limit, noerror, count,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2093 buffer, 1, 1, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2094 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2095
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2096 DEFUN ("re-search-backward", Fre_search_backward, 1, 5,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2097 "sRE search backward: ", /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2098 Search backward from point for match for regular expression REGEXP.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2099 Set point to the beginning of the match, and return point.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2100 The match found is the one starting last in the buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2101 and yet ending before the origin of the search.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2102
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2103 Optional second argument LIMIT bounds the search; it is a buffer
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2104 position. The match found must not extend before that position.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2105 The value nil is equivalent to (point-min).
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2106
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2107 Optional third argument NOERROR, if t, means just return nil (no
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2108 error) if the search fails. If neither nil nor t, set point to LIMIT
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2109 and return nil.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2110
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2111 Optional fourth argument COUNT is a repeat count--search for
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2112 successive occurrences.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2113
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2114 Optional fifth argument BUFFER specifies the buffer to search in and
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2115 defaults to the current buffer.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2116
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2117 See also the functions `match-beginning', `match-end' and `replace-match'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2118 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2119 (regexp, limit, noerror, count, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2120 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2121 return search_command (regexp, limit, noerror, count, buffer, -1, 1, 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2122 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2123
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2124 DEFUN ("re-search-forward", Fre_search_forward, 1, 5, "sRE search: ", /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2125 Search forward from point for regular expression REGEXP.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2126 Set point to the end of the occurrence found, and return point.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2127
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2128 Optional second argument LIMIT bounds the search; it is a buffer
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2129 position. The match found must not extend after that position. The
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2130 value nil is equivalent to (point-max).
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2131
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2132 Optional third argument NOERROR, if t, means just return nil (no
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2133 error) if the search fails. If neither nil nor t, set point to LIMIT
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2134 and return nil.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2135
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2136 Optional fourth argument COUNT is a repeat count--search for
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2137 successive occurrences.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2138
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2139 Optional fifth argument BUFFER specifies the buffer to search in and
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2140 defaults to the current buffer.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2141
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2142 See also the functions `match-beginning', `match-end' and `replace-match'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2143 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2144 (regexp, limit, noerror, count, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2145 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2146 return search_command (regexp, limit, noerror, count, buffer, 1, 1, 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2147 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2148
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2149 DEFUN ("posix-search-backward", Fposix_search_backward, 1, 5,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2150 "sPosix search backward: ", /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2151 Search backward from point for match for regular expression REGEXP.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2152 Find the longest match in accord with Posix regular expression rules.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2153 Set point to the beginning of the match, and return point.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2154 The match found is the one starting last in the buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2155 and yet ending before the origin of the search.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2156
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2157 Optional second argument LIMIT bounds the search; it is a buffer
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2158 position. The match found must not extend before that position.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2159 The value nil is equivalent to (point-min).
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2160
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2161 Optional third argument NOERROR, if t, means just return nil (no
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2162 error) if the search fails. If neither nil nor t, set point to LIMIT
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2163 and return nil.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2164
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2165 Optional fourth argument COUNT is a repeat count--search for
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2166 successive occurrences.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2167
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2168 Optional fifth argument BUFFER specifies the buffer to search in and
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2169 defaults to the current buffer.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2170
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2171 See also the functions `match-beginning', `match-end' and `replace-match'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2172 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2173 (regexp, limit, noerror, count, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2174 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2175 return search_command (regexp, limit, noerror, count, buffer, -1, 1, 1);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2176 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2177
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2178 DEFUN ("posix-search-forward", Fposix_search_forward, 1, 5, "sPosix search: ", /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2179 Search forward from point for regular expression REGEXP.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2180 Find the longest match in accord with Posix regular expression rules.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2181 Set point to the end of the occurrence found, and return point.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2182
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2183 Optional second argument LIMIT bounds the search; it is a buffer
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2184 position. The match found must not extend after that position. The
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2185 value nil is equivalent to (point-max).
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2186
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2187 Optional third argument NOERROR, if t, means just return nil (no
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2188 error) if the search fails. If neither nil nor t, set point to LIMIT
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2189 and return nil.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2190
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2191 Optional fourth argument COUNT is a repeat count--search for
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2192 successive occurrences.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2193
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2194 Optional fifth argument BUFFER specifies the buffer to search in and
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2195 defaults to the current buffer.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2196
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2197 See also the functions `match-beginning', `match-end' and `replace-match'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2198 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2199 (regexp, limit, noerror, count, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2200 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2201 return search_command (regexp, limit, noerror, count, buffer, 1, 1, 1);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2202 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2203
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2204
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2205 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2206 free_created_dynarrs (Lisp_Object cons)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2207 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2208 Dynarr_free (get_opaque_ptr (XCAR (cons)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2209 Dynarr_free (get_opaque_ptr (XCDR (cons)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2210 free_opaque_ptr (XCAR (cons));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2211 free_opaque_ptr (XCDR (cons));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2212 free_cons (XCONS (cons));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2213 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2214 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2215
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2216 DEFUN ("replace-match", Freplace_match, 1, 5, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2217 Replace text matched by last search with REPLACEMENT.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2218 If second arg FIXEDCASE is non-nil, do not alter case of replacement text.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2219 Otherwise maybe capitalize the whole text, or maybe just word initials,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2220 based on the replaced text.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2221 If the replaced text has only capital letters
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2222 and has at least one multiletter word, convert REPLACEMENT to all caps.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2223 If the replaced text has at least one word starting with a capital letter,
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2224 then capitalize each word in REPLACEMENT.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2225
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2226 If third arg LITERAL is non-nil, insert REPLACEMENT literally.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2227 Otherwise treat `\\' as special:
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2228 `\\&' in REPLACEMENT means substitute original matched text.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2229 `\\N' means substitute what matched the Nth `\\(...\\)'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2230 If Nth parens didn't match, substitute nothing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2231 `\\\\' means insert one `\\'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2232 `\\u' means upcase the next character.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2233 `\\l' means downcase the next character.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2234 `\\U' means begin upcasing all following characters.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2235 `\\L' means begin downcasing all following characters.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2236 `\\E' means terminate the effect of any `\\U' or `\\L'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2237 Case changes made with `\\u', `\\l', `\\U', and `\\L' override
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2238 all other case changes that may be made in the replaced text.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2239 FIXEDCASE and LITERAL are optional arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2240 Leaves point at end of replacement text.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2241
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2242 The optional fourth argument STRING can be a string to modify.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2243 In that case, this function creates and returns a new string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2244 which is made by replacing the part of STRING that was matched.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2245 When fourth argument is a string, fifth argument STRBUFFER specifies
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2246 the buffer to be used for syntax-table and case-table lookup and
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2247 defaults to the current buffer. When fourth argument is not a string,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2248 the buffer that the match occurred in has automatically been remembered
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2249 and you do not need to specify it.
469
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2250
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2251 When fourth argument is nil, STRBUFFER specifies a subexpression of
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2252 the match. It says to replace just that subexpression instead of the
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2253 whole match. This is useful only after a regular expression search or
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2254 match since only regular expressions have distinguished subexpressions.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2255 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2256 (replacement, fixedcase, literal, string, strbuffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2257 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2258 /* This function has been Mule-ized. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2259 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2260 enum { nochange, all_caps, cap_initial } case_action;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2261 Bufpos pos, last;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2262 int some_multiletter_word;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2263 int some_lowercase;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2264 int some_uppercase;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2265 int some_nonuppercase_initial;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2266 Emchar c, prevc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2267 Charcount inslen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2268 struct buffer *buf;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
2269 Lisp_Char_Table *syntax_table;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2270 int mc_count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2271 Lisp_Object buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2272 int_dynarr *ul_action_dynarr = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2273 int_dynarr *ul_pos_dynarr = 0;
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 469
diff changeset
2274 int sub = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2275 int speccount;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2276
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2277 CHECK_STRING (replacement);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2278
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2279 if (! NILP (string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2280 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2281 CHECK_STRING (string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2282 if (!EQ (last_thing_searched, Qt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2283 error ("last thing matched was not a string");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2284 /* If the match data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2285 were abstracted into a special "match data" type instead
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2286 of the typical half-assed "let the implementation be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2287 visible" form it's in, we could extend it to include
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2288 the last string matched and the buffer used for that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2289 matching. But of course we can't change it as it is. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2290 buf = decode_buffer (strbuffer, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2291 XSETBUFFER (buffer, buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2292 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2293 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2294 {
469
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2295 if (NILP (strbuffer))
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2296 sub = 0;
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2297 else
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2298 {
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2299 CHECK_INT (strbuffer);
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2300 sub = XINT (strbuffer);
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2301 if (sub < 0 || sub >= (int) search_regs.num_regs)
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2302 args_out_of_range (strbuffer, make_int (search_regs.num_regs));
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2303 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2304 if (!BUFFERP (last_thing_searched))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2305 error ("last thing matched was not a buffer");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2306 buffer = last_thing_searched;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2307 buf = XBUFFER (buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2308 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2309
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2310 syntax_table = XCHAR_TABLE (buf->mirror_syntax_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2311
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2312 case_action = nochange; /* We tried an initialization */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2313 /* but some C compilers blew it */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2314
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2315 if (search_regs.num_regs == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2316 error ("replace-match called before any match found");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2317
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2318 if (NILP (string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2319 {
469
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2320 if (search_regs.start[sub] < BUF_BEGV (buf)
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2321 || search_regs.start[sub] > search_regs.end[sub]
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2322 || search_regs.end[sub] > BUF_ZV (buf))
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2323 args_out_of_range (make_int (search_regs.start[sub]),
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2324 make_int (search_regs.end[sub]));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2325 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2326 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2327 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2328 if (search_regs.start[0] < 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2329 || search_regs.start[0] > search_regs.end[0]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2330 || search_regs.end[0] > XSTRING_CHAR_LENGTH (string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2331 args_out_of_range (make_int (search_regs.start[0]),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2332 make_int (search_regs.end[0]));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2333 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2334
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2335 if (NILP (fixedcase))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2336 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2337 /* Decide how to casify by examining the matched text. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2338
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2339 last = search_regs.end[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2340 prevc = '\n';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2341 case_action = all_caps;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2342
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2343 /* some_multiletter_word is set nonzero if any original word
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2344 is more than one letter long. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2345 some_multiletter_word = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2346 some_lowercase = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2347 some_nonuppercase_initial = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2348 some_uppercase = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2349
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2350 for (pos = search_regs.start[0]; pos < last; pos++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2351 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2352 if (NILP (string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2353 c = BUF_FETCH_CHAR (buf, pos);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2354 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2355 c = string_char (XSTRING (string), pos);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2356
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2357 if (LOWERCASEP (buf, c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2358 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2359 /* Cannot be all caps if any original char is lower case */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2360
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2361 some_lowercase = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2362 if (!WORD_SYNTAX_P (syntax_table, prevc))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2363 some_nonuppercase_initial = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2364 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2365 some_multiletter_word = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2366 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2367 else if (!NOCASEP (buf, c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2368 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2369 some_uppercase = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2370 if (!WORD_SYNTAX_P (syntax_table, prevc))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2371 ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2372 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2373 some_multiletter_word = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2374 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2375 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2376 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2377 /* If the initial is a caseless word constituent,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2378 treat that like a lowercase initial. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2379 if (!WORD_SYNTAX_P (syntax_table, prevc))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2380 some_nonuppercase_initial = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2381 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2382
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2383 prevc = c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2384 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2385
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2386 /* Convert to all caps if the old text is all caps
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2387 and has at least one multiletter word. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2388 if (! some_lowercase && some_multiletter_word)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2389 case_action = all_caps;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2390 /* Capitalize each word, if the old text has all capitalized words. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2391 else if (!some_nonuppercase_initial && some_multiletter_word)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2392 case_action = cap_initial;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2393 else if (!some_nonuppercase_initial && some_uppercase)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2394 /* Should x -> yz, operating on X, give Yz or YZ?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2395 We'll assume the latter. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2396 case_action = all_caps;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2397 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2398 case_action = nochange;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2399 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2400
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2401 /* Do replacement in a string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2402 if (!NILP (string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2403 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2404 Lisp_Object before, after;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2405
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2406 speccount = specpdl_depth ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2407 before = Fsubstring (string, Qzero, make_int (search_regs.start[0]));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2408 after = Fsubstring (string, make_int (search_regs.end[0]), Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2409
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2410 /* Do case substitution into REPLACEMENT if desired. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2411 if (NILP (literal))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2412 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2413 Charcount stlen = XSTRING_CHAR_LENGTH (replacement);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2414 Charcount strpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2415 /* XEmacs change: rewrote this loop somewhat to make it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2416 cleaner. Also added \U, \E, etc. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2417 Charcount literal_start = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2418 /* We build up the substituted string in ACCUM. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2419 Lisp_Object accum;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2420
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2421 accum = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2422
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2423 /* OK, the basic idea here is that we scan through the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2424 replacement string until we find a backslash, which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2425 represents a substring of the original string to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2426 substituted. We then append onto ACCUM the literal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2427 text before the backslash (LASTPOS marks the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2428 beginning of this) followed by the substring of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2429 original string that needs to be inserted. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2430 for (strpos = 0; strpos < stlen; strpos++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2431 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2432 /* If LITERAL_END is set, we've encountered a backslash
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2433 (the end of literal text to be inserted). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2434 Charcount literal_end = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2435 /* If SUBSTART is set, we need to also insert the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2436 text from SUBSTART to SUBEND in the original string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2437 Charcount substart = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2438 Charcount subend = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2439
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2440 c = string_char (XSTRING (replacement), strpos);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2441 if (c == '\\' && strpos < stlen - 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2442 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2443 c = string_char (XSTRING (replacement), ++strpos);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2444 if (c == '&')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2445 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2446 literal_end = strpos - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2447 substart = search_regs.start[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2448 subend = search_regs.end[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2449 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2450 else if (c >= '1' && c <= '9' &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2451 c <= search_regs.num_regs + '0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2452 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2453 if (search_regs.start[c - '0'] >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2454 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2455 literal_end = strpos - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2456 substart = search_regs.start[c - '0'];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2457 subend = search_regs.end[c - '0'];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2458 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2459 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2460 else if (c == 'U' || c == 'u' || c == 'L' || c == 'l' ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2461 c == 'E')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2462 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2463 /* Keep track of all case changes requested, but don't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2464 make them now. Do them later so we override
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2465 everything else. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2466 if (!ul_pos_dynarr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2467 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2468 ul_pos_dynarr = Dynarr_new (int);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2469 ul_action_dynarr = Dynarr_new (int);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2470 record_unwind_protect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2471 (free_created_dynarrs,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2472 noseeum_cons
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2473 (make_opaque_ptr (ul_pos_dynarr),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2474 make_opaque_ptr (ul_action_dynarr)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2475 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2476 literal_end = strpos - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2477 Dynarr_add (ul_pos_dynarr,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2478 (!NILP (accum)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2479 ? XSTRING_CHAR_LENGTH (accum)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2480 : 0) + (literal_end - literal_start));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2481 Dynarr_add (ul_action_dynarr, c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2482 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2483 else if (c == '\\')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2484 /* So we get just one backslash. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2485 literal_end = strpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2486 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2487 if (literal_end >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2488 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2489 Lisp_Object literal_text = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2490 Lisp_Object substring = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2491 if (literal_end != literal_start)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2492 literal_text = Fsubstring (replacement,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2493 make_int (literal_start),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2494 make_int (literal_end));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2495 if (substart >= 0 && subend != substart)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2496 substring = Fsubstring (string,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2497 make_int (substart),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2498 make_int (subend));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2499 if (!NILP (literal_text) || !NILP (substring))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2500 accum = concat3 (accum, literal_text, substring);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2501 literal_start = strpos + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2502 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2503 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2504
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2505 if (strpos != literal_start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2506 /* some literal text at end to be inserted */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2507 replacement = concat2 (accum, Fsubstring (replacement,
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2508 make_int (literal_start),
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2509 make_int (strpos)));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2510 else
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2511 replacement = accum;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2512 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2513
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2514 /* replacement can be nil. */
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2515 if (NILP (replacement))
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2516 replacement = build_string ("");
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2517
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2518 if (case_action == all_caps)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2519 replacement = Fupcase (replacement, buffer);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2520 else if (case_action == cap_initial)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2521 replacement = Fupcase_initials (replacement, buffer);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2522
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2523 /* Now finally, we need to process the \U's, \E's, etc. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2524 if (ul_pos_dynarr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2525 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2526 int i = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2527 int cur_action = 'E';
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2528 Charcount stlen = XSTRING_CHAR_LENGTH (replacement);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2529 Charcount strpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2530
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2531 for (strpos = 0; strpos < stlen; strpos++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2532 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2533 Emchar curchar = string_char (XSTRING (replacement), strpos);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2534 Emchar newchar = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2535 if (i < Dynarr_length (ul_pos_dynarr) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2536 strpos == Dynarr_at (ul_pos_dynarr, i))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2537 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2538 int new_action = Dynarr_at (ul_action_dynarr, i);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2539 i++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2540 if (new_action == 'u')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2541 newchar = UPCASE (buf, curchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2542 else if (new_action == 'l')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2543 newchar = DOWNCASE (buf, curchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2544 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2545 cur_action = new_action;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2546 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2547 if (newchar == -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2548 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2549 if (cur_action == 'U')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2550 newchar = UPCASE (buf, curchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2551 else if (cur_action == 'L')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2552 newchar = DOWNCASE (buf, curchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2553 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2554 newchar = curchar;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2555 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2556 if (newchar != curchar)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2557 set_string_char (XSTRING (replacement), strpos, newchar);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2558 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2559 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2560
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2561 /* frees the Dynarrs if necessary. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2562 unbind_to (speccount, Qnil);
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2563 return concat3 (before, replacement, after);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2564 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2565
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2566 mc_count = begin_multiple_change (buf, search_regs.start[0],
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2567 search_regs.end[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2568
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2569 /* begin_multiple_change() records an unwind-protect, so we need to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2570 record this value now. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2571 speccount = specpdl_depth ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2572
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2573 /* We insert the replacement text before the old text, and then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2574 delete the original text. This means that markers at the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2575 beginning or end of the original will float to the corresponding
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2576 position in the replacement. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2577 BUF_SET_PT (buf, search_regs.start[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2578 if (!NILP (literal))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2579 Finsert (1, &replacement);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2580 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2581 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2582 Charcount stlen = XSTRING_CHAR_LENGTH (replacement);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2583 Charcount strpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2584 struct gcpro gcpro1;
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2585 GCPRO1 (replacement);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2586 for (strpos = 0; strpos < stlen; strpos++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2587 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2588 Charcount offset = BUF_PT (buf) - search_regs.start[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2589
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2590 c = string_char (XSTRING (replacement), strpos);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2591 if (c == '\\' && strpos < stlen - 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2592 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2593 c = string_char (XSTRING (replacement), ++strpos);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2594 if (c == '&')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2595 Finsert_buffer_substring
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2596 (buffer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2597 make_int (search_regs.start[0] + offset),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2598 make_int (search_regs.end[0] + offset));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2599 else if (c >= '1' && c <= '9' &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2600 c <= search_regs.num_regs + '0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2601 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2602 if (search_regs.start[c - '0'] >= 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2603 Finsert_buffer_substring
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2604 (buffer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2605 make_int (search_regs.start[c - '0'] + offset),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2606 make_int (search_regs.end[c - '0'] + offset));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2607 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2608 else if (c == 'U' || c == 'u' || c == 'L' || c == 'l' ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2609 c == 'E')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2610 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2611 /* Keep track of all case changes requested, but don't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2612 make them now. Do them later so we override
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2613 everything else. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2614 if (!ul_pos_dynarr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2615 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2616 ul_pos_dynarr = Dynarr_new (int);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2617 ul_action_dynarr = Dynarr_new (int);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2618 record_unwind_protect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2619 (free_created_dynarrs,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2620 Fcons (make_opaque_ptr (ul_pos_dynarr),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2621 make_opaque_ptr (ul_action_dynarr)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2622 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2623 Dynarr_add (ul_pos_dynarr, BUF_PT (buf));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2624 Dynarr_add (ul_action_dynarr, c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2625 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2626 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2627 buffer_insert_emacs_char (buf, c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2628 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2629 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2630 buffer_insert_emacs_char (buf, c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2631 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2632 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2633 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2634
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2635 inslen = BUF_PT (buf) - (search_regs.start[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2636 buffer_delete_range (buf, search_regs.start[0] + inslen, search_regs.end[0] +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2637 inslen, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2638
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2639 if (case_action == all_caps)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2640 Fupcase_region (make_int (BUF_PT (buf) - inslen),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2641 make_int (BUF_PT (buf)), buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2642 else if (case_action == cap_initial)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2643 Fupcase_initials_region (make_int (BUF_PT (buf) - inslen),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2644 make_int (BUF_PT (buf)), buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2645
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2646 /* Now go through and make all the case changes that were requested
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2647 in the replacement string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2648 if (ul_pos_dynarr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2649 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2650 Bufpos eend = BUF_PT (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2651 int i = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2652 int cur_action = 'E';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2653
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2654 for (pos = BUF_PT (buf) - inslen; pos < eend; pos++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2655 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2656 Emchar curchar = BUF_FETCH_CHAR (buf, pos);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2657 Emchar newchar = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2658 if (i < Dynarr_length (ul_pos_dynarr) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2659 pos == Dynarr_at (ul_pos_dynarr, i))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2660 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2661 int new_action = Dynarr_at (ul_action_dynarr, i);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2662 i++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2663 if (new_action == 'u')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2664 newchar = UPCASE (buf, curchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2665 else if (new_action == 'l')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2666 newchar = DOWNCASE (buf, curchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2667 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2668 cur_action = new_action;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2669 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2670 if (newchar == -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2671 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2672 if (cur_action == 'U')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2673 newchar = UPCASE (buf, curchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2674 else if (cur_action == 'L')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2675 newchar = DOWNCASE (buf, curchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2676 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2677 newchar = curchar;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2678 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2679 if (newchar != curchar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2680 buffer_replace_char (buf, pos, newchar, 0, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2681 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2682 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2683
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2684 /* frees the Dynarrs if necessary. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2685 unbind_to (speccount, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2686 end_multiple_change (buf, mc_count);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2687
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2688 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2689 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2690
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2691 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2692 match_limit (Lisp_Object num, int beginningp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2693 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2694 /* This function has been Mule-ized. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2695 int n;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2696
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2697 CHECK_INT (num);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2698 n = XINT (num);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2699 if (n < 0 || n >= search_regs.num_regs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2700 args_out_of_range (num, make_int (search_regs.num_regs));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2701 if (search_regs.num_regs == 0 ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2702 search_regs.start[n] < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2703 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2704 return make_int (beginningp ? search_regs.start[n] : search_regs.end[n]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2705 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2706
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2707 DEFUN ("match-beginning", Fmatch_beginning, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2708 Return position of start of text matched by last regexp search.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2709 NUM, specifies which parenthesized expression in the last regexp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2710 Value is nil if NUMth pair didn't match, or there were less than NUM pairs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2711 Zero means the entire text matched by the whole regexp or whole string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2712 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2713 (num))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2714 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2715 return match_limit (num, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2716 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2717
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2718 DEFUN ("match-end", Fmatch_end, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2719 Return position of end of text matched by last regexp search.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2720 NUM specifies which parenthesized expression in the last regexp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2721 Value is nil if NUMth pair didn't match, or there were less than NUM pairs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2722 Zero means the entire text matched by the whole regexp or whole string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2723 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2724 (num))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2725 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2726 return match_limit (num, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2727 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2728
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2729 DEFUN ("match-data", Fmatch_data, 0, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2730 Return a list containing all info on what the last regexp search matched.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2731 Element 2N is `(match-beginning N)'; element 2N + 1 is `(match-end N)'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2732 All the elements are markers or nil (nil if the Nth pair didn't match)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2733 if the last match was on a buffer; integers or nil if a string was matched.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2734 Use `store-match-data' to reinstate the data in this list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2735
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2736 If INTEGERS (the optional first argument) is non-nil, always use integers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2737 \(rather than markers) to represent buffer positions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2738 If REUSE is a list, reuse it as part of the value. If REUSE is long enough
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2739 to hold all the values, and if INTEGERS is non-nil, no consing is done.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2740 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2741 (integers, reuse))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2742 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2743 /* This function has been Mule-ized. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2744 Lisp_Object tail, prev;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2745 Lisp_Object *data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2746 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2747 Charcount len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2748
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2749 if (NILP (last_thing_searched))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2750 /*error ("match-data called before any match found");*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2751 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2752
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2753 data = alloca_array (Lisp_Object, 2 * search_regs.num_regs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2754
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2755 len = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2756 for (i = 0; i < search_regs.num_regs; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2757 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2758 Bufpos start = search_regs.start[i];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2759 if (start >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2760 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2761 if (EQ (last_thing_searched, Qt)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2762 || !NILP (integers))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2763 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2764 data[2 * i] = make_int (start);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2765 data[2 * i + 1] = make_int (search_regs.end[i]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2766 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2767 else if (BUFFERP (last_thing_searched))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2768 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2769 data[2 * i] = Fmake_marker ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2770 Fset_marker (data[2 * i],
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2771 make_int (start),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2772 last_thing_searched);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2773 data[2 * i + 1] = Fmake_marker ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2774 Fset_marker (data[2 * i + 1],
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2775 make_int (search_regs.end[i]),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2776 last_thing_searched);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2777 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2778 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2779 /* last_thing_searched must always be Qt, a buffer, or Qnil. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2780 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2781
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2782 len = i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2783 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2784 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2785 data[2 * i] = data [2 * i + 1] = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2786 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2787 if (!CONSP (reuse))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2788 return Flist (2 * len + 2, data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2789
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2790 /* If REUSE is a list, store as many value elements as will fit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2791 into the elements of REUSE. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2792 for (prev = Qnil, i = 0, tail = reuse; CONSP (tail); i++, tail = XCDR (tail))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2793 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2794 if (i < 2 * len + 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2795 XCAR (tail) = data[i];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2796 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2797 XCAR (tail) = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2798 prev = tail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2799 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2800
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2801 /* If we couldn't fit all value elements into REUSE,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2802 cons up the rest of them and add them to the end of REUSE. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2803 if (i < 2 * len + 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2804 XCDR (prev) = Flist (2 * len + 2 - i, data + i);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2805
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2806 return reuse;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2807 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2808
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2809
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2810 DEFUN ("store-match-data", Fstore_match_data, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2811 Set internal data on last search match from elements of LIST.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2812 LIST should have been created by calling `match-data' previously.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2813 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2814 (list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2815 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2816 /* This function has been Mule-ized. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2817 REGISTER int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2818 REGISTER Lisp_Object marker;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2819 int num_regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2820 int length;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2821
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2822 if (running_asynch_code)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2823 save_search_regs ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2824
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2825 CONCHECK_LIST (list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2826
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2827 /* Unless we find a marker with a buffer in LIST, assume that this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2828 match data came from a string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2829 last_thing_searched = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2830
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2831 /* Allocate registers if they don't already exist. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2832 length = XINT (Flength (list)) / 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2833 num_regs = search_regs.num_regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2834
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2835 if (length > num_regs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2836 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2837 if (search_regs.num_regs == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2838 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2839 search_regs.start = xnew_array (regoff_t, length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2840 search_regs.end = xnew_array (regoff_t, length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2841 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2842 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2843 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2844 XREALLOC_ARRAY (search_regs.start, regoff_t, length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2845 XREALLOC_ARRAY (search_regs.end, regoff_t, length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2846 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2847
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2848 search_regs.num_regs = length;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2849 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2850
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2851 for (i = 0; i < num_regs; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2852 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2853 marker = Fcar (list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2854 if (NILP (marker))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2855 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2856 search_regs.start[i] = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2857 list = Fcdr (list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2858 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2859 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2860 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2861 if (MARKERP (marker))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2862 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2863 if (XMARKER (marker)->buffer == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2864 marker = Qzero;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2865 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2866 XSETBUFFER (last_thing_searched, XMARKER (marker)->buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2867 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2868
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2869 CHECK_INT_COERCE_MARKER (marker);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2870 search_regs.start[i] = XINT (marker);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2871 list = Fcdr (list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2872
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2873 marker = Fcar (list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2874 if (MARKERP (marker) && XMARKER (marker)->buffer == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2875 marker = Qzero;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2876
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2877 CHECK_INT_COERCE_MARKER (marker);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2878 search_regs.end[i] = XINT (marker);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2879 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2880 list = Fcdr (list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2881 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2882
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2883 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2884 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2885
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2886 /* If non-zero the match data have been saved in saved_search_regs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2887 during the execution of a sentinel or filter. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2888 static int search_regs_saved;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2889 static struct re_registers saved_search_regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2890
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2891 /* Called from Flooking_at, Fstring_match, search_buffer, Fstore_match_data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2892 if asynchronous code (filter or sentinel) is running. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2893 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2894 save_search_regs (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2895 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2896 if (!search_regs_saved)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2897 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2898 saved_search_regs.num_regs = search_regs.num_regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2899 saved_search_regs.start = search_regs.start;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2900 saved_search_regs.end = search_regs.end;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2901 search_regs.num_regs = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2902 search_regs.start = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2903 search_regs.end = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2904
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2905 search_regs_saved = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2906 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2907 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2908
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2909 /* Called upon exit from filters and sentinels. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2910 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2911 restore_match_data (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2912 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2913 if (search_regs_saved)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2914 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2915 if (search_regs.num_regs > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2916 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2917 xfree (search_regs.start);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2918 xfree (search_regs.end);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2919 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2920 search_regs.num_regs = saved_search_regs.num_regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2921 search_regs.start = saved_search_regs.start;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2922 search_regs.end = saved_search_regs.end;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2923
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2924 search_regs_saved = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2925 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2926 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2927
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2928 /* Quote a string to inactivate reg-expr chars */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2929
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2930 DEFUN ("regexp-quote", Fregexp_quote, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2931 Return a regexp string which matches exactly STRING and nothing else.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2932 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2933 (string))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2934 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2935 REGISTER Bufbyte *in, *out, *end;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2936 REGISTER Bufbyte *temp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2937
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2938 CHECK_STRING (string);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2939
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2940 temp = (Bufbyte *) alloca (XSTRING_LENGTH (string) * 2);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2941
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2942 /* Now copy the data into the new string, inserting escapes. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2943
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2944 in = XSTRING_DATA (string);
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2945 end = in + XSTRING_LENGTH (string);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2946 out = temp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2947
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2948 while (in < end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2949 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2950 Emchar c = charptr_emchar (in);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2951
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2952 if (c == '[' || c == ']'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2953 || c == '*' || c == '.' || c == '\\'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2954 || c == '?' || c == '+'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2955 || c == '^' || c == '$')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2956 *out++ = '\\';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2957 out += set_charptr_emchar (out, c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2958 INC_CHARPTR (in);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2959 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2960
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2961 return make_string (temp, out - temp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2962 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2963
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2964 DEFUN ("set-word-regexp", Fset_word_regexp, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2965 Set the regexp to be used to match a word in regular-expression searching.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2966 #### Not yet implemented. Currently does nothing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2967 #### Do not use this yet. Its calling interface is likely to change.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2968 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2969 (regexp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2970 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2971 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2972 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2973
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2974
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2975 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2976 /* initialization */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2977 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2978
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2979 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2980 syms_of_search (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2981 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2982
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2983 DEFERROR_STANDARD (Qsearch_failed, Qinvalid_operation);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2984 DEFERROR_STANDARD (Qinvalid_regexp, Qsyntax_error);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2985
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2986 DEFSUBR (Flooking_at);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2987 DEFSUBR (Fposix_looking_at);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2988 DEFSUBR (Fstring_match);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2989 DEFSUBR (Fposix_string_match);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2990 DEFSUBR (Fskip_chars_forward);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2991 DEFSUBR (Fskip_chars_backward);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2992 DEFSUBR (Fskip_syntax_forward);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2993 DEFSUBR (Fskip_syntax_backward);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2994 DEFSUBR (Fsearch_forward);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2995 DEFSUBR (Fsearch_backward);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2996 DEFSUBR (Fword_search_forward);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2997 DEFSUBR (Fword_search_backward);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2998 DEFSUBR (Fre_search_forward);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2999 DEFSUBR (Fre_search_backward);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3000 DEFSUBR (Fposix_search_forward);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3001 DEFSUBR (Fposix_search_backward);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3002 DEFSUBR (Freplace_match);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3003 DEFSUBR (Fmatch_beginning);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3004 DEFSUBR (Fmatch_end);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3005 DEFSUBR (Fmatch_data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3006 DEFSUBR (Fstore_match_data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3007 DEFSUBR (Fregexp_quote);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3008 DEFSUBR (Fset_word_regexp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3009 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3010
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3011 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3012 reinit_vars_of_search (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3013 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3014 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3015
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3016 last_thing_searched = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3017 staticpro_nodump (&last_thing_searched);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3018
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3019 for (i = 0; i < REGEXP_CACHE_SIZE; ++i)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3020 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3021 searchbufs[i].buf.allocated = 100;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3022 searchbufs[i].buf.buffer = (unsigned char *) xmalloc (100);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3023 searchbufs[i].buf.fastmap = searchbufs[i].fastmap;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3024 searchbufs[i].regexp = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3025 staticpro_nodump (&searchbufs[i].regexp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3026 searchbufs[i].next = (i == REGEXP_CACHE_SIZE-1 ? 0 : &searchbufs[i+1]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3027 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3028 searchbuf_head = &searchbufs[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3029 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3030
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3031 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3032 vars_of_search (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3033 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3034 reinit_vars_of_search ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3035
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3036 DEFVAR_LISP ("forward-word-regexp", &Vforward_word_regexp /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3037 *Regular expression to be used in `forward-word'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3038 #### Not yet implemented.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3039 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3040 Vforward_word_regexp = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3041
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3042 DEFVAR_LISP ("backward-word-regexp", &Vbackward_word_regexp /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3043 *Regular expression to be used in `backward-word'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3044 #### Not yet implemented.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3045 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3046 Vbackward_word_regexp = Qnil;
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 469
diff changeset
3047
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 469
diff changeset
3048 DEFVAR_INT ("warn-about-possibly-incompatible-back-references",
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 469
diff changeset
3049 &warn_about_possibly_incompatible_back_references /*
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 469
diff changeset
3050 If true, issue warnings when new-semantics back references occur.
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 469
diff changeset
3051 This is to catch places where old code might inadvertently have changed
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 469
diff changeset
3052 semantics. This will occur in old code only where more than nine groups
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 469
diff changeset
3053 occur and a back reference to one of them is directly followed by a digit.
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 469
diff changeset
3054 */ );
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 469
diff changeset
3055 warn_about_possibly_incompatible_back_references = 1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3056 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3057
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3058 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3059 complex_vars_of_search (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3060 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3061 Vskip_chars_range_table = Fmake_range_table ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3062 staticpro (&Vskip_chars_range_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3063 }