|
|
1.1 root 1: /* GNU Emacs case conversion functions.
2: Copyright (C) 1985 Richard M. Stallman.
3:
4: This file is part of GNU Emacs.
5:
6: GNU Emacs is distributed in the hope that it will be useful,
7: but WITHOUT ANY WARRANTY. No author or distributor
8: accepts responsibility to anyone for the consequences of using it
9: or for whether it serves any particular purpose or works at all,
10: unless he says so in writing. Refer to the GNU Emacs General Public
11: License for full details.
12:
13: Everyone is granted permission to copy, modify and redistribute
14: GNU Emacs, but only under the conditions described in the
15: GNU Emacs General Public License. A copy of this license is
16: supposed to have been given to you along with GNU Emacs so you
17: can know your rights and responsibilities. It should be in a
18: file named COPYING. Among other things, the copyright notice
19: and this notice must be preserved on all copies. */
20:
21:
22: #include "config.h"
23: #include "lisp.h"
24: #include "buffer.h"
25: #include "commands.h"
26: #include "syntax.h"
27:
28: #define UPCASE 0
29: #define DOWNCASE 1
30: #define CAPITALIZE 2
31: #define CAPITALIZE_UP 3
32:
33: Lisp_Object
34: casify_object (flag, obj)
35: int flag;
36: Lisp_Object obj;
37: {
38: register int i, c, len;
39: register int inword = flag == DOWNCASE;
40:
41: while (1)
42: {
43: if (XTYPE (obj) == Lisp_Int)
44: {
45: c = XINT (obj);
46: if (inword
47: ? (c >= 'A' && c <= 'Z')
48: : (c >= 'a' && c <= 'z'))
49: XFASTINT (obj) = c ^ ('a' - 'A');
50: return obj;
51: }
52: if (XTYPE (obj) == Lisp_String)
53: {
54: obj = Fcopy_sequence (obj);
55: len = XSTRING (obj)->size;
56: for (i = 0; i < len; i++)
57: {
58: c = XSTRING (obj)->data[i];
59: if (inword
60: ? (c >= 'A' && c <= 'Z')
61: : (c >= 'a' && c <= 'z'))
62: XSTRING (obj)->data[i] = c ^ ('a' - 'A');
63: if (flag == CAPITALIZE)
64: inword = SYNTAX (c) == Sword;
65: }
66: return obj;
67: }
68: obj = wrong_type_argument (Qchar_or_string_p, obj, 0);
69: }
70: }
71:
72: DEFUN ("upcase", Fupcase, Supcase, 1, 1, 0,
73: "One arg, a character or string. Convert it to upper case and return that.")
74: (obj)
75: Lisp_Object obj;
76: {
77: return casify_object (UPCASE, obj);
78: }
79:
80: DEFUN ("downcase", Fdowncase, Sdowncase, 1, 1, 0,
81: "One arg, a character or string. Convert it to lower case and return that.")
82: (obj)
83: Lisp_Object obj;
84: {
85: return casify_object (DOWNCASE, obj);
86: }
87:
88: DEFUN ("capitalize", Fcapitalize, Scapitalize, 1, 1, 0,
89: "One arg, a character or string. Convert it to capitalized form and return that.\n\
90: This means that each word's first character is upper case and the rest is lower case.")
91: (obj)
92: Lisp_Object obj;
93: {
94: return casify_object (CAPITALIZE, obj);
95: }
96:
97: /* flag is UPCASE, DOWNCASE or CAPITALIZE or CAPITALIZE_UP.
98: b and e specify range of buffer to operate on. */
99:
100: casify_region (flag, b, e)
101: Lisp_Object b, e;
102: {
103: register int i;
104: register int c;
105: register int inword = flag == DOWNCASE;
106:
107: validate_region (&b, &e);
108: if (!NULL (bf_cur->read_only))
109: Fbarf_if_buffer_read_only();
110: RecordChange (XFASTINT (b), XFASTINT (e) - XFASTINT (b));
111: modify_region (XFASTINT (b), XFASTINT (e));
112:
113: for (i = XFASTINT (b); i < XFASTINT (e); i++)
114: {
115: c = CharAt (i);
116: if (inword
117: ? (c >= 'A' && c <= 'Z' && flag != CAPITALIZE_UP)
118: : (c >= 'a' && c <= 'z'))
119: CharAt (i) = c ^ ('a' - 'A');
120: if (flag >= CAPITALIZE)
121: inword = SYNTAX (c) == Sword;
122: }
123: }
124:
125: DEFUN ("upcase-region", Fupcase_region, Supcase_region, 2, 2, "r",
126: "Convert the region to upper case. In programs, wants two arguments.\n\
127: These arguments specify the starting and ending character numbers of\n\
128: the region to operate on. When used as a command, the text between\n\
129: point and the mark is operated on.")
130: (b, e)
131: Lisp_Object b, e;
132: {
133: casify_region (UPCASE, b, e);
134: return Qnil;
135: }
136:
137: DEFUN ("downcase-region", Fdowncase_region, Sdowncase_region, 2, 2, "r",
138: "Convert the region to lower case. In programs, wants two arguments.\n\
139: These arguments specify the starting and ending character numbers of\n\
140: the region to operate on. When used as a command, the text between\n\
141: point and the mark is operated on.")
142: (b, e)
143: Lisp_Object b, e;
144: {
145: casify_region (DOWNCASE, b, e);
146: return Qnil;
147: }
148:
149: DEFUN ("capitalize-region", Fcapitalize_region, Scapitalize_region, 2, 2, "r",
150: "Convert the region to upper case. In programs, wants two arguments.\n\
151: These arguments specify the starting and ending character numbers of\n\
152: the region to operate on. When used as a command, the text between\n\
153: point and the mark is operated on.\n\
154: Capitalized form means each word's first character is upper case\n\
155: and the rest of it is lower case.")
156: (b, e)
157: Lisp_Object b, e;
158: {
159: casify_region (CAPITALIZE, b, e);
160: return Qnil;
161: }
162:
163: /* Like Fcapitalize but change only the initials. */
164:
165: Lisp_Object
166: upcase_initials_region (b, e)
167: Lisp_Object b, e;
168: {
169: casify_region (CAPITALIZE_UP, b, e);
170: return Qnil;
171: }
172:
173: void
174: operate_on_word (flag, arg)
175: int flag;
176: Lisp_Object arg;
177: {
178: Lisp_Object beg, end;
179: int farend;
180: CHECK_NUMBER (arg, 0);
181: farend = scan_words (point, XINT (arg));
182: if (!farend)
183: farend = XINT (arg) > 0 ? NumCharacters + 1 : FirstCharacter;
184: XFASTINT (beg) = point < farend ? point : farend;
185: XFASTINT (end) = point > farend ? point : farend;
186: casify_region (flag, beg, end);
187: SetPoint (XFASTINT (end));
188: }
189:
190: DEFUN ("upcase-word", Fupcase_word, Supcase_word, 1, 1, "p",
191: "Convert following word (or ARG words) to upper case, moving over.\n\
192: With negative argument, convert previous words but do not move.")
193: (arg)
194: Lisp_Object arg;
195: {
196: operate_on_word (UPCASE, arg);
197: return Qnil;
198: }
199:
200: DEFUN ("downcase-word", Fdowncase_word, Sdowncase_word, 1, 1, "p",
201: "Convert following word (or ARG words) to lower case, moving over.\n\
202: With negative argument, convert previous words but do not move.")
203: (arg)
204: Lisp_Object arg;
205: {
206: operate_on_word (DOWNCASE, arg);
207: return Qnil;
208: }
209:
210: DEFUN ("capitalize-word", Fcapitalize_word, Scapitalize_word, 1, 1, "p",
211: "Capitalize the following word (or ARG words), moving over.\n\
212: This gives the word(s) a first character in upper case\n\
213: and the rest lower case.\n\
214: With negative argument, capitalize previous words but do not move.")
215: (arg)
216: Lisp_Object arg;
217: {
218: operate_on_word (CAPITALIZE, arg);
219: return Qnil;
220: }
221:
222: syms_of_casefiddle ()
223: {
224: defsubr (&Supcase);
225: defsubr (&Sdowncase);
226: defsubr (&Scapitalize);
227: defsubr (&Supcase_region);
228: defsubr (&Sdowncase_region);
229: defsubr (&Scapitalize_region);
230: defsubr (&Supcase_word);
231: defsubr (&Sdowncase_word);
232: defsubr (&Scapitalize_word);
233: }
234:
235: keys_of_casefiddle ()
236: {
237: defkey (CtlXmap, Ctl('U'), "upcase-region");
238: defkey (CtlXmap, Ctl('L'), "downcase-region");
239: defkey (ESCmap, 'u', "upcase-word");
240: defkey (ESCmap, 'l', "downcase-word");
241: defkey (ESCmap, 'c', "capitalize-word");
242: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.