1*6b445a62SJohn Marino /* text.c -- text handling commands for readline. */
2*6b445a62SJohn Marino
3*6b445a62SJohn Marino /* Copyright (C) 1987-2010 Free Software Foundation, Inc.
4*6b445a62SJohn Marino
5*6b445a62SJohn Marino This file is part of the GNU Readline Library (Readline), a library
6*6b445a62SJohn Marino for reading lines of text with interactive input and history editing.
7*6b445a62SJohn Marino
8*6b445a62SJohn Marino Readline is free software: you can redistribute it and/or modify
9*6b445a62SJohn Marino it under the terms of the GNU General Public License as published by
10*6b445a62SJohn Marino the Free Software Foundation, either version 3 of the License, or
11*6b445a62SJohn Marino (at your option) any later version.
12*6b445a62SJohn Marino
13*6b445a62SJohn Marino Readline is distributed in the hope that it will be useful,
14*6b445a62SJohn Marino but WITHOUT ANY WARRANTY; without even the implied warranty of
15*6b445a62SJohn Marino MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16*6b445a62SJohn Marino GNU General Public License for more details.
17*6b445a62SJohn Marino
18*6b445a62SJohn Marino You should have received a copy of the GNU General Public License
19*6b445a62SJohn Marino along with Readline. If not, see <http://www.gnu.org/licenses/>.
20*6b445a62SJohn Marino */
21*6b445a62SJohn Marino
22*6b445a62SJohn Marino #define READLINE_LIBRARY
23*6b445a62SJohn Marino
24*6b445a62SJohn Marino #if defined (HAVE_CONFIG_H)
25*6b445a62SJohn Marino # include <config.h>
26*6b445a62SJohn Marino #endif
27*6b445a62SJohn Marino
28*6b445a62SJohn Marino #if defined (HAVE_UNISTD_H)
29*6b445a62SJohn Marino # include <unistd.h>
30*6b445a62SJohn Marino #endif /* HAVE_UNISTD_H */
31*6b445a62SJohn Marino
32*6b445a62SJohn Marino #if defined (HAVE_STDLIB_H)
33*6b445a62SJohn Marino # include <stdlib.h>
34*6b445a62SJohn Marino #else
35*6b445a62SJohn Marino # include "ansi_stdlib.h"
36*6b445a62SJohn Marino #endif /* HAVE_STDLIB_H */
37*6b445a62SJohn Marino
38*6b445a62SJohn Marino #if defined (HAVE_LOCALE_H)
39*6b445a62SJohn Marino # include <locale.h>
40*6b445a62SJohn Marino #endif
41*6b445a62SJohn Marino
42*6b445a62SJohn Marino #include <stdio.h>
43*6b445a62SJohn Marino
44*6b445a62SJohn Marino /* System-specific feature definitions and include files. */
45*6b445a62SJohn Marino #include "rldefs.h"
46*6b445a62SJohn Marino #include "rlmbutil.h"
47*6b445a62SJohn Marino
48*6b445a62SJohn Marino #if defined (__EMX__)
49*6b445a62SJohn Marino # define INCL_DOSPROCESS
50*6b445a62SJohn Marino # include <os2.h>
51*6b445a62SJohn Marino #endif /* __EMX__ */
52*6b445a62SJohn Marino
53*6b445a62SJohn Marino /* Some standard library routines. */
54*6b445a62SJohn Marino #include "readline.h"
55*6b445a62SJohn Marino #include "history.h"
56*6b445a62SJohn Marino
57*6b445a62SJohn Marino #include "rlprivate.h"
58*6b445a62SJohn Marino #include "rlshell.h"
59*6b445a62SJohn Marino #include "xmalloc.h"
60*6b445a62SJohn Marino
61*6b445a62SJohn Marino /* Forward declarations. */
62*6b445a62SJohn Marino static int rl_change_case PARAMS((int, int));
63*6b445a62SJohn Marino static int _rl_char_search PARAMS((int, int, int));
64*6b445a62SJohn Marino
65*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
66*6b445a62SJohn Marino static int _rl_insert_next_callback PARAMS((_rl_callback_generic_arg *));
67*6b445a62SJohn Marino static int _rl_char_search_callback PARAMS((_rl_callback_generic_arg *));
68*6b445a62SJohn Marino #endif
69*6b445a62SJohn Marino
70*6b445a62SJohn Marino /* The largest chunk of text that can be inserted in one call to
71*6b445a62SJohn Marino rl_insert_text. Text blocks larger than this are divided. */
72*6b445a62SJohn Marino #define TEXT_COUNT_MAX 1024
73*6b445a62SJohn Marino
74*6b445a62SJohn Marino /* **************************************************************** */
75*6b445a62SJohn Marino /* */
76*6b445a62SJohn Marino /* Insert and Delete */
77*6b445a62SJohn Marino /* */
78*6b445a62SJohn Marino /* **************************************************************** */
79*6b445a62SJohn Marino
80*6b445a62SJohn Marino /* Insert a string of text into the line at point. This is the only
81*6b445a62SJohn Marino way that you should do insertion. _rl_insert_char () calls this
82*6b445a62SJohn Marino function. Returns the number of characters inserted. */
83*6b445a62SJohn Marino int
rl_insert_text(string)84*6b445a62SJohn Marino rl_insert_text (string)
85*6b445a62SJohn Marino const char *string;
86*6b445a62SJohn Marino {
87*6b445a62SJohn Marino register int i, l;
88*6b445a62SJohn Marino
89*6b445a62SJohn Marino l = (string && *string) ? strlen (string) : 0;
90*6b445a62SJohn Marino if (l == 0)
91*6b445a62SJohn Marino return 0;
92*6b445a62SJohn Marino
93*6b445a62SJohn Marino if (rl_end + l >= rl_line_buffer_len)
94*6b445a62SJohn Marino rl_extend_line_buffer (rl_end + l);
95*6b445a62SJohn Marino
96*6b445a62SJohn Marino for (i = rl_end; i >= rl_point; i--)
97*6b445a62SJohn Marino rl_line_buffer[i + l] = rl_line_buffer[i];
98*6b445a62SJohn Marino strncpy (rl_line_buffer + rl_point, string, l);
99*6b445a62SJohn Marino
100*6b445a62SJohn Marino /* Remember how to undo this if we aren't undoing something. */
101*6b445a62SJohn Marino if (_rl_doing_an_undo == 0)
102*6b445a62SJohn Marino {
103*6b445a62SJohn Marino /* If possible and desirable, concatenate the undos. */
104*6b445a62SJohn Marino if ((l == 1) &&
105*6b445a62SJohn Marino rl_undo_list &&
106*6b445a62SJohn Marino (rl_undo_list->what == UNDO_INSERT) &&
107*6b445a62SJohn Marino (rl_undo_list->end == rl_point) &&
108*6b445a62SJohn Marino (rl_undo_list->end - rl_undo_list->start < 20))
109*6b445a62SJohn Marino rl_undo_list->end++;
110*6b445a62SJohn Marino else
111*6b445a62SJohn Marino rl_add_undo (UNDO_INSERT, rl_point, rl_point + l, (char *)NULL);
112*6b445a62SJohn Marino }
113*6b445a62SJohn Marino rl_point += l;
114*6b445a62SJohn Marino rl_end += l;
115*6b445a62SJohn Marino rl_line_buffer[rl_end] = '\0';
116*6b445a62SJohn Marino return l;
117*6b445a62SJohn Marino }
118*6b445a62SJohn Marino
119*6b445a62SJohn Marino /* Delete the string between FROM and TO. FROM is inclusive, TO is not.
120*6b445a62SJohn Marino Returns the number of characters deleted. */
121*6b445a62SJohn Marino int
rl_delete_text(from,to)122*6b445a62SJohn Marino rl_delete_text (from, to)
123*6b445a62SJohn Marino int from, to;
124*6b445a62SJohn Marino {
125*6b445a62SJohn Marino register char *text;
126*6b445a62SJohn Marino register int diff, i;
127*6b445a62SJohn Marino
128*6b445a62SJohn Marino /* Fix it if the caller is confused. */
129*6b445a62SJohn Marino if (from > to)
130*6b445a62SJohn Marino SWAP (from, to);
131*6b445a62SJohn Marino
132*6b445a62SJohn Marino /* fix boundaries */
133*6b445a62SJohn Marino if (to > rl_end)
134*6b445a62SJohn Marino {
135*6b445a62SJohn Marino to = rl_end;
136*6b445a62SJohn Marino if (from > to)
137*6b445a62SJohn Marino from = to;
138*6b445a62SJohn Marino }
139*6b445a62SJohn Marino if (from < 0)
140*6b445a62SJohn Marino from = 0;
141*6b445a62SJohn Marino
142*6b445a62SJohn Marino text = rl_copy_text (from, to);
143*6b445a62SJohn Marino
144*6b445a62SJohn Marino /* Some versions of strncpy() can't handle overlapping arguments. */
145*6b445a62SJohn Marino diff = to - from;
146*6b445a62SJohn Marino for (i = from; i < rl_end - diff; i++)
147*6b445a62SJohn Marino rl_line_buffer[i] = rl_line_buffer[i + diff];
148*6b445a62SJohn Marino
149*6b445a62SJohn Marino /* Remember how to undo this delete. */
150*6b445a62SJohn Marino if (_rl_doing_an_undo == 0)
151*6b445a62SJohn Marino rl_add_undo (UNDO_DELETE, from, to, text);
152*6b445a62SJohn Marino else
153*6b445a62SJohn Marino xfree (text);
154*6b445a62SJohn Marino
155*6b445a62SJohn Marino rl_end -= diff;
156*6b445a62SJohn Marino rl_line_buffer[rl_end] = '\0';
157*6b445a62SJohn Marino return (diff);
158*6b445a62SJohn Marino }
159*6b445a62SJohn Marino
160*6b445a62SJohn Marino /* Fix up point so that it is within the line boundaries after killing
161*6b445a62SJohn Marino text. If FIX_MARK_TOO is non-zero, the mark is forced within line
162*6b445a62SJohn Marino boundaries also. */
163*6b445a62SJohn Marino
164*6b445a62SJohn Marino #define _RL_FIX_POINT(x) \
165*6b445a62SJohn Marino do { \
166*6b445a62SJohn Marino if (x > rl_end) \
167*6b445a62SJohn Marino x = rl_end; \
168*6b445a62SJohn Marino else if (x < 0) \
169*6b445a62SJohn Marino x = 0; \
170*6b445a62SJohn Marino } while (0)
171*6b445a62SJohn Marino
172*6b445a62SJohn Marino void
_rl_fix_point(fix_mark_too)173*6b445a62SJohn Marino _rl_fix_point (fix_mark_too)
174*6b445a62SJohn Marino int fix_mark_too;
175*6b445a62SJohn Marino {
176*6b445a62SJohn Marino _RL_FIX_POINT (rl_point);
177*6b445a62SJohn Marino if (fix_mark_too)
178*6b445a62SJohn Marino _RL_FIX_POINT (rl_mark);
179*6b445a62SJohn Marino }
180*6b445a62SJohn Marino #undef _RL_FIX_POINT
181*6b445a62SJohn Marino
182*6b445a62SJohn Marino /* Replace the contents of the line buffer between START and END with
183*6b445a62SJohn Marino TEXT. The operation is undoable. To replace the entire line in an
184*6b445a62SJohn Marino undoable mode, use _rl_replace_text(text, 0, rl_end); */
185*6b445a62SJohn Marino int
_rl_replace_text(text,start,end)186*6b445a62SJohn Marino _rl_replace_text (text, start, end)
187*6b445a62SJohn Marino const char *text;
188*6b445a62SJohn Marino int start, end;
189*6b445a62SJohn Marino {
190*6b445a62SJohn Marino int n;
191*6b445a62SJohn Marino
192*6b445a62SJohn Marino n = 0;
193*6b445a62SJohn Marino rl_begin_undo_group ();
194*6b445a62SJohn Marino if (start <= end)
195*6b445a62SJohn Marino rl_delete_text (start, end + 1);
196*6b445a62SJohn Marino rl_point = start;
197*6b445a62SJohn Marino if (*text)
198*6b445a62SJohn Marino n = rl_insert_text (text);
199*6b445a62SJohn Marino rl_end_undo_group ();
200*6b445a62SJohn Marino
201*6b445a62SJohn Marino return n;
202*6b445a62SJohn Marino }
203*6b445a62SJohn Marino
204*6b445a62SJohn Marino /* Replace the current line buffer contents with TEXT. If CLEAR_UNDO is
205*6b445a62SJohn Marino non-zero, we free the current undo list. */
206*6b445a62SJohn Marino void
rl_replace_line(text,clear_undo)207*6b445a62SJohn Marino rl_replace_line (text, clear_undo)
208*6b445a62SJohn Marino const char *text;
209*6b445a62SJohn Marino int clear_undo;
210*6b445a62SJohn Marino {
211*6b445a62SJohn Marino int len;
212*6b445a62SJohn Marino
213*6b445a62SJohn Marino len = strlen (text);
214*6b445a62SJohn Marino if (len >= rl_line_buffer_len)
215*6b445a62SJohn Marino rl_extend_line_buffer (len);
216*6b445a62SJohn Marino strcpy (rl_line_buffer, text);
217*6b445a62SJohn Marino rl_end = len;
218*6b445a62SJohn Marino
219*6b445a62SJohn Marino if (clear_undo)
220*6b445a62SJohn Marino rl_free_undo_list ();
221*6b445a62SJohn Marino
222*6b445a62SJohn Marino _rl_fix_point (1);
223*6b445a62SJohn Marino }
224*6b445a62SJohn Marino
225*6b445a62SJohn Marino /* **************************************************************** */
226*6b445a62SJohn Marino /* */
227*6b445a62SJohn Marino /* Readline character functions */
228*6b445a62SJohn Marino /* */
229*6b445a62SJohn Marino /* **************************************************************** */
230*6b445a62SJohn Marino
231*6b445a62SJohn Marino /* This is not a gap editor, just a stupid line input routine. No hair
232*6b445a62SJohn Marino is involved in writing any of the functions, and none should be. */
233*6b445a62SJohn Marino
234*6b445a62SJohn Marino /* Note that:
235*6b445a62SJohn Marino
236*6b445a62SJohn Marino rl_end is the place in the string that we would place '\0';
237*6b445a62SJohn Marino i.e., it is always safe to place '\0' there.
238*6b445a62SJohn Marino
239*6b445a62SJohn Marino rl_point is the place in the string where the cursor is. Sometimes
240*6b445a62SJohn Marino this is the same as rl_end.
241*6b445a62SJohn Marino
242*6b445a62SJohn Marino Any command that is called interactively receives two arguments.
243*6b445a62SJohn Marino The first is a count: the numeric arg pased to this command.
244*6b445a62SJohn Marino The second is the key which invoked this command.
245*6b445a62SJohn Marino */
246*6b445a62SJohn Marino
247*6b445a62SJohn Marino /* **************************************************************** */
248*6b445a62SJohn Marino /* */
249*6b445a62SJohn Marino /* Movement Commands */
250*6b445a62SJohn Marino /* */
251*6b445a62SJohn Marino /* **************************************************************** */
252*6b445a62SJohn Marino
253*6b445a62SJohn Marino /* Note that if you `optimize' the display for these functions, you cannot
254*6b445a62SJohn Marino use said functions in other functions which do not do optimizing display.
255*6b445a62SJohn Marino I.e., you will have to update the data base for rl_redisplay, and you
256*6b445a62SJohn Marino might as well let rl_redisplay do that job. */
257*6b445a62SJohn Marino
258*6b445a62SJohn Marino /* Move forward COUNT bytes. */
259*6b445a62SJohn Marino int
rl_forward_byte(count,key)260*6b445a62SJohn Marino rl_forward_byte (count, key)
261*6b445a62SJohn Marino int count, key;
262*6b445a62SJohn Marino {
263*6b445a62SJohn Marino if (count < 0)
264*6b445a62SJohn Marino return (rl_backward_byte (-count, key));
265*6b445a62SJohn Marino
266*6b445a62SJohn Marino if (count > 0)
267*6b445a62SJohn Marino {
268*6b445a62SJohn Marino int end, lend;
269*6b445a62SJohn Marino
270*6b445a62SJohn Marino end = rl_point + count;
271*6b445a62SJohn Marino #if defined (VI_MODE)
272*6b445a62SJohn Marino lend = rl_end > 0 ? rl_end - (VI_COMMAND_MODE()) : rl_end;
273*6b445a62SJohn Marino #else
274*6b445a62SJohn Marino lend = rl_end;
275*6b445a62SJohn Marino #endif
276*6b445a62SJohn Marino
277*6b445a62SJohn Marino if (end > lend)
278*6b445a62SJohn Marino {
279*6b445a62SJohn Marino rl_point = lend;
280*6b445a62SJohn Marino rl_ding ();
281*6b445a62SJohn Marino }
282*6b445a62SJohn Marino else
283*6b445a62SJohn Marino rl_point = end;
284*6b445a62SJohn Marino }
285*6b445a62SJohn Marino
286*6b445a62SJohn Marino if (rl_end < 0)
287*6b445a62SJohn Marino rl_end = 0;
288*6b445a62SJohn Marino
289*6b445a62SJohn Marino return 0;
290*6b445a62SJohn Marino }
291*6b445a62SJohn Marino
292*6b445a62SJohn Marino int
_rl_forward_char_internal(count)293*6b445a62SJohn Marino _rl_forward_char_internal (count)
294*6b445a62SJohn Marino int count;
295*6b445a62SJohn Marino {
296*6b445a62SJohn Marino int point;
297*6b445a62SJohn Marino
298*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
299*6b445a62SJohn Marino point = _rl_find_next_mbchar (rl_line_buffer, rl_point, count, MB_FIND_NONZERO);
300*6b445a62SJohn Marino
301*6b445a62SJohn Marino #if defined (VI_MODE)
302*6b445a62SJohn Marino if (point >= rl_end && VI_COMMAND_MODE())
303*6b445a62SJohn Marino point = _rl_find_prev_mbchar (rl_line_buffer, rl_end, MB_FIND_NONZERO);
304*6b445a62SJohn Marino #endif
305*6b445a62SJohn Marino
306*6b445a62SJohn Marino if (rl_end < 0)
307*6b445a62SJohn Marino rl_end = 0;
308*6b445a62SJohn Marino #else
309*6b445a62SJohn Marino point = rl_point + count;
310*6b445a62SJohn Marino if (point > rl_end)
311*6b445a62SJohn Marino point = rl_end;
312*6b445a62SJohn Marino #endif
313*6b445a62SJohn Marino
314*6b445a62SJohn Marino return (point);
315*6b445a62SJohn Marino }
316*6b445a62SJohn Marino
317*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
318*6b445a62SJohn Marino /* Move forward COUNT characters. */
319*6b445a62SJohn Marino int
rl_forward_char(count,key)320*6b445a62SJohn Marino rl_forward_char (count, key)
321*6b445a62SJohn Marino int count, key;
322*6b445a62SJohn Marino {
323*6b445a62SJohn Marino int point;
324*6b445a62SJohn Marino
325*6b445a62SJohn Marino if (MB_CUR_MAX == 1 || rl_byte_oriented)
326*6b445a62SJohn Marino return (rl_forward_byte (count, key));
327*6b445a62SJohn Marino
328*6b445a62SJohn Marino if (count < 0)
329*6b445a62SJohn Marino return (rl_backward_char (-count, key));
330*6b445a62SJohn Marino
331*6b445a62SJohn Marino if (count > 0)
332*6b445a62SJohn Marino {
333*6b445a62SJohn Marino if (rl_point == rl_end && EMACS_MODE())
334*6b445a62SJohn Marino {
335*6b445a62SJohn Marino rl_ding ();
336*6b445a62SJohn Marino return 0;
337*6b445a62SJohn Marino }
338*6b445a62SJohn Marino
339*6b445a62SJohn Marino point = _rl_forward_char_internal (count);
340*6b445a62SJohn Marino
341*6b445a62SJohn Marino if (rl_point == point)
342*6b445a62SJohn Marino rl_ding ();
343*6b445a62SJohn Marino
344*6b445a62SJohn Marino rl_point = point;
345*6b445a62SJohn Marino }
346*6b445a62SJohn Marino
347*6b445a62SJohn Marino return 0;
348*6b445a62SJohn Marino }
349*6b445a62SJohn Marino #else /* !HANDLE_MULTIBYTE */
350*6b445a62SJohn Marino int
rl_forward_char(count,key)351*6b445a62SJohn Marino rl_forward_char (count, key)
352*6b445a62SJohn Marino int count, key;
353*6b445a62SJohn Marino {
354*6b445a62SJohn Marino return (rl_forward_byte (count, key));
355*6b445a62SJohn Marino }
356*6b445a62SJohn Marino #endif /* !HANDLE_MULTIBYTE */
357*6b445a62SJohn Marino
358*6b445a62SJohn Marino /* Backwards compatibility. */
359*6b445a62SJohn Marino int
rl_forward(count,key)360*6b445a62SJohn Marino rl_forward (count, key)
361*6b445a62SJohn Marino int count, key;
362*6b445a62SJohn Marino {
363*6b445a62SJohn Marino return (rl_forward_char (count, key));
364*6b445a62SJohn Marino }
365*6b445a62SJohn Marino
366*6b445a62SJohn Marino /* Move backward COUNT bytes. */
367*6b445a62SJohn Marino int
rl_backward_byte(count,key)368*6b445a62SJohn Marino rl_backward_byte (count, key)
369*6b445a62SJohn Marino int count, key;
370*6b445a62SJohn Marino {
371*6b445a62SJohn Marino if (count < 0)
372*6b445a62SJohn Marino return (rl_forward_byte (-count, key));
373*6b445a62SJohn Marino
374*6b445a62SJohn Marino if (count > 0)
375*6b445a62SJohn Marino {
376*6b445a62SJohn Marino if (rl_point < count)
377*6b445a62SJohn Marino {
378*6b445a62SJohn Marino rl_point = 0;
379*6b445a62SJohn Marino rl_ding ();
380*6b445a62SJohn Marino }
381*6b445a62SJohn Marino else
382*6b445a62SJohn Marino rl_point -= count;
383*6b445a62SJohn Marino }
384*6b445a62SJohn Marino
385*6b445a62SJohn Marino if (rl_point < 0)
386*6b445a62SJohn Marino rl_point = 0;
387*6b445a62SJohn Marino
388*6b445a62SJohn Marino return 0;
389*6b445a62SJohn Marino }
390*6b445a62SJohn Marino
391*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
392*6b445a62SJohn Marino /* Move backward COUNT characters. */
393*6b445a62SJohn Marino int
rl_backward_char(count,key)394*6b445a62SJohn Marino rl_backward_char (count, key)
395*6b445a62SJohn Marino int count, key;
396*6b445a62SJohn Marino {
397*6b445a62SJohn Marino int point;
398*6b445a62SJohn Marino
399*6b445a62SJohn Marino if (MB_CUR_MAX == 1 || rl_byte_oriented)
400*6b445a62SJohn Marino return (rl_backward_byte (count, key));
401*6b445a62SJohn Marino
402*6b445a62SJohn Marino if (count < 0)
403*6b445a62SJohn Marino return (rl_forward_char (-count, key));
404*6b445a62SJohn Marino
405*6b445a62SJohn Marino if (count > 0)
406*6b445a62SJohn Marino {
407*6b445a62SJohn Marino point = rl_point;
408*6b445a62SJohn Marino
409*6b445a62SJohn Marino while (count > 0 && point > 0)
410*6b445a62SJohn Marino {
411*6b445a62SJohn Marino point = _rl_find_prev_mbchar (rl_line_buffer, point, MB_FIND_NONZERO);
412*6b445a62SJohn Marino count--;
413*6b445a62SJohn Marino }
414*6b445a62SJohn Marino if (count > 0)
415*6b445a62SJohn Marino {
416*6b445a62SJohn Marino rl_point = 0;
417*6b445a62SJohn Marino rl_ding ();
418*6b445a62SJohn Marino }
419*6b445a62SJohn Marino else
420*6b445a62SJohn Marino rl_point = point;
421*6b445a62SJohn Marino }
422*6b445a62SJohn Marino
423*6b445a62SJohn Marino return 0;
424*6b445a62SJohn Marino }
425*6b445a62SJohn Marino #else
426*6b445a62SJohn Marino int
rl_backward_char(count,key)427*6b445a62SJohn Marino rl_backward_char (count, key)
428*6b445a62SJohn Marino int count, key;
429*6b445a62SJohn Marino {
430*6b445a62SJohn Marino return (rl_backward_byte (count, key));
431*6b445a62SJohn Marino }
432*6b445a62SJohn Marino #endif
433*6b445a62SJohn Marino
434*6b445a62SJohn Marino /* Backwards compatibility. */
435*6b445a62SJohn Marino int
rl_backward(count,key)436*6b445a62SJohn Marino rl_backward (count, key)
437*6b445a62SJohn Marino int count, key;
438*6b445a62SJohn Marino {
439*6b445a62SJohn Marino return (rl_backward_char (count, key));
440*6b445a62SJohn Marino }
441*6b445a62SJohn Marino
442*6b445a62SJohn Marino /* Move to the beginning of the line. */
443*6b445a62SJohn Marino int
rl_beg_of_line(count,key)444*6b445a62SJohn Marino rl_beg_of_line (count, key)
445*6b445a62SJohn Marino int count, key;
446*6b445a62SJohn Marino {
447*6b445a62SJohn Marino rl_point = 0;
448*6b445a62SJohn Marino return 0;
449*6b445a62SJohn Marino }
450*6b445a62SJohn Marino
451*6b445a62SJohn Marino /* Move to the end of the line. */
452*6b445a62SJohn Marino int
rl_end_of_line(count,key)453*6b445a62SJohn Marino rl_end_of_line (count, key)
454*6b445a62SJohn Marino int count, key;
455*6b445a62SJohn Marino {
456*6b445a62SJohn Marino rl_point = rl_end;
457*6b445a62SJohn Marino return 0;
458*6b445a62SJohn Marino }
459*6b445a62SJohn Marino
460*6b445a62SJohn Marino /* Move forward a word. We do what Emacs does. Handles multibyte chars. */
461*6b445a62SJohn Marino int
rl_forward_word(count,key)462*6b445a62SJohn Marino rl_forward_word (count, key)
463*6b445a62SJohn Marino int count, key;
464*6b445a62SJohn Marino {
465*6b445a62SJohn Marino int c;
466*6b445a62SJohn Marino
467*6b445a62SJohn Marino if (count < 0)
468*6b445a62SJohn Marino return (rl_backward_word (-count, key));
469*6b445a62SJohn Marino
470*6b445a62SJohn Marino while (count)
471*6b445a62SJohn Marino {
472*6b445a62SJohn Marino if (rl_point == rl_end)
473*6b445a62SJohn Marino return 0;
474*6b445a62SJohn Marino
475*6b445a62SJohn Marino /* If we are not in a word, move forward until we are in one.
476*6b445a62SJohn Marino Then, move forward until we hit a non-alphabetic character. */
477*6b445a62SJohn Marino c = _rl_char_value (rl_line_buffer, rl_point);
478*6b445a62SJohn Marino
479*6b445a62SJohn Marino if (_rl_walphabetic (c) == 0)
480*6b445a62SJohn Marino {
481*6b445a62SJohn Marino rl_point = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO);
482*6b445a62SJohn Marino while (rl_point < rl_end)
483*6b445a62SJohn Marino {
484*6b445a62SJohn Marino c = _rl_char_value (rl_line_buffer, rl_point);
485*6b445a62SJohn Marino if (_rl_walphabetic (c))
486*6b445a62SJohn Marino break;
487*6b445a62SJohn Marino rl_point = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO);
488*6b445a62SJohn Marino }
489*6b445a62SJohn Marino }
490*6b445a62SJohn Marino
491*6b445a62SJohn Marino if (rl_point == rl_end)
492*6b445a62SJohn Marino return 0;
493*6b445a62SJohn Marino
494*6b445a62SJohn Marino rl_point = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO);
495*6b445a62SJohn Marino while (rl_point < rl_end)
496*6b445a62SJohn Marino {
497*6b445a62SJohn Marino c = _rl_char_value (rl_line_buffer, rl_point);
498*6b445a62SJohn Marino if (_rl_walphabetic (c) == 0)
499*6b445a62SJohn Marino break;
500*6b445a62SJohn Marino rl_point = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO);
501*6b445a62SJohn Marino }
502*6b445a62SJohn Marino
503*6b445a62SJohn Marino --count;
504*6b445a62SJohn Marino }
505*6b445a62SJohn Marino
506*6b445a62SJohn Marino return 0;
507*6b445a62SJohn Marino }
508*6b445a62SJohn Marino
509*6b445a62SJohn Marino /* Move backward a word. We do what Emacs does. Handles multibyte chars. */
510*6b445a62SJohn Marino int
rl_backward_word(count,key)511*6b445a62SJohn Marino rl_backward_word (count, key)
512*6b445a62SJohn Marino int count, key;
513*6b445a62SJohn Marino {
514*6b445a62SJohn Marino int c, p;
515*6b445a62SJohn Marino
516*6b445a62SJohn Marino if (count < 0)
517*6b445a62SJohn Marino return (rl_forward_word (-count, key));
518*6b445a62SJohn Marino
519*6b445a62SJohn Marino while (count)
520*6b445a62SJohn Marino {
521*6b445a62SJohn Marino if (rl_point == 0)
522*6b445a62SJohn Marino return 0;
523*6b445a62SJohn Marino
524*6b445a62SJohn Marino /* Like rl_forward_word (), except that we look at the characters
525*6b445a62SJohn Marino just before point. */
526*6b445a62SJohn Marino
527*6b445a62SJohn Marino p = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_NONZERO);
528*6b445a62SJohn Marino c = _rl_char_value (rl_line_buffer, p);
529*6b445a62SJohn Marino
530*6b445a62SJohn Marino if (_rl_walphabetic (c) == 0)
531*6b445a62SJohn Marino {
532*6b445a62SJohn Marino rl_point = p;
533*6b445a62SJohn Marino while (rl_point > 0)
534*6b445a62SJohn Marino {
535*6b445a62SJohn Marino p = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_NONZERO);
536*6b445a62SJohn Marino c = _rl_char_value (rl_line_buffer, p);
537*6b445a62SJohn Marino if (_rl_walphabetic (c))
538*6b445a62SJohn Marino break;
539*6b445a62SJohn Marino rl_point = p;
540*6b445a62SJohn Marino }
541*6b445a62SJohn Marino }
542*6b445a62SJohn Marino
543*6b445a62SJohn Marino while (rl_point)
544*6b445a62SJohn Marino {
545*6b445a62SJohn Marino p = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_NONZERO);
546*6b445a62SJohn Marino c = _rl_char_value (rl_line_buffer, p);
547*6b445a62SJohn Marino if (_rl_walphabetic (c) == 0)
548*6b445a62SJohn Marino break;
549*6b445a62SJohn Marino else
550*6b445a62SJohn Marino rl_point = p;
551*6b445a62SJohn Marino }
552*6b445a62SJohn Marino
553*6b445a62SJohn Marino --count;
554*6b445a62SJohn Marino }
555*6b445a62SJohn Marino
556*6b445a62SJohn Marino return 0;
557*6b445a62SJohn Marino }
558*6b445a62SJohn Marino
559*6b445a62SJohn Marino /* Clear the current line. Numeric argument to C-l does this. */
560*6b445a62SJohn Marino int
rl_refresh_line(ignore1,ignore2)561*6b445a62SJohn Marino rl_refresh_line (ignore1, ignore2)
562*6b445a62SJohn Marino int ignore1, ignore2;
563*6b445a62SJohn Marino {
564*6b445a62SJohn Marino int curr_line;
565*6b445a62SJohn Marino
566*6b445a62SJohn Marino curr_line = _rl_current_display_line ();
567*6b445a62SJohn Marino
568*6b445a62SJohn Marino _rl_move_vert (curr_line);
569*6b445a62SJohn Marino _rl_move_cursor_relative (0, rl_line_buffer); /* XXX is this right */
570*6b445a62SJohn Marino
571*6b445a62SJohn Marino _rl_clear_to_eol (0); /* arg of 0 means to not use spaces */
572*6b445a62SJohn Marino
573*6b445a62SJohn Marino rl_forced_update_display ();
574*6b445a62SJohn Marino rl_display_fixed = 1;
575*6b445a62SJohn Marino
576*6b445a62SJohn Marino return 0;
577*6b445a62SJohn Marino }
578*6b445a62SJohn Marino
579*6b445a62SJohn Marino /* C-l typed to a line without quoting clears the screen, and then reprints
580*6b445a62SJohn Marino the prompt and the current input line. Given a numeric arg, redraw only
581*6b445a62SJohn Marino the current line. */
582*6b445a62SJohn Marino int
rl_clear_screen(count,key)583*6b445a62SJohn Marino rl_clear_screen (count, key)
584*6b445a62SJohn Marino int count, key;
585*6b445a62SJohn Marino {
586*6b445a62SJohn Marino if (rl_explicit_arg)
587*6b445a62SJohn Marino {
588*6b445a62SJohn Marino rl_refresh_line (count, key);
589*6b445a62SJohn Marino return 0;
590*6b445a62SJohn Marino }
591*6b445a62SJohn Marino
592*6b445a62SJohn Marino _rl_clear_screen (); /* calls termcap function to clear screen */
593*6b445a62SJohn Marino rl_forced_update_display ();
594*6b445a62SJohn Marino rl_display_fixed = 1;
595*6b445a62SJohn Marino
596*6b445a62SJohn Marino return 0;
597*6b445a62SJohn Marino }
598*6b445a62SJohn Marino
599*6b445a62SJohn Marino int
rl_skip_csi_sequence(count,key)600*6b445a62SJohn Marino rl_skip_csi_sequence (count, key)
601*6b445a62SJohn Marino int count, key;
602*6b445a62SJohn Marino {
603*6b445a62SJohn Marino int ch;
604*6b445a62SJohn Marino
605*6b445a62SJohn Marino RL_SETSTATE (RL_STATE_MOREINPUT);
606*6b445a62SJohn Marino do
607*6b445a62SJohn Marino ch = rl_read_key ();
608*6b445a62SJohn Marino while (ch >= 0x20 && ch < 0x40);
609*6b445a62SJohn Marino RL_UNSETSTATE (RL_STATE_MOREINPUT);
610*6b445a62SJohn Marino
611*6b445a62SJohn Marino return 0;
612*6b445a62SJohn Marino }
613*6b445a62SJohn Marino
614*6b445a62SJohn Marino int
rl_arrow_keys(count,c)615*6b445a62SJohn Marino rl_arrow_keys (count, c)
616*6b445a62SJohn Marino int count, c;
617*6b445a62SJohn Marino {
618*6b445a62SJohn Marino int ch;
619*6b445a62SJohn Marino
620*6b445a62SJohn Marino RL_SETSTATE(RL_STATE_MOREINPUT);
621*6b445a62SJohn Marino ch = rl_read_key ();
622*6b445a62SJohn Marino RL_UNSETSTATE(RL_STATE_MOREINPUT);
623*6b445a62SJohn Marino
624*6b445a62SJohn Marino switch (_rl_to_upper (ch))
625*6b445a62SJohn Marino {
626*6b445a62SJohn Marino case 'A':
627*6b445a62SJohn Marino rl_get_previous_history (count, ch);
628*6b445a62SJohn Marino break;
629*6b445a62SJohn Marino
630*6b445a62SJohn Marino case 'B':
631*6b445a62SJohn Marino rl_get_next_history (count, ch);
632*6b445a62SJohn Marino break;
633*6b445a62SJohn Marino
634*6b445a62SJohn Marino case 'C':
635*6b445a62SJohn Marino if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
636*6b445a62SJohn Marino rl_forward_char (count, ch);
637*6b445a62SJohn Marino else
638*6b445a62SJohn Marino rl_forward_byte (count, ch);
639*6b445a62SJohn Marino break;
640*6b445a62SJohn Marino
641*6b445a62SJohn Marino case 'D':
642*6b445a62SJohn Marino if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
643*6b445a62SJohn Marino rl_backward_char (count, ch);
644*6b445a62SJohn Marino else
645*6b445a62SJohn Marino rl_backward_byte (count, ch);
646*6b445a62SJohn Marino break;
647*6b445a62SJohn Marino
648*6b445a62SJohn Marino default:
649*6b445a62SJohn Marino rl_ding ();
650*6b445a62SJohn Marino }
651*6b445a62SJohn Marino
652*6b445a62SJohn Marino return 0;
653*6b445a62SJohn Marino }
654*6b445a62SJohn Marino
655*6b445a62SJohn Marino /* **************************************************************** */
656*6b445a62SJohn Marino /* */
657*6b445a62SJohn Marino /* Text commands */
658*6b445a62SJohn Marino /* */
659*6b445a62SJohn Marino /* **************************************************************** */
660*6b445a62SJohn Marino
661*6b445a62SJohn Marino #ifdef HANDLE_MULTIBYTE
662*6b445a62SJohn Marino static char pending_bytes[MB_LEN_MAX];
663*6b445a62SJohn Marino static int pending_bytes_length = 0;
664*6b445a62SJohn Marino static mbstate_t ps = {0};
665*6b445a62SJohn Marino #endif
666*6b445a62SJohn Marino
667*6b445a62SJohn Marino /* Insert the character C at the current location, moving point forward.
668*6b445a62SJohn Marino If C introduces a multibyte sequence, we read the whole sequence and
669*6b445a62SJohn Marino then insert the multibyte char into the line buffer. */
670*6b445a62SJohn Marino int
_rl_insert_char(count,c)671*6b445a62SJohn Marino _rl_insert_char (count, c)
672*6b445a62SJohn Marino int count, c;
673*6b445a62SJohn Marino {
674*6b445a62SJohn Marino register int i;
675*6b445a62SJohn Marino char *string;
676*6b445a62SJohn Marino #ifdef HANDLE_MULTIBYTE
677*6b445a62SJohn Marino int string_size;
678*6b445a62SJohn Marino char incoming[MB_LEN_MAX + 1];
679*6b445a62SJohn Marino int incoming_length = 0;
680*6b445a62SJohn Marino mbstate_t ps_back;
681*6b445a62SJohn Marino static int stored_count = 0;
682*6b445a62SJohn Marino #endif
683*6b445a62SJohn Marino
684*6b445a62SJohn Marino if (count <= 0)
685*6b445a62SJohn Marino return 0;
686*6b445a62SJohn Marino
687*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
688*6b445a62SJohn Marino if (MB_CUR_MAX == 1 || rl_byte_oriented)
689*6b445a62SJohn Marino {
690*6b445a62SJohn Marino incoming[0] = c;
691*6b445a62SJohn Marino incoming[1] = '\0';
692*6b445a62SJohn Marino incoming_length = 1;
693*6b445a62SJohn Marino }
694*6b445a62SJohn Marino else
695*6b445a62SJohn Marino {
696*6b445a62SJohn Marino wchar_t wc;
697*6b445a62SJohn Marino size_t ret;
698*6b445a62SJohn Marino
699*6b445a62SJohn Marino if (stored_count <= 0)
700*6b445a62SJohn Marino stored_count = count;
701*6b445a62SJohn Marino else
702*6b445a62SJohn Marino count = stored_count;
703*6b445a62SJohn Marino
704*6b445a62SJohn Marino ps_back = ps;
705*6b445a62SJohn Marino pending_bytes[pending_bytes_length++] = c;
706*6b445a62SJohn Marino ret = mbrtowc (&wc, pending_bytes, pending_bytes_length, &ps);
707*6b445a62SJohn Marino
708*6b445a62SJohn Marino if (ret == (size_t)-2)
709*6b445a62SJohn Marino {
710*6b445a62SJohn Marino /* Bytes too short to compose character, try to wait for next byte.
711*6b445a62SJohn Marino Restore the state of the byte sequence, because in this case the
712*6b445a62SJohn Marino effect of mbstate is undefined. */
713*6b445a62SJohn Marino ps = ps_back;
714*6b445a62SJohn Marino return 1;
715*6b445a62SJohn Marino }
716*6b445a62SJohn Marino else if (ret == (size_t)-1)
717*6b445a62SJohn Marino {
718*6b445a62SJohn Marino /* Invalid byte sequence for the current locale. Treat first byte
719*6b445a62SJohn Marino as a single character. */
720*6b445a62SJohn Marino incoming[0] = pending_bytes[0];
721*6b445a62SJohn Marino incoming[1] = '\0';
722*6b445a62SJohn Marino incoming_length = 1;
723*6b445a62SJohn Marino pending_bytes_length--;
724*6b445a62SJohn Marino memmove (pending_bytes, pending_bytes + 1, pending_bytes_length);
725*6b445a62SJohn Marino /* Clear the state of the byte sequence, because in this case the
726*6b445a62SJohn Marino effect of mbstate is undefined. */
727*6b445a62SJohn Marino memset (&ps, 0, sizeof (mbstate_t));
728*6b445a62SJohn Marino }
729*6b445a62SJohn Marino else if (ret == (size_t)0)
730*6b445a62SJohn Marino {
731*6b445a62SJohn Marino incoming[0] = '\0';
732*6b445a62SJohn Marino incoming_length = 0;
733*6b445a62SJohn Marino pending_bytes_length--;
734*6b445a62SJohn Marino /* Clear the state of the byte sequence, because in this case the
735*6b445a62SJohn Marino effect of mbstate is undefined. */
736*6b445a62SJohn Marino memset (&ps, 0, sizeof (mbstate_t));
737*6b445a62SJohn Marino }
738*6b445a62SJohn Marino else
739*6b445a62SJohn Marino {
740*6b445a62SJohn Marino /* We successfully read a single multibyte character. */
741*6b445a62SJohn Marino memcpy (incoming, pending_bytes, pending_bytes_length);
742*6b445a62SJohn Marino incoming[pending_bytes_length] = '\0';
743*6b445a62SJohn Marino incoming_length = pending_bytes_length;
744*6b445a62SJohn Marino pending_bytes_length = 0;
745*6b445a62SJohn Marino }
746*6b445a62SJohn Marino }
747*6b445a62SJohn Marino #endif /* HANDLE_MULTIBYTE */
748*6b445a62SJohn Marino
749*6b445a62SJohn Marino /* If we can optimize, then do it. But don't let people crash
750*6b445a62SJohn Marino readline because of extra large arguments. */
751*6b445a62SJohn Marino if (count > 1 && count <= TEXT_COUNT_MAX)
752*6b445a62SJohn Marino {
753*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
754*6b445a62SJohn Marino string_size = count * incoming_length;
755*6b445a62SJohn Marino string = (char *)xmalloc (1 + string_size);
756*6b445a62SJohn Marino
757*6b445a62SJohn Marino i = 0;
758*6b445a62SJohn Marino while (i < string_size)
759*6b445a62SJohn Marino {
760*6b445a62SJohn Marino strncpy (string + i, incoming, incoming_length);
761*6b445a62SJohn Marino i += incoming_length;
762*6b445a62SJohn Marino }
763*6b445a62SJohn Marino incoming_length = 0;
764*6b445a62SJohn Marino stored_count = 0;
765*6b445a62SJohn Marino #else /* !HANDLE_MULTIBYTE */
766*6b445a62SJohn Marino string = (char *)xmalloc (1 + count);
767*6b445a62SJohn Marino
768*6b445a62SJohn Marino for (i = 0; i < count; i++)
769*6b445a62SJohn Marino string[i] = c;
770*6b445a62SJohn Marino #endif /* !HANDLE_MULTIBYTE */
771*6b445a62SJohn Marino
772*6b445a62SJohn Marino string[i] = '\0';
773*6b445a62SJohn Marino rl_insert_text (string);
774*6b445a62SJohn Marino xfree (string);
775*6b445a62SJohn Marino
776*6b445a62SJohn Marino return 0;
777*6b445a62SJohn Marino }
778*6b445a62SJohn Marino
779*6b445a62SJohn Marino if (count > TEXT_COUNT_MAX)
780*6b445a62SJohn Marino {
781*6b445a62SJohn Marino int decreaser;
782*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
783*6b445a62SJohn Marino string_size = incoming_length * TEXT_COUNT_MAX;
784*6b445a62SJohn Marino string = (char *)xmalloc (1 + string_size);
785*6b445a62SJohn Marino
786*6b445a62SJohn Marino i = 0;
787*6b445a62SJohn Marino while (i < string_size)
788*6b445a62SJohn Marino {
789*6b445a62SJohn Marino strncpy (string + i, incoming, incoming_length);
790*6b445a62SJohn Marino i += incoming_length;
791*6b445a62SJohn Marino }
792*6b445a62SJohn Marino
793*6b445a62SJohn Marino while (count)
794*6b445a62SJohn Marino {
795*6b445a62SJohn Marino decreaser = (count > TEXT_COUNT_MAX) ? TEXT_COUNT_MAX : count;
796*6b445a62SJohn Marino string[decreaser*incoming_length] = '\0';
797*6b445a62SJohn Marino rl_insert_text (string);
798*6b445a62SJohn Marino count -= decreaser;
799*6b445a62SJohn Marino }
800*6b445a62SJohn Marino
801*6b445a62SJohn Marino xfree (string);
802*6b445a62SJohn Marino incoming_length = 0;
803*6b445a62SJohn Marino stored_count = 0;
804*6b445a62SJohn Marino #else /* !HANDLE_MULTIBYTE */
805*6b445a62SJohn Marino char str[TEXT_COUNT_MAX+1];
806*6b445a62SJohn Marino
807*6b445a62SJohn Marino for (i = 0; i < TEXT_COUNT_MAX; i++)
808*6b445a62SJohn Marino str[i] = c;
809*6b445a62SJohn Marino
810*6b445a62SJohn Marino while (count)
811*6b445a62SJohn Marino {
812*6b445a62SJohn Marino decreaser = (count > TEXT_COUNT_MAX ? TEXT_COUNT_MAX : count);
813*6b445a62SJohn Marino str[decreaser] = '\0';
814*6b445a62SJohn Marino rl_insert_text (str);
815*6b445a62SJohn Marino count -= decreaser;
816*6b445a62SJohn Marino }
817*6b445a62SJohn Marino #endif /* !HANDLE_MULTIBYTE */
818*6b445a62SJohn Marino
819*6b445a62SJohn Marino return 0;
820*6b445a62SJohn Marino }
821*6b445a62SJohn Marino
822*6b445a62SJohn Marino if (MB_CUR_MAX == 1 || rl_byte_oriented)
823*6b445a62SJohn Marino {
824*6b445a62SJohn Marino /* We are inserting a single character.
825*6b445a62SJohn Marino If there is pending input, then make a string of all of the
826*6b445a62SJohn Marino pending characters that are bound to rl_insert, and insert
827*6b445a62SJohn Marino them all. Don't do this if we're current reading input from
828*6b445a62SJohn Marino a macro. */
829*6b445a62SJohn Marino if ((RL_ISSTATE (RL_STATE_MACROINPUT) == 0) && _rl_any_typein ())
830*6b445a62SJohn Marino _rl_insert_typein (c);
831*6b445a62SJohn Marino else
832*6b445a62SJohn Marino {
833*6b445a62SJohn Marino /* Inserting a single character. */
834*6b445a62SJohn Marino char str[2];
835*6b445a62SJohn Marino
836*6b445a62SJohn Marino str[1] = '\0';
837*6b445a62SJohn Marino str[0] = c;
838*6b445a62SJohn Marino rl_insert_text (str);
839*6b445a62SJohn Marino }
840*6b445a62SJohn Marino }
841*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
842*6b445a62SJohn Marino else
843*6b445a62SJohn Marino {
844*6b445a62SJohn Marino rl_insert_text (incoming);
845*6b445a62SJohn Marino stored_count = 0;
846*6b445a62SJohn Marino }
847*6b445a62SJohn Marino #endif
848*6b445a62SJohn Marino
849*6b445a62SJohn Marino return 0;
850*6b445a62SJohn Marino }
851*6b445a62SJohn Marino
852*6b445a62SJohn Marino /* Overwrite the character at point (or next COUNT characters) with C.
853*6b445a62SJohn Marino If C introduces a multibyte character sequence, read the entire sequence
854*6b445a62SJohn Marino before starting the overwrite loop. */
855*6b445a62SJohn Marino int
_rl_overwrite_char(count,c)856*6b445a62SJohn Marino _rl_overwrite_char (count, c)
857*6b445a62SJohn Marino int count, c;
858*6b445a62SJohn Marino {
859*6b445a62SJohn Marino int i;
860*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
861*6b445a62SJohn Marino char mbkey[MB_LEN_MAX];
862*6b445a62SJohn Marino int k;
863*6b445a62SJohn Marino
864*6b445a62SJohn Marino /* Read an entire multibyte character sequence to insert COUNT times. */
865*6b445a62SJohn Marino if (count > 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0)
866*6b445a62SJohn Marino k = _rl_read_mbstring (c, mbkey, MB_LEN_MAX);
867*6b445a62SJohn Marino #endif
868*6b445a62SJohn Marino
869*6b445a62SJohn Marino rl_begin_undo_group ();
870*6b445a62SJohn Marino
871*6b445a62SJohn Marino for (i = 0; i < count; i++)
872*6b445a62SJohn Marino {
873*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
874*6b445a62SJohn Marino if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
875*6b445a62SJohn Marino rl_insert_text (mbkey);
876*6b445a62SJohn Marino else
877*6b445a62SJohn Marino #endif
878*6b445a62SJohn Marino _rl_insert_char (1, c);
879*6b445a62SJohn Marino
880*6b445a62SJohn Marino if (rl_point < rl_end)
881*6b445a62SJohn Marino rl_delete (1, c);
882*6b445a62SJohn Marino }
883*6b445a62SJohn Marino
884*6b445a62SJohn Marino rl_end_undo_group ();
885*6b445a62SJohn Marino
886*6b445a62SJohn Marino return 0;
887*6b445a62SJohn Marino }
888*6b445a62SJohn Marino
889*6b445a62SJohn Marino int
rl_insert(count,c)890*6b445a62SJohn Marino rl_insert (count, c)
891*6b445a62SJohn Marino int count, c;
892*6b445a62SJohn Marino {
893*6b445a62SJohn Marino return (rl_insert_mode == RL_IM_INSERT ? _rl_insert_char (count, c)
894*6b445a62SJohn Marino : _rl_overwrite_char (count, c));
895*6b445a62SJohn Marino }
896*6b445a62SJohn Marino
897*6b445a62SJohn Marino /* Insert the next typed character verbatim. */
898*6b445a62SJohn Marino static int
_rl_insert_next(count)899*6b445a62SJohn Marino _rl_insert_next (count)
900*6b445a62SJohn Marino int count;
901*6b445a62SJohn Marino {
902*6b445a62SJohn Marino int c;
903*6b445a62SJohn Marino
904*6b445a62SJohn Marino RL_SETSTATE(RL_STATE_MOREINPUT);
905*6b445a62SJohn Marino c = rl_read_key ();
906*6b445a62SJohn Marino RL_UNSETSTATE(RL_STATE_MOREINPUT);
907*6b445a62SJohn Marino
908*6b445a62SJohn Marino if (c < 0)
909*6b445a62SJohn Marino return -1;
910*6b445a62SJohn Marino
911*6b445a62SJohn Marino #if defined (HANDLE_SIGNALS)
912*6b445a62SJohn Marino if (RL_ISSTATE (RL_STATE_CALLBACK) == 0)
913*6b445a62SJohn Marino _rl_restore_tty_signals ();
914*6b445a62SJohn Marino #endif
915*6b445a62SJohn Marino
916*6b445a62SJohn Marino return (_rl_insert_char (count, c));
917*6b445a62SJohn Marino }
918*6b445a62SJohn Marino
919*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
920*6b445a62SJohn Marino static int
_rl_insert_next_callback(data)921*6b445a62SJohn Marino _rl_insert_next_callback (data)
922*6b445a62SJohn Marino _rl_callback_generic_arg *data;
923*6b445a62SJohn Marino {
924*6b445a62SJohn Marino int count;
925*6b445a62SJohn Marino
926*6b445a62SJohn Marino count = data->count;
927*6b445a62SJohn Marino
928*6b445a62SJohn Marino /* Deregister function, let rl_callback_read_char deallocate data */
929*6b445a62SJohn Marino _rl_callback_func = 0;
930*6b445a62SJohn Marino _rl_want_redisplay = 1;
931*6b445a62SJohn Marino
932*6b445a62SJohn Marino return _rl_insert_next (count);
933*6b445a62SJohn Marino }
934*6b445a62SJohn Marino #endif
935*6b445a62SJohn Marino
936*6b445a62SJohn Marino int
rl_quoted_insert(count,key)937*6b445a62SJohn Marino rl_quoted_insert (count, key)
938*6b445a62SJohn Marino int count, key;
939*6b445a62SJohn Marino {
940*6b445a62SJohn Marino /* Let's see...should the callback interface futz with signal handling? */
941*6b445a62SJohn Marino #if defined (HANDLE_SIGNALS)
942*6b445a62SJohn Marino if (RL_ISSTATE (RL_STATE_CALLBACK) == 0)
943*6b445a62SJohn Marino _rl_disable_tty_signals ();
944*6b445a62SJohn Marino #endif
945*6b445a62SJohn Marino
946*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
947*6b445a62SJohn Marino if (RL_ISSTATE (RL_STATE_CALLBACK))
948*6b445a62SJohn Marino {
949*6b445a62SJohn Marino _rl_callback_data = _rl_callback_data_alloc (count);
950*6b445a62SJohn Marino _rl_callback_func = _rl_insert_next_callback;
951*6b445a62SJohn Marino return (0);
952*6b445a62SJohn Marino }
953*6b445a62SJohn Marino #endif
954*6b445a62SJohn Marino
955*6b445a62SJohn Marino return _rl_insert_next (count);
956*6b445a62SJohn Marino }
957*6b445a62SJohn Marino
958*6b445a62SJohn Marino /* Insert a tab character. */
959*6b445a62SJohn Marino int
rl_tab_insert(count,key)960*6b445a62SJohn Marino rl_tab_insert (count, key)
961*6b445a62SJohn Marino int count, key;
962*6b445a62SJohn Marino {
963*6b445a62SJohn Marino return (_rl_insert_char (count, '\t'));
964*6b445a62SJohn Marino }
965*6b445a62SJohn Marino
966*6b445a62SJohn Marino /* What to do when a NEWLINE is pressed. We accept the whole line.
967*6b445a62SJohn Marino KEY is the key that invoked this command. I guess it could have
968*6b445a62SJohn Marino meaning in the future. */
969*6b445a62SJohn Marino int
rl_newline(count,key)970*6b445a62SJohn Marino rl_newline (count, key)
971*6b445a62SJohn Marino int count, key;
972*6b445a62SJohn Marino {
973*6b445a62SJohn Marino rl_done = 1;
974*6b445a62SJohn Marino
975*6b445a62SJohn Marino if (_rl_history_preserve_point)
976*6b445a62SJohn Marino _rl_history_saved_point = (rl_point == rl_end) ? -1 : rl_point;
977*6b445a62SJohn Marino
978*6b445a62SJohn Marino RL_SETSTATE(RL_STATE_DONE);
979*6b445a62SJohn Marino
980*6b445a62SJohn Marino #if defined (VI_MODE)
981*6b445a62SJohn Marino if (rl_editing_mode == vi_mode)
982*6b445a62SJohn Marino {
983*6b445a62SJohn Marino _rl_vi_done_inserting ();
984*6b445a62SJohn Marino if (_rl_vi_textmod_command (_rl_vi_last_command) == 0) /* XXX */
985*6b445a62SJohn Marino _rl_vi_reset_last ();
986*6b445a62SJohn Marino }
987*6b445a62SJohn Marino #endif /* VI_MODE */
988*6b445a62SJohn Marino
989*6b445a62SJohn Marino /* If we've been asked to erase empty lines, suppress the final update,
990*6b445a62SJohn Marino since _rl_update_final calls rl_crlf(). */
991*6b445a62SJohn Marino if (rl_erase_empty_line && rl_point == 0 && rl_end == 0)
992*6b445a62SJohn Marino return 0;
993*6b445a62SJohn Marino
994*6b445a62SJohn Marino if (_rl_echoing_p)
995*6b445a62SJohn Marino _rl_update_final ();
996*6b445a62SJohn Marino return 0;
997*6b445a62SJohn Marino }
998*6b445a62SJohn Marino
999*6b445a62SJohn Marino /* What to do for some uppercase characters, like meta characters,
1000*6b445a62SJohn Marino and some characters appearing in emacs_ctlx_keymap. This function
1001*6b445a62SJohn Marino is just a stub, you bind keys to it and the code in _rl_dispatch ()
1002*6b445a62SJohn Marino is special cased. */
1003*6b445a62SJohn Marino int
rl_do_lowercase_version(ignore1,ignore2)1004*6b445a62SJohn Marino rl_do_lowercase_version (ignore1, ignore2)
1005*6b445a62SJohn Marino int ignore1, ignore2;
1006*6b445a62SJohn Marino {
1007*6b445a62SJohn Marino return 0;
1008*6b445a62SJohn Marino }
1009*6b445a62SJohn Marino
1010*6b445a62SJohn Marino /* This is different from what vi does, so the code's not shared. Emacs
1011*6b445a62SJohn Marino rubout in overwrite mode has one oddity: it replaces a control
1012*6b445a62SJohn Marino character that's displayed as two characters (^X) with two spaces. */
1013*6b445a62SJohn Marino int
_rl_overwrite_rubout(count,key)1014*6b445a62SJohn Marino _rl_overwrite_rubout (count, key)
1015*6b445a62SJohn Marino int count, key;
1016*6b445a62SJohn Marino {
1017*6b445a62SJohn Marino int opoint;
1018*6b445a62SJohn Marino int i, l;
1019*6b445a62SJohn Marino
1020*6b445a62SJohn Marino if (rl_point == 0)
1021*6b445a62SJohn Marino {
1022*6b445a62SJohn Marino rl_ding ();
1023*6b445a62SJohn Marino return 1;
1024*6b445a62SJohn Marino }
1025*6b445a62SJohn Marino
1026*6b445a62SJohn Marino opoint = rl_point;
1027*6b445a62SJohn Marino
1028*6b445a62SJohn Marino /* L == number of spaces to insert */
1029*6b445a62SJohn Marino for (i = l = 0; i < count; i++)
1030*6b445a62SJohn Marino {
1031*6b445a62SJohn Marino rl_backward_char (1, key);
1032*6b445a62SJohn Marino l += rl_character_len (rl_line_buffer[rl_point], rl_point); /* not exactly right */
1033*6b445a62SJohn Marino }
1034*6b445a62SJohn Marino
1035*6b445a62SJohn Marino rl_begin_undo_group ();
1036*6b445a62SJohn Marino
1037*6b445a62SJohn Marino if (count > 1 || rl_explicit_arg)
1038*6b445a62SJohn Marino rl_kill_text (opoint, rl_point);
1039*6b445a62SJohn Marino else
1040*6b445a62SJohn Marino rl_delete_text (opoint, rl_point);
1041*6b445a62SJohn Marino
1042*6b445a62SJohn Marino /* Emacs puts point at the beginning of the sequence of spaces. */
1043*6b445a62SJohn Marino if (rl_point < rl_end)
1044*6b445a62SJohn Marino {
1045*6b445a62SJohn Marino opoint = rl_point;
1046*6b445a62SJohn Marino _rl_insert_char (l, ' ');
1047*6b445a62SJohn Marino rl_point = opoint;
1048*6b445a62SJohn Marino }
1049*6b445a62SJohn Marino
1050*6b445a62SJohn Marino rl_end_undo_group ();
1051*6b445a62SJohn Marino
1052*6b445a62SJohn Marino return 0;
1053*6b445a62SJohn Marino }
1054*6b445a62SJohn Marino
1055*6b445a62SJohn Marino /* Rubout the character behind point. */
1056*6b445a62SJohn Marino int
rl_rubout(count,key)1057*6b445a62SJohn Marino rl_rubout (count, key)
1058*6b445a62SJohn Marino int count, key;
1059*6b445a62SJohn Marino {
1060*6b445a62SJohn Marino if (count < 0)
1061*6b445a62SJohn Marino return (rl_delete (-count, key));
1062*6b445a62SJohn Marino
1063*6b445a62SJohn Marino if (!rl_point)
1064*6b445a62SJohn Marino {
1065*6b445a62SJohn Marino rl_ding ();
1066*6b445a62SJohn Marino return -1;
1067*6b445a62SJohn Marino }
1068*6b445a62SJohn Marino
1069*6b445a62SJohn Marino if (rl_insert_mode == RL_IM_OVERWRITE)
1070*6b445a62SJohn Marino return (_rl_overwrite_rubout (count, key));
1071*6b445a62SJohn Marino
1072*6b445a62SJohn Marino return (_rl_rubout_char (count, key));
1073*6b445a62SJohn Marino }
1074*6b445a62SJohn Marino
1075*6b445a62SJohn Marino int
_rl_rubout_char(count,key)1076*6b445a62SJohn Marino _rl_rubout_char (count, key)
1077*6b445a62SJohn Marino int count, key;
1078*6b445a62SJohn Marino {
1079*6b445a62SJohn Marino int orig_point;
1080*6b445a62SJohn Marino unsigned char c;
1081*6b445a62SJohn Marino
1082*6b445a62SJohn Marino /* Duplicated code because this is called from other parts of the library. */
1083*6b445a62SJohn Marino if (count < 0)
1084*6b445a62SJohn Marino return (rl_delete (-count, key));
1085*6b445a62SJohn Marino
1086*6b445a62SJohn Marino if (rl_point == 0)
1087*6b445a62SJohn Marino {
1088*6b445a62SJohn Marino rl_ding ();
1089*6b445a62SJohn Marino return -1;
1090*6b445a62SJohn Marino }
1091*6b445a62SJohn Marino
1092*6b445a62SJohn Marino orig_point = rl_point;
1093*6b445a62SJohn Marino if (count > 1 || rl_explicit_arg)
1094*6b445a62SJohn Marino {
1095*6b445a62SJohn Marino rl_backward_char (count, key);
1096*6b445a62SJohn Marino rl_kill_text (orig_point, rl_point);
1097*6b445a62SJohn Marino }
1098*6b445a62SJohn Marino else if (MB_CUR_MAX == 1 || rl_byte_oriented)
1099*6b445a62SJohn Marino {
1100*6b445a62SJohn Marino c = rl_line_buffer[--rl_point];
1101*6b445a62SJohn Marino rl_delete_text (rl_point, orig_point);
1102*6b445a62SJohn Marino /* The erase-at-end-of-line hack is of questionable merit now. */
1103*6b445a62SJohn Marino if (rl_point == rl_end && ISPRINT (c) && _rl_last_c_pos)
1104*6b445a62SJohn Marino {
1105*6b445a62SJohn Marino int l;
1106*6b445a62SJohn Marino l = rl_character_len (c, rl_point);
1107*6b445a62SJohn Marino _rl_erase_at_end_of_line (l);
1108*6b445a62SJohn Marino }
1109*6b445a62SJohn Marino }
1110*6b445a62SJohn Marino else
1111*6b445a62SJohn Marino {
1112*6b445a62SJohn Marino rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_NONZERO);
1113*6b445a62SJohn Marino rl_delete_text (rl_point, orig_point);
1114*6b445a62SJohn Marino }
1115*6b445a62SJohn Marino
1116*6b445a62SJohn Marino return 0;
1117*6b445a62SJohn Marino }
1118*6b445a62SJohn Marino
1119*6b445a62SJohn Marino /* Delete the character under the cursor. Given a numeric argument,
1120*6b445a62SJohn Marino kill that many characters instead. */
1121*6b445a62SJohn Marino int
rl_delete(count,key)1122*6b445a62SJohn Marino rl_delete (count, key)
1123*6b445a62SJohn Marino int count, key;
1124*6b445a62SJohn Marino {
1125*6b445a62SJohn Marino int xpoint;
1126*6b445a62SJohn Marino
1127*6b445a62SJohn Marino if (count < 0)
1128*6b445a62SJohn Marino return (_rl_rubout_char (-count, key));
1129*6b445a62SJohn Marino
1130*6b445a62SJohn Marino if (rl_point == rl_end)
1131*6b445a62SJohn Marino {
1132*6b445a62SJohn Marino rl_ding ();
1133*6b445a62SJohn Marino return -1;
1134*6b445a62SJohn Marino }
1135*6b445a62SJohn Marino
1136*6b445a62SJohn Marino if (count > 1 || rl_explicit_arg)
1137*6b445a62SJohn Marino {
1138*6b445a62SJohn Marino xpoint = rl_point;
1139*6b445a62SJohn Marino if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
1140*6b445a62SJohn Marino rl_forward_char (count, key);
1141*6b445a62SJohn Marino else
1142*6b445a62SJohn Marino rl_forward_byte (count, key);
1143*6b445a62SJohn Marino
1144*6b445a62SJohn Marino rl_kill_text (xpoint, rl_point);
1145*6b445a62SJohn Marino rl_point = xpoint;
1146*6b445a62SJohn Marino }
1147*6b445a62SJohn Marino else
1148*6b445a62SJohn Marino {
1149*6b445a62SJohn Marino xpoint = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO);
1150*6b445a62SJohn Marino rl_delete_text (rl_point, xpoint);
1151*6b445a62SJohn Marino }
1152*6b445a62SJohn Marino return 0;
1153*6b445a62SJohn Marino }
1154*6b445a62SJohn Marino
1155*6b445a62SJohn Marino /* Delete the character under the cursor, unless the insertion
1156*6b445a62SJohn Marino point is at the end of the line, in which case the character
1157*6b445a62SJohn Marino behind the cursor is deleted. COUNT is obeyed and may be used
1158*6b445a62SJohn Marino to delete forward or backward that many characters. */
1159*6b445a62SJohn Marino int
rl_rubout_or_delete(count,key)1160*6b445a62SJohn Marino rl_rubout_or_delete (count, key)
1161*6b445a62SJohn Marino int count, key;
1162*6b445a62SJohn Marino {
1163*6b445a62SJohn Marino if (rl_end != 0 && rl_point == rl_end)
1164*6b445a62SJohn Marino return (_rl_rubout_char (count, key));
1165*6b445a62SJohn Marino else
1166*6b445a62SJohn Marino return (rl_delete (count, key));
1167*6b445a62SJohn Marino }
1168*6b445a62SJohn Marino
1169*6b445a62SJohn Marino /* Delete all spaces and tabs around point. */
1170*6b445a62SJohn Marino int
rl_delete_horizontal_space(count,ignore)1171*6b445a62SJohn Marino rl_delete_horizontal_space (count, ignore)
1172*6b445a62SJohn Marino int count, ignore;
1173*6b445a62SJohn Marino {
1174*6b445a62SJohn Marino int start;
1175*6b445a62SJohn Marino
1176*6b445a62SJohn Marino while (rl_point && whitespace (rl_line_buffer[rl_point - 1]))
1177*6b445a62SJohn Marino rl_point--;
1178*6b445a62SJohn Marino
1179*6b445a62SJohn Marino start = rl_point;
1180*6b445a62SJohn Marino
1181*6b445a62SJohn Marino while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point]))
1182*6b445a62SJohn Marino rl_point++;
1183*6b445a62SJohn Marino
1184*6b445a62SJohn Marino if (start != rl_point)
1185*6b445a62SJohn Marino {
1186*6b445a62SJohn Marino rl_delete_text (start, rl_point);
1187*6b445a62SJohn Marino rl_point = start;
1188*6b445a62SJohn Marino }
1189*6b445a62SJohn Marino
1190*6b445a62SJohn Marino if (rl_point < 0)
1191*6b445a62SJohn Marino rl_point = 0;
1192*6b445a62SJohn Marino
1193*6b445a62SJohn Marino return 0;
1194*6b445a62SJohn Marino }
1195*6b445a62SJohn Marino
1196*6b445a62SJohn Marino /* Like the tcsh editing function delete-char-or-list. The eof character
1197*6b445a62SJohn Marino is caught before this is invoked, so this really does the same thing as
1198*6b445a62SJohn Marino delete-char-or-list-or-eof, as long as it's bound to the eof character. */
1199*6b445a62SJohn Marino int
rl_delete_or_show_completions(count,key)1200*6b445a62SJohn Marino rl_delete_or_show_completions (count, key)
1201*6b445a62SJohn Marino int count, key;
1202*6b445a62SJohn Marino {
1203*6b445a62SJohn Marino if (rl_end != 0 && rl_point == rl_end)
1204*6b445a62SJohn Marino return (rl_possible_completions (count, key));
1205*6b445a62SJohn Marino else
1206*6b445a62SJohn Marino return (rl_delete (count, key));
1207*6b445a62SJohn Marino }
1208*6b445a62SJohn Marino
1209*6b445a62SJohn Marino #ifndef RL_COMMENT_BEGIN_DEFAULT
1210*6b445a62SJohn Marino #define RL_COMMENT_BEGIN_DEFAULT "#"
1211*6b445a62SJohn Marino #endif
1212*6b445a62SJohn Marino
1213*6b445a62SJohn Marino /* Turn the current line into a comment in shell history.
1214*6b445a62SJohn Marino A K*rn shell style function. */
1215*6b445a62SJohn Marino int
rl_insert_comment(count,key)1216*6b445a62SJohn Marino rl_insert_comment (count, key)
1217*6b445a62SJohn Marino int count, key;
1218*6b445a62SJohn Marino {
1219*6b445a62SJohn Marino char *rl_comment_text;
1220*6b445a62SJohn Marino int rl_comment_len;
1221*6b445a62SJohn Marino
1222*6b445a62SJohn Marino rl_beg_of_line (1, key);
1223*6b445a62SJohn Marino rl_comment_text = _rl_comment_begin ? _rl_comment_begin : RL_COMMENT_BEGIN_DEFAULT;
1224*6b445a62SJohn Marino
1225*6b445a62SJohn Marino if (rl_explicit_arg == 0)
1226*6b445a62SJohn Marino rl_insert_text (rl_comment_text);
1227*6b445a62SJohn Marino else
1228*6b445a62SJohn Marino {
1229*6b445a62SJohn Marino rl_comment_len = strlen (rl_comment_text);
1230*6b445a62SJohn Marino if (STREQN (rl_comment_text, rl_line_buffer, rl_comment_len))
1231*6b445a62SJohn Marino rl_delete_text (rl_point, rl_point + rl_comment_len);
1232*6b445a62SJohn Marino else
1233*6b445a62SJohn Marino rl_insert_text (rl_comment_text);
1234*6b445a62SJohn Marino }
1235*6b445a62SJohn Marino
1236*6b445a62SJohn Marino (*rl_redisplay_function) ();
1237*6b445a62SJohn Marino rl_newline (1, '\n');
1238*6b445a62SJohn Marino
1239*6b445a62SJohn Marino return (0);
1240*6b445a62SJohn Marino }
1241*6b445a62SJohn Marino
1242*6b445a62SJohn Marino /* **************************************************************** */
1243*6b445a62SJohn Marino /* */
1244*6b445a62SJohn Marino /* Changing Case */
1245*6b445a62SJohn Marino /* */
1246*6b445a62SJohn Marino /* **************************************************************** */
1247*6b445a62SJohn Marino
1248*6b445a62SJohn Marino /* The three kinds of things that we know how to do. */
1249*6b445a62SJohn Marino #define UpCase 1
1250*6b445a62SJohn Marino #define DownCase 2
1251*6b445a62SJohn Marino #define CapCase 3
1252*6b445a62SJohn Marino
1253*6b445a62SJohn Marino /* Uppercase the word at point. */
1254*6b445a62SJohn Marino int
rl_upcase_word(count,key)1255*6b445a62SJohn Marino rl_upcase_word (count, key)
1256*6b445a62SJohn Marino int count, key;
1257*6b445a62SJohn Marino {
1258*6b445a62SJohn Marino return (rl_change_case (count, UpCase));
1259*6b445a62SJohn Marino }
1260*6b445a62SJohn Marino
1261*6b445a62SJohn Marino /* Lowercase the word at point. */
1262*6b445a62SJohn Marino int
rl_downcase_word(count,key)1263*6b445a62SJohn Marino rl_downcase_word (count, key)
1264*6b445a62SJohn Marino int count, key;
1265*6b445a62SJohn Marino {
1266*6b445a62SJohn Marino return (rl_change_case (count, DownCase));
1267*6b445a62SJohn Marino }
1268*6b445a62SJohn Marino
1269*6b445a62SJohn Marino /* Upcase the first letter, downcase the rest. */
1270*6b445a62SJohn Marino int
rl_capitalize_word(count,key)1271*6b445a62SJohn Marino rl_capitalize_word (count, key)
1272*6b445a62SJohn Marino int count, key;
1273*6b445a62SJohn Marino {
1274*6b445a62SJohn Marino return (rl_change_case (count, CapCase));
1275*6b445a62SJohn Marino }
1276*6b445a62SJohn Marino
1277*6b445a62SJohn Marino /* The meaty function.
1278*6b445a62SJohn Marino Change the case of COUNT words, performing OP on them.
1279*6b445a62SJohn Marino OP is one of UpCase, DownCase, or CapCase.
1280*6b445a62SJohn Marino If a negative argument is given, leave point where it started,
1281*6b445a62SJohn Marino otherwise, leave it where it moves to. */
1282*6b445a62SJohn Marino static int
rl_change_case(count,op)1283*6b445a62SJohn Marino rl_change_case (count, op)
1284*6b445a62SJohn Marino int count, op;
1285*6b445a62SJohn Marino {
1286*6b445a62SJohn Marino int start, next, end;
1287*6b445a62SJohn Marino int inword, c, nc, nop;
1288*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
1289*6b445a62SJohn Marino wchar_t wc, nwc;
1290*6b445a62SJohn Marino char mb[MB_LEN_MAX+1];
1291*6b445a62SJohn Marino int mlen;
1292*6b445a62SJohn Marino size_t m;
1293*6b445a62SJohn Marino mbstate_t mps;
1294*6b445a62SJohn Marino #endif
1295*6b445a62SJohn Marino
1296*6b445a62SJohn Marino start = rl_point;
1297*6b445a62SJohn Marino rl_forward_word (count, 0);
1298*6b445a62SJohn Marino end = rl_point;
1299*6b445a62SJohn Marino
1300*6b445a62SJohn Marino if (op != UpCase && op != DownCase && op != CapCase)
1301*6b445a62SJohn Marino {
1302*6b445a62SJohn Marino rl_ding ();
1303*6b445a62SJohn Marino return -1;
1304*6b445a62SJohn Marino }
1305*6b445a62SJohn Marino
1306*6b445a62SJohn Marino if (count < 0)
1307*6b445a62SJohn Marino SWAP (start, end);
1308*6b445a62SJohn Marino
1309*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
1310*6b445a62SJohn Marino memset (&mps, 0, sizeof (mbstate_t));
1311*6b445a62SJohn Marino #endif
1312*6b445a62SJohn Marino
1313*6b445a62SJohn Marino /* We are going to modify some text, so let's prepare to undo it. */
1314*6b445a62SJohn Marino rl_modifying (start, end);
1315*6b445a62SJohn Marino
1316*6b445a62SJohn Marino inword = 0;
1317*6b445a62SJohn Marino while (start < end)
1318*6b445a62SJohn Marino {
1319*6b445a62SJohn Marino c = _rl_char_value (rl_line_buffer, start);
1320*6b445a62SJohn Marino /* This assumes that the upper and lower case versions are the same width. */
1321*6b445a62SJohn Marino next = MB_NEXTCHAR (rl_line_buffer, start, 1, MB_FIND_NONZERO);
1322*6b445a62SJohn Marino
1323*6b445a62SJohn Marino if (_rl_walphabetic (c) == 0)
1324*6b445a62SJohn Marino {
1325*6b445a62SJohn Marino inword = 0;
1326*6b445a62SJohn Marino start = next;
1327*6b445a62SJohn Marino continue;
1328*6b445a62SJohn Marino }
1329*6b445a62SJohn Marino
1330*6b445a62SJohn Marino if (op == CapCase)
1331*6b445a62SJohn Marino {
1332*6b445a62SJohn Marino nop = inword ? DownCase : UpCase;
1333*6b445a62SJohn Marino inword = 1;
1334*6b445a62SJohn Marino }
1335*6b445a62SJohn Marino else
1336*6b445a62SJohn Marino nop = op;
1337*6b445a62SJohn Marino if (MB_CUR_MAX == 1 || rl_byte_oriented || isascii (c))
1338*6b445a62SJohn Marino {
1339*6b445a62SJohn Marino nc = (nop == UpCase) ? _rl_to_upper (c) : _rl_to_lower (c);
1340*6b445a62SJohn Marino rl_line_buffer[start] = nc;
1341*6b445a62SJohn Marino }
1342*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
1343*6b445a62SJohn Marino else
1344*6b445a62SJohn Marino {
1345*6b445a62SJohn Marino m = mbrtowc (&wc, rl_line_buffer + start, end - start, &mps);
1346*6b445a62SJohn Marino if (MB_INVALIDCH (m))
1347*6b445a62SJohn Marino wc = (wchar_t)rl_line_buffer[start];
1348*6b445a62SJohn Marino else if (MB_NULLWCH (m))
1349*6b445a62SJohn Marino wc = L'\0';
1350*6b445a62SJohn Marino nwc = (nop == UpCase) ? _rl_to_wupper (wc) : _rl_to_wlower (wc);
1351*6b445a62SJohn Marino if (nwc != wc) /* just skip unchanged characters */
1352*6b445a62SJohn Marino {
1353*6b445a62SJohn Marino mlen = wcrtomb (mb, nwc, &mps);
1354*6b445a62SJohn Marino if (mlen > 0)
1355*6b445a62SJohn Marino mb[mlen] = '\0';
1356*6b445a62SJohn Marino /* Assume the same width */
1357*6b445a62SJohn Marino strncpy (rl_line_buffer + start, mb, mlen);
1358*6b445a62SJohn Marino }
1359*6b445a62SJohn Marino }
1360*6b445a62SJohn Marino #endif
1361*6b445a62SJohn Marino
1362*6b445a62SJohn Marino start = next;
1363*6b445a62SJohn Marino }
1364*6b445a62SJohn Marino
1365*6b445a62SJohn Marino rl_point = end;
1366*6b445a62SJohn Marino return 0;
1367*6b445a62SJohn Marino }
1368*6b445a62SJohn Marino
1369*6b445a62SJohn Marino /* **************************************************************** */
1370*6b445a62SJohn Marino /* */
1371*6b445a62SJohn Marino /* Transposition */
1372*6b445a62SJohn Marino /* */
1373*6b445a62SJohn Marino /* **************************************************************** */
1374*6b445a62SJohn Marino
1375*6b445a62SJohn Marino /* Transpose the words at point. If point is at the end of the line,
1376*6b445a62SJohn Marino transpose the two words before point. */
1377*6b445a62SJohn Marino int
rl_transpose_words(count,key)1378*6b445a62SJohn Marino rl_transpose_words (count, key)
1379*6b445a62SJohn Marino int count, key;
1380*6b445a62SJohn Marino {
1381*6b445a62SJohn Marino char *word1, *word2;
1382*6b445a62SJohn Marino int w1_beg, w1_end, w2_beg, w2_end;
1383*6b445a62SJohn Marino int orig_point = rl_point;
1384*6b445a62SJohn Marino
1385*6b445a62SJohn Marino if (!count)
1386*6b445a62SJohn Marino return 0;
1387*6b445a62SJohn Marino
1388*6b445a62SJohn Marino /* Find the two words. */
1389*6b445a62SJohn Marino rl_forward_word (count, key);
1390*6b445a62SJohn Marino w2_end = rl_point;
1391*6b445a62SJohn Marino rl_backward_word (1, key);
1392*6b445a62SJohn Marino w2_beg = rl_point;
1393*6b445a62SJohn Marino rl_backward_word (count, key);
1394*6b445a62SJohn Marino w1_beg = rl_point;
1395*6b445a62SJohn Marino rl_forward_word (1, key);
1396*6b445a62SJohn Marino w1_end = rl_point;
1397*6b445a62SJohn Marino
1398*6b445a62SJohn Marino /* Do some check to make sure that there really are two words. */
1399*6b445a62SJohn Marino if ((w1_beg == w2_beg) || (w2_beg < w1_end))
1400*6b445a62SJohn Marino {
1401*6b445a62SJohn Marino rl_ding ();
1402*6b445a62SJohn Marino rl_point = orig_point;
1403*6b445a62SJohn Marino return -1;
1404*6b445a62SJohn Marino }
1405*6b445a62SJohn Marino
1406*6b445a62SJohn Marino /* Get the text of the words. */
1407*6b445a62SJohn Marino word1 = rl_copy_text (w1_beg, w1_end);
1408*6b445a62SJohn Marino word2 = rl_copy_text (w2_beg, w2_end);
1409*6b445a62SJohn Marino
1410*6b445a62SJohn Marino /* We are about to do many insertions and deletions. Remember them
1411*6b445a62SJohn Marino as one operation. */
1412*6b445a62SJohn Marino rl_begin_undo_group ();
1413*6b445a62SJohn Marino
1414*6b445a62SJohn Marino /* Do the stuff at word2 first, so that we don't have to worry
1415*6b445a62SJohn Marino about word1 moving. */
1416*6b445a62SJohn Marino rl_point = w2_beg;
1417*6b445a62SJohn Marino rl_delete_text (w2_beg, w2_end);
1418*6b445a62SJohn Marino rl_insert_text (word1);
1419*6b445a62SJohn Marino
1420*6b445a62SJohn Marino rl_point = w1_beg;
1421*6b445a62SJohn Marino rl_delete_text (w1_beg, w1_end);
1422*6b445a62SJohn Marino rl_insert_text (word2);
1423*6b445a62SJohn Marino
1424*6b445a62SJohn Marino /* This is exactly correct since the text before this point has not
1425*6b445a62SJohn Marino changed in length. */
1426*6b445a62SJohn Marino rl_point = w2_end;
1427*6b445a62SJohn Marino
1428*6b445a62SJohn Marino /* I think that does it. */
1429*6b445a62SJohn Marino rl_end_undo_group ();
1430*6b445a62SJohn Marino xfree (word1);
1431*6b445a62SJohn Marino xfree (word2);
1432*6b445a62SJohn Marino
1433*6b445a62SJohn Marino return 0;
1434*6b445a62SJohn Marino }
1435*6b445a62SJohn Marino
1436*6b445a62SJohn Marino /* Transpose the characters at point. If point is at the end of the line,
1437*6b445a62SJohn Marino then transpose the characters before point. */
1438*6b445a62SJohn Marino int
rl_transpose_chars(count,key)1439*6b445a62SJohn Marino rl_transpose_chars (count, key)
1440*6b445a62SJohn Marino int count, key;
1441*6b445a62SJohn Marino {
1442*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
1443*6b445a62SJohn Marino char *dummy;
1444*6b445a62SJohn Marino int i;
1445*6b445a62SJohn Marino #else
1446*6b445a62SJohn Marino char dummy[2];
1447*6b445a62SJohn Marino #endif
1448*6b445a62SJohn Marino int char_length, prev_point;
1449*6b445a62SJohn Marino
1450*6b445a62SJohn Marino if (count == 0)
1451*6b445a62SJohn Marino return 0;
1452*6b445a62SJohn Marino
1453*6b445a62SJohn Marino if (!rl_point || rl_end < 2)
1454*6b445a62SJohn Marino {
1455*6b445a62SJohn Marino rl_ding ();
1456*6b445a62SJohn Marino return -1;
1457*6b445a62SJohn Marino }
1458*6b445a62SJohn Marino
1459*6b445a62SJohn Marino rl_begin_undo_group ();
1460*6b445a62SJohn Marino
1461*6b445a62SJohn Marino if (rl_point == rl_end)
1462*6b445a62SJohn Marino {
1463*6b445a62SJohn Marino rl_point = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_NONZERO);
1464*6b445a62SJohn Marino count = 1;
1465*6b445a62SJohn Marino }
1466*6b445a62SJohn Marino
1467*6b445a62SJohn Marino prev_point = rl_point;
1468*6b445a62SJohn Marino rl_point = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_NONZERO);
1469*6b445a62SJohn Marino
1470*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
1471*6b445a62SJohn Marino char_length = prev_point - rl_point;
1472*6b445a62SJohn Marino dummy = (char *)xmalloc (char_length + 1);
1473*6b445a62SJohn Marino for (i = 0; i < char_length; i++)
1474*6b445a62SJohn Marino dummy[i] = rl_line_buffer[rl_point + i];
1475*6b445a62SJohn Marino dummy[i] = '\0';
1476*6b445a62SJohn Marino #else
1477*6b445a62SJohn Marino dummy[0] = rl_line_buffer[rl_point];
1478*6b445a62SJohn Marino dummy[char_length = 1] = '\0';
1479*6b445a62SJohn Marino #endif
1480*6b445a62SJohn Marino
1481*6b445a62SJohn Marino rl_delete_text (rl_point, rl_point + char_length);
1482*6b445a62SJohn Marino
1483*6b445a62SJohn Marino rl_point = _rl_find_next_mbchar (rl_line_buffer, rl_point, count, MB_FIND_NONZERO);
1484*6b445a62SJohn Marino
1485*6b445a62SJohn Marino _rl_fix_point (0);
1486*6b445a62SJohn Marino rl_insert_text (dummy);
1487*6b445a62SJohn Marino rl_end_undo_group ();
1488*6b445a62SJohn Marino
1489*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
1490*6b445a62SJohn Marino xfree (dummy);
1491*6b445a62SJohn Marino #endif
1492*6b445a62SJohn Marino
1493*6b445a62SJohn Marino return 0;
1494*6b445a62SJohn Marino }
1495*6b445a62SJohn Marino
1496*6b445a62SJohn Marino /* **************************************************************** */
1497*6b445a62SJohn Marino /* */
1498*6b445a62SJohn Marino /* Character Searching */
1499*6b445a62SJohn Marino /* */
1500*6b445a62SJohn Marino /* **************************************************************** */
1501*6b445a62SJohn Marino
1502*6b445a62SJohn Marino int
1503*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
_rl_char_search_internal(count,dir,smbchar,len)1504*6b445a62SJohn Marino _rl_char_search_internal (count, dir, smbchar, len)
1505*6b445a62SJohn Marino int count, dir;
1506*6b445a62SJohn Marino char *smbchar;
1507*6b445a62SJohn Marino int len;
1508*6b445a62SJohn Marino #else
1509*6b445a62SJohn Marino _rl_char_search_internal (count, dir, schar)
1510*6b445a62SJohn Marino int count, dir, schar;
1511*6b445a62SJohn Marino #endif
1512*6b445a62SJohn Marino {
1513*6b445a62SJohn Marino int pos, inc;
1514*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
1515*6b445a62SJohn Marino int prepos;
1516*6b445a62SJohn Marino #endif
1517*6b445a62SJohn Marino
1518*6b445a62SJohn Marino if (dir == 0)
1519*6b445a62SJohn Marino return -1;
1520*6b445a62SJohn Marino
1521*6b445a62SJohn Marino pos = rl_point;
1522*6b445a62SJohn Marino inc = (dir < 0) ? -1 : 1;
1523*6b445a62SJohn Marino while (count)
1524*6b445a62SJohn Marino {
1525*6b445a62SJohn Marino if ((dir < 0 && pos <= 0) || (dir > 0 && pos >= rl_end))
1526*6b445a62SJohn Marino {
1527*6b445a62SJohn Marino rl_ding ();
1528*6b445a62SJohn Marino return -1;
1529*6b445a62SJohn Marino }
1530*6b445a62SJohn Marino
1531*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
1532*6b445a62SJohn Marino pos = (inc > 0) ? _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY)
1533*6b445a62SJohn Marino : _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY);
1534*6b445a62SJohn Marino #else
1535*6b445a62SJohn Marino pos += inc;
1536*6b445a62SJohn Marino #endif
1537*6b445a62SJohn Marino do
1538*6b445a62SJohn Marino {
1539*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
1540*6b445a62SJohn Marino if (_rl_is_mbchar_matched (rl_line_buffer, pos, rl_end, smbchar, len))
1541*6b445a62SJohn Marino #else
1542*6b445a62SJohn Marino if (rl_line_buffer[pos] == schar)
1543*6b445a62SJohn Marino #endif
1544*6b445a62SJohn Marino {
1545*6b445a62SJohn Marino count--;
1546*6b445a62SJohn Marino if (dir < 0)
1547*6b445a62SJohn Marino rl_point = (dir == BTO) ? _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY)
1548*6b445a62SJohn Marino : pos;
1549*6b445a62SJohn Marino else
1550*6b445a62SJohn Marino rl_point = (dir == FTO) ? _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY)
1551*6b445a62SJohn Marino : pos;
1552*6b445a62SJohn Marino break;
1553*6b445a62SJohn Marino }
1554*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
1555*6b445a62SJohn Marino prepos = pos;
1556*6b445a62SJohn Marino #endif
1557*6b445a62SJohn Marino }
1558*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
1559*6b445a62SJohn Marino while ((dir < 0) ? (pos = _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY)) != prepos
1560*6b445a62SJohn Marino : (pos = _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY)) != prepos);
1561*6b445a62SJohn Marino #else
1562*6b445a62SJohn Marino while ((dir < 0) ? pos-- : ++pos < rl_end);
1563*6b445a62SJohn Marino #endif
1564*6b445a62SJohn Marino }
1565*6b445a62SJohn Marino return (0);
1566*6b445a62SJohn Marino }
1567*6b445a62SJohn Marino
1568*6b445a62SJohn Marino /* Search COUNT times for a character read from the current input stream.
1569*6b445a62SJohn Marino FDIR is the direction to search if COUNT is non-negative; otherwise
1570*6b445a62SJohn Marino the search goes in BDIR. So much is dependent on HANDLE_MULTIBYTE
1571*6b445a62SJohn Marino that there are two separate versions of this function. */
1572*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
1573*6b445a62SJohn Marino static int
_rl_char_search(count,fdir,bdir)1574*6b445a62SJohn Marino _rl_char_search (count, fdir, bdir)
1575*6b445a62SJohn Marino int count, fdir, bdir;
1576*6b445a62SJohn Marino {
1577*6b445a62SJohn Marino char mbchar[MB_LEN_MAX];
1578*6b445a62SJohn Marino int mb_len;
1579*6b445a62SJohn Marino
1580*6b445a62SJohn Marino mb_len = _rl_read_mbchar (mbchar, MB_LEN_MAX);
1581*6b445a62SJohn Marino
1582*6b445a62SJohn Marino if (mb_len <= 0)
1583*6b445a62SJohn Marino return -1;
1584*6b445a62SJohn Marino
1585*6b445a62SJohn Marino if (count < 0)
1586*6b445a62SJohn Marino return (_rl_char_search_internal (-count, bdir, mbchar, mb_len));
1587*6b445a62SJohn Marino else
1588*6b445a62SJohn Marino return (_rl_char_search_internal (count, fdir, mbchar, mb_len));
1589*6b445a62SJohn Marino }
1590*6b445a62SJohn Marino #else /* !HANDLE_MULTIBYTE */
1591*6b445a62SJohn Marino static int
_rl_char_search(count,fdir,bdir)1592*6b445a62SJohn Marino _rl_char_search (count, fdir, bdir)
1593*6b445a62SJohn Marino int count, fdir, bdir;
1594*6b445a62SJohn Marino {
1595*6b445a62SJohn Marino int c;
1596*6b445a62SJohn Marino
1597*6b445a62SJohn Marino RL_SETSTATE(RL_STATE_MOREINPUT);
1598*6b445a62SJohn Marino c = rl_read_key ();
1599*6b445a62SJohn Marino RL_UNSETSTATE(RL_STATE_MOREINPUT);
1600*6b445a62SJohn Marino
1601*6b445a62SJohn Marino if (c < 0)
1602*6b445a62SJohn Marino return -1;
1603*6b445a62SJohn Marino
1604*6b445a62SJohn Marino if (count < 0)
1605*6b445a62SJohn Marino return (_rl_char_search_internal (-count, bdir, c));
1606*6b445a62SJohn Marino else
1607*6b445a62SJohn Marino return (_rl_char_search_internal (count, fdir, c));
1608*6b445a62SJohn Marino }
1609*6b445a62SJohn Marino #endif /* !HANDLE_MULTIBYTE */
1610*6b445a62SJohn Marino
1611*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
1612*6b445a62SJohn Marino static int
_rl_char_search_callback(data)1613*6b445a62SJohn Marino _rl_char_search_callback (data)
1614*6b445a62SJohn Marino _rl_callback_generic_arg *data;
1615*6b445a62SJohn Marino {
1616*6b445a62SJohn Marino _rl_callback_func = 0;
1617*6b445a62SJohn Marino _rl_want_redisplay = 1;
1618*6b445a62SJohn Marino
1619*6b445a62SJohn Marino return (_rl_char_search (data->count, data->i1, data->i2));
1620*6b445a62SJohn Marino }
1621*6b445a62SJohn Marino #endif
1622*6b445a62SJohn Marino
1623*6b445a62SJohn Marino int
rl_char_search(count,key)1624*6b445a62SJohn Marino rl_char_search (count, key)
1625*6b445a62SJohn Marino int count, key;
1626*6b445a62SJohn Marino {
1627*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
1628*6b445a62SJohn Marino if (RL_ISSTATE (RL_STATE_CALLBACK))
1629*6b445a62SJohn Marino {
1630*6b445a62SJohn Marino _rl_callback_data = _rl_callback_data_alloc (count);
1631*6b445a62SJohn Marino _rl_callback_data->i1 = FFIND;
1632*6b445a62SJohn Marino _rl_callback_data->i2 = BFIND;
1633*6b445a62SJohn Marino _rl_callback_func = _rl_char_search_callback;
1634*6b445a62SJohn Marino return (0);
1635*6b445a62SJohn Marino }
1636*6b445a62SJohn Marino #endif
1637*6b445a62SJohn Marino
1638*6b445a62SJohn Marino return (_rl_char_search (count, FFIND, BFIND));
1639*6b445a62SJohn Marino }
1640*6b445a62SJohn Marino
1641*6b445a62SJohn Marino int
rl_backward_char_search(count,key)1642*6b445a62SJohn Marino rl_backward_char_search (count, key)
1643*6b445a62SJohn Marino int count, key;
1644*6b445a62SJohn Marino {
1645*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
1646*6b445a62SJohn Marino if (RL_ISSTATE (RL_STATE_CALLBACK))
1647*6b445a62SJohn Marino {
1648*6b445a62SJohn Marino _rl_callback_data = _rl_callback_data_alloc (count);
1649*6b445a62SJohn Marino _rl_callback_data->i1 = BFIND;
1650*6b445a62SJohn Marino _rl_callback_data->i2 = FFIND;
1651*6b445a62SJohn Marino _rl_callback_func = _rl_char_search_callback;
1652*6b445a62SJohn Marino return (0);
1653*6b445a62SJohn Marino }
1654*6b445a62SJohn Marino #endif
1655*6b445a62SJohn Marino
1656*6b445a62SJohn Marino return (_rl_char_search (count, BFIND, FFIND));
1657*6b445a62SJohn Marino }
1658*6b445a62SJohn Marino
1659*6b445a62SJohn Marino /* **************************************************************** */
1660*6b445a62SJohn Marino /* */
1661*6b445a62SJohn Marino /* The Mark and the Region. */
1662*6b445a62SJohn Marino /* */
1663*6b445a62SJohn Marino /* **************************************************************** */
1664*6b445a62SJohn Marino
1665*6b445a62SJohn Marino /* Set the mark at POSITION. */
1666*6b445a62SJohn Marino int
_rl_set_mark_at_pos(position)1667*6b445a62SJohn Marino _rl_set_mark_at_pos (position)
1668*6b445a62SJohn Marino int position;
1669*6b445a62SJohn Marino {
1670*6b445a62SJohn Marino if (position > rl_end)
1671*6b445a62SJohn Marino return -1;
1672*6b445a62SJohn Marino
1673*6b445a62SJohn Marino rl_mark = position;
1674*6b445a62SJohn Marino return 0;
1675*6b445a62SJohn Marino }
1676*6b445a62SJohn Marino
1677*6b445a62SJohn Marino /* A bindable command to set the mark. */
1678*6b445a62SJohn Marino int
rl_set_mark(count,key)1679*6b445a62SJohn Marino rl_set_mark (count, key)
1680*6b445a62SJohn Marino int count, key;
1681*6b445a62SJohn Marino {
1682*6b445a62SJohn Marino return (_rl_set_mark_at_pos (rl_explicit_arg ? count : rl_point));
1683*6b445a62SJohn Marino }
1684*6b445a62SJohn Marino
1685*6b445a62SJohn Marino /* Exchange the position of mark and point. */
1686*6b445a62SJohn Marino int
rl_exchange_point_and_mark(count,key)1687*6b445a62SJohn Marino rl_exchange_point_and_mark (count, key)
1688*6b445a62SJohn Marino int count, key;
1689*6b445a62SJohn Marino {
1690*6b445a62SJohn Marino if (rl_mark > rl_end)
1691*6b445a62SJohn Marino rl_mark = -1;
1692*6b445a62SJohn Marino
1693*6b445a62SJohn Marino if (rl_mark == -1)
1694*6b445a62SJohn Marino {
1695*6b445a62SJohn Marino rl_ding ();
1696*6b445a62SJohn Marino return -1;
1697*6b445a62SJohn Marino }
1698*6b445a62SJohn Marino else
1699*6b445a62SJohn Marino SWAP (rl_point, rl_mark);
1700*6b445a62SJohn Marino
1701*6b445a62SJohn Marino return 0;
1702*6b445a62SJohn Marino }
1703