Mercurial > emacs
annotate src/casefiddle.c @ 20543:4dbda4b7c66f
(casify_region): Scan in bytes and chars.
(casify_object, casify_region): Declare str, workbuf as unsigned char.
| author | Richard M. Stallman <rms@gnu.org> |
|---|---|
| date | Thu, 01 Jan 1998 02:45:12 +0000 |
| parents | 614b916ff5bf |
| children | e351676e5044 |
| rev | line source |
|---|---|
| 118 | 1 /* GNU Emacs case conversion functions. |
| 7307 | 2 Copyright (C) 1985, 1994 Free Software Foundation, Inc. |
| 118 | 3 |
| 4 This file is part of GNU Emacs. | |
| 5 | |
| 6 GNU Emacs is free software; you can redistribute it and/or modify | |
| 7 it under the terms of the GNU General Public License as published by | |
| 12244 | 8 the Free Software Foundation; either version 2, or (at your option) |
| 118 | 9 any later version. |
| 10 | |
| 11 GNU Emacs is distributed in the hope that it will be useful, | |
| 12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 GNU General Public License for more details. | |
| 15 | |
| 16 You should have received a copy of the GNU General Public License | |
| 17 along with GNU Emacs; see the file COPYING. If not, write to | |
|
14186
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14063
diff
changeset
|
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
|
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14063
diff
changeset
|
19 Boston, MA 02111-1307, USA. */ |
| 118 | 20 |
| 21 | |
|
4696
1fc792473491
Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents:
2822
diff
changeset
|
22 #include <config.h> |
| 118 | 23 #include "lisp.h" |
| 24 #include "buffer.h" | |
| 17816 | 25 #include "charset.h" |
| 118 | 26 #include "commands.h" |
| 27 #include "syntax.h" | |
| 28 | |
| 29 enum case_action {CASE_UP, CASE_DOWN, CASE_CAPITALIZE, CASE_CAPITALIZE_UP}; | |
| 17816 | 30 |
| 31 Lisp_Object Qidentity; | |
| 118 | 32 |
| 33 Lisp_Object | |
| 34 casify_object (flag, obj) | |
| 35 enum case_action flag; | |
| 36 Lisp_Object obj; | |
| 37 { | |
| 38 register int i, c, len; | |
| 39 register int inword = flag == CASE_DOWN; | |
| 17816 | 40 Lisp_Object tem; |
| 118 | 41 |
|
15170
0d698228e98c
(casify_region, casify_object):
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
42 /* If the case table is flagged as modified, rescan it. */ |
|
0d698228e98c
(casify_region, casify_object):
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
43 if (NILP (XCHAR_TABLE (current_buffer->downcase_table)->extras[1])) |
|
0d698228e98c
(casify_region, casify_object):
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
44 Fset_case_table (current_buffer->downcase_table); |
|
0d698228e98c
(casify_region, casify_object):
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
45 |
| 118 | 46 while (1) |
| 47 { | |
|
9137
412e94c1dbf2
(casify_object): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9053
diff
changeset
|
48 if (INTEGERP (obj)) |
| 118 | 49 { |
|
18613
614b916ff5bf
Fix bugs with inappropriate mixing of Lisp_Object with int.
Richard M. Stallman <rms@gnu.org>
parents:
18136
diff
changeset
|
50 c = DOWNCASE (XFASTINT (obj)); |
|
18136
015e9e4a90ed
(casify_object): Fix bug on handling a character
Kenichi Handa <handa@m17n.org>
parents:
18005
diff
changeset
|
51 if (inword) |
|
015e9e4a90ed
(casify_object): Fix bug on handling a character
Kenichi Handa <handa@m17n.org>
parents:
18005
diff
changeset
|
52 XSETFASTINT (obj, c); |
|
015e9e4a90ed
(casify_object): Fix bug on handling a character
Kenichi Handa <handa@m17n.org>
parents:
18005
diff
changeset
|
53 else if (c == XFASTINT (obj)) |
|
015e9e4a90ed
(casify_object): Fix bug on handling a character
Kenichi Handa <handa@m17n.org>
parents:
18005
diff
changeset
|
54 { |
|
18613
614b916ff5bf
Fix bugs with inappropriate mixing of Lisp_Object with int.
Richard M. Stallman <rms@gnu.org>
parents:
18136
diff
changeset
|
55 c = UPCASE1 (XFASTINT (obj)); |
|
18136
015e9e4a90ed
(casify_object): Fix bug on handling a character
Kenichi Handa <handa@m17n.org>
parents:
18005
diff
changeset
|
56 XSETFASTINT (obj, c); |
|
015e9e4a90ed
(casify_object): Fix bug on handling a character
Kenichi Handa <handa@m17n.org>
parents:
18005
diff
changeset
|
57 } |
| 118 | 58 return obj; |
| 59 } | |
|
9137
412e94c1dbf2
(casify_object): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9053
diff
changeset
|
60 if (STRINGP (obj)) |
| 118 | 61 { |
|
18005
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
62 int multibyte = !NILP (current_buffer->enable_multibyte_characters); |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
63 |
| 118 | 64 obj = Fcopy_sequence (obj); |
| 65 len = XSTRING (obj)->size; | |
| 66 for (i = 0; i < len; i++) | |
| 67 { | |
| 68 c = XSTRING (obj)->data[i]; | |
|
18005
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
69 if (multibyte && c >= 0x80) |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
70 /* A multibyte character can't be handled in this |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
71 simple loop. */ |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
72 break; |
|
9052
6de22822cf72
(upcase_initials): New function.
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
73 if (inword && flag != CASE_CAPITALIZE_UP) |
| 118 | 74 c = DOWNCASE (c); |
|
9052
6de22822cf72
(upcase_initials): New function.
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
75 else if (!UPPERCASEP (c) |
|
6de22822cf72
(upcase_initials): New function.
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
76 && (!inword || flag != CASE_CAPITALIZE_UP)) |
| 118 | 77 c = UPCASE1 (c); |
| 78 XSTRING (obj)->data[i] = c; | |
|
9052
6de22822cf72
(upcase_initials): New function.
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
79 if ((int) flag >= (int) CASE_CAPITALIZE) |
| 118 | 80 inword = SYNTAX (c) == Sword; |
| 81 } | |
|
18005
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
82 if (i < len) |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
83 { |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
84 /* The work is not yet finished because of a multibyte |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
85 character just encountered. */ |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
86 int fromlen, tolen, j = i; |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
87 char *buf |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
88 = (char *) alloca ((len - i) * MAX_LENGTH_OF_MULTI_BYTE_FORM |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
89 + i); |
|
20543
4dbda4b7c66f
(casify_region): Scan in bytes and chars.
Richard M. Stallman <rms@gnu.org>
parents:
18613
diff
changeset
|
90 unsigned char *str, workbuf[4]; |
|
18005
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
91 |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
92 /* Copy data already handled. */ |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
93 bcopy (XSTRING (obj)->data, buf, i); |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
94 |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
95 while (i < len) |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
96 { |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
97 c = STRING_CHAR_AND_LENGTH (XSTRING (obj)->data + i, |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
98 len - i, fromlen); |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
99 if (inword && flag != CASE_CAPITALIZE_UP) |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
100 c = DOWNCASE (c); |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
101 else if (!UPPERCASEP (c) |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
102 && (!inword || flag != CASE_CAPITALIZE_UP)) |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
103 c = UPCASE1 (c); |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
104 tolen = CHAR_STRING (c, workbuf, str); |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
105 bcopy (str, buf + j, tolen); |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
106 i += fromlen; |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
107 j += tolen; |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
108 if ((int) flag >= (int) CASE_CAPITALIZE) |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
109 inword = SYNTAX (c) == Sword; |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
110 } |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
111 obj = make_string (buf, j); |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
112 } |
| 118 | 113 return obj; |
| 114 } | |
|
1926
952f2a18f83d
* callint.c (Fcall_interactively): Pass the correct number of
Jim Blandy <jimb@redhat.com>
parents:
1505
diff
changeset
|
115 obj = wrong_type_argument (Qchar_or_string_p, obj); |
| 118 | 116 } |
| 117 } | |
| 118 | |
| 119 DEFUN ("upcase", Fupcase, Supcase, 1, 1, 0, | |
| 120 "Convert argument to upper case and return that.\n\ | |
| 121 The argument may be a character or string. The result has the same type.\n\ | |
|
9053
4887fc1a2dda
(Fupcase_initials_region): New function.
Richard M. Stallman <rms@gnu.org>
parents:
9052
diff
changeset
|
122 The argument object is not altered--the value is a copy.\n\ |
|
4887fc1a2dda
(Fupcase_initials_region): New function.
Richard M. Stallman <rms@gnu.org>
parents:
9052
diff
changeset
|
123 See also `capitalize', `downcase' and `upcase-initials'.") |
| 118 | 124 (obj) |
| 125 Lisp_Object obj; | |
| 126 { | |
| 127 return casify_object (CASE_UP, obj); | |
| 128 } | |
| 129 | |
| 130 DEFUN ("downcase", Fdowncase, Sdowncase, 1, 1, 0, | |
| 131 "Convert argument to lower case and return that.\n\ | |
| 132 The argument may be a character or string. The result has the same type.\n\ | |
|
9053
4887fc1a2dda
(Fupcase_initials_region): New function.
Richard M. Stallman <rms@gnu.org>
parents:
9052
diff
changeset
|
133 The argument object is not altered--the value is a copy.") |
| 118 | 134 (obj) |
| 135 Lisp_Object obj; | |
| 136 { | |
| 137 return casify_object (CASE_DOWN, obj); | |
| 138 } | |
| 139 | |
| 140 DEFUN ("capitalize", Fcapitalize, Scapitalize, 1, 1, 0, | |
| 141 "Convert argument to capitalized form and return that.\n\ | |
| 142 This means that each word's first character is upper case\n\ | |
| 143 and the rest is lower case.\n\ | |
| 144 The argument may be a character or string. The result has the same type.\n\ | |
|
9053
4887fc1a2dda
(Fupcase_initials_region): New function.
Richard M. Stallman <rms@gnu.org>
parents:
9052
diff
changeset
|
145 The argument object is not altered--the value is a copy.") |
| 118 | 146 (obj) |
| 147 Lisp_Object obj; | |
| 148 { | |
| 149 return casify_object (CASE_CAPITALIZE, obj); | |
| 150 } | |
|
9052
6de22822cf72
(upcase_initials): New function.
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
151 |
|
12089
f7cb17ca1815
(casify_region): Use explicit local vars for start
Karl Heuer <kwzh@gnu.org>
parents:
9299
diff
changeset
|
152 /* Like Fcapitalize but change only the initials. */ |
|
f7cb17ca1815
(casify_region): Use explicit local vars for start
Karl Heuer <kwzh@gnu.org>
parents:
9299
diff
changeset
|
153 |
|
9053
4887fc1a2dda
(Fupcase_initials_region): New function.
Richard M. Stallman <rms@gnu.org>
parents:
9052
diff
changeset
|
154 DEFUN ("upcase-initials", Fupcase_initials, Supcase_initials, 1, 1, 0, |
|
4887fc1a2dda
(Fupcase_initials_region): New function.
Richard M. Stallman <rms@gnu.org>
parents:
9052
diff
changeset
|
155 "Convert the initial of each word in the argument to upper case.\n\ |
|
4887fc1a2dda
(Fupcase_initials_region): New function.
Richard M. Stallman <rms@gnu.org>
parents:
9052
diff
changeset
|
156 Do not change the other letters of each word.\n\ |
|
4887fc1a2dda
(Fupcase_initials_region): New function.
Richard M. Stallman <rms@gnu.org>
parents:
9052
diff
changeset
|
157 The argument may be a character or string. The result has the same type.\n\ |
|
4887fc1a2dda
(Fupcase_initials_region): New function.
Richard M. Stallman <rms@gnu.org>
parents:
9052
diff
changeset
|
158 The argument object is not altered--the value is a copy.") |
|
4887fc1a2dda
(Fupcase_initials_region): New function.
Richard M. Stallman <rms@gnu.org>
parents:
9052
diff
changeset
|
159 (obj) |
|
4887fc1a2dda
(Fupcase_initials_region): New function.
Richard M. Stallman <rms@gnu.org>
parents:
9052
diff
changeset
|
160 Lisp_Object obj; |
|
4887fc1a2dda
(Fupcase_initials_region): New function.
Richard M. Stallman <rms@gnu.org>
parents:
9052
diff
changeset
|
161 { |
|
4887fc1a2dda
(Fupcase_initials_region): New function.
Richard M. Stallman <rms@gnu.org>
parents:
9052
diff
changeset
|
162 return casify_object (CASE_CAPITALIZE_UP, obj); |
|
4887fc1a2dda
(Fupcase_initials_region): New function.
Richard M. Stallman <rms@gnu.org>
parents:
9052
diff
changeset
|
163 } |
| 118 | 164 |
| 165 /* flag is CASE_UP, CASE_DOWN or CASE_CAPITALIZE or CASE_CAPITALIZE_UP. | |
| 166 b and e specify range of buffer to operate on. */ | |
| 167 | |
| 168 casify_region (flag, b, e) | |
| 169 enum case_action flag; | |
| 170 Lisp_Object b, e; | |
| 171 { | |
| 172 register int i; | |
| 173 register int c; | |
| 174 register int inword = flag == CASE_DOWN; | |
|
18005
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
175 register int multibyte = !NILP (current_buffer->enable_multibyte_characters); |
|
12089
f7cb17ca1815
(casify_region): Use explicit local vars for start
Karl Heuer <kwzh@gnu.org>
parents:
9299
diff
changeset
|
176 int start, end; |
|
20543
4dbda4b7c66f
(casify_region): Scan in bytes and chars.
Richard M. Stallman <rms@gnu.org>
parents:
18613
diff
changeset
|
177 int start_byte, end_byte; |
| 17816 | 178 Lisp_Object ch, downch, val; |
| 118 | 179 |
| 180 if (EQ (b, e)) | |
| 181 /* Not modifying because nothing marked */ | |
| 182 return; | |
| 183 | |
|
15170
0d698228e98c
(casify_region, casify_object):
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
184 /* If the case table is flagged as modified, rescan it. */ |
|
0d698228e98c
(casify_region, casify_object):
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
185 if (NILP (XCHAR_TABLE (current_buffer->downcase_table)->extras[1])) |
|
0d698228e98c
(casify_region, casify_object):
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
186 Fset_case_table (current_buffer->downcase_table); |
|
0d698228e98c
(casify_region, casify_object):
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
187 |
| 118 | 188 validate_region (&b, &e); |
|
12089
f7cb17ca1815
(casify_region): Use explicit local vars for start
Karl Heuer <kwzh@gnu.org>
parents:
9299
diff
changeset
|
189 start = XFASTINT (b); |
|
f7cb17ca1815
(casify_region): Use explicit local vars for start
Karl Heuer <kwzh@gnu.org>
parents:
9299
diff
changeset
|
190 end = XFASTINT (e); |
|
f7cb17ca1815
(casify_region): Use explicit local vars for start
Karl Heuer <kwzh@gnu.org>
parents:
9299
diff
changeset
|
191 modify_region (current_buffer, start, end); |
|
f7cb17ca1815
(casify_region): Use explicit local vars for start
Karl Heuer <kwzh@gnu.org>
parents:
9299
diff
changeset
|
192 record_change (start, end - start); |
|
20543
4dbda4b7c66f
(casify_region): Scan in bytes and chars.
Richard M. Stallman <rms@gnu.org>
parents:
18613
diff
changeset
|
193 start_byte = CHAR_TO_BYTE (start); |
|
4dbda4b7c66f
(casify_region): Scan in bytes and chars.
Richard M. Stallman <rms@gnu.org>
parents:
18613
diff
changeset
|
194 end_byte = CHAR_TO_BYTE (end); |
| 118 | 195 |
|
20543
4dbda4b7c66f
(casify_region): Scan in bytes and chars.
Richard M. Stallman <rms@gnu.org>
parents:
18613
diff
changeset
|
196 for (i = start_byte; i < end_byte; i++) |
| 17816 | 197 { |
|
18005
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
198 c = FETCH_BYTE (i); |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
199 if (multibyte && c >= 0x80) |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
200 /* A multibyte character can't be handled in this simple loop. */ |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
201 break; |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
202 if (inword && flag != CASE_CAPITALIZE_UP) |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
203 c = DOWNCASE (c); |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
204 else if (!UPPERCASEP (c) |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
205 && (!inword || flag != CASE_CAPITALIZE_UP)) |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
206 c = UPCASE1 (c); |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
207 FETCH_BYTE (i) = c; |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
208 if ((int) flag >= (int) CASE_CAPITALIZE) |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
209 inword = SYNTAX (c) == Sword; |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
210 } |
|
20543
4dbda4b7c66f
(casify_region): Scan in bytes and chars.
Richard M. Stallman <rms@gnu.org>
parents:
18613
diff
changeset
|
211 if (i < end_byte) |
|
18005
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
212 { |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
213 /* The work is not yet finished because of a multibyte character |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
214 just encountered. */ |
|
20543
4dbda4b7c66f
(casify_region): Scan in bytes and chars.
Richard M. Stallman <rms@gnu.org>
parents:
18613
diff
changeset
|
215 int opoint = PT; |
|
4dbda4b7c66f
(casify_region): Scan in bytes and chars.
Richard M. Stallman <rms@gnu.org>
parents:
18613
diff
changeset
|
216 int opoint_byte = PT_BYTE; |
|
4dbda4b7c66f
(casify_region): Scan in bytes and chars.
Richard M. Stallman <rms@gnu.org>
parents:
18613
diff
changeset
|
217 int c2; |
|
18005
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
218 |
|
20543
4dbda4b7c66f
(casify_region): Scan in bytes and chars.
Richard M. Stallman <rms@gnu.org>
parents:
18613
diff
changeset
|
219 while (i < end_byte) |
| 17816 | 220 { |
|
18005
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
221 if ((c = FETCH_BYTE (i)) >= 0x80) |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
222 c = FETCH_MULTIBYTE_CHAR (i); |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
223 c2 = c; |
| 17816 | 224 if (inword && flag != CASE_CAPITALIZE_UP) |
|
18005
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
225 c2 = DOWNCASE (c); |
| 17816 | 226 else if (!UPPERCASEP (c) |
| 227 && (!inword || flag != CASE_CAPITALIZE_UP)) | |
|
18005
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
228 c2 = UPCASE1 (c); |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
229 if (c != c2) |
| 17816 | 230 { |
| 231 int fromlen, tolen, j; | |
|
20543
4dbda4b7c66f
(casify_region): Scan in bytes and chars.
Richard M. Stallman <rms@gnu.org>
parents:
18613
diff
changeset
|
232 unsigned char workbuf[4], *str; |
| 17816 | 233 |
| 234 /* Handle the most likely case */ | |
|
18005
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
235 if (c < 0400 && c2 < 0400) |
|
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
236 FETCH_BYTE (i) = c2; |
| 17816 | 237 else if (fromlen = CHAR_STRING (c, workbuf, str), |
|
18005
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
238 tolen = CHAR_STRING (c2, workbuf, str), |
| 17816 | 239 fromlen == tolen) |
| 240 { | |
| 241 for (j = 0; j < tolen; ++j) | |
| 242 FETCH_BYTE (i + j) = str[j]; | |
| 243 } | |
| 244 else | |
| 245 { | |
| 246 error ("Can't casify letters that change length"); | |
| 247 #if 0 /* This is approximately what we'd like to be able to do here */ | |
| 248 if (tolen < fromlen) | |
| 249 del_range_1 (i + tolen, i + fromlen, 0); | |
| 250 else if (tolen > fromlen) | |
| 251 { | |
| 252 TEMP_SET_PT (i + fromlen); | |
|
20543
4dbda4b7c66f
(casify_region): Scan in bytes and chars.
Richard M. Stallman <rms@gnu.org>
parents:
18613
diff
changeset
|
253 insert_1 (str + fromlen, tolen - fromlen, 1, 0, 0); |
| 17816 | 254 } |
| 255 #endif | |
| 256 } | |
| 257 } | |
| 258 if ((int) flag >= (int) CASE_CAPITALIZE) | |
|
18005
ad95aa134d60
(casify_object): Handle multibyte characters.
Kenichi Handa <handa@m17n.org>
parents:
17816
diff
changeset
|
259 inword = SYNTAX (c2) == Sword; |
| 17816 | 260 INC_POS (i); |
| 261 } | |
|
20543
4dbda4b7c66f
(casify_region): Scan in bytes and chars.
Richard M. Stallman <rms@gnu.org>
parents:
18613
diff
changeset
|
262 TEMP_SET_PT_BOTH (opoint, opoint_byte); |
| 118 | 263 } |
| 264 | |
|
12089
f7cb17ca1815
(casify_region): Use explicit local vars for start
Karl Heuer <kwzh@gnu.org>
parents:
9299
diff
changeset
|
265 signal_after_change (start, end - start, end - start); |
| 118 | 266 } |
| 267 | |
| 268 DEFUN ("upcase-region", Fupcase_region, Supcase_region, 2, 2, "r", | |
| 269 "Convert the region to upper case. In programs, wants two arguments.\n\ | |
| 270 These arguments specify the starting and ending character numbers of\n\ | |
| 271 the region to operate on. When used as a command, the text between\n\ | |
| 272 point and the mark is operated on.\n\ | |
| 273 See also `capitalize-region'.") | |
|
14063
ef7d4117c601
(Fupcase_region, Fdowncase_region, Fcapitalize_region,
Erik Naggum <erik@naggum.no>
parents:
12244
diff
changeset
|
274 (beg, end) |
|
ef7d4117c601
(Fupcase_region, Fdowncase_region, Fcapitalize_region,
Erik Naggum <erik@naggum.no>
parents:
12244
diff
changeset
|
275 Lisp_Object beg, end; |
| 118 | 276 { |
|
14063
ef7d4117c601
(Fupcase_region, Fdowncase_region, Fcapitalize_region,
Erik Naggum <erik@naggum.no>
parents:
12244
diff
changeset
|
277 casify_region (CASE_UP, beg, end); |
| 118 | 278 return Qnil; |
| 279 } | |
| 280 | |
| 281 DEFUN ("downcase-region", Fdowncase_region, Sdowncase_region, 2, 2, "r", | |
| 282 "Convert the region to lower case. In programs, wants two arguments.\n\ | |
| 283 These arguments specify the starting and ending character numbers of\n\ | |
| 284 the region to operate on. When used as a command, the text between\n\ | |
| 285 point and the mark is operated on.") | |
|
14063
ef7d4117c601
(Fupcase_region, Fdowncase_region, Fcapitalize_region,
Erik Naggum <erik@naggum.no>
parents:
12244
diff
changeset
|
286 (beg, end) |
|
ef7d4117c601
(Fupcase_region, Fdowncase_region, Fcapitalize_region,
Erik Naggum <erik@naggum.no>
parents:
12244
diff
changeset
|
287 Lisp_Object beg, end; |
| 118 | 288 { |
|
14063
ef7d4117c601
(Fupcase_region, Fdowncase_region, Fcapitalize_region,
Erik Naggum <erik@naggum.no>
parents:
12244
diff
changeset
|
289 casify_region (CASE_DOWN, beg, end); |
| 118 | 290 return Qnil; |
| 291 } | |
| 292 | |
| 293 DEFUN ("capitalize-region", Fcapitalize_region, Scapitalize_region, 2, 2, "r", | |
| 294 "Convert the region to capitalized form.\n\ | |
| 295 Capitalized form means each word's first character is upper case\n\ | |
| 296 and the rest of it is lower case.\n\ | |
| 297 In programs, give two arguments, the starting and ending\n\ | |
| 298 character positions to operate on.") | |
|
14063
ef7d4117c601
(Fupcase_region, Fdowncase_region, Fcapitalize_region,
Erik Naggum <erik@naggum.no>
parents:
12244
diff
changeset
|
299 (beg, end) |
|
ef7d4117c601
(Fupcase_region, Fdowncase_region, Fcapitalize_region,
Erik Naggum <erik@naggum.no>
parents:
12244
diff
changeset
|
300 Lisp_Object beg, end; |
| 118 | 301 { |
|
14063
ef7d4117c601
(Fupcase_region, Fdowncase_region, Fcapitalize_region,
Erik Naggum <erik@naggum.no>
parents:
12244
diff
changeset
|
302 casify_region (CASE_CAPITALIZE, beg, end); |
| 118 | 303 return Qnil; |
| 304 } | |
| 305 | |
|
12089
f7cb17ca1815
(casify_region): Use explicit local vars for start
Karl Heuer <kwzh@gnu.org>
parents:
9299
diff
changeset
|
306 /* Like Fcapitalize_region but change only the initials. */ |
|
f7cb17ca1815
(casify_region): Use explicit local vars for start
Karl Heuer <kwzh@gnu.org>
parents:
9299
diff
changeset
|
307 |
|
9053
4887fc1a2dda
(Fupcase_initials_region): New function.
Richard M. Stallman <rms@gnu.org>
parents:
9052
diff
changeset
|
308 DEFUN ("upcase-initials-region", Fupcase_initials_region, |
|
4887fc1a2dda
(Fupcase_initials_region): New function.
Richard M. Stallman <rms@gnu.org>
parents:
9052
diff
changeset
|
309 Supcase_initials_region, 2, 2, "r", |
|
4887fc1a2dda
(Fupcase_initials_region): New function.
Richard M. Stallman <rms@gnu.org>
parents:
9052
diff
changeset
|
310 "Upcase the initial of each word in the region.\n\ |
|
4887fc1a2dda
(Fupcase_initials_region): New function.
Richard M. Stallman <rms@gnu.org>
parents:
9052
diff
changeset
|
311 Subsequent letters of each word are not changed.\n\ |
|
4887fc1a2dda
(Fupcase_initials_region): New function.
Richard M. Stallman <rms@gnu.org>
parents:
9052
diff
changeset
|
312 In programs, give two arguments, the starting and ending\n\ |
|
4887fc1a2dda
(Fupcase_initials_region): New function.
Richard M. Stallman <rms@gnu.org>
parents:
9052
diff
changeset
|
313 character positions to operate on.") |
|
14063
ef7d4117c601
(Fupcase_region, Fdowncase_region, Fcapitalize_region,
Erik Naggum <erik@naggum.no>
parents:
12244
diff
changeset
|
314 (beg, end) |
|
ef7d4117c601
(Fupcase_region, Fdowncase_region, Fcapitalize_region,
Erik Naggum <erik@naggum.no>
parents:
12244
diff
changeset
|
315 Lisp_Object beg, end; |
|
9053
4887fc1a2dda
(Fupcase_initials_region): New function.
Richard M. Stallman <rms@gnu.org>
parents:
9052
diff
changeset
|
316 { |
|
14063
ef7d4117c601
(Fupcase_region, Fdowncase_region, Fcapitalize_region,
Erik Naggum <erik@naggum.no>
parents:
12244
diff
changeset
|
317 casify_region (CASE_CAPITALIZE_UP, beg, end); |
|
9053
4887fc1a2dda
(Fupcase_initials_region): New function.
Richard M. Stallman <rms@gnu.org>
parents:
9052
diff
changeset
|
318 return Qnil; |
|
4887fc1a2dda
(Fupcase_initials_region): New function.
Richard M. Stallman <rms@gnu.org>
parents:
9052
diff
changeset
|
319 } |
| 118 | 320 |
| 321 Lisp_Object | |
|
6221
c2d29681d218
(operate_on_word): Don't move point; store in *NEWPOINT.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
322 operate_on_word (arg, newpoint) |
| 118 | 323 Lisp_Object arg; |
|
6221
c2d29681d218
(operate_on_word): Don't move point; store in *NEWPOINT.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
324 int *newpoint; |
| 118 | 325 { |
|
1505
4f138b03e5ab
* casefiddle.c (operate_on_word): Declare end to be an int, not a
Jim Blandy <jimb@redhat.com>
parents:
484
diff
changeset
|
326 Lisp_Object val; |
|
6221
c2d29681d218
(operate_on_word): Don't move point; store in *NEWPOINT.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
327 int farend; |
|
12089
f7cb17ca1815
(casify_region): Use explicit local vars for start
Karl Heuer <kwzh@gnu.org>
parents:
9299
diff
changeset
|
328 int iarg; |
| 118 | 329 |
| 330 CHECK_NUMBER (arg, 0); | |
|
12089
f7cb17ca1815
(casify_region): Use explicit local vars for start
Karl Heuer <kwzh@gnu.org>
parents:
9299
diff
changeset
|
331 iarg = XINT (arg); |
|
16039
855c8d8ba0f0
Change all references from point to PT.
Karl Heuer <kwzh@gnu.org>
parents:
15170
diff
changeset
|
332 farend = scan_words (PT, iarg); |
| 118 | 333 if (!farend) |
|
12089
f7cb17ca1815
(casify_region): Use explicit local vars for start
Karl Heuer <kwzh@gnu.org>
parents:
9299
diff
changeset
|
334 farend = iarg > 0 ? ZV : BEGV; |
| 118 | 335 |
|
16039
855c8d8ba0f0
Change all references from point to PT.
Karl Heuer <kwzh@gnu.org>
parents:
15170
diff
changeset
|
336 *newpoint = PT > farend ? PT : farend; |
|
9299
e8c880f2723e
(casify_object, operate_on_word, Fupcase_word, Fdowncase_word,
Karl Heuer <kwzh@gnu.org>
parents:
9137
diff
changeset
|
337 XSETFASTINT (val, farend); |
| 118 | 338 |
| 339 return val; | |
| 340 } | |
| 341 | |
| 342 DEFUN ("upcase-word", Fupcase_word, Supcase_word, 1, 1, "p", | |
| 343 "Convert following word (or ARG words) to upper case, moving over.\n\ | |
| 344 With negative argument, convert previous words but do not move.\n\ | |
| 345 See also `capitalize-word'.") | |
| 346 (arg) | |
| 347 Lisp_Object arg; | |
| 348 { | |
|
6221
c2d29681d218
(operate_on_word): Don't move point; store in *NEWPOINT.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
349 Lisp_Object beg, end; |
|
c2d29681d218
(operate_on_word): Don't move point; store in *NEWPOINT.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
350 int newpoint; |
|
16039
855c8d8ba0f0
Change all references from point to PT.
Karl Heuer <kwzh@gnu.org>
parents:
15170
diff
changeset
|
351 XSETFASTINT (beg, PT); |
|
6221
c2d29681d218
(operate_on_word): Don't move point; store in *NEWPOINT.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
352 end = operate_on_word (arg, &newpoint); |
|
c2d29681d218
(operate_on_word): Don't move point; store in *NEWPOINT.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
353 casify_region (CASE_UP, beg, end); |
|
c2d29681d218
(operate_on_word): Don't move point; store in *NEWPOINT.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
354 SET_PT (newpoint); |
| 118 | 355 return Qnil; |
| 356 } | |
| 357 | |
| 358 DEFUN ("downcase-word", Fdowncase_word, Sdowncase_word, 1, 1, "p", | |
| 359 "Convert following word (or ARG words) to lower case, moving over.\n\ | |
| 360 With negative argument, convert previous words but do not move.") | |
| 361 (arg) | |
| 362 Lisp_Object arg; | |
| 363 { | |
|
6221
c2d29681d218
(operate_on_word): Don't move point; store in *NEWPOINT.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
364 Lisp_Object beg, end; |
|
c2d29681d218
(operate_on_word): Don't move point; store in *NEWPOINT.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
365 int newpoint; |
|
16039
855c8d8ba0f0
Change all references from point to PT.
Karl Heuer <kwzh@gnu.org>
parents:
15170
diff
changeset
|
366 XSETFASTINT (beg, PT); |
|
6221
c2d29681d218
(operate_on_word): Don't move point; store in *NEWPOINT.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
367 end = operate_on_word (arg, &newpoint); |
|
c2d29681d218
(operate_on_word): Don't move point; store in *NEWPOINT.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
368 casify_region (CASE_DOWN, beg, end); |
|
c2d29681d218
(operate_on_word): Don't move point; store in *NEWPOINT.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
369 SET_PT (newpoint); |
| 118 | 370 return Qnil; |
| 371 } | |
| 372 | |
| 373 DEFUN ("capitalize-word", Fcapitalize_word, Scapitalize_word, 1, 1, "p", | |
| 374 "Capitalize the following word (or ARG words), moving over.\n\ | |
| 375 This gives the word(s) a first character in upper case\n\ | |
| 376 and the rest lower case.\n\ | |
| 377 With negative argument, capitalize previous words but do not move.") | |
| 378 (arg) | |
| 379 Lisp_Object arg; | |
| 380 { | |
|
6221
c2d29681d218
(operate_on_word): Don't move point; store in *NEWPOINT.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
381 Lisp_Object beg, end; |
|
c2d29681d218
(operate_on_word): Don't move point; store in *NEWPOINT.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
382 int newpoint; |
|
16039
855c8d8ba0f0
Change all references from point to PT.
Karl Heuer <kwzh@gnu.org>
parents:
15170
diff
changeset
|
383 XSETFASTINT (beg, PT); |
|
6221
c2d29681d218
(operate_on_word): Don't move point; store in *NEWPOINT.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
384 end = operate_on_word (arg, &newpoint); |
|
c2d29681d218
(operate_on_word): Don't move point; store in *NEWPOINT.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
385 casify_region (CASE_CAPITALIZE, beg, end); |
|
c2d29681d218
(operate_on_word): Don't move point; store in *NEWPOINT.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
386 SET_PT (newpoint); |
| 118 | 387 return Qnil; |
| 388 } | |
| 389 | |
| 390 syms_of_casefiddle () | |
| 391 { | |
| 17816 | 392 Qidentity = intern ("identity"); |
| 393 staticpro (&Qidentity); | |
| 118 | 394 defsubr (&Supcase); |
| 395 defsubr (&Sdowncase); | |
| 396 defsubr (&Scapitalize); | |
|
9053
4887fc1a2dda
(Fupcase_initials_region): New function.
Richard M. Stallman <rms@gnu.org>
parents:
9052
diff
changeset
|
397 defsubr (&Supcase_initials); |
| 118 | 398 defsubr (&Supcase_region); |
| 399 defsubr (&Sdowncase_region); | |
| 400 defsubr (&Scapitalize_region); | |
|
9053
4887fc1a2dda
(Fupcase_initials_region): New function.
Richard M. Stallman <rms@gnu.org>
parents:
9052
diff
changeset
|
401 defsubr (&Supcase_initials_region); |
| 118 | 402 defsubr (&Supcase_word); |
| 403 defsubr (&Sdowncase_word); | |
| 404 defsubr (&Scapitalize_word); | |
| 405 } | |
| 406 | |
| 407 keys_of_casefiddle () | |
| 408 { | |
| 409 initial_define_key (control_x_map, Ctl('U'), "upcase-region"); | |
| 484 | 410 Fput (intern ("upcase-region"), Qdisabled, Qt); |
| 118 | 411 initial_define_key (control_x_map, Ctl('L'), "downcase-region"); |
| 484 | 412 Fput (intern ("downcase-region"), Qdisabled, Qt); |
| 413 | |
| 118 | 414 initial_define_key (meta_map, 'u', "upcase-word"); |
| 415 initial_define_key (meta_map, 'l', "downcase-word"); | |
| 416 initial_define_key (meta_map, 'c', "capitalize-word"); | |
| 417 } |
