annotate src/casefiddle.c @ 4901:7504864a986c

Don't use Boyer-Moore if repeated octets & case-insensitive search. 2010-01-30 Aidan Kehoe <kehoea@parhasard.net> * search.c (search_buffer): Don't use Boyer-Moore for case-insensitive search if the search pattern contains repeated Ibytes and the corresponding character has case information (or, equivalently, if one of its case equivalents would contain repeated Ibytes).
author Aidan Kehoe <kehoea@parhasard.net>
date Sat, 30 Jan 2010 22:25:39 +0000
parents ecf1ebac70d8
children 6bc1f3f6cf0d
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 /* XEmacs case conversion functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1985, 1992, 1993, 1994, 1997, 1998 Free Software Foundation, Inc.
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 771
diff changeset
3 Copyright (C) 2002 Ben Wing.
428
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.34, but substantially rewritten by Martin. */
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 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 #include "lisp.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 #include "buffer.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 #include "insdel.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 #include "syntax.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 enum case_action {CASE_UP, CASE_DOWN, CASE_CAPITALIZE, CASE_CAPITALIZE_UP};
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 static Lisp_Object
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
34 casify_object (enum case_action flag, Lisp_Object string_or_char,
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
35 Lisp_Object buffer)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 struct buffer *buf = decode_buffer (buffer, 0);
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 retry:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
41 if (CHAR_OR_CHAR_INTP (string_or_char))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 {
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 826
diff changeset
43 Ichar c;
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
44 CHECK_CHAR_COERCE_INT (string_or_char);
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
45 c = XCHAR (string_or_char);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 c = (flag == CASE_DOWN) ? DOWNCASE (buf, c) : UPCASE (buf, c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 return make_char (c);
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
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
50 if (STRINGP (string_or_char))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 {
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 771
diff changeset
52 Lisp_Object syntax_table = buf->mirror_syntax_table;
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 826
diff changeset
53 Ibyte *storage =
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 867
diff changeset
54 alloca_ibytes (XSTRING_LENGTH (string_or_char) * MAX_ICHAR_LEN);
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 826
diff changeset
55 Ibyte *newp = storage;
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 826
diff changeset
56 Ibyte *oldp = XSTRING_DATA (string_or_char);
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 826
diff changeset
57 Ibyte *endp = oldp + XSTRING_LENGTH (string_or_char);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 int wordp = 0, wordp_prev;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
60 while (oldp < endp)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 {
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 826
diff changeset
62 Ichar c = itext_ichar (oldp);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 switch (flag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 case CASE_UP:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 c = UPCASE (buf, c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 case CASE_DOWN:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 c = DOWNCASE (buf, c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 case CASE_CAPITALIZE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 case CASE_CAPITALIZE_UP:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 wordp_prev = wordp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 wordp = WORD_SYNTAX_P (syntax_table, c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 if (!wordp) break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 if (wordp_prev)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 if (flag == CASE_CAPITALIZE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 c = DOWNCASE (buf, c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 c = UPCASE (buf, c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 826
diff changeset
86 newp += set_itext_ichar (newp, c);
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 826
diff changeset
87 INC_IBYTEPTR (oldp);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 return make_string (storage, newp - storage);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
93 string_or_char = wrong_type_argument (Qchar_or_string_p, string_or_char);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 goto retry;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 DEFUN ("upcase", Fupcase, 1, 2, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
98 Convert STRING-OR-CHAR to upper case and return that.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
99 STRING-OR-CHAR may be a character or string. The result has the same type.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
100 STRING-OR-CHAR is not altered--the value is a copy.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 See also `capitalize', `downcase' and `upcase-initials'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 Optional second arg BUFFER specifies which buffer's case tables to use,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 and defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
105 (string_or_char, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
107 return casify_object (CASE_UP, string_or_char, buffer);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 DEFUN ("downcase", Fdowncase, 1, 2, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
111 Convert STRING-OR-CHAR to lower case and return that.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
112 STRING-OR-CHAR may be a character or string. The result has the same type.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
113 STRING-OR-CHAR is not altered--the value is a copy.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 Optional second arg BUFFER specifies which buffer's case tables to use,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 and defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
117 (string_or_char, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
119 return casify_object (CASE_DOWN, string_or_char, buffer);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 DEFUN ("capitalize", Fcapitalize, 1, 2, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
123 Convert STRING-OR-CHAR to capitalized form and return that.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 This means that each word's first character is upper case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 and the rest is lower case.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
126 STRING-OR-CHAR may be a character or string. The result has the same type.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
127 STRING-OR-CHAR is not altered--the value is a copy.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 Optional second arg BUFFER specifies which buffer's case tables to use,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 and defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
131 (string_or_char, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
133 return casify_object (CASE_CAPITALIZE, string_or_char, buffer);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 /* Like Fcapitalize but change only the initial characters. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 DEFUN ("upcase-initials", Fupcase_initials, 1, 2, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
139 Convert the initial of each word in STRING-OR-CHAR to upper case.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 Do not change the other letters of each word.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
141 STRING-OR-CHAR may be a character or string. The result has the same type.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
142 STRING-OR-CHAR is not altered--the value is a copy.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 Optional second arg BUFFER specifies which buffer's case tables to use,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 and defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
146 (string_or_char, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
148 return casify_object (CASE_CAPITALIZE_UP, string_or_char, buffer);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 }
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 /* flag is CASE_UP, CASE_DOWN or CASE_CAPITALIZE or CASE_CAPITALIZE_UP.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
152 START and END specify range of buffer to operate on. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 static void
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
155 casify_region_internal (enum case_action flag, Lisp_Object start,
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
156 Lisp_Object end, struct buffer *buf)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 /* This function can GC */
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 444
diff changeset
159 Charbpos pos, s, e;
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 771
diff changeset
160 Lisp_Object syntax_table = buf->mirror_syntax_table;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 int mccount;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 int wordp = 0, wordp_prev;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
164 if (EQ (start, end))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 /* Not modifying because nothing marked */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
168 get_buffer_range_char (buf, start, end, &s, &e, 0);
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
169
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
170 mccount = begin_multiple_change (buf, s, e);
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
171 record_change (buf, s, e - s);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
173 for (pos = s; pos < e; pos++)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 {
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 826
diff changeset
175 Ichar oldc = BUF_FETCH_CHAR (buf, pos);
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 826
diff changeset
176 Ichar c = oldc;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 switch (flag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 case CASE_UP:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 c = UPCASE (buf, oldc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 case CASE_DOWN:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 c = DOWNCASE (buf, oldc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 case CASE_CAPITALIZE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 case CASE_CAPITALIZE_UP:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 /* !!#### need to revalidate the start and end pointers in case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 the buffer was changed */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 wordp_prev = wordp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 wordp = WORD_SYNTAX_P (syntax_table, c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 if (!wordp) continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 if (wordp_prev)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 if (flag == CASE_CAPITALIZE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 c = DOWNCASE (buf, c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 c = UPCASE (buf, c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 if (oldc == c) continue;
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
204 buffer_replace_char (buf, pos, c, 1, (pos == s));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 BUF_MODIFF (buf)++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 end_multiple_change (buf, mccount);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 static Lisp_Object
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
212 casify_region (enum case_action flag, Lisp_Object start, Lisp_Object end,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 Lisp_Object buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
215 casify_region_internal (flag, start, end, decode_buffer (buffer, 1));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 return Qnil;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 DEFUN ("upcase-region", Fupcase_region, 2, 3, "r", /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 Convert the region to upper case. In programs, wants two arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 These arguments specify the starting and ending character numbers of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 the region to operate on. When used as a command, the text between
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 point and the mark is operated on.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 See also `capitalize-region'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 Optional third arg BUFFER defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
227 (start, end, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 /* This function can GC */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
230 return casify_region (CASE_UP, start, end, buffer);
428
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 DEFUN ("downcase-region", Fdowncase_region, 2, 3, "r", /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 Convert the region to lower case. In programs, wants two arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 These arguments specify the starting and ending character numbers of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 the region to operate on. When used as a command, the text between
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 point and the mark is operated on.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 Optional third arg BUFFER defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
240 (start, end, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 /* This function can GC */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
243 return casify_region (CASE_DOWN, start, end, buffer);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 DEFUN ("capitalize-region", Fcapitalize_region, 2, 3, "r", /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 Convert the region to capitalized form.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 Capitalized form means each word's first character is upper case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 and the rest of it is lower case.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 In programs, give two arguments, the starting and ending
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 character positions to operate on.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 Optional third arg BUFFER defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
254 (start, end, buffer))
428
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 /* This function can GC */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
257 return casify_region (CASE_CAPITALIZE, start, end, buffer);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 }
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 /* Like Fcapitalize_region but change only the initials. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 DEFUN ("upcase-initials-region", Fupcase_initials_region, 2, 3, "r", /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 Upcase the initial of each word in the region.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 Subsequent letters of each word are not changed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 In programs, give two arguments, the starting and ending
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 character positions to operate on.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 Optional third arg BUFFER defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
269 (start, end, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
271 return casify_region (CASE_CAPITALIZE_UP, start, end, buffer);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 }
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 casify_word (enum case_action flag, Lisp_Object arg, Lisp_Object buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 444
diff changeset
278 Charbpos farend;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 struct buffer *buf = decode_buffer (buffer, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 CHECK_INT (arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 farend = scan_words (buf, BUF_PT (buf), XINT (arg));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 if (!farend)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 farend = XINT (arg) > 0 ? BUF_ZV (buf) : BUF_BEGV (buf);
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 casify_region_internal (flag, make_int (BUF_PT (buf)), make_int (farend), buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 BUF_SET_PT (buf, max (BUF_PT (buf), farend));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 return Qnil;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 DEFUN ("upcase-word", Fupcase_word, 1, 2, "p", /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
293 Convert following word (or COUNT words) to upper case, moving over.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 With negative argument, convert previous words but do not move.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 See also `capitalize-word'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 Optional second arg BUFFER defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
298 (count, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 /* This function can GC */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
301 return casify_word (CASE_UP, count, buffer);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 DEFUN ("downcase-word", Fdowncase_word, 1, 2, "p", /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
305 Convert following word (or COUNT words) to lower case, moving over.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 With negative argument, convert previous words but do not move.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 Optional second arg BUFFER defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
309 (count, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 /* This function can GC */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
312 return casify_word (CASE_DOWN, count, buffer);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 DEFUN ("capitalize-word", Fcapitalize_word, 1, 2, "p", /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
316 Capitalize the following word (or COUNT words), moving over.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 This gives the word(s) a first character in upper case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 and the rest lower case.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 With negative argument, capitalize previous words but do not move.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 Optional second arg BUFFER defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
322 (count, buffer))
428
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 /* This function can GC */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
325 return casify_word (CASE_CAPITALIZE, count, buffer);
428
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 syms_of_casefiddle (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 DEFSUBR (Fupcase);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 DEFSUBR (Fdowncase);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 DEFSUBR (Fcapitalize);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 DEFSUBR (Fupcase_initials);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 DEFSUBR (Fupcase_region);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 DEFSUBR (Fdowncase_region);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 DEFSUBR (Fcapitalize_region);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 DEFSUBR (Fupcase_initials_region);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 DEFSUBR (Fupcase_word);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 DEFSUBR (Fdowncase_word);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 DEFSUBR (Fcapitalize_word);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 }