xref: /freebsd/contrib/tcsh/ed.chared.c (revision 45e5710bbb3676c9d945e9df78019b2c58930a59)
145e5710bSMark Peek /* $Header: /p/tcsh/cvsroot/tcsh/ed.chared.c,v 3.93 2006/08/23 15:03:13 christos Exp $ */
2c80476e4SDavid E. O'Brien /*
3c80476e4SDavid E. O'Brien  * ed.chared.c: Character editing functions.
4c80476e4SDavid E. O'Brien  */
5c80476e4SDavid E. O'Brien /*-
6c80476e4SDavid E. O'Brien  * Copyright (c) 1980, 1991 The Regents of the University of California.
7c80476e4SDavid E. O'Brien  * All rights reserved.
8c80476e4SDavid E. O'Brien  *
9c80476e4SDavid E. O'Brien  * Redistribution and use in source and binary forms, with or without
10c80476e4SDavid E. O'Brien  * modification, are permitted provided that the following conditions
11c80476e4SDavid E. O'Brien  * are met:
12c80476e4SDavid E. O'Brien  * 1. Redistributions of source code must retain the above copyright
13c80476e4SDavid E. O'Brien  *    notice, this list of conditions and the following disclaimer.
14c80476e4SDavid E. O'Brien  * 2. Redistributions in binary form must reproduce the above copyright
15c80476e4SDavid E. O'Brien  *    notice, this list of conditions and the following disclaimer in the
16c80476e4SDavid E. O'Brien  *    documentation and/or other materials provided with the distribution.
1729301572SMark Peek  * 3. Neither the name of the University nor the names of its contributors
18c80476e4SDavid E. O'Brien  *    may be used to endorse or promote products derived from this software
19c80476e4SDavid E. O'Brien  *    without specific prior written permission.
20c80476e4SDavid E. O'Brien  *
21c80476e4SDavid E. O'Brien  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22c80476e4SDavid E. O'Brien  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23c80476e4SDavid E. O'Brien  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24c80476e4SDavid E. O'Brien  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25c80476e4SDavid E. O'Brien  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26c80476e4SDavid E. O'Brien  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27c80476e4SDavid E. O'Brien  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28c80476e4SDavid E. O'Brien  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29c80476e4SDavid E. O'Brien  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30c80476e4SDavid E. O'Brien  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31c80476e4SDavid E. O'Brien  * SUCH DAMAGE.
32c80476e4SDavid E. O'Brien  */
33c80476e4SDavid E. O'Brien /*
34c80476e4SDavid E. O'Brien   Bjorn Knutsson @ Thu Jun 24 19:02:17 1999
35c80476e4SDavid E. O'Brien 
36c80476e4SDavid E. O'Brien   e_dabbrev_expand() did not do proper completion if quoted spaces were present
37c80476e4SDavid E. O'Brien   in the string being completed. Exemple:
38c80476e4SDavid E. O'Brien 
39c80476e4SDavid E. O'Brien   # echo hello\ world
40c80476e4SDavid E. O'Brien   hello world
41c80476e4SDavid E. O'Brien   # echo h<press key bound to dabbrev-expande>
42c80476e4SDavid E. O'Brien   # echo hello\<cursor>
43c80476e4SDavid E. O'Brien 
44c80476e4SDavid E. O'Brien   Correct behavior is:
45c80476e4SDavid E. O'Brien   # echo h<press key bound to dabbrev-expande>
46c80476e4SDavid E. O'Brien   # echo hello\ world<cursor>
47c80476e4SDavid E. O'Brien 
48c80476e4SDavid E. O'Brien   The same problem occured if spaces were present in a string withing quotation
49c80476e4SDavid E. O'Brien   marks. Example:
50c80476e4SDavid E. O'Brien 
51c80476e4SDavid E. O'Brien   # echo "hello world"
52c80476e4SDavid E. O'Brien   hello world
53c80476e4SDavid E. O'Brien   # echo "h<press key bound to dabbrev-expande>
54c80476e4SDavid E. O'Brien   # echo "hello<cursor>
55c80476e4SDavid E. O'Brien 
56c80476e4SDavid E. O'Brien   The former problem could be solved with minor modifications of c_preword()
57c80476e4SDavid E. O'Brien   and c_endword(). The latter, however, required a significant rewrite of
58c80476e4SDavid E. O'Brien   c_preword(), since quoted strings must be parsed from start to end to
59c80476e4SDavid E. O'Brien   determine if a given character is inside or outside the quotation marks.
60c80476e4SDavid E. O'Brien 
61c80476e4SDavid E. O'Brien   Compare the following two strings:
62c80476e4SDavid E. O'Brien 
63c80476e4SDavid E. O'Brien   # echo \"" 'foo \' bar\"
64c80476e4SDavid E. O'Brien   " 'foo \' bar\
65c80476e4SDavid E. O'Brien   # echo '\"" 'foo \' bar\"
66c80476e4SDavid E. O'Brien   \"" foo ' bar"
67c80476e4SDavid E. O'Brien 
68c80476e4SDavid E. O'Brien   The only difference between the two echo lines is in the first character
69c80476e4SDavid E. O'Brien   after the echo command. The result is either one or three arguments.
70c80476e4SDavid E. O'Brien 
71c80476e4SDavid E. O'Brien  */
72c80476e4SDavid E. O'Brien 
73c80476e4SDavid E. O'Brien #include "sh.h"
74c80476e4SDavid E. O'Brien 
7545e5710bSMark Peek RCSID("$tcsh: ed.chared.c,v 3.93 2006/08/23 15:03:13 christos Exp $")
76c80476e4SDavid E. O'Brien 
77c80476e4SDavid E. O'Brien #include "ed.h"
78c80476e4SDavid E. O'Brien #include "tw.h"
79c80476e4SDavid E. O'Brien #include "ed.defns.h"
80c80476e4SDavid E. O'Brien 
81c80476e4SDavid E. O'Brien /* #define SDEBUG */
82c80476e4SDavid E. O'Brien 
83c80476e4SDavid E. O'Brien #define TCSHOP_NOP    	  0x00
84c80476e4SDavid E. O'Brien #define TCSHOP_DELETE 	  0x01
85c80476e4SDavid E. O'Brien #define TCSHOP_INSERT 	  0x02
86c80476e4SDavid E. O'Brien #define TCSHOP_CHANGE 	  0x04
87c80476e4SDavid E. O'Brien 
88c80476e4SDavid E. O'Brien #define CHAR_FWD	0
89c80476e4SDavid E. O'Brien #define CHAR_BACK	1
90c80476e4SDavid E. O'Brien 
91c80476e4SDavid E. O'Brien /*
92c80476e4SDavid E. O'Brien  * vi word treatment
93c80476e4SDavid E. O'Brien  * from: Gert-Jan Vons <vons@cesar.crbca1.sinet.slb.com>
94c80476e4SDavid E. O'Brien  */
95c80476e4SDavid E. O'Brien #define C_CLASS_WHITE	1
96c80476e4SDavid E. O'Brien #define C_CLASS_ALNUM	2
97c80476e4SDavid E. O'Brien #define C_CLASS_OTHER	3
98c80476e4SDavid E. O'Brien 
99c80476e4SDavid E. O'Brien static Char *InsertPos = InputBuf; /* Where insertion starts */
100c80476e4SDavid E. O'Brien static Char *ActionPos = 0;	   /* Where action begins  */
101c80476e4SDavid E. O'Brien static int  ActionFlag = TCSHOP_NOP;	   /* What delayed action to take */
102c80476e4SDavid E. O'Brien /*
103c80476e4SDavid E. O'Brien  * Word search state
104c80476e4SDavid E. O'Brien  */
105c80476e4SDavid E. O'Brien static int  searchdir = F_UP_SEARCH_HIST; 	/* Direction of last search */
10645e5710bSMark Peek static struct Strbuf patbuf; /* = Strbuf_INIT; Search target */
107c80476e4SDavid E. O'Brien /*
108c80476e4SDavid E. O'Brien  * Char search state
109c80476e4SDavid E. O'Brien  */
110c80476e4SDavid E. O'Brien static int  srch_dir = CHAR_FWD;		/* Direction of last search */
111c80476e4SDavid E. O'Brien static Char srch_char = 0;			/* Search target */
112c80476e4SDavid E. O'Brien 
113c80476e4SDavid E. O'Brien /* all routines that start with c_ are private to this set of routines */
11445e5710bSMark Peek static	void	 c_alternativ_key_map	(int);
11545e5710bSMark Peek void	 c_insert		(int);
11645e5710bSMark Peek void	 c_delafter		(int);
11745e5710bSMark Peek void	 c_delbefore		(int);
11845e5710bSMark Peek static 	int	 c_to_class		(Char);
11945e5710bSMark Peek static	Char	*c_prev_word		(Char *, Char *, int);
12045e5710bSMark Peek static	Char	*c_next_word		(Char *, Char *, int);
12145e5710bSMark Peek static	Char	*c_number		(Char *, int *, int);
12245e5710bSMark Peek static	Char	*c_expand		(Char *);
12345e5710bSMark Peek static	void	 c_excl			(Char *);
12445e5710bSMark Peek static	void	 c_substitute		(void);
12545e5710bSMark Peek static	void	 c_delfini		(void);
12645e5710bSMark Peek static	int	 c_hmatch		(Char *);
12745e5710bSMark Peek static	void	 c_hsetpat		(void);
128c80476e4SDavid E. O'Brien #ifdef COMMENT
12945e5710bSMark Peek static	void	 c_get_word		(Char **, Char **);
130c80476e4SDavid E. O'Brien #endif
13145e5710bSMark Peek static	Char	*c_preword		(Char *, Char *, int, Char *);
13245e5710bSMark Peek static	Char	*c_nexword		(Char *, Char *, int);
13345e5710bSMark Peek static	Char	*c_endword		(Char *, Char *, int, Char *);
13445e5710bSMark Peek static	Char	*c_eword		(Char *, Char *, int);
13545e5710bSMark Peek static	void	 c_push_kill		(Char *, Char *);
13645e5710bSMark Peek static	void	 c_save_inputbuf	(void);
13745e5710bSMark Peek static  CCRETVAL c_search_line		(Char *, int);
13845e5710bSMark Peek static  CCRETVAL v_repeat_srch		(int);
13945e5710bSMark Peek static	CCRETVAL e_inc_search		(int);
14045e5710bSMark Peek #ifdef notyet
14145e5710bSMark Peek static  CCRETVAL e_insert_str		(Char *);
14245e5710bSMark Peek #endif
14345e5710bSMark Peek static	CCRETVAL v_search		(int);
14445e5710bSMark Peek static	CCRETVAL v_csearch_fwd		(Char, int, int);
14545e5710bSMark Peek static	CCRETVAL v_action		(int);
14645e5710bSMark Peek static	CCRETVAL v_csearch_back		(Char, int, int);
147c80476e4SDavid E. O'Brien 
148c80476e4SDavid E. O'Brien static void
14945e5710bSMark Peek c_alternativ_key_map(int state)
150c80476e4SDavid E. O'Brien {
151c80476e4SDavid E. O'Brien     switch (state) {
152c80476e4SDavid E. O'Brien     case 0:
153c80476e4SDavid E. O'Brien 	CurrentKeyMap = CcKeyMap;
154c80476e4SDavid E. O'Brien 	break;
155c80476e4SDavid E. O'Brien     case 1:
156c80476e4SDavid E. O'Brien 	CurrentKeyMap = CcAltMap;
157c80476e4SDavid E. O'Brien 	break;
158c80476e4SDavid E. O'Brien     default:
159c80476e4SDavid E. O'Brien 	return;
160c80476e4SDavid E. O'Brien     }
161c80476e4SDavid E. O'Brien 
162c80476e4SDavid E. O'Brien     AltKeyMap = (Char) state;
163c80476e4SDavid E. O'Brien }
164c80476e4SDavid E. O'Brien 
1656767bd61SMark Peek void
16645e5710bSMark Peek c_insert(int num)
167c80476e4SDavid E. O'Brien {
1686767bd61SMark Peek     Char *cp;
169c80476e4SDavid E. O'Brien 
170c80476e4SDavid E. O'Brien     if (LastChar + num >= InputLim)
171c80476e4SDavid E. O'Brien 	return;			/* can't go past end of buffer */
172c80476e4SDavid E. O'Brien 
173c80476e4SDavid E. O'Brien     if (Cursor < LastChar) {	/* if I must move chars */
174c80476e4SDavid E. O'Brien 	for (cp = LastChar; cp >= Cursor; cp--)
175c80476e4SDavid E. O'Brien 	    cp[num] = *cp;
17623338178SMark Peek 	if (Mark && Mark > Cursor)
17723338178SMark Peek 		Mark += num;
178c80476e4SDavid E. O'Brien     }
179c80476e4SDavid E. O'Brien     LastChar += num;
180c80476e4SDavid E. O'Brien }
181c80476e4SDavid E. O'Brien 
1823b6eaa7bSAndrey A. Chernov void
18345e5710bSMark Peek c_delafter(int num)
184c80476e4SDavid E. O'Brien {
1856767bd61SMark Peek     Char *cp, *kp = NULL;
186c80476e4SDavid E. O'Brien 
187c80476e4SDavid E. O'Brien     if (num > LastChar - Cursor)
188c80476e4SDavid E. O'Brien 	num = (int) (LastChar - Cursor);	/* bounds check */
189c80476e4SDavid E. O'Brien 
190c80476e4SDavid E. O'Brien     if (num > 0) {			/* if I can delete anything */
191c80476e4SDavid E. O'Brien 	if (VImode) {
192c80476e4SDavid E. O'Brien 	    kp = UndoBuf;		/* Set Up for VI undo command */
193c80476e4SDavid E. O'Brien 	    UndoAction = TCSHOP_INSERT;
194c80476e4SDavid E. O'Brien 	    UndoSize = num;
195c80476e4SDavid E. O'Brien 	    UndoPtr  = Cursor;
196c80476e4SDavid E. O'Brien 	    for (cp = Cursor; cp <= LastChar; cp++) {
197c80476e4SDavid E. O'Brien 		*kp++ = *cp;	/* Save deleted chars into undobuf */
198c80476e4SDavid E. O'Brien 		*cp = cp[num];
199c80476e4SDavid E. O'Brien 	    }
200c80476e4SDavid E. O'Brien 	}
201c80476e4SDavid E. O'Brien 	else
20223338178SMark Peek 	    for (cp = Cursor; cp + num <= LastChar; cp++)
203c80476e4SDavid E. O'Brien 		*cp = cp[num];
204c80476e4SDavid E. O'Brien 	LastChar -= num;
20545e5710bSMark Peek 	/* Mark was within the range of the deleted word? */
20645e5710bSMark Peek 	if (Mark && Mark > Cursor && Mark <= Cursor+num)
20745e5710bSMark Peek 		Mark = Cursor;
20845e5710bSMark Peek 	/* Mark after the deleted word? */
20945e5710bSMark Peek 	else if (Mark && Mark > Cursor)
21023338178SMark Peek 		Mark -= num;
211c80476e4SDavid E. O'Brien     }
212c80476e4SDavid E. O'Brien #ifdef notdef
213c80476e4SDavid E. O'Brien     else {
214c80476e4SDavid E. O'Brien 	/*
215c80476e4SDavid E. O'Brien 	 * XXX: We don't want to do that. In emacs mode overwrite should be
216c80476e4SDavid E. O'Brien 	 * sticky. I am not sure how that affects vi mode
217c80476e4SDavid E. O'Brien 	 */
218c80476e4SDavid E. O'Brien 	inputmode = MODE_INSERT;
219c80476e4SDavid E. O'Brien     }
220c80476e4SDavid E. O'Brien #endif /* notdef */
221c80476e4SDavid E. O'Brien }
222c80476e4SDavid E. O'Brien 
2233b6eaa7bSAndrey A. Chernov void
22445e5710bSMark Peek c_delbefore(int num)		/* delete before dot, with bounds checking */
225c80476e4SDavid E. O'Brien {
2266767bd61SMark Peek     Char *cp, *kp = NULL;
227c80476e4SDavid E. O'Brien 
228c80476e4SDavid E. O'Brien     if (num > Cursor - InputBuf)
229c80476e4SDavid E. O'Brien 	num = (int) (Cursor - InputBuf);	/* bounds check */
230c80476e4SDavid E. O'Brien 
231c80476e4SDavid E. O'Brien     if (num > 0) {			/* if I can delete anything */
232c80476e4SDavid E. O'Brien 	if (VImode) {
233c80476e4SDavid E. O'Brien 	    kp = UndoBuf;		/* Set Up for VI undo command */
234c80476e4SDavid E. O'Brien 	    UndoAction = TCSHOP_INSERT;
235c80476e4SDavid E. O'Brien 	    UndoSize = num;
236c80476e4SDavid E. O'Brien 	    UndoPtr  = Cursor - num;
237c80476e4SDavid E. O'Brien 	    for (cp = Cursor - num; cp <= LastChar; cp++) {
238c80476e4SDavid E. O'Brien 		*kp++ = *cp;
239c80476e4SDavid E. O'Brien 		*cp = cp[num];
240c80476e4SDavid E. O'Brien 	    }
241c80476e4SDavid E. O'Brien 	}
242c80476e4SDavid E. O'Brien 	else
24323338178SMark Peek 	    for (cp = Cursor - num; cp + num <= LastChar; cp++)
244c80476e4SDavid E. O'Brien 		*cp = cp[num];
245c80476e4SDavid E. O'Brien 	LastChar -= num;
24623338178SMark Peek 	Cursor -= num;
24745e5710bSMark Peek 	/* Mark was within the range of the deleted word? */
24845e5710bSMark Peek 	if (Mark && Mark > Cursor && Mark <= Cursor+num)
24945e5710bSMark Peek 		Mark = Cursor;
25045e5710bSMark Peek 	/* Mark after the deleted word? */
25145e5710bSMark Peek 	else if (Mark && Mark > Cursor)
25223338178SMark Peek 		Mark -= num;
253c80476e4SDavid E. O'Brien     }
254c80476e4SDavid E. O'Brien }
255c80476e4SDavid E. O'Brien 
256c80476e4SDavid E. O'Brien static Char *
25745e5710bSMark Peek c_preword(Char *p, Char *low, int n, Char *delim)
258c80476e4SDavid E. O'Brien {
259c80476e4SDavid E. O'Brien   while (n--) {
2606767bd61SMark Peek     Char *prev = low;
2616767bd61SMark Peek     Char *new;
262c80476e4SDavid E. O'Brien 
2636767bd61SMark Peek     while (prev < p) {		/* Skip initial non-word chars */
2646767bd61SMark Peek       if (!Strchr(delim, *prev) || *(prev-1) == (Char)'\\')
265c80476e4SDavid E. O'Brien 	break;
266c80476e4SDavid E. O'Brien       prev++;
267c80476e4SDavid E. O'Brien     }
268c80476e4SDavid E. O'Brien 
269c80476e4SDavid E. O'Brien     new = prev;
270c80476e4SDavid E. O'Brien 
271c80476e4SDavid E. O'Brien     while (new < p) {
272c80476e4SDavid E. O'Brien       prev = new;
2736767bd61SMark Peek       new = c_endword(prev-1, p, 1, delim); /* Skip to next non-word char */
274c80476e4SDavid E. O'Brien       new++;			/* Step away from end of word */
2756767bd61SMark Peek       while (new <= p) {	/* Skip trailing non-word chars */
2766767bd61SMark Peek 	if (!Strchr(delim, *new) || *(new-1) == (Char)'\\')
277c80476e4SDavid E. O'Brien 	  break;
278c80476e4SDavid E. O'Brien 	new++;
279c80476e4SDavid E. O'Brien       }
280c80476e4SDavid E. O'Brien     }
281c80476e4SDavid E. O'Brien 
282c80476e4SDavid E. O'Brien     p = prev;			/* Set to previous word start */
283c80476e4SDavid E. O'Brien 
284c80476e4SDavid E. O'Brien   }
285c80476e4SDavid E. O'Brien   if (p < low)
286c80476e4SDavid E. O'Brien     p = low;
287c80476e4SDavid E. O'Brien   return (p);
288c80476e4SDavid E. O'Brien }
289c80476e4SDavid E. O'Brien 
290c80476e4SDavid E. O'Brien /*
291c80476e4SDavid E. O'Brien  * c_to_class() returns the class of the given character.
292c80476e4SDavid E. O'Brien  *
293c80476e4SDavid E. O'Brien  * This is used to make the c_prev_word() and c_next_word() functions
294c80476e4SDavid E. O'Brien  * work like vi's, which classify characters. A word is a sequence of
295c80476e4SDavid E. O'Brien  * characters belonging to the same class, classes being defined as
296c80476e4SDavid E. O'Brien  * follows:
297c80476e4SDavid E. O'Brien  *
298c80476e4SDavid E. O'Brien  *	1/ whitespace
299c80476e4SDavid E. O'Brien  *	2/ alphanumeric chars, + underscore
300c80476e4SDavid E. O'Brien  *	3/ others
301c80476e4SDavid E. O'Brien  */
302c80476e4SDavid E. O'Brien static int
30345e5710bSMark Peek c_to_class(Char ch)
304c80476e4SDavid E. O'Brien {
305c80476e4SDavid E. O'Brien     if (Isspace(ch))
306c80476e4SDavid E. O'Brien         return C_CLASS_WHITE;
307c80476e4SDavid E. O'Brien 
308c80476e4SDavid E. O'Brien     if (Isdigit(ch) || Isalpha(ch) || ch == '_')
309c80476e4SDavid E. O'Brien         return C_CLASS_ALNUM;
310c80476e4SDavid E. O'Brien 
311c80476e4SDavid E. O'Brien     return C_CLASS_OTHER;
312c80476e4SDavid E. O'Brien }
313c80476e4SDavid E. O'Brien 
314c80476e4SDavid E. O'Brien static Char *
31545e5710bSMark Peek c_prev_word(Char *p, Char *low, int n)
316c80476e4SDavid E. O'Brien {
317c80476e4SDavid E. O'Brien     p--;
318c80476e4SDavid E. O'Brien 
319c80476e4SDavid E. O'Brien     if (!VImode) {
320c80476e4SDavid E. O'Brien 	while (n--) {
321c80476e4SDavid E. O'Brien 	    while ((p >= low) && !isword(*p))
322c80476e4SDavid E. O'Brien 		p--;
323c80476e4SDavid E. O'Brien 	    while ((p >= low) && isword(*p))
324c80476e4SDavid E. O'Brien 		p--;
325c80476e4SDavid E. O'Brien 	}
326c80476e4SDavid E. O'Brien 
327c80476e4SDavid E. O'Brien 	/* cp now points to one character before the word */
328c80476e4SDavid E. O'Brien 	p++;
329c80476e4SDavid E. O'Brien 	if (p < low)
330c80476e4SDavid E. O'Brien 	    p = low;
331c80476e4SDavid E. O'Brien 	/* cp now points where we want it */
332c80476e4SDavid E. O'Brien 	return(p);
333c80476e4SDavid E. O'Brien     }
334c80476e4SDavid E. O'Brien 
335c80476e4SDavid E. O'Brien     while (n--) {
3366767bd61SMark Peek         int  c_class;
337c80476e4SDavid E. O'Brien 
338c80476e4SDavid E. O'Brien         if (p < low)
339c80476e4SDavid E. O'Brien             break;
340c80476e4SDavid E. O'Brien 
341c80476e4SDavid E. O'Brien         /* scan until beginning of current word (may be all whitespace!) */
342c80476e4SDavid E. O'Brien         c_class = c_to_class(*p);
343c80476e4SDavid E. O'Brien         while ((p >= low) && c_class == c_to_class(*p))
344c80476e4SDavid E. O'Brien             p--;
345c80476e4SDavid E. O'Brien 
346c80476e4SDavid E. O'Brien         /* if this was a non_whitespace word, we're ready */
347c80476e4SDavid E. O'Brien         if (c_class != C_CLASS_WHITE)
348c80476e4SDavid E. O'Brien             continue;
349c80476e4SDavid E. O'Brien 
350c80476e4SDavid E. O'Brien         /* otherwise, move back to beginning of the word just found */
351c80476e4SDavid E. O'Brien         c_class = c_to_class(*p);
352c80476e4SDavid E. O'Brien         while ((p >= low) && c_class == c_to_class(*p))
353c80476e4SDavid E. O'Brien             p--;
354c80476e4SDavid E. O'Brien     }
355c80476e4SDavid E. O'Brien 
356c80476e4SDavid E. O'Brien     p++;                        /* correct overshoot */
357c80476e4SDavid E. O'Brien 
358c80476e4SDavid E. O'Brien     return (p);
359c80476e4SDavid E. O'Brien }
360c80476e4SDavid E. O'Brien 
361c80476e4SDavid E. O'Brien static Char *
36245e5710bSMark Peek c_next_word(Char *p, Char *high, int n)
363c80476e4SDavid E. O'Brien {
364c80476e4SDavid E. O'Brien     if (!VImode) {
365c80476e4SDavid E. O'Brien 	while (n--) {
366c80476e4SDavid E. O'Brien 	    while ((p < high) && !isword(*p))
367c80476e4SDavid E. O'Brien 		p++;
368c80476e4SDavid E. O'Brien 	    while ((p < high) && isword(*p))
369c80476e4SDavid E. O'Brien 		p++;
370c80476e4SDavid E. O'Brien 	}
371c80476e4SDavid E. O'Brien 	if (p > high)
372c80476e4SDavid E. O'Brien 	    p = high;
373c80476e4SDavid E. O'Brien 	/* p now points where we want it */
374c80476e4SDavid E. O'Brien 	return(p);
375c80476e4SDavid E. O'Brien     }
376c80476e4SDavid E. O'Brien 
377c80476e4SDavid E. O'Brien     while (n--) {
3786767bd61SMark Peek         int  c_class;
379c80476e4SDavid E. O'Brien 
380c80476e4SDavid E. O'Brien         if (p >= high)
381c80476e4SDavid E. O'Brien             break;
382c80476e4SDavid E. O'Brien 
383c80476e4SDavid E. O'Brien         /* scan until end of current word (may be all whitespace!) */
384c80476e4SDavid E. O'Brien         c_class = c_to_class(*p);
385c80476e4SDavid E. O'Brien         while ((p < high) && c_class == c_to_class(*p))
386c80476e4SDavid E. O'Brien             p++;
387c80476e4SDavid E. O'Brien 
388c80476e4SDavid E. O'Brien         /* if this was all whitespace, we're ready */
389c80476e4SDavid E. O'Brien         if (c_class == C_CLASS_WHITE)
390c80476e4SDavid E. O'Brien             continue;
391c80476e4SDavid E. O'Brien 
392c80476e4SDavid E. O'Brien 	/* if we've found white-space at the end of the word, skip it */
393c80476e4SDavid E. O'Brien         while ((p < high) && c_to_class(*p) == C_CLASS_WHITE)
394c80476e4SDavid E. O'Brien             p++;
395c80476e4SDavid E. O'Brien     }
396c80476e4SDavid E. O'Brien 
397c80476e4SDavid E. O'Brien     p--;                        /* correct overshoot */
398c80476e4SDavid E. O'Brien 
399c80476e4SDavid E. O'Brien     return (p);
400c80476e4SDavid E. O'Brien }
401c80476e4SDavid E. O'Brien 
402c80476e4SDavid E. O'Brien static Char *
40345e5710bSMark Peek c_nexword(Char *p, Char *high, int n)
404c80476e4SDavid E. O'Brien {
405c80476e4SDavid E. O'Brien     while (n--) {
406c80476e4SDavid E. O'Brien 	while ((p < high) && !Isspace(*p))
407c80476e4SDavid E. O'Brien 	    p++;
408c80476e4SDavid E. O'Brien 	while ((p < high) && Isspace(*p))
409c80476e4SDavid E. O'Brien 	    p++;
410c80476e4SDavid E. O'Brien     }
411c80476e4SDavid E. O'Brien 
412c80476e4SDavid E. O'Brien     if (p > high)
413c80476e4SDavid E. O'Brien 	p = high;
414c80476e4SDavid E. O'Brien     /* p now points where we want it */
415c80476e4SDavid E. O'Brien     return(p);
416c80476e4SDavid E. O'Brien }
417c80476e4SDavid E. O'Brien 
418c80476e4SDavid E. O'Brien /*
419c80476e4SDavid E. O'Brien  * Expand-History (originally "Magic-Space") code added by
420c80476e4SDavid E. O'Brien  * Ray Moody <ray@gibbs.physics.purdue.edu>
421c80476e4SDavid E. O'Brien  * this is a neat, but odd, addition.
422c80476e4SDavid E. O'Brien  */
423c80476e4SDavid E. O'Brien 
424c80476e4SDavid E. O'Brien /*
425c80476e4SDavid E. O'Brien  * c_number: Ignore character p points to, return number appearing after that.
426c80476e4SDavid E. O'Brien  * A '$' by itself means a big number; "$-" is for negative; '^' means 1.
427c80476e4SDavid E. O'Brien  * Return p pointing to last char used.
428c80476e4SDavid E. O'Brien  */
429c80476e4SDavid E. O'Brien 
430c80476e4SDavid E. O'Brien /*
431c80476e4SDavid E. O'Brien  * dval is the number to subtract from for things like $-3
432c80476e4SDavid E. O'Brien  */
433c80476e4SDavid E. O'Brien 
434c80476e4SDavid E. O'Brien static Char *
43545e5710bSMark Peek c_number(Char *p, int *num, int dval)
436c80476e4SDavid E. O'Brien {
4376767bd61SMark Peek     int i;
4386767bd61SMark Peek     int sign = 1;
439c80476e4SDavid E. O'Brien 
440c80476e4SDavid E. O'Brien     if (*++p == '^') {
441c80476e4SDavid E. O'Brien 	*num = 1;
442c80476e4SDavid E. O'Brien 	return(p);
443c80476e4SDavid E. O'Brien     }
444c80476e4SDavid E. O'Brien     if (*p == '$') {
445c80476e4SDavid E. O'Brien 	if (*++p != '-') {
44645e5710bSMark Peek 	    *num = INT_MAX;	/* Handle $ */
447c80476e4SDavid E. O'Brien 	    return(--p);
448c80476e4SDavid E. O'Brien 	}
449c80476e4SDavid E. O'Brien 	sign = -1;		/* Handle $- */
450c80476e4SDavid E. O'Brien 	++p;
451c80476e4SDavid E. O'Brien     }
452c80476e4SDavid E. O'Brien     for (i = 0; *p >= '0' && *p <= '9'; i = 10 * i + *p++ - '0')
453c80476e4SDavid E. O'Brien 	continue;
454c80476e4SDavid E. O'Brien     *num = (sign < 0 ? dval - i : i);
455c80476e4SDavid E. O'Brien     return(--p);
456c80476e4SDavid E. O'Brien }
457c80476e4SDavid E. O'Brien 
458c80476e4SDavid E. O'Brien /*
459c80476e4SDavid E. O'Brien  * excl_expand: There is an excl to be expanded to p -- do the right thing
460c80476e4SDavid E. O'Brien  * with it and return a version of p advanced over the expanded stuff.  Also,
461c80476e4SDavid E. O'Brien  * update tsh_cur and related things as appropriate...
462c80476e4SDavid E. O'Brien  */
463c80476e4SDavid E. O'Brien 
464c80476e4SDavid E. O'Brien static Char *
46545e5710bSMark Peek c_expand(Char *p)
466c80476e4SDavid E. O'Brien {
4676767bd61SMark Peek     Char *q;
4686767bd61SMark Peek     struct Hist *h = Histlist.Hnext;
4696767bd61SMark Peek     struct wordent *l;
470c80476e4SDavid E. O'Brien     int     i, from, to, dval;
47123338178SMark Peek     int    all_dig;
47223338178SMark Peek     int    been_once = 0;
473c80476e4SDavid E. O'Brien     Char   *op = p;
47445e5710bSMark Peek     Char   *buf;
47545e5710bSMark Peek     size_t buf_len;
47645e5710bSMark Peek     Char   *modbuf;
477c80476e4SDavid E. O'Brien 
47845e5710bSMark Peek     buf = NULL;
479c80476e4SDavid E. O'Brien     if (!h)
480c80476e4SDavid E. O'Brien 	goto excl_err;
481c80476e4SDavid E. O'Brien excl_sw:
482c80476e4SDavid E. O'Brien     switch (*(q = p + 1)) {
483c80476e4SDavid E. O'Brien 
484c80476e4SDavid E. O'Brien     case '^':
48545e5710bSMark Peek 	buf = expand_lex(&h->Hlex, 1, 1);
486c80476e4SDavid E. O'Brien 	break;
487c80476e4SDavid E. O'Brien 
488c80476e4SDavid E. O'Brien     case '$':
489c80476e4SDavid E. O'Brien 	if ((l = (h->Hlex).prev) != 0)
49045e5710bSMark Peek 	    buf = expand_lex(l->prev->prev, 0, 0);
491c80476e4SDavid E. O'Brien 	break;
492c80476e4SDavid E. O'Brien 
493c80476e4SDavid E. O'Brien     case '*':
49445e5710bSMark Peek 	buf = expand_lex(&h->Hlex, 1, INT_MAX);
495c80476e4SDavid E. O'Brien 	break;
496c80476e4SDavid E. O'Brien 
497c80476e4SDavid E. O'Brien     default:
498c80476e4SDavid E. O'Brien 	if (been_once) {	/* unknown argument */
499c80476e4SDavid E. O'Brien 	    /* assume it's a modifier, e.g. !foo:h, and get whole cmd */
50045e5710bSMark Peek 	    buf = expand_lex(&h->Hlex, 0, INT_MAX);
501c80476e4SDavid E. O'Brien 	    q -= 2;
502c80476e4SDavid E. O'Brien 	    break;
503c80476e4SDavid E. O'Brien 	}
504c80476e4SDavid E. O'Brien 	been_once = 1;
505c80476e4SDavid E. O'Brien 
506c80476e4SDavid E. O'Brien 	if (*q == ':')		/* short form: !:arg */
507c80476e4SDavid E. O'Brien 	    --q;
508c80476e4SDavid E. O'Brien 
509c80476e4SDavid E. O'Brien 	if (*q != HIST) {
510c80476e4SDavid E. O'Brien 	    /*
511c80476e4SDavid E. O'Brien 	     * Search for a space, tab, or colon.  See if we have a number (as
512c80476e4SDavid E. O'Brien 	     * in !1234:xyz).  Remember the number.
513c80476e4SDavid E. O'Brien 	     */
514c80476e4SDavid E. O'Brien 	    for (i = 0, all_dig = 1;
515c80476e4SDavid E. O'Brien 		 *q != ' ' && *q != '\t' && *q != ':' && q < Cursor; q++) {
516c80476e4SDavid E. O'Brien 		/*
517c80476e4SDavid E. O'Brien 		 * PWP: !-4 is a valid history argument too, therefore the test
518c80476e4SDavid E. O'Brien 		 * is if not a digit, or not a - as the first character.
519c80476e4SDavid E. O'Brien 		 */
520c80476e4SDavid E. O'Brien 		if ((*q < '0' || *q > '9') && (*q != '-' || q != p + 1))
521c80476e4SDavid E. O'Brien 		    all_dig = 0;
522c80476e4SDavid E. O'Brien 		else if (*q == '-')
523c80476e4SDavid E. O'Brien 		    all_dig = 2;/* we are sneeky about this */
524c80476e4SDavid E. O'Brien 		else
525c80476e4SDavid E. O'Brien 		    i = 10 * i + *q - '0';
526c80476e4SDavid E. O'Brien 	    }
527c80476e4SDavid E. O'Brien 	    --q;
528c80476e4SDavid E. O'Brien 
529c80476e4SDavid E. O'Brien 	    /*
530c80476e4SDavid E. O'Brien 	     * If we have a number, search for event i.  Otherwise, search for
531c80476e4SDavid E. O'Brien 	     * a named event (as in !foo).  (In this case, I is the length of
532c80476e4SDavid E. O'Brien 	     * the named event).
533c80476e4SDavid E. O'Brien 	     */
534c80476e4SDavid E. O'Brien 	    if (all_dig) {
535c80476e4SDavid E. O'Brien 		if (all_dig == 2)
536c80476e4SDavid E. O'Brien 		    i = -i;	/* make it negitive */
537c80476e4SDavid E. O'Brien 		if (i < 0)	/* if !-4 (for example) */
538c80476e4SDavid E. O'Brien 		    i = eventno + 1 + i;	/* remember: i is < 0 */
539c80476e4SDavid E. O'Brien 		for (; h; h = h->Hnext) {
540c80476e4SDavid E. O'Brien 		    if (h->Hnum == i)
541c80476e4SDavid E. O'Brien 			break;
542c80476e4SDavid E. O'Brien 		}
543c80476e4SDavid E. O'Brien 	    }
544c80476e4SDavid E. O'Brien 	    else {
545c80476e4SDavid E. O'Brien 		for (i = (int) (q - p); h; h = h->Hnext) {
546c80476e4SDavid E. O'Brien 		    if ((l = &h->Hlex) != 0) {
547c80476e4SDavid E. O'Brien 			if (!Strncmp(p + 1, l->next->word, (size_t) i))
548c80476e4SDavid E. O'Brien 			    break;
549c80476e4SDavid E. O'Brien 		    }
550c80476e4SDavid E. O'Brien 		}
551c80476e4SDavid E. O'Brien 	    }
552c80476e4SDavid E. O'Brien 	}
553c80476e4SDavid E. O'Brien 	if (!h)
554c80476e4SDavid E. O'Brien 	    goto excl_err;
555c80476e4SDavid E. O'Brien 	if (q[1] == ':' || q[1] == '-' || q[1] == '*' ||
556c80476e4SDavid E. O'Brien 	    q[1] == '$' || q[1] == '^') {	/* get some args */
557c80476e4SDavid E. O'Brien 	    p = q[1] == ':' ? ++q : q;
558c80476e4SDavid E. O'Brien 	    /*
559c80476e4SDavid E. O'Brien 	     * Go handle !foo:*
560c80476e4SDavid E. O'Brien 	     */
561c80476e4SDavid E. O'Brien 	    if ((q[1] < '0' || q[1] > '9') &&
562c80476e4SDavid E. O'Brien 		q[1] != '-' && q[1] != '$' && q[1] != '^')
563c80476e4SDavid E. O'Brien 		goto excl_sw;
564c80476e4SDavid E. O'Brien 	    /*
565c80476e4SDavid E. O'Brien 	     * Go handle !foo:$
566c80476e4SDavid E. O'Brien 	     */
567c80476e4SDavid E. O'Brien 	    if (q[1] == '$' && (q[2] != '-' || q[3] < '0' || q[3] > '9'))
568c80476e4SDavid E. O'Brien 		goto excl_sw;
569c80476e4SDavid E. O'Brien 	    /*
570c80476e4SDavid E. O'Brien 	     * Count up the number of words in this event.  Store it in dval.
571c80476e4SDavid E. O'Brien 	     * Dval will be fed to number.
572c80476e4SDavid E. O'Brien 	     */
573c80476e4SDavid E. O'Brien 	    dval = 0;
574c80476e4SDavid E. O'Brien 	    if ((l = h->Hlex.prev) != 0) {
575c80476e4SDavid E. O'Brien 		for (l = l->prev; l != h->Hlex.next; l = l->prev, dval++)
576c80476e4SDavid E. O'Brien 		    continue;
577c80476e4SDavid E. O'Brien 	    }
578c80476e4SDavid E. O'Brien 	    if (!dval)
579c80476e4SDavid E. O'Brien 		goto excl_err;
580c80476e4SDavid E. O'Brien 	    if (q[1] == '-')
581c80476e4SDavid E. O'Brien 		from = 0;
582c80476e4SDavid E. O'Brien 	    else
583c80476e4SDavid E. O'Brien 		q = c_number(q, &from, dval);
584c80476e4SDavid E. O'Brien 	    if (q[1] == '-') {
585c80476e4SDavid E. O'Brien 		++q;
586c80476e4SDavid E. O'Brien 		if ((q[1] < '0' || q[1] > '9') && q[1] != '$')
587c80476e4SDavid E. O'Brien 		    to = dval - 1;
588c80476e4SDavid E. O'Brien 		else
589c80476e4SDavid E. O'Brien 		    q = c_number(q, &to, dval);
590c80476e4SDavid E. O'Brien 	    }
591c80476e4SDavid E. O'Brien 	    else if (q[1] == '*') {
592c80476e4SDavid E. O'Brien 		++q;
59345e5710bSMark Peek 		to = INT_MAX;
594c80476e4SDavid E. O'Brien 	    }
595c80476e4SDavid E. O'Brien 	    else {
596c80476e4SDavid E. O'Brien 		to = from;
597c80476e4SDavid E. O'Brien 	    }
598c80476e4SDavid E. O'Brien 	    if (from < 0 || to < from)
599c80476e4SDavid E. O'Brien 		goto excl_err;
60045e5710bSMark Peek 	    buf = expand_lex(&h->Hlex, from, to);
601c80476e4SDavid E. O'Brien 	}
60245e5710bSMark Peek 	else			/* get whole cmd */
60345e5710bSMark Peek 	    buf = expand_lex(&h->Hlex, 0, INT_MAX);
604c80476e4SDavid E. O'Brien 	break;
605c80476e4SDavid E. O'Brien     }
60645e5710bSMark Peek     if (buf == NULL)
60745e5710bSMark Peek 	buf = SAVE("");
608c80476e4SDavid E. O'Brien 
609c80476e4SDavid E. O'Brien     /*
610c80476e4SDavid E. O'Brien      * Apply modifiers, if any.
611c80476e4SDavid E. O'Brien      */
612c80476e4SDavid E. O'Brien     if (q[1] == ':') {
61345e5710bSMark Peek 	modbuf = buf;
614c80476e4SDavid E. O'Brien 	while (q[1] == ':' && modbuf != NULL) {
615c80476e4SDavid E. O'Brien 	    switch (q[2]) {
616c80476e4SDavid E. O'Brien 	    case 'r':
617c80476e4SDavid E. O'Brien 	    case 'e':
618c80476e4SDavid E. O'Brien 	    case 'h':
619c80476e4SDavid E. O'Brien 	    case 't':
620c80476e4SDavid E. O'Brien 	    case 'q':
621c80476e4SDavid E. O'Brien 	    case 'x':
622c80476e4SDavid E. O'Brien 	    case 'u':
623c80476e4SDavid E. O'Brien 	    case 'l':
62445e5710bSMark Peek 		if ((modbuf = domod(buf, (int) q[2])) != NULL) {
62545e5710bSMark Peek 		    xfree(buf);
62645e5710bSMark Peek 		    buf = modbuf;
627c80476e4SDavid E. O'Brien 		}
628c80476e4SDavid E. O'Brien 		++q;
629c80476e4SDavid E. O'Brien 		break;
630c80476e4SDavid E. O'Brien 
631c80476e4SDavid E. O'Brien 	    case 'a':
632c80476e4SDavid E. O'Brien 	    case 'g':
633c80476e4SDavid E. O'Brien 		/* Not implemented; this needs to be done before expanding
634c80476e4SDavid E. O'Brien 		 * lex. We don't have the words available to us anymore.
635c80476e4SDavid E. O'Brien 		 */
636c80476e4SDavid E. O'Brien 		++q;
637c80476e4SDavid E. O'Brien 		break;
638c80476e4SDavid E. O'Brien 
639c80476e4SDavid E. O'Brien 	    case 'p':
640c80476e4SDavid E. O'Brien 		/* Ok */
641c80476e4SDavid E. O'Brien 		++q;
642c80476e4SDavid E. O'Brien 		break;
643c80476e4SDavid E. O'Brien 
644c80476e4SDavid E. O'Brien 	    case '\0':
645c80476e4SDavid E. O'Brien 		break;
646c80476e4SDavid E. O'Brien 
647c80476e4SDavid E. O'Brien 	    default:
648c80476e4SDavid E. O'Brien 		++q;
649c80476e4SDavid E. O'Brien 		break;
650c80476e4SDavid E. O'Brien 	    }
651c80476e4SDavid E. O'Brien 	    if (q[1])
652c80476e4SDavid E. O'Brien 		++q;
653c80476e4SDavid E. O'Brien 	}
654c80476e4SDavid E. O'Brien     }
655c80476e4SDavid E. O'Brien 
65645e5710bSMark Peek     buf_len = Strlen(buf);
657c80476e4SDavid E. O'Brien     /*
65845e5710bSMark Peek      * Now replace the text from op to q inclusive with the text from buf.
659c80476e4SDavid E. O'Brien      */
660c80476e4SDavid E. O'Brien     q++;
661c80476e4SDavid E. O'Brien 
662c80476e4SDavid E. O'Brien     /*
663c80476e4SDavid E. O'Brien      * Now replace text non-inclusively like a real CS major!
664c80476e4SDavid E. O'Brien      */
66545e5710bSMark Peek     if (LastChar + buf_len - (q - op) >= InputLim)
666c80476e4SDavid E. O'Brien 	goto excl_err;
66745e5710bSMark Peek     (void) memmove(op + buf_len, q, (LastChar - q) * sizeof(Char));
66845e5710bSMark Peek     LastChar += buf_len - (q - op);
66945e5710bSMark Peek     Cursor += buf_len - (q - op);
67045e5710bSMark Peek     (void) memcpy(op, buf, buf_len * sizeof(Char));
671c80476e4SDavid E. O'Brien     *LastChar = '\0';
67245e5710bSMark Peek     xfree(buf);
67345e5710bSMark Peek     return op + buf_len;
674c80476e4SDavid E. O'Brien excl_err:
67545e5710bSMark Peek     xfree(buf);
676c80476e4SDavid E. O'Brien     SoundBeep();
677c80476e4SDavid E. O'Brien     return(op + 1);
678c80476e4SDavid E. O'Brien }
679c80476e4SDavid E. O'Brien 
680c80476e4SDavid E. O'Brien /*
681c80476e4SDavid E. O'Brien  * c_excl: An excl has been found at point p -- back up and find some white
682c80476e4SDavid E. O'Brien  * space (or the beginning of the buffer) and properly expand all the excl's
683c80476e4SDavid E. O'Brien  * from there up to the current cursor position. We also avoid (trying to)
684c80476e4SDavid E. O'Brien  * expanding '>!'
685c80476e4SDavid E. O'Brien  */
686c80476e4SDavid E. O'Brien 
687c80476e4SDavid E. O'Brien static void
68845e5710bSMark Peek c_excl(Char *p)
689c80476e4SDavid E. O'Brien {
6906767bd61SMark Peek     int i;
6916767bd61SMark Peek     Char *q;
692c80476e4SDavid E. O'Brien 
693c80476e4SDavid E. O'Brien     /*
694c80476e4SDavid E. O'Brien      * if />[SPC TAB]*![SPC TAB]/, back up p to just after the >. otherwise,
695c80476e4SDavid E. O'Brien      * back p up to just before the current word.
696c80476e4SDavid E. O'Brien      */
697c80476e4SDavid E. O'Brien     if ((p[1] == ' ' || p[1] == '\t') &&
698c80476e4SDavid E. O'Brien 	(p[-1] == ' ' || p[-1] == '\t' || p[-1] == '>')) {
699c80476e4SDavid E. O'Brien 	for (q = p - 1; q > InputBuf && (*q == ' ' || *q == '\t'); --q)
700c80476e4SDavid E. O'Brien 	    continue;
701c80476e4SDavid E. O'Brien 	if (*q == '>')
702c80476e4SDavid E. O'Brien 	    ++p;
703c80476e4SDavid E. O'Brien     }
704c80476e4SDavid E. O'Brien     else {
705c80476e4SDavid E. O'Brien 	while (*p != ' ' && *p != '\t' && p > InputBuf)
706c80476e4SDavid E. O'Brien 	    --p;
707c80476e4SDavid E. O'Brien     }
708c80476e4SDavid E. O'Brien 
709c80476e4SDavid E. O'Brien     /*
710c80476e4SDavid E. O'Brien      * Forever: Look for history char.  (Stop looking when we find the cursor.)
711c80476e4SDavid E. O'Brien      * Count backslashes.  Of odd, skip history char. Return if all done.
712c80476e4SDavid E. O'Brien      * Expand if even number of backslashes.
713c80476e4SDavid E. O'Brien      */
714c80476e4SDavid E. O'Brien     for (;;) {
715c80476e4SDavid E. O'Brien 	while (*p != HIST && p < Cursor)
716c80476e4SDavid E. O'Brien 	    ++p;
717c80476e4SDavid E. O'Brien 	for (i = 1; (p - i) >= InputBuf && p[-i] == '\\'; i++)
718c80476e4SDavid E. O'Brien 	    continue;
719c80476e4SDavid E. O'Brien 	if (i % 2 == 0)
720c80476e4SDavid E. O'Brien 	    ++p;
721c80476e4SDavid E. O'Brien 	if (p >= Cursor)
722c80476e4SDavid E. O'Brien 	    return;
723c80476e4SDavid E. O'Brien 	if (i % 2 == 1)
724c80476e4SDavid E. O'Brien 	    p = c_expand(p);
725c80476e4SDavid E. O'Brien     }
726c80476e4SDavid E. O'Brien }
727c80476e4SDavid E. O'Brien 
728c80476e4SDavid E. O'Brien 
729c80476e4SDavid E. O'Brien static void
73045e5710bSMark Peek c_substitute(void)
731c80476e4SDavid E. O'Brien {
7326767bd61SMark Peek     Char *p;
733c80476e4SDavid E. O'Brien 
734c80476e4SDavid E. O'Brien     /*
735c80476e4SDavid E. O'Brien      * Start p out one character before the cursor.  Move it backwards looking
736c80476e4SDavid E. O'Brien      * for white space, the beginning of the line, or a history character.
737c80476e4SDavid E. O'Brien      */
738c80476e4SDavid E. O'Brien     for (p = Cursor - 1;
739c80476e4SDavid E. O'Brien 	 p > InputBuf && *p != ' ' && *p != '\t' && *p != HIST; --p)
740c80476e4SDavid E. O'Brien 	continue;
741c80476e4SDavid E. O'Brien 
742c80476e4SDavid E. O'Brien     /*
743c80476e4SDavid E. O'Brien      * If we found a history character, go expand it.
744c80476e4SDavid E. O'Brien      */
745c80476e4SDavid E. O'Brien     if (*p == HIST)
746c80476e4SDavid E. O'Brien 	c_excl(p);
747c80476e4SDavid E. O'Brien     Refresh();
748c80476e4SDavid E. O'Brien }
749c80476e4SDavid E. O'Brien 
750c80476e4SDavid E. O'Brien static void
75145e5710bSMark Peek c_delfini(void)		/* Finish up delete action */
752c80476e4SDavid E. O'Brien {
7536767bd61SMark Peek     int Size;
754c80476e4SDavid E. O'Brien 
755c80476e4SDavid E. O'Brien     if (ActionFlag & TCSHOP_INSERT)
756c80476e4SDavid E. O'Brien 	c_alternativ_key_map(0);
757c80476e4SDavid E. O'Brien 
758c80476e4SDavid E. O'Brien     ActionFlag = TCSHOP_NOP;
759c80476e4SDavid E. O'Brien 
760c80476e4SDavid E. O'Brien     if (ActionPos == 0)
761c80476e4SDavid E. O'Brien 	return;
762c80476e4SDavid E. O'Brien 
763c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_INSERT;
764c80476e4SDavid E. O'Brien 
765c80476e4SDavid E. O'Brien     if (Cursor > ActionPos) {
766c80476e4SDavid E. O'Brien 	Size = (int) (Cursor-ActionPos);
767c80476e4SDavid E. O'Brien 	c_delbefore(Size);
768c80476e4SDavid E. O'Brien 	RefCursor();
769c80476e4SDavid E. O'Brien     }
770c80476e4SDavid E. O'Brien     else if (Cursor < ActionPos) {
771c80476e4SDavid E. O'Brien 	Size = (int)(ActionPos-Cursor);
772c80476e4SDavid E. O'Brien 	c_delafter(Size);
773c80476e4SDavid E. O'Brien     }
774c80476e4SDavid E. O'Brien     else  {
775c80476e4SDavid E. O'Brien 	Size = 1;
776c80476e4SDavid E. O'Brien 	c_delafter(Size);
777c80476e4SDavid E. O'Brien     }
778c80476e4SDavid E. O'Brien     UndoPtr = Cursor;
779c80476e4SDavid E. O'Brien     UndoSize = Size;
780c80476e4SDavid E. O'Brien }
781c80476e4SDavid E. O'Brien 
782c80476e4SDavid E. O'Brien static Char *
78345e5710bSMark Peek c_endword(Char *p, Char *high, int n, Char *delim)
784c80476e4SDavid E. O'Brien {
78523338178SMark Peek     Char inquote = 0;
786c80476e4SDavid E. O'Brien     p++;
787c80476e4SDavid E. O'Brien 
788c80476e4SDavid E. O'Brien     while (n--) {
7896767bd61SMark Peek         while (p < high) {	/* Skip non-word chars */
7906767bd61SMark Peek 	  if (!Strchr(delim, *p) || *(p-1) == (Char)'\\')
791c80476e4SDavid E. O'Brien 	    break;
792c80476e4SDavid E. O'Brien 	  p++;
793c80476e4SDavid E. O'Brien         }
794c80476e4SDavid E. O'Brien 	while (p < high) {	/* Skip string */
795c80476e4SDavid E. O'Brien 	  if ((*p == (Char)'\'' || *p == (Char)'"')) { /* Quotation marks? */
7966767bd61SMark Peek 	    if (inquote || *(p-1) != (Char)'\\') { /* Should it be honored? */
797c80476e4SDavid E. O'Brien 	      if (inquote == 0) inquote = *p;
798c80476e4SDavid E. O'Brien 	      else if (inquote == *p) inquote = 0;
799c80476e4SDavid E. O'Brien 	    }
800c80476e4SDavid E. O'Brien 	  }
8016767bd61SMark Peek 	  /* Break if unquoted non-word char */
8026767bd61SMark Peek 	  if (!inquote && Strchr(delim, *p) && *(p-1) != (Char)'\\')
803c80476e4SDavid E. O'Brien 	    break;
804c80476e4SDavid E. O'Brien 	  p++;
805c80476e4SDavid E. O'Brien 	}
806c80476e4SDavid E. O'Brien     }
807c80476e4SDavid E. O'Brien 
808c80476e4SDavid E. O'Brien     p--;
809c80476e4SDavid E. O'Brien     return(p);
810c80476e4SDavid E. O'Brien }
811c80476e4SDavid E. O'Brien 
812c80476e4SDavid E. O'Brien 
813c80476e4SDavid E. O'Brien static Char *
81445e5710bSMark Peek c_eword(Char *p, Char *high, int n)
815c80476e4SDavid E. O'Brien {
816c80476e4SDavid E. O'Brien     p++;
817c80476e4SDavid E. O'Brien 
818c80476e4SDavid E. O'Brien     while (n--) {
819c80476e4SDavid E. O'Brien 	while ((p < high) && Isspace(*p))
820c80476e4SDavid E. O'Brien 	    p++;
821c80476e4SDavid E. O'Brien 
822c80476e4SDavid E. O'Brien 	if (Isalnum(*p))
823c80476e4SDavid E. O'Brien 	    while ((p < high) && Isalnum(*p))
824c80476e4SDavid E. O'Brien 		p++;
825c80476e4SDavid E. O'Brien 	else
826c80476e4SDavid E. O'Brien 	    while ((p < high) && !(Isspace(*p) || Isalnum(*p)))
827c80476e4SDavid E. O'Brien 		p++;
828c80476e4SDavid E. O'Brien     }
829c80476e4SDavid E. O'Brien 
830c80476e4SDavid E. O'Brien     p--;
831c80476e4SDavid E. O'Brien     return(p);
832c80476e4SDavid E. O'Brien }
833c80476e4SDavid E. O'Brien 
8346767bd61SMark Peek /* Set the max length of the kill ring */
8356767bd61SMark Peek void
83645e5710bSMark Peek SetKillRing(int max)
8376767bd61SMark Peek {
8386767bd61SMark Peek     CStr *new;
8396767bd61SMark Peek     int count, i, j;
8406767bd61SMark Peek 
8416767bd61SMark Peek     if (max < 1)
8426767bd61SMark Peek 	max = 1;		/* no ring, but always one buffer */
8436767bd61SMark Peek     if (max == KillRingMax)
8446767bd61SMark Peek 	return;
84545e5710bSMark Peek     new = xcalloc(max, sizeof(CStr));
8466767bd61SMark Peek     if (KillRing != NULL) {
8476767bd61SMark Peek 	if (KillRingLen != 0) {
8486767bd61SMark Peek 	    if (max >= KillRingLen) {
8496767bd61SMark Peek 		count = KillRingLen;
8506767bd61SMark Peek 		j = KillPos;
8516767bd61SMark Peek 	    } else {
8526767bd61SMark Peek 		count = max;
8536767bd61SMark Peek 		j = (KillPos - count + KillRingLen) % KillRingLen;
8546767bd61SMark Peek 	    }
8556767bd61SMark Peek 	    for (i = 0; i < KillRingLen; i++) {
8566767bd61SMark Peek 		if (i < count)	/* copy latest */
8576767bd61SMark Peek 		    new[i] = KillRing[j];
8586767bd61SMark Peek 		else		/* free the others */
8596767bd61SMark Peek 		    xfree(KillRing[j].buf);
8606767bd61SMark Peek 		j = (j + 1) % KillRingLen;
8616767bd61SMark Peek 	    }
8626767bd61SMark Peek 	    KillRingLen = count;
8636767bd61SMark Peek 	    KillPos = count % max;
8646767bd61SMark Peek 	    YankPos = count - 1;
8656767bd61SMark Peek 	}
8666767bd61SMark Peek 	xfree(KillRing);
8676767bd61SMark Peek     }
8686767bd61SMark Peek     KillRing = new;
8696767bd61SMark Peek     KillRingMax = max;
8706767bd61SMark Peek }
8716767bd61SMark Peek 
8726767bd61SMark Peek /* Push string from start upto (but not including) end onto kill ring */
8736767bd61SMark Peek static void
87445e5710bSMark Peek c_push_kill(Char *start, Char *end)
8756767bd61SMark Peek {
8766767bd61SMark Peek     CStr save, *pos;
8776767bd61SMark Peek     Char *dp, *cp, *kp;
8786767bd61SMark Peek     int len = end - start, i, j, k;
8796767bd61SMark Peek 
8806767bd61SMark Peek     /* Check for duplicates? */
8816767bd61SMark Peek     if (KillRingLen > 0 && (dp = varval(STRkilldup)) != STRNULL) {
8826767bd61SMark Peek 	YankPos = (KillPos - 1 + KillRingLen) % KillRingLen;
8836767bd61SMark Peek 	if (eq(dp, STRerase)) {	/* erase earlier one (actually move up) */
8846767bd61SMark Peek 	    j = YankPos;
8856767bd61SMark Peek 	    for (i = 0; i < KillRingLen; i++) {
8866767bd61SMark Peek 		if (Strncmp(KillRing[j].buf, start, (size_t) len) == 0 &&
8876767bd61SMark Peek 		    KillRing[j].buf[len] == '\0') {
8886767bd61SMark Peek 		    save = KillRing[j];
8896767bd61SMark Peek 		    for ( ; i > 0; i--) {
8906767bd61SMark Peek 			k = j;
8916767bd61SMark Peek 			j = (j + 1) % KillRingLen;
8926767bd61SMark Peek 			KillRing[k] = KillRing[j];
8936767bd61SMark Peek 		    }
8946767bd61SMark Peek 		    KillRing[j] = save;
8956767bd61SMark Peek 		    return;
8966767bd61SMark Peek 		}
8976767bd61SMark Peek 		j = (j - 1 + KillRingLen) % KillRingLen;
8986767bd61SMark Peek 	    }
8996767bd61SMark Peek 	} else if (eq(dp, STRall)) { /* skip if any earlier */
9006767bd61SMark Peek 	    for (i = 0; i < KillRingLen; i++)
9016767bd61SMark Peek 		if (Strncmp(KillRing[i].buf, start, (size_t) len) == 0 &&
9026767bd61SMark Peek 		    KillRing[i].buf[len] == '\0')
9036767bd61SMark Peek 		    return;
9046767bd61SMark Peek 	} else if (eq(dp, STRprev)) { /* skip if immediately previous */
9056767bd61SMark Peek 	    j = YankPos;
9066767bd61SMark Peek 	    if (Strncmp(KillRing[j].buf, start, (size_t) len) == 0 &&
9076767bd61SMark Peek 		KillRing[j].buf[len] == '\0')
9086767bd61SMark Peek 		return;
9096767bd61SMark Peek 	}
9106767bd61SMark Peek     }
9116767bd61SMark Peek 
9126767bd61SMark Peek     /* No duplicate, go ahead and push */
9136767bd61SMark Peek     len++;			/* need space for '\0' */
9146767bd61SMark Peek     YankPos = KillPos;
9156767bd61SMark Peek     if (KillRingLen < KillRingMax)
9166767bd61SMark Peek 	KillRingLen++;
9176767bd61SMark Peek     pos = &KillRing[KillPos];
9186767bd61SMark Peek     KillPos = (KillPos + 1) % KillRingMax;
9196767bd61SMark Peek     if (pos->len < len) {
92045e5710bSMark Peek 	pos->buf = xrealloc(pos->buf, len * sizeof(Char));
9216767bd61SMark Peek 	pos->len = len;
9226767bd61SMark Peek     }
9236767bd61SMark Peek     cp = start;
9246767bd61SMark Peek     kp = pos->buf;
9256767bd61SMark Peek     while (cp < end)
9266767bd61SMark Peek 	*kp++ = *cp++;
9276767bd61SMark Peek     *kp = '\0';
9286767bd61SMark Peek }
9296767bd61SMark Peek 
93045e5710bSMark Peek /* Save InputBuf etc in SavedBuf etc for restore after cmd exec */
93145e5710bSMark Peek static void
93245e5710bSMark Peek c_save_inputbuf()
93345e5710bSMark Peek {
93445e5710bSMark Peek     SavedBuf.len = 0;
93545e5710bSMark Peek     Strbuf_append(&SavedBuf, InputBuf);
93645e5710bSMark Peek     Strbuf_terminate(&SavedBuf);
93745e5710bSMark Peek     LastSaved = LastChar - InputBuf;
93845e5710bSMark Peek     CursSaved = Cursor - InputBuf;
93945e5710bSMark Peek     HistSaved = Hist_num;
94045e5710bSMark Peek     RestoreSaved = 1;
94145e5710bSMark Peek }
94245e5710bSMark Peek 
94345e5710bSMark Peek CCRETVAL
94445e5710bSMark Peek GetHistLine()
945c80476e4SDavid E. O'Brien {
946c80476e4SDavid E. O'Brien     struct Hist *hp;
947c80476e4SDavid E. O'Brien     int     h;
948c80476e4SDavid E. O'Brien 
949c80476e4SDavid E. O'Brien     if (Hist_num == 0) {	/* if really the current line */
95045e5710bSMark Peek 	if (HistBuf.s != NULL)
95145e5710bSMark Peek 	    copyn(InputBuf, HistBuf.s, INBUFSIZE);/*FIXBUF*/
95245e5710bSMark Peek 	else
95345e5710bSMark Peek 	    *InputBuf = '\0';
95445e5710bSMark Peek 	LastChar = InputBuf + HistBuf.len;
955c80476e4SDavid E. O'Brien 
956c80476e4SDavid E. O'Brien #ifdef KSHVI
957c80476e4SDavid E. O'Brien     if (VImode)
958c80476e4SDavid E. O'Brien 	Cursor = InputBuf;
959c80476e4SDavid E. O'Brien     else
960c80476e4SDavid E. O'Brien #endif /* KSHVI */
961c80476e4SDavid E. O'Brien 	Cursor = LastChar;
962c80476e4SDavid E. O'Brien 
963c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
964c80476e4SDavid E. O'Brien     }
965c80476e4SDavid E. O'Brien 
966c80476e4SDavid E. O'Brien     hp = Histlist.Hnext;
967c80476e4SDavid E. O'Brien     if (hp == NULL)
968c80476e4SDavid E. O'Brien 	return(CC_ERROR);
969c80476e4SDavid E. O'Brien 
970c80476e4SDavid E. O'Brien     for (h = 1; h < Hist_num; h++) {
971c80476e4SDavid E. O'Brien 	if ((hp->Hnext) == NULL) {
972c80476e4SDavid E. O'Brien 	    Hist_num = h;
973c80476e4SDavid E. O'Brien 	    return(CC_ERROR);
974c80476e4SDavid E. O'Brien 	}
975c80476e4SDavid E. O'Brien 	hp = hp->Hnext;
976c80476e4SDavid E. O'Brien     }
977c80476e4SDavid E. O'Brien 
978c80476e4SDavid E. O'Brien     if (HistLit && hp->histline) {
97945e5710bSMark Peek 	copyn(InputBuf, hp->histline, INBUFSIZE);/*FIXBUF*/
980c80476e4SDavid E. O'Brien 	CurrentHistLit = 1;
981c80476e4SDavid E. O'Brien     }
982c80476e4SDavid E. O'Brien     else {
98345e5710bSMark Peek 	Char *p;
98445e5710bSMark Peek 
98545e5710bSMark Peek 	p = sprlex(&hp->Hlex);
98645e5710bSMark Peek 	copyn(InputBuf, p, sizeof(InputBuf) / sizeof(Char));/*FIXBUF*/
98745e5710bSMark Peek 	xfree(p);
988c80476e4SDavid E. O'Brien 	CurrentHistLit = 0;
989c80476e4SDavid E. O'Brien     }
99045e5710bSMark Peek     LastChar = Strend(InputBuf);
991c80476e4SDavid E. O'Brien 
992c80476e4SDavid E. O'Brien     if (LastChar > InputBuf) {
993c80476e4SDavid E. O'Brien 	if (LastChar[-1] == '\n')
994c80476e4SDavid E. O'Brien 	    LastChar--;
995c80476e4SDavid E. O'Brien #if 0
996c80476e4SDavid E. O'Brien 	if (LastChar[-1] == ' ')
997c80476e4SDavid E. O'Brien 	    LastChar--;
998c80476e4SDavid E. O'Brien #endif
999c80476e4SDavid E. O'Brien 	if (LastChar < InputBuf)
1000c80476e4SDavid E. O'Brien 	    LastChar = InputBuf;
1001c80476e4SDavid E. O'Brien     }
1002c80476e4SDavid E. O'Brien 
1003c80476e4SDavid E. O'Brien #ifdef KSHVI
1004c80476e4SDavid E. O'Brien     if (VImode)
1005c80476e4SDavid E. O'Brien 	Cursor = InputBuf;
1006c80476e4SDavid E. O'Brien     else
1007c80476e4SDavid E. O'Brien #endif /* KSHVI */
1008c80476e4SDavid E. O'Brien 	Cursor = LastChar;
1009c80476e4SDavid E. O'Brien 
1010c80476e4SDavid E. O'Brien     return(CC_REFRESH);
1011c80476e4SDavid E. O'Brien }
1012c80476e4SDavid E. O'Brien 
1013c80476e4SDavid E. O'Brien static CCRETVAL
101445e5710bSMark Peek c_search_line(Char *pattern, int dir)
1015c80476e4SDavid E. O'Brien {
1016c80476e4SDavid E. O'Brien     Char *cp;
101745e5710bSMark Peek     size_t len;
1018c80476e4SDavid E. O'Brien 
101945e5710bSMark Peek     len = Strlen(pattern);
1020c80476e4SDavid E. O'Brien 
1021c80476e4SDavid E. O'Brien     if (dir == F_UP_SEARCH_HIST) {
1022c80476e4SDavid E. O'Brien 	for (cp = Cursor; cp >= InputBuf; cp--)
102345e5710bSMark Peek 	    if (Strncmp(cp, pattern, len) == 0 ||
1024c80476e4SDavid E. O'Brien 		Gmatch(cp, pattern)) {
1025c80476e4SDavid E. O'Brien 		Cursor = cp;
1026c80476e4SDavid E. O'Brien 		return(CC_NORM);
1027c80476e4SDavid E. O'Brien 	    }
1028c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1029c80476e4SDavid E. O'Brien     } else {
1030c80476e4SDavid E. O'Brien 	for (cp = Cursor; *cp != '\0' && cp < InputLim; cp++)
103145e5710bSMark Peek 	    if (Strncmp(cp, pattern, len) == 0 ||
1032c80476e4SDavid E. O'Brien 		Gmatch(cp, pattern)) {
1033c80476e4SDavid E. O'Brien 		Cursor = cp;
1034c80476e4SDavid E. O'Brien 		return(CC_NORM);
1035c80476e4SDavid E. O'Brien 	    }
1036c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1037c80476e4SDavid E. O'Brien     }
1038c80476e4SDavid E. O'Brien }
1039c80476e4SDavid E. O'Brien 
1040c80476e4SDavid E. O'Brien static CCRETVAL
104145e5710bSMark Peek e_inc_search(int dir)
1042c80476e4SDavid E. O'Brien {
104345e5710bSMark Peek     static const Char STRfwd[] = { 'f', 'w', 'd', '\0' },
1044c80476e4SDavid E. O'Brien 		      STRbck[] = { 'b', 'c', 'k', '\0' };
1045c80476e4SDavid E. O'Brien     static Char pchar = ':';	/* ':' = normal, '?' = failed */
1046c80476e4SDavid E. O'Brien     static Char endcmd[2];
104745e5710bSMark Peek     const Char *cp;
104845e5710bSMark Peek     Char ch,
1049c80476e4SDavid E. O'Brien 	*oldCursor = Cursor,
1050c80476e4SDavid E. O'Brien 	oldpchar = pchar;
1051c80476e4SDavid E. O'Brien     CCRETVAL ret = CC_NORM;
1052c80476e4SDavid E. O'Brien     int oldHist_num = Hist_num,
105345e5710bSMark Peek 	oldpatlen = patbuf.len,
1054c80476e4SDavid E. O'Brien 	newdir = dir,
1055c80476e4SDavid E. O'Brien         done, redo;
1056c80476e4SDavid E. O'Brien 
105745e5710bSMark Peek     if (LastChar + sizeof(STRfwd)/sizeof(Char) + 2 + patbuf.len >= InputLim)
1058c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1059c80476e4SDavid E. O'Brien 
1060c80476e4SDavid E. O'Brien     for (;;) {
1061c80476e4SDavid E. O'Brien 
106245e5710bSMark Peek 	if (patbuf.len == 0) {	/* first round */
1063c80476e4SDavid E. O'Brien 	    pchar = ':';
106445e5710bSMark Peek 	    Strbuf_append1(&patbuf, '*');
1065c80476e4SDavid E. O'Brien 	}
1066c80476e4SDavid E. O'Brien 	done = redo = 0;
1067c80476e4SDavid E. O'Brien 	*LastChar++ = '\n';
1068c80476e4SDavid E. O'Brien 	for (cp = newdir == F_UP_SEARCH_HIST ? STRbck : STRfwd;
1069c80476e4SDavid E. O'Brien 	     *cp; *LastChar++ = *cp++)
1070c80476e4SDavid E. O'Brien 	    continue;
1071c80476e4SDavid E. O'Brien 	*LastChar++ = pchar;
107245e5710bSMark Peek 	for (cp = &patbuf.s[1]; cp < &patbuf.s[patbuf.len];
107345e5710bSMark Peek 	     *LastChar++ = *cp++)
1074c80476e4SDavid E. O'Brien 	    continue;
1075c80476e4SDavid E. O'Brien 	*LastChar = '\0';
107645e5710bSMark Peek 	if (adrof(STRhighlight) && pchar == ':') {
107745e5710bSMark Peek 	    /* if the no-glob-search patch is applied, remove the - 1 below */
107845e5710bSMark Peek 	    IncMatchLen = patbuf.len - 1;
107945e5710bSMark Peek 	    ClearLines();
108045e5710bSMark Peek 	    ClearDisp();
108145e5710bSMark Peek 	}
1082c80476e4SDavid E. O'Brien 	Refresh();
1083c80476e4SDavid E. O'Brien 
1084c80476e4SDavid E. O'Brien 	if (GetNextChar(&ch) != 1)
1085c80476e4SDavid E. O'Brien 	    return(e_send_eof(0));
1086c80476e4SDavid E. O'Brien 
108723338178SMark Peek 	switch (ch > NT_NUM_KEYS
108823338178SMark Peek 		? F_INSERT : CurrentKeyMap[(unsigned char) ch]) {
1089c80476e4SDavid E. O'Brien 	case F_INSERT:
1090c80476e4SDavid E. O'Brien 	case F_DIGIT:
1091c80476e4SDavid E. O'Brien 	case F_MAGIC_SPACE:
109245e5710bSMark Peek 	    if (LastChar + 1 >= InputLim) /*FIXBUF*/
1093c80476e4SDavid E. O'Brien 		SoundBeep();
1094c80476e4SDavid E. O'Brien 	    else {
109545e5710bSMark Peek 		Strbuf_append1(&patbuf, ch);
1096c80476e4SDavid E. O'Brien 		*LastChar++ = ch;
1097c80476e4SDavid E. O'Brien 		*LastChar = '\0';
1098c80476e4SDavid E. O'Brien 		Refresh();
1099c80476e4SDavid E. O'Brien 	    }
1100c80476e4SDavid E. O'Brien 	    break;
1101c80476e4SDavid E. O'Brien 
1102c80476e4SDavid E. O'Brien 	case F_INC_FWD:
1103c80476e4SDavid E. O'Brien 	    newdir = F_DOWN_SEARCH_HIST;
1104c80476e4SDavid E. O'Brien 	    redo++;
1105c80476e4SDavid E. O'Brien 	    break;
1106c80476e4SDavid E. O'Brien 
1107c80476e4SDavid E. O'Brien 	case F_INC_BACK:
1108c80476e4SDavid E. O'Brien 	    newdir = F_UP_SEARCH_HIST;
1109c80476e4SDavid E. O'Brien 	    redo++;
1110c80476e4SDavid E. O'Brien 	    break;
1111c80476e4SDavid E. O'Brien 
1112c80476e4SDavid E. O'Brien 	case F_DELPREV:
111345e5710bSMark Peek 	    if (patbuf.len > 1)
1114c80476e4SDavid E. O'Brien 		done++;
1115c80476e4SDavid E. O'Brien 	    else
1116c80476e4SDavid E. O'Brien 		SoundBeep();
1117c80476e4SDavid E. O'Brien 	    break;
1118c80476e4SDavid E. O'Brien 
1119c80476e4SDavid E. O'Brien 	default:
112045e5710bSMark Peek 	    switch (ASC(ch)) {
1121c80476e4SDavid E. O'Brien 	    case 0007:		/* ^G: Abort */
1122c80476e4SDavid E. O'Brien 		ret = CC_ERROR;
1123c80476e4SDavid E. O'Brien 		done++;
1124c80476e4SDavid E. O'Brien 		break;
1125c80476e4SDavid E. O'Brien 
1126c80476e4SDavid E. O'Brien 	    case 0027:		/* ^W: Append word */
1127c80476e4SDavid E. O'Brien 		/* No can do if globbing characters in pattern */
112845e5710bSMark Peek 		for (cp = &patbuf.s[1]; ; cp++)
112945e5710bSMark Peek 		    if (cp >= &patbuf.s[patbuf.len]) {
113045e5710bSMark Peek 			Cursor += patbuf.len - 1;
1131c80476e4SDavid E. O'Brien 			cp = c_next_word(Cursor, LastChar, 1);
1132c80476e4SDavid E. O'Brien 			while (Cursor < cp && *Cursor != '\n') {
113345e5710bSMark Peek 			    if (LastChar + 1 >= InputLim) {/*FIXBUF*/
1134c80476e4SDavid E. O'Brien 				SoundBeep();
1135c80476e4SDavid E. O'Brien 				break;
1136c80476e4SDavid E. O'Brien 			    }
113745e5710bSMark Peek 			    Strbuf_append1(&patbuf, *Cursor);
1138c80476e4SDavid E. O'Brien 			    *LastChar++ = *Cursor++;
1139c80476e4SDavid E. O'Brien 			}
1140c80476e4SDavid E. O'Brien 			Cursor = oldCursor;
1141c80476e4SDavid E. O'Brien 			*LastChar = '\0';
1142c80476e4SDavid E. O'Brien 			Refresh();
1143c80476e4SDavid E. O'Brien 			break;
1144c80476e4SDavid E. O'Brien 		    } else if (isglob(*cp)) {
1145c80476e4SDavid E. O'Brien 			SoundBeep();
1146c80476e4SDavid E. O'Brien 			break;
1147c80476e4SDavid E. O'Brien 		    }
1148c80476e4SDavid E. O'Brien 		break;
1149c80476e4SDavid E. O'Brien 
1150c80476e4SDavid E. O'Brien 	    default:		/* Terminate and execute cmd */
1151c80476e4SDavid E. O'Brien 		endcmd[0] = ch;
1152c80476e4SDavid E. O'Brien 		PushMacro(endcmd);
1153c80476e4SDavid E. O'Brien 		/*FALLTHROUGH*/
1154c80476e4SDavid E. O'Brien 
1155c80476e4SDavid E. O'Brien 	    case 0033:		/* ESC: Terminate */
1156c80476e4SDavid E. O'Brien 		ret = CC_REFRESH;
1157c80476e4SDavid E. O'Brien 		done++;
1158c80476e4SDavid E. O'Brien 		break;
1159c80476e4SDavid E. O'Brien 	    }
1160c80476e4SDavid E. O'Brien 	    break;
1161c80476e4SDavid E. O'Brien 	}
1162c80476e4SDavid E. O'Brien 
1163c80476e4SDavid E. O'Brien 	while (LastChar > InputBuf && *LastChar != '\n')
1164c80476e4SDavid E. O'Brien 	    *LastChar-- = '\0';
1165c80476e4SDavid E. O'Brien 	*LastChar = '\0';
1166c80476e4SDavid E. O'Brien 
1167c80476e4SDavid E. O'Brien 	if (!done) {
1168c80476e4SDavid E. O'Brien 
1169c80476e4SDavid E. O'Brien 	    /* Can't search if unmatched '[' */
117045e5710bSMark Peek 	    for (cp = &patbuf.s[patbuf.len - 1], ch = ']'; cp > patbuf.s; cp--)
1171c80476e4SDavid E. O'Brien 		if (*cp == '[' || *cp == ']') {
1172c80476e4SDavid E. O'Brien 		    ch = *cp;
1173c80476e4SDavid E. O'Brien 		    break;
1174c80476e4SDavid E. O'Brien 		}
1175c80476e4SDavid E. O'Brien 
117645e5710bSMark Peek 	    if (patbuf.len > 1 && ch != '[') {
1177c80476e4SDavid E. O'Brien 		if (redo && newdir == dir) {
1178c80476e4SDavid E. O'Brien 		    if (pchar == '?') {	/* wrap around */
117945e5710bSMark Peek 			Hist_num = newdir == F_UP_SEARCH_HIST ? 0 : INT_MAX;
118045e5710bSMark Peek 			if (GetHistLine() == CC_ERROR)
1181c80476e4SDavid E. O'Brien 			    /* Hist_num was fixed by first call */
118245e5710bSMark Peek 			    (void) GetHistLine();
1183c80476e4SDavid E. O'Brien 			Cursor = newdir == F_UP_SEARCH_HIST ?
1184c80476e4SDavid E. O'Brien 			    LastChar : InputBuf;
1185c80476e4SDavid E. O'Brien 		    } else
1186c80476e4SDavid E. O'Brien 			Cursor += newdir == F_UP_SEARCH_HIST ? -1 : 1;
1187c80476e4SDavid E. O'Brien 		}
118845e5710bSMark Peek 		Strbuf_append1(&patbuf, '*');
118945e5710bSMark Peek 		Strbuf_terminate(&patbuf);
1190c80476e4SDavid E. O'Brien 		if (Cursor < InputBuf || Cursor > LastChar ||
119145e5710bSMark Peek 		    (ret = c_search_line(&patbuf.s[1], newdir)) == CC_ERROR) {
1192c80476e4SDavid E. O'Brien 		    LastCmd = (KEYCMD) newdir; /* avoid c_hsetpat */
1193c80476e4SDavid E. O'Brien 		    ret = newdir == F_UP_SEARCH_HIST ?
1194c80476e4SDavid E. O'Brien 			e_up_search_hist(0) : e_down_search_hist(0);
1195c80476e4SDavid E. O'Brien 		    if (ret != CC_ERROR) {
1196c80476e4SDavid E. O'Brien 			Cursor = newdir == F_UP_SEARCH_HIST ?
1197c80476e4SDavid E. O'Brien 			    LastChar : InputBuf;
119845e5710bSMark Peek 			(void) c_search_line(&patbuf.s[1], newdir);
1199c80476e4SDavid E. O'Brien 		    }
1200c80476e4SDavid E. O'Brien 		}
120145e5710bSMark Peek 		patbuf.s[--patbuf.len] = '\0';
1202c80476e4SDavid E. O'Brien 		if (ret == CC_ERROR) {
1203c80476e4SDavid E. O'Brien 		    SoundBeep();
1204c80476e4SDavid E. O'Brien 		    if (Hist_num != oldHist_num) {
1205c80476e4SDavid E. O'Brien 			Hist_num = oldHist_num;
120645e5710bSMark Peek 			if (GetHistLine() == CC_ERROR)
1207c80476e4SDavid E. O'Brien 			    return(CC_ERROR);
1208c80476e4SDavid E. O'Brien 		    }
1209c80476e4SDavid E. O'Brien 		    Cursor = oldCursor;
1210c80476e4SDavid E. O'Brien 		    pchar = '?';
1211c80476e4SDavid E. O'Brien 		} else {
1212c80476e4SDavid E. O'Brien 		    pchar = ':';
1213c80476e4SDavid E. O'Brien 		}
1214c80476e4SDavid E. O'Brien 	    }
1215c80476e4SDavid E. O'Brien 
1216c80476e4SDavid E. O'Brien 	    ret = e_inc_search(newdir);
1217c80476e4SDavid E. O'Brien 
1218c80476e4SDavid E. O'Brien 	    if (ret == CC_ERROR && pchar == '?' && oldpchar == ':') {
1219c80476e4SDavid E. O'Brien 		/* break abort of failed search at last non-failed */
1220c80476e4SDavid E. O'Brien 		ret = CC_NORM;
1221c80476e4SDavid E. O'Brien 	    }
1222c80476e4SDavid E. O'Brien 
1223c80476e4SDavid E. O'Brien 	}
1224c80476e4SDavid E. O'Brien 
1225c80476e4SDavid E. O'Brien 	if (ret == CC_NORM || (ret == CC_ERROR && oldpatlen == 0)) {
1226c80476e4SDavid E. O'Brien 	    /* restore on normal return or error exit */
1227c80476e4SDavid E. O'Brien 	    pchar = oldpchar;
122845e5710bSMark Peek 	    patbuf.len = oldpatlen;
1229c80476e4SDavid E. O'Brien 	    if (Hist_num != oldHist_num) {
1230c80476e4SDavid E. O'Brien 		Hist_num = oldHist_num;
123145e5710bSMark Peek 		if (GetHistLine() == CC_ERROR)
1232c80476e4SDavid E. O'Brien 		    return(CC_ERROR);
1233c80476e4SDavid E. O'Brien 	    }
1234c80476e4SDavid E. O'Brien 	    Cursor = oldCursor;
1235c80476e4SDavid E. O'Brien 	    if (ret == CC_ERROR)
1236c80476e4SDavid E. O'Brien 		Refresh();
1237c80476e4SDavid E. O'Brien 	}
1238c80476e4SDavid E. O'Brien 	if (done || ret != CC_NORM)
1239c80476e4SDavid E. O'Brien 	    return(ret);
1240c80476e4SDavid E. O'Brien 
1241c80476e4SDavid E. O'Brien     }
1242c80476e4SDavid E. O'Brien 
1243c80476e4SDavid E. O'Brien }
1244c80476e4SDavid E. O'Brien 
1245c80476e4SDavid E. O'Brien static CCRETVAL
124645e5710bSMark Peek v_search(int dir)
1247c80476e4SDavid E. O'Brien {
124845e5710bSMark Peek     struct Strbuf tmpbuf = Strbuf_INIT;
1249c80476e4SDavid E. O'Brien     Char ch;
125045e5710bSMark Peek     Char *oldbuf;
1251c80476e4SDavid E. O'Brien     Char *oldlc, *oldc;
1252c80476e4SDavid E. O'Brien 
125345e5710bSMark Peek     cleanup_push(&tmpbuf, Strbuf_cleanup);
125445e5710bSMark Peek     oldbuf = Strsave(InputBuf);
125545e5710bSMark Peek     cleanup_push(oldbuf, xfree);
1256c80476e4SDavid E. O'Brien     oldlc = LastChar;
1257c80476e4SDavid E. O'Brien     oldc = Cursor;
125845e5710bSMark Peek     Strbuf_append1(&tmpbuf, '*');
1259c80476e4SDavid E. O'Brien 
1260c80476e4SDavid E. O'Brien     InputBuf[0] = '\0';
1261c80476e4SDavid E. O'Brien     LastChar = InputBuf;
1262c80476e4SDavid E. O'Brien     Cursor = InputBuf;
1263c80476e4SDavid E. O'Brien     searchdir = dir;
1264c80476e4SDavid E. O'Brien 
1265c80476e4SDavid E. O'Brien     c_insert(2);	/* prompt + '\n' */
1266c80476e4SDavid E. O'Brien     *Cursor++ = '\n';
1267c80476e4SDavid E. O'Brien     *Cursor++ = dir == F_UP_SEARCH_HIST ? '?' : '/';
1268c80476e4SDavid E. O'Brien     Refresh();
1269c80476e4SDavid E. O'Brien     for (ch = 0;ch == 0;) {
127045e5710bSMark Peek 	if (GetNextChar(&ch) != 1) {
127145e5710bSMark Peek 	    cleanup_until(&tmpbuf);
1272c80476e4SDavid E. O'Brien 	    return(e_send_eof(0));
127345e5710bSMark Peek 	}
1274c80476e4SDavid E. O'Brien 	switch (ASC(ch)) {
1275c80476e4SDavid E. O'Brien 	case 0010:	/* Delete and backspace */
1276c80476e4SDavid E. O'Brien 	case 0177:
127745e5710bSMark Peek 	    if (tmpbuf.len > 1) {
1278c80476e4SDavid E. O'Brien 		*Cursor-- = '\0';
1279c80476e4SDavid E. O'Brien 		LastChar = Cursor;
128045e5710bSMark Peek 		tmpbuf.len--;
1281c80476e4SDavid E. O'Brien 	    }
1282c80476e4SDavid E. O'Brien 	    else {
128345e5710bSMark Peek 		copyn(InputBuf, oldbuf, INBUFSIZE);/*FIXBUF*/
1284c80476e4SDavid E. O'Brien 		LastChar = oldlc;
1285c80476e4SDavid E. O'Brien 		Cursor = oldc;
128645e5710bSMark Peek 		cleanup_until(&tmpbuf);
1287c80476e4SDavid E. O'Brien 		return(CC_REFRESH);
1288c80476e4SDavid E. O'Brien 	    }
1289c80476e4SDavid E. O'Brien 	    Refresh();
1290c80476e4SDavid E. O'Brien 	    ch = 0;
1291c80476e4SDavid E. O'Brien 	    break;
1292c80476e4SDavid E. O'Brien 
1293c80476e4SDavid E. O'Brien 	case 0033:	/* ESC */
12943b6eaa7bSAndrey A. Chernov #ifdef IS_ASCII
1295c80476e4SDavid E. O'Brien 	case '\r':	/* Newline */
1296c80476e4SDavid E. O'Brien 	case '\n':
1297c80476e4SDavid E. O'Brien #else
12983b6eaa7bSAndrey A. Chernov 	case '\012':    /* ASCII Line feed */
12993b6eaa7bSAndrey A. Chernov 	case '\015':    /* ASCII (or EBCDIC) Return */
1300c80476e4SDavid E. O'Brien #endif
1301c80476e4SDavid E. O'Brien 	    break;
1302c80476e4SDavid E. O'Brien 
1303c80476e4SDavid E. O'Brien 	default:
130445e5710bSMark Peek 	    Strbuf_append1(&tmpbuf, ch);
1305c80476e4SDavid E. O'Brien 	    *Cursor++ = ch;
1306c80476e4SDavid E. O'Brien 	    LastChar = Cursor;
1307c80476e4SDavid E. O'Brien 	    Refresh();
1308c80476e4SDavid E. O'Brien 	    ch = 0;
1309c80476e4SDavid E. O'Brien 	    break;
1310c80476e4SDavid E. O'Brien 	}
1311c80476e4SDavid E. O'Brien     }
131245e5710bSMark Peek     cleanup_until(oldbuf);
1313c80476e4SDavid E. O'Brien 
131445e5710bSMark Peek     if (tmpbuf.len == 1) {
1315c80476e4SDavid E. O'Brien 	/*
1316c80476e4SDavid E. O'Brien 	 * Use the old pattern, but wild-card it.
1317c80476e4SDavid E. O'Brien 	 */
131845e5710bSMark Peek 	if (patbuf.len == 0) {
1319c80476e4SDavid E. O'Brien 	    InputBuf[0] = '\0';
1320c80476e4SDavid E. O'Brien 	    LastChar = InputBuf;
1321c80476e4SDavid E. O'Brien 	    Cursor = InputBuf;
1322c80476e4SDavid E. O'Brien 	    Refresh();
132345e5710bSMark Peek 	    cleanup_until(&tmpbuf);
1324c80476e4SDavid E. O'Brien 	    return(CC_ERROR);
1325c80476e4SDavid E. O'Brien 	}
132645e5710bSMark Peek 	if (patbuf.s[0] != '*') {
132745e5710bSMark Peek 	    oldbuf = Strsave(patbuf.s);
132845e5710bSMark Peek 	    patbuf.len = 0;
132945e5710bSMark Peek 	    Strbuf_append1(&patbuf, '*');
133045e5710bSMark Peek 	    Strbuf_append(&patbuf, oldbuf);
133145e5710bSMark Peek 	    xfree(oldbuf);
133245e5710bSMark Peek 	    Strbuf_append1(&patbuf, '*');
133345e5710bSMark Peek 	    Strbuf_terminate(&patbuf);
1334c80476e4SDavid E. O'Brien 	}
1335c80476e4SDavid E. O'Brien     }
1336c80476e4SDavid E. O'Brien     else {
133745e5710bSMark Peek 	Strbuf_append1(&tmpbuf, '*');
133845e5710bSMark Peek 	Strbuf_terminate(&tmpbuf);
133945e5710bSMark Peek 	patbuf.len = 0;
134045e5710bSMark Peek 	Strbuf_append(&patbuf, tmpbuf.s);
134145e5710bSMark Peek 	Strbuf_terminate(&patbuf);
1342c80476e4SDavid E. O'Brien     }
134345e5710bSMark Peek     cleanup_until(&tmpbuf);
1344c80476e4SDavid E. O'Brien     LastCmd = (KEYCMD) dir; /* avoid c_hsetpat */
1345c80476e4SDavid E. O'Brien     Cursor = LastChar = InputBuf;
1346c80476e4SDavid E. O'Brien     if ((dir == F_UP_SEARCH_HIST ? e_up_search_hist(0) :
1347c80476e4SDavid E. O'Brien 				   e_down_search_hist(0)) == CC_ERROR) {
1348c80476e4SDavid E. O'Brien 	Refresh();
1349c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1350c80476e4SDavid E. O'Brien     }
1351c80476e4SDavid E. O'Brien     else {
135245e5710bSMark Peek 	if (ASC(ch) == 0033) {
1353c80476e4SDavid E. O'Brien 	    Refresh();
1354c80476e4SDavid E. O'Brien 	    *LastChar++ = '\n';
1355c80476e4SDavid E. O'Brien 	    *LastChar = '\0';
1356c80476e4SDavid E. O'Brien 	    PastBottom();
1357c80476e4SDavid E. O'Brien 	    return(CC_NEWLINE);
1358c80476e4SDavid E. O'Brien 	}
1359c80476e4SDavid E. O'Brien 	else
1360c80476e4SDavid E. O'Brien 	    return(CC_REFRESH);
1361c80476e4SDavid E. O'Brien     }
1362c80476e4SDavid E. O'Brien }
1363c80476e4SDavid E. O'Brien 
1364c80476e4SDavid E. O'Brien /*
1365c80476e4SDavid E. O'Brien  * semi-PUBLIC routines.  Any routine that is of type CCRETVAL is an
1366c80476e4SDavid E. O'Brien  * entry point, called from the CcKeyMap indirected into the
1367c80476e4SDavid E. O'Brien  * CcFuncTbl array.
1368c80476e4SDavid E. O'Brien  */
1369c80476e4SDavid E. O'Brien 
1370c80476e4SDavid E. O'Brien /*ARGSUSED*/
1371c80476e4SDavid E. O'Brien CCRETVAL
137245e5710bSMark Peek v_cmd_mode(Char c)
1373c80476e4SDavid E. O'Brien {
1374c80476e4SDavid E. O'Brien     USE(c);
1375c80476e4SDavid E. O'Brien     InsertPos = 0;
1376c80476e4SDavid E. O'Brien     ActionFlag = TCSHOP_NOP;	/* [Esc] cancels pending action */
1377c80476e4SDavid E. O'Brien     ActionPos = 0;
1378c80476e4SDavid E. O'Brien     DoingArg = 0;
1379c80476e4SDavid E. O'Brien     if (UndoPtr > Cursor)
1380c80476e4SDavid E. O'Brien 	UndoSize = (int)(UndoPtr - Cursor);
1381c80476e4SDavid E. O'Brien     else
1382c80476e4SDavid E. O'Brien 	UndoSize = (int)(Cursor - UndoPtr);
1383c80476e4SDavid E. O'Brien 
1384c80476e4SDavid E. O'Brien     inputmode = MODE_INSERT;
1385c80476e4SDavid E. O'Brien     c_alternativ_key_map(1);
1386c80476e4SDavid E. O'Brien #ifdef notdef
1387c80476e4SDavid E. O'Brien     /*
1388c80476e4SDavid E. O'Brien      * We don't want to move the cursor, because all the editing
1389c80476e4SDavid E. O'Brien      * commands don't include the character under the cursor.
1390c80476e4SDavid E. O'Brien      */
1391c80476e4SDavid E. O'Brien     if (Cursor > InputBuf)
1392c80476e4SDavid E. O'Brien 	Cursor--;
1393c80476e4SDavid E. O'Brien #endif
1394c80476e4SDavid E. O'Brien     RefCursor();
1395c80476e4SDavid E. O'Brien     return(CC_NORM);
1396c80476e4SDavid E. O'Brien }
1397c80476e4SDavid E. O'Brien 
1398c80476e4SDavid E. O'Brien /*ARGSUSED*/
1399c80476e4SDavid E. O'Brien CCRETVAL
140045e5710bSMark Peek e_unassigned(Char c)
1401c80476e4SDavid E. O'Brien {				/* bound to keys that arn't really assigned */
1402c80476e4SDavid E. O'Brien     USE(c);
1403c80476e4SDavid E. O'Brien     SoundBeep();
1404c80476e4SDavid E. O'Brien     flush();
1405c80476e4SDavid E. O'Brien     return(CC_NORM);
1406c80476e4SDavid E. O'Brien }
1407c80476e4SDavid E. O'Brien 
140845e5710bSMark Peek #ifdef notyet
140923338178SMark Peek static CCRETVAL
141045e5710bSMark Peek e_insert_str(Char *c)
141123338178SMark Peek {
141223338178SMark Peek     int i, n;
141323338178SMark Peek 
141423338178SMark Peek     n = Strlen(c);
141523338178SMark Peek     if (LastChar + Argument * n >= InputLim)
141623338178SMark Peek 	return(CC_ERROR);	/* end of buffer space */
141723338178SMark Peek     if (inputmode != MODE_INSERT) {
141845e5710bSMark Peek 	c_delafter(Argument * Strlen(c));
141923338178SMark Peek     }
142023338178SMark Peek     c_insert(Argument * n);
142123338178SMark Peek     while (Argument--) {
142223338178SMark Peek 	for (i = 0; i < n; i++)
142323338178SMark Peek 	    *Cursor++ = c[i];
142423338178SMark Peek     }
142523338178SMark Peek     Refresh();
142623338178SMark Peek     return(CC_NORM);
142723338178SMark Peek }
142845e5710bSMark Peek #endif
142923338178SMark Peek 
1430c80476e4SDavid E. O'Brien CCRETVAL
143145e5710bSMark Peek e_insert(Char c)
1432c80476e4SDavid E. O'Brien {
1433c80476e4SDavid E. O'Brien #ifndef SHORT_STRINGS
1434c80476e4SDavid E. O'Brien     c &= ASCII;			/* no meta chars ever */
1435c80476e4SDavid E. O'Brien #endif
1436c80476e4SDavid E. O'Brien 
1437c80476e4SDavid E. O'Brien     if (!c)
1438c80476e4SDavid E. O'Brien 	return(CC_ERROR);	/* no NULs in the input ever!! */
1439c80476e4SDavid E. O'Brien 
1440c80476e4SDavid E. O'Brien     if (LastChar + Argument >= InputLim)
1441c80476e4SDavid E. O'Brien 	return(CC_ERROR);	/* end of buffer space */
1442c80476e4SDavid E. O'Brien 
1443c80476e4SDavid E. O'Brien     if (Argument == 1) {  	/* How was this optimized ???? */
1444c80476e4SDavid E. O'Brien 
1445c80476e4SDavid E. O'Brien 	if (inputmode != MODE_INSERT) {
1446c80476e4SDavid E. O'Brien 	    UndoBuf[UndoSize++] = *Cursor;
1447c80476e4SDavid E. O'Brien 	    UndoBuf[UndoSize] = '\0';
1448c80476e4SDavid E. O'Brien 	    c_delafter(1);   /* Do NOT use the saving ONE */
1449c80476e4SDavid E. O'Brien     	}
1450c80476e4SDavid E. O'Brien 
1451c80476e4SDavid E. O'Brien         c_insert(1);
1452c80476e4SDavid E. O'Brien 	*Cursor++ = (Char) c;
1453c80476e4SDavid E. O'Brien 	DoingArg = 0;		/* just in case */
145423338178SMark Peek 	RefPlusOne(1);		/* fast refresh for one char. */
1455c80476e4SDavid E. O'Brien     }
1456c80476e4SDavid E. O'Brien     else {
1457c80476e4SDavid E. O'Brien 	if (inputmode != MODE_INSERT) {
145823338178SMark Peek 	    int i;
1459c80476e4SDavid E. O'Brien 	    for(i = 0; i < Argument; i++)
1460c80476e4SDavid E. O'Brien 		UndoBuf[UndoSize++] = *(Cursor + i);
1461c80476e4SDavid E. O'Brien 
1462c80476e4SDavid E. O'Brien 	    UndoBuf[UndoSize] = '\0';
1463c80476e4SDavid E. O'Brien 	    c_delafter(Argument);   /* Do NOT use the saving ONE */
1464c80476e4SDavid E. O'Brien     	}
1465c80476e4SDavid E. O'Brien 
1466c80476e4SDavid E. O'Brien         c_insert(Argument);
1467c80476e4SDavid E. O'Brien 
1468c80476e4SDavid E. O'Brien 	while (Argument--)
1469c80476e4SDavid E. O'Brien 	    *Cursor++ = (Char) c;
1470c80476e4SDavid E. O'Brien 	Refresh();
1471c80476e4SDavid E. O'Brien     }
1472c80476e4SDavid E. O'Brien 
1473c80476e4SDavid E. O'Brien     if (inputmode == MODE_REPLACE_1)
1474c80476e4SDavid E. O'Brien 	(void) v_cmd_mode(0);
1475c80476e4SDavid E. O'Brien 
1476c80476e4SDavid E. O'Brien     return(CC_NORM);
1477c80476e4SDavid E. O'Brien }
1478c80476e4SDavid E. O'Brien 
1479c80476e4SDavid E. O'Brien int
148045e5710bSMark Peek InsertStr(Char *s)		/* insert ASCIZ s at cursor (for complete) */
1481c80476e4SDavid E. O'Brien {
14826767bd61SMark Peek     int len;
1483c80476e4SDavid E. O'Brien 
1484c80476e4SDavid E. O'Brien     if ((len = (int) Strlen(s)) <= 0)
1485c80476e4SDavid E. O'Brien 	return -1;
1486c80476e4SDavid E. O'Brien     if (LastChar + len >= InputLim)
1487c80476e4SDavid E. O'Brien 	return -1;		/* end of buffer space */
1488c80476e4SDavid E. O'Brien 
1489c80476e4SDavid E. O'Brien     c_insert(len);
1490c80476e4SDavid E. O'Brien     while (len--)
1491c80476e4SDavid E. O'Brien 	*Cursor++ = *s++;
1492c80476e4SDavid E. O'Brien     return 0;
1493c80476e4SDavid E. O'Brien }
1494c80476e4SDavid E. O'Brien 
1495c80476e4SDavid E. O'Brien void
149645e5710bSMark Peek DeleteBack(int n)		/* delete the n characters before . */
1497c80476e4SDavid E. O'Brien {
1498c80476e4SDavid E. O'Brien     if (n <= 0)
1499c80476e4SDavid E. O'Brien 	return;
1500c80476e4SDavid E. O'Brien     if (Cursor >= &InputBuf[n]) {
1501c80476e4SDavid E. O'Brien 	c_delbefore(n);		/* delete before dot */
1502c80476e4SDavid E. O'Brien     }
1503c80476e4SDavid E. O'Brien }
1504c80476e4SDavid E. O'Brien 
1505c80476e4SDavid E. O'Brien CCRETVAL
150645e5710bSMark Peek e_digit(Char c)			/* gray magic here */
1507c80476e4SDavid E. O'Brien {
1508c80476e4SDavid E. O'Brien     if (!Isdigit(c))
1509c80476e4SDavid E. O'Brien 	return(CC_ERROR);	/* no NULs in the input ever!! */
1510c80476e4SDavid E. O'Brien 
1511c80476e4SDavid E. O'Brien     if (DoingArg) {		/* if doing an arg, add this in... */
1512c80476e4SDavid E. O'Brien 	if (LastCmd == F_ARGFOUR)	/* if last command was ^U */
1513c80476e4SDavid E. O'Brien 	    Argument = c - '0';
1514c80476e4SDavid E. O'Brien 	else {
1515c80476e4SDavid E. O'Brien 	    if (Argument > 1000000)
1516c80476e4SDavid E. O'Brien 		return CC_ERROR;
1517c80476e4SDavid E. O'Brien 	    Argument = (Argument * 10) + (c - '0');
1518c80476e4SDavid E. O'Brien 	}
1519c80476e4SDavid E. O'Brien 	return(CC_ARGHACK);
1520c80476e4SDavid E. O'Brien     }
1521c80476e4SDavid E. O'Brien     else {
1522c80476e4SDavid E. O'Brien 	if (LastChar + 1 >= InputLim)
1523c80476e4SDavid E. O'Brien 	    return CC_ERROR;	/* end of buffer space */
1524c80476e4SDavid E. O'Brien 
1525c80476e4SDavid E. O'Brien 	if (inputmode != MODE_INSERT) {
1526c80476e4SDavid E. O'Brien 	    UndoBuf[UndoSize++] = *Cursor;
1527c80476e4SDavid E. O'Brien 	    UndoBuf[UndoSize] = '\0';
1528c80476e4SDavid E. O'Brien 	    c_delafter(1);   /* Do NOT use the saving ONE */
1529c80476e4SDavid E. O'Brien     	}
1530c80476e4SDavid E. O'Brien 	c_insert(1);
1531c80476e4SDavid E. O'Brien 	*Cursor++ = (Char) c;
1532c80476e4SDavid E. O'Brien 	DoingArg = 0;		/* just in case */
153323338178SMark Peek 	RefPlusOne(1);		/* fast refresh for one char. */
1534c80476e4SDavid E. O'Brien     }
1535c80476e4SDavid E. O'Brien     return(CC_NORM);
1536c80476e4SDavid E. O'Brien }
1537c80476e4SDavid E. O'Brien 
1538c80476e4SDavid E. O'Brien CCRETVAL
153945e5710bSMark Peek e_argdigit(Char c)		/* for ESC-n */
1540c80476e4SDavid E. O'Brien {
154145e5710bSMark Peek #ifdef IS_ASCII
1542c80476e4SDavid E. O'Brien     c &= ASCII;
154345e5710bSMark Peek #else
154445e5710bSMark Peek     c = CTL_ESC(ASC(c) & ASCII); /* stripping for EBCDIC done the ASCII way */
154545e5710bSMark Peek #endif
1546c80476e4SDavid E. O'Brien 
1547c80476e4SDavid E. O'Brien     if (!Isdigit(c))
1548c80476e4SDavid E. O'Brien 	return(CC_ERROR);	/* no NULs in the input ever!! */
1549c80476e4SDavid E. O'Brien 
1550c80476e4SDavid E. O'Brien     if (DoingArg) {		/* if doing an arg, add this in... */
1551c80476e4SDavid E. O'Brien 	if (Argument > 1000000)
1552c80476e4SDavid E. O'Brien 	    return CC_ERROR;
1553c80476e4SDavid E. O'Brien 	Argument = (Argument * 10) + (c - '0');
1554c80476e4SDavid E. O'Brien     }
1555c80476e4SDavid E. O'Brien     else {			/* else starting an argument */
1556c80476e4SDavid E. O'Brien 	Argument = c - '0';
1557c80476e4SDavid E. O'Brien 	DoingArg = 1;
1558c80476e4SDavid E. O'Brien     }
1559c80476e4SDavid E. O'Brien     return(CC_ARGHACK);
1560c80476e4SDavid E. O'Brien }
1561c80476e4SDavid E. O'Brien 
1562c80476e4SDavid E. O'Brien CCRETVAL
156345e5710bSMark Peek v_zero(Char c)			/* command mode 0 for vi */
1564c80476e4SDavid E. O'Brien {
1565c80476e4SDavid E. O'Brien     if (DoingArg) {		/* if doing an arg, add this in... */
1566c80476e4SDavid E. O'Brien 	if (Argument > 1000000)
1567c80476e4SDavid E. O'Brien 	    return CC_ERROR;
1568c80476e4SDavid E. O'Brien 	Argument = (Argument * 10) + (c - '0');
1569c80476e4SDavid E. O'Brien 	return(CC_ARGHACK);
1570c80476e4SDavid E. O'Brien     }
1571c80476e4SDavid E. O'Brien     else {			/* else starting an argument */
1572c80476e4SDavid E. O'Brien 	Cursor = InputBuf;
1573c80476e4SDavid E. O'Brien 	if (ActionFlag & TCSHOP_DELETE) {
1574c80476e4SDavid E. O'Brien 	   c_delfini();
1575c80476e4SDavid E. O'Brien 	   return(CC_REFRESH);
1576c80476e4SDavid E. O'Brien         }
1577c80476e4SDavid E. O'Brien 	RefCursor();		/* move the cursor */
1578c80476e4SDavid E. O'Brien 	return(CC_NORM);
1579c80476e4SDavid E. O'Brien     }
1580c80476e4SDavid E. O'Brien }
1581c80476e4SDavid E. O'Brien 
1582c80476e4SDavid E. O'Brien /*ARGSUSED*/
1583c80476e4SDavid E. O'Brien CCRETVAL
158445e5710bSMark Peek e_newline(Char c)
1585c80476e4SDavid E. O'Brien {				/* always ignore argument */
1586c80476e4SDavid E. O'Brien     USE(c);
158745e5710bSMark Peek     if (adrof(STRhighlight) && MarkIsSet) {
158845e5710bSMark Peek 	MarkIsSet = 0;
158945e5710bSMark Peek 	ClearLines();
159045e5710bSMark Peek 	ClearDisp();
159145e5710bSMark Peek 	Refresh();
159245e5710bSMark Peek     }
159345e5710bSMark Peek     MarkIsSet = 0;
159445e5710bSMark Peek 
1595c80476e4SDavid E. O'Brien   /*  PastBottom();  NOW done in ed.inputl.c */
1596c80476e4SDavid E. O'Brien     *LastChar++ = '\n';		/* for the benefit of CSH */
1597c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1598c80476e4SDavid E. O'Brien     if (VImode)
1599c80476e4SDavid E. O'Brien 	InsertPos = InputBuf;	/* Reset editing position */
1600c80476e4SDavid E. O'Brien     return(CC_NEWLINE);
1601c80476e4SDavid E. O'Brien }
1602c80476e4SDavid E. O'Brien 
1603c80476e4SDavid E. O'Brien /*ARGSUSED*/
1604c80476e4SDavid E. O'Brien CCRETVAL
160545e5710bSMark Peek e_newline_hold(Char c)
160645e5710bSMark Peek {
160745e5710bSMark Peek     USE(c);
160845e5710bSMark Peek     c_save_inputbuf();
160945e5710bSMark Peek     HistSaved = 0;
161045e5710bSMark Peek     *LastChar++ = '\n';		/* for the benefit of CSH */
161145e5710bSMark Peek     *LastChar = '\0';		/* just in case */
161245e5710bSMark Peek     return(CC_NEWLINE);
161345e5710bSMark Peek }
161445e5710bSMark Peek 
161545e5710bSMark Peek /*ARGSUSED*/
161645e5710bSMark Peek CCRETVAL
161745e5710bSMark Peek e_newline_down_hist(Char c)
161845e5710bSMark Peek {
161945e5710bSMark Peek     USE(c);
162045e5710bSMark Peek     if (Hist_num > 1) {
162145e5710bSMark Peek 	HistSaved = Hist_num;
162245e5710bSMark Peek     }
162345e5710bSMark Peek     *LastChar++ = '\n';		/* for the benefit of CSH */
162445e5710bSMark Peek     *LastChar = '\0';		/* just in case */
162545e5710bSMark Peek     return(CC_NEWLINE);
162645e5710bSMark Peek }
162745e5710bSMark Peek 
162845e5710bSMark Peek /*ARGSUSED*/
162945e5710bSMark Peek CCRETVAL
163045e5710bSMark Peek e_send_eof(Char c)
1631c80476e4SDavid E. O'Brien {				/* for when ^D is ONLY send-eof */
1632c80476e4SDavid E. O'Brien     USE(c);
1633c80476e4SDavid E. O'Brien     PastBottom();
1634c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1635c80476e4SDavid E. O'Brien     return(CC_EOF);
1636c80476e4SDavid E. O'Brien }
1637c80476e4SDavid E. O'Brien 
1638c80476e4SDavid E. O'Brien /*ARGSUSED*/
1639c80476e4SDavid E. O'Brien CCRETVAL
164045e5710bSMark Peek e_complete(Char c)
1641c80476e4SDavid E. O'Brien {
1642c80476e4SDavid E. O'Brien     USE(c);
1643c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1644c80476e4SDavid E. O'Brien     return(CC_COMPLETE);
1645c80476e4SDavid E. O'Brien }
1646c80476e4SDavid E. O'Brien 
1647c80476e4SDavid E. O'Brien /*ARGSUSED*/
1648c80476e4SDavid E. O'Brien CCRETVAL
164945e5710bSMark Peek e_complete_back(Char c)
1650c80476e4SDavid E. O'Brien {
1651c80476e4SDavid E. O'Brien     USE(c);
1652c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1653c80476e4SDavid E. O'Brien     return(CC_COMPLETE_BACK);
1654c80476e4SDavid E. O'Brien }
1655c80476e4SDavid E. O'Brien 
1656c80476e4SDavid E. O'Brien /*ARGSUSED*/
1657c80476e4SDavid E. O'Brien CCRETVAL
165845e5710bSMark Peek e_complete_fwd(Char c)
1659c80476e4SDavid E. O'Brien {
1660c80476e4SDavid E. O'Brien     USE(c);
1661c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1662c80476e4SDavid E. O'Brien     return(CC_COMPLETE_FWD);
1663c80476e4SDavid E. O'Brien }
1664c80476e4SDavid E. O'Brien 
1665c80476e4SDavid E. O'Brien /*ARGSUSED*/
1666c80476e4SDavid E. O'Brien CCRETVAL
166745e5710bSMark Peek e_complete_all(Char c)
1668c80476e4SDavid E. O'Brien {
1669c80476e4SDavid E. O'Brien     USE(c);
1670c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1671c80476e4SDavid E. O'Brien     return(CC_COMPLETE_ALL);
1672c80476e4SDavid E. O'Brien }
1673c80476e4SDavid E. O'Brien 
1674c80476e4SDavid E. O'Brien /*ARGSUSED*/
1675c80476e4SDavid E. O'Brien CCRETVAL
167645e5710bSMark Peek v_cm_complete(Char c)
1677c80476e4SDavid E. O'Brien {
1678c80476e4SDavid E. O'Brien     USE(c);
1679c80476e4SDavid E. O'Brien     if (Cursor < LastChar)
1680c80476e4SDavid E. O'Brien 	Cursor++;
1681c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1682c80476e4SDavid E. O'Brien     return(CC_COMPLETE);
1683c80476e4SDavid E. O'Brien }
1684c80476e4SDavid E. O'Brien 
1685c80476e4SDavid E. O'Brien /*ARGSUSED*/
1686c80476e4SDavid E. O'Brien CCRETVAL
168745e5710bSMark Peek e_toggle_hist(Char c)
1688c80476e4SDavid E. O'Brien {
1689c80476e4SDavid E. O'Brien     struct Hist *hp;
1690c80476e4SDavid E. O'Brien     int     h;
1691c80476e4SDavid E. O'Brien 
1692c80476e4SDavid E. O'Brien     USE(c);
1693c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1694c80476e4SDavid E. O'Brien 
1695c80476e4SDavid E. O'Brien     if (Hist_num <= 0) {
1696c80476e4SDavid E. O'Brien 	return CC_ERROR;
1697c80476e4SDavid E. O'Brien     }
1698c80476e4SDavid E. O'Brien 
1699c80476e4SDavid E. O'Brien     hp = Histlist.Hnext;
1700c80476e4SDavid E. O'Brien     if (hp == NULL) {	/* this is only if no history */
1701c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1702c80476e4SDavid E. O'Brien     }
1703c80476e4SDavid E. O'Brien 
1704c80476e4SDavid E. O'Brien     for (h = 1; h < Hist_num; h++)
1705c80476e4SDavid E. O'Brien 	hp = hp->Hnext;
1706c80476e4SDavid E. O'Brien 
1707c80476e4SDavid E. O'Brien     if (!CurrentHistLit) {
1708c80476e4SDavid E. O'Brien 	if (hp->histline) {
170945e5710bSMark Peek 	    copyn(InputBuf, hp->histline, INBUFSIZE);/*FIXBUF*/
1710c80476e4SDavid E. O'Brien 	    CurrentHistLit = 1;
1711c80476e4SDavid E. O'Brien 	}
1712c80476e4SDavid E. O'Brien 	else {
1713c80476e4SDavid E. O'Brien 	    return CC_ERROR;
1714c80476e4SDavid E. O'Brien 	}
1715c80476e4SDavid E. O'Brien     }
1716c80476e4SDavid E. O'Brien     else {
171745e5710bSMark Peek 	Char *p;
171845e5710bSMark Peek 
171945e5710bSMark Peek 	p = sprlex(&hp->Hlex);
172045e5710bSMark Peek 	copyn(InputBuf, p, sizeof(InputBuf) / sizeof(Char));/*FIXBUF*/
172145e5710bSMark Peek 	xfree(p);
1722c80476e4SDavid E. O'Brien 	CurrentHistLit = 0;
1723c80476e4SDavid E. O'Brien     }
1724c80476e4SDavid E. O'Brien 
172545e5710bSMark Peek     LastChar = Strend(InputBuf);
1726c80476e4SDavid E. O'Brien     if (LastChar > InputBuf) {
1727c80476e4SDavid E. O'Brien 	if (LastChar[-1] == '\n')
1728c80476e4SDavid E. O'Brien 	    LastChar--;
1729c80476e4SDavid E. O'Brien 	if (LastChar[-1] == ' ')
1730c80476e4SDavid E. O'Brien 	    LastChar--;
1731c80476e4SDavid E. O'Brien 	if (LastChar < InputBuf)
1732c80476e4SDavid E. O'Brien 	    LastChar = InputBuf;
1733c80476e4SDavid E. O'Brien     }
1734c80476e4SDavid E. O'Brien 
1735c80476e4SDavid E. O'Brien #ifdef KSHVI
1736c80476e4SDavid E. O'Brien     if (VImode)
1737c80476e4SDavid E. O'Brien 	Cursor = InputBuf;
1738c80476e4SDavid E. O'Brien     else
1739c80476e4SDavid E. O'Brien #endif /* KSHVI */
1740c80476e4SDavid E. O'Brien 	Cursor = LastChar;
1741c80476e4SDavid E. O'Brien 
1742c80476e4SDavid E. O'Brien     return(CC_REFRESH);
1743c80476e4SDavid E. O'Brien }
1744c80476e4SDavid E. O'Brien 
1745c80476e4SDavid E. O'Brien /*ARGSUSED*/
1746c80476e4SDavid E. O'Brien CCRETVAL
174745e5710bSMark Peek e_up_hist(Char c)
1748c80476e4SDavid E. O'Brien {
1749c80476e4SDavid E. O'Brien     Char    beep = 0;
1750c80476e4SDavid E. O'Brien 
1751c80476e4SDavid E. O'Brien     USE(c);
1752c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_NOP;
1753c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1754c80476e4SDavid E. O'Brien 
1755c80476e4SDavid E. O'Brien     if (Hist_num == 0) {	/* save the current buffer away */
175645e5710bSMark Peek 	HistBuf.len = 0;
175745e5710bSMark Peek 	Strbuf_append(&HistBuf, InputBuf);
175845e5710bSMark Peek 	Strbuf_terminate(&HistBuf);
1759c80476e4SDavid E. O'Brien     }
1760c80476e4SDavid E. O'Brien 
1761c80476e4SDavid E. O'Brien     Hist_num += Argument;
1762c80476e4SDavid E. O'Brien 
176345e5710bSMark Peek     if (GetHistLine() == CC_ERROR) {
1764c80476e4SDavid E. O'Brien 	beep = 1;
176545e5710bSMark Peek 	(void) GetHistLine(); /* Hist_num was fixed by first call */
1766c80476e4SDavid E. O'Brien     }
1767c80476e4SDavid E. O'Brien 
1768c80476e4SDavid E. O'Brien     Refresh();
1769c80476e4SDavid E. O'Brien     if (beep)
1770c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1771c80476e4SDavid E. O'Brien     else
1772c80476e4SDavid E. O'Brien 	return(CC_NORM);	/* was CC_UP_HIST */
1773c80476e4SDavid E. O'Brien }
1774c80476e4SDavid E. O'Brien 
1775c80476e4SDavid E. O'Brien /*ARGSUSED*/
1776c80476e4SDavid E. O'Brien CCRETVAL
177745e5710bSMark Peek e_down_hist(Char c)
1778c80476e4SDavid E. O'Brien {
1779c80476e4SDavid E. O'Brien     USE(c);
1780c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_NOP;
1781c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1782c80476e4SDavid E. O'Brien 
1783c80476e4SDavid E. O'Brien     Hist_num -= Argument;
1784c80476e4SDavid E. O'Brien 
1785c80476e4SDavid E. O'Brien     if (Hist_num < 0) {
1786c80476e4SDavid E. O'Brien 	Hist_num = 0;
1787c80476e4SDavid E. O'Brien 	return(CC_ERROR);	/* make it beep */
1788c80476e4SDavid E. O'Brien     }
1789c80476e4SDavid E. O'Brien 
179045e5710bSMark Peek     return(GetHistLine());
1791c80476e4SDavid E. O'Brien }
1792c80476e4SDavid E. O'Brien 
1793c80476e4SDavid E. O'Brien 
1794c80476e4SDavid E. O'Brien 
1795c80476e4SDavid E. O'Brien /*
1796c80476e4SDavid E. O'Brien  * c_hmatch() return True if the pattern matches the prefix
1797c80476e4SDavid E. O'Brien  */
1798c80476e4SDavid E. O'Brien static int
179945e5710bSMark Peek c_hmatch(Char *str)
1800c80476e4SDavid E. O'Brien {
180145e5710bSMark Peek     if (Strncmp(patbuf.s, str, patbuf.len) == 0)
1802c80476e4SDavid E. O'Brien 	return 1;
180345e5710bSMark Peek     return Gmatch(str, patbuf.s);
1804c80476e4SDavid E. O'Brien }
1805c80476e4SDavid E. O'Brien 
1806c80476e4SDavid E. O'Brien /*
1807c80476e4SDavid E. O'Brien  * c_hsetpat(): Set the history seatch pattern
1808c80476e4SDavid E. O'Brien  */
1809c80476e4SDavid E. O'Brien static void
181045e5710bSMark Peek c_hsetpat(void)
1811c80476e4SDavid E. O'Brien {
1812c80476e4SDavid E. O'Brien     if (LastCmd != F_UP_SEARCH_HIST && LastCmd != F_DOWN_SEARCH_HIST) {
181345e5710bSMark Peek 	patbuf.len = 0;
181445e5710bSMark Peek 	Strbuf_appendn(&patbuf, InputBuf, Cursor - InputBuf);
181545e5710bSMark Peek 	Strbuf_terminate(&patbuf);
1816c80476e4SDavid E. O'Brien     }
1817c80476e4SDavid E. O'Brien #ifdef SDEBUG
1818c80476e4SDavid E. O'Brien     xprintf("\nHist_num = %d\n", Hist_num);
181945e5710bSMark Peek     xprintf("patlen = %d\n", (int)patbuf.len);
182045e5710bSMark Peek     xprintf("patbuf = \"%S\"\n", patbuf.s);
1821c80476e4SDavid E. O'Brien     xprintf("Cursor %d LastChar %d\n", Cursor - InputBuf, LastChar - InputBuf);
1822c80476e4SDavid E. O'Brien #endif
1823c80476e4SDavid E. O'Brien }
1824c80476e4SDavid E. O'Brien 
1825c80476e4SDavid E. O'Brien /*ARGSUSED*/
1826c80476e4SDavid E. O'Brien CCRETVAL
182745e5710bSMark Peek e_up_search_hist(Char c)
1828c80476e4SDavid E. O'Brien {
1829c80476e4SDavid E. O'Brien     struct Hist *hp;
1830c80476e4SDavid E. O'Brien     int h;
183123338178SMark Peek     int    found = 0;
1832c80476e4SDavid E. O'Brien 
1833c80476e4SDavid E. O'Brien     USE(c);
1834c80476e4SDavid E. O'Brien     ActionFlag = TCSHOP_NOP;
1835c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_NOP;
1836c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1837c80476e4SDavid E. O'Brien     if (Hist_num < 0) {
1838c80476e4SDavid E. O'Brien #ifdef DEBUG_EDIT
1839c80476e4SDavid E. O'Brien 	xprintf("%s: e_up_search_hist(): Hist_num < 0; resetting.\n", progname);
1840c80476e4SDavid E. O'Brien #endif
1841c80476e4SDavid E. O'Brien 	Hist_num = 0;
1842c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1843c80476e4SDavid E. O'Brien     }
1844c80476e4SDavid E. O'Brien 
184545e5710bSMark Peek     if (Hist_num == 0) {
184645e5710bSMark Peek 	HistBuf.len = 0;
184745e5710bSMark Peek 	Strbuf_append(&HistBuf, InputBuf);
184845e5710bSMark Peek 	Strbuf_terminate(&HistBuf);
1849c80476e4SDavid E. O'Brien     }
1850c80476e4SDavid E. O'Brien 
1851c80476e4SDavid E. O'Brien 
1852c80476e4SDavid E. O'Brien     hp = Histlist.Hnext;
1853c80476e4SDavid E. O'Brien     if (hp == NULL)
1854c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1855c80476e4SDavid E. O'Brien 
1856c80476e4SDavid E. O'Brien     c_hsetpat();		/* Set search pattern !! */
1857c80476e4SDavid E. O'Brien 
1858c80476e4SDavid E. O'Brien     for (h = 1; h <= Hist_num; h++)
1859c80476e4SDavid E. O'Brien 	hp = hp->Hnext;
1860c80476e4SDavid E. O'Brien 
1861c80476e4SDavid E. O'Brien     while (hp != NULL) {
186245e5710bSMark Peek 	Char *hl;
186345e5710bSMark Peek 	int matched;
186445e5710bSMark Peek 
186545e5710bSMark Peek 	if (hp->histline == NULL)
186645e5710bSMark Peek 	    hp->histline = sprlex(&hp->Hlex);
186745e5710bSMark Peek 	if (HistLit)
186845e5710bSMark Peek 	    hl = hp->histline;
186945e5710bSMark Peek 	else {
187045e5710bSMark Peek 	    hl = sprlex(&hp->Hlex);
187145e5710bSMark Peek 	    cleanup_push(hl, xfree);
1872c80476e4SDavid E. O'Brien 	}
1873c80476e4SDavid E. O'Brien #ifdef SDEBUG
1874c80476e4SDavid E. O'Brien 	xprintf("Comparing with \"%S\"\n", hl);
1875c80476e4SDavid E. O'Brien #endif
187645e5710bSMark Peek 	matched = (Strncmp(hl, InputBuf, (size_t) (LastChar - InputBuf)) ||
187745e5710bSMark Peek 		   hl[LastChar-InputBuf]) && c_hmatch(hl);
187845e5710bSMark Peek 	if (!HistLit)
187945e5710bSMark Peek 	    cleanup_until(hl);
188045e5710bSMark Peek 	if (matched) {
1881c80476e4SDavid E. O'Brien 	    found++;
1882c80476e4SDavid E. O'Brien 	    break;
1883c80476e4SDavid E. O'Brien 	}
1884c80476e4SDavid E. O'Brien 	h++;
1885c80476e4SDavid E. O'Brien 	hp = hp->Hnext;
1886c80476e4SDavid E. O'Brien     }
1887c80476e4SDavid E. O'Brien 
1888c80476e4SDavid E. O'Brien     if (!found) {
1889c80476e4SDavid E. O'Brien #ifdef SDEBUG
1890c80476e4SDavid E. O'Brien 	xprintf("not found\n");
1891c80476e4SDavid E. O'Brien #endif
1892c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1893c80476e4SDavid E. O'Brien     }
1894c80476e4SDavid E. O'Brien 
1895c80476e4SDavid E. O'Brien     Hist_num = h;
1896c80476e4SDavid E. O'Brien 
189745e5710bSMark Peek     return(GetHistLine());
1898c80476e4SDavid E. O'Brien }
1899c80476e4SDavid E. O'Brien 
1900c80476e4SDavid E. O'Brien /*ARGSUSED*/
1901c80476e4SDavid E. O'Brien CCRETVAL
190245e5710bSMark Peek e_down_search_hist(Char c)
1903c80476e4SDavid E. O'Brien {
1904c80476e4SDavid E. O'Brien     struct Hist *hp;
1905c80476e4SDavid E. O'Brien     int h;
190623338178SMark Peek     int    found = 0;
1907c80476e4SDavid E. O'Brien 
1908c80476e4SDavid E. O'Brien     USE(c);
1909c80476e4SDavid E. O'Brien     ActionFlag = TCSHOP_NOP;
1910c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_NOP;
1911c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1912c80476e4SDavid E. O'Brien 
1913c80476e4SDavid E. O'Brien     if (Hist_num == 0)
1914c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1915c80476e4SDavid E. O'Brien 
1916c80476e4SDavid E. O'Brien     hp = Histlist.Hnext;
1917c80476e4SDavid E. O'Brien     if (hp == 0)
1918c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1919c80476e4SDavid E. O'Brien 
1920c80476e4SDavid E. O'Brien     c_hsetpat();		/* Set search pattern !! */
1921c80476e4SDavid E. O'Brien 
1922c80476e4SDavid E. O'Brien     for (h = 1; h < Hist_num && hp; h++) {
192345e5710bSMark Peek 	Char *hl;
192445e5710bSMark Peek 	if (hp->histline == NULL)
192545e5710bSMark Peek 	    hp->histline = sprlex(&hp->Hlex);
192645e5710bSMark Peek 	if (HistLit)
192745e5710bSMark Peek 	    hl = hp->histline;
192845e5710bSMark Peek 	else {
192945e5710bSMark Peek 	    hl = sprlex(&hp->Hlex);
193045e5710bSMark Peek 	    cleanup_push(hl, xfree);
1931c80476e4SDavid E. O'Brien 	}
1932c80476e4SDavid E. O'Brien #ifdef SDEBUG
1933c80476e4SDavid E. O'Brien 	xprintf("Comparing with \"%S\"\n", hl);
1934c80476e4SDavid E. O'Brien #endif
1935c80476e4SDavid E. O'Brien 	if ((Strncmp(hl, InputBuf, (size_t) (LastChar - InputBuf)) ||
1936c80476e4SDavid E. O'Brien 	     hl[LastChar-InputBuf]) && c_hmatch(hl))
1937c80476e4SDavid E. O'Brien 	    found = h;
193845e5710bSMark Peek 	if (!HistLit)
193945e5710bSMark Peek 	    cleanup_until(hl);
1940c80476e4SDavid E. O'Brien 	hp = hp->Hnext;
1941c80476e4SDavid E. O'Brien     }
1942c80476e4SDavid E. O'Brien 
1943c80476e4SDavid E. O'Brien     if (!found) {		/* is it the current history number? */
194445e5710bSMark Peek 	if (!c_hmatch(HistBuf.s)) {
1945c80476e4SDavid E. O'Brien #ifdef SDEBUG
1946c80476e4SDavid E. O'Brien 	    xprintf("not found\n");
1947c80476e4SDavid E. O'Brien #endif
1948c80476e4SDavid E. O'Brien 	    return(CC_ERROR);
1949c80476e4SDavid E. O'Brien 	}
1950c80476e4SDavid E. O'Brien     }
1951c80476e4SDavid E. O'Brien 
1952c80476e4SDavid E. O'Brien     Hist_num = found;
1953c80476e4SDavid E. O'Brien 
195445e5710bSMark Peek     return(GetHistLine());
1955c80476e4SDavid E. O'Brien }
1956c80476e4SDavid E. O'Brien 
1957c80476e4SDavid E. O'Brien /*ARGSUSED*/
1958c80476e4SDavid E. O'Brien CCRETVAL
195945e5710bSMark Peek e_helpme(Char c)
1960c80476e4SDavid E. O'Brien {
1961c80476e4SDavid E. O'Brien     USE(c);
1962c80476e4SDavid E. O'Brien     PastBottom();
1963c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1964c80476e4SDavid E. O'Brien     return(CC_HELPME);
1965c80476e4SDavid E. O'Brien }
1966c80476e4SDavid E. O'Brien 
1967c80476e4SDavid E. O'Brien /*ARGSUSED*/
1968c80476e4SDavid E. O'Brien CCRETVAL
196945e5710bSMark Peek e_correct(Char c)
1970c80476e4SDavid E. O'Brien {
1971c80476e4SDavid E. O'Brien     USE(c);
1972c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1973c80476e4SDavid E. O'Brien     return(CC_CORRECT);
1974c80476e4SDavid E. O'Brien }
1975c80476e4SDavid E. O'Brien 
1976c80476e4SDavid E. O'Brien /*ARGSUSED*/
1977c80476e4SDavid E. O'Brien CCRETVAL
197845e5710bSMark Peek e_correctl(Char c)
1979c80476e4SDavid E. O'Brien {
1980c80476e4SDavid E. O'Brien     USE(c);
1981c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1982c80476e4SDavid E. O'Brien     return(CC_CORRECT_L);
1983c80476e4SDavid E. O'Brien }
1984c80476e4SDavid E. O'Brien 
1985c80476e4SDavid E. O'Brien /*ARGSUSED*/
1986c80476e4SDavid E. O'Brien CCRETVAL
198745e5710bSMark Peek e_run_fg_editor(Char c)
1988c80476e4SDavid E. O'Brien {
19896767bd61SMark Peek     struct process *pp;
1990c80476e4SDavid E. O'Brien 
1991c80476e4SDavid E. O'Brien     USE(c);
1992c80476e4SDavid E. O'Brien     if ((pp = find_stop_ed()) != NULL) {
1993c80476e4SDavid E. O'Brien 	/* save our editor state so we can restore it */
199445e5710bSMark Peek 	c_save_inputbuf();
1995c80476e4SDavid E. O'Brien 	Hist_num = 0;		/* for the history commands */
1996c80476e4SDavid E. O'Brien 
1997c80476e4SDavid E. O'Brien 	/* put the tty in a sane mode */
1998c80476e4SDavid E. O'Brien 	PastBottom();
1999c80476e4SDavid E. O'Brien 	(void) Cookedmode();	/* make sure the tty is set up correctly */
2000c80476e4SDavid E. O'Brien 
2001c80476e4SDavid E. O'Brien 	/* do it! */
2002c80476e4SDavid E. O'Brien 	fg_proc_entry(pp);
2003c80476e4SDavid E. O'Brien 
2004c80476e4SDavid E. O'Brien 	(void) Rawmode();	/* go on */
2005c80476e4SDavid E. O'Brien 	Refresh();
200645e5710bSMark Peek 	RestoreSaved = 0;
200745e5710bSMark Peek 	HistSaved = 0;
2008c80476e4SDavid E. O'Brien     }
2009c80476e4SDavid E. O'Brien     return(CC_NORM);
2010c80476e4SDavid E. O'Brien }
2011c80476e4SDavid E. O'Brien 
2012c80476e4SDavid E. O'Brien /*ARGSUSED*/
2013c80476e4SDavid E. O'Brien CCRETVAL
201445e5710bSMark Peek e_list_choices(Char c)
2015c80476e4SDavid E. O'Brien {
2016c80476e4SDavid E. O'Brien     USE(c);
2017c80476e4SDavid E. O'Brien     PastBottom();
2018c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2019c80476e4SDavid E. O'Brien     return(CC_LIST_CHOICES);
2020c80476e4SDavid E. O'Brien }
2021c80476e4SDavid E. O'Brien 
2022c80476e4SDavid E. O'Brien /*ARGSUSED*/
2023c80476e4SDavid E. O'Brien CCRETVAL
202445e5710bSMark Peek e_list_all(Char c)
2025c80476e4SDavid E. O'Brien {
2026c80476e4SDavid E. O'Brien     USE(c);
2027c80476e4SDavid E. O'Brien     PastBottom();
2028c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2029c80476e4SDavid E. O'Brien     return(CC_LIST_ALL);
2030c80476e4SDavid E. O'Brien }
2031c80476e4SDavid E. O'Brien 
2032c80476e4SDavid E. O'Brien /*ARGSUSED*/
2033c80476e4SDavid E. O'Brien CCRETVAL
203445e5710bSMark Peek e_list_glob(Char c)
2035c80476e4SDavid E. O'Brien {
2036c80476e4SDavid E. O'Brien     USE(c);
2037c80476e4SDavid E. O'Brien     PastBottom();
2038c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2039c80476e4SDavid E. O'Brien     return(CC_LIST_GLOB);
2040c80476e4SDavid E. O'Brien }
2041c80476e4SDavid E. O'Brien 
2042c80476e4SDavid E. O'Brien /*ARGSUSED*/
2043c80476e4SDavid E. O'Brien CCRETVAL
204445e5710bSMark Peek e_expand_glob(Char c)
2045c80476e4SDavid E. O'Brien {
2046c80476e4SDavid E. O'Brien     USE(c);
2047c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2048c80476e4SDavid E. O'Brien     return(CC_EXPAND_GLOB);
2049c80476e4SDavid E. O'Brien }
2050c80476e4SDavid E. O'Brien 
2051c80476e4SDavid E. O'Brien /*ARGSUSED*/
2052c80476e4SDavid E. O'Brien CCRETVAL
205345e5710bSMark Peek e_normalize_path(Char c)
2054c80476e4SDavid E. O'Brien {
2055c80476e4SDavid E. O'Brien     USE(c);
2056c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2057c80476e4SDavid E. O'Brien     return(CC_NORMALIZE_PATH);
2058c80476e4SDavid E. O'Brien }
2059c80476e4SDavid E. O'Brien 
2060c80476e4SDavid E. O'Brien /*ARGSUSED*/
2061c80476e4SDavid E. O'Brien CCRETVAL
206245e5710bSMark Peek e_normalize_command(Char c)
2063c80476e4SDavid E. O'Brien {
2064c80476e4SDavid E. O'Brien     USE(c);
2065c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2066c80476e4SDavid E. O'Brien     return(CC_NORMALIZE_COMMAND);
2067c80476e4SDavid E. O'Brien }
2068c80476e4SDavid E. O'Brien 
2069c80476e4SDavid E. O'Brien /*ARGSUSED*/
2070c80476e4SDavid E. O'Brien CCRETVAL
207145e5710bSMark Peek e_expand_vars(Char c)
2072c80476e4SDavid E. O'Brien {
2073c80476e4SDavid E. O'Brien     USE(c);
2074c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2075c80476e4SDavid E. O'Brien     return(CC_EXPAND_VARS);
2076c80476e4SDavid E. O'Brien }
2077c80476e4SDavid E. O'Brien 
2078c80476e4SDavid E. O'Brien /*ARGSUSED*/
2079c80476e4SDavid E. O'Brien CCRETVAL
208045e5710bSMark Peek e_which(Char c)
2081c80476e4SDavid E. O'Brien {				/* do a fast command line which(1) */
2082c80476e4SDavid E. O'Brien     USE(c);
208345e5710bSMark Peek     c_save_inputbuf();
208445e5710bSMark Peek     Hist_num = 0;		/* for the history commands */
2085c80476e4SDavid E. O'Brien     PastBottom();
2086c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2087c80476e4SDavid E. O'Brien     return(CC_WHICH);
2088c80476e4SDavid E. O'Brien }
2089c80476e4SDavid E. O'Brien 
2090c80476e4SDavid E. O'Brien /*ARGSUSED*/
2091c80476e4SDavid E. O'Brien CCRETVAL
209245e5710bSMark Peek e_last_item(Char c)
2093c80476e4SDavid E. O'Brien {				/* insert the last element of the prev. cmd */
20946767bd61SMark Peek     struct Hist *hp;
20956767bd61SMark Peek     struct wordent *wp, *firstp;
20966767bd61SMark Peek     int i;
209745e5710bSMark Peek     Char *expanded;
2098c80476e4SDavid E. O'Brien 
2099c80476e4SDavid E. O'Brien     USE(c);
2100c80476e4SDavid E. O'Brien     if (Argument <= 0)
2101c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2102c80476e4SDavid E. O'Brien 
2103c80476e4SDavid E. O'Brien     hp = Histlist.Hnext;
2104c80476e4SDavid E. O'Brien     if (hp == NULL) {	/* this is only if no history */
2105c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2106c80476e4SDavid E. O'Brien     }
2107c80476e4SDavid E. O'Brien 
2108c80476e4SDavid E. O'Brien     wp = (hp->Hlex).prev;
2109c80476e4SDavid E. O'Brien 
2110c80476e4SDavid E. O'Brien     if (wp->prev == (struct wordent *) NULL)
2111c80476e4SDavid E. O'Brien 	return(CC_ERROR);	/* an empty history entry */
2112c80476e4SDavid E. O'Brien 
2113c80476e4SDavid E. O'Brien     firstp = (hp->Hlex).next;
2114c80476e4SDavid E. O'Brien 
2115c80476e4SDavid E. O'Brien     /* back up arg words in lex */
2116c80476e4SDavid E. O'Brien     for (i = 0; i < Argument && wp != firstp; i++) {
2117c80476e4SDavid E. O'Brien 	wp = wp->prev;
2118c80476e4SDavid E. O'Brien     }
2119c80476e4SDavid E. O'Brien 
212045e5710bSMark Peek     expanded = expand_lex(wp->prev, 0, i - 1);
212145e5710bSMark Peek     if (InsertStr(expanded)) {
212245e5710bSMark Peek 	xfree(expanded);
2123c80476e4SDavid E. O'Brien 	return(CC_ERROR);
212445e5710bSMark Peek     }
2125c80476e4SDavid E. O'Brien 
212645e5710bSMark Peek     xfree(expanded);
2127c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2128c80476e4SDavid E. O'Brien }
2129c80476e4SDavid E. O'Brien 
2130c80476e4SDavid E. O'Brien /*ARGSUSED*/
2131c80476e4SDavid E. O'Brien CCRETVAL
213245e5710bSMark Peek e_dabbrev_expand(Char c)
2133c80476e4SDavid E. O'Brien {				/* expand to preceding word matching prefix */
21346767bd61SMark Peek     Char *cp, *ncp, *bp;
21356767bd61SMark Peek     struct Hist *hp;
213645e5710bSMark Peek     int arg = 0, i;
213745e5710bSMark Peek     size_t len = 0;
213823338178SMark Peek     int found = 0;
213945e5710bSMark Peek     Char *hbuf;
2140c80476e4SDavid E. O'Brien     static int oldevent, hist, word;
2141c80476e4SDavid E. O'Brien     static Char *start, *oldcursor;
2142c80476e4SDavid E. O'Brien 
2143c80476e4SDavid E. O'Brien     USE(c);
2144c80476e4SDavid E. O'Brien     if (Argument <= 0)
2145c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2146c80476e4SDavid E. O'Brien 
21476767bd61SMark Peek     cp = c_preword(Cursor, InputBuf, 1, STRshwordsep);
2148c80476e4SDavid E. O'Brien     if (cp == Cursor || Isspace(*cp))
2149c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2150c80476e4SDavid E. O'Brien 
215145e5710bSMark Peek     hbuf = NULL;
2152c80476e4SDavid E. O'Brien     hp = Histlist.Hnext;
2153c80476e4SDavid E. O'Brien     bp = InputBuf;
2154c80476e4SDavid E. O'Brien     if (Argument == 1 && eventno == oldevent && cp == start &&
215545e5710bSMark Peek 	Cursor == oldcursor && patbuf.len > 0
215645e5710bSMark Peek 	&& Strncmp(patbuf.s, cp, patbuf.len) == 0){
2157c80476e4SDavid E. O'Brien 	/* continue previous search - go to last match (hist/word) */
2158c80476e4SDavid E. O'Brien 	if (hist != 0) {		/* need to move up history */
2159c80476e4SDavid E. O'Brien 	    for (i = 1; i < hist && hp != NULL; i++)
2160c80476e4SDavid E. O'Brien 		hp = hp->Hnext;
2161c80476e4SDavid E. O'Brien 	    if (hp == NULL)	/* "can't happen" */
216245e5710bSMark Peek 		goto err_hbuf;
216345e5710bSMark Peek 	    hbuf = expand_lex(&hp->Hlex, 0, INT_MAX);
216445e5710bSMark Peek 	    cp = Strend(hbuf);
2165c80476e4SDavid E. O'Brien 	    bp = hbuf;
2166c80476e4SDavid E. O'Brien 	    hp = hp->Hnext;
2167c80476e4SDavid E. O'Brien 	}
21686767bd61SMark Peek 	cp = c_preword(cp, bp, word, STRshwordsep);
2169c80476e4SDavid E. O'Brien     } else {			/* starting new search */
2170c80476e4SDavid E. O'Brien 	oldevent = eventno;
2171c80476e4SDavid E. O'Brien 	start = cp;
217245e5710bSMark Peek 	patbuf.len = 0;
217345e5710bSMark Peek 	Strbuf_appendn(&patbuf, cp, Cursor - cp);
2174c80476e4SDavid E. O'Brien 	hist = 0;
2175c80476e4SDavid E. O'Brien 	word = 0;
2176c80476e4SDavid E. O'Brien     }
2177c80476e4SDavid E. O'Brien 
2178c80476e4SDavid E. O'Brien     while (!found) {
21796767bd61SMark Peek 	ncp = c_preword(cp, bp, 1, STRshwordsep);
2180c80476e4SDavid E. O'Brien 	if (ncp == cp || Isspace(*ncp)) { /* beginning of line */
2181c80476e4SDavid E. O'Brien 	    hist++;
2182c80476e4SDavid E. O'Brien 	    word = 0;
2183c80476e4SDavid E. O'Brien 	    if (hp == NULL)
218445e5710bSMark Peek 		goto err_hbuf;
218545e5710bSMark Peek 	    hbuf = expand_lex(&hp->Hlex, 0, INT_MAX);
218645e5710bSMark Peek 	    cp = Strend(hbuf);
2187c80476e4SDavid E. O'Brien 	    bp = hbuf;
2188c80476e4SDavid E. O'Brien 	    hp = hp->Hnext;
2189c80476e4SDavid E. O'Brien 	    continue;
2190c80476e4SDavid E. O'Brien 	} else {
2191c80476e4SDavid E. O'Brien 	    word++;
219245e5710bSMark Peek 	    len = c_endword(ncp-1, cp, 1, STRshwordsep) - ncp + 1;
2193c80476e4SDavid E. O'Brien 	    cp = ncp;
2194c80476e4SDavid E. O'Brien 	}
219545e5710bSMark Peek 	if (len > patbuf.len && Strncmp(cp, patbuf.s, patbuf.len) == 0) {
2196c80476e4SDavid E. O'Brien 	    /* We don't fully check distinct matches as Gnuemacs does: */
2197c80476e4SDavid E. O'Brien 	    if (Argument > 1) {	/* just count matches */
2198c80476e4SDavid E. O'Brien 		if (++arg >= Argument)
2199c80476e4SDavid E. O'Brien 		    found++;
2200c80476e4SDavid E. O'Brien 	    } else {		/* match if distinct from previous */
220145e5710bSMark Peek 		if (len != (size_t)(Cursor - start)
220245e5710bSMark Peek 		    || Strncmp(cp, start, len) != 0)
2203c80476e4SDavid E. O'Brien 		    found++;
2204c80476e4SDavid E. O'Brien 	    }
2205c80476e4SDavid E. O'Brien 	}
2206c80476e4SDavid E. O'Brien     }
2207c80476e4SDavid E. O'Brien 
2208c80476e4SDavid E. O'Brien     if (LastChar + len - (Cursor - start) >= InputLim)
220945e5710bSMark Peek 	goto err_hbuf;	/* no room */
2210c80476e4SDavid E. O'Brien     DeleteBack(Cursor - start);
2211c80476e4SDavid E. O'Brien     c_insert(len);
2212c80476e4SDavid E. O'Brien     while (len--)
2213c80476e4SDavid E. O'Brien 	*Cursor++ = *cp++;
2214c80476e4SDavid E. O'Brien     oldcursor = Cursor;
221545e5710bSMark Peek     xfree(hbuf);
2216c80476e4SDavid E. O'Brien     return(CC_REFRESH);
221745e5710bSMark Peek 
221845e5710bSMark Peek  err_hbuf:
221945e5710bSMark Peek     xfree(hbuf);
222045e5710bSMark Peek     return CC_ERROR;
2221c80476e4SDavid E. O'Brien }
2222c80476e4SDavid E. O'Brien 
2223c80476e4SDavid E. O'Brien /*ARGSUSED*/
2224c80476e4SDavid E. O'Brien CCRETVAL
222545e5710bSMark Peek e_yank_kill(Char c)
2226c80476e4SDavid E. O'Brien {				/* almost like GnuEmacs */
22276767bd61SMark Peek     int len;
22286767bd61SMark Peek     Char *kp, *cp;
2229c80476e4SDavid E. O'Brien 
2230c80476e4SDavid E. O'Brien     USE(c);
22316767bd61SMark Peek     if (KillRingLen == 0)	/* nothing killed */
2232c80476e4SDavid E. O'Brien 	return(CC_ERROR);
22336767bd61SMark Peek     len = Strlen(KillRing[YankPos].buf);
22346767bd61SMark Peek     if (LastChar + len >= InputLim)
2235c80476e4SDavid E. O'Brien 	return(CC_ERROR);	/* end of buffer space */
2236c80476e4SDavid E. O'Brien 
2237c80476e4SDavid E. O'Brien     /* else */
2238c80476e4SDavid E. O'Brien     cp = Cursor;		/* for speed */
2239c80476e4SDavid E. O'Brien 
22406767bd61SMark Peek     c_insert(len);		/* open the space, */
22416767bd61SMark Peek     for (kp = KillRing[YankPos].buf; *kp; kp++)	/* copy the chars */
2242c80476e4SDavid E. O'Brien 	*cp++ = *kp;
2243c80476e4SDavid E. O'Brien 
22446767bd61SMark Peek     if (Argument == 1) {	/* if no arg */
22456767bd61SMark Peek 	Mark = Cursor;		/* mark at beginning, cursor at end */
22466767bd61SMark Peek 	Cursor = cp;
22476767bd61SMark Peek     } else {
22486767bd61SMark Peek 	Mark = cp;		/* else cursor at beginning, mark at end */
22496767bd61SMark Peek     }
22506767bd61SMark Peek 
225145e5710bSMark Peek     if (adrof(STRhighlight) && MarkIsSet) {
225245e5710bSMark Peek 	ClearLines();
225345e5710bSMark Peek 	ClearDisp();
225445e5710bSMark Peek     }
225545e5710bSMark Peek     MarkIsSet = 0;
22566767bd61SMark Peek     return(CC_REFRESH);
22576767bd61SMark Peek }
22586767bd61SMark Peek 
22596767bd61SMark Peek /*ARGSUSED*/
22606767bd61SMark Peek CCRETVAL
226145e5710bSMark Peek e_yank_pop(Char c)
22626767bd61SMark Peek {				/* almost like GnuEmacs */
22636767bd61SMark Peek     int m_bef_c, del_len, ins_len;
22646767bd61SMark Peek     Char *kp, *cp;
22656767bd61SMark Peek 
22666767bd61SMark Peek     USE(c);
22676767bd61SMark Peek 
22686767bd61SMark Peek #if 0
22696767bd61SMark Peek     /* XXX This "should" be here, but doesn't work, since LastCmd
22706767bd61SMark Peek        gets set on CC_ERROR and CC_ARGHACK, which it shouldn't(?).
22716767bd61SMark Peek        (But what about F_ARGFOUR?) I.e. if you hit M-y twice the
22726767bd61SMark Peek        second one will "succeed" even if the first one wasn't preceded
22736767bd61SMark Peek        by a yank, and giving an argument is impossible. Now we "succeed"
22746767bd61SMark Peek        regardless of previous command, which is wrong too of course. */
22756767bd61SMark Peek     if (LastCmd != F_YANK_KILL && LastCmd != F_YANK_POP)
22766767bd61SMark Peek 	return(CC_ERROR);
22776767bd61SMark Peek #endif
22786767bd61SMark Peek 
22796767bd61SMark Peek     if (KillRingLen == 0)	/* nothing killed */
22806767bd61SMark Peek 	return(CC_ERROR);
22816767bd61SMark Peek     YankPos -= Argument;
22826767bd61SMark Peek     while (YankPos < 0)
22836767bd61SMark Peek 	YankPos += KillRingLen;
22846767bd61SMark Peek     YankPos %= KillRingLen;
22856767bd61SMark Peek 
22866767bd61SMark Peek     if (Cursor > Mark) {
22876767bd61SMark Peek 	del_len = Cursor - Mark;
22886767bd61SMark Peek 	m_bef_c = 1;
22896767bd61SMark Peek     } else {
22906767bd61SMark Peek 	del_len = Mark - Cursor;
22916767bd61SMark Peek 	m_bef_c = 0;
22926767bd61SMark Peek     }
22936767bd61SMark Peek     ins_len = Strlen(KillRing[YankPos].buf);
22946767bd61SMark Peek     if (LastChar + ins_len - del_len >= InputLim)
22956767bd61SMark Peek 	return(CC_ERROR);	/* end of buffer space */
22966767bd61SMark Peek 
22976767bd61SMark Peek     if (m_bef_c) {
22986767bd61SMark Peek 	c_delbefore(del_len);
22996767bd61SMark Peek     } else {
23006767bd61SMark Peek 	c_delafter(del_len);
23016767bd61SMark Peek     }
23026767bd61SMark Peek     cp = Cursor;		/* for speed */
23036767bd61SMark Peek 
23046767bd61SMark Peek     c_insert(ins_len);		/* open the space, */
23056767bd61SMark Peek     for (kp = KillRing[YankPos].buf; *kp; kp++)	/* copy the chars */
23066767bd61SMark Peek 	*cp++ = *kp;
23076767bd61SMark Peek 
23086767bd61SMark Peek     if (m_bef_c) {
23096767bd61SMark Peek 	Mark = Cursor;		/* mark at beginning, cursor at end */
23106767bd61SMark Peek 	Cursor = cp;
23116767bd61SMark Peek     } else {
23126767bd61SMark Peek 	Mark = cp;		/* else cursor at beginning, mark at end */
23136767bd61SMark Peek     }
2314c80476e4SDavid E. O'Brien 
231545e5710bSMark Peek     if (adrof(STRhighlight) && MarkIsSet) {
231645e5710bSMark Peek 	ClearLines();
231745e5710bSMark Peek 	ClearDisp();
231845e5710bSMark Peek     }
231945e5710bSMark Peek     MarkIsSet = 0;
2320c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2321c80476e4SDavid E. O'Brien }
2322c80476e4SDavid E. O'Brien 
2323c80476e4SDavid E. O'Brien /*ARGSUSED*/
2324c80476e4SDavid E. O'Brien CCRETVAL
232545e5710bSMark Peek v_delprev(Char c) 		/* Backspace key in insert mode */
2326c80476e4SDavid E. O'Brien {
2327c80476e4SDavid E. O'Brien     int rc;
2328c80476e4SDavid E. O'Brien 
2329c80476e4SDavid E. O'Brien     USE(c);
2330c80476e4SDavid E. O'Brien     rc = CC_ERROR;
2331c80476e4SDavid E. O'Brien 
2332c80476e4SDavid E. O'Brien     if (InsertPos != 0) {
2333c80476e4SDavid E. O'Brien 	if (Argument <= Cursor - InsertPos) {
2334c80476e4SDavid E. O'Brien 	    c_delbefore(Argument);	/* delete before */
2335c80476e4SDavid E. O'Brien 	    rc = CC_REFRESH;
2336c80476e4SDavid E. O'Brien 	}
2337c80476e4SDavid E. O'Brien     }
2338c80476e4SDavid E. O'Brien     return(rc);
2339c80476e4SDavid E. O'Brien }   /* v_delprev  */
2340c80476e4SDavid E. O'Brien 
2341c80476e4SDavid E. O'Brien /*ARGSUSED*/
2342c80476e4SDavid E. O'Brien CCRETVAL
234345e5710bSMark Peek e_delprev(Char c)
2344c80476e4SDavid E. O'Brien {
2345c80476e4SDavid E. O'Brien     USE(c);
2346c80476e4SDavid E. O'Brien     if (Cursor > InputBuf) {
2347c80476e4SDavid E. O'Brien 	c_delbefore(Argument);	/* delete before dot */
2348c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
2349c80476e4SDavid E. O'Brien     }
2350c80476e4SDavid E. O'Brien     else {
2351c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2352c80476e4SDavid E. O'Brien     }
2353c80476e4SDavid E. O'Brien }
2354c80476e4SDavid E. O'Brien 
2355c80476e4SDavid E. O'Brien /*ARGSUSED*/
2356c80476e4SDavid E. O'Brien CCRETVAL
235745e5710bSMark Peek e_delwordprev(Char c)
2358c80476e4SDavid E. O'Brien {
23596767bd61SMark Peek     Char *cp;
2360c80476e4SDavid E. O'Brien 
2361c80476e4SDavid E. O'Brien     USE(c);
2362c80476e4SDavid E. O'Brien     if (Cursor == InputBuf)
2363c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2364c80476e4SDavid E. O'Brien     /* else */
2365c80476e4SDavid E. O'Brien 
2366c80476e4SDavid E. O'Brien     cp = c_prev_word(Cursor, InputBuf, Argument);
2367c80476e4SDavid E. O'Brien 
23686767bd61SMark Peek     c_push_kill(cp, Cursor);	/* save the text */
2369c80476e4SDavid E. O'Brien 
2370c80476e4SDavid E. O'Brien     c_delbefore((int)(Cursor - cp));	/* delete before dot */
2371c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2372c80476e4SDavid E. O'Brien }
2373c80476e4SDavid E. O'Brien 
2374c80476e4SDavid E. O'Brien /* DCS <dcs@neutron.chem.yale.edu>, 9 Oct 93
2375c80476e4SDavid E. O'Brien  *
2376c80476e4SDavid E. O'Brien  * Changed the names of some of the ^D family of editor functions to
2377c80476e4SDavid E. O'Brien  * correspond to what they actually do and created new e_delnext_list
2378c80476e4SDavid E. O'Brien  * for completeness.
2379c80476e4SDavid E. O'Brien  *
2380c80476e4SDavid E. O'Brien  *   Old names:			New names:
2381c80476e4SDavid E. O'Brien  *
2382c80476e4SDavid E. O'Brien  *   delete-char		delete-char-or-eof
2383c80476e4SDavid E. O'Brien  *     F_DELNEXT		  F_DELNEXT_EOF
2384c80476e4SDavid E. O'Brien  *     e_delnext		  e_delnext_eof
2385c80476e4SDavid E. O'Brien  *     edelnxt			  edelnxteof
2386c80476e4SDavid E. O'Brien  *   delete-char-or-eof		delete-char
2387c80476e4SDavid E. O'Brien  *     F_DELNEXT_EOF		  F_DELNEXT
2388c80476e4SDavid E. O'Brien  *     e_delnext_eof		  e_delnext
2389c80476e4SDavid E. O'Brien  *     edelnxteof		  edelnxt
2390c80476e4SDavid E. O'Brien  *   delete-char-or-list	delete-char-or-list-or-eof
2391c80476e4SDavid E. O'Brien  *     F_LIST_DELNEXT		  F_DELNEXT_LIST_EOF
2392c80476e4SDavid E. O'Brien  *     e_list_delnext		  e_delnext_list_eof
2393c80476e4SDavid E. O'Brien  *   				  edellsteof
2394c80476e4SDavid E. O'Brien  *   (no old equivalent)	delete-char-or-list
2395c80476e4SDavid E. O'Brien  *   				  F_DELNEXT_LIST
2396c80476e4SDavid E. O'Brien  *   				  e_delnext_list
2397c80476e4SDavid E. O'Brien  *   				  e_delnxtlst
2398c80476e4SDavid E. O'Brien  */
2399c80476e4SDavid E. O'Brien 
2400c80476e4SDavid E. O'Brien /* added by mtk@ari.ncl.omron.co.jp (920818) */
2401c80476e4SDavid E. O'Brien /* rename e_delnext() -> e_delnext_eof() */
2402c80476e4SDavid E. O'Brien /*ARGSUSED*/
2403c80476e4SDavid E. O'Brien CCRETVAL
240445e5710bSMark Peek e_delnext(Char c)
2405c80476e4SDavid E. O'Brien {
2406c80476e4SDavid E. O'Brien     USE(c);
2407c80476e4SDavid E. O'Brien     if (Cursor == LastChar) {/* if I'm at the end */
2408c80476e4SDavid E. O'Brien 	if (!VImode) {
2409c80476e4SDavid E. O'Brien 		return(CC_ERROR);
2410c80476e4SDavid E. O'Brien 	}
2411c80476e4SDavid E. O'Brien 	else {
2412c80476e4SDavid E. O'Brien 	    if (Cursor != InputBuf)
2413c80476e4SDavid E. O'Brien 		Cursor--;
2414c80476e4SDavid E. O'Brien 	    else
2415c80476e4SDavid E. O'Brien 		return(CC_ERROR);
2416c80476e4SDavid E. O'Brien 	}
2417c80476e4SDavid E. O'Brien     }
2418c80476e4SDavid E. O'Brien     c_delafter(Argument);	/* delete after dot */
2419c80476e4SDavid E. O'Brien     if (Cursor > LastChar)
2420c80476e4SDavid E. O'Brien 	Cursor = LastChar;	/* bounds check */
2421c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2422c80476e4SDavid E. O'Brien }
2423c80476e4SDavid E. O'Brien 
2424c80476e4SDavid E. O'Brien 
2425c80476e4SDavid E. O'Brien /*ARGSUSED*/
2426c80476e4SDavid E. O'Brien CCRETVAL
242745e5710bSMark Peek e_delnext_eof(Char c)
2428c80476e4SDavid E. O'Brien {
2429c80476e4SDavid E. O'Brien     USE(c);
2430c80476e4SDavid E. O'Brien     if (Cursor == LastChar) {/* if I'm at the end */
2431c80476e4SDavid E. O'Brien 	if (!VImode) {
2432c80476e4SDavid E. O'Brien 	    if (Cursor == InputBuf) {
2433c80476e4SDavid E. O'Brien 		/* if I'm also at the beginning */
2434c80476e4SDavid E. O'Brien 		so_write(STReof, 4);/* then do a EOF */
2435c80476e4SDavid E. O'Brien 		flush();
2436c80476e4SDavid E. O'Brien 		return(CC_EOF);
2437c80476e4SDavid E. O'Brien 	    }
2438c80476e4SDavid E. O'Brien 	    else
2439c80476e4SDavid E. O'Brien 		return(CC_ERROR);
2440c80476e4SDavid E. O'Brien 	}
2441c80476e4SDavid E. O'Brien 	else {
2442c80476e4SDavid E. O'Brien 	    if (Cursor != InputBuf)
2443c80476e4SDavid E. O'Brien 		Cursor--;
2444c80476e4SDavid E. O'Brien 	    else
2445c80476e4SDavid E. O'Brien 		return(CC_ERROR);
2446c80476e4SDavid E. O'Brien 	}
2447c80476e4SDavid E. O'Brien     }
2448c80476e4SDavid E. O'Brien     c_delafter(Argument);	/* delete after dot */
2449c80476e4SDavid E. O'Brien     if (Cursor > LastChar)
2450c80476e4SDavid E. O'Brien 	Cursor = LastChar;	/* bounds check */
2451c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2452c80476e4SDavid E. O'Brien }
2453c80476e4SDavid E. O'Brien 
2454c80476e4SDavid E. O'Brien /*ARGSUSED*/
2455c80476e4SDavid E. O'Brien CCRETVAL
245645e5710bSMark Peek e_delnext_list(Char c)
2457c80476e4SDavid E. O'Brien {
2458c80476e4SDavid E. O'Brien     USE(c);
2459c80476e4SDavid E. O'Brien     if (Cursor == LastChar) {	/* if I'm at the end */
2460c80476e4SDavid E. O'Brien 	PastBottom();
2461c80476e4SDavid E. O'Brien 	*LastChar = '\0';	/* just in case */
2462c80476e4SDavid E. O'Brien 	return(CC_LIST_CHOICES);
2463c80476e4SDavid E. O'Brien     }
2464c80476e4SDavid E. O'Brien     else {
2465c80476e4SDavid E. O'Brien 	c_delafter(Argument);	/* delete after dot */
2466c80476e4SDavid E. O'Brien 	if (Cursor > LastChar)
2467c80476e4SDavid E. O'Brien 	    Cursor = LastChar;	/* bounds check */
2468c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
2469c80476e4SDavid E. O'Brien     }
2470c80476e4SDavid E. O'Brien }
2471c80476e4SDavid E. O'Brien 
2472c80476e4SDavid E. O'Brien /*ARGSUSED*/
2473c80476e4SDavid E. O'Brien CCRETVAL
247445e5710bSMark Peek e_delnext_list_eof(Char c)
2475c80476e4SDavid E. O'Brien {
2476c80476e4SDavid E. O'Brien     USE(c);
2477c80476e4SDavid E. O'Brien     if (Cursor == LastChar) {	/* if I'm at the end */
2478c80476e4SDavid E. O'Brien 	if (Cursor == InputBuf) {	/* if I'm also at the beginning */
2479c80476e4SDavid E. O'Brien 	    so_write(STReof, 4);/* then do a EOF */
2480c80476e4SDavid E. O'Brien 	    flush();
2481c80476e4SDavid E. O'Brien 	    return(CC_EOF);
2482c80476e4SDavid E. O'Brien 	}
2483c80476e4SDavid E. O'Brien 	else {
2484c80476e4SDavid E. O'Brien 	    PastBottom();
2485c80476e4SDavid E. O'Brien 	    *LastChar = '\0';	/* just in case */
2486c80476e4SDavid E. O'Brien 	    return(CC_LIST_CHOICES);
2487c80476e4SDavid E. O'Brien 	}
2488c80476e4SDavid E. O'Brien     }
2489c80476e4SDavid E. O'Brien     else {
2490c80476e4SDavid E. O'Brien 	c_delafter(Argument);	/* delete after dot */
2491c80476e4SDavid E. O'Brien 	if (Cursor > LastChar)
2492c80476e4SDavid E. O'Brien 	    Cursor = LastChar;	/* bounds check */
2493c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
2494c80476e4SDavid E. O'Brien     }
2495c80476e4SDavid E. O'Brien }
2496c80476e4SDavid E. O'Brien 
2497c80476e4SDavid E. O'Brien /*ARGSUSED*/
2498c80476e4SDavid E. O'Brien CCRETVAL
249945e5710bSMark Peek e_list_eof(Char c)
2500c80476e4SDavid E. O'Brien {
2501c80476e4SDavid E. O'Brien     CCRETVAL rv;
2502c80476e4SDavid E. O'Brien 
2503c80476e4SDavid E. O'Brien     USE(c);
2504c80476e4SDavid E. O'Brien     if (Cursor == LastChar && Cursor == InputBuf) {
2505c80476e4SDavid E. O'Brien 	so_write(STReof, 4);	/* then do a EOF */
2506c80476e4SDavid E. O'Brien 	flush();
2507c80476e4SDavid E. O'Brien 	rv = CC_EOF;
2508c80476e4SDavid E. O'Brien     }
2509c80476e4SDavid E. O'Brien     else {
2510c80476e4SDavid E. O'Brien 	PastBottom();
2511c80476e4SDavid E. O'Brien 	*LastChar = '\0';	/* just in case */
2512c80476e4SDavid E. O'Brien 	rv = CC_LIST_CHOICES;
2513c80476e4SDavid E. O'Brien     }
2514c80476e4SDavid E. O'Brien     return rv;
2515c80476e4SDavid E. O'Brien }
2516c80476e4SDavid E. O'Brien 
2517c80476e4SDavid E. O'Brien /*ARGSUSED*/
2518c80476e4SDavid E. O'Brien CCRETVAL
251945e5710bSMark Peek e_delwordnext(Char c)
2520c80476e4SDavid E. O'Brien {
25216767bd61SMark Peek     Char *cp;
2522c80476e4SDavid E. O'Brien 
2523c80476e4SDavid E. O'Brien     USE(c);
2524c80476e4SDavid E. O'Brien     if (Cursor == LastChar)
2525c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2526c80476e4SDavid E. O'Brien     /* else */
2527c80476e4SDavid E. O'Brien 
2528c80476e4SDavid E. O'Brien     cp = c_next_word(Cursor, LastChar, Argument);
2529c80476e4SDavid E. O'Brien 
25306767bd61SMark Peek     c_push_kill(Cursor, cp);	/* save the text */
2531c80476e4SDavid E. O'Brien 
2532c80476e4SDavid E. O'Brien     c_delafter((int)(cp - Cursor));	/* delete after dot */
2533c80476e4SDavid E. O'Brien     if (Cursor > LastChar)
2534c80476e4SDavid E. O'Brien 	Cursor = LastChar;	/* bounds check */
2535c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2536c80476e4SDavid E. O'Brien }
2537c80476e4SDavid E. O'Brien 
2538c80476e4SDavid E. O'Brien /*ARGSUSED*/
2539c80476e4SDavid E. O'Brien CCRETVAL
254045e5710bSMark Peek e_toend(Char c)
2541c80476e4SDavid E. O'Brien {
2542c80476e4SDavid E. O'Brien     USE(c);
2543c80476e4SDavid E. O'Brien     Cursor = LastChar;
2544c80476e4SDavid E. O'Brien     if (VImode)
2545c80476e4SDavid E. O'Brien 	if (ActionFlag & TCSHOP_DELETE) {
2546c80476e4SDavid E. O'Brien 	    c_delfini();
2547c80476e4SDavid E. O'Brien 	    return(CC_REFRESH);
2548c80476e4SDavid E. O'Brien 	}
2549c80476e4SDavid E. O'Brien     RefCursor();		/* move the cursor */
2550c80476e4SDavid E. O'Brien     return(CC_NORM);
2551c80476e4SDavid E. O'Brien }
2552c80476e4SDavid E. O'Brien 
2553c80476e4SDavid E. O'Brien /*ARGSUSED*/
2554c80476e4SDavid E. O'Brien CCRETVAL
255545e5710bSMark Peek e_tobeg(Char c)
2556c80476e4SDavid E. O'Brien {
2557c80476e4SDavid E. O'Brien     USE(c);
2558c80476e4SDavid E. O'Brien     Cursor = InputBuf;
2559c80476e4SDavid E. O'Brien 
2560c80476e4SDavid E. O'Brien     if (VImode) {
2561c80476e4SDavid E. O'Brien        while (Isspace(*Cursor)) /* We want FIRST non space character */
2562c80476e4SDavid E. O'Brien 	Cursor++;
2563c80476e4SDavid E. O'Brien 	if (ActionFlag & TCSHOP_DELETE) {
2564c80476e4SDavid E. O'Brien 	    c_delfini();
2565c80476e4SDavid E. O'Brien 	    return(CC_REFRESH);
2566c80476e4SDavid E. O'Brien 	}
2567c80476e4SDavid E. O'Brien     }
2568c80476e4SDavid E. O'Brien 
2569c80476e4SDavid E. O'Brien     RefCursor();		/* move the cursor */
2570c80476e4SDavid E. O'Brien     return(CC_NORM);
2571c80476e4SDavid E. O'Brien }
2572c80476e4SDavid E. O'Brien 
2573c80476e4SDavid E. O'Brien /*ARGSUSED*/
2574c80476e4SDavid E. O'Brien CCRETVAL
257545e5710bSMark Peek e_killend(Char c)
2576c80476e4SDavid E. O'Brien {
2577c80476e4SDavid E. O'Brien     USE(c);
25786767bd61SMark Peek     c_push_kill(Cursor, LastChar); /* copy it */
257945e5710bSMark Peek     LastChar = Cursor;		/* zap! -- delete to end */
258045e5710bSMark Peek     if (Mark > Cursor)
258145e5710bSMark Peek         Mark = Cursor;
258245e5710bSMark Peek     MarkIsSet = 0;
2583c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2584c80476e4SDavid E. O'Brien }
2585c80476e4SDavid E. O'Brien 
2586c80476e4SDavid E. O'Brien 
2587c80476e4SDavid E. O'Brien /*ARGSUSED*/
2588c80476e4SDavid E. O'Brien CCRETVAL
258945e5710bSMark Peek e_killbeg(Char c)
2590c80476e4SDavid E. O'Brien {
2591c80476e4SDavid E. O'Brien     USE(c);
25926767bd61SMark Peek     c_push_kill(InputBuf, Cursor); /* copy it */
2593c80476e4SDavid E. O'Brien     c_delbefore((int)(Cursor - InputBuf));
259423338178SMark Peek     if (Mark && Mark > Cursor)
259523338178SMark Peek         Mark -= Cursor-InputBuf;
2596c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2597c80476e4SDavid E. O'Brien }
2598c80476e4SDavid E. O'Brien 
2599c80476e4SDavid E. O'Brien /*ARGSUSED*/
2600c80476e4SDavid E. O'Brien CCRETVAL
260145e5710bSMark Peek e_killall(Char c)
2602c80476e4SDavid E. O'Brien {
2603c80476e4SDavid E. O'Brien     USE(c);
26046767bd61SMark Peek     c_push_kill(InputBuf, LastChar); /* copy it */
260523338178SMark Peek     Cursor = Mark = LastChar = InputBuf;	/* zap! -- delete all of it */
260645e5710bSMark Peek     MarkIsSet = 0;
2607c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2608c80476e4SDavid E. O'Brien }
2609c80476e4SDavid E. O'Brien 
2610c80476e4SDavid E. O'Brien /*ARGSUSED*/
2611c80476e4SDavid E. O'Brien CCRETVAL
261245e5710bSMark Peek e_killregion(Char c)
2613c80476e4SDavid E. O'Brien {
2614c80476e4SDavid E. O'Brien     USE(c);
2615c80476e4SDavid E. O'Brien     if (!Mark)
2616c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2617c80476e4SDavid E. O'Brien 
2618c80476e4SDavid E. O'Brien     if (Mark > Cursor) {
26196767bd61SMark Peek 	c_push_kill(Cursor, Mark); /* copy it */
26206767bd61SMark Peek 	c_delafter((int)(Mark - Cursor)); /* delete it - UNUSED BY VI mode */
26216767bd61SMark Peek 	Mark = Cursor;
2622c80476e4SDavid E. O'Brien     }
2623c80476e4SDavid E. O'Brien     else {			/* mark is before cursor */
26246767bd61SMark Peek 	c_push_kill(Mark, Cursor); /* copy it */
26256767bd61SMark Peek 	c_delbefore((int)(Cursor - Mark));
2626c80476e4SDavid E. O'Brien     }
262745e5710bSMark Peek     if (adrof(STRhighlight) && MarkIsSet) {
262845e5710bSMark Peek 	ClearLines();
262945e5710bSMark Peek 	ClearDisp();
263045e5710bSMark Peek     }
263145e5710bSMark Peek     MarkIsSet = 0;
2632c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2633c80476e4SDavid E. O'Brien }
2634c80476e4SDavid E. O'Brien 
2635c80476e4SDavid E. O'Brien /*ARGSUSED*/
2636c80476e4SDavid E. O'Brien CCRETVAL
263745e5710bSMark Peek e_copyregion(Char c)
2638c80476e4SDavid E. O'Brien {
2639c80476e4SDavid E. O'Brien     USE(c);
2640c80476e4SDavid E. O'Brien     if (!Mark)
2641c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2642c80476e4SDavid E. O'Brien 
2643c80476e4SDavid E. O'Brien     if (Mark > Cursor) {
26446767bd61SMark Peek 	c_push_kill(Cursor, Mark); /* copy it */
2645c80476e4SDavid E. O'Brien     }
2646c80476e4SDavid E. O'Brien     else {			/* mark is before cursor */
26476767bd61SMark Peek 	c_push_kill(Mark, Cursor); /* copy it */
2648c80476e4SDavid E. O'Brien     }
2649c80476e4SDavid E. O'Brien     return(CC_NORM);		/* don't even need to Refresh() */
2650c80476e4SDavid E. O'Brien }
2651c80476e4SDavid E. O'Brien 
2652c80476e4SDavid E. O'Brien /*ARGSUSED*/
2653c80476e4SDavid E. O'Brien CCRETVAL
265445e5710bSMark Peek e_charswitch(Char cc)
2655c80476e4SDavid E. O'Brien {
26566767bd61SMark Peek     Char c;
2657c80476e4SDavid E. O'Brien 
2658c80476e4SDavid E. O'Brien     USE(cc);
2659c80476e4SDavid E. O'Brien 
2660c80476e4SDavid E. O'Brien     /* do nothing if we are at beginning of line or have only one char */
2661c80476e4SDavid E. O'Brien     if (Cursor == &InputBuf[0] || LastChar == &InputBuf[1]) {
2662c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2663c80476e4SDavid E. O'Brien     }
2664c80476e4SDavid E. O'Brien 
2665c80476e4SDavid E. O'Brien     if (Cursor < LastChar) {
2666c80476e4SDavid E. O'Brien 	Cursor++;
2667c80476e4SDavid E. O'Brien     }
2668c80476e4SDavid E. O'Brien     c = Cursor[-2];
2669c80476e4SDavid E. O'Brien     Cursor[-2] = Cursor[-1];
2670c80476e4SDavid E. O'Brien     Cursor[-1] = c;
2671c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2672c80476e4SDavid E. O'Brien }
2673c80476e4SDavid E. O'Brien 
2674c80476e4SDavid E. O'Brien /*ARGSUSED*/
2675c80476e4SDavid E. O'Brien CCRETVAL
267645e5710bSMark Peek e_gcharswitch(Char cc)
2677c80476e4SDavid E. O'Brien {				/* gosmacs style ^T */
26786767bd61SMark Peek     Char c;
2679c80476e4SDavid E. O'Brien 
2680c80476e4SDavid E. O'Brien     USE(cc);
2681c80476e4SDavid E. O'Brien     if (Cursor > &InputBuf[1]) {/* must have at least two chars entered */
2682c80476e4SDavid E. O'Brien 	c = Cursor[-2];
2683c80476e4SDavid E. O'Brien 	Cursor[-2] = Cursor[-1];
2684c80476e4SDavid E. O'Brien 	Cursor[-1] = c;
2685c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
2686c80476e4SDavid E. O'Brien     }
2687c80476e4SDavid E. O'Brien     else {
2688c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2689c80476e4SDavid E. O'Brien     }
2690c80476e4SDavid E. O'Brien }
2691c80476e4SDavid E. O'Brien 
2692c80476e4SDavid E. O'Brien /*ARGSUSED*/
2693c80476e4SDavid E. O'Brien CCRETVAL
269445e5710bSMark Peek e_charback(Char c)
2695c80476e4SDavid E. O'Brien {
2696c80476e4SDavid E. O'Brien     USE(c);
2697c80476e4SDavid E. O'Brien     if (Cursor > InputBuf) {
269845e5710bSMark Peek 	if (Argument > Cursor - InputBuf)
2699c80476e4SDavid E. O'Brien 	    Cursor = InputBuf;
2700c80476e4SDavid E. O'Brien 	else
270145e5710bSMark Peek 	    Cursor -= Argument;
2702c80476e4SDavid E. O'Brien 
2703c80476e4SDavid E. O'Brien 	if (VImode)
2704c80476e4SDavid E. O'Brien 	    if (ActionFlag & TCSHOP_DELETE) {
2705c80476e4SDavid E. O'Brien 		c_delfini();
2706c80476e4SDavid E. O'Brien 		return(CC_REFRESH);
2707c80476e4SDavid E. O'Brien 	    }
2708c80476e4SDavid E. O'Brien 
2709c80476e4SDavid E. O'Brien 	RefCursor();
2710c80476e4SDavid E. O'Brien 	return(CC_NORM);
2711c80476e4SDavid E. O'Brien     }
2712c80476e4SDavid E. O'Brien     else {
2713c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2714c80476e4SDavid E. O'Brien     }
2715c80476e4SDavid E. O'Brien }
2716c80476e4SDavid E. O'Brien 
2717c80476e4SDavid E. O'Brien /*ARGSUSED*/
2718c80476e4SDavid E. O'Brien CCRETVAL
271945e5710bSMark Peek v_wordback(Char c)
2720c80476e4SDavid E. O'Brien {
2721c80476e4SDavid E. O'Brien     USE(c);
2722c80476e4SDavid E. O'Brien     if (Cursor == InputBuf)
2723c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2724c80476e4SDavid E. O'Brien     /* else */
2725c80476e4SDavid E. O'Brien 
27266767bd61SMark Peek     Cursor = c_preword(Cursor, InputBuf, Argument, STRshwspace); /* bounds check */
2727c80476e4SDavid E. O'Brien 
2728c80476e4SDavid E. O'Brien     if (ActionFlag & TCSHOP_DELETE) {
2729c80476e4SDavid E. O'Brien 	c_delfini();
2730c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
2731c80476e4SDavid E. O'Brien     }
2732c80476e4SDavid E. O'Brien 
2733c80476e4SDavid E. O'Brien     RefCursor();
2734c80476e4SDavid E. O'Brien     return(CC_NORM);
2735c80476e4SDavid E. O'Brien }
2736c80476e4SDavid E. O'Brien 
2737c80476e4SDavid E. O'Brien /*ARGSUSED*/
2738c80476e4SDavid E. O'Brien CCRETVAL
273945e5710bSMark Peek e_wordback(Char c)
2740c80476e4SDavid E. O'Brien {
2741c80476e4SDavid E. O'Brien     USE(c);
2742c80476e4SDavid E. O'Brien     if (Cursor == InputBuf)
2743c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2744c80476e4SDavid E. O'Brien     /* else */
2745c80476e4SDavid E. O'Brien 
2746c80476e4SDavid E. O'Brien     Cursor = c_prev_word(Cursor, InputBuf, Argument); /* bounds check */
2747c80476e4SDavid E. O'Brien 
2748c80476e4SDavid E. O'Brien     if (VImode)
2749c80476e4SDavid E. O'Brien 	if (ActionFlag & TCSHOP_DELETE) {
2750c80476e4SDavid E. O'Brien 	    c_delfini();
2751c80476e4SDavid E. O'Brien 	    return(CC_REFRESH);
2752c80476e4SDavid E. O'Brien 	}
2753c80476e4SDavid E. O'Brien 
2754c80476e4SDavid E. O'Brien     RefCursor();
2755c80476e4SDavid E. O'Brien     return(CC_NORM);
2756c80476e4SDavid E. O'Brien }
2757c80476e4SDavid E. O'Brien 
2758c80476e4SDavid E. O'Brien /*ARGSUSED*/
2759c80476e4SDavid E. O'Brien CCRETVAL
276045e5710bSMark Peek e_charfwd(Char c)
2761c80476e4SDavid E. O'Brien {
2762c80476e4SDavid E. O'Brien     USE(c);
2763c80476e4SDavid E. O'Brien     if (Cursor < LastChar) {
276445e5710bSMark Peek 	Cursor += Argument;
2765c80476e4SDavid E. O'Brien 	if (Cursor > LastChar)
2766c80476e4SDavid E. O'Brien 	    Cursor = LastChar;
2767c80476e4SDavid E. O'Brien 
2768c80476e4SDavid E. O'Brien 	if (VImode)
2769c80476e4SDavid E. O'Brien 	    if (ActionFlag & TCSHOP_DELETE) {
2770c80476e4SDavid E. O'Brien 		c_delfini();
2771c80476e4SDavid E. O'Brien 		return(CC_REFRESH);
2772c80476e4SDavid E. O'Brien 	    }
2773c80476e4SDavid E. O'Brien 
2774c80476e4SDavid E. O'Brien 	RefCursor();
2775c80476e4SDavid E. O'Brien 	return(CC_NORM);
2776c80476e4SDavid E. O'Brien     }
2777c80476e4SDavid E. O'Brien     else {
2778c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2779c80476e4SDavid E. O'Brien     }
2780c80476e4SDavid E. O'Brien }
2781c80476e4SDavid E. O'Brien 
2782c80476e4SDavid E. O'Brien /*ARGSUSED*/
2783c80476e4SDavid E. O'Brien CCRETVAL
278445e5710bSMark Peek e_wordfwd(Char c)
2785c80476e4SDavid E. O'Brien {
2786c80476e4SDavid E. O'Brien     USE(c);
2787c80476e4SDavid E. O'Brien     if (Cursor == LastChar)
2788c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2789c80476e4SDavid E. O'Brien     /* else */
2790c80476e4SDavid E. O'Brien 
2791c80476e4SDavid E. O'Brien     Cursor = c_next_word(Cursor, LastChar, Argument);
2792c80476e4SDavid E. O'Brien 
2793c80476e4SDavid E. O'Brien     if (VImode)
2794c80476e4SDavid E. O'Brien 	if (ActionFlag & TCSHOP_DELETE) {
2795c80476e4SDavid E. O'Brien 	    c_delfini();
2796c80476e4SDavid E. O'Brien 	    return(CC_REFRESH);
2797c80476e4SDavid E. O'Brien 	}
2798c80476e4SDavid E. O'Brien 
2799c80476e4SDavid E. O'Brien     RefCursor();
2800c80476e4SDavid E. O'Brien     return(CC_NORM);
2801c80476e4SDavid E. O'Brien }
2802c80476e4SDavid E. O'Brien 
2803c80476e4SDavid E. O'Brien /*ARGSUSED*/
2804c80476e4SDavid E. O'Brien CCRETVAL
280545e5710bSMark Peek v_wordfwd(Char c)
2806c80476e4SDavid E. O'Brien {
2807c80476e4SDavid E. O'Brien     USE(c);
2808c80476e4SDavid E. O'Brien     if (Cursor == LastChar)
2809c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2810c80476e4SDavid E. O'Brien     /* else */
2811c80476e4SDavid E. O'Brien 
2812c80476e4SDavid E. O'Brien     Cursor = c_nexword(Cursor, LastChar, Argument);
2813c80476e4SDavid E. O'Brien 
2814c80476e4SDavid E. O'Brien     if (VImode)
2815c80476e4SDavid E. O'Brien 	if (ActionFlag & TCSHOP_DELETE) {
2816c80476e4SDavid E. O'Brien 	    c_delfini();
2817c80476e4SDavid E. O'Brien 	    return(CC_REFRESH);
2818c80476e4SDavid E. O'Brien 	}
2819c80476e4SDavid E. O'Brien 
2820c80476e4SDavid E. O'Brien     RefCursor();
2821c80476e4SDavid E. O'Brien     return(CC_NORM);
2822c80476e4SDavid E. O'Brien }
2823c80476e4SDavid E. O'Brien 
2824c80476e4SDavid E. O'Brien /*ARGSUSED*/
2825c80476e4SDavid E. O'Brien CCRETVAL
282645e5710bSMark Peek v_wordbegnext(Char c)
2827c80476e4SDavid E. O'Brien {
2828c80476e4SDavid E. O'Brien     USE(c);
2829c80476e4SDavid E. O'Brien     if (Cursor == LastChar)
2830c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2831c80476e4SDavid E. O'Brien     /* else */
2832c80476e4SDavid E. O'Brien 
2833c80476e4SDavid E. O'Brien     Cursor = c_next_word(Cursor, LastChar, Argument);
2834c80476e4SDavid E. O'Brien     if (Cursor < LastChar)
2835c80476e4SDavid E. O'Brien 	Cursor++;
2836c80476e4SDavid E. O'Brien 
2837c80476e4SDavid E. O'Brien     if (VImode)
2838c80476e4SDavid E. O'Brien 	if (ActionFlag & TCSHOP_DELETE) {
2839c80476e4SDavid E. O'Brien 	    c_delfini();
2840c80476e4SDavid E. O'Brien 	    return(CC_REFRESH);
2841c80476e4SDavid E. O'Brien 	}
2842c80476e4SDavid E. O'Brien 
2843c80476e4SDavid E. O'Brien     RefCursor();
2844c80476e4SDavid E. O'Brien     return(CC_NORM);
2845c80476e4SDavid E. O'Brien }
2846c80476e4SDavid E. O'Brien 
2847c80476e4SDavid E. O'Brien /*ARGSUSED*/
2848c80476e4SDavid E. O'Brien static CCRETVAL
284945e5710bSMark Peek v_repeat_srch(int c)
2850c80476e4SDavid E. O'Brien {
2851c80476e4SDavid E. O'Brien     CCRETVAL rv = CC_ERROR;
2852c80476e4SDavid E. O'Brien #ifdef SDEBUG
2853c80476e4SDavid E. O'Brien     xprintf("dir %d patlen %d patbuf %S\n",
285445e5710bSMark Peek 	    c, (int)patbuf.len, patbuf.s);
2855c80476e4SDavid E. O'Brien #endif
2856c80476e4SDavid E. O'Brien 
2857c80476e4SDavid E. O'Brien     LastCmd = (KEYCMD) c;  /* Hack to stop c_hsetpat */
2858c80476e4SDavid E. O'Brien     LastChar = InputBuf;
2859c80476e4SDavid E. O'Brien     switch (c) {
2860c80476e4SDavid E. O'Brien     case F_DOWN_SEARCH_HIST:
2861c80476e4SDavid E. O'Brien 	rv = e_down_search_hist(0);
2862c80476e4SDavid E. O'Brien 	break;
2863c80476e4SDavid E. O'Brien     case F_UP_SEARCH_HIST:
2864c80476e4SDavid E. O'Brien 	rv = e_up_search_hist(0);
2865c80476e4SDavid E. O'Brien 	break;
2866c80476e4SDavid E. O'Brien     default:
2867c80476e4SDavid E. O'Brien 	break;
2868c80476e4SDavid E. O'Brien     }
2869c80476e4SDavid E. O'Brien     return rv;
2870c80476e4SDavid E. O'Brien }
2871c80476e4SDavid E. O'Brien 
2872c80476e4SDavid E. O'Brien static CCRETVAL
287345e5710bSMark Peek v_csearch_back(Char ch, int count, int tflag)
2874c80476e4SDavid E. O'Brien {
2875c80476e4SDavid E. O'Brien     Char *cp;
2876c80476e4SDavid E. O'Brien 
2877c80476e4SDavid E. O'Brien     cp = Cursor;
2878c80476e4SDavid E. O'Brien     while (count--) {
2879c80476e4SDavid E. O'Brien 	if (*cp == ch)
2880c80476e4SDavid E. O'Brien 	    cp--;
2881c80476e4SDavid E. O'Brien 	while (cp > InputBuf && *cp != ch)
2882c80476e4SDavid E. O'Brien 	    cp--;
2883c80476e4SDavid E. O'Brien     }
2884c80476e4SDavid E. O'Brien 
2885c80476e4SDavid E. O'Brien     if (cp < InputBuf || (cp == InputBuf && *cp != ch))
2886c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2887c80476e4SDavid E. O'Brien 
2888c80476e4SDavid E. O'Brien     if (*cp == ch && tflag)
2889c80476e4SDavid E. O'Brien 	cp++;
2890c80476e4SDavid E. O'Brien 
2891c80476e4SDavid E. O'Brien     Cursor = cp;
2892c80476e4SDavid E. O'Brien 
2893c80476e4SDavid E. O'Brien     if (ActionFlag & TCSHOP_DELETE) {
2894c80476e4SDavid E. O'Brien 	Cursor++;
2895c80476e4SDavid E. O'Brien 	c_delfini();
2896c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
2897c80476e4SDavid E. O'Brien     }
2898c80476e4SDavid E. O'Brien 
2899c80476e4SDavid E. O'Brien     RefCursor();
2900c80476e4SDavid E. O'Brien     return(CC_NORM);
2901c80476e4SDavid E. O'Brien }
2902c80476e4SDavid E. O'Brien 
2903c80476e4SDavid E. O'Brien static CCRETVAL
290445e5710bSMark Peek v_csearch_fwd(Char ch, int count, int tflag)
2905c80476e4SDavid E. O'Brien {
2906c80476e4SDavid E. O'Brien     Char *cp;
2907c80476e4SDavid E. O'Brien 
2908c80476e4SDavid E. O'Brien     cp = Cursor;
2909c80476e4SDavid E. O'Brien     while (count--) {
2910c80476e4SDavid E. O'Brien 	if(*cp == ch)
2911c80476e4SDavid E. O'Brien 	    cp++;
2912c80476e4SDavid E. O'Brien 	while (cp < LastChar && *cp != ch)
2913c80476e4SDavid E. O'Brien 	    cp++;
2914c80476e4SDavid E. O'Brien     }
2915c80476e4SDavid E. O'Brien 
2916c80476e4SDavid E. O'Brien     if (cp >= LastChar)
2917c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2918c80476e4SDavid E. O'Brien 
2919c80476e4SDavid E. O'Brien     if (*cp == ch && tflag)
2920c80476e4SDavid E. O'Brien 	cp--;
2921c80476e4SDavid E. O'Brien 
2922c80476e4SDavid E. O'Brien     Cursor = cp;
2923c80476e4SDavid E. O'Brien 
2924c80476e4SDavid E. O'Brien     if (ActionFlag & TCSHOP_DELETE) {
2925c80476e4SDavid E. O'Brien 	Cursor++;
2926c80476e4SDavid E. O'Brien 	c_delfini();
2927c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
2928c80476e4SDavid E. O'Brien     }
2929c80476e4SDavid E. O'Brien     RefCursor();
2930c80476e4SDavid E. O'Brien     return(CC_NORM);
2931c80476e4SDavid E. O'Brien }
2932c80476e4SDavid E. O'Brien 
2933c80476e4SDavid E. O'Brien /*ARGSUSED*/
2934c80476e4SDavid E. O'Brien static CCRETVAL
293545e5710bSMark Peek v_action(int c)
2936c80476e4SDavid E. O'Brien {
29376767bd61SMark Peek     Char *cp, *kp;
2938c80476e4SDavid E. O'Brien 
2939c80476e4SDavid E. O'Brien     if (ActionFlag == TCSHOP_DELETE) {
2940c80476e4SDavid E. O'Brien 	ActionFlag = TCSHOP_NOP;
2941c80476e4SDavid E. O'Brien 	ActionPos = 0;
2942c80476e4SDavid E. O'Brien 
2943c80476e4SDavid E. O'Brien 	UndoSize = 0;
2944c80476e4SDavid E. O'Brien 	kp = UndoBuf;
2945c80476e4SDavid E. O'Brien 	for (cp = InputBuf; cp < LastChar; cp++) {
2946c80476e4SDavid E. O'Brien 	    *kp++ = *cp;
2947c80476e4SDavid E. O'Brien 	    UndoSize++;
2948c80476e4SDavid E. O'Brien 	}
2949c80476e4SDavid E. O'Brien 
2950c80476e4SDavid E. O'Brien 	UndoAction = TCSHOP_INSERT;
2951c80476e4SDavid E. O'Brien 	UndoPtr  = InputBuf;
2952c80476e4SDavid E. O'Brien 	LastChar = InputBuf;
2953c80476e4SDavid E. O'Brien 	Cursor   = InputBuf;
2954c80476e4SDavid E. O'Brien 	if (c & TCSHOP_INSERT)
2955c80476e4SDavid E. O'Brien 	    c_alternativ_key_map(0);
2956c80476e4SDavid E. O'Brien 
2957c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
2958c80476e4SDavid E. O'Brien     }
2959c80476e4SDavid E. O'Brien #ifdef notdef
2960c80476e4SDavid E. O'Brien     else if (ActionFlag == TCSHOP_NOP) {
2961c80476e4SDavid E. O'Brien #endif
2962c80476e4SDavid E. O'Brien 	ActionPos = Cursor;
2963c80476e4SDavid E. O'Brien 	ActionFlag = c;
2964c80476e4SDavid E. O'Brien 	return(CC_ARGHACK);  /* Do NOT clear out argument */
2965c80476e4SDavid E. O'Brien #ifdef notdef
2966c80476e4SDavid E. O'Brien     }
2967c80476e4SDavid E. O'Brien     else {
2968c80476e4SDavid E. O'Brien 	ActionFlag = 0;
2969c80476e4SDavid E. O'Brien 	ActionPos = 0;
2970c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2971c80476e4SDavid E. O'Brien     }
2972c80476e4SDavid E. O'Brien #endif
2973c80476e4SDavid E. O'Brien }
2974c80476e4SDavid E. O'Brien 
2975c80476e4SDavid E. O'Brien #ifdef COMMENT
2976c80476e4SDavid E. O'Brien /* by: Brian Allison <uiucdcs!convex!allison@RUTGERS.EDU> */
2977c80476e4SDavid E. O'Brien static void
297845e5710bSMark Peek c_get_word(Char **begin, Char **end)
2979c80476e4SDavid E. O'Brien {
2980c80476e4SDavid E. O'Brien     Char   *cp;
2981c80476e4SDavid E. O'Brien 
2982c80476e4SDavid E. O'Brien     cp = &Cursor[0];
2983c80476e4SDavid E. O'Brien     while (Argument--) {
2984c80476e4SDavid E. O'Brien 	while ((cp <= LastChar) && (isword(*cp)))
2985c80476e4SDavid E. O'Brien 	    cp++;
2986c80476e4SDavid E. O'Brien 	*end = --cp;
2987c80476e4SDavid E. O'Brien 	while ((cp >= InputBuf) && (isword(*cp)))
2988c80476e4SDavid E. O'Brien 	    cp--;
2989c80476e4SDavid E. O'Brien 	*begin = ++cp;
2990c80476e4SDavid E. O'Brien     }
2991c80476e4SDavid E. O'Brien }
2992c80476e4SDavid E. O'Brien #endif /* COMMENT */
2993c80476e4SDavid E. O'Brien 
2994c80476e4SDavid E. O'Brien /*ARGSUSED*/
2995c80476e4SDavid E. O'Brien CCRETVAL
299645e5710bSMark Peek e_uppercase(Char c)
2997c80476e4SDavid E. O'Brien {
2998c80476e4SDavid E. O'Brien     Char   *cp, *end;
2999c80476e4SDavid E. O'Brien 
3000c80476e4SDavid E. O'Brien     USE(c);
3001c80476e4SDavid E. O'Brien     end = c_next_word(Cursor, LastChar, Argument);
3002c80476e4SDavid E. O'Brien 
3003c80476e4SDavid E. O'Brien     for (cp = Cursor; cp < end; cp++)	/* PWP: was cp=begin */
3004c80476e4SDavid E. O'Brien 	if (Islower(*cp))
3005c80476e4SDavid E. O'Brien 	    *cp = Toupper(*cp);
3006c80476e4SDavid E. O'Brien 
3007c80476e4SDavid E. O'Brien     Cursor = end;
3008c80476e4SDavid E. O'Brien     if (Cursor > LastChar)
3009c80476e4SDavid E. O'Brien 	Cursor = LastChar;
3010c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3011c80476e4SDavid E. O'Brien }
3012c80476e4SDavid E. O'Brien 
3013c80476e4SDavid E. O'Brien 
3014c80476e4SDavid E. O'Brien /*ARGSUSED*/
3015c80476e4SDavid E. O'Brien CCRETVAL
301645e5710bSMark Peek e_capitolcase(Char c)
3017c80476e4SDavid E. O'Brien {
3018c80476e4SDavid E. O'Brien     Char   *cp, *end;
3019c80476e4SDavid E. O'Brien 
3020c80476e4SDavid E. O'Brien     USE(c);
3021c80476e4SDavid E. O'Brien     end = c_next_word(Cursor, LastChar, Argument);
3022c80476e4SDavid E. O'Brien 
3023c80476e4SDavid E. O'Brien     cp = Cursor;
3024c80476e4SDavid E. O'Brien     for (; cp < end; cp++) {
3025c80476e4SDavid E. O'Brien 	if (Isalpha(*cp)) {
3026c80476e4SDavid E. O'Brien 	    if (Islower(*cp))
3027c80476e4SDavid E. O'Brien 		*cp = Toupper(*cp);
3028c80476e4SDavid E. O'Brien 	    cp++;
3029c80476e4SDavid E. O'Brien 	    break;
3030c80476e4SDavid E. O'Brien 	}
3031c80476e4SDavid E. O'Brien     }
3032c80476e4SDavid E. O'Brien     for (; cp < end; cp++)
3033c80476e4SDavid E. O'Brien 	if (Isupper(*cp))
3034c80476e4SDavid E. O'Brien 	    *cp = Tolower(*cp);
3035c80476e4SDavid E. O'Brien 
3036c80476e4SDavid E. O'Brien     Cursor = end;
3037c80476e4SDavid E. O'Brien     if (Cursor > LastChar)
3038c80476e4SDavid E. O'Brien 	Cursor = LastChar;
3039c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3040c80476e4SDavid E. O'Brien }
3041c80476e4SDavid E. O'Brien 
3042c80476e4SDavid E. O'Brien /*ARGSUSED*/
3043c80476e4SDavid E. O'Brien CCRETVAL
304445e5710bSMark Peek e_lowercase(Char c)
3045c80476e4SDavid E. O'Brien {
3046c80476e4SDavid E. O'Brien     Char   *cp, *end;
3047c80476e4SDavid E. O'Brien 
3048c80476e4SDavid E. O'Brien     USE(c);
3049c80476e4SDavid E. O'Brien     end = c_next_word(Cursor, LastChar, Argument);
3050c80476e4SDavid E. O'Brien 
3051c80476e4SDavid E. O'Brien     for (cp = Cursor; cp < end; cp++)
3052c80476e4SDavid E. O'Brien 	if (Isupper(*cp))
3053c80476e4SDavid E. O'Brien 	    *cp = Tolower(*cp);
3054c80476e4SDavid E. O'Brien 
3055c80476e4SDavid E. O'Brien     Cursor = end;
3056c80476e4SDavid E. O'Brien     if (Cursor > LastChar)
3057c80476e4SDavid E. O'Brien 	Cursor = LastChar;
3058c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3059c80476e4SDavid E. O'Brien }
3060c80476e4SDavid E. O'Brien 
3061c80476e4SDavid E. O'Brien 
3062c80476e4SDavid E. O'Brien /*ARGSUSED*/
3063c80476e4SDavid E. O'Brien CCRETVAL
306445e5710bSMark Peek e_set_mark(Char c)
3065c80476e4SDavid E. O'Brien {
3066c80476e4SDavid E. O'Brien     USE(c);
306745e5710bSMark Peek     if (adrof(STRhighlight) && MarkIsSet && Mark != Cursor) {
306845e5710bSMark Peek 	ClearLines();
306945e5710bSMark Peek 	ClearDisp();
307045e5710bSMark Peek 	Refresh();
307145e5710bSMark Peek     }
3072c80476e4SDavid E. O'Brien     Mark = Cursor;
307345e5710bSMark Peek     MarkIsSet = 1;
3074c80476e4SDavid E. O'Brien     return(CC_NORM);
3075c80476e4SDavid E. O'Brien }
3076c80476e4SDavid E. O'Brien 
3077c80476e4SDavid E. O'Brien /*ARGSUSED*/
3078c80476e4SDavid E. O'Brien CCRETVAL
307945e5710bSMark Peek e_exchange_mark(Char c)
3080c80476e4SDavid E. O'Brien {
30816767bd61SMark Peek     Char *cp;
3082c80476e4SDavid E. O'Brien 
3083c80476e4SDavid E. O'Brien     USE(c);
3084c80476e4SDavid E. O'Brien     cp = Cursor;
3085c80476e4SDavid E. O'Brien     Cursor = Mark;
3086c80476e4SDavid E. O'Brien     Mark = cp;
3087c80476e4SDavid E. O'Brien     RefCursor();
3088c80476e4SDavid E. O'Brien     return(CC_NORM);
3089c80476e4SDavid E. O'Brien }
3090c80476e4SDavid E. O'Brien 
3091c80476e4SDavid E. O'Brien /*ARGSUSED*/
3092c80476e4SDavid E. O'Brien CCRETVAL
309345e5710bSMark Peek e_argfour(Char c)
3094c80476e4SDavid E. O'Brien {				/* multiply current argument by 4 */
3095c80476e4SDavid E. O'Brien     USE(c);
3096c80476e4SDavid E. O'Brien     if (Argument > 1000000)
3097c80476e4SDavid E. O'Brien 	return CC_ERROR;
3098c80476e4SDavid E. O'Brien     DoingArg = 1;
3099c80476e4SDavid E. O'Brien     Argument *= 4;
3100c80476e4SDavid E. O'Brien     return(CC_ARGHACK);
3101c80476e4SDavid E. O'Brien }
3102c80476e4SDavid E. O'Brien 
310345e5710bSMark Peek static void
310445e5710bSMark Peek quote_mode_cleanup(void *unused)
310545e5710bSMark Peek {
310645e5710bSMark Peek     USE(unused);
310745e5710bSMark Peek     QuoteModeOff();
310845e5710bSMark Peek }
310945e5710bSMark Peek 
3110c80476e4SDavid E. O'Brien /*ARGSUSED*/
3111c80476e4SDavid E. O'Brien CCRETVAL
311245e5710bSMark Peek e_quote(Char c)
3113c80476e4SDavid E. O'Brien {
3114c80476e4SDavid E. O'Brien     Char    ch;
3115c80476e4SDavid E. O'Brien     int     num;
3116c80476e4SDavid E. O'Brien 
3117c80476e4SDavid E. O'Brien     USE(c);
3118c80476e4SDavid E. O'Brien     QuoteModeOn();
311945e5710bSMark Peek     cleanup_push(&c, quote_mode_cleanup); /* Using &c just as a mark */
3120c80476e4SDavid E. O'Brien     num = GetNextChar(&ch);
312145e5710bSMark Peek     cleanup_until(&c);
3122c80476e4SDavid E. O'Brien     if (num == 1)
3123c80476e4SDavid E. O'Brien 	return e_insert(ch);
3124c80476e4SDavid E. O'Brien     else
3125c80476e4SDavid E. O'Brien 	return e_send_eof(0);
3126c80476e4SDavid E. O'Brien }
3127c80476e4SDavid E. O'Brien 
3128c80476e4SDavid E. O'Brien /*ARGSUSED*/
3129c80476e4SDavid E. O'Brien CCRETVAL
313045e5710bSMark Peek e_metanext(Char c)
3131c80476e4SDavid E. O'Brien {
3132c80476e4SDavid E. O'Brien     USE(c);
3133c80476e4SDavid E. O'Brien     MetaNext = 1;
3134c80476e4SDavid E. O'Brien     return(CC_ARGHACK);	/* preserve argument */
3135c80476e4SDavid E. O'Brien }
3136c80476e4SDavid E. O'Brien 
3137c80476e4SDavid E. O'Brien #ifdef notdef
3138c80476e4SDavid E. O'Brien /*ARGSUSED*/
3139c80476e4SDavid E. O'Brien CCRETVAL
314045e5710bSMark Peek e_extendnext(Char c)
3141c80476e4SDavid E. O'Brien {
3142c80476e4SDavid E. O'Brien     CurrentKeyMap = CcAltMap;
3143c80476e4SDavid E. O'Brien     return(CC_ARGHACK);	/* preserve argument */
3144c80476e4SDavid E. O'Brien }
3145c80476e4SDavid E. O'Brien 
3146c80476e4SDavid E. O'Brien #endif
3147c80476e4SDavid E. O'Brien 
3148c80476e4SDavid E. O'Brien /*ARGSUSED*/
3149c80476e4SDavid E. O'Brien CCRETVAL
315045e5710bSMark Peek v_insbeg(Char c)
3151c80476e4SDavid E. O'Brien {				/* move to beginning of line and start vi
3152c80476e4SDavid E. O'Brien 				 * insert mode */
3153c80476e4SDavid E. O'Brien     USE(c);
3154c80476e4SDavid E. O'Brien     Cursor = InputBuf;
3155c80476e4SDavid E. O'Brien     InsertPos = Cursor;
3156c80476e4SDavid E. O'Brien 
3157c80476e4SDavid E. O'Brien     UndoPtr  = Cursor;
3158c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_DELETE;
3159c80476e4SDavid E. O'Brien 
3160c80476e4SDavid E. O'Brien     RefCursor();		/* move the cursor */
3161c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
3162c80476e4SDavid E. O'Brien     return(CC_NORM);
3163c80476e4SDavid E. O'Brien }
3164c80476e4SDavid E. O'Brien 
3165c80476e4SDavid E. O'Brien /*ARGSUSED*/
3166c80476e4SDavid E. O'Brien CCRETVAL
316745e5710bSMark Peek v_replone(Char c)
3168c80476e4SDavid E. O'Brien {				/* vi mode overwrite one character */
3169c80476e4SDavid E. O'Brien     USE(c);
3170c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
3171c80476e4SDavid E. O'Brien     inputmode = MODE_REPLACE_1;
3172c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_CHANGE;	/* Set Up for VI undo command */
3173c80476e4SDavid E. O'Brien     UndoPtr = Cursor;
3174c80476e4SDavid E. O'Brien     UndoSize = 0;
3175c80476e4SDavid E. O'Brien     return(CC_NORM);
3176c80476e4SDavid E. O'Brien }
3177c80476e4SDavid E. O'Brien 
3178c80476e4SDavid E. O'Brien /*ARGSUSED*/
3179c80476e4SDavid E. O'Brien CCRETVAL
318045e5710bSMark Peek v_replmode(Char c)
3181c80476e4SDavid E. O'Brien {				/* vi mode start overwriting */
3182c80476e4SDavid E. O'Brien     USE(c);
3183c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
3184c80476e4SDavid E. O'Brien     inputmode = MODE_REPLACE;
3185c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_CHANGE;	/* Set Up for VI undo command */
3186c80476e4SDavid E. O'Brien     UndoPtr = Cursor;
3187c80476e4SDavid E. O'Brien     UndoSize = 0;
3188c80476e4SDavid E. O'Brien     return(CC_NORM);
3189c80476e4SDavid E. O'Brien }
3190c80476e4SDavid E. O'Brien 
3191c80476e4SDavid E. O'Brien /*ARGSUSED*/
3192c80476e4SDavid E. O'Brien CCRETVAL
319345e5710bSMark Peek v_substchar(Char c)
3194c80476e4SDavid E. O'Brien {				/* vi mode substitute for one char */
3195c80476e4SDavid E. O'Brien     USE(c);
3196c80476e4SDavid E. O'Brien     c_delafter(Argument);
3197c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
3198c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3199c80476e4SDavid E. O'Brien }
3200c80476e4SDavid E. O'Brien 
3201c80476e4SDavid E. O'Brien /*ARGSUSED*/
3202c80476e4SDavid E. O'Brien CCRETVAL
320345e5710bSMark Peek v_substline(Char c)
3204c80476e4SDavid E. O'Brien {				/* vi mode replace whole line */
3205c80476e4SDavid E. O'Brien     USE(c);
3206c80476e4SDavid E. O'Brien     (void) e_killall(0);
3207c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
3208c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3209c80476e4SDavid E. O'Brien }
3210c80476e4SDavid E. O'Brien 
3211c80476e4SDavid E. O'Brien /*ARGSUSED*/
3212c80476e4SDavid E. O'Brien CCRETVAL
321345e5710bSMark Peek v_chgtoend(Char c)
3214c80476e4SDavid E. O'Brien {				/* vi mode change to end of line */
3215c80476e4SDavid E. O'Brien     USE(c);
3216c80476e4SDavid E. O'Brien     (void) e_killend(0);
3217c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
3218c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3219c80476e4SDavid E. O'Brien }
3220c80476e4SDavid E. O'Brien 
3221c80476e4SDavid E. O'Brien /*ARGSUSED*/
3222c80476e4SDavid E. O'Brien CCRETVAL
322345e5710bSMark Peek v_insert(Char c)
3224c80476e4SDavid E. O'Brien {				/* vi mode start inserting */
3225c80476e4SDavid E. O'Brien     USE(c);
3226c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
3227c80476e4SDavid E. O'Brien 
3228c80476e4SDavid E. O'Brien     InsertPos = Cursor;
3229c80476e4SDavid E. O'Brien     UndoPtr = Cursor;
3230c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_DELETE;
3231c80476e4SDavid E. O'Brien 
3232c80476e4SDavid E. O'Brien     return(CC_NORM);
3233c80476e4SDavid E. O'Brien }
3234c80476e4SDavid E. O'Brien 
3235c80476e4SDavid E. O'Brien /*ARGSUSED*/
3236c80476e4SDavid E. O'Brien CCRETVAL
323745e5710bSMark Peek v_add(Char c)
3238c80476e4SDavid E. O'Brien {				/* vi mode start adding */
3239c80476e4SDavid E. O'Brien     USE(c);
3240c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
3241c80476e4SDavid E. O'Brien     if (Cursor < LastChar)
3242c80476e4SDavid E. O'Brien     {
3243c80476e4SDavid E. O'Brien 	Cursor++;
3244c80476e4SDavid E. O'Brien 	if (Cursor > LastChar)
3245c80476e4SDavid E. O'Brien 	    Cursor = LastChar;
3246c80476e4SDavid E. O'Brien 	RefCursor();
3247c80476e4SDavid E. O'Brien     }
3248c80476e4SDavid E. O'Brien 
3249c80476e4SDavid E. O'Brien     InsertPos = Cursor;
3250c80476e4SDavid E. O'Brien     UndoPtr = Cursor;
3251c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_DELETE;
3252c80476e4SDavid E. O'Brien 
3253c80476e4SDavid E. O'Brien     return(CC_NORM);
3254c80476e4SDavid E. O'Brien }
3255c80476e4SDavid E. O'Brien 
3256c80476e4SDavid E. O'Brien /*ARGSUSED*/
3257c80476e4SDavid E. O'Brien CCRETVAL
325845e5710bSMark Peek v_addend(Char c)
3259c80476e4SDavid E. O'Brien {				/* vi mode to add at end of line */
3260c80476e4SDavid E. O'Brien     USE(c);
3261c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
3262c80476e4SDavid E. O'Brien     Cursor = LastChar;
3263c80476e4SDavid E. O'Brien 
3264c80476e4SDavid E. O'Brien     InsertPos = LastChar;	/* Mark where insertion begins */
3265c80476e4SDavid E. O'Brien     UndoPtr = LastChar;
3266c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_DELETE;
3267c80476e4SDavid E. O'Brien 
3268c80476e4SDavid E. O'Brien     RefCursor();
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
327445e5710bSMark Peek v_change_case(Char cc)
3275c80476e4SDavid E. O'Brien {
327623338178SMark Peek     Char    c;
3277c80476e4SDavid E. O'Brien 
3278c80476e4SDavid E. O'Brien     USE(cc);
3279c80476e4SDavid E. O'Brien     if (Cursor < LastChar) {
32803b6eaa7bSAndrey A. Chernov #ifndef WINNT_NATIVE
3281c80476e4SDavid E. O'Brien 	c = *Cursor;
3282c80476e4SDavid E. O'Brien #else
3283c80476e4SDavid E. O'Brien 	c = CHAR & *Cursor;
32843b6eaa7bSAndrey A. Chernov #endif /* WINNT_NATIVE */
3285c80476e4SDavid E. O'Brien 	if (Isupper(c))
3286c80476e4SDavid E. O'Brien 	    *Cursor++ = Tolower(c);
3287c80476e4SDavid E. O'Brien 	else if (Islower(c))
3288c80476e4SDavid E. O'Brien 	    *Cursor++ = Toupper(c);
3289c80476e4SDavid E. O'Brien 	else
3290c80476e4SDavid E. O'Brien 	    Cursor++;
329123338178SMark Peek 	RefPlusOne(1);		/* fast refresh for one char */
3292c80476e4SDavid E. O'Brien 	return(CC_NORM);
3293c80476e4SDavid E. O'Brien     }
3294c80476e4SDavid E. O'Brien     return(CC_ERROR);
3295c80476e4SDavid E. O'Brien }
3296c80476e4SDavid E. O'Brien 
3297c80476e4SDavid E. O'Brien /*ARGSUSED*/
3298c80476e4SDavid E. O'Brien CCRETVAL
329945e5710bSMark Peek e_expand(Char c)
3300c80476e4SDavid E. O'Brien {
33016767bd61SMark Peek     Char *p;
3302c80476e4SDavid E. O'Brien 
3303c80476e4SDavid E. O'Brien     USE(c);
3304c80476e4SDavid E. O'Brien     for (p = InputBuf; Isspace(*p); p++)
3305c80476e4SDavid E. O'Brien 	continue;
3306c80476e4SDavid E. O'Brien     if (p == LastChar)
3307c80476e4SDavid E. O'Brien 	return(CC_ERROR);
3308c80476e4SDavid E. O'Brien 
3309c80476e4SDavid E. O'Brien     justpr++;
3310c80476e4SDavid E. O'Brien     Expand++;
3311c80476e4SDavid E. O'Brien     return(e_newline(0));
3312c80476e4SDavid E. O'Brien }
3313c80476e4SDavid E. O'Brien 
3314c80476e4SDavid E. O'Brien /*ARGSUSED*/
3315c80476e4SDavid E. O'Brien CCRETVAL
331645e5710bSMark Peek e_startover(Char c)
3317c80476e4SDavid E. O'Brien {				/* erase all of current line, start again */
3318c80476e4SDavid E. O'Brien     USE(c);
3319c80476e4SDavid E. O'Brien     ResetInLine(0);		/* reset the input pointers */
3320c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3321c80476e4SDavid E. O'Brien }
3322c80476e4SDavid E. O'Brien 
3323c80476e4SDavid E. O'Brien /*ARGSUSED*/
3324c80476e4SDavid E. O'Brien CCRETVAL
332545e5710bSMark Peek e_redisp(Char c)
3326c80476e4SDavid E. O'Brien {
3327c80476e4SDavid E. O'Brien     USE(c);
3328c80476e4SDavid E. O'Brien     ClearLines();
3329c80476e4SDavid E. O'Brien     ClearDisp();
3330c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3331c80476e4SDavid E. O'Brien }
3332c80476e4SDavid E. O'Brien 
3333c80476e4SDavid E. O'Brien /*ARGSUSED*/
3334c80476e4SDavid E. O'Brien CCRETVAL
333545e5710bSMark Peek e_cleardisp(Char c)
3336c80476e4SDavid E. O'Brien {
3337c80476e4SDavid E. O'Brien     USE(c);
3338c80476e4SDavid E. O'Brien     ClearScreen();		/* clear the whole real screen */
3339c80476e4SDavid E. O'Brien     ClearDisp();		/* reset everything */
3340c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3341c80476e4SDavid E. O'Brien }
3342c80476e4SDavid E. O'Brien 
3343c80476e4SDavid E. O'Brien /*ARGSUSED*/
3344c80476e4SDavid E. O'Brien CCRETVAL
334545e5710bSMark Peek e_tty_int(Char c)
3346c80476e4SDavid E. O'Brien {
3347c80476e4SDavid E. O'Brien     USE(c);
33483b6eaa7bSAndrey A. Chernov #if defined(_MINIX) || defined(WINNT_NATIVE)
3349c80476e4SDavid E. O'Brien     /* SAK PATCH: erase all of current line, start again */
3350c80476e4SDavid E. O'Brien     ResetInLine(0);		/* reset the input pointers */
3351c80476e4SDavid E. O'Brien     xputchar('\n');
3352c80476e4SDavid E. O'Brien     ClearDisp();
3353c80476e4SDavid E. O'Brien     return (CC_REFRESH);
33543b6eaa7bSAndrey A. Chernov #else /* !_MINIX && !WINNT_NATIVE */
3355c80476e4SDavid E. O'Brien     /* do no editing */
3356c80476e4SDavid E. O'Brien     return (CC_NORM);
33573b6eaa7bSAndrey A. Chernov #endif /* _MINIX || WINNT_NATIVE */
3358c80476e4SDavid E. O'Brien }
3359c80476e4SDavid E. O'Brien 
3360c80476e4SDavid E. O'Brien /*
3361c80476e4SDavid E. O'Brien  * From: ghazi@cesl.rutgers.edu (Kaveh R. Ghazi)
3362c80476e4SDavid E. O'Brien  * Function to send a character back to the input stream in cooked
3363c80476e4SDavid E. O'Brien  * mode. Only works if we have TIOCSTI
3364c80476e4SDavid E. O'Brien  */
3365c80476e4SDavid E. O'Brien /*ARGSUSED*/
3366c80476e4SDavid E. O'Brien CCRETVAL
336745e5710bSMark Peek e_stuff_char(Char c)
3368c80476e4SDavid E. O'Brien {
3369c80476e4SDavid E. O'Brien #ifdef TIOCSTI
3370c80476e4SDavid E. O'Brien      int was_raw = Tty_raw_mode;
337123338178SMark Peek      char buf[MB_LEN_MAX];
337223338178SMark Peek      size_t i, len;
3373c80476e4SDavid E. O'Brien 
3374c80476e4SDavid E. O'Brien      if (was_raw)
3375c80476e4SDavid E. O'Brien          (void) Cookedmode();
3376c80476e4SDavid E. O'Brien 
337745e5710bSMark Peek      (void) xwrite(SHIN, "\n", 1);
337823338178SMark Peek      len = one_wctomb(buf, c & CHAR);
337923338178SMark Peek      for (i = 0; i < len; i++)
338023338178SMark Peek 	 (void) ioctl(SHIN, TIOCSTI, (ioctl_t) &buf[i]);
3381c80476e4SDavid E. O'Brien 
3382c80476e4SDavid E. O'Brien      if (was_raw)
3383c80476e4SDavid E. O'Brien 	 (void) Rawmode();
3384c80476e4SDavid E. O'Brien      return(e_redisp(c));
3385c80476e4SDavid E. O'Brien #else /* !TIOCSTI */
3386c80476e4SDavid E. O'Brien      return(CC_ERROR);
3387c80476e4SDavid E. O'Brien #endif /* !TIOCSTI */
3388c80476e4SDavid E. O'Brien }
3389c80476e4SDavid E. O'Brien 
3390c80476e4SDavid E. O'Brien /*ARGSUSED*/
3391c80476e4SDavid E. O'Brien CCRETVAL
339245e5710bSMark Peek e_insovr(Char c)
3393c80476e4SDavid E. O'Brien {
3394c80476e4SDavid E. O'Brien     USE(c);
3395c80476e4SDavid E. O'Brien     inputmode = (inputmode == MODE_INSERT ? MODE_REPLACE : MODE_INSERT);
3396c80476e4SDavid E. O'Brien     return(CC_NORM);
3397c80476e4SDavid E. O'Brien }
3398c80476e4SDavid E. O'Brien 
3399c80476e4SDavid E. O'Brien /*ARGSUSED*/
3400c80476e4SDavid E. O'Brien CCRETVAL
340145e5710bSMark Peek e_tty_dsusp(Char c)
3402c80476e4SDavid E. O'Brien {
3403c80476e4SDavid E. O'Brien     USE(c);
3404c80476e4SDavid E. O'Brien     /* do no editing */
3405c80476e4SDavid E. O'Brien     return(CC_NORM);
3406c80476e4SDavid E. O'Brien }
3407c80476e4SDavid E. O'Brien 
3408c80476e4SDavid E. O'Brien /*ARGSUSED*/
3409c80476e4SDavid E. O'Brien CCRETVAL
341045e5710bSMark Peek e_tty_flusho(Char c)
3411c80476e4SDavid E. O'Brien {
3412c80476e4SDavid E. O'Brien     USE(c);
3413c80476e4SDavid E. O'Brien     /* do no editing */
3414c80476e4SDavid E. O'Brien     return(CC_NORM);
3415c80476e4SDavid E. O'Brien }
3416c80476e4SDavid E. O'Brien 
3417c80476e4SDavid E. O'Brien /*ARGSUSED*/
3418c80476e4SDavid E. O'Brien CCRETVAL
341945e5710bSMark Peek e_tty_quit(Char c)
3420c80476e4SDavid E. O'Brien {
3421c80476e4SDavid E. O'Brien     USE(c);
3422c80476e4SDavid E. O'Brien     /* do no editing */
3423c80476e4SDavid E. O'Brien     return(CC_NORM);
3424c80476e4SDavid E. O'Brien }
3425c80476e4SDavid E. O'Brien 
3426c80476e4SDavid E. O'Brien /*ARGSUSED*/
3427c80476e4SDavid E. O'Brien CCRETVAL
342845e5710bSMark Peek e_tty_tsusp(Char c)
3429c80476e4SDavid E. O'Brien {
3430c80476e4SDavid E. O'Brien     USE(c);
3431c80476e4SDavid E. O'Brien     /* do no editing */
3432c80476e4SDavid E. O'Brien     return(CC_NORM);
3433c80476e4SDavid E. O'Brien }
3434c80476e4SDavid E. O'Brien 
3435c80476e4SDavid E. O'Brien /*ARGSUSED*/
3436c80476e4SDavid E. O'Brien CCRETVAL
343745e5710bSMark Peek e_tty_stopo(Char c)
3438c80476e4SDavid E. O'Brien {
3439c80476e4SDavid E. O'Brien     USE(c);
3440c80476e4SDavid E. O'Brien     /* do no editing */
3441c80476e4SDavid E. O'Brien     return(CC_NORM);
3442c80476e4SDavid E. O'Brien }
3443c80476e4SDavid E. O'Brien 
3444c80476e4SDavid E. O'Brien /*ARGSUSED*/
3445c80476e4SDavid E. O'Brien CCRETVAL
344645e5710bSMark Peek e_expand_history(Char c)
3447c80476e4SDavid E. O'Brien {
3448c80476e4SDavid E. O'Brien     USE(c);
3449c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
3450c80476e4SDavid E. O'Brien     c_substitute();
3451c80476e4SDavid E. O'Brien     return(CC_NORM);
3452c80476e4SDavid E. O'Brien }
3453c80476e4SDavid E. O'Brien 
3454c80476e4SDavid E. O'Brien /*ARGSUSED*/
3455c80476e4SDavid E. O'Brien CCRETVAL
345645e5710bSMark Peek e_magic_space(Char c)
3457c80476e4SDavid E. O'Brien {
3458c80476e4SDavid E. O'Brien     USE(c);
3459c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
3460c80476e4SDavid E. O'Brien     c_substitute();
3461c80476e4SDavid E. O'Brien     return(e_insert(' '));
3462c80476e4SDavid E. O'Brien }
3463c80476e4SDavid E. O'Brien 
3464c80476e4SDavid E. O'Brien /*ARGSUSED*/
3465c80476e4SDavid E. O'Brien CCRETVAL
346645e5710bSMark Peek e_inc_fwd(Char c)
3467c80476e4SDavid E. O'Brien {
346845e5710bSMark Peek     CCRETVAL ret;
346945e5710bSMark Peek 
3470c80476e4SDavid E. O'Brien     USE(c);
347145e5710bSMark Peek     patbuf.len = 0;
347245e5710bSMark Peek     MarkIsSet = 0;
347345e5710bSMark Peek     ret = e_inc_search(F_DOWN_SEARCH_HIST);
347445e5710bSMark Peek     if (adrof(STRhighlight) && IncMatchLen) {
347545e5710bSMark Peek 	IncMatchLen = 0;
347645e5710bSMark Peek 	ClearLines();
347745e5710bSMark Peek 	ClearDisp();
347845e5710bSMark Peek 	Refresh();
347945e5710bSMark Peek     }
348045e5710bSMark Peek     IncMatchLen = 0;
348145e5710bSMark Peek     return ret;
3482c80476e4SDavid E. O'Brien }
3483c80476e4SDavid E. O'Brien 
3484c80476e4SDavid E. O'Brien 
3485c80476e4SDavid E. O'Brien /*ARGSUSED*/
3486c80476e4SDavid E. O'Brien CCRETVAL
348745e5710bSMark Peek e_inc_back(Char c)
3488c80476e4SDavid E. O'Brien {
348945e5710bSMark Peek     CCRETVAL ret;
349045e5710bSMark Peek 
3491c80476e4SDavid E. O'Brien     USE(c);
349245e5710bSMark Peek     patbuf.len = 0;
349345e5710bSMark Peek     MarkIsSet = 0;
349445e5710bSMark Peek     ret = e_inc_search(F_UP_SEARCH_HIST);
349545e5710bSMark Peek     if (adrof(STRhighlight) && IncMatchLen) {
349645e5710bSMark Peek 	IncMatchLen = 0;
349745e5710bSMark Peek 	ClearLines();
349845e5710bSMark Peek 	ClearDisp();
349945e5710bSMark Peek 	Refresh();
350045e5710bSMark Peek     }
350145e5710bSMark Peek     IncMatchLen = 0;
350245e5710bSMark Peek     return ret;
3503c80476e4SDavid E. O'Brien }
3504c80476e4SDavid E. O'Brien 
3505c80476e4SDavid E. O'Brien /*ARGSUSED*/
3506c80476e4SDavid E. O'Brien CCRETVAL
350745e5710bSMark Peek e_copyprev(Char c)
3508c80476e4SDavid E. O'Brien {
35096767bd61SMark Peek     Char *cp, *oldc, *dp;
3510c80476e4SDavid E. O'Brien 
3511c80476e4SDavid E. O'Brien     USE(c);
3512c80476e4SDavid E. O'Brien     if (Cursor == InputBuf)
3513c80476e4SDavid E. O'Brien 	return(CC_ERROR);
3514c80476e4SDavid E. O'Brien     /* else */
3515c80476e4SDavid E. O'Brien 
3516c80476e4SDavid E. O'Brien     oldc = Cursor;
3517c80476e4SDavid E. O'Brien     /* does a bounds check */
3518c80476e4SDavid E. O'Brien     cp = c_prev_word(Cursor, InputBuf, Argument);
3519c80476e4SDavid E. O'Brien 
3520c80476e4SDavid E. O'Brien     c_insert((int)(oldc - cp));
3521c80476e4SDavid E. O'Brien     for (dp = oldc; cp < oldc && dp < LastChar; cp++)
3522c80476e4SDavid E. O'Brien 	*dp++ = *cp;
3523c80476e4SDavid E. O'Brien 
3524c80476e4SDavid E. O'Brien     Cursor = dp;		/* put cursor at end */
3525c80476e4SDavid E. O'Brien 
3526c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3527c80476e4SDavid E. O'Brien }
3528c80476e4SDavid E. O'Brien 
3529c80476e4SDavid E. O'Brien /*ARGSUSED*/
3530c80476e4SDavid E. O'Brien CCRETVAL
353145e5710bSMark Peek e_tty_starto(Char c)
3532c80476e4SDavid E. O'Brien {
3533c80476e4SDavid E. O'Brien     USE(c);
3534c80476e4SDavid E. O'Brien     /* do no editing */
3535c80476e4SDavid E. O'Brien     return(CC_NORM);
3536c80476e4SDavid E. O'Brien }
3537c80476e4SDavid E. O'Brien 
3538c80476e4SDavid E. O'Brien /*ARGSUSED*/
3539c80476e4SDavid E. O'Brien CCRETVAL
354045e5710bSMark Peek e_load_average(Char c)
3541c80476e4SDavid E. O'Brien {
3542c80476e4SDavid E. O'Brien     USE(c);
3543c80476e4SDavid E. O'Brien     PastBottom();
3544c80476e4SDavid E. O'Brien #ifdef TIOCSTAT
3545c80476e4SDavid E. O'Brien     /*
3546c80476e4SDavid E. O'Brien      * Here we pass &c to the ioctl because some os's (NetBSD) expect it
3547c80476e4SDavid E. O'Brien      * there even if they don't use it. (lukem@netbsd.org)
3548c80476e4SDavid E. O'Brien      */
3549c80476e4SDavid E. O'Brien     if (ioctl(SHIN, TIOCSTAT, (ioctl_t) &c) < 0)
3550c80476e4SDavid E. O'Brien #endif
3551c80476e4SDavid E. O'Brien 	xprintf(CGETS(5, 1, "Load average unavailable\n"));
3552c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3553c80476e4SDavid E. O'Brien }
3554c80476e4SDavid E. O'Brien 
3555c80476e4SDavid E. O'Brien /*ARGSUSED*/
3556c80476e4SDavid E. O'Brien CCRETVAL
355745e5710bSMark Peek v_chgmeta(Char c)
3558c80476e4SDavid E. O'Brien {
3559c80476e4SDavid E. O'Brien     USE(c);
3560c80476e4SDavid E. O'Brien     /*
3561c80476e4SDavid E. O'Brien      * Delete with insert == change: first we delete and then we leave in
3562c80476e4SDavid E. O'Brien      * insert mode.
3563c80476e4SDavid E. O'Brien      */
3564c80476e4SDavid E. O'Brien     return(v_action(TCSHOP_DELETE|TCSHOP_INSERT));
3565c80476e4SDavid E. O'Brien }
3566c80476e4SDavid E. O'Brien 
3567c80476e4SDavid E. O'Brien /*ARGSUSED*/
3568c80476e4SDavid E. O'Brien CCRETVAL
356945e5710bSMark Peek v_delmeta(Char c)
3570c80476e4SDavid E. O'Brien {
3571c80476e4SDavid E. O'Brien     USE(c);
3572c80476e4SDavid E. O'Brien     return(v_action(TCSHOP_DELETE));
3573c80476e4SDavid E. O'Brien }
3574c80476e4SDavid E. O'Brien 
3575c80476e4SDavid E. O'Brien 
3576c80476e4SDavid E. O'Brien /*ARGSUSED*/
3577c80476e4SDavid E. O'Brien CCRETVAL
357845e5710bSMark Peek v_endword(Char c)
3579c80476e4SDavid E. O'Brien {
3580c80476e4SDavid E. O'Brien     USE(c);
3581c80476e4SDavid E. O'Brien     if (Cursor == LastChar)
3582c80476e4SDavid E. O'Brien 	return(CC_ERROR);
3583c80476e4SDavid E. O'Brien     /* else */
3584c80476e4SDavid E. O'Brien 
35856767bd61SMark Peek     Cursor = c_endword(Cursor, LastChar, Argument, STRshwspace);
3586c80476e4SDavid E. O'Brien 
3587c80476e4SDavid E. O'Brien     if (ActionFlag & TCSHOP_DELETE)
3588c80476e4SDavid E. O'Brien     {
3589c80476e4SDavid E. O'Brien 	Cursor++;
3590c80476e4SDavid E. O'Brien 	c_delfini();
3591c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
3592c80476e4SDavid E. O'Brien     }
3593c80476e4SDavid E. O'Brien 
3594c80476e4SDavid E. O'Brien     RefCursor();
3595c80476e4SDavid E. O'Brien     return(CC_NORM);
3596c80476e4SDavid E. O'Brien }
3597c80476e4SDavid E. O'Brien 
3598c80476e4SDavid E. O'Brien /*ARGSUSED*/
3599c80476e4SDavid E. O'Brien CCRETVAL
360045e5710bSMark Peek v_eword(Char c)
3601c80476e4SDavid E. O'Brien {
3602c80476e4SDavid E. O'Brien     USE(c);
3603c80476e4SDavid E. O'Brien     if (Cursor == LastChar)
3604c80476e4SDavid E. O'Brien 	return(CC_ERROR);
3605c80476e4SDavid E. O'Brien     /* else */
3606c80476e4SDavid E. O'Brien 
3607c80476e4SDavid E. O'Brien     Cursor = c_eword(Cursor, LastChar, Argument);
3608c80476e4SDavid E. O'Brien 
3609c80476e4SDavid E. O'Brien     if (ActionFlag & TCSHOP_DELETE) {
3610c80476e4SDavid E. O'Brien 	Cursor++;
3611c80476e4SDavid E. O'Brien 	c_delfini();
3612c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
3613c80476e4SDavid E. O'Brien     }
3614c80476e4SDavid E. O'Brien 
3615c80476e4SDavid E. O'Brien     RefCursor();
3616c80476e4SDavid E. O'Brien     return(CC_NORM);
3617c80476e4SDavid E. O'Brien }
3618c80476e4SDavid E. O'Brien 
3619c80476e4SDavid E. O'Brien /*ARGSUSED*/
3620c80476e4SDavid E. O'Brien CCRETVAL
362145e5710bSMark Peek v_char_fwd(Char c)
3622c80476e4SDavid E. O'Brien {
3623c80476e4SDavid E. O'Brien     Char ch;
3624c80476e4SDavid E. O'Brien 
3625c80476e4SDavid E. O'Brien     USE(c);
3626c80476e4SDavid E. O'Brien     if (GetNextChar(&ch) != 1)
3627c80476e4SDavid E. O'Brien 	return e_send_eof(0);
3628c80476e4SDavid E. O'Brien 
3629c80476e4SDavid E. O'Brien     srch_dir = CHAR_FWD;
3630c80476e4SDavid E. O'Brien     srch_char = ch;
3631c80476e4SDavid E. O'Brien 
3632c80476e4SDavid E. O'Brien     return v_csearch_fwd(ch, Argument, 0);
3633c80476e4SDavid E. O'Brien 
3634c80476e4SDavid E. O'Brien }
3635c80476e4SDavid E. O'Brien 
3636c80476e4SDavid E. O'Brien /*ARGSUSED*/
3637c80476e4SDavid E. O'Brien CCRETVAL
363845e5710bSMark Peek v_char_back(Char c)
3639c80476e4SDavid E. O'Brien {
3640c80476e4SDavid E. O'Brien     Char ch;
3641c80476e4SDavid E. O'Brien 
3642c80476e4SDavid E. O'Brien     USE(c);
3643c80476e4SDavid E. O'Brien     if (GetNextChar(&ch) != 1)
3644c80476e4SDavid E. O'Brien 	return e_send_eof(0);
3645c80476e4SDavid E. O'Brien 
3646c80476e4SDavid E. O'Brien     srch_dir = CHAR_BACK;
3647c80476e4SDavid E. O'Brien     srch_char = ch;
3648c80476e4SDavid E. O'Brien 
3649c80476e4SDavid E. O'Brien     return v_csearch_back(ch, Argument, 0);
3650c80476e4SDavid E. O'Brien }
3651c80476e4SDavid E. O'Brien 
3652c80476e4SDavid E. O'Brien /*ARGSUSED*/
3653c80476e4SDavid E. O'Brien CCRETVAL
365445e5710bSMark Peek v_charto_fwd(Char c)
3655c80476e4SDavid E. O'Brien {
3656c80476e4SDavid E. O'Brien     Char ch;
3657c80476e4SDavid E. O'Brien 
3658c80476e4SDavid E. O'Brien     USE(c);
3659c80476e4SDavid E. O'Brien     if (GetNextChar(&ch) != 1)
3660c80476e4SDavid E. O'Brien 	return e_send_eof(0);
3661c80476e4SDavid E. O'Brien 
3662c80476e4SDavid E. O'Brien     return v_csearch_fwd(ch, Argument, 1);
3663c80476e4SDavid E. O'Brien 
3664c80476e4SDavid E. O'Brien }
3665c80476e4SDavid E. O'Brien 
3666c80476e4SDavid E. O'Brien /*ARGSUSED*/
3667c80476e4SDavid E. O'Brien CCRETVAL
366845e5710bSMark Peek v_charto_back(Char c)
3669c80476e4SDavid E. O'Brien {
3670c80476e4SDavid E. O'Brien     Char ch;
3671c80476e4SDavid E. O'Brien 
3672c80476e4SDavid E. O'Brien     USE(c);
3673c80476e4SDavid E. O'Brien     if (GetNextChar(&ch) != 1)
3674c80476e4SDavid E. O'Brien 	return e_send_eof(0);
3675c80476e4SDavid E. O'Brien 
3676c80476e4SDavid E. O'Brien     return v_csearch_back(ch, Argument, 1);
3677c80476e4SDavid E. O'Brien }
3678c80476e4SDavid E. O'Brien 
3679c80476e4SDavid E. O'Brien /*ARGSUSED*/
3680c80476e4SDavid E. O'Brien CCRETVAL
368145e5710bSMark Peek v_rchar_fwd(Char c)
3682c80476e4SDavid E. O'Brien {
3683c80476e4SDavid E. O'Brien     USE(c);
3684c80476e4SDavid E. O'Brien     if (srch_char == 0)
3685c80476e4SDavid E. O'Brien 	return CC_ERROR;
3686c80476e4SDavid E. O'Brien 
3687c80476e4SDavid E. O'Brien     return srch_dir == CHAR_FWD ? v_csearch_fwd(srch_char, Argument, 0) :
3688c80476e4SDavid E. O'Brien 			          v_csearch_back(srch_char, Argument, 0);
3689c80476e4SDavid E. O'Brien }
3690c80476e4SDavid E. O'Brien 
3691c80476e4SDavid E. O'Brien /*ARGSUSED*/
3692c80476e4SDavid E. O'Brien CCRETVAL
369345e5710bSMark Peek v_rchar_back(Char c)
3694c80476e4SDavid E. O'Brien {
3695c80476e4SDavid E. O'Brien     USE(c);
3696c80476e4SDavid E. O'Brien     if (srch_char == 0)
3697c80476e4SDavid E. O'Brien 	return CC_ERROR;
3698c80476e4SDavid E. O'Brien 
3699c80476e4SDavid E. O'Brien     return srch_dir == CHAR_BACK ? v_csearch_fwd(srch_char, Argument, 0) :
3700c80476e4SDavid E. O'Brien 			           v_csearch_back(srch_char, Argument, 0);
3701c80476e4SDavid E. O'Brien }
3702c80476e4SDavid E. O'Brien 
3703c80476e4SDavid E. O'Brien /*ARGSUSED*/
3704c80476e4SDavid E. O'Brien CCRETVAL
370545e5710bSMark Peek v_undo(Char c)
3706c80476e4SDavid E. O'Brien {
37076767bd61SMark Peek     int  loop;
37086767bd61SMark Peek     Char *kp, *cp;
3709c80476e4SDavid E. O'Brien     Char temp;
3710c80476e4SDavid E. O'Brien     int	 size;
3711c80476e4SDavid E. O'Brien 
3712c80476e4SDavid E. O'Brien     USE(c);
3713c80476e4SDavid E. O'Brien     switch (UndoAction) {
3714c80476e4SDavid E. O'Brien     case TCSHOP_DELETE|TCSHOP_INSERT:
3715c80476e4SDavid E. O'Brien     case TCSHOP_DELETE:
3716c80476e4SDavid E. O'Brien 	if (UndoSize == 0) return(CC_NORM);
3717c80476e4SDavid E. O'Brien 	cp = UndoPtr;
3718c80476e4SDavid E. O'Brien 	kp = UndoBuf;
3719c80476e4SDavid E. O'Brien 	for (loop=0; loop < UndoSize; loop++)	/* copy the chars */
3720c80476e4SDavid E. O'Brien 	    *kp++ = *cp++;			/* into UndoBuf   */
3721c80476e4SDavid E. O'Brien 
3722c80476e4SDavid E. O'Brien 	for (cp = UndoPtr; cp <= LastChar; cp++)
3723c80476e4SDavid E. O'Brien 	    *cp = cp[UndoSize];
3724c80476e4SDavid E. O'Brien 
3725c80476e4SDavid E. O'Brien 	LastChar -= UndoSize;
3726c80476e4SDavid E. O'Brien 	Cursor   =  UndoPtr;
3727c80476e4SDavid E. O'Brien 
3728c80476e4SDavid E. O'Brien 	UndoAction = TCSHOP_INSERT;
3729c80476e4SDavid E. O'Brien 	break;
3730c80476e4SDavid E. O'Brien 
3731c80476e4SDavid E. O'Brien     case TCSHOP_INSERT:
3732c80476e4SDavid E. O'Brien 	if (UndoSize == 0) return(CC_NORM);
3733c80476e4SDavid E. O'Brien 	cp = UndoPtr;
3734c80476e4SDavid E. O'Brien 	Cursor = UndoPtr;
3735c80476e4SDavid E. O'Brien 	kp = UndoBuf;
3736c80476e4SDavid E. O'Brien 	c_insert(UndoSize);		/* open the space, */
3737c80476e4SDavid E. O'Brien 	for (loop = 0; loop < UndoSize; loop++)	/* copy the chars */
3738c80476e4SDavid E. O'Brien 	    *cp++ = *kp++;
3739c80476e4SDavid E. O'Brien 
3740c80476e4SDavid E. O'Brien 	UndoAction = TCSHOP_DELETE;
3741c80476e4SDavid E. O'Brien 	break;
3742c80476e4SDavid E. O'Brien 
3743c80476e4SDavid E. O'Brien     case TCSHOP_CHANGE:
3744c80476e4SDavid E. O'Brien 	if (UndoSize == 0) return(CC_NORM);
3745c80476e4SDavid E. O'Brien 	cp = UndoPtr;
3746c80476e4SDavid E. O'Brien 	Cursor = UndoPtr;
3747c80476e4SDavid E. O'Brien 	kp = UndoBuf;
3748c80476e4SDavid E. O'Brien 	size = (int)(Cursor-LastChar); /*  NOT NSL independant */
3749c80476e4SDavid E. O'Brien 	if (size < UndoSize)
3750c80476e4SDavid E. O'Brien 	    size = UndoSize;
3751c80476e4SDavid E. O'Brien 	for(loop = 0; loop < size; loop++) {
3752c80476e4SDavid E. O'Brien 	    temp = *kp;
3753c80476e4SDavid E. O'Brien 	    *kp++ = *cp;
3754c80476e4SDavid E. O'Brien 	    *cp++ = temp;
3755c80476e4SDavid E. O'Brien 	}
3756c80476e4SDavid E. O'Brien 	break;
3757c80476e4SDavid E. O'Brien 
3758c80476e4SDavid E. O'Brien     default:
3759c80476e4SDavid E. O'Brien 	return(CC_ERROR);
3760c80476e4SDavid E. O'Brien     }
3761c80476e4SDavid E. O'Brien 
3762c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3763c80476e4SDavid E. O'Brien }
3764c80476e4SDavid E. O'Brien 
3765c80476e4SDavid E. O'Brien /*ARGSUSED*/
3766c80476e4SDavid E. O'Brien CCRETVAL
376745e5710bSMark Peek v_ush_meta(Char c)
3768c80476e4SDavid E. O'Brien {
3769c80476e4SDavid E. O'Brien     USE(c);
3770c80476e4SDavid E. O'Brien     return v_search(F_UP_SEARCH_HIST);
3771c80476e4SDavid E. O'Brien }
3772c80476e4SDavid E. O'Brien 
3773c80476e4SDavid E. O'Brien /*ARGSUSED*/
3774c80476e4SDavid E. O'Brien CCRETVAL
377545e5710bSMark Peek v_dsh_meta(Char c)
3776c80476e4SDavid E. O'Brien {
3777c80476e4SDavid E. O'Brien     USE(c);
3778c80476e4SDavid E. O'Brien     return v_search(F_DOWN_SEARCH_HIST);
3779c80476e4SDavid E. O'Brien }
3780c80476e4SDavid E. O'Brien 
3781c80476e4SDavid E. O'Brien /*ARGSUSED*/
3782c80476e4SDavid E. O'Brien CCRETVAL
378345e5710bSMark Peek v_rsrch_fwd(Char c)
3784c80476e4SDavid E. O'Brien {
3785c80476e4SDavid E. O'Brien     USE(c);
378645e5710bSMark Peek     if (patbuf.len == 0) return(CC_ERROR);
3787c80476e4SDavid E. O'Brien     return(v_repeat_srch(searchdir));
3788c80476e4SDavid E. O'Brien }
3789c80476e4SDavid E. O'Brien 
3790c80476e4SDavid E. O'Brien /*ARGSUSED*/
3791c80476e4SDavid E. O'Brien CCRETVAL
379245e5710bSMark Peek v_rsrch_back(Char c)
3793c80476e4SDavid E. O'Brien {
3794c80476e4SDavid E. O'Brien     USE(c);
379545e5710bSMark Peek     if (patbuf.len == 0) return(CC_ERROR);
3796c80476e4SDavid E. O'Brien     return(v_repeat_srch(searchdir == F_UP_SEARCH_HIST ?
3797c80476e4SDavid E. O'Brien 			 F_DOWN_SEARCH_HIST : F_UP_SEARCH_HIST));
3798c80476e4SDavid E. O'Brien }
3799c80476e4SDavid E. O'Brien 
38003b6eaa7bSAndrey A. Chernov #ifndef WINNT_NATIVE
3801c80476e4SDavid E. O'Brien /* Since ed.defns.h  is generated from ed.defns.c, these empty
3802c80476e4SDavid E. O'Brien    functions will keep the F_NUM_FNS consistent
3803c80476e4SDavid E. O'Brien  */
3804c80476e4SDavid E. O'Brien CCRETVAL
380545e5710bSMark Peek e_copy_to_clipboard(Char c)
3806c80476e4SDavid E. O'Brien {
3807c80476e4SDavid E. O'Brien     USE(c);
3808c80476e4SDavid E. O'Brien     return CC_ERROR;
3809c80476e4SDavid E. O'Brien }
3810c80476e4SDavid E. O'Brien 
3811c80476e4SDavid E. O'Brien CCRETVAL
381245e5710bSMark Peek e_paste_from_clipboard(Char c)
3813c80476e4SDavid E. O'Brien {
3814c80476e4SDavid E. O'Brien     USE(c);
3815c80476e4SDavid E. O'Brien     return (CC_ERROR);
3816c80476e4SDavid E. O'Brien }
3817c80476e4SDavid E. O'Brien 
3818c80476e4SDavid E. O'Brien CCRETVAL
381945e5710bSMark Peek e_dosify_next(Char c)
3820c80476e4SDavid E. O'Brien {
3821c80476e4SDavid E. O'Brien     USE(c);
3822c80476e4SDavid E. O'Brien     return (CC_ERROR);
3823c80476e4SDavid E. O'Brien }
3824c80476e4SDavid E. O'Brien CCRETVAL
382545e5710bSMark Peek e_dosify_prev(Char c)
3826c80476e4SDavid E. O'Brien {
3827c80476e4SDavid E. O'Brien     USE(c);
3828c80476e4SDavid E. O'Brien     return (CC_ERROR);
3829c80476e4SDavid E. O'Brien }
3830c80476e4SDavid E. O'Brien CCRETVAL
383145e5710bSMark Peek e_page_up(Char c)
3832c80476e4SDavid E. O'Brien {
3833c80476e4SDavid E. O'Brien     USE(c);
3834c80476e4SDavid E. O'Brien     return (CC_ERROR);
3835c80476e4SDavid E. O'Brien }
3836c80476e4SDavid E. O'Brien CCRETVAL
383745e5710bSMark Peek e_page_down(Char c)
3838c80476e4SDavid E. O'Brien {
3839c80476e4SDavid E. O'Brien     USE(c);
3840c80476e4SDavid E. O'Brien     return (CC_ERROR);
3841c80476e4SDavid E. O'Brien }
38423b6eaa7bSAndrey A. Chernov #endif /* !WINNT_NATIVE */
3843c80476e4SDavid E. O'Brien 
3844c80476e4SDavid E. O'Brien #ifdef notdef
3845c80476e4SDavid E. O'Brien void
384645e5710bSMark Peek MoveCursor(int n)		/* move cursor + right - left char */
3847c80476e4SDavid E. O'Brien {
3848c80476e4SDavid E. O'Brien     Cursor = Cursor + n;
3849c80476e4SDavid E. O'Brien     if (Cursor < InputBuf)
3850c80476e4SDavid E. O'Brien 	Cursor = InputBuf;
3851c80476e4SDavid E. O'Brien     if (Cursor > LastChar)
3852c80476e4SDavid E. O'Brien 	Cursor = LastChar;
3853c80476e4SDavid E. O'Brien     return;
3854c80476e4SDavid E. O'Brien }
3855c80476e4SDavid E. O'Brien 
3856c80476e4SDavid E. O'Brien Char *
385745e5710bSMark Peek GetCursor(void)
3858c80476e4SDavid E. O'Brien {
3859c80476e4SDavid E. O'Brien     return(Cursor);
3860c80476e4SDavid E. O'Brien }
3861c80476e4SDavid E. O'Brien 
3862c80476e4SDavid E. O'Brien int
386345e5710bSMark Peek PutCursor(Char *p)
3864c80476e4SDavid E. O'Brien {
3865c80476e4SDavid E. O'Brien     if (p < InputBuf || p > LastChar)
3866c80476e4SDavid E. O'Brien 	return 1;		/* Error */
3867c80476e4SDavid E. O'Brien     Cursor = p;
3868c80476e4SDavid E. O'Brien     return 0;
3869c80476e4SDavid E. O'Brien }
3870c80476e4SDavid E. O'Brien #endif
3871