1c80476e4SDavid E. O'Brien /*
2c80476e4SDavid E. O'Brien * ed.chared.c: Character editing functions.
3c80476e4SDavid E. O'Brien */
4c80476e4SDavid E. O'Brien /*-
5c80476e4SDavid E. O'Brien * Copyright (c) 1980, 1991 The Regents of the University of California.
6c80476e4SDavid E. O'Brien * All rights reserved.
7c80476e4SDavid E. O'Brien *
8c80476e4SDavid E. O'Brien * Redistribution and use in source and binary forms, with or without
9c80476e4SDavid E. O'Brien * modification, are permitted provided that the following conditions
10c80476e4SDavid E. O'Brien * are met:
11c80476e4SDavid E. O'Brien * 1. Redistributions of source code must retain the above copyright
12c80476e4SDavid E. O'Brien * notice, this list of conditions and the following disclaimer.
13c80476e4SDavid E. O'Brien * 2. Redistributions in binary form must reproduce the above copyright
14c80476e4SDavid E. O'Brien * notice, this list of conditions and the following disclaimer in the
15c80476e4SDavid E. O'Brien * documentation and/or other materials provided with the distribution.
1629301572SMark Peek * 3. Neither the name of the University nor the names of its contributors
17c80476e4SDavid E. O'Brien * may be used to endorse or promote products derived from this software
18c80476e4SDavid E. O'Brien * without specific prior written permission.
19c80476e4SDavid E. O'Brien *
20c80476e4SDavid E. O'Brien * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21c80476e4SDavid E. O'Brien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22c80476e4SDavid E. O'Brien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23c80476e4SDavid E. O'Brien * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24c80476e4SDavid E. O'Brien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25c80476e4SDavid E. O'Brien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26c80476e4SDavid E. O'Brien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27c80476e4SDavid E. O'Brien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28c80476e4SDavid E. O'Brien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29c80476e4SDavid E. O'Brien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30c80476e4SDavid E. O'Brien * SUCH DAMAGE.
31c80476e4SDavid E. O'Brien */
32c80476e4SDavid E. O'Brien /*
33c80476e4SDavid E. O'Brien Bjorn Knutsson @ Thu Jun 24 19:02:17 1999
34c80476e4SDavid E. O'Brien
35c80476e4SDavid E. O'Brien e_dabbrev_expand() did not do proper completion if quoted spaces were present
36c80476e4SDavid E. O'Brien in the string being completed. Exemple:
37c80476e4SDavid E. O'Brien
38c80476e4SDavid E. O'Brien # echo hello\ world
39c80476e4SDavid E. O'Brien hello world
40c80476e4SDavid E. O'Brien # echo h<press key bound to dabbrev-expande>
41c80476e4SDavid E. O'Brien # echo hello\<cursor>
42c80476e4SDavid E. O'Brien
43c80476e4SDavid E. O'Brien Correct behavior is:
44c80476e4SDavid E. O'Brien # echo h<press key bound to dabbrev-expande>
45c80476e4SDavid E. O'Brien # echo hello\ world<cursor>
46c80476e4SDavid E. O'Brien
47c80476e4SDavid E. O'Brien The same problem occured if spaces were present in a string withing quotation
48c80476e4SDavid E. O'Brien marks. Example:
49c80476e4SDavid E. O'Brien
50c80476e4SDavid E. O'Brien # echo "hello world"
51c80476e4SDavid E. O'Brien hello world
52c80476e4SDavid E. O'Brien # echo "h<press key bound to dabbrev-expande>
53c80476e4SDavid E. O'Brien # echo "hello<cursor>
54c80476e4SDavid E. O'Brien
55c80476e4SDavid E. O'Brien The former problem could be solved with minor modifications of c_preword()
56c80476e4SDavid E. O'Brien and c_endword(). The latter, however, required a significant rewrite of
57c80476e4SDavid E. O'Brien c_preword(), since quoted strings must be parsed from start to end to
58c80476e4SDavid E. O'Brien determine if a given character is inside or outside the quotation marks.
59c80476e4SDavid E. O'Brien
60c80476e4SDavid E. O'Brien Compare the following two strings:
61c80476e4SDavid E. O'Brien
62c80476e4SDavid E. O'Brien # echo \"" 'foo \' bar\"
63c80476e4SDavid E. O'Brien " 'foo \' bar\
64c80476e4SDavid E. O'Brien # echo '\"" 'foo \' bar\"
65c80476e4SDavid E. O'Brien \"" foo ' bar"
66c80476e4SDavid E. O'Brien
67c80476e4SDavid E. O'Brien The only difference between the two echo lines is in the first character
68c80476e4SDavid E. O'Brien after the echo command. The result is either one or three arguments.
69c80476e4SDavid E. O'Brien
70c80476e4SDavid E. O'Brien */
71c80476e4SDavid E. O'Brien
72c80476e4SDavid E. O'Brien #include "sh.h"
73c80476e4SDavid E. O'Brien #include "ed.h"
74c80476e4SDavid E. O'Brien #include "tw.h"
75c80476e4SDavid E. O'Brien #include "ed.defns.h"
76c80476e4SDavid E. O'Brien
77c80476e4SDavid E. O'Brien /* #define SDEBUG */
78c80476e4SDavid E. O'Brien
79c80476e4SDavid E. O'Brien #define TCSHOP_NOP 0x00
80c80476e4SDavid E. O'Brien #define TCSHOP_DELETE 0x01
81c80476e4SDavid E. O'Brien #define TCSHOP_INSERT 0x02
82c80476e4SDavid E. O'Brien #define TCSHOP_CHANGE 0x04
83c80476e4SDavid E. O'Brien
84c80476e4SDavid E. O'Brien #define CHAR_FWD 0
85c80476e4SDavid E. O'Brien #define CHAR_BACK 1
86c80476e4SDavid E. O'Brien
87c80476e4SDavid E. O'Brien /*
88c80476e4SDavid E. O'Brien * vi word treatment
89c80476e4SDavid E. O'Brien * from: Gert-Jan Vons <vons@cesar.crbca1.sinet.slb.com>
90c80476e4SDavid E. O'Brien */
91c80476e4SDavid E. O'Brien #define C_CLASS_WHITE 1
9219d2e3deSDmitry Chagin #define C_CLASS_WORD 2
93c80476e4SDavid E. O'Brien #define C_CLASS_OTHER 3
94c80476e4SDavid E. O'Brien
95c80476e4SDavid E. O'Brien static Char *InsertPos = InputBuf; /* Where insertion starts */
96c80476e4SDavid E. O'Brien static Char *ActionPos = 0; /* Where action begins */
97c80476e4SDavid E. O'Brien static int ActionFlag = TCSHOP_NOP; /* What delayed action to take */
98c80476e4SDavid E. O'Brien /*
99c80476e4SDavid E. O'Brien * Word search state
100c80476e4SDavid E. O'Brien */
101c80476e4SDavid E. O'Brien static int searchdir = F_UP_SEARCH_HIST; /* Direction of last search */
10245e5710bSMark Peek static struct Strbuf patbuf; /* = Strbuf_INIT; Search target */
103c80476e4SDavid E. O'Brien /*
104c80476e4SDavid E. O'Brien * Char search state
105c80476e4SDavid E. O'Brien */
106c80476e4SDavid E. O'Brien static int srch_dir = CHAR_FWD; /* Direction of last search */
107c80476e4SDavid E. O'Brien static Char srch_char = 0; /* Search target */
108c80476e4SDavid E. O'Brien
109c80476e4SDavid E. O'Brien /* all routines that start with c_ are private to this set of routines */
11045e5710bSMark Peek static void c_alternativ_key_map (int);
11145e5710bSMark Peek void c_insert (int);
11245e5710bSMark Peek void c_delafter (int);
11345e5710bSMark Peek void c_delbefore (int);
11445e5710bSMark Peek static int c_to_class (Char);
11545e5710bSMark Peek static Char *c_prev_word (Char *, Char *, int);
11645e5710bSMark Peek static Char *c_next_word (Char *, Char *, int);
11745e5710bSMark Peek static Char *c_number (Char *, int *, int);
11845e5710bSMark Peek static Char *c_expand (Char *);
119a15e6f9aSMark Peek static int c_excl (Char *);
120a15e6f9aSMark Peek static int c_substitute (void);
12145e5710bSMark Peek static void c_delfini (void);
12245e5710bSMark Peek static int c_hmatch (Char *);
12345e5710bSMark Peek static void c_hsetpat (void);
124c80476e4SDavid E. O'Brien #ifdef COMMENT
12545e5710bSMark Peek static void c_get_word (Char **, Char **);
126c80476e4SDavid E. O'Brien #endif
12745e5710bSMark Peek static Char *c_preword (Char *, Char *, int, Char *);
12845e5710bSMark Peek static Char *c_nexword (Char *, Char *, int);
12945e5710bSMark Peek static Char *c_endword (Char *, Char *, int, Char *);
13045e5710bSMark Peek static Char *c_eword (Char *, Char *, int);
13145e5710bSMark Peek static void c_push_kill (Char *, Char *);
13245e5710bSMark Peek static void c_save_inputbuf (void);
13345e5710bSMark Peek static CCRETVAL c_search_line (Char *, int);
13445e5710bSMark Peek static CCRETVAL v_repeat_srch (int);
13545e5710bSMark Peek static CCRETVAL e_inc_search (int);
13645e5710bSMark Peek #ifdef notyet
13745e5710bSMark Peek static CCRETVAL e_insert_str (Char *);
13845e5710bSMark Peek #endif
13945e5710bSMark Peek static CCRETVAL v_search (int);
14045e5710bSMark Peek static CCRETVAL v_csearch_fwd (Char, int, int);
14145e5710bSMark Peek static CCRETVAL v_action (int);
14245e5710bSMark Peek static CCRETVAL v_csearch_back (Char, int, int);
143c80476e4SDavid E. O'Brien
144c80476e4SDavid E. O'Brien static void
c_alternativ_key_map(int state)14545e5710bSMark Peek c_alternativ_key_map(int state)
146c80476e4SDavid E. O'Brien {
147c80476e4SDavid E. O'Brien switch (state) {
148c80476e4SDavid E. O'Brien case 0:
149c80476e4SDavid E. O'Brien CurrentKeyMap = CcKeyMap;
150c80476e4SDavid E. O'Brien break;
151c80476e4SDavid E. O'Brien case 1:
152c80476e4SDavid E. O'Brien CurrentKeyMap = CcAltMap;
153c80476e4SDavid E. O'Brien break;
154c80476e4SDavid E. O'Brien default:
155c80476e4SDavid E. O'Brien return;
156c80476e4SDavid E. O'Brien }
157c80476e4SDavid E. O'Brien
158c80476e4SDavid E. O'Brien AltKeyMap = (Char) state;
159c80476e4SDavid E. O'Brien }
160c80476e4SDavid E. O'Brien
1616767bd61SMark Peek void
c_insert(int num)16245e5710bSMark Peek c_insert(int num)
163c80476e4SDavid E. O'Brien {
1646767bd61SMark Peek Char *cp;
165c80476e4SDavid E. O'Brien
166c80476e4SDavid E. O'Brien if (LastChar + num >= InputLim)
167c80476e4SDavid E. O'Brien return; /* can't go past end of buffer */
168c80476e4SDavid E. O'Brien
169c80476e4SDavid E. O'Brien if (Cursor < LastChar) { /* if I must move chars */
170c80476e4SDavid E. O'Brien for (cp = LastChar; cp >= Cursor; cp--)
171c80476e4SDavid E. O'Brien cp[num] = *cp;
17223338178SMark Peek if (Mark && Mark > Cursor)
17323338178SMark Peek Mark += num;
174c80476e4SDavid E. O'Brien }
175c80476e4SDavid E. O'Brien LastChar += num;
176c80476e4SDavid E. O'Brien }
177c80476e4SDavid E. O'Brien
1783b6eaa7bSAndrey A. Chernov void
c_delafter(int num)17945e5710bSMark Peek c_delafter(int num)
180c80476e4SDavid E. O'Brien {
1816767bd61SMark Peek Char *cp, *kp = NULL;
182c80476e4SDavid E. O'Brien
183c80476e4SDavid E. O'Brien if (num > LastChar - Cursor)
184c80476e4SDavid E. O'Brien num = (int) (LastChar - Cursor); /* bounds check */
185c80476e4SDavid E. O'Brien
186c80476e4SDavid E. O'Brien if (num > 0) { /* if I can delete anything */
187c80476e4SDavid E. O'Brien if (VImode) {
188c80476e4SDavid E. O'Brien kp = UndoBuf; /* Set Up for VI undo command */
189c80476e4SDavid E. O'Brien UndoAction = TCSHOP_INSERT;
190c80476e4SDavid E. O'Brien UndoSize = num;
191c80476e4SDavid E. O'Brien UndoPtr = Cursor;
192c80476e4SDavid E. O'Brien for (cp = Cursor; cp <= LastChar; cp++) {
193c80476e4SDavid E. O'Brien *kp++ = *cp; /* Save deleted chars into undobuf */
194c80476e4SDavid E. O'Brien *cp = cp[num];
195c80476e4SDavid E. O'Brien }
196c80476e4SDavid E. O'Brien }
197c80476e4SDavid E. O'Brien else
19823338178SMark Peek for (cp = Cursor; cp + num <= LastChar; cp++)
199c80476e4SDavid E. O'Brien *cp = cp[num];
200c80476e4SDavid E. O'Brien LastChar -= num;
20145e5710bSMark Peek /* Mark was within the range of the deleted word? */
20245e5710bSMark Peek if (Mark && Mark > Cursor && Mark <= Cursor+num)
20345e5710bSMark Peek Mark = Cursor;
20445e5710bSMark Peek /* Mark after the deleted word? */
20545e5710bSMark Peek else if (Mark && Mark > Cursor)
20623338178SMark Peek Mark -= num;
207c80476e4SDavid E. O'Brien }
208c80476e4SDavid E. O'Brien #ifdef notdef
209c80476e4SDavid E. O'Brien else {
210c80476e4SDavid E. O'Brien /*
211c80476e4SDavid E. O'Brien * XXX: We don't want to do that. In emacs mode overwrite should be
212c80476e4SDavid E. O'Brien * sticky. I am not sure how that affects vi mode
213c80476e4SDavid E. O'Brien */
214c80476e4SDavid E. O'Brien inputmode = MODE_INSERT;
215c80476e4SDavid E. O'Brien }
216c80476e4SDavid E. O'Brien #endif /* notdef */
217c80476e4SDavid E. O'Brien }
218c80476e4SDavid E. O'Brien
2193b6eaa7bSAndrey A. Chernov void
c_delbefore(int num)22045e5710bSMark Peek c_delbefore(int num) /* delete before dot, with bounds checking */
221c80476e4SDavid E. O'Brien {
2226767bd61SMark Peek Char *cp, *kp = NULL;
223c80476e4SDavid E. O'Brien
224c80476e4SDavid E. O'Brien if (num > Cursor - InputBuf)
225c80476e4SDavid E. O'Brien num = (int) (Cursor - InputBuf); /* bounds check */
226c80476e4SDavid E. O'Brien
227c80476e4SDavid E. O'Brien if (num > 0) { /* if I can delete anything */
228c80476e4SDavid E. O'Brien if (VImode) {
229c80476e4SDavid E. O'Brien kp = UndoBuf; /* Set Up for VI undo command */
230c80476e4SDavid E. O'Brien UndoAction = TCSHOP_INSERT;
231c80476e4SDavid E. O'Brien UndoSize = num;
232c80476e4SDavid E. O'Brien UndoPtr = Cursor - num;
233c80476e4SDavid E. O'Brien for (cp = Cursor - num; cp <= LastChar; cp++) {
234c80476e4SDavid E. O'Brien *kp++ = *cp;
235c80476e4SDavid E. O'Brien *cp = cp[num];
236c80476e4SDavid E. O'Brien }
237c80476e4SDavid E. O'Brien }
238c80476e4SDavid E. O'Brien else
23923338178SMark Peek for (cp = Cursor - num; cp + num <= LastChar; cp++)
240c80476e4SDavid E. O'Brien *cp = cp[num];
241c80476e4SDavid E. O'Brien LastChar -= num;
24223338178SMark Peek Cursor -= num;
24345e5710bSMark Peek /* Mark was within the range of the deleted word? */
24445e5710bSMark Peek if (Mark && Mark > Cursor && Mark <= Cursor+num)
24545e5710bSMark Peek Mark = Cursor;
24645e5710bSMark Peek /* Mark after the deleted word? */
24745e5710bSMark Peek else if (Mark && Mark > Cursor)
24823338178SMark Peek Mark -= num;
249c80476e4SDavid E. O'Brien }
250c80476e4SDavid E. O'Brien }
251c80476e4SDavid E. O'Brien
252c80476e4SDavid E. O'Brien static Char *
c_preword(Char * p,Char * low,int n,Char * delim)25345e5710bSMark Peek c_preword(Char *p, Char *low, int n, Char *delim)
254c80476e4SDavid E. O'Brien {
255c80476e4SDavid E. O'Brien while (n--) {
2566767bd61SMark Peek Char *prev = low;
2576767bd61SMark Peek Char *new;
258c80476e4SDavid E. O'Brien
2596767bd61SMark Peek while (prev < p) { /* Skip initial non-word chars */
2605224c2a3SDmitry Chagin if (!Strchr(delim, *prev) || (prev > low && prev[-1] == (Char)'\\'))
261c80476e4SDavid E. O'Brien break;
262c80476e4SDavid E. O'Brien prev++;
263c80476e4SDavid E. O'Brien }
264c80476e4SDavid E. O'Brien
265c80476e4SDavid E. O'Brien new = prev;
266c80476e4SDavid E. O'Brien
267c80476e4SDavid E. O'Brien while (new < p) {
268c80476e4SDavid E. O'Brien prev = new;
2696767bd61SMark Peek new = c_endword(prev-1, p, 1, delim); /* Skip to next non-word char */
270c80476e4SDavid E. O'Brien new++; /* Step away from end of word */
2716767bd61SMark Peek while (new <= p) { /* Skip trailing non-word chars */
272*6560ac57SDmitry Chagin if (!Strchr(delim, *new) || (new > prev && new[-1] == (Char)'\\'))
273c80476e4SDavid E. O'Brien break;
274c80476e4SDavid E. O'Brien new++;
275c80476e4SDavid E. O'Brien }
276c80476e4SDavid E. O'Brien }
277c80476e4SDavid E. O'Brien
278c80476e4SDavid E. O'Brien p = prev; /* Set to previous word start */
279c80476e4SDavid E. O'Brien
280c80476e4SDavid E. O'Brien }
281c80476e4SDavid E. O'Brien if (p < low)
282c80476e4SDavid E. O'Brien p = low;
283c80476e4SDavid E. O'Brien return (p);
284c80476e4SDavid E. O'Brien }
285c80476e4SDavid E. O'Brien
286c80476e4SDavid E. O'Brien /*
287c80476e4SDavid E. O'Brien * c_to_class() returns the class of the given character.
288c80476e4SDavid E. O'Brien *
28919d2e3deSDmitry Chagin * This is used to make the c_prev_word(), c_next_word() and c_eword() functions
290c80476e4SDavid E. O'Brien * work like vi's, which classify characters. A word is a sequence of
291c80476e4SDavid E. O'Brien * characters belonging to the same class, classes being defined as
292c80476e4SDavid E. O'Brien * follows:
293c80476e4SDavid E. O'Brien *
294c80476e4SDavid E. O'Brien * 1/ whitespace
295c80476e4SDavid E. O'Brien * 2/ alphanumeric chars, + underscore
296c80476e4SDavid E. O'Brien * 3/ others
297c80476e4SDavid E. O'Brien */
298c80476e4SDavid E. O'Brien static int
c_to_class(Char ch)29945e5710bSMark Peek c_to_class(Char ch)
300c80476e4SDavid E. O'Brien {
301c80476e4SDavid E. O'Brien if (Isspace(ch))
302c80476e4SDavid E. O'Brien return C_CLASS_WHITE;
303c80476e4SDavid E. O'Brien
30419d2e3deSDmitry Chagin if (isword(ch))
30519d2e3deSDmitry Chagin return C_CLASS_WORD;
306c80476e4SDavid E. O'Brien
307c80476e4SDavid E. O'Brien return C_CLASS_OTHER;
308c80476e4SDavid E. O'Brien }
309c80476e4SDavid E. O'Brien
310c80476e4SDavid E. O'Brien static Char *
c_prev_word(Char * p,Char * low,int n)31145e5710bSMark Peek c_prev_word(Char *p, Char *low, int n)
312c80476e4SDavid E. O'Brien {
313c80476e4SDavid E. O'Brien p--;
314c80476e4SDavid E. O'Brien
315c80476e4SDavid E. O'Brien if (!VImode) {
316c80476e4SDavid E. O'Brien while (n--) {
317c80476e4SDavid E. O'Brien while ((p >= low) && !isword(*p))
318c80476e4SDavid E. O'Brien p--;
319c80476e4SDavid E. O'Brien while ((p >= low) && isword(*p))
320c80476e4SDavid E. O'Brien p--;
321c80476e4SDavid E. O'Brien }
322c80476e4SDavid E. O'Brien
323c80476e4SDavid E. O'Brien /* cp now points to one character before the word */
324c80476e4SDavid E. O'Brien p++;
325c80476e4SDavid E. O'Brien if (p < low)
326c80476e4SDavid E. O'Brien p = low;
327c80476e4SDavid E. O'Brien /* cp now points where we want it */
328c80476e4SDavid E. O'Brien return(p);
329c80476e4SDavid E. O'Brien }
330c80476e4SDavid E. O'Brien
331c80476e4SDavid E. O'Brien while (n--) {
3326767bd61SMark Peek int c_class;
333c80476e4SDavid E. O'Brien
334c80476e4SDavid E. O'Brien if (p < low)
335c80476e4SDavid E. O'Brien break;
336c80476e4SDavid E. O'Brien
337c80476e4SDavid E. O'Brien /* scan until beginning of current word (may be all whitespace!) */
338c80476e4SDavid E. O'Brien c_class = c_to_class(*p);
339c80476e4SDavid E. O'Brien while ((p >= low) && c_class == c_to_class(*p))
340c80476e4SDavid E. O'Brien p--;
341c80476e4SDavid E. O'Brien
342c80476e4SDavid E. O'Brien /* if this was a non_whitespace word, we're ready */
343c80476e4SDavid E. O'Brien if (c_class != C_CLASS_WHITE)
344c80476e4SDavid E. O'Brien continue;
345c80476e4SDavid E. O'Brien
346c80476e4SDavid E. O'Brien /* otherwise, move back to beginning of the word just found */
347c80476e4SDavid E. O'Brien c_class = c_to_class(*p);
348c80476e4SDavid E. O'Brien while ((p >= low) && c_class == c_to_class(*p))
349c80476e4SDavid E. O'Brien p--;
350c80476e4SDavid E. O'Brien }
351c80476e4SDavid E. O'Brien
352c80476e4SDavid E. O'Brien p++; /* correct overshoot */
353c80476e4SDavid E. O'Brien
354c80476e4SDavid E. O'Brien return (p);
355c80476e4SDavid E. O'Brien }
356c80476e4SDavid E. O'Brien
357c80476e4SDavid E. O'Brien static Char *
c_next_word(Char * p,Char * high,int n)35845e5710bSMark Peek c_next_word(Char *p, Char *high, int n)
359c80476e4SDavid E. O'Brien {
360c80476e4SDavid E. O'Brien if (!VImode) {
361c80476e4SDavid E. O'Brien while (n--) {
362c80476e4SDavid E. O'Brien while ((p < high) && !isword(*p))
363c80476e4SDavid E. O'Brien p++;
364c80476e4SDavid E. O'Brien while ((p < high) && isword(*p))
365c80476e4SDavid E. O'Brien p++;
366c80476e4SDavid E. O'Brien }
367c80476e4SDavid E. O'Brien if (p > high)
368c80476e4SDavid E. O'Brien p = high;
369c80476e4SDavid E. O'Brien /* p now points where we want it */
370c80476e4SDavid E. O'Brien return(p);
371c80476e4SDavid E. O'Brien }
372c80476e4SDavid E. O'Brien
373c80476e4SDavid E. O'Brien while (n--) {
3746767bd61SMark Peek int c_class;
375c80476e4SDavid E. O'Brien
376c80476e4SDavid E. O'Brien if (p >= high)
377c80476e4SDavid E. O'Brien break;
378c80476e4SDavid E. O'Brien
379c80476e4SDavid E. O'Brien /* scan until end of current word (may be all whitespace!) */
380c80476e4SDavid E. O'Brien c_class = c_to_class(*p);
381c80476e4SDavid E. O'Brien while ((p < high) && c_class == c_to_class(*p))
382c80476e4SDavid E. O'Brien p++;
383c80476e4SDavid E. O'Brien
384c80476e4SDavid E. O'Brien /* if this was all whitespace, we're ready */
385c80476e4SDavid E. O'Brien if (c_class == C_CLASS_WHITE)
386c80476e4SDavid E. O'Brien continue;
387c80476e4SDavid E. O'Brien
388c80476e4SDavid E. O'Brien /* if we've found white-space at the end of the word, skip it */
389c80476e4SDavid E. O'Brien while ((p < high) && c_to_class(*p) == C_CLASS_WHITE)
390c80476e4SDavid E. O'Brien p++;
391c80476e4SDavid E. O'Brien }
392c80476e4SDavid E. O'Brien
393c80476e4SDavid E. O'Brien p--; /* correct overshoot */
394c80476e4SDavid E. O'Brien
395c80476e4SDavid E. O'Brien return (p);
396c80476e4SDavid E. O'Brien }
397c80476e4SDavid E. O'Brien
398c80476e4SDavid E. O'Brien static Char *
c_nexword(Char * p,Char * high,int n)39945e5710bSMark Peek c_nexword(Char *p, Char *high, int n)
400c80476e4SDavid E. O'Brien {
401c80476e4SDavid E. O'Brien while (n--) {
402c80476e4SDavid E. O'Brien while ((p < high) && !Isspace(*p))
403c80476e4SDavid E. O'Brien p++;
404c80476e4SDavid E. O'Brien while ((p < high) && Isspace(*p))
405c80476e4SDavid E. O'Brien p++;
406c80476e4SDavid E. O'Brien }
407c80476e4SDavid E. O'Brien
408c80476e4SDavid E. O'Brien if (p > high)
409c80476e4SDavid E. O'Brien p = high;
410c80476e4SDavid E. O'Brien /* p now points where we want it */
411c80476e4SDavid E. O'Brien return(p);
412c80476e4SDavid E. O'Brien }
413c80476e4SDavid E. O'Brien
414c80476e4SDavid E. O'Brien /*
415c80476e4SDavid E. O'Brien * Expand-History (originally "Magic-Space") code added by
416c80476e4SDavid E. O'Brien * Ray Moody <ray@gibbs.physics.purdue.edu>
417c80476e4SDavid E. O'Brien * this is a neat, but odd, addition.
418c80476e4SDavid E. O'Brien */
419c80476e4SDavid E. O'Brien
420c80476e4SDavid E. O'Brien /*
421c80476e4SDavid E. O'Brien * c_number: Ignore character p points to, return number appearing after that.
422c80476e4SDavid E. O'Brien * A '$' by itself means a big number; "$-" is for negative; '^' means 1.
423c80476e4SDavid E. O'Brien * Return p pointing to last char used.
424c80476e4SDavid E. O'Brien */
425c80476e4SDavid E. O'Brien
426c80476e4SDavid E. O'Brien /*
427c80476e4SDavid E. O'Brien * dval is the number to subtract from for things like $-3
428c80476e4SDavid E. O'Brien */
429c80476e4SDavid E. O'Brien
430c80476e4SDavid E. O'Brien static Char *
c_number(Char * p,int * num,int dval)43145e5710bSMark Peek c_number(Char *p, int *num, int dval)
432c80476e4SDavid E. O'Brien {
4336767bd61SMark Peek int i;
4346767bd61SMark Peek int sign = 1;
435c80476e4SDavid E. O'Brien
436c80476e4SDavid E. O'Brien if (*++p == '^') {
437c80476e4SDavid E. O'Brien *num = 1;
438c80476e4SDavid E. O'Brien return(p);
439c80476e4SDavid E. O'Brien }
440c80476e4SDavid E. O'Brien if (*p == '$') {
441c80476e4SDavid E. O'Brien if (*++p != '-') {
44245e5710bSMark Peek *num = INT_MAX; /* Handle $ */
443c80476e4SDavid E. O'Brien return(--p);
444c80476e4SDavid E. O'Brien }
445c80476e4SDavid E. O'Brien sign = -1; /* Handle $- */
446c80476e4SDavid E. O'Brien ++p;
447c80476e4SDavid E. O'Brien }
448c80476e4SDavid E. O'Brien for (i = 0; *p >= '0' && *p <= '9'; i = 10 * i + *p++ - '0')
449c80476e4SDavid E. O'Brien continue;
450c80476e4SDavid E. O'Brien *num = (sign < 0 ? dval - i : i);
451c80476e4SDavid E. O'Brien return(--p);
452c80476e4SDavid E. O'Brien }
453c80476e4SDavid E. O'Brien
454c80476e4SDavid E. O'Brien /*
455c80476e4SDavid E. O'Brien * excl_expand: There is an excl to be expanded to p -- do the right thing
456c80476e4SDavid E. O'Brien * with it and return a version of p advanced over the expanded stuff. Also,
457c80476e4SDavid E. O'Brien * update tsh_cur and related things as appropriate...
458c80476e4SDavid E. O'Brien */
459c80476e4SDavid E. O'Brien
460c80476e4SDavid E. O'Brien static Char *
c_expand(Char * p)46145e5710bSMark Peek c_expand(Char *p)
462c80476e4SDavid E. O'Brien {
4636767bd61SMark Peek Char *q;
4646767bd61SMark Peek struct Hist *h = Histlist.Hnext;
4656767bd61SMark Peek struct wordent *l;
466c80476e4SDavid E. O'Brien int i, from, to, dval;
46723338178SMark Peek int all_dig;
46823338178SMark Peek int been_once = 0;
469c80476e4SDavid E. O'Brien Char *op = p;
47045e5710bSMark Peek Char *buf;
47145e5710bSMark Peek size_t buf_len;
47245e5710bSMark Peek Char *modbuf;
473c80476e4SDavid E. O'Brien
47445e5710bSMark Peek buf = NULL;
475c80476e4SDavid E. O'Brien if (!h)
476c80476e4SDavid E. O'Brien goto excl_err;
477c80476e4SDavid E. O'Brien excl_sw:
478c80476e4SDavid E. O'Brien switch (*(q = p + 1)) {
479c80476e4SDavid E. O'Brien
480c80476e4SDavid E. O'Brien case '^':
48145e5710bSMark Peek buf = expand_lex(&h->Hlex, 1, 1);
482c80476e4SDavid E. O'Brien break;
483c80476e4SDavid E. O'Brien
484c80476e4SDavid E. O'Brien case '$':
485c80476e4SDavid E. O'Brien if ((l = (h->Hlex).prev) != 0)
48645e5710bSMark Peek buf = expand_lex(l->prev->prev, 0, 0);
487c80476e4SDavid E. O'Brien break;
488c80476e4SDavid E. O'Brien
489c80476e4SDavid E. O'Brien case '*':
49045e5710bSMark Peek buf = expand_lex(&h->Hlex, 1, INT_MAX);
491c80476e4SDavid E. O'Brien break;
492c80476e4SDavid E. O'Brien
493c80476e4SDavid E. O'Brien default:
494c80476e4SDavid E. O'Brien if (been_once) { /* unknown argument */
495c80476e4SDavid E. O'Brien /* assume it's a modifier, e.g. !foo:h, and get whole cmd */
49645e5710bSMark Peek buf = expand_lex(&h->Hlex, 0, INT_MAX);
497c80476e4SDavid E. O'Brien q -= 2;
498c80476e4SDavid E. O'Brien break;
499c80476e4SDavid E. O'Brien }
500c80476e4SDavid E. O'Brien been_once = 1;
501c80476e4SDavid E. O'Brien
502c80476e4SDavid E. O'Brien if (*q == ':') /* short form: !:arg */
503c80476e4SDavid E. O'Brien --q;
504c80476e4SDavid E. O'Brien
5059ccc37e3SMark Peek if (HIST != '\0' && *q != HIST) {
506c80476e4SDavid E. O'Brien /*
507c80476e4SDavid E. O'Brien * Search for a space, tab, or colon. See if we have a number (as
508c80476e4SDavid E. O'Brien * in !1234:xyz). Remember the number.
509c80476e4SDavid E. O'Brien */
510c80476e4SDavid E. O'Brien for (i = 0, all_dig = 1;
511c80476e4SDavid E. O'Brien *q != ' ' && *q != '\t' && *q != ':' && q < Cursor; q++) {
512c80476e4SDavid E. O'Brien /*
513c80476e4SDavid E. O'Brien * PWP: !-4 is a valid history argument too, therefore the test
514c80476e4SDavid E. O'Brien * is if not a digit, or not a - as the first character.
515c80476e4SDavid E. O'Brien */
516c80476e4SDavid E. O'Brien if ((*q < '0' || *q > '9') && (*q != '-' || q != p + 1))
517c80476e4SDavid E. O'Brien all_dig = 0;
518c80476e4SDavid E. O'Brien else if (*q == '-')
519c80476e4SDavid E. O'Brien all_dig = 2;/* we are sneeky about this */
520c80476e4SDavid E. O'Brien else
521c80476e4SDavid E. O'Brien i = 10 * i + *q - '0';
522c80476e4SDavid E. O'Brien }
523c80476e4SDavid E. O'Brien --q;
524c80476e4SDavid E. O'Brien
525c80476e4SDavid E. O'Brien /*
526c80476e4SDavid E. O'Brien * If we have a number, search for event i. Otherwise, search for
527c80476e4SDavid E. O'Brien * a named event (as in !foo). (In this case, I is the length of
528c80476e4SDavid E. O'Brien * the named event).
529c80476e4SDavid E. O'Brien */
530c80476e4SDavid E. O'Brien if (all_dig) {
531c80476e4SDavid E. O'Brien if (all_dig == 2)
532c80476e4SDavid E. O'Brien i = -i; /* make it negitive */
533c80476e4SDavid E. O'Brien if (i < 0) /* if !-4 (for example) */
534c80476e4SDavid E. O'Brien i = eventno + 1 + i; /* remember: i is < 0 */
535c80476e4SDavid E. O'Brien for (; h; h = h->Hnext) {
536c80476e4SDavid E. O'Brien if (h->Hnum == i)
537c80476e4SDavid E. O'Brien break;
538c80476e4SDavid E. O'Brien }
539c80476e4SDavid E. O'Brien }
540c80476e4SDavid E. O'Brien else {
541c80476e4SDavid E. O'Brien for (i = (int) (q - p); h; h = h->Hnext) {
542c80476e4SDavid E. O'Brien if ((l = &h->Hlex) != 0) {
543c80476e4SDavid E. O'Brien if (!Strncmp(p + 1, l->next->word, (size_t) i))
544c80476e4SDavid E. O'Brien break;
545c80476e4SDavid E. O'Brien }
546c80476e4SDavid E. O'Brien }
547c80476e4SDavid E. O'Brien }
548c80476e4SDavid E. O'Brien }
549c80476e4SDavid E. O'Brien if (!h)
550c80476e4SDavid E. O'Brien goto excl_err;
551c80476e4SDavid E. O'Brien if (q[1] == ':' || q[1] == '-' || q[1] == '*' ||
552c80476e4SDavid E. O'Brien q[1] == '$' || q[1] == '^') { /* get some args */
553c80476e4SDavid E. O'Brien p = q[1] == ':' ? ++q : q;
554c80476e4SDavid E. O'Brien /*
555c80476e4SDavid E. O'Brien * Go handle !foo:*
556c80476e4SDavid E. O'Brien */
557c80476e4SDavid E. O'Brien if ((q[1] < '0' || q[1] > '9') &&
558c80476e4SDavid E. O'Brien q[1] != '-' && q[1] != '$' && q[1] != '^')
559c80476e4SDavid E. O'Brien goto excl_sw;
560c80476e4SDavid E. O'Brien /*
561c80476e4SDavid E. O'Brien * Go handle !foo:$
562c80476e4SDavid E. O'Brien */
563c80476e4SDavid E. O'Brien if (q[1] == '$' && (q[2] != '-' || q[3] < '0' || q[3] > '9'))
564c80476e4SDavid E. O'Brien goto excl_sw;
565c80476e4SDavid E. O'Brien /*
566c80476e4SDavid E. O'Brien * Count up the number of words in this event. Store it in dval.
567c80476e4SDavid E. O'Brien * Dval will be fed to number.
568c80476e4SDavid E. O'Brien */
569c80476e4SDavid E. O'Brien dval = 0;
570c80476e4SDavid E. O'Brien if ((l = h->Hlex.prev) != 0) {
571c80476e4SDavid E. O'Brien for (l = l->prev; l != h->Hlex.next; l = l->prev, dval++)
572c80476e4SDavid E. O'Brien continue;
573c80476e4SDavid E. O'Brien }
574c80476e4SDavid E. O'Brien if (!dval)
575c80476e4SDavid E. O'Brien goto excl_err;
576c80476e4SDavid E. O'Brien if (q[1] == '-')
577c80476e4SDavid E. O'Brien from = 0;
578c80476e4SDavid E. O'Brien else
579c80476e4SDavid E. O'Brien q = c_number(q, &from, dval);
580c80476e4SDavid E. O'Brien if (q[1] == '-') {
581c80476e4SDavid E. O'Brien ++q;
582c80476e4SDavid E. O'Brien if ((q[1] < '0' || q[1] > '9') && q[1] != '$')
583c80476e4SDavid E. O'Brien to = dval - 1;
584c80476e4SDavid E. O'Brien else
585c80476e4SDavid E. O'Brien q = c_number(q, &to, dval);
586c80476e4SDavid E. O'Brien }
587c80476e4SDavid E. O'Brien else if (q[1] == '*') {
588c80476e4SDavid E. O'Brien ++q;
58945e5710bSMark Peek to = INT_MAX;
590c80476e4SDavid E. O'Brien }
591c80476e4SDavid E. O'Brien else {
592c80476e4SDavid E. O'Brien to = from;
593c80476e4SDavid E. O'Brien }
594c80476e4SDavid E. O'Brien if (from < 0 || to < from)
595c80476e4SDavid E. O'Brien goto excl_err;
59645e5710bSMark Peek buf = expand_lex(&h->Hlex, from, to);
597c80476e4SDavid E. O'Brien }
59845e5710bSMark Peek else /* get whole cmd */
59945e5710bSMark Peek buf = expand_lex(&h->Hlex, 0, INT_MAX);
600c80476e4SDavid E. O'Brien break;
601c80476e4SDavid E. O'Brien }
60245e5710bSMark Peek if (buf == NULL)
60345e5710bSMark Peek buf = SAVE("");
604c80476e4SDavid E. O'Brien
605c80476e4SDavid E. O'Brien /*
606c80476e4SDavid E. O'Brien * Apply modifiers, if any.
607c80476e4SDavid E. O'Brien */
608c80476e4SDavid E. O'Brien if (q[1] == ':') {
60945e5710bSMark Peek modbuf = buf;
610c80476e4SDavid E. O'Brien while (q[1] == ':' && modbuf != NULL) {
611c80476e4SDavid E. O'Brien switch (q[2]) {
612c80476e4SDavid E. O'Brien case 'r':
613c80476e4SDavid E. O'Brien case 'e':
614c80476e4SDavid E. O'Brien case 'h':
615c80476e4SDavid E. O'Brien case 't':
616c80476e4SDavid E. O'Brien case 'q':
617c80476e4SDavid E. O'Brien case 'x':
618c80476e4SDavid E. O'Brien case 'u':
619c80476e4SDavid E. O'Brien case 'l':
62045e5710bSMark Peek if ((modbuf = domod(buf, (int) q[2])) != NULL) {
62145e5710bSMark Peek xfree(buf);
62245e5710bSMark Peek buf = modbuf;
623c80476e4SDavid E. O'Brien }
624c80476e4SDavid E. O'Brien ++q;
625c80476e4SDavid E. O'Brien break;
626c80476e4SDavid E. O'Brien
627c80476e4SDavid E. O'Brien case 'a':
628c80476e4SDavid E. O'Brien case 'g':
629c80476e4SDavid E. O'Brien /* Not implemented; this needs to be done before expanding
630c80476e4SDavid E. O'Brien * lex. We don't have the words available to us anymore.
631c80476e4SDavid E. O'Brien */
632c80476e4SDavid E. O'Brien ++q;
633c80476e4SDavid E. O'Brien break;
634c80476e4SDavid E. O'Brien
635c80476e4SDavid E. O'Brien case 'p':
636c80476e4SDavid E. O'Brien /* Ok */
637c80476e4SDavid E. O'Brien ++q;
638c80476e4SDavid E. O'Brien break;
639c80476e4SDavid E. O'Brien
640c80476e4SDavid E. O'Brien case '\0':
641c80476e4SDavid E. O'Brien break;
642c80476e4SDavid E. O'Brien
643c80476e4SDavid E. O'Brien default:
644c80476e4SDavid E. O'Brien ++q;
645c80476e4SDavid E. O'Brien break;
646c80476e4SDavid E. O'Brien }
647c80476e4SDavid E. O'Brien if (q[1])
648c80476e4SDavid E. O'Brien ++q;
649c80476e4SDavid E. O'Brien }
650c80476e4SDavid E. O'Brien }
651c80476e4SDavid E. O'Brien
65245e5710bSMark Peek buf_len = Strlen(buf);
653c80476e4SDavid E. O'Brien /*
65445e5710bSMark Peek * Now replace the text from op to q inclusive with the text from buf.
655c80476e4SDavid E. O'Brien */
656c80476e4SDavid E. O'Brien q++;
657c80476e4SDavid E. O'Brien
658c80476e4SDavid E. O'Brien /*
659c80476e4SDavid E. O'Brien * Now replace text non-inclusively like a real CS major!
660c80476e4SDavid E. O'Brien */
66145e5710bSMark Peek if (LastChar + buf_len - (q - op) >= InputLim)
662c80476e4SDavid E. O'Brien goto excl_err;
66345e5710bSMark Peek (void) memmove(op + buf_len, q, (LastChar - q) * sizeof(Char));
66445e5710bSMark Peek LastChar += buf_len - (q - op);
66545e5710bSMark Peek Cursor += buf_len - (q - op);
66645e5710bSMark Peek (void) memcpy(op, buf, buf_len * sizeof(Char));
667c80476e4SDavid E. O'Brien *LastChar = '\0';
66845e5710bSMark Peek xfree(buf);
66945e5710bSMark Peek return op + buf_len;
670c80476e4SDavid E. O'Brien excl_err:
67145e5710bSMark Peek xfree(buf);
672c80476e4SDavid E. O'Brien SoundBeep();
673c80476e4SDavid E. O'Brien return(op + 1);
674c80476e4SDavid E. O'Brien }
675c80476e4SDavid E. O'Brien
676c80476e4SDavid E. O'Brien /*
677c80476e4SDavid E. O'Brien * c_excl: An excl has been found at point p -- back up and find some white
678c80476e4SDavid E. O'Brien * space (or the beginning of the buffer) and properly expand all the excl's
679c80476e4SDavid E. O'Brien * from there up to the current cursor position. We also avoid (trying to)
680c80476e4SDavid E. O'Brien * expanding '>!'
681a15e6f9aSMark Peek * Returns number of expansions attempted (doesn't matter whether they succeeded
682a15e6f9aSMark Peek * or not).
683c80476e4SDavid E. O'Brien */
684c80476e4SDavid E. O'Brien
685a15e6f9aSMark Peek static int
c_excl(Char * p)68645e5710bSMark Peek c_excl(Char *p)
687c80476e4SDavid E. O'Brien {
6886767bd61SMark Peek int i;
6896767bd61SMark Peek Char *q;
690a15e6f9aSMark Peek int nr_exp;
691c80476e4SDavid E. O'Brien
692c80476e4SDavid E. O'Brien /*
693c80476e4SDavid E. O'Brien * if />[SPC TAB]*![SPC TAB]/, back up p to just after the >. otherwise,
694c80476e4SDavid E. O'Brien * back p up to just before the current word.
695c80476e4SDavid E. O'Brien */
696c80476e4SDavid E. O'Brien if ((p[1] == ' ' || p[1] == '\t') &&
697c80476e4SDavid E. O'Brien (p[-1] == ' ' || p[-1] == '\t' || p[-1] == '>')) {
698c80476e4SDavid E. O'Brien for (q = p - 1; q > InputBuf && (*q == ' ' || *q == '\t'); --q)
699c80476e4SDavid E. O'Brien continue;
700c80476e4SDavid E. O'Brien if (*q == '>')
701c80476e4SDavid E. O'Brien ++p;
702c80476e4SDavid E. O'Brien }
703c80476e4SDavid E. O'Brien else {
704c80476e4SDavid E. O'Brien while (*p != ' ' && *p != '\t' && p > InputBuf)
705c80476e4SDavid E. O'Brien --p;
706c80476e4SDavid E. O'Brien }
707c80476e4SDavid E. O'Brien
708c80476e4SDavid E. O'Brien /*
709c80476e4SDavid E. O'Brien * Forever: Look for history char. (Stop looking when we find the cursor.)
710a15e6f9aSMark Peek * Count backslashes. If odd, skip history char. Expand if even number of
711a15e6f9aSMark Peek * backslashes.
712c80476e4SDavid E. O'Brien */
713a15e6f9aSMark Peek nr_exp = 0;
714c80476e4SDavid E. O'Brien for (;;) {
7159ccc37e3SMark Peek if (HIST != '\0')
716c80476e4SDavid E. O'Brien while (*p != HIST && p < Cursor)
717c80476e4SDavid E. O'Brien ++p;
718c80476e4SDavid E. O'Brien for (i = 1; (p - i) >= InputBuf && p[-i] == '\\'; i++)
719c80476e4SDavid E. O'Brien continue;
720c80476e4SDavid E. O'Brien if (i % 2 == 0)
721c80476e4SDavid E. O'Brien ++p;
722a15e6f9aSMark Peek if (p >= Cursor) /* all done */
723a15e6f9aSMark Peek return nr_exp;
724a15e6f9aSMark Peek if (i % 2 == 1) {
725c80476e4SDavid E. O'Brien p = c_expand(p);
726a15e6f9aSMark Peek ++nr_exp;
727c80476e4SDavid E. O'Brien }
728c80476e4SDavid E. O'Brien }
729a15e6f9aSMark Peek }
730c80476e4SDavid E. O'Brien
731a15e6f9aSMark Peek
732a15e6f9aSMark Peek static int
c_substitute(void)73345e5710bSMark Peek c_substitute(void)
734c80476e4SDavid E. O'Brien {
7356767bd61SMark Peek Char *p;
736a15e6f9aSMark Peek int nr_exp;
737c80476e4SDavid E. O'Brien
738c80476e4SDavid E. O'Brien /*
739c80476e4SDavid E. O'Brien * Start p out one character before the cursor. Move it backwards looking
740c80476e4SDavid E. O'Brien * for white space, the beginning of the line, or a history character.
741c80476e4SDavid E. O'Brien */
742c80476e4SDavid E. O'Brien for (p = Cursor - 1;
7439ccc37e3SMark Peek p > InputBuf && *p != ' ' && *p != '\t' && *p && *p != HIST; --p)
744c80476e4SDavid E. O'Brien continue;
745c80476e4SDavid E. O'Brien
746c80476e4SDavid E. O'Brien /*
747c80476e4SDavid E. O'Brien * If we found a history character, go expand it.
748c80476e4SDavid E. O'Brien */
74955b903e2SDmitry Chagin if (p >= InputBuf && HIST != '\0' && *p == HIST)
750a15e6f9aSMark Peek nr_exp = c_excl(p);
751a15e6f9aSMark Peek else
752a15e6f9aSMark Peek nr_exp = 0;
753c80476e4SDavid E. O'Brien Refresh();
754a15e6f9aSMark Peek
755a15e6f9aSMark Peek return nr_exp;
756c80476e4SDavid E. O'Brien }
757c80476e4SDavid E. O'Brien
758c80476e4SDavid E. O'Brien static void
c_delfini(void)75945e5710bSMark Peek c_delfini(void) /* Finish up delete action */
760c80476e4SDavid E. O'Brien {
7616767bd61SMark Peek int Size;
762c80476e4SDavid E. O'Brien
763c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_INSERT)
764c80476e4SDavid E. O'Brien c_alternativ_key_map(0);
765c80476e4SDavid E. O'Brien
766c80476e4SDavid E. O'Brien ActionFlag = TCSHOP_NOP;
767c80476e4SDavid E. O'Brien
768c80476e4SDavid E. O'Brien if (ActionPos == 0)
769c80476e4SDavid E. O'Brien return;
770c80476e4SDavid E. O'Brien
771c80476e4SDavid E. O'Brien UndoAction = TCSHOP_INSERT;
772c80476e4SDavid E. O'Brien
773c80476e4SDavid E. O'Brien if (Cursor > ActionPos) {
774c80476e4SDavid E. O'Brien Size = (int) (Cursor-ActionPos);
775c80476e4SDavid E. O'Brien c_delbefore(Size);
776c80476e4SDavid E. O'Brien RefCursor();
777c80476e4SDavid E. O'Brien }
778c80476e4SDavid E. O'Brien else if (Cursor < ActionPos) {
779c80476e4SDavid E. O'Brien Size = (int)(ActionPos-Cursor);
780c80476e4SDavid E. O'Brien c_delafter(Size);
781c80476e4SDavid E. O'Brien }
782c80476e4SDavid E. O'Brien else {
783c80476e4SDavid E. O'Brien Size = 1;
784c80476e4SDavid E. O'Brien c_delafter(Size);
785c80476e4SDavid E. O'Brien }
786c80476e4SDavid E. O'Brien UndoPtr = Cursor;
787c80476e4SDavid E. O'Brien UndoSize = Size;
788c80476e4SDavid E. O'Brien }
789c80476e4SDavid E. O'Brien
790c80476e4SDavid E. O'Brien static Char *
c_endword(Char * p,Char * high,int n,Char * delim)79145e5710bSMark Peek c_endword(Char *p, Char *high, int n, Char *delim)
792c80476e4SDavid E. O'Brien {
79323338178SMark Peek Char inquote = 0;
794c80476e4SDavid E. O'Brien p++;
795c80476e4SDavid E. O'Brien
796c80476e4SDavid E. O'Brien while (n--) {
7976767bd61SMark Peek while (p < high) { /* Skip non-word chars */
7985224c2a3SDmitry Chagin if (!Strchr(delim, *p) || p[-1] == (Char)'\\')
799c80476e4SDavid E. O'Brien break;
800c80476e4SDavid E. O'Brien p++;
801c80476e4SDavid E. O'Brien }
802c80476e4SDavid E. O'Brien while (p < high) { /* Skip string */
803c80476e4SDavid E. O'Brien if ((*p == (Char)'\'' || *p == (Char)'"')) { /* Quotation marks? */
8045224c2a3SDmitry Chagin if (inquote || p[-1] != (Char)'\\') { /* Should it be honored? */
805c80476e4SDavid E. O'Brien if (inquote == 0) inquote = *p;
806c80476e4SDavid E. O'Brien else if (inquote == *p) inquote = 0;
807c80476e4SDavid E. O'Brien }
808c80476e4SDavid E. O'Brien }
8096767bd61SMark Peek /* Break if unquoted non-word char */
8105224c2a3SDmitry Chagin if (!inquote && Strchr(delim, *p) && p[-1] != (Char)'\\')
811c80476e4SDavid E. O'Brien break;
812c80476e4SDavid E. O'Brien p++;
813c80476e4SDavid E. O'Brien }
814c80476e4SDavid E. O'Brien }
815c80476e4SDavid E. O'Brien
816c80476e4SDavid E. O'Brien p--;
817c80476e4SDavid E. O'Brien return(p);
818c80476e4SDavid E. O'Brien }
819c80476e4SDavid E. O'Brien
820c80476e4SDavid E. O'Brien
821c80476e4SDavid E. O'Brien static Char *
c_eword(Char * p,Char * high,int n)82245e5710bSMark Peek c_eword(Char *p, Char *high, int n)
823c80476e4SDavid E. O'Brien {
824c80476e4SDavid E. O'Brien p++;
825c80476e4SDavid E. O'Brien
826c80476e4SDavid E. O'Brien while (n--) {
82719d2e3deSDmitry Chagin int c_class;
82819d2e3deSDmitry Chagin
82919d2e3deSDmitry Chagin if (p >= high)
83019d2e3deSDmitry Chagin break;
83119d2e3deSDmitry Chagin
83219d2e3deSDmitry Chagin /* scan until end of current word (may be all whitespace!) */
83319d2e3deSDmitry Chagin c_class = c_to_class(*p);
83419d2e3deSDmitry Chagin while ((p < high) && c_class == c_to_class(*p))
835c80476e4SDavid E. O'Brien p++;
836c80476e4SDavid E. O'Brien
83719d2e3deSDmitry Chagin /* if this was a non_whitespace word, we're ready */
83819d2e3deSDmitry Chagin if (c_class != C_CLASS_WHITE)
83919d2e3deSDmitry Chagin continue;
84019d2e3deSDmitry Chagin
84119d2e3deSDmitry Chagin /* otherwise, move to the end of the word just found */
84219d2e3deSDmitry Chagin c_class = c_to_class(*p);
84319d2e3deSDmitry Chagin while ((p < high) && c_class == c_to_class(*p))
844c80476e4SDavid E. O'Brien p++;
845c80476e4SDavid E. O'Brien }
846c80476e4SDavid E. O'Brien
847c80476e4SDavid E. O'Brien p--;
848c80476e4SDavid E. O'Brien return(p);
849c80476e4SDavid E. O'Brien }
850c80476e4SDavid E. O'Brien
8516767bd61SMark Peek /* Set the max length of the kill ring */
8526767bd61SMark Peek void
SetKillRing(int max)85345e5710bSMark Peek SetKillRing(int max)
8546767bd61SMark Peek {
8556767bd61SMark Peek CStr *new;
8566767bd61SMark Peek int count, i, j;
8576767bd61SMark Peek
8586767bd61SMark Peek if (max < 1)
8596767bd61SMark Peek max = 1; /* no ring, but always one buffer */
8606767bd61SMark Peek if (max == KillRingMax)
8616767bd61SMark Peek return;
86245e5710bSMark Peek new = xcalloc(max, sizeof(CStr));
8636767bd61SMark Peek if (KillRing != NULL) {
8646767bd61SMark Peek if (KillRingLen != 0) {
8656767bd61SMark Peek if (max >= KillRingLen) {
8666767bd61SMark Peek count = KillRingLen;
8676767bd61SMark Peek j = KillPos;
8686767bd61SMark Peek } else {
8696767bd61SMark Peek count = max;
8706767bd61SMark Peek j = (KillPos - count + KillRingLen) % KillRingLen;
8716767bd61SMark Peek }
8726767bd61SMark Peek for (i = 0; i < KillRingLen; i++) {
8736767bd61SMark Peek if (i < count) /* copy latest */
8746767bd61SMark Peek new[i] = KillRing[j];
8756767bd61SMark Peek else /* free the others */
8766767bd61SMark Peek xfree(KillRing[j].buf);
8776767bd61SMark Peek j = (j + 1) % KillRingLen;
8786767bd61SMark Peek }
8796767bd61SMark Peek KillRingLen = count;
8806767bd61SMark Peek KillPos = count % max;
8816767bd61SMark Peek YankPos = count - 1;
8826767bd61SMark Peek }
8836767bd61SMark Peek xfree(KillRing);
8846767bd61SMark Peek }
8856767bd61SMark Peek KillRing = new;
8866767bd61SMark Peek KillRingMax = max;
8876767bd61SMark Peek }
8886767bd61SMark Peek
8896767bd61SMark Peek /* Push string from start upto (but not including) end onto kill ring */
8906767bd61SMark Peek static void
c_push_kill(Char * start,Char * end)89145e5710bSMark Peek c_push_kill(Char *start, Char *end)
8926767bd61SMark Peek {
8936767bd61SMark Peek CStr save, *pos;
8946767bd61SMark Peek Char *dp, *cp, *kp;
8956767bd61SMark Peek int len = end - start, i, j, k;
8966767bd61SMark Peek
8976767bd61SMark Peek /* Check for duplicates? */
8986767bd61SMark Peek if (KillRingLen > 0 && (dp = varval(STRkilldup)) != STRNULL) {
8996767bd61SMark Peek YankPos = (KillPos - 1 + KillRingLen) % KillRingLen;
9006767bd61SMark Peek if (eq(dp, STRerase)) { /* erase earlier one (actually move up) */
9016767bd61SMark Peek j = YankPos;
9026767bd61SMark Peek for (i = 0; i < KillRingLen; i++) {
9036767bd61SMark Peek if (Strncmp(KillRing[j].buf, start, (size_t) len) == 0 &&
9046767bd61SMark Peek KillRing[j].buf[len] == '\0') {
9056767bd61SMark Peek save = KillRing[j];
9066767bd61SMark Peek for ( ; i > 0; i--) {
9076767bd61SMark Peek k = j;
9086767bd61SMark Peek j = (j + 1) % KillRingLen;
9096767bd61SMark Peek KillRing[k] = KillRing[j];
9106767bd61SMark Peek }
9116767bd61SMark Peek KillRing[j] = save;
9126767bd61SMark Peek return;
9136767bd61SMark Peek }
9146767bd61SMark Peek j = (j - 1 + KillRingLen) % KillRingLen;
9156767bd61SMark Peek }
9166767bd61SMark Peek } else if (eq(dp, STRall)) { /* skip if any earlier */
9176767bd61SMark Peek for (i = 0; i < KillRingLen; i++)
9186767bd61SMark Peek if (Strncmp(KillRing[i].buf, start, (size_t) len) == 0 &&
9196767bd61SMark Peek KillRing[i].buf[len] == '\0')
9206767bd61SMark Peek return;
9216767bd61SMark Peek } else if (eq(dp, STRprev)) { /* skip if immediately previous */
9226767bd61SMark Peek j = YankPos;
9236767bd61SMark Peek if (Strncmp(KillRing[j].buf, start, (size_t) len) == 0 &&
9246767bd61SMark Peek KillRing[j].buf[len] == '\0')
9256767bd61SMark Peek return;
9266767bd61SMark Peek }
9276767bd61SMark Peek }
9286767bd61SMark Peek
9296767bd61SMark Peek /* No duplicate, go ahead and push */
9306767bd61SMark Peek len++; /* need space for '\0' */
9316767bd61SMark Peek YankPos = KillPos;
9326767bd61SMark Peek if (KillRingLen < KillRingMax)
9336767bd61SMark Peek KillRingLen++;
9346767bd61SMark Peek pos = &KillRing[KillPos];
9356767bd61SMark Peek KillPos = (KillPos + 1) % KillRingMax;
9366767bd61SMark Peek if (pos->len < len) {
93745e5710bSMark Peek pos->buf = xrealloc(pos->buf, len * sizeof(Char));
9386767bd61SMark Peek pos->len = len;
9396767bd61SMark Peek }
9406767bd61SMark Peek cp = start;
9416767bd61SMark Peek kp = pos->buf;
9426767bd61SMark Peek while (cp < end)
9436767bd61SMark Peek *kp++ = *cp++;
9446767bd61SMark Peek *kp = '\0';
9456767bd61SMark Peek }
9466767bd61SMark Peek
94745e5710bSMark Peek /* Save InputBuf etc in SavedBuf etc for restore after cmd exec */
94845e5710bSMark Peek static void
c_save_inputbuf(void)94919d2e3deSDmitry Chagin c_save_inputbuf(void)
95045e5710bSMark Peek {
95145e5710bSMark Peek SavedBuf.len = 0;
95245e5710bSMark Peek Strbuf_append(&SavedBuf, InputBuf);
95345e5710bSMark Peek Strbuf_terminate(&SavedBuf);
95445e5710bSMark Peek LastSaved = LastChar - InputBuf;
95545e5710bSMark Peek CursSaved = Cursor - InputBuf;
95645e5710bSMark Peek HistSaved = Hist_num;
95745e5710bSMark Peek RestoreSaved = 1;
95845e5710bSMark Peek }
95945e5710bSMark Peek
96045e5710bSMark Peek CCRETVAL
GetHistLine(void)96119d2e3deSDmitry Chagin GetHistLine(void)
962c80476e4SDavid E. O'Brien {
963c80476e4SDavid E. O'Brien struct Hist *hp;
964c80476e4SDavid E. O'Brien int h;
965c80476e4SDavid E. O'Brien
966c80476e4SDavid E. O'Brien if (Hist_num == 0) { /* if really the current line */
96745e5710bSMark Peek if (HistBuf.s != NULL)
96845e5710bSMark Peek copyn(InputBuf, HistBuf.s, INBUFSIZE);/*FIXBUF*/
96945e5710bSMark Peek else
97045e5710bSMark Peek *InputBuf = '\0';
97145e5710bSMark Peek LastChar = InputBuf + HistBuf.len;
972c80476e4SDavid E. O'Brien
973c80476e4SDavid E. O'Brien #ifdef KSHVI
974c80476e4SDavid E. O'Brien if (VImode)
975c80476e4SDavid E. O'Brien Cursor = InputBuf;
976c80476e4SDavid E. O'Brien else
977c80476e4SDavid E. O'Brien #endif /* KSHVI */
978c80476e4SDavid E. O'Brien Cursor = LastChar;
979c80476e4SDavid E. O'Brien
980c80476e4SDavid E. O'Brien return(CC_REFRESH);
981c80476e4SDavid E. O'Brien }
982c80476e4SDavid E. O'Brien
983c80476e4SDavid E. O'Brien hp = Histlist.Hnext;
984c80476e4SDavid E. O'Brien if (hp == NULL)
985c80476e4SDavid E. O'Brien return(CC_ERROR);
986c80476e4SDavid E. O'Brien
987c80476e4SDavid E. O'Brien for (h = 1; h < Hist_num; h++) {
988c80476e4SDavid E. O'Brien if ((hp->Hnext) == NULL) {
989c80476e4SDavid E. O'Brien Hist_num = h;
990c80476e4SDavid E. O'Brien return(CC_ERROR);
991c80476e4SDavid E. O'Brien }
992c80476e4SDavid E. O'Brien hp = hp->Hnext;
993c80476e4SDavid E. O'Brien }
994c80476e4SDavid E. O'Brien
995c80476e4SDavid E. O'Brien if (HistLit && hp->histline) {
99645e5710bSMark Peek copyn(InputBuf, hp->histline, INBUFSIZE);/*FIXBUF*/
997c80476e4SDavid E. O'Brien CurrentHistLit = 1;
998c80476e4SDavid E. O'Brien }
999c80476e4SDavid E. O'Brien else {
100045e5710bSMark Peek Char *p;
100145e5710bSMark Peek
100245e5710bSMark Peek p = sprlex(&hp->Hlex);
100345e5710bSMark Peek copyn(InputBuf, p, sizeof(InputBuf) / sizeof(Char));/*FIXBUF*/
100445e5710bSMark Peek xfree(p);
1005c80476e4SDavid E. O'Brien CurrentHistLit = 0;
1006c80476e4SDavid E. O'Brien }
100745e5710bSMark Peek LastChar = Strend(InputBuf);
1008c80476e4SDavid E. O'Brien
1009c80476e4SDavid E. O'Brien if (LastChar > InputBuf) {
1010c80476e4SDavid E. O'Brien if (LastChar[-1] == '\n')
1011c80476e4SDavid E. O'Brien LastChar--;
1012c80476e4SDavid E. O'Brien #if 0
1013c80476e4SDavid E. O'Brien if (LastChar[-1] == ' ')
1014c80476e4SDavid E. O'Brien LastChar--;
1015c80476e4SDavid E. O'Brien #endif
1016c80476e4SDavid E. O'Brien if (LastChar < InputBuf)
1017c80476e4SDavid E. O'Brien LastChar = InputBuf;
1018c80476e4SDavid E. O'Brien }
1019c80476e4SDavid E. O'Brien
1020c80476e4SDavid E. O'Brien #ifdef KSHVI
1021c80476e4SDavid E. O'Brien if (VImode)
1022c80476e4SDavid E. O'Brien Cursor = InputBuf;
1023c80476e4SDavid E. O'Brien else
1024c80476e4SDavid E. O'Brien #endif /* KSHVI */
1025c80476e4SDavid E. O'Brien Cursor = LastChar;
1026c80476e4SDavid E. O'Brien
1027c80476e4SDavid E. O'Brien return(CC_REFRESH);
1028c80476e4SDavid E. O'Brien }
1029c80476e4SDavid E. O'Brien
1030c80476e4SDavid E. O'Brien static CCRETVAL
c_search_line(Char * pattern,int dir)103145e5710bSMark Peek c_search_line(Char *pattern, int dir)
1032c80476e4SDavid E. O'Brien {
1033c80476e4SDavid E. O'Brien Char *cp;
103445e5710bSMark Peek size_t len;
1035c80476e4SDavid E. O'Brien
103645e5710bSMark Peek len = Strlen(pattern);
1037c80476e4SDavid E. O'Brien
1038c80476e4SDavid E. O'Brien if (dir == F_UP_SEARCH_HIST) {
1039c80476e4SDavid E. O'Brien for (cp = Cursor; cp >= InputBuf; cp--)
104045e5710bSMark Peek if (Strncmp(cp, pattern, len) == 0 ||
1041c80476e4SDavid E. O'Brien Gmatch(cp, pattern)) {
1042c80476e4SDavid E. O'Brien Cursor = cp;
1043c80476e4SDavid E. O'Brien return(CC_NORM);
1044c80476e4SDavid E. O'Brien }
1045c80476e4SDavid E. O'Brien return(CC_ERROR);
1046c80476e4SDavid E. O'Brien } else {
1047c80476e4SDavid E. O'Brien for (cp = Cursor; *cp != '\0' && cp < InputLim; cp++)
104845e5710bSMark Peek if (Strncmp(cp, pattern, len) == 0 ||
1049c80476e4SDavid E. O'Brien Gmatch(cp, pattern)) {
1050c80476e4SDavid E. O'Brien Cursor = cp;
1051c80476e4SDavid E. O'Brien return(CC_NORM);
1052c80476e4SDavid E. O'Brien }
1053c80476e4SDavid E. O'Brien return(CC_ERROR);
1054c80476e4SDavid E. O'Brien }
1055c80476e4SDavid E. O'Brien }
1056c80476e4SDavid E. O'Brien
1057c80476e4SDavid E. O'Brien static CCRETVAL
e_inc_search(int dir)105845e5710bSMark Peek e_inc_search(int dir)
1059c80476e4SDavid E. O'Brien {
106045e5710bSMark Peek static const Char STRfwd[] = { 'f', 'w', 'd', '\0' },
1061c80476e4SDavid E. O'Brien STRbck[] = { 'b', 'c', 'k', '\0' };
1062c80476e4SDavid E. O'Brien static Char pchar = ':'; /* ':' = normal, '?' = failed */
1063c80476e4SDavid E. O'Brien static Char endcmd[2];
106445e5710bSMark Peek const Char *cp;
106545e5710bSMark Peek Char ch,
1066c80476e4SDavid E. O'Brien *oldCursor = Cursor,
1067c80476e4SDavid E. O'Brien oldpchar = pchar;
1068c80476e4SDavid E. O'Brien CCRETVAL ret = CC_NORM;
1069c80476e4SDavid E. O'Brien int oldHist_num = Hist_num,
107045e5710bSMark Peek oldpatlen = patbuf.len,
1071c80476e4SDavid E. O'Brien newdir = dir,
1072c80476e4SDavid E. O'Brien done, redo;
1073c80476e4SDavid E. O'Brien
107445e5710bSMark Peek if (LastChar + sizeof(STRfwd)/sizeof(Char) + 2 + patbuf.len >= InputLim)
1075c80476e4SDavid E. O'Brien return(CC_ERROR);
1076c80476e4SDavid E. O'Brien
1077c80476e4SDavid E. O'Brien for (;;) {
1078c80476e4SDavid E. O'Brien
107945e5710bSMark Peek if (patbuf.len == 0) { /* first round */
1080c80476e4SDavid E. O'Brien pchar = ':';
108145e5710bSMark Peek Strbuf_append1(&patbuf, '*');
1082c80476e4SDavid E. O'Brien }
1083c80476e4SDavid E. O'Brien done = redo = 0;
1084c80476e4SDavid E. O'Brien *LastChar++ = '\n';
1085c80476e4SDavid E. O'Brien for (cp = newdir == F_UP_SEARCH_HIST ? STRbck : STRfwd;
1086c80476e4SDavid E. O'Brien *cp; *LastChar++ = *cp++)
1087c80476e4SDavid E. O'Brien continue;
1088c80476e4SDavid E. O'Brien *LastChar++ = pchar;
108945e5710bSMark Peek for (cp = &patbuf.s[1]; cp < &patbuf.s[patbuf.len];
109045e5710bSMark Peek *LastChar++ = *cp++)
1091c80476e4SDavid E. O'Brien continue;
1092c80476e4SDavid E. O'Brien *LastChar = '\0';
109345e5710bSMark Peek if (adrof(STRhighlight) && pchar == ':') {
109445e5710bSMark Peek /* if the no-glob-search patch is applied, remove the - 1 below */
109545e5710bSMark Peek IncMatchLen = patbuf.len - 1;
109645e5710bSMark Peek ClearLines();
109745e5710bSMark Peek ClearDisp();
109845e5710bSMark Peek }
1099c80476e4SDavid E. O'Brien Refresh();
1100c80476e4SDavid E. O'Brien
1101c80476e4SDavid E. O'Brien if (GetNextChar(&ch) != 1)
1102c80476e4SDavid E. O'Brien return(e_send_eof(0));
1103c80476e4SDavid E. O'Brien
1104cc698b49SBrooks Davis switch (GetCmdChar(ch)) {
1105c80476e4SDavid E. O'Brien case F_INSERT:
1106c80476e4SDavid E. O'Brien case F_DIGIT:
1107c80476e4SDavid E. O'Brien case F_MAGIC_SPACE:
110845e5710bSMark Peek if (LastChar + 1 >= InputLim) /*FIXBUF*/
1109c80476e4SDavid E. O'Brien SoundBeep();
1110c80476e4SDavid E. O'Brien else {
111145e5710bSMark Peek Strbuf_append1(&patbuf, ch);
1112c80476e4SDavid E. O'Brien *LastChar++ = ch;
1113c80476e4SDavid E. O'Brien *LastChar = '\0';
1114c80476e4SDavid E. O'Brien Refresh();
1115c80476e4SDavid E. O'Brien }
1116c80476e4SDavid E. O'Brien break;
1117c80476e4SDavid E. O'Brien
1118c80476e4SDavid E. O'Brien case F_INC_FWD:
1119c80476e4SDavid E. O'Brien newdir = F_DOWN_SEARCH_HIST;
1120c80476e4SDavid E. O'Brien redo++;
1121c80476e4SDavid E. O'Brien break;
1122c80476e4SDavid E. O'Brien
1123c80476e4SDavid E. O'Brien case F_INC_BACK:
1124c80476e4SDavid E. O'Brien newdir = F_UP_SEARCH_HIST;
1125c80476e4SDavid E. O'Brien redo++;
1126c80476e4SDavid E. O'Brien break;
1127c80476e4SDavid E. O'Brien
1128c80476e4SDavid E. O'Brien case F_DELPREV:
112945e5710bSMark Peek if (patbuf.len > 1)
1130c80476e4SDavid E. O'Brien done++;
1131c80476e4SDavid E. O'Brien else
1132c80476e4SDavid E. O'Brien SoundBeep();
1133c80476e4SDavid E. O'Brien break;
1134c80476e4SDavid E. O'Brien
1135c80476e4SDavid E. O'Brien default:
113645e5710bSMark Peek switch (ASC(ch)) {
1137c80476e4SDavid E. O'Brien case 0007: /* ^G: Abort */
1138c80476e4SDavid E. O'Brien ret = CC_ERROR;
1139c80476e4SDavid E. O'Brien done++;
1140c80476e4SDavid E. O'Brien break;
1141c80476e4SDavid E. O'Brien
1142c80476e4SDavid E. O'Brien case 0027: /* ^W: Append word */
1143c80476e4SDavid E. O'Brien /* No can do if globbing characters in pattern */
114445e5710bSMark Peek for (cp = &patbuf.s[1]; ; cp++)
114545e5710bSMark Peek if (cp >= &patbuf.s[patbuf.len]) {
114645e5710bSMark Peek Cursor += patbuf.len - 1;
1147c80476e4SDavid E. O'Brien cp = c_next_word(Cursor, LastChar, 1);
1148c80476e4SDavid E. O'Brien while (Cursor < cp && *Cursor != '\n') {
114945e5710bSMark Peek if (LastChar + 1 >= InputLim) {/*FIXBUF*/
1150c80476e4SDavid E. O'Brien SoundBeep();
1151c80476e4SDavid E. O'Brien break;
1152c80476e4SDavid E. O'Brien }
115345e5710bSMark Peek Strbuf_append1(&patbuf, *Cursor);
1154c80476e4SDavid E. O'Brien *LastChar++ = *Cursor++;
1155c80476e4SDavid E. O'Brien }
1156c80476e4SDavid E. O'Brien Cursor = oldCursor;
1157c80476e4SDavid E. O'Brien *LastChar = '\0';
1158c80476e4SDavid E. O'Brien Refresh();
1159c80476e4SDavid E. O'Brien break;
1160c80476e4SDavid E. O'Brien } else if (isglob(*cp)) {
1161c80476e4SDavid E. O'Brien SoundBeep();
1162c80476e4SDavid E. O'Brien break;
1163c80476e4SDavid E. O'Brien }
1164c80476e4SDavid E. O'Brien break;
1165c80476e4SDavid E. O'Brien
1166c80476e4SDavid E. O'Brien default: /* Terminate and execute cmd */
1167c80476e4SDavid E. O'Brien endcmd[0] = ch;
1168c80476e4SDavid E. O'Brien PushMacro(endcmd);
1169c80476e4SDavid E. O'Brien /*FALLTHROUGH*/
1170c80476e4SDavid E. O'Brien
1171c80476e4SDavid E. O'Brien case 0033: /* ESC: Terminate */
1172c80476e4SDavid E. O'Brien ret = CC_REFRESH;
1173c80476e4SDavid E. O'Brien done++;
1174c80476e4SDavid E. O'Brien break;
1175c80476e4SDavid E. O'Brien }
1176c80476e4SDavid E. O'Brien break;
1177c80476e4SDavid E. O'Brien }
1178c80476e4SDavid E. O'Brien
1179c80476e4SDavid E. O'Brien while (LastChar > InputBuf && *LastChar != '\n')
1180c80476e4SDavid E. O'Brien *LastChar-- = '\0';
1181c80476e4SDavid E. O'Brien *LastChar = '\0';
1182c80476e4SDavid E. O'Brien
1183c80476e4SDavid E. O'Brien if (!done) {
1184c80476e4SDavid E. O'Brien
1185c80476e4SDavid E. O'Brien /* Can't search if unmatched '[' */
118645e5710bSMark Peek for (cp = &patbuf.s[patbuf.len - 1], ch = ']'; cp > patbuf.s; cp--)
1187c80476e4SDavid E. O'Brien if (*cp == '[' || *cp == ']') {
1188c80476e4SDavid E. O'Brien ch = *cp;
1189c80476e4SDavid E. O'Brien break;
1190c80476e4SDavid E. O'Brien }
1191c80476e4SDavid E. O'Brien
119245e5710bSMark Peek if (patbuf.len > 1 && ch != '[') {
1193c80476e4SDavid E. O'Brien if (redo && newdir == dir) {
1194c80476e4SDavid E. O'Brien if (pchar == '?') { /* wrap around */
119545e5710bSMark Peek Hist_num = newdir == F_UP_SEARCH_HIST ? 0 : INT_MAX;
119645e5710bSMark Peek if (GetHistLine() == CC_ERROR)
1197c80476e4SDavid E. O'Brien /* Hist_num was fixed by first call */
119845e5710bSMark Peek (void) GetHistLine();
1199c80476e4SDavid E. O'Brien Cursor = newdir == F_UP_SEARCH_HIST ?
1200c80476e4SDavid E. O'Brien LastChar : InputBuf;
1201c80476e4SDavid E. O'Brien } else
1202c80476e4SDavid E. O'Brien Cursor += newdir == F_UP_SEARCH_HIST ? -1 : 1;
1203c80476e4SDavid E. O'Brien }
120445e5710bSMark Peek Strbuf_append1(&patbuf, '*');
120545e5710bSMark Peek Strbuf_terminate(&patbuf);
1206c80476e4SDavid E. O'Brien if (Cursor < InputBuf || Cursor > LastChar ||
120745e5710bSMark Peek (ret = c_search_line(&patbuf.s[1], newdir)) == CC_ERROR) {
1208c80476e4SDavid E. O'Brien LastCmd = (KEYCMD) newdir; /* avoid c_hsetpat */
1209c80476e4SDavid E. O'Brien ret = newdir == F_UP_SEARCH_HIST ?
1210c80476e4SDavid E. O'Brien e_up_search_hist(0) : e_down_search_hist(0);
1211c80476e4SDavid E. O'Brien if (ret != CC_ERROR) {
1212c80476e4SDavid E. O'Brien Cursor = newdir == F_UP_SEARCH_HIST ?
1213c80476e4SDavid E. O'Brien LastChar : InputBuf;
121445e5710bSMark Peek (void) c_search_line(&patbuf.s[1], newdir);
1215c80476e4SDavid E. O'Brien }
1216c80476e4SDavid E. O'Brien }
121745e5710bSMark Peek patbuf.s[--patbuf.len] = '\0';
1218c80476e4SDavid E. O'Brien if (ret == CC_ERROR) {
1219c80476e4SDavid E. O'Brien SoundBeep();
1220c80476e4SDavid E. O'Brien if (Hist_num != oldHist_num) {
1221c80476e4SDavid E. O'Brien Hist_num = oldHist_num;
122245e5710bSMark Peek if (GetHistLine() == CC_ERROR)
1223c80476e4SDavid E. O'Brien return(CC_ERROR);
1224c80476e4SDavid E. O'Brien }
1225c80476e4SDavid E. O'Brien Cursor = oldCursor;
1226c80476e4SDavid E. O'Brien pchar = '?';
1227c80476e4SDavid E. O'Brien } else {
1228c80476e4SDavid E. O'Brien pchar = ':';
1229c80476e4SDavid E. O'Brien }
1230c80476e4SDavid E. O'Brien }
1231c80476e4SDavid E. O'Brien
1232c80476e4SDavid E. O'Brien ret = e_inc_search(newdir);
1233c80476e4SDavid E. O'Brien
1234c80476e4SDavid E. O'Brien if (ret == CC_ERROR && pchar == '?' && oldpchar == ':') {
1235c80476e4SDavid E. O'Brien /* break abort of failed search at last non-failed */
1236c80476e4SDavid E. O'Brien ret = CC_NORM;
1237c80476e4SDavid E. O'Brien }
1238c80476e4SDavid E. O'Brien
1239c80476e4SDavid E. O'Brien }
1240c80476e4SDavid E. O'Brien
1241c80476e4SDavid E. O'Brien if (ret == CC_NORM || (ret == CC_ERROR && oldpatlen == 0)) {
1242c80476e4SDavid E. O'Brien /* restore on normal return or error exit */
1243c80476e4SDavid E. O'Brien pchar = oldpchar;
124445e5710bSMark Peek patbuf.len = oldpatlen;
1245c80476e4SDavid E. O'Brien if (Hist_num != oldHist_num) {
1246c80476e4SDavid E. O'Brien Hist_num = oldHist_num;
124745e5710bSMark Peek if (GetHistLine() == CC_ERROR)
1248c80476e4SDavid E. O'Brien return(CC_ERROR);
1249c80476e4SDavid E. O'Brien }
1250c80476e4SDavid E. O'Brien Cursor = oldCursor;
1251c80476e4SDavid E. O'Brien if (ret == CC_ERROR)
1252c80476e4SDavid E. O'Brien Refresh();
1253c80476e4SDavid E. O'Brien }
1254c80476e4SDavid E. O'Brien if (done || ret != CC_NORM)
1255c80476e4SDavid E. O'Brien return(ret);
1256c80476e4SDavid E. O'Brien
1257c80476e4SDavid E. O'Brien }
1258c80476e4SDavid E. O'Brien
1259c80476e4SDavid E. O'Brien }
1260c80476e4SDavid E. O'Brien
1261c80476e4SDavid E. O'Brien static CCRETVAL
v_search(int dir)126245e5710bSMark Peek v_search(int dir)
1263c80476e4SDavid E. O'Brien {
126445e5710bSMark Peek struct Strbuf tmpbuf = Strbuf_INIT;
1265c80476e4SDavid E. O'Brien Char ch;
126645e5710bSMark Peek Char *oldbuf;
1267c80476e4SDavid E. O'Brien Char *oldlc, *oldc;
1268c80476e4SDavid E. O'Brien
126945e5710bSMark Peek cleanup_push(&tmpbuf, Strbuf_cleanup);
127045e5710bSMark Peek oldbuf = Strsave(InputBuf);
127145e5710bSMark Peek cleanup_push(oldbuf, xfree);
1272c80476e4SDavid E. O'Brien oldlc = LastChar;
1273c80476e4SDavid E. O'Brien oldc = Cursor;
127445e5710bSMark Peek Strbuf_append1(&tmpbuf, '*');
1275c80476e4SDavid E. O'Brien
1276c80476e4SDavid E. O'Brien InputBuf[0] = '\0';
1277c80476e4SDavid E. O'Brien LastChar = InputBuf;
1278c80476e4SDavid E. O'Brien Cursor = InputBuf;
1279c80476e4SDavid E. O'Brien searchdir = dir;
1280c80476e4SDavid E. O'Brien
1281c80476e4SDavid E. O'Brien c_insert(2); /* prompt + '\n' */
1282c80476e4SDavid E. O'Brien *Cursor++ = '\n';
1283c80476e4SDavid E. O'Brien *Cursor++ = dir == F_UP_SEARCH_HIST ? '?' : '/';
1284c80476e4SDavid E. O'Brien Refresh();
1285c80476e4SDavid E. O'Brien for (ch = 0;ch == 0;) {
128645e5710bSMark Peek if (GetNextChar(&ch) != 1) {
128745e5710bSMark Peek cleanup_until(&tmpbuf);
1288c80476e4SDavid E. O'Brien return(e_send_eof(0));
128945e5710bSMark Peek }
1290c80476e4SDavid E. O'Brien switch (ASC(ch)) {
1291c80476e4SDavid E. O'Brien case 0010: /* Delete and backspace */
1292c80476e4SDavid E. O'Brien case 0177:
129345e5710bSMark Peek if (tmpbuf.len > 1) {
1294c80476e4SDavid E. O'Brien *Cursor-- = '\0';
1295c80476e4SDavid E. O'Brien LastChar = Cursor;
129645e5710bSMark Peek tmpbuf.len--;
1297c80476e4SDavid E. O'Brien }
1298c80476e4SDavid E. O'Brien else {
129945e5710bSMark Peek copyn(InputBuf, oldbuf, INBUFSIZE);/*FIXBUF*/
1300c80476e4SDavid E. O'Brien LastChar = oldlc;
1301c80476e4SDavid E. O'Brien Cursor = oldc;
130245e5710bSMark Peek cleanup_until(&tmpbuf);
1303c80476e4SDavid E. O'Brien return(CC_REFRESH);
1304c80476e4SDavid E. O'Brien }
1305c80476e4SDavid E. O'Brien Refresh();
1306c80476e4SDavid E. O'Brien ch = 0;
1307c80476e4SDavid E. O'Brien break;
1308c80476e4SDavid E. O'Brien
1309c80476e4SDavid E. O'Brien case 0033: /* ESC */
13103b6eaa7bSAndrey A. Chernov #ifdef IS_ASCII
1311c80476e4SDavid E. O'Brien case '\r': /* Newline */
1312c80476e4SDavid E. O'Brien case '\n':
1313c80476e4SDavid E. O'Brien #else
13143b6eaa7bSAndrey A. Chernov case '\012': /* ASCII Line feed */
13153b6eaa7bSAndrey A. Chernov case '\015': /* ASCII (or EBCDIC) Return */
1316c80476e4SDavid E. O'Brien #endif
1317c80476e4SDavid E. O'Brien break;
1318c80476e4SDavid E. O'Brien
1319c80476e4SDavid E. O'Brien default:
132045e5710bSMark Peek Strbuf_append1(&tmpbuf, ch);
1321c80476e4SDavid E. O'Brien *Cursor++ = ch;
1322c80476e4SDavid E. O'Brien LastChar = Cursor;
1323c80476e4SDavid E. O'Brien Refresh();
1324c80476e4SDavid E. O'Brien ch = 0;
1325c80476e4SDavid E. O'Brien break;
1326c80476e4SDavid E. O'Brien }
1327c80476e4SDavid E. O'Brien }
132845e5710bSMark Peek cleanup_until(oldbuf);
1329c80476e4SDavid E. O'Brien
133045e5710bSMark Peek if (tmpbuf.len == 1) {
1331c80476e4SDavid E. O'Brien /*
1332c80476e4SDavid E. O'Brien * Use the old pattern, but wild-card it.
1333c80476e4SDavid E. O'Brien */
133445e5710bSMark Peek if (patbuf.len == 0) {
1335c80476e4SDavid E. O'Brien InputBuf[0] = '\0';
1336c80476e4SDavid E. O'Brien LastChar = InputBuf;
1337c80476e4SDavid E. O'Brien Cursor = InputBuf;
1338c80476e4SDavid E. O'Brien Refresh();
133945e5710bSMark Peek cleanup_until(&tmpbuf);
1340c80476e4SDavid E. O'Brien return(CC_ERROR);
1341c80476e4SDavid E. O'Brien }
134245e5710bSMark Peek if (patbuf.s[0] != '*') {
134345e5710bSMark Peek oldbuf = Strsave(patbuf.s);
134445e5710bSMark Peek patbuf.len = 0;
134545e5710bSMark Peek Strbuf_append1(&patbuf, '*');
134645e5710bSMark Peek Strbuf_append(&patbuf, oldbuf);
134745e5710bSMark Peek xfree(oldbuf);
134845e5710bSMark Peek Strbuf_append1(&patbuf, '*');
134945e5710bSMark Peek Strbuf_terminate(&patbuf);
1350c80476e4SDavid E. O'Brien }
1351c80476e4SDavid E. O'Brien }
1352c80476e4SDavid E. O'Brien else {
135345e5710bSMark Peek Strbuf_append1(&tmpbuf, '*');
135445e5710bSMark Peek Strbuf_terminate(&tmpbuf);
135545e5710bSMark Peek patbuf.len = 0;
135645e5710bSMark Peek Strbuf_append(&patbuf, tmpbuf.s);
135745e5710bSMark Peek Strbuf_terminate(&patbuf);
1358c80476e4SDavid E. O'Brien }
135945e5710bSMark Peek cleanup_until(&tmpbuf);
1360c80476e4SDavid E. O'Brien LastCmd = (KEYCMD) dir; /* avoid c_hsetpat */
1361c80476e4SDavid E. O'Brien Cursor = LastChar = InputBuf;
1362c80476e4SDavid E. O'Brien if ((dir == F_UP_SEARCH_HIST ? e_up_search_hist(0) :
1363c80476e4SDavid E. O'Brien e_down_search_hist(0)) == CC_ERROR) {
1364c80476e4SDavid E. O'Brien Refresh();
1365c80476e4SDavid E. O'Brien return(CC_ERROR);
1366c80476e4SDavid E. O'Brien }
1367c80476e4SDavid E. O'Brien else {
136845e5710bSMark Peek if (ASC(ch) == 0033) {
1369c80476e4SDavid E. O'Brien Refresh();
1370c80476e4SDavid E. O'Brien *LastChar++ = '\n';
1371c80476e4SDavid E. O'Brien *LastChar = '\0';
1372c80476e4SDavid E. O'Brien PastBottom();
1373c80476e4SDavid E. O'Brien return(CC_NEWLINE);
1374c80476e4SDavid E. O'Brien }
1375c80476e4SDavid E. O'Brien else
1376c80476e4SDavid E. O'Brien return(CC_REFRESH);
1377c80476e4SDavid E. O'Brien }
1378c80476e4SDavid E. O'Brien }
1379c80476e4SDavid E. O'Brien
1380c80476e4SDavid E. O'Brien /*
1381c80476e4SDavid E. O'Brien * semi-PUBLIC routines. Any routine that is of type CCRETVAL is an
1382c80476e4SDavid E. O'Brien * entry point, called from the CcKeyMap indirected into the
1383c80476e4SDavid E. O'Brien * CcFuncTbl array.
1384c80476e4SDavid E. O'Brien */
1385c80476e4SDavid E. O'Brien
1386c80476e4SDavid E. O'Brien /*ARGSUSED*/
1387c80476e4SDavid E. O'Brien CCRETVAL
v_cmd_mode(Char c)138845e5710bSMark Peek v_cmd_mode(Char c)
1389c80476e4SDavid E. O'Brien {
1390c80476e4SDavid E. O'Brien USE(c);
1391c80476e4SDavid E. O'Brien InsertPos = 0;
1392c80476e4SDavid E. O'Brien ActionFlag = TCSHOP_NOP; /* [Esc] cancels pending action */
1393c80476e4SDavid E. O'Brien ActionPos = 0;
1394c80476e4SDavid E. O'Brien DoingArg = 0;
1395c80476e4SDavid E. O'Brien if (UndoPtr > Cursor)
1396c80476e4SDavid E. O'Brien UndoSize = (int)(UndoPtr - Cursor);
1397c80476e4SDavid E. O'Brien else
1398c80476e4SDavid E. O'Brien UndoSize = (int)(Cursor - UndoPtr);
1399c80476e4SDavid E. O'Brien
1400c80476e4SDavid E. O'Brien inputmode = MODE_INSERT;
1401c80476e4SDavid E. O'Brien c_alternativ_key_map(1);
1402c80476e4SDavid E. O'Brien #ifdef notdef
1403c80476e4SDavid E. O'Brien /*
1404c80476e4SDavid E. O'Brien * We don't want to move the cursor, because all the editing
1405c80476e4SDavid E. O'Brien * commands don't include the character under the cursor.
1406c80476e4SDavid E. O'Brien */
1407c80476e4SDavid E. O'Brien if (Cursor > InputBuf)
1408c80476e4SDavid E. O'Brien Cursor--;
1409c80476e4SDavid E. O'Brien #endif
1410c80476e4SDavid E. O'Brien RefCursor();
1411c80476e4SDavid E. O'Brien return(CC_NORM);
1412c80476e4SDavid E. O'Brien }
1413c80476e4SDavid E. O'Brien
1414c80476e4SDavid E. O'Brien /*ARGSUSED*/
1415c80476e4SDavid E. O'Brien CCRETVAL
e_unassigned(Char c)141645e5710bSMark Peek e_unassigned(Char c)
1417c80476e4SDavid E. O'Brien { /* bound to keys that arn't really assigned */
1418c80476e4SDavid E. O'Brien USE(c);
1419c80476e4SDavid E. O'Brien SoundBeep();
1420c80476e4SDavid E. O'Brien flush();
1421c80476e4SDavid E. O'Brien return(CC_NORM);
1422c80476e4SDavid E. O'Brien }
1423c80476e4SDavid E. O'Brien
142445e5710bSMark Peek #ifdef notyet
142523338178SMark Peek static CCRETVAL
e_insert_str(Char * c)142645e5710bSMark Peek e_insert_str(Char *c)
142723338178SMark Peek {
142823338178SMark Peek int i, n;
142923338178SMark Peek
143023338178SMark Peek n = Strlen(c);
143123338178SMark Peek if (LastChar + Argument * n >= InputLim)
143223338178SMark Peek return(CC_ERROR); /* end of buffer space */
143323338178SMark Peek if (inputmode != MODE_INSERT) {
143445e5710bSMark Peek c_delafter(Argument * Strlen(c));
143523338178SMark Peek }
143623338178SMark Peek c_insert(Argument * n);
143723338178SMark Peek while (Argument--) {
143823338178SMark Peek for (i = 0; i < n; i++)
143923338178SMark Peek *Cursor++ = c[i];
144023338178SMark Peek }
144123338178SMark Peek Refresh();
144223338178SMark Peek return(CC_NORM);
144323338178SMark Peek }
144445e5710bSMark Peek #endif
144523338178SMark Peek
1446c80476e4SDavid E. O'Brien CCRETVAL
e_insert(Char c)144745e5710bSMark Peek e_insert(Char c)
1448c80476e4SDavid E. O'Brien {
1449c80476e4SDavid E. O'Brien #ifndef SHORT_STRINGS
1450c80476e4SDavid E. O'Brien c &= ASCII; /* no meta chars ever */
1451c80476e4SDavid E. O'Brien #endif
1452c80476e4SDavid E. O'Brien
1453c80476e4SDavid E. O'Brien if (!c)
1454c80476e4SDavid E. O'Brien return(CC_ERROR); /* no NULs in the input ever!! */
1455c80476e4SDavid E. O'Brien
1456c80476e4SDavid E. O'Brien if (LastChar + Argument >= InputLim)
1457c80476e4SDavid E. O'Brien return(CC_ERROR); /* end of buffer space */
1458c80476e4SDavid E. O'Brien
1459c80476e4SDavid E. O'Brien if (Argument == 1) { /* How was this optimized ???? */
1460c80476e4SDavid E. O'Brien
1461c80476e4SDavid E. O'Brien if (inputmode != MODE_INSERT) {
1462c80476e4SDavid E. O'Brien UndoBuf[UndoSize++] = *Cursor;
1463c80476e4SDavid E. O'Brien UndoBuf[UndoSize] = '\0';
1464c80476e4SDavid E. O'Brien c_delafter(1); /* Do NOT use the saving ONE */
1465c80476e4SDavid E. O'Brien }
1466c80476e4SDavid E. O'Brien
1467c80476e4SDavid E. O'Brien c_insert(1);
1468c80476e4SDavid E. O'Brien *Cursor++ = (Char) c;
1469c80476e4SDavid E. O'Brien DoingArg = 0; /* just in case */
147023338178SMark Peek RefPlusOne(1); /* fast refresh for one char. */
1471c80476e4SDavid E. O'Brien }
1472c80476e4SDavid E. O'Brien else {
1473c80476e4SDavid E. O'Brien if (inputmode != MODE_INSERT) {
147423338178SMark Peek int i;
1475c80476e4SDavid E. O'Brien for (i = 0; i < Argument; i++)
14765224c2a3SDmitry Chagin UndoBuf[UndoSize++] = Cursor[i];
1477c80476e4SDavid E. O'Brien
1478c80476e4SDavid E. O'Brien UndoBuf[UndoSize] = '\0';
1479c80476e4SDavid E. O'Brien c_delafter(Argument); /* Do NOT use the saving ONE */
1480c80476e4SDavid E. O'Brien }
1481c80476e4SDavid E. O'Brien
1482c80476e4SDavid E. O'Brien c_insert(Argument);
1483c80476e4SDavid E. O'Brien
1484c80476e4SDavid E. O'Brien while (Argument--)
1485c80476e4SDavid E. O'Brien *Cursor++ = (Char) c;
1486c80476e4SDavid E. O'Brien Refresh();
1487c80476e4SDavid E. O'Brien }
1488c80476e4SDavid E. O'Brien
1489c80476e4SDavid E. O'Brien if (inputmode == MODE_REPLACE_1)
1490c80476e4SDavid E. O'Brien (void) v_cmd_mode(0);
1491c80476e4SDavid E. O'Brien
1492c80476e4SDavid E. O'Brien return(CC_NORM);
1493c80476e4SDavid E. O'Brien }
1494c80476e4SDavid E. O'Brien
1495c80476e4SDavid E. O'Brien int
InsertStr(Char * s)149645e5710bSMark Peek InsertStr(Char *s) /* insert ASCIZ s at cursor (for complete) */
1497c80476e4SDavid E. O'Brien {
14986767bd61SMark Peek int len;
1499c80476e4SDavid E. O'Brien
1500c80476e4SDavid E. O'Brien if ((len = (int) Strlen(s)) <= 0)
1501c80476e4SDavid E. O'Brien return -1;
1502c80476e4SDavid E. O'Brien if (LastChar + len >= InputLim)
1503c80476e4SDavid E. O'Brien return -1; /* end of buffer space */
1504c80476e4SDavid E. O'Brien
1505c80476e4SDavid E. O'Brien c_insert(len);
1506c80476e4SDavid E. O'Brien while (len--)
1507c80476e4SDavid E. O'Brien *Cursor++ = *s++;
1508c80476e4SDavid E. O'Brien return 0;
1509c80476e4SDavid E. O'Brien }
1510c80476e4SDavid E. O'Brien
1511c80476e4SDavid E. O'Brien void
DeleteBack(int n)151245e5710bSMark Peek DeleteBack(int n) /* delete the n characters before . */
1513c80476e4SDavid E. O'Brien {
1514c80476e4SDavid E. O'Brien if (n <= 0)
1515c80476e4SDavid E. O'Brien return;
1516c80476e4SDavid E. O'Brien if (Cursor >= &InputBuf[n]) {
1517c80476e4SDavid E. O'Brien c_delbefore(n); /* delete before dot */
1518c80476e4SDavid E. O'Brien }
1519c80476e4SDavid E. O'Brien }
1520c80476e4SDavid E. O'Brien
1521c80476e4SDavid E. O'Brien CCRETVAL
e_digit(Char c)152245e5710bSMark Peek e_digit(Char c) /* gray magic here */
1523c80476e4SDavid E. O'Brien {
1524c80476e4SDavid E. O'Brien if (!Isdigit(c))
1525c80476e4SDavid E. O'Brien return(CC_ERROR); /* no NULs in the input ever!! */
1526c80476e4SDavid E. O'Brien
1527c80476e4SDavid E. O'Brien if (DoingArg) { /* if doing an arg, add this in... */
1528c80476e4SDavid E. O'Brien if (LastCmd == F_ARGFOUR) /* if last command was ^U */
1529c80476e4SDavid E. O'Brien Argument = c - '0';
1530c80476e4SDavid E. O'Brien else {
1531c80476e4SDavid E. O'Brien if (Argument > 1000000)
1532c80476e4SDavid E. O'Brien return CC_ERROR;
1533c80476e4SDavid E. O'Brien Argument = (Argument * 10) + (c - '0');
1534c80476e4SDavid E. O'Brien }
1535c80476e4SDavid E. O'Brien return(CC_ARGHACK);
1536c80476e4SDavid E. O'Brien }
1537c80476e4SDavid E. O'Brien else {
1538c80476e4SDavid E. O'Brien if (LastChar + 1 >= InputLim)
1539c80476e4SDavid E. O'Brien return CC_ERROR; /* end of buffer space */
1540c80476e4SDavid E. O'Brien
1541c80476e4SDavid E. O'Brien if (inputmode != MODE_INSERT) {
1542c80476e4SDavid E. O'Brien UndoBuf[UndoSize++] = *Cursor;
1543c80476e4SDavid E. O'Brien UndoBuf[UndoSize] = '\0';
1544c80476e4SDavid E. O'Brien c_delafter(1); /* Do NOT use the saving ONE */
1545c80476e4SDavid E. O'Brien }
1546c80476e4SDavid E. O'Brien c_insert(1);
1547c80476e4SDavid E. O'Brien *Cursor++ = (Char) c;
1548c80476e4SDavid E. O'Brien DoingArg = 0; /* just in case */
154923338178SMark Peek RefPlusOne(1); /* fast refresh for one char. */
1550c80476e4SDavid E. O'Brien }
1551c80476e4SDavid E. O'Brien return(CC_NORM);
1552c80476e4SDavid E. O'Brien }
1553c80476e4SDavid E. O'Brien
1554c80476e4SDavid E. O'Brien CCRETVAL
e_argdigit(Char c)155545e5710bSMark Peek e_argdigit(Char c) /* for ESC-n */
1556c80476e4SDavid E. O'Brien {
155745e5710bSMark Peek #ifdef IS_ASCII
1558c80476e4SDavid E. O'Brien c &= ASCII;
155945e5710bSMark Peek #else
156045e5710bSMark Peek c = CTL_ESC(ASC(c) & ASCII); /* stripping for EBCDIC done the ASCII way */
156145e5710bSMark Peek #endif
1562c80476e4SDavid E. O'Brien
1563c80476e4SDavid E. O'Brien if (!Isdigit(c))
1564c80476e4SDavid E. O'Brien return(CC_ERROR); /* no NULs in the input ever!! */
1565c80476e4SDavid E. O'Brien
1566c80476e4SDavid E. O'Brien if (DoingArg) { /* if doing an arg, add this in... */
1567c80476e4SDavid E. O'Brien if (Argument > 1000000)
1568c80476e4SDavid E. O'Brien return CC_ERROR;
1569c80476e4SDavid E. O'Brien Argument = (Argument * 10) + (c - '0');
1570c80476e4SDavid E. O'Brien }
1571c80476e4SDavid E. O'Brien else { /* else starting an argument */
1572c80476e4SDavid E. O'Brien Argument = c - '0';
1573c80476e4SDavid E. O'Brien DoingArg = 1;
1574c80476e4SDavid E. O'Brien }
1575c80476e4SDavid E. O'Brien return(CC_ARGHACK);
1576c80476e4SDavid E. O'Brien }
1577c80476e4SDavid E. O'Brien
1578c80476e4SDavid E. O'Brien CCRETVAL
v_zero(Char c)157945e5710bSMark Peek v_zero(Char c) /* command mode 0 for vi */
1580c80476e4SDavid E. O'Brien {
1581c80476e4SDavid E. O'Brien if (DoingArg) { /* if doing an arg, add this in... */
1582c80476e4SDavid E. O'Brien if (Argument > 1000000)
1583c80476e4SDavid E. O'Brien return CC_ERROR;
1584c80476e4SDavid E. O'Brien Argument = (Argument * 10) + (c - '0');
1585c80476e4SDavid E. O'Brien return(CC_ARGHACK);
1586c80476e4SDavid E. O'Brien }
1587c80476e4SDavid E. O'Brien else { /* else starting an argument */
1588c80476e4SDavid E. O'Brien Cursor = InputBuf;
1589c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) {
1590c80476e4SDavid E. O'Brien c_delfini();
1591c80476e4SDavid E. O'Brien return(CC_REFRESH);
1592c80476e4SDavid E. O'Brien }
1593c80476e4SDavid E. O'Brien RefCursor(); /* move the cursor */
1594c80476e4SDavid E. O'Brien return(CC_NORM);
1595c80476e4SDavid E. O'Brien }
1596c80476e4SDavid E. O'Brien }
1597c80476e4SDavid E. O'Brien
1598c80476e4SDavid E. O'Brien /*ARGSUSED*/
1599c80476e4SDavid E. O'Brien CCRETVAL
e_newline(Char c)160045e5710bSMark Peek e_newline(Char c)
1601c80476e4SDavid E. O'Brien { /* always ignore argument */
1602c80476e4SDavid E. O'Brien USE(c);
160345e5710bSMark Peek if (adrof(STRhighlight) && MarkIsSet) {
160445e5710bSMark Peek MarkIsSet = 0;
160545e5710bSMark Peek ClearLines();
160645e5710bSMark Peek ClearDisp();
160745e5710bSMark Peek Refresh();
160845e5710bSMark Peek }
160945e5710bSMark Peek MarkIsSet = 0;
161045e5710bSMark Peek
1611c80476e4SDavid E. O'Brien /* PastBottom(); NOW done in ed.inputl.c */
1612c80476e4SDavid E. O'Brien *LastChar++ = '\n'; /* for the benefit of CSH */
1613c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
1614c80476e4SDavid E. O'Brien if (VImode)
1615c80476e4SDavid E. O'Brien InsertPos = InputBuf; /* Reset editing position */
1616c80476e4SDavid E. O'Brien return(CC_NEWLINE);
1617c80476e4SDavid E. O'Brien }
1618c80476e4SDavid E. O'Brien
1619c80476e4SDavid E. O'Brien /*ARGSUSED*/
1620c80476e4SDavid E. O'Brien CCRETVAL
e_newline_hold(Char c)162145e5710bSMark Peek e_newline_hold(Char c)
162245e5710bSMark Peek {
162345e5710bSMark Peek USE(c);
162445e5710bSMark Peek c_save_inputbuf();
162545e5710bSMark Peek HistSaved = 0;
162645e5710bSMark Peek *LastChar++ = '\n'; /* for the benefit of CSH */
162745e5710bSMark Peek *LastChar = '\0'; /* just in case */
162845e5710bSMark Peek return(CC_NEWLINE);
162945e5710bSMark Peek }
163045e5710bSMark Peek
163145e5710bSMark Peek /*ARGSUSED*/
163245e5710bSMark Peek CCRETVAL
e_newline_down_hist(Char c)163345e5710bSMark Peek e_newline_down_hist(Char c)
163445e5710bSMark Peek {
163545e5710bSMark Peek USE(c);
163645e5710bSMark Peek if (Hist_num > 1) {
163745e5710bSMark Peek HistSaved = Hist_num;
163845e5710bSMark Peek }
163945e5710bSMark Peek *LastChar++ = '\n'; /* for the benefit of CSH */
164045e5710bSMark Peek *LastChar = '\0'; /* just in case */
164145e5710bSMark Peek return(CC_NEWLINE);
164245e5710bSMark Peek }
164345e5710bSMark Peek
164445e5710bSMark Peek /*ARGSUSED*/
164545e5710bSMark Peek CCRETVAL
e_send_eof(Char c)164645e5710bSMark Peek e_send_eof(Char c)
1647c80476e4SDavid E. O'Brien { /* for when ^D is ONLY send-eof */
1648c80476e4SDavid E. O'Brien USE(c);
1649c80476e4SDavid E. O'Brien PastBottom();
1650c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
1651c80476e4SDavid E. O'Brien return(CC_EOF);
1652c80476e4SDavid E. O'Brien }
1653c80476e4SDavid E. O'Brien
1654c80476e4SDavid E. O'Brien /*ARGSUSED*/
1655c80476e4SDavid E. O'Brien CCRETVAL
e_complete(Char c)165645e5710bSMark Peek e_complete(Char c)
1657c80476e4SDavid E. O'Brien {
1658c80476e4SDavid E. O'Brien USE(c);
1659c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
1660c80476e4SDavid E. O'Brien return(CC_COMPLETE);
1661c80476e4SDavid E. O'Brien }
1662c80476e4SDavid E. O'Brien
1663c80476e4SDavid E. O'Brien /*ARGSUSED*/
1664c80476e4SDavid E. O'Brien CCRETVAL
e_complete_back(Char c)166545e5710bSMark Peek e_complete_back(Char c)
1666c80476e4SDavid E. O'Brien {
1667c80476e4SDavid E. O'Brien USE(c);
1668c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
1669c80476e4SDavid E. O'Brien return(CC_COMPLETE_BACK);
1670c80476e4SDavid E. O'Brien }
1671c80476e4SDavid E. O'Brien
1672c80476e4SDavid E. O'Brien /*ARGSUSED*/
1673c80476e4SDavid E. O'Brien CCRETVAL
e_complete_fwd(Char c)167445e5710bSMark Peek e_complete_fwd(Char c)
1675c80476e4SDavid E. O'Brien {
1676c80476e4SDavid E. O'Brien USE(c);
1677c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
1678c80476e4SDavid E. O'Brien return(CC_COMPLETE_FWD);
1679c80476e4SDavid E. O'Brien }
1680c80476e4SDavid E. O'Brien
1681c80476e4SDavid E. O'Brien /*ARGSUSED*/
1682c80476e4SDavid E. O'Brien CCRETVAL
e_complete_all(Char c)168345e5710bSMark Peek e_complete_all(Char c)
1684c80476e4SDavid E. O'Brien {
1685c80476e4SDavid E. O'Brien USE(c);
1686c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
1687c80476e4SDavid E. O'Brien return(CC_COMPLETE_ALL);
1688c80476e4SDavid E. O'Brien }
1689c80476e4SDavid E. O'Brien
1690c80476e4SDavid E. O'Brien /*ARGSUSED*/
1691c80476e4SDavid E. O'Brien CCRETVAL
v_cm_complete(Char c)169245e5710bSMark Peek v_cm_complete(Char c)
1693c80476e4SDavid E. O'Brien {
1694c80476e4SDavid E. O'Brien USE(c);
1695c80476e4SDavid E. O'Brien if (Cursor < LastChar)
1696c80476e4SDavid E. O'Brien Cursor++;
1697c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
1698c80476e4SDavid E. O'Brien return(CC_COMPLETE);
1699c80476e4SDavid E. O'Brien }
1700c80476e4SDavid E. O'Brien
1701c80476e4SDavid E. O'Brien /*ARGSUSED*/
1702c80476e4SDavid E. O'Brien CCRETVAL
e_toggle_hist(Char c)170345e5710bSMark Peek e_toggle_hist(Char c)
1704c80476e4SDavid E. O'Brien {
1705c80476e4SDavid E. O'Brien struct Hist *hp;
1706c80476e4SDavid E. O'Brien int h;
1707c80476e4SDavid E. O'Brien
1708c80476e4SDavid E. O'Brien USE(c);
1709c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
1710c80476e4SDavid E. O'Brien
1711c80476e4SDavid E. O'Brien if (Hist_num <= 0) {
1712c80476e4SDavid E. O'Brien return CC_ERROR;
1713c80476e4SDavid E. O'Brien }
1714c80476e4SDavid E. O'Brien
1715c80476e4SDavid E. O'Brien hp = Histlist.Hnext;
1716c80476e4SDavid E. O'Brien if (hp == NULL) { /* this is only if no history */
1717c80476e4SDavid E. O'Brien return(CC_ERROR);
1718c80476e4SDavid E. O'Brien }
1719c80476e4SDavid E. O'Brien
1720c80476e4SDavid E. O'Brien for (h = 1; h < Hist_num; h++)
1721c80476e4SDavid E. O'Brien hp = hp->Hnext;
1722c80476e4SDavid E. O'Brien
1723c80476e4SDavid E. O'Brien if (!CurrentHistLit) {
1724c80476e4SDavid E. O'Brien if (hp->histline) {
172545e5710bSMark Peek copyn(InputBuf, hp->histline, INBUFSIZE);/*FIXBUF*/
1726c80476e4SDavid E. O'Brien CurrentHistLit = 1;
1727c80476e4SDavid E. O'Brien }
1728c80476e4SDavid E. O'Brien else {
1729c80476e4SDavid E. O'Brien return CC_ERROR;
1730c80476e4SDavid E. O'Brien }
1731c80476e4SDavid E. O'Brien }
1732c80476e4SDavid E. O'Brien else {
173345e5710bSMark Peek Char *p;
173445e5710bSMark Peek
173545e5710bSMark Peek p = sprlex(&hp->Hlex);
173645e5710bSMark Peek copyn(InputBuf, p, sizeof(InputBuf) / sizeof(Char));/*FIXBUF*/
173745e5710bSMark Peek xfree(p);
1738c80476e4SDavid E. O'Brien CurrentHistLit = 0;
1739c80476e4SDavid E. O'Brien }
1740c80476e4SDavid E. O'Brien
174145e5710bSMark Peek LastChar = Strend(InputBuf);
1742c80476e4SDavid E. O'Brien if (LastChar > InputBuf) {
1743c80476e4SDavid E. O'Brien if (LastChar[-1] == '\n')
1744c80476e4SDavid E. O'Brien LastChar--;
1745c80476e4SDavid E. O'Brien if (LastChar[-1] == ' ')
1746c80476e4SDavid E. O'Brien LastChar--;
1747c80476e4SDavid E. O'Brien if (LastChar < InputBuf)
1748c80476e4SDavid E. O'Brien LastChar = InputBuf;
1749c80476e4SDavid E. O'Brien }
1750c80476e4SDavid E. O'Brien
1751c80476e4SDavid E. O'Brien #ifdef KSHVI
1752c80476e4SDavid E. O'Brien if (VImode)
1753c80476e4SDavid E. O'Brien Cursor = InputBuf;
1754c80476e4SDavid E. O'Brien else
1755c80476e4SDavid E. O'Brien #endif /* KSHVI */
1756c80476e4SDavid E. O'Brien Cursor = LastChar;
1757c80476e4SDavid E. O'Brien
1758c80476e4SDavid E. O'Brien return(CC_REFRESH);
1759c80476e4SDavid E. O'Brien }
1760c80476e4SDavid E. O'Brien
1761c80476e4SDavid E. O'Brien /*ARGSUSED*/
1762c80476e4SDavid E. O'Brien CCRETVAL
e_up_hist(Char c)176345e5710bSMark Peek e_up_hist(Char c)
1764c80476e4SDavid E. O'Brien {
1765c80476e4SDavid E. O'Brien Char beep = 0;
1766c80476e4SDavid E. O'Brien
1767c80476e4SDavid E. O'Brien USE(c);
1768c80476e4SDavid E. O'Brien UndoAction = TCSHOP_NOP;
1769c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
1770c80476e4SDavid E. O'Brien
1771c80476e4SDavid E. O'Brien if (Hist_num == 0) { /* save the current buffer away */
177245e5710bSMark Peek HistBuf.len = 0;
177345e5710bSMark Peek Strbuf_append(&HistBuf, InputBuf);
177445e5710bSMark Peek Strbuf_terminate(&HistBuf);
1775c80476e4SDavid E. O'Brien }
1776c80476e4SDavid E. O'Brien
1777c80476e4SDavid E. O'Brien Hist_num += Argument;
1778c80476e4SDavid E. O'Brien
177945e5710bSMark Peek if (GetHistLine() == CC_ERROR) {
1780c80476e4SDavid E. O'Brien beep = 1;
178145e5710bSMark Peek (void) GetHistLine(); /* Hist_num was fixed by first call */
1782c80476e4SDavid E. O'Brien }
1783c80476e4SDavid E. O'Brien
1784c80476e4SDavid E. O'Brien Refresh();
1785c80476e4SDavid E. O'Brien if (beep)
1786c80476e4SDavid E. O'Brien return(CC_ERROR);
1787c80476e4SDavid E. O'Brien else
1788c80476e4SDavid E. O'Brien return(CC_NORM); /* was CC_UP_HIST */
1789c80476e4SDavid E. O'Brien }
1790c80476e4SDavid E. O'Brien
1791c80476e4SDavid E. O'Brien /*ARGSUSED*/
1792c80476e4SDavid E. O'Brien CCRETVAL
e_down_hist(Char c)179345e5710bSMark Peek e_down_hist(Char c)
1794c80476e4SDavid E. O'Brien {
1795c80476e4SDavid E. O'Brien USE(c);
1796c80476e4SDavid E. O'Brien UndoAction = TCSHOP_NOP;
1797c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
1798c80476e4SDavid E. O'Brien
1799c80476e4SDavid E. O'Brien Hist_num -= Argument;
1800c80476e4SDavid E. O'Brien
1801c80476e4SDavid E. O'Brien if (Hist_num < 0) {
1802c80476e4SDavid E. O'Brien Hist_num = 0;
1803c80476e4SDavid E. O'Brien return(CC_ERROR); /* make it beep */
1804c80476e4SDavid E. O'Brien }
1805c80476e4SDavid E. O'Brien
180645e5710bSMark Peek return(GetHistLine());
1807c80476e4SDavid E. O'Brien }
1808c80476e4SDavid E. O'Brien
1809c80476e4SDavid E. O'Brien
1810c80476e4SDavid E. O'Brien
1811c80476e4SDavid E. O'Brien /*
1812c80476e4SDavid E. O'Brien * c_hmatch() return True if the pattern matches the prefix
1813c80476e4SDavid E. O'Brien */
1814c80476e4SDavid E. O'Brien static int
c_hmatch(Char * str)181545e5710bSMark Peek c_hmatch(Char *str)
1816c80476e4SDavid E. O'Brien {
181745e5710bSMark Peek if (Strncmp(patbuf.s, str, patbuf.len) == 0)
1818c80476e4SDavid E. O'Brien return 1;
181945e5710bSMark Peek return Gmatch(str, patbuf.s);
1820c80476e4SDavid E. O'Brien }
1821c80476e4SDavid E. O'Brien
1822c80476e4SDavid E. O'Brien /*
1823c80476e4SDavid E. O'Brien * c_hsetpat(): Set the history seatch pattern
1824c80476e4SDavid E. O'Brien */
1825c80476e4SDavid E. O'Brien static void
c_hsetpat(void)182645e5710bSMark Peek c_hsetpat(void)
1827c80476e4SDavid E. O'Brien {
1828c80476e4SDavid E. O'Brien if (LastCmd != F_UP_SEARCH_HIST && LastCmd != F_DOWN_SEARCH_HIST) {
182945e5710bSMark Peek patbuf.len = 0;
183045e5710bSMark Peek Strbuf_appendn(&patbuf, InputBuf, Cursor - InputBuf);
183145e5710bSMark Peek Strbuf_terminate(&patbuf);
1832c80476e4SDavid E. O'Brien }
1833c80476e4SDavid E. O'Brien #ifdef SDEBUG
1834c80476e4SDavid E. O'Brien xprintf("\nHist_num = %d\n", Hist_num);
183545e5710bSMark Peek xprintf("patlen = %d\n", (int)patbuf.len);
183645e5710bSMark Peek xprintf("patbuf = \"%S\"\n", patbuf.s);
1837c80476e4SDavid E. O'Brien xprintf("Cursor %d LastChar %d\n", Cursor - InputBuf, LastChar - InputBuf);
1838c80476e4SDavid E. O'Brien #endif
1839c80476e4SDavid E. O'Brien }
1840c80476e4SDavid E. O'Brien
1841c80476e4SDavid E. O'Brien /*ARGSUSED*/
1842c80476e4SDavid E. O'Brien CCRETVAL
e_up_search_hist(Char c)184345e5710bSMark Peek e_up_search_hist(Char c)
1844c80476e4SDavid E. O'Brien {
1845c80476e4SDavid E. O'Brien struct Hist *hp;
1846c80476e4SDavid E. O'Brien int h;
184723338178SMark Peek int found = 0;
1848c80476e4SDavid E. O'Brien
1849c80476e4SDavid E. O'Brien USE(c);
1850c80476e4SDavid E. O'Brien ActionFlag = TCSHOP_NOP;
1851c80476e4SDavid E. O'Brien UndoAction = TCSHOP_NOP;
1852c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
1853c80476e4SDavid E. O'Brien if (Hist_num < 0) {
1854c80476e4SDavid E. O'Brien #ifdef DEBUG_EDIT
1855c80476e4SDavid E. O'Brien xprintf("%s: e_up_search_hist(): Hist_num < 0; resetting.\n", progname);
1856c80476e4SDavid E. O'Brien #endif
1857c80476e4SDavid E. O'Brien Hist_num = 0;
1858c80476e4SDavid E. O'Brien return(CC_ERROR);
1859c80476e4SDavid E. O'Brien }
1860c80476e4SDavid E. O'Brien
186145e5710bSMark Peek if (Hist_num == 0) {
186245e5710bSMark Peek HistBuf.len = 0;
186345e5710bSMark Peek Strbuf_append(&HistBuf, InputBuf);
186445e5710bSMark Peek Strbuf_terminate(&HistBuf);
1865c80476e4SDavid E. O'Brien }
1866c80476e4SDavid E. O'Brien
1867c80476e4SDavid E. O'Brien
1868c80476e4SDavid E. O'Brien hp = Histlist.Hnext;
1869c80476e4SDavid E. O'Brien if (hp == NULL)
1870c80476e4SDavid E. O'Brien return(CC_ERROR);
1871c80476e4SDavid E. O'Brien
1872c80476e4SDavid E. O'Brien c_hsetpat(); /* Set search pattern !! */
1873c80476e4SDavid E. O'Brien
1874c80476e4SDavid E. O'Brien for (h = 1; h <= Hist_num; h++)
1875c80476e4SDavid E. O'Brien hp = hp->Hnext;
1876c80476e4SDavid E. O'Brien
1877c80476e4SDavid E. O'Brien while (hp != NULL) {
187845e5710bSMark Peek Char *hl;
187945e5710bSMark Peek int matched;
188045e5710bSMark Peek
188145e5710bSMark Peek if (hp->histline == NULL)
188245e5710bSMark Peek hp->histline = sprlex(&hp->Hlex);
188345e5710bSMark Peek if (HistLit)
188445e5710bSMark Peek hl = hp->histline;
188545e5710bSMark Peek else {
188645e5710bSMark Peek hl = sprlex(&hp->Hlex);
188745e5710bSMark Peek cleanup_push(hl, xfree);
1888c80476e4SDavid E. O'Brien }
1889c80476e4SDavid E. O'Brien #ifdef SDEBUG
1890c80476e4SDavid E. O'Brien xprintf("Comparing with \"%S\"\n", hl);
1891c80476e4SDavid E. O'Brien #endif
189245e5710bSMark Peek matched = (Strncmp(hl, InputBuf, (size_t) (LastChar - InputBuf)) ||
189345e5710bSMark Peek hl[LastChar-InputBuf]) && c_hmatch(hl);
189445e5710bSMark Peek if (!HistLit)
189545e5710bSMark Peek cleanup_until(hl);
189645e5710bSMark Peek if (matched) {
1897c80476e4SDavid E. O'Brien found++;
1898c80476e4SDavid E. O'Brien break;
1899c80476e4SDavid E. O'Brien }
1900c80476e4SDavid E. O'Brien h++;
1901c80476e4SDavid E. O'Brien hp = hp->Hnext;
1902c80476e4SDavid E. O'Brien }
1903c80476e4SDavid E. O'Brien
1904c80476e4SDavid E. O'Brien if (!found) {
1905c80476e4SDavid E. O'Brien #ifdef SDEBUG
1906c80476e4SDavid E. O'Brien xprintf("not found\n");
1907c80476e4SDavid E. O'Brien #endif
1908c80476e4SDavid E. O'Brien return(CC_ERROR);
1909c80476e4SDavid E. O'Brien }
1910c80476e4SDavid E. O'Brien
1911c80476e4SDavid E. O'Brien Hist_num = h;
1912c80476e4SDavid E. O'Brien
191345e5710bSMark Peek return(GetHistLine());
1914c80476e4SDavid E. O'Brien }
1915c80476e4SDavid E. O'Brien
1916c80476e4SDavid E. O'Brien /*ARGSUSED*/
1917c80476e4SDavid E. O'Brien CCRETVAL
e_down_search_hist(Char c)191845e5710bSMark Peek e_down_search_hist(Char c)
1919c80476e4SDavid E. O'Brien {
1920c80476e4SDavid E. O'Brien struct Hist *hp;
1921c80476e4SDavid E. O'Brien int h;
192223338178SMark Peek int found = 0;
1923c80476e4SDavid E. O'Brien
1924c80476e4SDavid E. O'Brien USE(c);
1925c80476e4SDavid E. O'Brien ActionFlag = TCSHOP_NOP;
1926c80476e4SDavid E. O'Brien UndoAction = TCSHOP_NOP;
1927c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
1928c80476e4SDavid E. O'Brien
1929c80476e4SDavid E. O'Brien if (Hist_num == 0)
1930c80476e4SDavid E. O'Brien return(CC_ERROR);
1931c80476e4SDavid E. O'Brien
1932c80476e4SDavid E. O'Brien hp = Histlist.Hnext;
1933c80476e4SDavid E. O'Brien if (hp == 0)
1934c80476e4SDavid E. O'Brien return(CC_ERROR);
1935c80476e4SDavid E. O'Brien
1936c80476e4SDavid E. O'Brien c_hsetpat(); /* Set search pattern !! */
1937c80476e4SDavid E. O'Brien
1938c80476e4SDavid E. O'Brien for (h = 1; h < Hist_num && hp; h++) {
193945e5710bSMark Peek Char *hl;
194045e5710bSMark Peek if (hp->histline == NULL)
194145e5710bSMark Peek hp->histline = sprlex(&hp->Hlex);
194245e5710bSMark Peek if (HistLit)
194345e5710bSMark Peek hl = hp->histline;
194445e5710bSMark Peek else {
194545e5710bSMark Peek hl = sprlex(&hp->Hlex);
194645e5710bSMark Peek cleanup_push(hl, xfree);
1947c80476e4SDavid E. O'Brien }
1948c80476e4SDavid E. O'Brien #ifdef SDEBUG
1949c80476e4SDavid E. O'Brien xprintf("Comparing with \"%S\"\n", hl);
1950c80476e4SDavid E. O'Brien #endif
1951c80476e4SDavid E. O'Brien if ((Strncmp(hl, InputBuf, (size_t) (LastChar - InputBuf)) ||
1952c80476e4SDavid E. O'Brien hl[LastChar-InputBuf]) && c_hmatch(hl))
1953c80476e4SDavid E. O'Brien found = h;
195445e5710bSMark Peek if (!HistLit)
195545e5710bSMark Peek cleanup_until(hl);
1956c80476e4SDavid E. O'Brien hp = hp->Hnext;
1957c80476e4SDavid E. O'Brien }
1958c80476e4SDavid E. O'Brien
1959c80476e4SDavid E. O'Brien if (!found) { /* is it the current history number? */
196045e5710bSMark Peek if (!c_hmatch(HistBuf.s)) {
1961c80476e4SDavid E. O'Brien #ifdef SDEBUG
1962c80476e4SDavid E. O'Brien xprintf("not found\n");
1963c80476e4SDavid E. O'Brien #endif
1964c80476e4SDavid E. O'Brien return(CC_ERROR);
1965c80476e4SDavid E. O'Brien }
1966c80476e4SDavid E. O'Brien }
1967c80476e4SDavid E. O'Brien
1968c80476e4SDavid E. O'Brien Hist_num = found;
1969c80476e4SDavid E. O'Brien
197045e5710bSMark Peek return(GetHistLine());
1971c80476e4SDavid E. O'Brien }
1972c80476e4SDavid E. O'Brien
1973c80476e4SDavid E. O'Brien /*ARGSUSED*/
1974c80476e4SDavid E. O'Brien CCRETVAL
e_helpme(Char c)197545e5710bSMark Peek e_helpme(Char c)
1976c80476e4SDavid E. O'Brien {
1977c80476e4SDavid E. O'Brien USE(c);
1978c80476e4SDavid E. O'Brien PastBottom();
1979c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
1980c80476e4SDavid E. O'Brien return(CC_HELPME);
1981c80476e4SDavid E. O'Brien }
1982c80476e4SDavid E. O'Brien
1983c80476e4SDavid E. O'Brien /*ARGSUSED*/
1984c80476e4SDavid E. O'Brien CCRETVAL
e_correct(Char c)198545e5710bSMark Peek e_correct(Char c)
1986c80476e4SDavid E. O'Brien {
1987c80476e4SDavid E. O'Brien USE(c);
1988c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
1989c80476e4SDavid E. O'Brien return(CC_CORRECT);
1990c80476e4SDavid E. O'Brien }
1991c80476e4SDavid E. O'Brien
1992c80476e4SDavid E. O'Brien /*ARGSUSED*/
1993c80476e4SDavid E. O'Brien CCRETVAL
e_correctl(Char c)199445e5710bSMark Peek e_correctl(Char c)
1995c80476e4SDavid E. O'Brien {
1996c80476e4SDavid E. O'Brien USE(c);
1997c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
1998c80476e4SDavid E. O'Brien return(CC_CORRECT_L);
1999c80476e4SDavid E. O'Brien }
2000c80476e4SDavid E. O'Brien
2001c80476e4SDavid E. O'Brien /*ARGSUSED*/
2002c80476e4SDavid E. O'Brien CCRETVAL
e_run_fg_editor(Char c)200345e5710bSMark Peek e_run_fg_editor(Char c)
2004c80476e4SDavid E. O'Brien {
20056767bd61SMark Peek struct process *pp;
2006c80476e4SDavid E. O'Brien
2007c80476e4SDavid E. O'Brien USE(c);
2008c80476e4SDavid E. O'Brien if ((pp = find_stop_ed()) != NULL) {
2009c80476e4SDavid E. O'Brien /* save our editor state so we can restore it */
201045e5710bSMark Peek c_save_inputbuf();
2011c80476e4SDavid E. O'Brien Hist_num = 0; /* for the history commands */
2012c80476e4SDavid E. O'Brien
2013c80476e4SDavid E. O'Brien /* put the tty in a sane mode */
2014c80476e4SDavid E. O'Brien PastBottom();
2015c80476e4SDavid E. O'Brien (void) Cookedmode(); /* make sure the tty is set up correctly */
2016c80476e4SDavid E. O'Brien
2017c80476e4SDavid E. O'Brien /* do it! */
2018c80476e4SDavid E. O'Brien fg_proc_entry(pp);
2019c80476e4SDavid E. O'Brien
2020c80476e4SDavid E. O'Brien (void) Rawmode(); /* go on */
2021c80476e4SDavid E. O'Brien Refresh();
202245e5710bSMark Peek RestoreSaved = 0;
202345e5710bSMark Peek HistSaved = 0;
2024c80476e4SDavid E. O'Brien }
2025c80476e4SDavid E. O'Brien return(CC_NORM);
2026c80476e4SDavid E. O'Brien }
2027c80476e4SDavid E. O'Brien
2028c80476e4SDavid E. O'Brien /*ARGSUSED*/
2029c80476e4SDavid E. O'Brien CCRETVAL
e_list_choices(Char c)203045e5710bSMark Peek e_list_choices(Char c)
2031c80476e4SDavid E. O'Brien {
2032c80476e4SDavid E. O'Brien USE(c);
2033c80476e4SDavid E. O'Brien PastBottom();
2034c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
2035c80476e4SDavid E. O'Brien return(CC_LIST_CHOICES);
2036c80476e4SDavid E. O'Brien }
2037c80476e4SDavid E. O'Brien
2038c80476e4SDavid E. O'Brien /*ARGSUSED*/
2039c80476e4SDavid E. O'Brien CCRETVAL
e_list_all(Char c)204045e5710bSMark Peek e_list_all(Char c)
2041c80476e4SDavid E. O'Brien {
2042c80476e4SDavid E. O'Brien USE(c);
2043c80476e4SDavid E. O'Brien PastBottom();
2044c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
2045c80476e4SDavid E. O'Brien return(CC_LIST_ALL);
2046c80476e4SDavid E. O'Brien }
2047c80476e4SDavid E. O'Brien
2048c80476e4SDavid E. O'Brien /*ARGSUSED*/
2049c80476e4SDavid E. O'Brien CCRETVAL
e_list_glob(Char c)205045e5710bSMark Peek e_list_glob(Char c)
2051c80476e4SDavid E. O'Brien {
2052c80476e4SDavid E. O'Brien USE(c);
2053c80476e4SDavid E. O'Brien PastBottom();
2054c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
2055c80476e4SDavid E. O'Brien return(CC_LIST_GLOB);
2056c80476e4SDavid E. O'Brien }
2057c80476e4SDavid E. O'Brien
2058c80476e4SDavid E. O'Brien /*ARGSUSED*/
2059c80476e4SDavid E. O'Brien CCRETVAL
e_expand_glob(Char c)206045e5710bSMark Peek e_expand_glob(Char c)
2061c80476e4SDavid E. O'Brien {
2062c80476e4SDavid E. O'Brien USE(c);
2063c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
2064c80476e4SDavid E. O'Brien return(CC_EXPAND_GLOB);
2065c80476e4SDavid E. O'Brien }
2066c80476e4SDavid E. O'Brien
2067c80476e4SDavid E. O'Brien /*ARGSUSED*/
2068c80476e4SDavid E. O'Brien CCRETVAL
e_normalize_path(Char c)206945e5710bSMark Peek e_normalize_path(Char c)
2070c80476e4SDavid E. O'Brien {
2071c80476e4SDavid E. O'Brien USE(c);
2072c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
2073c80476e4SDavid E. O'Brien return(CC_NORMALIZE_PATH);
2074c80476e4SDavid E. O'Brien }
2075c80476e4SDavid E. O'Brien
2076c80476e4SDavid E. O'Brien /*ARGSUSED*/
2077c80476e4SDavid E. O'Brien CCRETVAL
e_normalize_command(Char c)207845e5710bSMark Peek e_normalize_command(Char c)
2079c80476e4SDavid E. O'Brien {
2080c80476e4SDavid E. O'Brien USE(c);
2081c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
2082c80476e4SDavid E. O'Brien return(CC_NORMALIZE_COMMAND);
2083c80476e4SDavid E. O'Brien }
2084c80476e4SDavid E. O'Brien
2085c80476e4SDavid E. O'Brien /*ARGSUSED*/
2086c80476e4SDavid E. O'Brien CCRETVAL
e_expand_vars(Char c)208745e5710bSMark Peek e_expand_vars(Char c)
2088c80476e4SDavid E. O'Brien {
2089c80476e4SDavid E. O'Brien USE(c);
2090c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
2091c80476e4SDavid E. O'Brien return(CC_EXPAND_VARS);
2092c80476e4SDavid E. O'Brien }
2093c80476e4SDavid E. O'Brien
2094c80476e4SDavid E. O'Brien /*ARGSUSED*/
2095c80476e4SDavid E. O'Brien CCRETVAL
e_which(Char c)209645e5710bSMark Peek e_which(Char c)
2097c80476e4SDavid E. O'Brien { /* do a fast command line which(1) */
2098c80476e4SDavid E. O'Brien USE(c);
209945e5710bSMark Peek c_save_inputbuf();
210045e5710bSMark Peek Hist_num = 0; /* for the history commands */
2101c80476e4SDavid E. O'Brien PastBottom();
2102c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
2103c80476e4SDavid E. O'Brien return(CC_WHICH);
2104c80476e4SDavid E. O'Brien }
2105c80476e4SDavid E. O'Brien
2106c80476e4SDavid E. O'Brien /*ARGSUSED*/
2107c80476e4SDavid E. O'Brien CCRETVAL
e_last_item(Char c)210845e5710bSMark Peek e_last_item(Char c)
2109c80476e4SDavid E. O'Brien { /* insert the last element of the prev. cmd */
21106767bd61SMark Peek struct Hist *hp;
21116767bd61SMark Peek struct wordent *wp, *firstp;
21126767bd61SMark Peek int i;
211345e5710bSMark Peek Char *expanded;
2114c80476e4SDavid E. O'Brien
2115c80476e4SDavid E. O'Brien USE(c);
2116c80476e4SDavid E. O'Brien if (Argument <= 0)
2117c80476e4SDavid E. O'Brien return(CC_ERROR);
2118c80476e4SDavid E. O'Brien
2119c80476e4SDavid E. O'Brien hp = Histlist.Hnext;
2120c80476e4SDavid E. O'Brien if (hp == NULL) { /* this is only if no history */
2121c80476e4SDavid E. O'Brien return(CC_ERROR);
2122c80476e4SDavid E. O'Brien }
2123c80476e4SDavid E. O'Brien
2124c80476e4SDavid E. O'Brien wp = (hp->Hlex).prev;
2125c80476e4SDavid E. O'Brien
2126c80476e4SDavid E. O'Brien if (wp->prev == (struct wordent *) NULL)
2127c80476e4SDavid E. O'Brien return(CC_ERROR); /* an empty history entry */
2128c80476e4SDavid E. O'Brien
2129c80476e4SDavid E. O'Brien firstp = (hp->Hlex).next;
2130c80476e4SDavid E. O'Brien
2131c80476e4SDavid E. O'Brien /* back up arg words in lex */
2132c80476e4SDavid E. O'Brien for (i = 0; i < Argument && wp != firstp; i++) {
2133c80476e4SDavid E. O'Brien wp = wp->prev;
2134c80476e4SDavid E. O'Brien }
2135c80476e4SDavid E. O'Brien
213645e5710bSMark Peek expanded = expand_lex(wp->prev, 0, i - 1);
213745e5710bSMark Peek if (InsertStr(expanded)) {
213845e5710bSMark Peek xfree(expanded);
2139c80476e4SDavid E. O'Brien return(CC_ERROR);
214045e5710bSMark Peek }
2141c80476e4SDavid E. O'Brien
214245e5710bSMark Peek xfree(expanded);
2143c80476e4SDavid E. O'Brien return(CC_REFRESH);
2144c80476e4SDavid E. O'Brien }
2145c80476e4SDavid E. O'Brien
2146c80476e4SDavid E. O'Brien /*ARGSUSED*/
2147c80476e4SDavid E. O'Brien CCRETVAL
e_dabbrev_expand(Char c)214845e5710bSMark Peek e_dabbrev_expand(Char c)
2149c80476e4SDavid E. O'Brien { /* expand to preceding word matching prefix */
21506767bd61SMark Peek Char *cp, *ncp, *bp;
21516767bd61SMark Peek struct Hist *hp;
215245e5710bSMark Peek int arg = 0, i;
215345e5710bSMark Peek size_t len = 0;
215423338178SMark Peek int found = 0;
215545e5710bSMark Peek Char *hbuf;
2156c80476e4SDavid E. O'Brien static int oldevent, hist, word;
2157c80476e4SDavid E. O'Brien static Char *start, *oldcursor;
2158c80476e4SDavid E. O'Brien
2159c80476e4SDavid E. O'Brien USE(c);
2160c80476e4SDavid E. O'Brien if (Argument <= 0)
2161c80476e4SDavid E. O'Brien return(CC_ERROR);
2162c80476e4SDavid E. O'Brien
21636767bd61SMark Peek cp = c_preword(Cursor, InputBuf, 1, STRshwordsep);
2164c80476e4SDavid E. O'Brien if (cp == Cursor || Isspace(*cp))
2165c80476e4SDavid E. O'Brien return(CC_ERROR);
2166c80476e4SDavid E. O'Brien
216745e5710bSMark Peek hbuf = NULL;
2168c80476e4SDavid E. O'Brien hp = Histlist.Hnext;
2169c80476e4SDavid E. O'Brien bp = InputBuf;
2170c80476e4SDavid E. O'Brien if (Argument == 1 && eventno == oldevent && cp == start &&
217145e5710bSMark Peek Cursor == oldcursor && patbuf.len > 0
217245e5710bSMark Peek && Strncmp(patbuf.s, cp, patbuf.len) == 0){
2173c80476e4SDavid E. O'Brien /* continue previous search - go to last match (hist/word) */
2174c80476e4SDavid E. O'Brien if (hist != 0) { /* need to move up history */
2175c80476e4SDavid E. O'Brien for (i = 1; i < hist && hp != NULL; i++)
2176c80476e4SDavid E. O'Brien hp = hp->Hnext;
2177c80476e4SDavid E. O'Brien if (hp == NULL) /* "can't happen" */
217845e5710bSMark Peek goto err_hbuf;
217945e5710bSMark Peek hbuf = expand_lex(&hp->Hlex, 0, INT_MAX);
218045e5710bSMark Peek cp = Strend(hbuf);
2181c80476e4SDavid E. O'Brien bp = hbuf;
2182c80476e4SDavid E. O'Brien hp = hp->Hnext;
2183c80476e4SDavid E. O'Brien }
21846767bd61SMark Peek cp = c_preword(cp, bp, word, STRshwordsep);
2185c80476e4SDavid E. O'Brien } else { /* starting new search */
2186c80476e4SDavid E. O'Brien oldevent = eventno;
2187c80476e4SDavid E. O'Brien start = cp;
218845e5710bSMark Peek patbuf.len = 0;
218945e5710bSMark Peek Strbuf_appendn(&patbuf, cp, Cursor - cp);
2190c80476e4SDavid E. O'Brien hist = 0;
2191c80476e4SDavid E. O'Brien word = 0;
2192c80476e4SDavid E. O'Brien }
2193c80476e4SDavid E. O'Brien
2194c80476e4SDavid E. O'Brien while (!found) {
21956767bd61SMark Peek ncp = c_preword(cp, bp, 1, STRshwordsep);
2196c80476e4SDavid E. O'Brien if (ncp == cp || Isspace(*ncp)) { /* beginning of line */
2197c80476e4SDavid E. O'Brien hist++;
2198c80476e4SDavid E. O'Brien word = 0;
2199c80476e4SDavid E. O'Brien if (hp == NULL)
220045e5710bSMark Peek goto err_hbuf;
220145e5710bSMark Peek hbuf = expand_lex(&hp->Hlex, 0, INT_MAX);
220245e5710bSMark Peek cp = Strend(hbuf);
2203c80476e4SDavid E. O'Brien bp = hbuf;
2204c80476e4SDavid E. O'Brien hp = hp->Hnext;
2205c80476e4SDavid E. O'Brien continue;
2206c80476e4SDavid E. O'Brien } else {
2207c80476e4SDavid E. O'Brien word++;
220845e5710bSMark Peek len = c_endword(ncp-1, cp, 1, STRshwordsep) - ncp + 1;
2209c80476e4SDavid E. O'Brien cp = ncp;
2210c80476e4SDavid E. O'Brien }
221145e5710bSMark Peek if (len > patbuf.len && Strncmp(cp, patbuf.s, patbuf.len) == 0) {
2212c80476e4SDavid E. O'Brien /* We don't fully check distinct matches as Gnuemacs does: */
2213c80476e4SDavid E. O'Brien if (Argument > 1) { /* just count matches */
2214c80476e4SDavid E. O'Brien if (++arg >= Argument)
2215c80476e4SDavid E. O'Brien found++;
2216c80476e4SDavid E. O'Brien } else { /* match if distinct from previous */
221745e5710bSMark Peek if (len != (size_t)(Cursor - start)
221845e5710bSMark Peek || Strncmp(cp, start, len) != 0)
2219c80476e4SDavid E. O'Brien found++;
2220c80476e4SDavid E. O'Brien }
2221c80476e4SDavid E. O'Brien }
2222c80476e4SDavid E. O'Brien }
2223c80476e4SDavid E. O'Brien
2224c80476e4SDavid E. O'Brien if (LastChar + len - (Cursor - start) >= InputLim)
222545e5710bSMark Peek goto err_hbuf; /* no room */
2226c80476e4SDavid E. O'Brien DeleteBack(Cursor - start);
2227c80476e4SDavid E. O'Brien c_insert(len);
2228c80476e4SDavid E. O'Brien while (len--)
2229c80476e4SDavid E. O'Brien *Cursor++ = *cp++;
2230c80476e4SDavid E. O'Brien oldcursor = Cursor;
223145e5710bSMark Peek xfree(hbuf);
2232c80476e4SDavid E. O'Brien return(CC_REFRESH);
223345e5710bSMark Peek
223445e5710bSMark Peek err_hbuf:
223545e5710bSMark Peek xfree(hbuf);
223645e5710bSMark Peek return CC_ERROR;
2237c80476e4SDavid E. O'Brien }
2238c80476e4SDavid E. O'Brien
2239c80476e4SDavid E. O'Brien /*ARGSUSED*/
2240c80476e4SDavid E. O'Brien CCRETVAL
e_yank_kill(Char c)224145e5710bSMark Peek e_yank_kill(Char c)
2242c80476e4SDavid E. O'Brien { /* almost like GnuEmacs */
22436767bd61SMark Peek int len;
22446767bd61SMark Peek Char *kp, *cp;
2245c80476e4SDavid E. O'Brien
2246c80476e4SDavid E. O'Brien USE(c);
22476767bd61SMark Peek if (KillRingLen == 0) /* nothing killed */
2248c80476e4SDavid E. O'Brien return(CC_ERROR);
22496767bd61SMark Peek len = Strlen(KillRing[YankPos].buf);
22506767bd61SMark Peek if (LastChar + len >= InputLim)
2251c80476e4SDavid E. O'Brien return(CC_ERROR); /* end of buffer space */
2252c80476e4SDavid E. O'Brien
2253c80476e4SDavid E. O'Brien /* else */
2254c80476e4SDavid E. O'Brien cp = Cursor; /* for speed */
2255c80476e4SDavid E. O'Brien
22566767bd61SMark Peek c_insert(len); /* open the space, */
22576767bd61SMark Peek for (kp = KillRing[YankPos].buf; *kp; kp++) /* copy the chars */
2258c80476e4SDavid E. O'Brien *cp++ = *kp;
2259c80476e4SDavid E. O'Brien
22606767bd61SMark Peek if (Argument == 1) { /* if no arg */
22616767bd61SMark Peek Mark = Cursor; /* mark at beginning, cursor at end */
22626767bd61SMark Peek Cursor = cp;
22636767bd61SMark Peek } else {
22646767bd61SMark Peek Mark = cp; /* else cursor at beginning, mark at end */
22656767bd61SMark Peek }
22666767bd61SMark Peek
226745e5710bSMark Peek if (adrof(STRhighlight) && MarkIsSet) {
226845e5710bSMark Peek ClearLines();
226945e5710bSMark Peek ClearDisp();
227045e5710bSMark Peek }
227145e5710bSMark Peek MarkIsSet = 0;
22726767bd61SMark Peek return(CC_REFRESH);
22736767bd61SMark Peek }
22746767bd61SMark Peek
22756767bd61SMark Peek /*ARGSUSED*/
22766767bd61SMark Peek CCRETVAL
e_yank_pop(Char c)227745e5710bSMark Peek e_yank_pop(Char c)
22786767bd61SMark Peek { /* almost like GnuEmacs */
22796767bd61SMark Peek int m_bef_c, del_len, ins_len;
22806767bd61SMark Peek Char *kp, *cp;
22816767bd61SMark Peek
22826767bd61SMark Peek USE(c);
22836767bd61SMark Peek
22846767bd61SMark Peek #if 0
22856767bd61SMark Peek /* XXX This "should" be here, but doesn't work, since LastCmd
22866767bd61SMark Peek gets set on CC_ERROR and CC_ARGHACK, which it shouldn't(?).
22876767bd61SMark Peek (But what about F_ARGFOUR?) I.e. if you hit M-y twice the
22886767bd61SMark Peek second one will "succeed" even if the first one wasn't preceded
22896767bd61SMark Peek by a yank, and giving an argument is impossible. Now we "succeed"
22906767bd61SMark Peek regardless of previous command, which is wrong too of course. */
22916767bd61SMark Peek if (LastCmd != F_YANK_KILL && LastCmd != F_YANK_POP)
22926767bd61SMark Peek return(CC_ERROR);
22936767bd61SMark Peek #endif
22946767bd61SMark Peek
22956767bd61SMark Peek if (KillRingLen == 0) /* nothing killed */
22966767bd61SMark Peek return(CC_ERROR);
22976767bd61SMark Peek YankPos -= Argument;
22986767bd61SMark Peek while (YankPos < 0)
22996767bd61SMark Peek YankPos += KillRingLen;
23006767bd61SMark Peek YankPos %= KillRingLen;
23016767bd61SMark Peek
23026767bd61SMark Peek if (Cursor > Mark) {
23036767bd61SMark Peek del_len = Cursor - Mark;
23046767bd61SMark Peek m_bef_c = 1;
23056767bd61SMark Peek } else {
23066767bd61SMark Peek del_len = Mark - Cursor;
23076767bd61SMark Peek m_bef_c = 0;
23086767bd61SMark Peek }
23096767bd61SMark Peek ins_len = Strlen(KillRing[YankPos].buf);
23106767bd61SMark Peek if (LastChar + ins_len - del_len >= InputLim)
23116767bd61SMark Peek return(CC_ERROR); /* end of buffer space */
23126767bd61SMark Peek
23136767bd61SMark Peek if (m_bef_c) {
23146767bd61SMark Peek c_delbefore(del_len);
23156767bd61SMark Peek } else {
23166767bd61SMark Peek c_delafter(del_len);
23176767bd61SMark Peek }
23186767bd61SMark Peek cp = Cursor; /* for speed */
23196767bd61SMark Peek
23206767bd61SMark Peek c_insert(ins_len); /* open the space, */
23216767bd61SMark Peek for (kp = KillRing[YankPos].buf; *kp; kp++) /* copy the chars */
23226767bd61SMark Peek *cp++ = *kp;
23236767bd61SMark Peek
23246767bd61SMark Peek if (m_bef_c) {
23256767bd61SMark Peek Mark = Cursor; /* mark at beginning, cursor at end */
23266767bd61SMark Peek Cursor = cp;
23276767bd61SMark Peek } else {
23286767bd61SMark Peek Mark = cp; /* else cursor at beginning, mark at end */
23296767bd61SMark Peek }
2330c80476e4SDavid E. O'Brien
233145e5710bSMark Peek if (adrof(STRhighlight) && MarkIsSet) {
233245e5710bSMark Peek ClearLines();
233345e5710bSMark Peek ClearDisp();
233445e5710bSMark Peek }
233545e5710bSMark Peek MarkIsSet = 0;
2336c80476e4SDavid E. O'Brien return(CC_REFRESH);
2337c80476e4SDavid E. O'Brien }
2338c80476e4SDavid E. O'Brien
2339c80476e4SDavid E. O'Brien /*ARGSUSED*/
2340c80476e4SDavid E. O'Brien CCRETVAL
v_delprev(Char c)234145e5710bSMark Peek v_delprev(Char c) /* Backspace key in insert mode */
2342c80476e4SDavid E. O'Brien {
2343c80476e4SDavid E. O'Brien int rc;
2344c80476e4SDavid E. O'Brien
2345c80476e4SDavid E. O'Brien USE(c);
2346c80476e4SDavid E. O'Brien rc = CC_ERROR;
2347c80476e4SDavid E. O'Brien
2348c80476e4SDavid E. O'Brien if (InsertPos != 0) {
2349c80476e4SDavid E. O'Brien if (Argument <= Cursor - InsertPos) {
2350c80476e4SDavid E. O'Brien c_delbefore(Argument); /* delete before */
2351c80476e4SDavid E. O'Brien rc = CC_REFRESH;
2352c80476e4SDavid E. O'Brien }
2353c80476e4SDavid E. O'Brien }
2354c80476e4SDavid E. O'Brien return(rc);
2355c80476e4SDavid E. O'Brien } /* v_delprev */
2356c80476e4SDavid E. O'Brien
2357c80476e4SDavid E. O'Brien /*ARGSUSED*/
2358c80476e4SDavid E. O'Brien CCRETVAL
e_delprev(Char c)235945e5710bSMark Peek e_delprev(Char c)
2360c80476e4SDavid E. O'Brien {
2361c80476e4SDavid E. O'Brien USE(c);
2362c80476e4SDavid E. O'Brien if (Cursor > InputBuf) {
2363c80476e4SDavid E. O'Brien c_delbefore(Argument); /* delete before dot */
2364c80476e4SDavid E. O'Brien return(CC_REFRESH);
2365c80476e4SDavid E. O'Brien }
2366c80476e4SDavid E. O'Brien else {
2367c80476e4SDavid E. O'Brien return(CC_ERROR);
2368c80476e4SDavid E. O'Brien }
2369c80476e4SDavid E. O'Brien }
2370c80476e4SDavid E. O'Brien
2371c80476e4SDavid E. O'Brien /*ARGSUSED*/
2372c80476e4SDavid E. O'Brien CCRETVAL
e_delwordprev(Char c)237345e5710bSMark Peek e_delwordprev(Char c)
2374c80476e4SDavid E. O'Brien {
23756767bd61SMark Peek Char *cp;
2376c80476e4SDavid E. O'Brien
2377c80476e4SDavid E. O'Brien USE(c);
2378c80476e4SDavid E. O'Brien if (Cursor == InputBuf)
2379c80476e4SDavid E. O'Brien return(CC_ERROR);
2380c80476e4SDavid E. O'Brien /* else */
2381c80476e4SDavid E. O'Brien
2382c80476e4SDavid E. O'Brien cp = c_prev_word(Cursor, InputBuf, Argument);
2383c80476e4SDavid E. O'Brien
23846767bd61SMark Peek c_push_kill(cp, Cursor); /* save the text */
2385c80476e4SDavid E. O'Brien
2386c80476e4SDavid E. O'Brien c_delbefore((int)(Cursor - cp)); /* delete before dot */
2387c80476e4SDavid E. O'Brien return(CC_REFRESH);
2388c80476e4SDavid E. O'Brien }
2389c80476e4SDavid E. O'Brien
2390c80476e4SDavid E. O'Brien /* DCS <dcs@neutron.chem.yale.edu>, 9 Oct 93
2391c80476e4SDavid E. O'Brien *
2392c80476e4SDavid E. O'Brien * Changed the names of some of the ^D family of editor functions to
2393c80476e4SDavid E. O'Brien * correspond to what they actually do and created new e_delnext_list
2394c80476e4SDavid E. O'Brien * for completeness.
2395c80476e4SDavid E. O'Brien *
2396c80476e4SDavid E. O'Brien * Old names: New names:
2397c80476e4SDavid E. O'Brien *
2398c80476e4SDavid E. O'Brien * delete-char delete-char-or-eof
2399c80476e4SDavid E. O'Brien * F_DELNEXT F_DELNEXT_EOF
2400c80476e4SDavid E. O'Brien * e_delnext e_delnext_eof
2401c80476e4SDavid E. O'Brien * edelnxt edelnxteof
2402c80476e4SDavid E. O'Brien * delete-char-or-eof delete-char
2403c80476e4SDavid E. O'Brien * F_DELNEXT_EOF F_DELNEXT
2404c80476e4SDavid E. O'Brien * e_delnext_eof e_delnext
2405c80476e4SDavid E. O'Brien * edelnxteof edelnxt
2406c80476e4SDavid E. O'Brien * delete-char-or-list delete-char-or-list-or-eof
2407c80476e4SDavid E. O'Brien * F_LIST_DELNEXT F_DELNEXT_LIST_EOF
2408c80476e4SDavid E. O'Brien * e_list_delnext e_delnext_list_eof
2409c80476e4SDavid E. O'Brien * edellsteof
2410c80476e4SDavid E. O'Brien * (no old equivalent) delete-char-or-list
2411c80476e4SDavid E. O'Brien * F_DELNEXT_LIST
2412c80476e4SDavid E. O'Brien * e_delnext_list
2413c80476e4SDavid E. O'Brien * e_delnxtlst
2414c80476e4SDavid E. O'Brien */
2415c80476e4SDavid E. O'Brien
2416c80476e4SDavid E. O'Brien /* added by mtk@ari.ncl.omron.co.jp (920818) */
2417c80476e4SDavid E. O'Brien /* rename e_delnext() -> e_delnext_eof() */
2418c80476e4SDavid E. O'Brien /*ARGSUSED*/
2419c80476e4SDavid E. O'Brien CCRETVAL
e_delnext(Char c)242045e5710bSMark Peek e_delnext(Char c)
2421c80476e4SDavid E. O'Brien {
2422c80476e4SDavid E. O'Brien USE(c);
2423c80476e4SDavid E. O'Brien if (Cursor == LastChar) {/* if I'm at the end */
2424c80476e4SDavid E. O'Brien if (!VImode) {
2425c80476e4SDavid E. O'Brien return(CC_ERROR);
2426c80476e4SDavid E. O'Brien }
2427c80476e4SDavid E. O'Brien else {
2428c80476e4SDavid E. O'Brien if (Cursor != InputBuf)
2429c80476e4SDavid E. O'Brien Cursor--;
2430c80476e4SDavid E. O'Brien else
2431c80476e4SDavid E. O'Brien return(CC_ERROR);
2432c80476e4SDavid E. O'Brien }
2433c80476e4SDavid E. O'Brien }
2434c80476e4SDavid E. O'Brien c_delafter(Argument); /* delete after dot */
2435c80476e4SDavid E. O'Brien if (Cursor > LastChar)
2436c80476e4SDavid E. O'Brien Cursor = LastChar; /* bounds check */
2437c80476e4SDavid E. O'Brien return(CC_REFRESH);
2438c80476e4SDavid E. O'Brien }
2439c80476e4SDavid E. O'Brien
2440c80476e4SDavid E. O'Brien
2441c80476e4SDavid E. O'Brien /*ARGSUSED*/
2442c80476e4SDavid E. O'Brien CCRETVAL
e_delnext_eof(Char c)244345e5710bSMark Peek e_delnext_eof(Char c)
2444c80476e4SDavid E. O'Brien {
2445c80476e4SDavid E. O'Brien USE(c);
2446c80476e4SDavid E. O'Brien if (Cursor == LastChar) {/* if I'm at the end */
2447c80476e4SDavid E. O'Brien if (!VImode) {
2448c80476e4SDavid E. O'Brien if (Cursor == InputBuf) {
2449c80476e4SDavid E. O'Brien /* if I'm also at the beginning */
2450c80476e4SDavid E. O'Brien so_write(STReof, 4);/* then do a EOF */
2451c80476e4SDavid E. O'Brien flush();
2452c80476e4SDavid E. O'Brien return(CC_EOF);
2453c80476e4SDavid E. O'Brien }
2454c80476e4SDavid E. O'Brien else
2455c80476e4SDavid E. O'Brien return(CC_ERROR);
2456c80476e4SDavid E. O'Brien }
2457c80476e4SDavid E. O'Brien else {
2458c80476e4SDavid E. O'Brien if (Cursor != InputBuf)
2459c80476e4SDavid E. O'Brien Cursor--;
2460c80476e4SDavid E. O'Brien else
2461c80476e4SDavid E. O'Brien return(CC_ERROR);
2462c80476e4SDavid E. O'Brien }
2463c80476e4SDavid E. O'Brien }
2464c80476e4SDavid E. O'Brien c_delafter(Argument); /* delete after dot */
2465c80476e4SDavid E. O'Brien if (Cursor > LastChar)
2466c80476e4SDavid E. O'Brien Cursor = LastChar; /* bounds check */
2467c80476e4SDavid E. O'Brien return(CC_REFRESH);
2468c80476e4SDavid E. O'Brien }
2469c80476e4SDavid E. O'Brien
2470c80476e4SDavid E. O'Brien /*ARGSUSED*/
2471c80476e4SDavid E. O'Brien CCRETVAL
e_delnext_list(Char c)247245e5710bSMark Peek e_delnext_list(Char c)
2473c80476e4SDavid E. O'Brien {
2474c80476e4SDavid E. O'Brien USE(c);
2475c80476e4SDavid E. O'Brien if (Cursor == LastChar) { /* if I'm at the end */
2476c80476e4SDavid E. O'Brien PastBottom();
2477c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
2478c80476e4SDavid E. O'Brien return(CC_LIST_CHOICES);
2479c80476e4SDavid E. O'Brien }
2480c80476e4SDavid E. O'Brien else {
2481c80476e4SDavid E. O'Brien c_delafter(Argument); /* delete after dot */
2482c80476e4SDavid E. O'Brien if (Cursor > LastChar)
2483c80476e4SDavid E. O'Brien Cursor = LastChar; /* bounds check */
2484c80476e4SDavid E. O'Brien return(CC_REFRESH);
2485c80476e4SDavid E. O'Brien }
2486c80476e4SDavid E. O'Brien }
2487c80476e4SDavid E. O'Brien
2488c80476e4SDavid E. O'Brien /*ARGSUSED*/
2489c80476e4SDavid E. O'Brien CCRETVAL
e_delnext_list_eof(Char c)249045e5710bSMark Peek e_delnext_list_eof(Char c)
2491c80476e4SDavid E. O'Brien {
2492c80476e4SDavid E. O'Brien USE(c);
2493c80476e4SDavid E. O'Brien if (Cursor == LastChar) { /* if I'm at the end */
2494c80476e4SDavid E. O'Brien if (Cursor == InputBuf) { /* if I'm also at the beginning */
2495c80476e4SDavid E. O'Brien so_write(STReof, 4);/* then do a EOF */
2496c80476e4SDavid E. O'Brien flush();
2497c80476e4SDavid E. O'Brien return(CC_EOF);
2498c80476e4SDavid E. O'Brien }
2499c80476e4SDavid E. O'Brien else {
2500c80476e4SDavid E. O'Brien PastBottom();
2501c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
2502c80476e4SDavid E. O'Brien return(CC_LIST_CHOICES);
2503c80476e4SDavid E. O'Brien }
2504c80476e4SDavid E. O'Brien }
2505c80476e4SDavid E. O'Brien else {
2506c80476e4SDavid E. O'Brien c_delafter(Argument); /* delete after dot */
2507c80476e4SDavid E. O'Brien if (Cursor > LastChar)
2508c80476e4SDavid E. O'Brien Cursor = LastChar; /* bounds check */
2509c80476e4SDavid E. O'Brien return(CC_REFRESH);
2510c80476e4SDavid E. O'Brien }
2511c80476e4SDavid E. O'Brien }
2512c80476e4SDavid E. O'Brien
2513c80476e4SDavid E. O'Brien /*ARGSUSED*/
2514c80476e4SDavid E. O'Brien CCRETVAL
e_list_eof(Char c)251545e5710bSMark Peek e_list_eof(Char c)
2516c80476e4SDavid E. O'Brien {
2517c80476e4SDavid E. O'Brien CCRETVAL rv;
2518c80476e4SDavid E. O'Brien
2519c80476e4SDavid E. O'Brien USE(c);
2520c80476e4SDavid E. O'Brien if (Cursor == LastChar && Cursor == InputBuf) {
2521c80476e4SDavid E. O'Brien so_write(STReof, 4); /* then do a EOF */
2522c80476e4SDavid E. O'Brien flush();
2523c80476e4SDavid E. O'Brien rv = CC_EOF;
2524c80476e4SDavid E. O'Brien }
2525c80476e4SDavid E. O'Brien else {
2526c80476e4SDavid E. O'Brien PastBottom();
2527c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
2528c80476e4SDavid E. O'Brien rv = CC_LIST_CHOICES;
2529c80476e4SDavid E. O'Brien }
2530c80476e4SDavid E. O'Brien return rv;
2531c80476e4SDavid E. O'Brien }
2532c80476e4SDavid E. O'Brien
2533c80476e4SDavid E. O'Brien /*ARGSUSED*/
2534c80476e4SDavid E. O'Brien CCRETVAL
e_delwordnext(Char c)253545e5710bSMark Peek e_delwordnext(Char c)
2536c80476e4SDavid E. O'Brien {
25376767bd61SMark Peek Char *cp;
2538c80476e4SDavid E. O'Brien
2539c80476e4SDavid E. O'Brien USE(c);
2540c80476e4SDavid E. O'Brien if (Cursor == LastChar)
2541c80476e4SDavid E. O'Brien return(CC_ERROR);
2542c80476e4SDavid E. O'Brien /* else */
2543c80476e4SDavid E. O'Brien
2544c80476e4SDavid E. O'Brien cp = c_next_word(Cursor, LastChar, Argument);
2545c80476e4SDavid E. O'Brien
25466767bd61SMark Peek c_push_kill(Cursor, cp); /* save the text */
2547c80476e4SDavid E. O'Brien
2548c80476e4SDavid E. O'Brien c_delafter((int)(cp - Cursor)); /* delete after dot */
2549c80476e4SDavid E. O'Brien if (Cursor > LastChar)
2550c80476e4SDavid E. O'Brien Cursor = LastChar; /* bounds check */
2551c80476e4SDavid E. O'Brien return(CC_REFRESH);
2552c80476e4SDavid E. O'Brien }
2553c80476e4SDavid E. O'Brien
2554c80476e4SDavid E. O'Brien /*ARGSUSED*/
2555c80476e4SDavid E. O'Brien CCRETVAL
e_toend(Char c)255645e5710bSMark Peek e_toend(Char c)
2557c80476e4SDavid E. O'Brien {
2558c80476e4SDavid E. O'Brien USE(c);
2559c80476e4SDavid E. O'Brien Cursor = LastChar;
2560c80476e4SDavid E. O'Brien if (VImode)
2561c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) {
2562c80476e4SDavid E. O'Brien c_delfini();
2563c80476e4SDavid E. O'Brien return(CC_REFRESH);
2564c80476e4SDavid E. O'Brien }
2565c80476e4SDavid E. O'Brien RefCursor(); /* move the cursor */
2566c80476e4SDavid E. O'Brien return(CC_NORM);
2567c80476e4SDavid E. O'Brien }
2568c80476e4SDavid E. O'Brien
2569c80476e4SDavid E. O'Brien /*ARGSUSED*/
2570c80476e4SDavid E. O'Brien CCRETVAL
e_tobeg(Char c)257145e5710bSMark Peek e_tobeg(Char c)
2572c80476e4SDavid E. O'Brien {
2573c80476e4SDavid E. O'Brien USE(c);
2574c80476e4SDavid E. O'Brien Cursor = InputBuf;
2575c80476e4SDavid E. O'Brien
2576c80476e4SDavid E. O'Brien if (VImode) {
2577c80476e4SDavid E. O'Brien while (Isspace(*Cursor)) /* We want FIRST non space character */
2578c80476e4SDavid E. O'Brien Cursor++;
2579c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) {
2580c80476e4SDavid E. O'Brien c_delfini();
2581c80476e4SDavid E. O'Brien return(CC_REFRESH);
2582c80476e4SDavid E. O'Brien }
2583c80476e4SDavid E. O'Brien }
2584c80476e4SDavid E. O'Brien
2585c80476e4SDavid E. O'Brien RefCursor(); /* move the cursor */
2586c80476e4SDavid E. O'Brien return(CC_NORM);
2587c80476e4SDavid E. O'Brien }
2588c80476e4SDavid E. O'Brien
2589c80476e4SDavid E. O'Brien /*ARGSUSED*/
2590c80476e4SDavid E. O'Brien CCRETVAL
e_killend(Char c)259145e5710bSMark Peek e_killend(Char c)
2592c80476e4SDavid E. O'Brien {
2593c80476e4SDavid E. O'Brien USE(c);
25946767bd61SMark Peek c_push_kill(Cursor, LastChar); /* copy it */
259545e5710bSMark Peek LastChar = Cursor; /* zap! -- delete to end */
259645e5710bSMark Peek if (Mark > Cursor)
259745e5710bSMark Peek Mark = Cursor;
259845e5710bSMark Peek MarkIsSet = 0;
2599c80476e4SDavid E. O'Brien return(CC_REFRESH);
2600c80476e4SDavid E. O'Brien }
2601c80476e4SDavid E. O'Brien
2602c80476e4SDavid E. O'Brien
2603c80476e4SDavid E. O'Brien /*ARGSUSED*/
2604c80476e4SDavid E. O'Brien CCRETVAL
e_killbeg(Char c)260545e5710bSMark Peek e_killbeg(Char c)
2606c80476e4SDavid E. O'Brien {
2607c80476e4SDavid E. O'Brien USE(c);
26086767bd61SMark Peek c_push_kill(InputBuf, Cursor); /* copy it */
2609c80476e4SDavid E. O'Brien c_delbefore((int)(Cursor - InputBuf));
261023338178SMark Peek if (Mark && Mark > Cursor)
261123338178SMark Peek Mark -= Cursor-InputBuf;
2612c80476e4SDavid E. O'Brien return(CC_REFRESH);
2613c80476e4SDavid E. O'Brien }
2614c80476e4SDavid E. O'Brien
2615c80476e4SDavid E. O'Brien /*ARGSUSED*/
2616c80476e4SDavid E. O'Brien CCRETVAL
e_killall(Char c)261745e5710bSMark Peek e_killall(Char c)
2618c80476e4SDavid E. O'Brien {
2619c80476e4SDavid E. O'Brien USE(c);
26206767bd61SMark Peek c_push_kill(InputBuf, LastChar); /* copy it */
262123338178SMark Peek Cursor = Mark = LastChar = InputBuf; /* zap! -- delete all of it */
262245e5710bSMark Peek MarkIsSet = 0;
2623c80476e4SDavid E. O'Brien return(CC_REFRESH);
2624c80476e4SDavid E. O'Brien }
2625c80476e4SDavid E. O'Brien
2626c80476e4SDavid E. O'Brien /*ARGSUSED*/
2627c80476e4SDavid E. O'Brien CCRETVAL
e_killregion(Char c)262845e5710bSMark Peek e_killregion(Char c)
2629c80476e4SDavid E. O'Brien {
2630c80476e4SDavid E. O'Brien USE(c);
2631c80476e4SDavid E. O'Brien if (!Mark)
2632c80476e4SDavid E. O'Brien return(CC_ERROR);
2633c80476e4SDavid E. O'Brien
2634c80476e4SDavid E. O'Brien if (Mark > Cursor) {
26356767bd61SMark Peek c_push_kill(Cursor, Mark); /* copy it */
26366767bd61SMark Peek c_delafter((int)(Mark - Cursor)); /* delete it - UNUSED BY VI mode */
26376767bd61SMark Peek Mark = Cursor;
2638c80476e4SDavid E. O'Brien }
2639c80476e4SDavid E. O'Brien else { /* mark is before cursor */
26406767bd61SMark Peek c_push_kill(Mark, Cursor); /* copy it */
26416767bd61SMark Peek c_delbefore((int)(Cursor - Mark));
2642c80476e4SDavid E. O'Brien }
264345e5710bSMark Peek if (adrof(STRhighlight) && MarkIsSet) {
264445e5710bSMark Peek ClearLines();
264545e5710bSMark Peek ClearDisp();
264645e5710bSMark Peek }
264745e5710bSMark Peek MarkIsSet = 0;
2648c80476e4SDavid E. O'Brien return(CC_REFRESH);
2649c80476e4SDavid E. O'Brien }
2650c80476e4SDavid E. O'Brien
2651c80476e4SDavid E. O'Brien /*ARGSUSED*/
2652c80476e4SDavid E. O'Brien CCRETVAL
e_copyregion(Char c)265345e5710bSMark Peek e_copyregion(Char c)
2654c80476e4SDavid E. O'Brien {
2655c80476e4SDavid E. O'Brien USE(c);
2656c80476e4SDavid E. O'Brien if (!Mark)
2657c80476e4SDavid E. O'Brien return(CC_ERROR);
2658c80476e4SDavid E. O'Brien
2659c80476e4SDavid E. O'Brien if (Mark > Cursor) {
26606767bd61SMark Peek c_push_kill(Cursor, Mark); /* copy it */
2661c80476e4SDavid E. O'Brien }
2662c80476e4SDavid E. O'Brien else { /* mark is before cursor */
26636767bd61SMark Peek c_push_kill(Mark, Cursor); /* copy it */
2664c80476e4SDavid E. O'Brien }
2665c80476e4SDavid E. O'Brien return(CC_NORM); /* don't even need to Refresh() */
2666c80476e4SDavid E. O'Brien }
2667c80476e4SDavid E. O'Brien
2668c80476e4SDavid E. O'Brien /*ARGSUSED*/
2669c80476e4SDavid E. O'Brien CCRETVAL
e_charswitch(Char cc)267045e5710bSMark Peek e_charswitch(Char cc)
2671c80476e4SDavid E. O'Brien {
26726767bd61SMark Peek Char c;
2673c80476e4SDavid E. O'Brien
2674c80476e4SDavid E. O'Brien USE(cc);
2675c80476e4SDavid E. O'Brien
2676c80476e4SDavid E. O'Brien /* do nothing if we are at beginning of line or have only one char */
2677c80476e4SDavid E. O'Brien if (Cursor == &InputBuf[0] || LastChar == &InputBuf[1]) {
2678c80476e4SDavid E. O'Brien return(CC_ERROR);
2679c80476e4SDavid E. O'Brien }
2680c80476e4SDavid E. O'Brien
2681c80476e4SDavid E. O'Brien if (Cursor < LastChar) {
2682c80476e4SDavid E. O'Brien Cursor++;
2683c80476e4SDavid E. O'Brien }
2684c80476e4SDavid E. O'Brien c = Cursor[-2];
2685c80476e4SDavid E. O'Brien Cursor[-2] = Cursor[-1];
2686c80476e4SDavid E. O'Brien Cursor[-1] = c;
2687c80476e4SDavid E. O'Brien return(CC_REFRESH);
2688c80476e4SDavid E. O'Brien }
2689c80476e4SDavid E. O'Brien
2690c80476e4SDavid E. O'Brien /*ARGSUSED*/
2691c80476e4SDavid E. O'Brien CCRETVAL
e_gcharswitch(Char cc)269245e5710bSMark Peek e_gcharswitch(Char cc)
2693c80476e4SDavid E. O'Brien { /* gosmacs style ^T */
26946767bd61SMark Peek Char c;
2695c80476e4SDavid E. O'Brien
2696c80476e4SDavid E. O'Brien USE(cc);
2697c80476e4SDavid E. O'Brien if (Cursor > &InputBuf[1]) {/* must have at least two chars entered */
2698c80476e4SDavid E. O'Brien c = Cursor[-2];
2699c80476e4SDavid E. O'Brien Cursor[-2] = Cursor[-1];
2700c80476e4SDavid E. O'Brien Cursor[-1] = c;
2701c80476e4SDavid E. O'Brien return(CC_REFRESH);
2702c80476e4SDavid E. O'Brien }
2703c80476e4SDavid E. O'Brien else {
2704c80476e4SDavid E. O'Brien return(CC_ERROR);
2705c80476e4SDavid E. O'Brien }
2706c80476e4SDavid E. O'Brien }
2707c80476e4SDavid E. O'Brien
2708c80476e4SDavid E. O'Brien /*ARGSUSED*/
2709c80476e4SDavid E. O'Brien CCRETVAL
e_charback(Char c)271045e5710bSMark Peek e_charback(Char c)
2711c80476e4SDavid E. O'Brien {
2712c80476e4SDavid E. O'Brien USE(c);
2713c80476e4SDavid E. O'Brien if (Cursor > InputBuf) {
271445e5710bSMark Peek if (Argument > Cursor - InputBuf)
2715c80476e4SDavid E. O'Brien Cursor = InputBuf;
2716c80476e4SDavid E. O'Brien else
271745e5710bSMark Peek Cursor -= Argument;
2718c80476e4SDavid E. O'Brien
2719c80476e4SDavid E. O'Brien if (VImode)
2720c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) {
2721c80476e4SDavid E. O'Brien c_delfini();
2722c80476e4SDavid E. O'Brien return(CC_REFRESH);
2723c80476e4SDavid E. O'Brien }
2724c80476e4SDavid E. O'Brien
2725c80476e4SDavid E. O'Brien RefCursor();
2726c80476e4SDavid E. O'Brien return(CC_NORM);
2727c80476e4SDavid E. O'Brien }
2728c80476e4SDavid E. O'Brien else {
2729c80476e4SDavid E. O'Brien return(CC_ERROR);
2730c80476e4SDavid E. O'Brien }
2731c80476e4SDavid E. O'Brien }
2732c80476e4SDavid E. O'Brien
2733c80476e4SDavid E. O'Brien /*ARGSUSED*/
2734c80476e4SDavid E. O'Brien CCRETVAL
v_wordback(Char c)273545e5710bSMark Peek v_wordback(Char c)
2736c80476e4SDavid E. O'Brien {
2737c80476e4SDavid E. O'Brien USE(c);
2738c80476e4SDavid E. O'Brien if (Cursor == InputBuf)
2739c80476e4SDavid E. O'Brien return(CC_ERROR);
2740c80476e4SDavid E. O'Brien /* else */
2741c80476e4SDavid E. O'Brien
27426767bd61SMark Peek Cursor = c_preword(Cursor, InputBuf, Argument, STRshwspace); /* bounds check */
2743c80476e4SDavid E. O'Brien
2744c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) {
2745c80476e4SDavid E. O'Brien c_delfini();
2746c80476e4SDavid E. O'Brien return(CC_REFRESH);
2747c80476e4SDavid E. O'Brien }
2748c80476e4SDavid E. O'Brien
2749c80476e4SDavid E. O'Brien RefCursor();
2750c80476e4SDavid E. O'Brien return(CC_NORM);
2751c80476e4SDavid E. O'Brien }
2752c80476e4SDavid E. O'Brien
2753c80476e4SDavid E. O'Brien /*ARGSUSED*/
2754c80476e4SDavid E. O'Brien CCRETVAL
e_wordback(Char c)275545e5710bSMark Peek e_wordback(Char c)
2756c80476e4SDavid E. O'Brien {
2757c80476e4SDavid E. O'Brien USE(c);
2758c80476e4SDavid E. O'Brien if (Cursor == InputBuf)
2759c80476e4SDavid E. O'Brien return(CC_ERROR);
2760c80476e4SDavid E. O'Brien /* else */
2761c80476e4SDavid E. O'Brien
2762c80476e4SDavid E. O'Brien Cursor = c_prev_word(Cursor, InputBuf, Argument); /* bounds check */
2763c80476e4SDavid E. O'Brien
2764c80476e4SDavid E. O'Brien if (VImode)
2765c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) {
2766c80476e4SDavid E. O'Brien c_delfini();
2767c80476e4SDavid E. O'Brien return(CC_REFRESH);
2768c80476e4SDavid E. O'Brien }
2769c80476e4SDavid E. O'Brien
2770c80476e4SDavid E. O'Brien RefCursor();
2771c80476e4SDavid E. O'Brien return(CC_NORM);
2772c80476e4SDavid E. O'Brien }
2773c80476e4SDavid E. O'Brien
2774c80476e4SDavid E. O'Brien /*ARGSUSED*/
2775c80476e4SDavid E. O'Brien CCRETVAL
e_charfwd(Char c)277645e5710bSMark Peek e_charfwd(Char c)
2777c80476e4SDavid E. O'Brien {
2778c80476e4SDavid E. O'Brien USE(c);
2779c80476e4SDavid E. O'Brien if (Cursor < LastChar) {
278045e5710bSMark Peek Cursor += Argument;
2781c80476e4SDavid E. O'Brien if (Cursor > LastChar)
2782c80476e4SDavid E. O'Brien Cursor = LastChar;
2783c80476e4SDavid E. O'Brien
2784c80476e4SDavid E. O'Brien if (VImode)
2785c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) {
2786c80476e4SDavid E. O'Brien c_delfini();
2787c80476e4SDavid E. O'Brien return(CC_REFRESH);
2788c80476e4SDavid E. O'Brien }
2789c80476e4SDavid E. O'Brien
2790c80476e4SDavid E. O'Brien RefCursor();
2791c80476e4SDavid E. O'Brien return(CC_NORM);
2792c80476e4SDavid E. O'Brien }
2793c80476e4SDavid E. O'Brien else {
2794c80476e4SDavid E. O'Brien return(CC_ERROR);
2795c80476e4SDavid E. O'Brien }
2796c80476e4SDavid E. O'Brien }
2797c80476e4SDavid E. O'Brien
2798c80476e4SDavid E. O'Brien /*ARGSUSED*/
2799c80476e4SDavid E. O'Brien CCRETVAL
e_wordfwd(Char c)280045e5710bSMark Peek e_wordfwd(Char c)
2801c80476e4SDavid E. O'Brien {
2802c80476e4SDavid E. O'Brien USE(c);
2803c80476e4SDavid E. O'Brien if (Cursor == LastChar)
2804c80476e4SDavid E. O'Brien return(CC_ERROR);
2805c80476e4SDavid E. O'Brien /* else */
2806c80476e4SDavid E. O'Brien
2807c80476e4SDavid E. O'Brien Cursor = c_next_word(Cursor, LastChar, Argument);
2808c80476e4SDavid E. O'Brien
2809c80476e4SDavid E. O'Brien if (VImode)
2810c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) {
2811c80476e4SDavid E. O'Brien c_delfini();
2812c80476e4SDavid E. O'Brien return(CC_REFRESH);
2813c80476e4SDavid E. O'Brien }
2814c80476e4SDavid E. O'Brien
2815c80476e4SDavid E. O'Brien RefCursor();
2816c80476e4SDavid E. O'Brien return(CC_NORM);
2817c80476e4SDavid E. O'Brien }
2818c80476e4SDavid E. O'Brien
2819c80476e4SDavid E. O'Brien /*ARGSUSED*/
2820c80476e4SDavid E. O'Brien CCRETVAL
v_wordfwd(Char c)282145e5710bSMark Peek v_wordfwd(Char c)
2822c80476e4SDavid E. O'Brien {
2823c80476e4SDavid E. O'Brien USE(c);
2824c80476e4SDavid E. O'Brien if (Cursor == LastChar)
2825c80476e4SDavid E. O'Brien return(CC_ERROR);
2826c80476e4SDavid E. O'Brien /* else */
2827c80476e4SDavid E. O'Brien
2828c80476e4SDavid E. O'Brien Cursor = c_nexword(Cursor, LastChar, Argument);
2829c80476e4SDavid E. O'Brien
2830c80476e4SDavid E. O'Brien if (VImode)
2831c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) {
2832c80476e4SDavid E. O'Brien c_delfini();
2833c80476e4SDavid E. O'Brien return(CC_REFRESH);
2834c80476e4SDavid E. O'Brien }
2835c80476e4SDavid E. O'Brien
2836c80476e4SDavid E. O'Brien RefCursor();
2837c80476e4SDavid E. O'Brien return(CC_NORM);
2838c80476e4SDavid E. O'Brien }
2839c80476e4SDavid E. O'Brien
2840c80476e4SDavid E. O'Brien /*ARGSUSED*/
2841c80476e4SDavid E. O'Brien CCRETVAL
v_wordbegnext(Char c)284245e5710bSMark Peek v_wordbegnext(Char c)
2843c80476e4SDavid E. O'Brien {
2844c80476e4SDavid E. O'Brien USE(c);
2845c80476e4SDavid E. O'Brien if (Cursor == LastChar)
2846c80476e4SDavid E. O'Brien return(CC_ERROR);
2847c80476e4SDavid E. O'Brien /* else */
2848c80476e4SDavid E. O'Brien
2849c80476e4SDavid E. O'Brien Cursor = c_next_word(Cursor, LastChar, Argument);
2850c80476e4SDavid E. O'Brien if (Cursor < LastChar)
2851c80476e4SDavid E. O'Brien Cursor++;
2852c80476e4SDavid E. O'Brien
2853c80476e4SDavid E. O'Brien if (VImode)
2854c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) {
2855c80476e4SDavid E. O'Brien c_delfini();
2856c80476e4SDavid E. O'Brien return(CC_REFRESH);
2857c80476e4SDavid E. O'Brien }
2858c80476e4SDavid E. O'Brien
2859c80476e4SDavid E. O'Brien RefCursor();
2860c80476e4SDavid E. O'Brien return(CC_NORM);
2861c80476e4SDavid E. O'Brien }
2862c80476e4SDavid E. O'Brien
2863c80476e4SDavid E. O'Brien /*ARGSUSED*/
2864c80476e4SDavid E. O'Brien static CCRETVAL
v_repeat_srch(int c)286545e5710bSMark Peek v_repeat_srch(int c)
2866c80476e4SDavid E. O'Brien {
2867c80476e4SDavid E. O'Brien CCRETVAL rv = CC_ERROR;
2868c80476e4SDavid E. O'Brien #ifdef SDEBUG
2869c80476e4SDavid E. O'Brien xprintf("dir %d patlen %d patbuf %S\n",
287045e5710bSMark Peek c, (int)patbuf.len, patbuf.s);
2871c80476e4SDavid E. O'Brien #endif
2872c80476e4SDavid E. O'Brien
2873c80476e4SDavid E. O'Brien LastCmd = (KEYCMD) c; /* Hack to stop c_hsetpat */
2874c80476e4SDavid E. O'Brien LastChar = InputBuf;
2875c80476e4SDavid E. O'Brien switch (c) {
2876c80476e4SDavid E. O'Brien case F_DOWN_SEARCH_HIST:
2877c80476e4SDavid E. O'Brien rv = e_down_search_hist(0);
2878c80476e4SDavid E. O'Brien break;
2879c80476e4SDavid E. O'Brien case F_UP_SEARCH_HIST:
2880c80476e4SDavid E. O'Brien rv = e_up_search_hist(0);
2881c80476e4SDavid E. O'Brien break;
2882c80476e4SDavid E. O'Brien default:
2883c80476e4SDavid E. O'Brien break;
2884c80476e4SDavid E. O'Brien }
2885c80476e4SDavid E. O'Brien return rv;
2886c80476e4SDavid E. O'Brien }
2887c80476e4SDavid E. O'Brien
2888c80476e4SDavid E. O'Brien static CCRETVAL
v_csearch_back(Char ch,int count,int tflag)288945e5710bSMark Peek v_csearch_back(Char ch, int count, int tflag)
2890c80476e4SDavid E. O'Brien {
2891c80476e4SDavid E. O'Brien Char *cp;
2892c80476e4SDavid E. O'Brien
2893c80476e4SDavid E. O'Brien cp = Cursor;
2894c80476e4SDavid E. O'Brien while (count--) {
2895c80476e4SDavid E. O'Brien if (*cp == ch)
2896c80476e4SDavid E. O'Brien cp--;
2897c80476e4SDavid E. O'Brien while (cp > InputBuf && *cp != ch)
2898c80476e4SDavid E. O'Brien cp--;
2899c80476e4SDavid E. O'Brien }
2900c80476e4SDavid E. O'Brien
2901c80476e4SDavid E. O'Brien if (cp < InputBuf || (cp == InputBuf && *cp != ch))
2902c80476e4SDavid E. O'Brien return(CC_ERROR);
2903c80476e4SDavid E. O'Brien
2904c80476e4SDavid E. O'Brien if (*cp == ch && tflag)
2905c80476e4SDavid E. O'Brien cp++;
2906c80476e4SDavid E. O'Brien
2907c80476e4SDavid E. O'Brien Cursor = cp;
2908c80476e4SDavid E. O'Brien
2909c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) {
2910c80476e4SDavid E. O'Brien Cursor++;
2911c80476e4SDavid E. O'Brien c_delfini();
2912c80476e4SDavid E. O'Brien return(CC_REFRESH);
2913c80476e4SDavid E. O'Brien }
2914c80476e4SDavid E. O'Brien
2915c80476e4SDavid E. O'Brien RefCursor();
2916c80476e4SDavid E. O'Brien return(CC_NORM);
2917c80476e4SDavid E. O'Brien }
2918c80476e4SDavid E. O'Brien
2919c80476e4SDavid E. O'Brien static CCRETVAL
v_csearch_fwd(Char ch,int count,int tflag)292045e5710bSMark Peek v_csearch_fwd(Char ch, int count, int tflag)
2921c80476e4SDavid E. O'Brien {
2922c80476e4SDavid E. O'Brien Char *cp;
2923c80476e4SDavid E. O'Brien
2924c80476e4SDavid E. O'Brien cp = Cursor;
2925c80476e4SDavid E. O'Brien while (count--) {
2926c80476e4SDavid E. O'Brien if (*cp == ch)
2927c80476e4SDavid E. O'Brien cp++;
2928c80476e4SDavid E. O'Brien while (cp < LastChar && *cp != ch)
2929c80476e4SDavid E. O'Brien cp++;
2930c80476e4SDavid E. O'Brien }
2931c80476e4SDavid E. O'Brien
2932c80476e4SDavid E. O'Brien if (cp >= LastChar)
2933c80476e4SDavid E. O'Brien return(CC_ERROR);
2934c80476e4SDavid E. O'Brien
2935c80476e4SDavid E. O'Brien if (*cp == ch && tflag)
2936c80476e4SDavid E. O'Brien cp--;
2937c80476e4SDavid E. O'Brien
2938c80476e4SDavid E. O'Brien Cursor = cp;
2939c80476e4SDavid E. O'Brien
2940c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) {
2941c80476e4SDavid E. O'Brien Cursor++;
2942c80476e4SDavid E. O'Brien c_delfini();
2943c80476e4SDavid E. O'Brien return(CC_REFRESH);
2944c80476e4SDavid E. O'Brien }
2945c80476e4SDavid E. O'Brien RefCursor();
2946c80476e4SDavid E. O'Brien return(CC_NORM);
2947c80476e4SDavid E. O'Brien }
2948c80476e4SDavid E. O'Brien
2949c80476e4SDavid E. O'Brien /*ARGSUSED*/
2950c80476e4SDavid E. O'Brien static CCRETVAL
v_action(int c)295145e5710bSMark Peek v_action(int c)
2952c80476e4SDavid E. O'Brien {
29536767bd61SMark Peek Char *cp, *kp;
2954c80476e4SDavid E. O'Brien
2955c80476e4SDavid E. O'Brien if (ActionFlag == TCSHOP_DELETE) {
2956c80476e4SDavid E. O'Brien ActionFlag = TCSHOP_NOP;
2957c80476e4SDavid E. O'Brien ActionPos = 0;
2958c80476e4SDavid E. O'Brien
2959c80476e4SDavid E. O'Brien UndoSize = 0;
2960c80476e4SDavid E. O'Brien kp = UndoBuf;
2961c80476e4SDavid E. O'Brien for (cp = InputBuf; cp < LastChar; cp++) {
2962c80476e4SDavid E. O'Brien *kp++ = *cp;
2963c80476e4SDavid E. O'Brien UndoSize++;
2964c80476e4SDavid E. O'Brien }
2965c80476e4SDavid E. O'Brien
2966c80476e4SDavid E. O'Brien UndoAction = TCSHOP_INSERT;
2967c80476e4SDavid E. O'Brien UndoPtr = InputBuf;
2968c80476e4SDavid E. O'Brien LastChar = InputBuf;
2969c80476e4SDavid E. O'Brien Cursor = InputBuf;
2970c80476e4SDavid E. O'Brien if (c & TCSHOP_INSERT)
2971c80476e4SDavid E. O'Brien c_alternativ_key_map(0);
2972c80476e4SDavid E. O'Brien
2973c80476e4SDavid E. O'Brien return(CC_REFRESH);
2974c80476e4SDavid E. O'Brien }
2975c80476e4SDavid E. O'Brien #ifdef notdef
2976c80476e4SDavid E. O'Brien else if (ActionFlag == TCSHOP_NOP) {
2977c80476e4SDavid E. O'Brien #endif
2978c80476e4SDavid E. O'Brien ActionPos = Cursor;
2979c80476e4SDavid E. O'Brien ActionFlag = c;
2980c80476e4SDavid E. O'Brien return(CC_ARGHACK); /* Do NOT clear out argument */
2981c80476e4SDavid E. O'Brien #ifdef notdef
2982c80476e4SDavid E. O'Brien }
2983c80476e4SDavid E. O'Brien else {
2984c80476e4SDavid E. O'Brien ActionFlag = 0;
2985c80476e4SDavid E. O'Brien ActionPos = 0;
2986c80476e4SDavid E. O'Brien return(CC_ERROR);
2987c80476e4SDavid E. O'Brien }
2988c80476e4SDavid E. O'Brien #endif
2989c80476e4SDavid E. O'Brien }
2990c80476e4SDavid E. O'Brien
2991c80476e4SDavid E. O'Brien #ifdef COMMENT
2992c80476e4SDavid E. O'Brien /* by: Brian Allison <uiucdcs!convex!allison@RUTGERS.EDU> */
2993c80476e4SDavid E. O'Brien static void
c_get_word(Char ** begin,Char ** end)299445e5710bSMark Peek c_get_word(Char **begin, Char **end)
2995c80476e4SDavid E. O'Brien {
2996c80476e4SDavid E. O'Brien Char *cp;
2997c80476e4SDavid E. O'Brien
2998c80476e4SDavid E. O'Brien cp = &Cursor[0];
2999c80476e4SDavid E. O'Brien while (Argument--) {
3000c80476e4SDavid E. O'Brien while ((cp <= LastChar) && (isword(*cp)))
3001c80476e4SDavid E. O'Brien cp++;
3002c80476e4SDavid E. O'Brien *end = --cp;
3003c80476e4SDavid E. O'Brien while ((cp >= InputBuf) && (isword(*cp)))
3004c80476e4SDavid E. O'Brien cp--;
3005c80476e4SDavid E. O'Brien *begin = ++cp;
3006c80476e4SDavid E. O'Brien }
3007c80476e4SDavid E. O'Brien }
3008c80476e4SDavid E. O'Brien #endif /* COMMENT */
3009c80476e4SDavid E. O'Brien
3010c80476e4SDavid E. O'Brien /*ARGSUSED*/
3011c80476e4SDavid E. O'Brien CCRETVAL
e_uppercase(Char c)301245e5710bSMark Peek e_uppercase(Char c)
3013c80476e4SDavid E. O'Brien {
3014c80476e4SDavid E. O'Brien Char *cp, *end;
3015c80476e4SDavid E. O'Brien
3016c80476e4SDavid E. O'Brien USE(c);
3017c80476e4SDavid E. O'Brien end = c_next_word(Cursor, LastChar, Argument);
3018c80476e4SDavid E. O'Brien
3019c80476e4SDavid E. O'Brien for (cp = Cursor; cp < end; cp++) /* PWP: was cp=begin */
3020c80476e4SDavid E. O'Brien if (Islower(*cp))
3021c80476e4SDavid E. O'Brien *cp = Toupper(*cp);
3022c80476e4SDavid E. O'Brien
3023c80476e4SDavid E. O'Brien Cursor = end;
3024c80476e4SDavid E. O'Brien if (Cursor > LastChar)
3025c80476e4SDavid E. O'Brien Cursor = LastChar;
3026c80476e4SDavid E. O'Brien return(CC_REFRESH);
3027c80476e4SDavid E. O'Brien }
3028c80476e4SDavid E. O'Brien
3029c80476e4SDavid E. O'Brien
3030c80476e4SDavid E. O'Brien /*ARGSUSED*/
3031c80476e4SDavid E. O'Brien CCRETVAL
e_capitalcase(Char c)303219d2e3deSDmitry Chagin e_capitalcase(Char c)
3033c80476e4SDavid E. O'Brien {
3034c80476e4SDavid E. O'Brien Char *cp, *end;
3035c80476e4SDavid E. O'Brien
3036c80476e4SDavid E. O'Brien USE(c);
3037c80476e4SDavid E. O'Brien end = c_next_word(Cursor, LastChar, Argument);
3038c80476e4SDavid E. O'Brien
3039c80476e4SDavid E. O'Brien cp = Cursor;
3040c80476e4SDavid E. O'Brien for (; cp < end; cp++) {
3041c80476e4SDavid E. O'Brien if (Isalpha(*cp)) {
3042c80476e4SDavid E. O'Brien if (Islower(*cp))
3043c80476e4SDavid E. O'Brien *cp = Toupper(*cp);
3044c80476e4SDavid E. O'Brien cp++;
3045c80476e4SDavid E. O'Brien break;
3046c80476e4SDavid E. O'Brien }
3047c80476e4SDavid E. O'Brien }
3048c80476e4SDavid E. O'Brien for (; cp < end; cp++)
3049c80476e4SDavid E. O'Brien if (Isupper(*cp))
3050c80476e4SDavid E. O'Brien *cp = Tolower(*cp);
3051c80476e4SDavid E. O'Brien
3052c80476e4SDavid E. O'Brien Cursor = end;
3053c80476e4SDavid E. O'Brien if (Cursor > LastChar)
3054c80476e4SDavid E. O'Brien Cursor = LastChar;
3055c80476e4SDavid E. O'Brien return(CC_REFRESH);
3056c80476e4SDavid E. O'Brien }
3057c80476e4SDavid E. O'Brien
3058c80476e4SDavid E. O'Brien /*ARGSUSED*/
3059c80476e4SDavid E. O'Brien CCRETVAL
e_lowercase(Char c)306045e5710bSMark Peek e_lowercase(Char c)
3061c80476e4SDavid E. O'Brien {
3062c80476e4SDavid E. O'Brien Char *cp, *end;
3063c80476e4SDavid E. O'Brien
3064c80476e4SDavid E. O'Brien USE(c);
3065c80476e4SDavid E. O'Brien end = c_next_word(Cursor, LastChar, Argument);
3066c80476e4SDavid E. O'Brien
3067c80476e4SDavid E. O'Brien for (cp = Cursor; cp < end; cp++)
3068c80476e4SDavid E. O'Brien if (Isupper(*cp))
3069c80476e4SDavid E. O'Brien *cp = Tolower(*cp);
3070c80476e4SDavid E. O'Brien
3071c80476e4SDavid E. O'Brien Cursor = end;
3072c80476e4SDavid E. O'Brien if (Cursor > LastChar)
3073c80476e4SDavid E. O'Brien Cursor = LastChar;
3074c80476e4SDavid E. O'Brien return(CC_REFRESH);
3075c80476e4SDavid E. O'Brien }
3076c80476e4SDavid E. O'Brien
3077c80476e4SDavid E. O'Brien
3078c80476e4SDavid E. O'Brien /*ARGSUSED*/
3079c80476e4SDavid E. O'Brien CCRETVAL
e_set_mark(Char c)308045e5710bSMark Peek e_set_mark(Char c)
3081c80476e4SDavid E. O'Brien {
3082c80476e4SDavid E. O'Brien USE(c);
308345e5710bSMark Peek if (adrof(STRhighlight) && MarkIsSet && Mark != Cursor) {
308445e5710bSMark Peek ClearLines();
308545e5710bSMark Peek ClearDisp();
308645e5710bSMark Peek Refresh();
308745e5710bSMark Peek }
3088c80476e4SDavid E. O'Brien Mark = Cursor;
308945e5710bSMark Peek MarkIsSet = 1;
3090c80476e4SDavid E. O'Brien return(CC_NORM);
3091c80476e4SDavid E. O'Brien }
3092c80476e4SDavid E. O'Brien
3093c80476e4SDavid E. O'Brien /*ARGSUSED*/
3094c80476e4SDavid E. O'Brien CCRETVAL
e_exchange_mark(Char c)309545e5710bSMark Peek e_exchange_mark(Char c)
3096c80476e4SDavid E. O'Brien {
30976767bd61SMark Peek Char *cp;
3098c80476e4SDavid E. O'Brien
3099c80476e4SDavid E. O'Brien USE(c);
3100c80476e4SDavid E. O'Brien cp = Cursor;
3101c80476e4SDavid E. O'Brien Cursor = Mark;
3102c80476e4SDavid E. O'Brien Mark = cp;
3103c80476e4SDavid E. O'Brien RefCursor();
3104c80476e4SDavid E. O'Brien return(CC_NORM);
3105c80476e4SDavid E. O'Brien }
3106c80476e4SDavid E. O'Brien
3107c80476e4SDavid E. O'Brien /*ARGSUSED*/
3108c80476e4SDavid E. O'Brien CCRETVAL
e_argfour(Char c)310945e5710bSMark Peek e_argfour(Char c)
3110c80476e4SDavid E. O'Brien { /* multiply current argument by 4 */
3111c80476e4SDavid E. O'Brien USE(c);
3112c80476e4SDavid E. O'Brien if (Argument > 1000000)
3113c80476e4SDavid E. O'Brien return CC_ERROR;
3114c80476e4SDavid E. O'Brien DoingArg = 1;
3115c80476e4SDavid E. O'Brien Argument *= 4;
3116c80476e4SDavid E. O'Brien return(CC_ARGHACK);
3117c80476e4SDavid E. O'Brien }
3118c80476e4SDavid E. O'Brien
311945e5710bSMark Peek static void
quote_mode_cleanup(void * unused)312045e5710bSMark Peek quote_mode_cleanup(void *unused)
312145e5710bSMark Peek {
312245e5710bSMark Peek USE(unused);
312345e5710bSMark Peek QuoteModeOff();
312445e5710bSMark Peek }
312545e5710bSMark Peek
3126c80476e4SDavid E. O'Brien /*ARGSUSED*/
3127c80476e4SDavid E. O'Brien CCRETVAL
e_quote(Char c)312845e5710bSMark Peek e_quote(Char c)
3129c80476e4SDavid E. O'Brien {
3130c80476e4SDavid E. O'Brien Char ch;
3131c80476e4SDavid E. O'Brien int num;
3132c80476e4SDavid E. O'Brien
3133c80476e4SDavid E. O'Brien USE(c);
3134c80476e4SDavid E. O'Brien QuoteModeOn();
313545e5710bSMark Peek cleanup_push(&c, quote_mode_cleanup); /* Using &c just as a mark */
3136c80476e4SDavid E. O'Brien num = GetNextChar(&ch);
313745e5710bSMark Peek cleanup_until(&c);
3138c80476e4SDavid E. O'Brien if (num == 1)
3139c80476e4SDavid E. O'Brien return e_insert(ch);
3140c80476e4SDavid E. O'Brien else
3141c80476e4SDavid E. O'Brien return e_send_eof(0);
3142c80476e4SDavid E. O'Brien }
3143c80476e4SDavid E. O'Brien
3144c80476e4SDavid E. O'Brien /*ARGSUSED*/
3145c80476e4SDavid E. O'Brien CCRETVAL
e_metanext(Char c)314645e5710bSMark Peek e_metanext(Char c)
3147c80476e4SDavid E. O'Brien {
3148c80476e4SDavid E. O'Brien USE(c);
3149c80476e4SDavid E. O'Brien MetaNext = 1;
3150c80476e4SDavid E. O'Brien return(CC_ARGHACK); /* preserve argument */
3151c80476e4SDavid E. O'Brien }
3152c80476e4SDavid E. O'Brien
3153c80476e4SDavid E. O'Brien #ifdef notdef
3154c80476e4SDavid E. O'Brien /*ARGSUSED*/
3155c80476e4SDavid E. O'Brien CCRETVAL
e_extendnext(Char c)315645e5710bSMark Peek e_extendnext(Char c)
3157c80476e4SDavid E. O'Brien {
3158c80476e4SDavid E. O'Brien CurrentKeyMap = CcAltMap;
3159c80476e4SDavid E. O'Brien return(CC_ARGHACK); /* preserve argument */
3160c80476e4SDavid E. O'Brien }
3161c80476e4SDavid E. O'Brien
3162c80476e4SDavid E. O'Brien #endif
3163c80476e4SDavid E. O'Brien
3164c80476e4SDavid E. O'Brien /*ARGSUSED*/
3165c80476e4SDavid E. O'Brien CCRETVAL
v_insbeg(Char c)316645e5710bSMark Peek v_insbeg(Char c)
3167c80476e4SDavid E. O'Brien { /* move to beginning of line and start vi
3168c80476e4SDavid E. O'Brien * insert mode */
3169c80476e4SDavid E. O'Brien USE(c);
3170c80476e4SDavid E. O'Brien Cursor = InputBuf;
3171c80476e4SDavid E. O'Brien InsertPos = Cursor;
3172c80476e4SDavid E. O'Brien
3173c80476e4SDavid E. O'Brien UndoPtr = Cursor;
3174c80476e4SDavid E. O'Brien UndoAction = TCSHOP_DELETE;
3175c80476e4SDavid E. O'Brien
3176c80476e4SDavid E. O'Brien RefCursor(); /* move the cursor */
3177c80476e4SDavid E. O'Brien c_alternativ_key_map(0);
3178c80476e4SDavid E. O'Brien return(CC_NORM);
3179c80476e4SDavid E. O'Brien }
3180c80476e4SDavid E. O'Brien
3181c80476e4SDavid E. O'Brien /*ARGSUSED*/
3182c80476e4SDavid E. O'Brien CCRETVAL
v_replone(Char c)318345e5710bSMark Peek v_replone(Char c)
3184c80476e4SDavid E. O'Brien { /* vi mode overwrite one character */
3185c80476e4SDavid E. O'Brien USE(c);
3186c80476e4SDavid E. O'Brien c_alternativ_key_map(0);
3187c80476e4SDavid E. O'Brien inputmode = MODE_REPLACE_1;
3188c80476e4SDavid E. O'Brien UndoAction = TCSHOP_CHANGE; /* Set Up for VI undo command */
3189c80476e4SDavid E. O'Brien UndoPtr = Cursor;
3190c80476e4SDavid E. O'Brien UndoSize = 0;
3191c80476e4SDavid E. O'Brien return(CC_NORM);
3192c80476e4SDavid E. O'Brien }
3193c80476e4SDavid E. O'Brien
3194c80476e4SDavid E. O'Brien /*ARGSUSED*/
3195c80476e4SDavid E. O'Brien CCRETVAL
v_replmode(Char c)319645e5710bSMark Peek v_replmode(Char c)
3197c80476e4SDavid E. O'Brien { /* vi mode start overwriting */
3198c80476e4SDavid E. O'Brien USE(c);
3199c80476e4SDavid E. O'Brien c_alternativ_key_map(0);
3200c80476e4SDavid E. O'Brien inputmode = MODE_REPLACE;
3201c80476e4SDavid E. O'Brien UndoAction = TCSHOP_CHANGE; /* Set Up for VI undo command */
3202c80476e4SDavid E. O'Brien UndoPtr = Cursor;
3203c80476e4SDavid E. O'Brien UndoSize = 0;
3204c80476e4SDavid E. O'Brien return(CC_NORM);
3205c80476e4SDavid E. O'Brien }
3206c80476e4SDavid E. O'Brien
3207c80476e4SDavid E. O'Brien /*ARGSUSED*/
3208c80476e4SDavid E. O'Brien CCRETVAL
v_substchar(Char c)320945e5710bSMark Peek v_substchar(Char c)
3210c80476e4SDavid E. O'Brien { /* vi mode substitute for one char */
3211c80476e4SDavid E. O'Brien USE(c);
3212c80476e4SDavid E. O'Brien c_delafter(Argument);
3213c80476e4SDavid E. O'Brien c_alternativ_key_map(0);
3214c80476e4SDavid E. O'Brien return(CC_REFRESH);
3215c80476e4SDavid E. O'Brien }
3216c80476e4SDavid E. O'Brien
3217c80476e4SDavid E. O'Brien /*ARGSUSED*/
3218c80476e4SDavid E. O'Brien CCRETVAL
v_substline(Char c)321945e5710bSMark Peek v_substline(Char c)
3220c80476e4SDavid E. O'Brien { /* vi mode replace whole line */
3221c80476e4SDavid E. O'Brien USE(c);
3222c80476e4SDavid E. O'Brien (void) e_killall(0);
3223c80476e4SDavid E. O'Brien c_alternativ_key_map(0);
3224c80476e4SDavid E. O'Brien return(CC_REFRESH);
3225c80476e4SDavid E. O'Brien }
3226c80476e4SDavid E. O'Brien
3227c80476e4SDavid E. O'Brien /*ARGSUSED*/
3228c80476e4SDavid E. O'Brien CCRETVAL
v_chgtoend(Char c)322945e5710bSMark Peek v_chgtoend(Char c)
3230c80476e4SDavid E. O'Brien { /* vi mode change to end of line */
3231c80476e4SDavid E. O'Brien USE(c);
3232c80476e4SDavid E. O'Brien (void) e_killend(0);
3233c80476e4SDavid E. O'Brien c_alternativ_key_map(0);
3234c80476e4SDavid E. O'Brien return(CC_REFRESH);
3235c80476e4SDavid E. O'Brien }
3236c80476e4SDavid E. O'Brien
3237c80476e4SDavid E. O'Brien /*ARGSUSED*/
3238c80476e4SDavid E. O'Brien CCRETVAL
v_insert(Char c)323945e5710bSMark Peek v_insert(Char c)
3240c80476e4SDavid E. O'Brien { /* vi mode start inserting */
3241c80476e4SDavid E. O'Brien USE(c);
3242c80476e4SDavid E. O'Brien c_alternativ_key_map(0);
3243c80476e4SDavid E. O'Brien
3244c80476e4SDavid E. O'Brien InsertPos = Cursor;
3245c80476e4SDavid E. O'Brien UndoPtr = Cursor;
3246c80476e4SDavid E. O'Brien UndoAction = TCSHOP_DELETE;
3247c80476e4SDavid E. O'Brien
3248c80476e4SDavid E. O'Brien return(CC_NORM);
3249c80476e4SDavid E. O'Brien }
3250c80476e4SDavid E. O'Brien
3251c80476e4SDavid E. O'Brien /*ARGSUSED*/
3252c80476e4SDavid E. O'Brien CCRETVAL
v_add(Char c)325345e5710bSMark Peek v_add(Char c)
3254c80476e4SDavid E. O'Brien { /* vi mode start adding */
3255c80476e4SDavid E. O'Brien USE(c);
3256c80476e4SDavid E. O'Brien c_alternativ_key_map(0);
3257c80476e4SDavid E. O'Brien if (Cursor < LastChar)
3258c80476e4SDavid E. O'Brien {
3259c80476e4SDavid E. O'Brien Cursor++;
3260c80476e4SDavid E. O'Brien if (Cursor > LastChar)
3261c80476e4SDavid E. O'Brien Cursor = LastChar;
3262c80476e4SDavid E. O'Brien RefCursor();
3263c80476e4SDavid E. O'Brien }
3264c80476e4SDavid E. O'Brien
3265c80476e4SDavid E. O'Brien InsertPos = Cursor;
3266c80476e4SDavid E. O'Brien UndoPtr = Cursor;
3267c80476e4SDavid E. O'Brien UndoAction = TCSHOP_DELETE;
3268c80476e4SDavid E. O'Brien
3269c80476e4SDavid E. O'Brien return(CC_NORM);
3270c80476e4SDavid E. O'Brien }
3271c80476e4SDavid E. O'Brien
3272c80476e4SDavid E. O'Brien /*ARGSUSED*/
3273c80476e4SDavid E. O'Brien CCRETVAL
v_addend(Char c)327445e5710bSMark Peek v_addend(Char c)
3275c80476e4SDavid E. O'Brien { /* vi mode to add at end of line */
3276c80476e4SDavid E. O'Brien USE(c);
3277c80476e4SDavid E. O'Brien c_alternativ_key_map(0);
3278c80476e4SDavid E. O'Brien Cursor = LastChar;
3279c80476e4SDavid E. O'Brien
3280c80476e4SDavid E. O'Brien InsertPos = LastChar; /* Mark where insertion begins */
3281c80476e4SDavid E. O'Brien UndoPtr = LastChar;
3282c80476e4SDavid E. O'Brien UndoAction = TCSHOP_DELETE;
3283c80476e4SDavid E. O'Brien
3284c80476e4SDavid E. O'Brien RefCursor();
3285c80476e4SDavid E. O'Brien return(CC_NORM);
3286c80476e4SDavid E. O'Brien }
3287c80476e4SDavid E. O'Brien
3288c80476e4SDavid E. O'Brien /*ARGSUSED*/
3289c80476e4SDavid E. O'Brien CCRETVAL
v_change_case(Char cc)329045e5710bSMark Peek v_change_case(Char cc)
3291c80476e4SDavid E. O'Brien {
329223338178SMark Peek Char c;
3293c80476e4SDavid E. O'Brien
3294c80476e4SDavid E. O'Brien USE(cc);
3295c80476e4SDavid E. O'Brien if (Cursor < LastChar) {
32963b6eaa7bSAndrey A. Chernov #ifndef WINNT_NATIVE
3297c80476e4SDavid E. O'Brien c = *Cursor;
3298c80476e4SDavid E. O'Brien #else
3299c80476e4SDavid E. O'Brien c = CHAR & *Cursor;
33003b6eaa7bSAndrey A. Chernov #endif /* WINNT_NATIVE */
3301c80476e4SDavid E. O'Brien if (Isupper(c))
3302c80476e4SDavid E. O'Brien *Cursor++ = Tolower(c);
3303c80476e4SDavid E. O'Brien else if (Islower(c))
3304c80476e4SDavid E. O'Brien *Cursor++ = Toupper(c);
3305c80476e4SDavid E. O'Brien else
3306c80476e4SDavid E. O'Brien Cursor++;
330723338178SMark Peek RefPlusOne(1); /* fast refresh for one char */
3308c80476e4SDavid E. O'Brien return(CC_NORM);
3309c80476e4SDavid E. O'Brien }
3310c80476e4SDavid E. O'Brien return(CC_ERROR);
3311c80476e4SDavid E. O'Brien }
3312c80476e4SDavid E. O'Brien
3313c80476e4SDavid E. O'Brien /*ARGSUSED*/
3314c80476e4SDavid E. O'Brien CCRETVAL
e_expand(Char c)331545e5710bSMark Peek e_expand(Char c)
3316c80476e4SDavid E. O'Brien {
33176767bd61SMark Peek Char *p;
3318c80476e4SDavid E. O'Brien
3319c80476e4SDavid E. O'Brien USE(c);
3320c80476e4SDavid E. O'Brien for (p = InputBuf; Isspace(*p); p++)
3321c80476e4SDavid E. O'Brien continue;
3322c80476e4SDavid E. O'Brien if (p == LastChar)
3323c80476e4SDavid E. O'Brien return(CC_ERROR);
3324c80476e4SDavid E. O'Brien
3325c80476e4SDavid E. O'Brien justpr++;
3326c80476e4SDavid E. O'Brien Expand++;
3327c80476e4SDavid E. O'Brien return(e_newline(0));
3328c80476e4SDavid E. O'Brien }
3329c80476e4SDavid E. O'Brien
3330c80476e4SDavid E. O'Brien /*ARGSUSED*/
3331c80476e4SDavid E. O'Brien CCRETVAL
e_startover(Char c)333245e5710bSMark Peek e_startover(Char c)
3333c80476e4SDavid E. O'Brien { /* erase all of current line, start again */
3334c80476e4SDavid E. O'Brien USE(c);
3335c80476e4SDavid E. O'Brien ResetInLine(0); /* reset the input pointers */
3336c80476e4SDavid E. O'Brien return(CC_REFRESH);
3337c80476e4SDavid E. O'Brien }
3338c80476e4SDavid E. O'Brien
3339c80476e4SDavid E. O'Brien /*ARGSUSED*/
3340c80476e4SDavid E. O'Brien CCRETVAL
e_redisp(Char c)334145e5710bSMark Peek e_redisp(Char c)
3342c80476e4SDavid E. O'Brien {
3343c80476e4SDavid E. O'Brien USE(c);
3344c80476e4SDavid E. O'Brien ClearLines();
3345c80476e4SDavid E. O'Brien ClearDisp();
3346c80476e4SDavid E. O'Brien return(CC_REFRESH);
3347c80476e4SDavid E. O'Brien }
3348c80476e4SDavid E. O'Brien
3349c80476e4SDavid E. O'Brien /*ARGSUSED*/
3350c80476e4SDavid E. O'Brien CCRETVAL
e_cleardisp(Char c)335145e5710bSMark Peek e_cleardisp(Char c)
3352c80476e4SDavid E. O'Brien {
3353c80476e4SDavid E. O'Brien USE(c);
3354c80476e4SDavid E. O'Brien ClearScreen(); /* clear the whole real screen */
3355c80476e4SDavid E. O'Brien ClearDisp(); /* reset everything */
3356c80476e4SDavid E. O'Brien return(CC_REFRESH);
3357c80476e4SDavid E. O'Brien }
3358c80476e4SDavid E. O'Brien
3359c80476e4SDavid E. O'Brien /*ARGSUSED*/
3360c80476e4SDavid E. O'Brien CCRETVAL
e_tty_int(Char c)336145e5710bSMark Peek e_tty_int(Char c)
3362c80476e4SDavid E. O'Brien {
3363c80476e4SDavid E. O'Brien USE(c);
33643b6eaa7bSAndrey A. Chernov #if defined(_MINIX) || defined(WINNT_NATIVE)
3365c80476e4SDavid E. O'Brien /* SAK PATCH: erase all of current line, start again */
3366c80476e4SDavid E. O'Brien ResetInLine(0); /* reset the input pointers */
3367c80476e4SDavid E. O'Brien xputchar('\n');
3368c80476e4SDavid E. O'Brien ClearDisp();
3369c80476e4SDavid E. O'Brien return (CC_REFRESH);
33703b6eaa7bSAndrey A. Chernov #else /* !_MINIX && !WINNT_NATIVE */
3371c80476e4SDavid E. O'Brien /* do no editing */
3372c80476e4SDavid E. O'Brien return (CC_NORM);
33733b6eaa7bSAndrey A. Chernov #endif /* _MINIX || WINNT_NATIVE */
3374c80476e4SDavid E. O'Brien }
3375c80476e4SDavid E. O'Brien
3376c80476e4SDavid E. O'Brien /*
3377c80476e4SDavid E. O'Brien * From: ghazi@cesl.rutgers.edu (Kaveh R. Ghazi)
3378c80476e4SDavid E. O'Brien * Function to send a character back to the input stream in cooked
3379c80476e4SDavid E. O'Brien * mode. Only works if we have TIOCSTI
3380c80476e4SDavid E. O'Brien */
3381c80476e4SDavid E. O'Brien /*ARGSUSED*/
3382c80476e4SDavid E. O'Brien CCRETVAL
e_stuff_char(Char c)338345e5710bSMark Peek e_stuff_char(Char c)
3384c80476e4SDavid E. O'Brien {
3385c80476e4SDavid E. O'Brien #ifdef TIOCSTI
3386c80476e4SDavid E. O'Brien int was_raw = Tty_raw_mode;
338723338178SMark Peek char buf[MB_LEN_MAX];
338823338178SMark Peek size_t i, len;
3389c80476e4SDavid E. O'Brien
3390c80476e4SDavid E. O'Brien if (was_raw)
3391c80476e4SDavid E. O'Brien (void) Cookedmode();
3392c80476e4SDavid E. O'Brien
339345e5710bSMark Peek (void) xwrite(SHIN, "\n", 1);
339419d2e3deSDmitry Chagin len = one_wctomb(buf, c);
339523338178SMark Peek for (i = 0; i < len; i++)
339623338178SMark Peek (void) ioctl(SHIN, TIOCSTI, (ioctl_t) &buf[i]);
3397c80476e4SDavid E. O'Brien
3398c80476e4SDavid E. O'Brien if (was_raw)
3399c80476e4SDavid E. O'Brien (void) Rawmode();
3400c80476e4SDavid E. O'Brien return(e_redisp(c));
3401c80476e4SDavid E. O'Brien #else /* !TIOCSTI */
3402c80476e4SDavid E. O'Brien return(CC_ERROR);
3403c80476e4SDavid E. O'Brien #endif /* !TIOCSTI */
3404c80476e4SDavid E. O'Brien }
3405c80476e4SDavid E. O'Brien
3406c80476e4SDavid E. O'Brien /*ARGSUSED*/
3407c80476e4SDavid E. O'Brien CCRETVAL
e_insovr(Char c)340845e5710bSMark Peek e_insovr(Char c)
3409c80476e4SDavid E. O'Brien {
3410c80476e4SDavid E. O'Brien USE(c);
3411c80476e4SDavid E. O'Brien inputmode = (inputmode == MODE_INSERT ? MODE_REPLACE : MODE_INSERT);
3412c80476e4SDavid E. O'Brien return(CC_NORM);
3413c80476e4SDavid E. O'Brien }
3414c80476e4SDavid E. O'Brien
3415c80476e4SDavid E. O'Brien /*ARGSUSED*/
3416c80476e4SDavid E. O'Brien CCRETVAL
e_tty_dsusp(Char c)341745e5710bSMark Peek e_tty_dsusp(Char c)
3418c80476e4SDavid E. O'Brien {
3419c80476e4SDavid E. O'Brien USE(c);
3420c80476e4SDavid E. O'Brien /* do no editing */
3421c80476e4SDavid E. O'Brien return(CC_NORM);
3422c80476e4SDavid E. O'Brien }
3423c80476e4SDavid E. O'Brien
3424c80476e4SDavid E. O'Brien /*ARGSUSED*/
3425c80476e4SDavid E. O'Brien CCRETVAL
e_tty_flusho(Char c)342645e5710bSMark Peek e_tty_flusho(Char c)
3427c80476e4SDavid E. O'Brien {
3428c80476e4SDavid E. O'Brien USE(c);
3429c80476e4SDavid E. O'Brien /* do no editing */
3430c80476e4SDavid E. O'Brien return(CC_NORM);
3431c80476e4SDavid E. O'Brien }
3432c80476e4SDavid E. O'Brien
3433c80476e4SDavid E. O'Brien /*ARGSUSED*/
3434c80476e4SDavid E. O'Brien CCRETVAL
e_tty_quit(Char c)343545e5710bSMark Peek e_tty_quit(Char c)
3436c80476e4SDavid E. O'Brien {
3437c80476e4SDavid E. O'Brien USE(c);
3438c80476e4SDavid E. O'Brien /* do no editing */
3439c80476e4SDavid E. O'Brien return(CC_NORM);
3440c80476e4SDavid E. O'Brien }
3441c80476e4SDavid E. O'Brien
3442c80476e4SDavid E. O'Brien /*ARGSUSED*/
3443c80476e4SDavid E. O'Brien CCRETVAL
e_tty_tsusp(Char c)344445e5710bSMark Peek e_tty_tsusp(Char c)
3445c80476e4SDavid E. O'Brien {
3446c80476e4SDavid E. O'Brien USE(c);
3447c80476e4SDavid E. O'Brien /* do no editing */
3448c80476e4SDavid E. O'Brien return(CC_NORM);
3449c80476e4SDavid E. O'Brien }
3450c80476e4SDavid E. O'Brien
3451c80476e4SDavid E. O'Brien /*ARGSUSED*/
3452c80476e4SDavid E. O'Brien CCRETVAL
e_tty_stopo(Char c)345345e5710bSMark Peek e_tty_stopo(Char c)
3454c80476e4SDavid E. O'Brien {
3455c80476e4SDavid E. O'Brien USE(c);
3456c80476e4SDavid E. O'Brien /* do no editing */
3457c80476e4SDavid E. O'Brien return(CC_NORM);
3458c80476e4SDavid E. O'Brien }
3459c80476e4SDavid E. O'Brien
3460a15e6f9aSMark Peek /* returns the number of (attempted) expansions */
3461a15e6f9aSMark Peek int
ExpandHistory(void)3462a15e6f9aSMark Peek ExpandHistory(void)
3463a15e6f9aSMark Peek {
3464a15e6f9aSMark Peek *LastChar = '\0'; /* just in case */
3465a15e6f9aSMark Peek return c_substitute();
3466a15e6f9aSMark Peek }
3467a15e6f9aSMark Peek
3468c80476e4SDavid E. O'Brien /*ARGSUSED*/
3469c80476e4SDavid E. O'Brien CCRETVAL
e_expand_history(Char c)347045e5710bSMark Peek e_expand_history(Char c)
3471c80476e4SDavid E. O'Brien {
3472c80476e4SDavid E. O'Brien USE(c);
3473a15e6f9aSMark Peek (void)ExpandHistory();
3474c80476e4SDavid E. O'Brien return(CC_NORM);
3475c80476e4SDavid E. O'Brien }
3476c80476e4SDavid E. O'Brien
3477c80476e4SDavid E. O'Brien /*ARGSUSED*/
3478c80476e4SDavid E. O'Brien CCRETVAL
e_magic_space(Char c)347945e5710bSMark Peek e_magic_space(Char c)
3480c80476e4SDavid E. O'Brien {
3481c80476e4SDavid E. O'Brien USE(c);
3482c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */
3483a15e6f9aSMark Peek (void)c_substitute();
3484c80476e4SDavid E. O'Brien return(e_insert(' '));
3485c80476e4SDavid E. O'Brien }
3486c80476e4SDavid E. O'Brien
3487c80476e4SDavid E. O'Brien /*ARGSUSED*/
3488c80476e4SDavid E. O'Brien CCRETVAL
e_inc_fwd(Char c)348945e5710bSMark Peek e_inc_fwd(Char c)
3490c80476e4SDavid E. O'Brien {
349145e5710bSMark Peek CCRETVAL ret;
349245e5710bSMark Peek
3493c80476e4SDavid E. O'Brien USE(c);
349445e5710bSMark Peek patbuf.len = 0;
349545e5710bSMark Peek MarkIsSet = 0;
349645e5710bSMark Peek ret = e_inc_search(F_DOWN_SEARCH_HIST);
349745e5710bSMark Peek if (adrof(STRhighlight) && IncMatchLen) {
349845e5710bSMark Peek IncMatchLen = 0;
349945e5710bSMark Peek ClearLines();
350045e5710bSMark Peek ClearDisp();
350145e5710bSMark Peek Refresh();
350245e5710bSMark Peek }
350345e5710bSMark Peek IncMatchLen = 0;
350445e5710bSMark Peek return ret;
3505c80476e4SDavid E. O'Brien }
3506c80476e4SDavid E. O'Brien
3507c80476e4SDavid E. O'Brien
3508c80476e4SDavid E. O'Brien /*ARGSUSED*/
3509c80476e4SDavid E. O'Brien CCRETVAL
e_inc_back(Char c)351045e5710bSMark Peek e_inc_back(Char c)
3511c80476e4SDavid E. O'Brien {
351245e5710bSMark Peek CCRETVAL ret;
351345e5710bSMark Peek
3514c80476e4SDavid E. O'Brien USE(c);
351545e5710bSMark Peek patbuf.len = 0;
351645e5710bSMark Peek MarkIsSet = 0;
351745e5710bSMark Peek ret = e_inc_search(F_UP_SEARCH_HIST);
351845e5710bSMark Peek if (adrof(STRhighlight) && IncMatchLen) {
351945e5710bSMark Peek IncMatchLen = 0;
352045e5710bSMark Peek ClearLines();
352145e5710bSMark Peek ClearDisp();
352245e5710bSMark Peek Refresh();
352345e5710bSMark Peek }
352445e5710bSMark Peek IncMatchLen = 0;
352545e5710bSMark Peek return ret;
3526c80476e4SDavid E. O'Brien }
3527c80476e4SDavid E. O'Brien
3528c80476e4SDavid E. O'Brien /*ARGSUSED*/
3529c80476e4SDavid E. O'Brien CCRETVAL
e_copyprev(Char c)353045e5710bSMark Peek e_copyprev(Char c)
3531c80476e4SDavid E. O'Brien {
35326767bd61SMark Peek Char *cp, *oldc, *dp;
3533c80476e4SDavid E. O'Brien
3534c80476e4SDavid E. O'Brien USE(c);
3535c80476e4SDavid E. O'Brien if (Cursor == InputBuf)
3536c80476e4SDavid E. O'Brien return(CC_ERROR);
3537c80476e4SDavid E. O'Brien /* else */
3538c80476e4SDavid E. O'Brien
3539c80476e4SDavid E. O'Brien oldc = Cursor;
3540c80476e4SDavid E. O'Brien /* does a bounds check */
3541c80476e4SDavid E. O'Brien cp = c_prev_word(Cursor, InputBuf, Argument);
3542c80476e4SDavid E. O'Brien
3543c80476e4SDavid E. O'Brien c_insert((int)(oldc - cp));
3544c80476e4SDavid E. O'Brien for (dp = oldc; cp < oldc && dp < LastChar; cp++)
3545c80476e4SDavid E. O'Brien *dp++ = *cp;
3546c80476e4SDavid E. O'Brien
3547c80476e4SDavid E. O'Brien Cursor = dp; /* put cursor at end */
3548c80476e4SDavid E. O'Brien
3549c80476e4SDavid E. O'Brien return(CC_REFRESH);
3550c80476e4SDavid E. O'Brien }
3551c80476e4SDavid E. O'Brien
3552c80476e4SDavid E. O'Brien /*ARGSUSED*/
3553c80476e4SDavid E. O'Brien CCRETVAL
e_tty_starto(Char c)355445e5710bSMark Peek e_tty_starto(Char c)
3555c80476e4SDavid E. O'Brien {
3556c80476e4SDavid E. O'Brien USE(c);
3557c80476e4SDavid E. O'Brien /* do no editing */
3558c80476e4SDavid E. O'Brien return(CC_NORM);
3559c80476e4SDavid E. O'Brien }
3560c80476e4SDavid E. O'Brien
3561c80476e4SDavid E. O'Brien /*ARGSUSED*/
3562c80476e4SDavid E. O'Brien CCRETVAL
e_load_average(Char c)356345e5710bSMark Peek e_load_average(Char c)
3564c80476e4SDavid E. O'Brien {
3565c80476e4SDavid E. O'Brien USE(c);
3566c80476e4SDavid E. O'Brien PastBottom();
3567c80476e4SDavid E. O'Brien #ifdef TIOCSTAT
3568c80476e4SDavid E. O'Brien /*
3569c80476e4SDavid E. O'Brien * Here we pass &c to the ioctl because some os's (NetBSD) expect it
3570c80476e4SDavid E. O'Brien * there even if they don't use it. (lukem@netbsd.org)
3571c80476e4SDavid E. O'Brien */
3572c80476e4SDavid E. O'Brien if (ioctl(SHIN, TIOCSTAT, (ioctl_t) &c) < 0)
3573c80476e4SDavid E. O'Brien #endif
3574a15e6f9aSMark Peek xprintf("%s", CGETS(5, 1, "Load average unavailable\n"));
3575c80476e4SDavid E. O'Brien return(CC_REFRESH);
3576c80476e4SDavid E. O'Brien }
3577c80476e4SDavid E. O'Brien
3578c80476e4SDavid E. O'Brien /*ARGSUSED*/
3579c80476e4SDavid E. O'Brien CCRETVAL
v_chgmeta(Char c)358045e5710bSMark Peek v_chgmeta(Char c)
3581c80476e4SDavid E. O'Brien {
3582c80476e4SDavid E. O'Brien USE(c);
3583c80476e4SDavid E. O'Brien /*
3584c80476e4SDavid E. O'Brien * Delete with insert == change: first we delete and then we leave in
3585c80476e4SDavid E. O'Brien * insert mode.
3586c80476e4SDavid E. O'Brien */
3587c80476e4SDavid E. O'Brien return(v_action(TCSHOP_DELETE|TCSHOP_INSERT));
3588c80476e4SDavid E. O'Brien }
3589c80476e4SDavid E. O'Brien
3590c80476e4SDavid E. O'Brien /*ARGSUSED*/
3591c80476e4SDavid E. O'Brien CCRETVAL
v_delmeta(Char c)359245e5710bSMark Peek v_delmeta(Char c)
3593c80476e4SDavid E. O'Brien {
3594c80476e4SDavid E. O'Brien USE(c);
3595c80476e4SDavid E. O'Brien return(v_action(TCSHOP_DELETE));
3596c80476e4SDavid E. O'Brien }
3597c80476e4SDavid E. O'Brien
3598c80476e4SDavid E. O'Brien
3599c80476e4SDavid E. O'Brien /*ARGSUSED*/
3600c80476e4SDavid E. O'Brien CCRETVAL
v_endword(Char c)360145e5710bSMark Peek v_endword(Char c)
3602c80476e4SDavid E. O'Brien {
3603c80476e4SDavid E. O'Brien USE(c);
3604c80476e4SDavid E. O'Brien if (Cursor == LastChar)
3605c80476e4SDavid E. O'Brien return(CC_ERROR);
3606c80476e4SDavid E. O'Brien /* else */
3607c80476e4SDavid E. O'Brien
36086767bd61SMark Peek Cursor = c_endword(Cursor, LastChar, Argument, STRshwspace);
3609c80476e4SDavid E. O'Brien
3610c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE)
3611c80476e4SDavid E. O'Brien {
3612c80476e4SDavid E. O'Brien Cursor++;
3613c80476e4SDavid E. O'Brien c_delfini();
3614c80476e4SDavid E. O'Brien return(CC_REFRESH);
3615c80476e4SDavid E. O'Brien }
3616c80476e4SDavid E. O'Brien
3617c80476e4SDavid E. O'Brien RefCursor();
3618c80476e4SDavid E. O'Brien return(CC_NORM);
3619c80476e4SDavid E. O'Brien }
3620c80476e4SDavid E. O'Brien
3621c80476e4SDavid E. O'Brien /*ARGSUSED*/
3622c80476e4SDavid E. O'Brien CCRETVAL
v_eword(Char c)362345e5710bSMark Peek v_eword(Char c)
3624c80476e4SDavid E. O'Brien {
3625c80476e4SDavid E. O'Brien USE(c);
3626c80476e4SDavid E. O'Brien if (Cursor == LastChar)
3627c80476e4SDavid E. O'Brien return(CC_ERROR);
3628c80476e4SDavid E. O'Brien /* else */
3629c80476e4SDavid E. O'Brien
3630c80476e4SDavid E. O'Brien Cursor = c_eword(Cursor, LastChar, Argument);
3631c80476e4SDavid E. O'Brien
3632c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) {
3633c80476e4SDavid E. O'Brien Cursor++;
3634c80476e4SDavid E. O'Brien c_delfini();
3635c80476e4SDavid E. O'Brien return(CC_REFRESH);
3636c80476e4SDavid E. O'Brien }
3637c80476e4SDavid E. O'Brien
3638c80476e4SDavid E. O'Brien RefCursor();
3639c80476e4SDavid E. O'Brien return(CC_NORM);
3640c80476e4SDavid E. O'Brien }
3641c80476e4SDavid E. O'Brien
3642c80476e4SDavid E. O'Brien /*ARGSUSED*/
3643c80476e4SDavid E. O'Brien CCRETVAL
v_char_fwd(Char c)364445e5710bSMark Peek v_char_fwd(Char c)
3645c80476e4SDavid E. O'Brien {
3646c80476e4SDavid E. O'Brien Char ch;
3647c80476e4SDavid E. O'Brien
3648c80476e4SDavid E. O'Brien USE(c);
3649c80476e4SDavid E. O'Brien if (GetNextChar(&ch) != 1)
3650c80476e4SDavid E. O'Brien return e_send_eof(0);
3651c80476e4SDavid E. O'Brien
3652c80476e4SDavid E. O'Brien srch_dir = CHAR_FWD;
3653c80476e4SDavid E. O'Brien srch_char = ch;
3654c80476e4SDavid E. O'Brien
3655c80476e4SDavid E. O'Brien return v_csearch_fwd(ch, Argument, 0);
3656c80476e4SDavid E. O'Brien
3657c80476e4SDavid E. O'Brien }
3658c80476e4SDavid E. O'Brien
3659c80476e4SDavid E. O'Brien /*ARGSUSED*/
3660c80476e4SDavid E. O'Brien CCRETVAL
v_char_back(Char c)366145e5710bSMark Peek v_char_back(Char c)
3662c80476e4SDavid E. O'Brien {
3663c80476e4SDavid E. O'Brien Char ch;
3664c80476e4SDavid E. O'Brien
3665c80476e4SDavid E. O'Brien USE(c);
3666c80476e4SDavid E. O'Brien if (GetNextChar(&ch) != 1)
3667c80476e4SDavid E. O'Brien return e_send_eof(0);
3668c80476e4SDavid E. O'Brien
3669c80476e4SDavid E. O'Brien srch_dir = CHAR_BACK;
3670c80476e4SDavid E. O'Brien srch_char = ch;
3671c80476e4SDavid E. O'Brien
3672c80476e4SDavid E. O'Brien return v_csearch_back(ch, Argument, 0);
3673c80476e4SDavid E. O'Brien }
3674c80476e4SDavid E. O'Brien
3675c80476e4SDavid E. O'Brien /*ARGSUSED*/
3676c80476e4SDavid E. O'Brien CCRETVAL
v_charto_fwd(Char c)367745e5710bSMark Peek v_charto_fwd(Char c)
3678c80476e4SDavid E. O'Brien {
3679c80476e4SDavid E. O'Brien Char ch;
3680c80476e4SDavid E. O'Brien
3681c80476e4SDavid E. O'Brien USE(c);
3682c80476e4SDavid E. O'Brien if (GetNextChar(&ch) != 1)
3683c80476e4SDavid E. O'Brien return e_send_eof(0);
3684c80476e4SDavid E. O'Brien
3685c80476e4SDavid E. O'Brien return v_csearch_fwd(ch, Argument, 1);
3686c80476e4SDavid E. O'Brien
3687c80476e4SDavid E. O'Brien }
3688c80476e4SDavid E. O'Brien
3689c80476e4SDavid E. O'Brien /*ARGSUSED*/
3690c80476e4SDavid E. O'Brien CCRETVAL
v_charto_back(Char c)369145e5710bSMark Peek v_charto_back(Char c)
3692c80476e4SDavid E. O'Brien {
3693c80476e4SDavid E. O'Brien Char ch;
3694c80476e4SDavid E. O'Brien
3695c80476e4SDavid E. O'Brien USE(c);
3696c80476e4SDavid E. O'Brien if (GetNextChar(&ch) != 1)
3697c80476e4SDavid E. O'Brien return e_send_eof(0);
3698c80476e4SDavid E. O'Brien
3699c80476e4SDavid E. O'Brien return v_csearch_back(ch, Argument, 1);
3700c80476e4SDavid E. O'Brien }
3701c80476e4SDavid E. O'Brien
3702c80476e4SDavid E. O'Brien /*ARGSUSED*/
3703c80476e4SDavid E. O'Brien CCRETVAL
v_rchar_fwd(Char c)370445e5710bSMark Peek v_rchar_fwd(Char c)
3705c80476e4SDavid E. O'Brien {
3706c80476e4SDavid E. O'Brien USE(c);
3707c80476e4SDavid E. O'Brien if (srch_char == 0)
3708c80476e4SDavid E. O'Brien return CC_ERROR;
3709c80476e4SDavid E. O'Brien
3710c80476e4SDavid E. O'Brien return srch_dir == CHAR_FWD ? v_csearch_fwd(srch_char, Argument, 0) :
3711c80476e4SDavid E. O'Brien v_csearch_back(srch_char, Argument, 0);
3712c80476e4SDavid E. O'Brien }
3713c80476e4SDavid E. O'Brien
3714c80476e4SDavid E. O'Brien /*ARGSUSED*/
3715c80476e4SDavid E. O'Brien CCRETVAL
v_rchar_back(Char c)371645e5710bSMark Peek v_rchar_back(Char c)
3717c80476e4SDavid E. O'Brien {
3718c80476e4SDavid E. O'Brien USE(c);
3719c80476e4SDavid E. O'Brien if (srch_char == 0)
3720c80476e4SDavid E. O'Brien return CC_ERROR;
3721c80476e4SDavid E. O'Brien
3722c80476e4SDavid E. O'Brien return srch_dir == CHAR_BACK ? v_csearch_fwd(srch_char, Argument, 0) :
3723c80476e4SDavid E. O'Brien v_csearch_back(srch_char, Argument, 0);
3724c80476e4SDavid E. O'Brien }
3725c80476e4SDavid E. O'Brien
3726c80476e4SDavid E. O'Brien /*ARGSUSED*/
3727c80476e4SDavid E. O'Brien CCRETVAL
v_undo(Char c)372845e5710bSMark Peek v_undo(Char c)
3729c80476e4SDavid E. O'Brien {
37306767bd61SMark Peek int loop;
37316767bd61SMark Peek Char *kp, *cp;
3732c80476e4SDavid E. O'Brien Char temp;
3733c80476e4SDavid E. O'Brien int size;
3734c80476e4SDavid E. O'Brien
3735c80476e4SDavid E. O'Brien USE(c);
3736c80476e4SDavid E. O'Brien switch (UndoAction) {
3737c80476e4SDavid E. O'Brien case TCSHOP_DELETE|TCSHOP_INSERT:
3738c80476e4SDavid E. O'Brien case TCSHOP_DELETE:
3739c80476e4SDavid E. O'Brien if (UndoSize == 0) return(CC_NORM);
3740c80476e4SDavid E. O'Brien cp = UndoPtr;
3741c80476e4SDavid E. O'Brien kp = UndoBuf;
3742c80476e4SDavid E. O'Brien for (loop=0; loop < UndoSize; loop++) /* copy the chars */
3743c80476e4SDavid E. O'Brien *kp++ = *cp++; /* into UndoBuf */
3744c80476e4SDavid E. O'Brien
3745c80476e4SDavid E. O'Brien for (cp = UndoPtr; cp <= LastChar; cp++)
3746c80476e4SDavid E. O'Brien *cp = cp[UndoSize];
3747c80476e4SDavid E. O'Brien
3748c80476e4SDavid E. O'Brien LastChar -= UndoSize;
3749c80476e4SDavid E. O'Brien Cursor = UndoPtr;
3750c80476e4SDavid E. O'Brien
3751c80476e4SDavid E. O'Brien UndoAction = TCSHOP_INSERT;
3752c80476e4SDavid E. O'Brien break;
3753c80476e4SDavid E. O'Brien
3754c80476e4SDavid E. O'Brien case TCSHOP_INSERT:
3755c80476e4SDavid E. O'Brien if (UndoSize == 0) return(CC_NORM);
3756c80476e4SDavid E. O'Brien cp = UndoPtr;
3757c80476e4SDavid E. O'Brien Cursor = UndoPtr;
3758c80476e4SDavid E. O'Brien kp = UndoBuf;
3759c80476e4SDavid E. O'Brien c_insert(UndoSize); /* open the space, */
3760c80476e4SDavid E. O'Brien for (loop = 0; loop < UndoSize; loop++) /* copy the chars */
3761c80476e4SDavid E. O'Brien *cp++ = *kp++;
3762c80476e4SDavid E. O'Brien
3763c80476e4SDavid E. O'Brien UndoAction = TCSHOP_DELETE;
3764c80476e4SDavid E. O'Brien break;
3765c80476e4SDavid E. O'Brien
3766c80476e4SDavid E. O'Brien case TCSHOP_CHANGE:
3767c80476e4SDavid E. O'Brien if (UndoSize == 0) return(CC_NORM);
3768c80476e4SDavid E. O'Brien cp = UndoPtr;
3769c80476e4SDavid E. O'Brien Cursor = UndoPtr;
3770c80476e4SDavid E. O'Brien kp = UndoBuf;
3771c80476e4SDavid E. O'Brien size = (int)(Cursor-LastChar); /* NOT NSL independant */
3772c80476e4SDavid E. O'Brien if (size < UndoSize)
3773c80476e4SDavid E. O'Brien size = UndoSize;
3774c80476e4SDavid E. O'Brien for (loop = 0; loop < size; loop++) {
3775c80476e4SDavid E. O'Brien temp = *kp;
3776c80476e4SDavid E. O'Brien *kp++ = *cp;
3777c80476e4SDavid E. O'Brien *cp++ = temp;
3778c80476e4SDavid E. O'Brien }
3779c80476e4SDavid E. O'Brien break;
3780c80476e4SDavid E. O'Brien
3781c80476e4SDavid E. O'Brien default:
3782c80476e4SDavid E. O'Brien return(CC_ERROR);
3783c80476e4SDavid E. O'Brien }
3784c80476e4SDavid E. O'Brien
3785c80476e4SDavid E. O'Brien return(CC_REFRESH);
3786c80476e4SDavid E. O'Brien }
3787c80476e4SDavid E. O'Brien
3788c80476e4SDavid E. O'Brien /*ARGSUSED*/
3789c80476e4SDavid E. O'Brien CCRETVAL
v_ush_meta(Char c)379045e5710bSMark Peek v_ush_meta(Char c)
3791c80476e4SDavid E. O'Brien {
3792c80476e4SDavid E. O'Brien USE(c);
3793c80476e4SDavid E. O'Brien return v_search(F_UP_SEARCH_HIST);
3794c80476e4SDavid E. O'Brien }
3795c80476e4SDavid E. O'Brien
3796c80476e4SDavid E. O'Brien /*ARGSUSED*/
3797c80476e4SDavid E. O'Brien CCRETVAL
v_dsh_meta(Char c)379845e5710bSMark Peek v_dsh_meta(Char c)
3799c80476e4SDavid E. O'Brien {
3800c80476e4SDavid E. O'Brien USE(c);
3801c80476e4SDavid E. O'Brien return v_search(F_DOWN_SEARCH_HIST);
3802c80476e4SDavid E. O'Brien }
3803c80476e4SDavid E. O'Brien
3804c80476e4SDavid E. O'Brien /*ARGSUSED*/
3805c80476e4SDavid E. O'Brien CCRETVAL
v_rsrch_fwd(Char c)380645e5710bSMark Peek v_rsrch_fwd(Char c)
3807c80476e4SDavid E. O'Brien {
3808c80476e4SDavid E. O'Brien USE(c);
380945e5710bSMark Peek if (patbuf.len == 0) return(CC_ERROR);
3810c80476e4SDavid E. O'Brien return(v_repeat_srch(searchdir));
3811c80476e4SDavid E. O'Brien }
3812c80476e4SDavid E. O'Brien
3813c80476e4SDavid E. O'Brien /*ARGSUSED*/
3814c80476e4SDavid E. O'Brien CCRETVAL
v_rsrch_back(Char c)381545e5710bSMark Peek v_rsrch_back(Char c)
3816c80476e4SDavid E. O'Brien {
3817c80476e4SDavid E. O'Brien USE(c);
381845e5710bSMark Peek if (patbuf.len == 0) return(CC_ERROR);
3819c80476e4SDavid E. O'Brien return(v_repeat_srch(searchdir == F_UP_SEARCH_HIST ?
3820c80476e4SDavid E. O'Brien F_DOWN_SEARCH_HIST : F_UP_SEARCH_HIST));
3821c80476e4SDavid E. O'Brien }
3822c80476e4SDavid E. O'Brien
38233b6eaa7bSAndrey A. Chernov #ifndef WINNT_NATIVE
3824c80476e4SDavid E. O'Brien /* Since ed.defns.h is generated from ed.defns.c, these empty
3825c80476e4SDavid E. O'Brien functions will keep the F_NUM_FNS consistent
3826c80476e4SDavid E. O'Brien */
3827c80476e4SDavid E. O'Brien CCRETVAL
e_copy_to_clipboard(Char c)382845e5710bSMark Peek e_copy_to_clipboard(Char c)
3829c80476e4SDavid E. O'Brien {
3830c80476e4SDavid E. O'Brien USE(c);
3831c80476e4SDavid E. O'Brien return CC_ERROR;
3832c80476e4SDavid E. O'Brien }
3833c80476e4SDavid E. O'Brien
3834c80476e4SDavid E. O'Brien CCRETVAL
e_paste_from_clipboard(Char c)383545e5710bSMark Peek e_paste_from_clipboard(Char c)
3836c80476e4SDavid E. O'Brien {
3837c80476e4SDavid E. O'Brien USE(c);
3838c80476e4SDavid E. O'Brien return (CC_ERROR);
3839c80476e4SDavid E. O'Brien }
3840c80476e4SDavid E. O'Brien
3841c80476e4SDavid E. O'Brien CCRETVAL
e_dosify_next(Char c)384245e5710bSMark Peek e_dosify_next(Char c)
3843c80476e4SDavid E. O'Brien {
3844c80476e4SDavid E. O'Brien USE(c);
3845c80476e4SDavid E. O'Brien return (CC_ERROR);
3846c80476e4SDavid E. O'Brien }
3847c80476e4SDavid E. O'Brien CCRETVAL
e_dosify_prev(Char c)384845e5710bSMark Peek e_dosify_prev(Char c)
3849c80476e4SDavid E. O'Brien {
3850c80476e4SDavid E. O'Brien USE(c);
3851c80476e4SDavid E. O'Brien return (CC_ERROR);
3852c80476e4SDavid E. O'Brien }
3853c80476e4SDavid E. O'Brien CCRETVAL
e_page_up(Char c)385445e5710bSMark Peek e_page_up(Char c)
3855c80476e4SDavid E. O'Brien {
3856c80476e4SDavid E. O'Brien USE(c);
3857c80476e4SDavid E. O'Brien return (CC_ERROR);
3858c80476e4SDavid E. O'Brien }
3859c80476e4SDavid E. O'Brien CCRETVAL
e_page_down(Char c)386045e5710bSMark Peek e_page_down(Char c)
3861c80476e4SDavid E. O'Brien {
3862c80476e4SDavid E. O'Brien USE(c);
3863c80476e4SDavid E. O'Brien return (CC_ERROR);
3864c80476e4SDavid E. O'Brien }
38653b6eaa7bSAndrey A. Chernov #endif /* !WINNT_NATIVE */
3866c80476e4SDavid E. O'Brien
3867c80476e4SDavid E. O'Brien #ifdef notdef
3868c80476e4SDavid E. O'Brien void
MoveCursor(int n)386945e5710bSMark Peek MoveCursor(int n) /* move cursor + right - left char */
3870c80476e4SDavid E. O'Brien {
3871c80476e4SDavid E. O'Brien Cursor = Cursor + n;
3872c80476e4SDavid E. O'Brien if (Cursor < InputBuf)
3873c80476e4SDavid E. O'Brien Cursor = InputBuf;
3874c80476e4SDavid E. O'Brien if (Cursor > LastChar)
3875c80476e4SDavid E. O'Brien Cursor = LastChar;
3876c80476e4SDavid E. O'Brien return;
3877c80476e4SDavid E. O'Brien }
3878c80476e4SDavid E. O'Brien
3879c80476e4SDavid E. O'Brien Char *
GetCursor(void)388045e5710bSMark Peek GetCursor(void)
3881c80476e4SDavid E. O'Brien {
3882c80476e4SDavid E. O'Brien return(Cursor);
3883c80476e4SDavid E. O'Brien }
3884c80476e4SDavid E. O'Brien
3885c80476e4SDavid E. O'Brien int
PutCursor(Char * p)388645e5710bSMark Peek PutCursor(Char *p)
3887c80476e4SDavid E. O'Brien {
3888c80476e4SDavid E. O'Brien if (p < InputBuf || p > LastChar)
3889c80476e4SDavid E. O'Brien return 1; /* Error */
3890c80476e4SDavid E. O'Brien Cursor = p;
3891c80476e4SDavid E. O'Brien return 0;
3892c80476e4SDavid E. O'Brien }
3893c80476e4SDavid E. O'Brien #endif
3894