xref: /freebsd/contrib/tcsh/ed.chared.c (revision 55b903e2e024efd1270a2fe37f119a1547aef6aa)
119d2e3deSDmitry Chagin /* $Header: /p/tcsh/cvsroot/tcsh/ed.chared.c,v 3.103 2015/08/19 14:29:55 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 
7519d2e3deSDmitry Chagin RCSID("$tcsh: ed.chared.c,v 3.103 2015/08/19 14:29:55 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
9619d2e3deSDmitry Chagin #define C_CLASS_WORD	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 *);
123a15e6f9aSMark Peek static	int	 c_excl			(Char *);
124a15e6f9aSMark Peek static	int	 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  *
29319d2e3deSDmitry Chagin  * This is used to make the c_prev_word(), c_next_word() and c_eword() 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 
30819d2e3deSDmitry Chagin     if (isword(ch))
30919d2e3deSDmitry Chagin         return C_CLASS_WORD;
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 
5099ccc37e3SMark Peek 	if (HIST != '\0' && *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 '>!'
685a15e6f9aSMark Peek  * Returns number of expansions attempted (doesn't matter whether they succeeded
686a15e6f9aSMark Peek  * or not).
687c80476e4SDavid E. O'Brien  */
688c80476e4SDavid E. O'Brien 
689a15e6f9aSMark Peek static int
69045e5710bSMark Peek c_excl(Char *p)
691c80476e4SDavid E. O'Brien {
6926767bd61SMark Peek     int i;
6936767bd61SMark Peek     Char *q;
694a15e6f9aSMark Peek     int nr_exp;
695c80476e4SDavid E. O'Brien 
696c80476e4SDavid E. O'Brien     /*
697c80476e4SDavid E. O'Brien      * if />[SPC TAB]*![SPC TAB]/, back up p to just after the >. otherwise,
698c80476e4SDavid E. O'Brien      * back p up to just before the current word.
699c80476e4SDavid E. O'Brien      */
700c80476e4SDavid E. O'Brien     if ((p[1] == ' ' || p[1] == '\t') &&
701c80476e4SDavid E. O'Brien 	(p[-1] == ' ' || p[-1] == '\t' || p[-1] == '>')) {
702c80476e4SDavid E. O'Brien 	for (q = p - 1; q > InputBuf && (*q == ' ' || *q == '\t'); --q)
703c80476e4SDavid E. O'Brien 	    continue;
704c80476e4SDavid E. O'Brien 	if (*q == '>')
705c80476e4SDavid E. O'Brien 	    ++p;
706c80476e4SDavid E. O'Brien     }
707c80476e4SDavid E. O'Brien     else {
708c80476e4SDavid E. O'Brien 	while (*p != ' ' && *p != '\t' && p > InputBuf)
709c80476e4SDavid E. O'Brien 	    --p;
710c80476e4SDavid E. O'Brien     }
711c80476e4SDavid E. O'Brien 
712c80476e4SDavid E. O'Brien     /*
713c80476e4SDavid E. O'Brien      * Forever: Look for history char.  (Stop looking when we find the cursor.)
714a15e6f9aSMark Peek      * Count backslashes.  If odd, skip history char.  Expand if even number of
715a15e6f9aSMark Peek      * backslashes.
716c80476e4SDavid E. O'Brien      */
717a15e6f9aSMark Peek     nr_exp = 0;
718c80476e4SDavid E. O'Brien     for (;;) {
7199ccc37e3SMark Peek 	if (HIST != '\0')
720c80476e4SDavid E. O'Brien 	    while (*p != HIST && p < Cursor)
721c80476e4SDavid E. O'Brien 		++p;
722c80476e4SDavid E. O'Brien 	for (i = 1; (p - i) >= InputBuf && p[-i] == '\\'; i++)
723c80476e4SDavid E. O'Brien 	    continue;
724c80476e4SDavid E. O'Brien 	if (i % 2 == 0)
725c80476e4SDavid E. O'Brien 	    ++p;
726a15e6f9aSMark Peek 	if (p >= Cursor)   /* all done */
727a15e6f9aSMark Peek 	    return nr_exp;
728a15e6f9aSMark Peek 	if (i % 2 == 1) {
729c80476e4SDavid E. O'Brien 	    p = c_expand(p);
730a15e6f9aSMark Peek 	    ++nr_exp;
731c80476e4SDavid E. O'Brien 	}
732c80476e4SDavid E. O'Brien     }
733a15e6f9aSMark Peek }
734c80476e4SDavid E. O'Brien 
735a15e6f9aSMark Peek 
736a15e6f9aSMark Peek static int
73745e5710bSMark Peek c_substitute(void)
738c80476e4SDavid E. O'Brien {
7396767bd61SMark Peek     Char *p;
740a15e6f9aSMark Peek     int  nr_exp;
741c80476e4SDavid E. O'Brien 
742c80476e4SDavid E. O'Brien     /*
743c80476e4SDavid E. O'Brien      * Start p out one character before the cursor.  Move it backwards looking
744c80476e4SDavid E. O'Brien      * for white space, the beginning of the line, or a history character.
745c80476e4SDavid E. O'Brien      */
746c80476e4SDavid E. O'Brien     for (p = Cursor - 1;
7479ccc37e3SMark Peek 	 p > InputBuf && *p != ' ' && *p != '\t' && *p && *p != HIST; --p)
748c80476e4SDavid E. O'Brien 	continue;
749c80476e4SDavid E. O'Brien 
750c80476e4SDavid E. O'Brien     /*
751c80476e4SDavid E. O'Brien      * If we found a history character, go expand it.
752c80476e4SDavid E. O'Brien      */
753*55b903e2SDmitry Chagin     if (p >= InputBuf && HIST != '\0' && *p == HIST)
754a15e6f9aSMark Peek 	nr_exp = c_excl(p);
755a15e6f9aSMark Peek     else
756a15e6f9aSMark Peek         nr_exp = 0;
757c80476e4SDavid E. O'Brien     Refresh();
758a15e6f9aSMark Peek 
759a15e6f9aSMark Peek     return nr_exp;
760c80476e4SDavid E. O'Brien }
761c80476e4SDavid E. O'Brien 
762c80476e4SDavid E. O'Brien static void
76345e5710bSMark Peek c_delfini(void)		/* Finish up delete action */
764c80476e4SDavid E. O'Brien {
7656767bd61SMark Peek     int Size;
766c80476e4SDavid E. O'Brien 
767c80476e4SDavid E. O'Brien     if (ActionFlag & TCSHOP_INSERT)
768c80476e4SDavid E. O'Brien 	c_alternativ_key_map(0);
769c80476e4SDavid E. O'Brien 
770c80476e4SDavid E. O'Brien     ActionFlag = TCSHOP_NOP;
771c80476e4SDavid E. O'Brien 
772c80476e4SDavid E. O'Brien     if (ActionPos == 0)
773c80476e4SDavid E. O'Brien 	return;
774c80476e4SDavid E. O'Brien 
775c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_INSERT;
776c80476e4SDavid E. O'Brien 
777c80476e4SDavid E. O'Brien     if (Cursor > ActionPos) {
778c80476e4SDavid E. O'Brien 	Size = (int) (Cursor-ActionPos);
779c80476e4SDavid E. O'Brien 	c_delbefore(Size);
780c80476e4SDavid E. O'Brien 	RefCursor();
781c80476e4SDavid E. O'Brien     }
782c80476e4SDavid E. O'Brien     else if (Cursor < ActionPos) {
783c80476e4SDavid E. O'Brien 	Size = (int)(ActionPos-Cursor);
784c80476e4SDavid E. O'Brien 	c_delafter(Size);
785c80476e4SDavid E. O'Brien     }
786c80476e4SDavid E. O'Brien     else  {
787c80476e4SDavid E. O'Brien 	Size = 1;
788c80476e4SDavid E. O'Brien 	c_delafter(Size);
789c80476e4SDavid E. O'Brien     }
790c80476e4SDavid E. O'Brien     UndoPtr = Cursor;
791c80476e4SDavid E. O'Brien     UndoSize = Size;
792c80476e4SDavid E. O'Brien }
793c80476e4SDavid E. O'Brien 
794c80476e4SDavid E. O'Brien static Char *
79545e5710bSMark Peek c_endword(Char *p, Char *high, int n, Char *delim)
796c80476e4SDavid E. O'Brien {
79723338178SMark Peek     Char inquote = 0;
798c80476e4SDavid E. O'Brien     p++;
799c80476e4SDavid E. O'Brien 
800c80476e4SDavid E. O'Brien     while (n--) {
8016767bd61SMark Peek         while (p < high) {	/* Skip non-word chars */
8026767bd61SMark Peek 	  if (!Strchr(delim, *p) || *(p-1) == (Char)'\\')
803c80476e4SDavid E. O'Brien 	    break;
804c80476e4SDavid E. O'Brien 	  p++;
805c80476e4SDavid E. O'Brien         }
806c80476e4SDavid E. O'Brien 	while (p < high) {	/* Skip string */
807c80476e4SDavid E. O'Brien 	  if ((*p == (Char)'\'' || *p == (Char)'"')) { /* Quotation marks? */
8086767bd61SMark Peek 	    if (inquote || *(p-1) != (Char)'\\') { /* Should it be honored? */
809c80476e4SDavid E. O'Brien 	      if (inquote == 0) inquote = *p;
810c80476e4SDavid E. O'Brien 	      else if (inquote == *p) inquote = 0;
811c80476e4SDavid E. O'Brien 	    }
812c80476e4SDavid E. O'Brien 	  }
8136767bd61SMark Peek 	  /* Break if unquoted non-word char */
8146767bd61SMark Peek 	  if (!inquote && Strchr(delim, *p) && *(p-1) != (Char)'\\')
815c80476e4SDavid E. O'Brien 	    break;
816c80476e4SDavid E. O'Brien 	  p++;
817c80476e4SDavid E. O'Brien 	}
818c80476e4SDavid E. O'Brien     }
819c80476e4SDavid E. O'Brien 
820c80476e4SDavid E. O'Brien     p--;
821c80476e4SDavid E. O'Brien     return(p);
822c80476e4SDavid E. O'Brien }
823c80476e4SDavid E. O'Brien 
824c80476e4SDavid E. O'Brien 
825c80476e4SDavid E. O'Brien static Char *
82645e5710bSMark Peek c_eword(Char *p, Char *high, int n)
827c80476e4SDavid E. O'Brien {
828c80476e4SDavid E. O'Brien     p++;
829c80476e4SDavid E. O'Brien 
830c80476e4SDavid E. O'Brien     while (n--) {
83119d2e3deSDmitry Chagin         int  c_class;
83219d2e3deSDmitry Chagin 
83319d2e3deSDmitry Chagin         if (p >= high)
83419d2e3deSDmitry Chagin             break;
83519d2e3deSDmitry Chagin 
83619d2e3deSDmitry Chagin         /* scan until end of current word (may be all whitespace!) */
83719d2e3deSDmitry Chagin         c_class = c_to_class(*p);
83819d2e3deSDmitry Chagin         while ((p < high) && c_class == c_to_class(*p))
839c80476e4SDavid E. O'Brien             p++;
840c80476e4SDavid E. O'Brien 
84119d2e3deSDmitry Chagin         /* if this was a non_whitespace word, we're ready */
84219d2e3deSDmitry Chagin         if (c_class != C_CLASS_WHITE)
84319d2e3deSDmitry Chagin             continue;
84419d2e3deSDmitry Chagin 
84519d2e3deSDmitry Chagin         /* otherwise, move to the end of the word just found */
84619d2e3deSDmitry Chagin         c_class = c_to_class(*p);
84719d2e3deSDmitry Chagin         while ((p < high) && c_class == c_to_class(*p))
848c80476e4SDavid E. O'Brien             p++;
849c80476e4SDavid E. O'Brien     }
850c80476e4SDavid E. O'Brien 
851c80476e4SDavid E. O'Brien     p--;
852c80476e4SDavid E. O'Brien     return(p);
853c80476e4SDavid E. O'Brien }
854c80476e4SDavid E. O'Brien 
8556767bd61SMark Peek /* Set the max length of the kill ring */
8566767bd61SMark Peek void
85745e5710bSMark Peek SetKillRing(int max)
8586767bd61SMark Peek {
8596767bd61SMark Peek     CStr *new;
8606767bd61SMark Peek     int count, i, j;
8616767bd61SMark Peek 
8626767bd61SMark Peek     if (max < 1)
8636767bd61SMark Peek 	max = 1;		/* no ring, but always one buffer */
8646767bd61SMark Peek     if (max == KillRingMax)
8656767bd61SMark Peek 	return;
86645e5710bSMark Peek     new = xcalloc(max, sizeof(CStr));
8676767bd61SMark Peek     if (KillRing != NULL) {
8686767bd61SMark Peek 	if (KillRingLen != 0) {
8696767bd61SMark Peek 	    if (max >= KillRingLen) {
8706767bd61SMark Peek 		count = KillRingLen;
8716767bd61SMark Peek 		j = KillPos;
8726767bd61SMark Peek 	    } else {
8736767bd61SMark Peek 		count = max;
8746767bd61SMark Peek 		j = (KillPos - count + KillRingLen) % KillRingLen;
8756767bd61SMark Peek 	    }
8766767bd61SMark Peek 	    for (i = 0; i < KillRingLen; i++) {
8776767bd61SMark Peek 		if (i < count)	/* copy latest */
8786767bd61SMark Peek 		    new[i] = KillRing[j];
8796767bd61SMark Peek 		else		/* free the others */
8806767bd61SMark Peek 		    xfree(KillRing[j].buf);
8816767bd61SMark Peek 		j = (j + 1) % KillRingLen;
8826767bd61SMark Peek 	    }
8836767bd61SMark Peek 	    KillRingLen = count;
8846767bd61SMark Peek 	    KillPos = count % max;
8856767bd61SMark Peek 	    YankPos = count - 1;
8866767bd61SMark Peek 	}
8876767bd61SMark Peek 	xfree(KillRing);
8886767bd61SMark Peek     }
8896767bd61SMark Peek     KillRing = new;
8906767bd61SMark Peek     KillRingMax = max;
8916767bd61SMark Peek }
8926767bd61SMark Peek 
8936767bd61SMark Peek /* Push string from start upto (but not including) end onto kill ring */
8946767bd61SMark Peek static void
89545e5710bSMark Peek c_push_kill(Char *start, Char *end)
8966767bd61SMark Peek {
8976767bd61SMark Peek     CStr save, *pos;
8986767bd61SMark Peek     Char *dp, *cp, *kp;
8996767bd61SMark Peek     int len = end - start, i, j, k;
9006767bd61SMark Peek 
9016767bd61SMark Peek     /* Check for duplicates? */
9026767bd61SMark Peek     if (KillRingLen > 0 && (dp = varval(STRkilldup)) != STRNULL) {
9036767bd61SMark Peek 	YankPos = (KillPos - 1 + KillRingLen) % KillRingLen;
9046767bd61SMark Peek 	if (eq(dp, STRerase)) {	/* erase earlier one (actually move up) */
9056767bd61SMark Peek 	    j = YankPos;
9066767bd61SMark Peek 	    for (i = 0; i < KillRingLen; i++) {
9076767bd61SMark Peek 		if (Strncmp(KillRing[j].buf, start, (size_t) len) == 0 &&
9086767bd61SMark Peek 		    KillRing[j].buf[len] == '\0') {
9096767bd61SMark Peek 		    save = KillRing[j];
9106767bd61SMark Peek 		    for ( ; i > 0; i--) {
9116767bd61SMark Peek 			k = j;
9126767bd61SMark Peek 			j = (j + 1) % KillRingLen;
9136767bd61SMark Peek 			KillRing[k] = KillRing[j];
9146767bd61SMark Peek 		    }
9156767bd61SMark Peek 		    KillRing[j] = save;
9166767bd61SMark Peek 		    return;
9176767bd61SMark Peek 		}
9186767bd61SMark Peek 		j = (j - 1 + KillRingLen) % KillRingLen;
9196767bd61SMark Peek 	    }
9206767bd61SMark Peek 	} else if (eq(dp, STRall)) { /* skip if any earlier */
9216767bd61SMark Peek 	    for (i = 0; i < KillRingLen; i++)
9226767bd61SMark Peek 		if (Strncmp(KillRing[i].buf, start, (size_t) len) == 0 &&
9236767bd61SMark Peek 		    KillRing[i].buf[len] == '\0')
9246767bd61SMark Peek 		    return;
9256767bd61SMark Peek 	} else if (eq(dp, STRprev)) { /* skip if immediately previous */
9266767bd61SMark Peek 	    j = YankPos;
9276767bd61SMark Peek 	    if (Strncmp(KillRing[j].buf, start, (size_t) len) == 0 &&
9286767bd61SMark Peek 		KillRing[j].buf[len] == '\0')
9296767bd61SMark Peek 		return;
9306767bd61SMark Peek 	}
9316767bd61SMark Peek     }
9326767bd61SMark Peek 
9336767bd61SMark Peek     /* No duplicate, go ahead and push */
9346767bd61SMark Peek     len++;			/* need space for '\0' */
9356767bd61SMark Peek     YankPos = KillPos;
9366767bd61SMark Peek     if (KillRingLen < KillRingMax)
9376767bd61SMark Peek 	KillRingLen++;
9386767bd61SMark Peek     pos = &KillRing[KillPos];
9396767bd61SMark Peek     KillPos = (KillPos + 1) % KillRingMax;
9406767bd61SMark Peek     if (pos->len < len) {
94145e5710bSMark Peek 	pos->buf = xrealloc(pos->buf, len * sizeof(Char));
9426767bd61SMark Peek 	pos->len = len;
9436767bd61SMark Peek     }
9446767bd61SMark Peek     cp = start;
9456767bd61SMark Peek     kp = pos->buf;
9466767bd61SMark Peek     while (cp < end)
9476767bd61SMark Peek 	*kp++ = *cp++;
9486767bd61SMark Peek     *kp = '\0';
9496767bd61SMark Peek }
9506767bd61SMark Peek 
95145e5710bSMark Peek /* Save InputBuf etc in SavedBuf etc for restore after cmd exec */
95245e5710bSMark Peek static void
95319d2e3deSDmitry Chagin c_save_inputbuf(void)
95445e5710bSMark Peek {
95545e5710bSMark Peek     SavedBuf.len = 0;
95645e5710bSMark Peek     Strbuf_append(&SavedBuf, InputBuf);
95745e5710bSMark Peek     Strbuf_terminate(&SavedBuf);
95845e5710bSMark Peek     LastSaved = LastChar - InputBuf;
95945e5710bSMark Peek     CursSaved = Cursor - InputBuf;
96045e5710bSMark Peek     HistSaved = Hist_num;
96145e5710bSMark Peek     RestoreSaved = 1;
96245e5710bSMark Peek }
96345e5710bSMark Peek 
96445e5710bSMark Peek CCRETVAL
96519d2e3deSDmitry Chagin GetHistLine(void)
966c80476e4SDavid E. O'Brien {
967c80476e4SDavid E. O'Brien     struct Hist *hp;
968c80476e4SDavid E. O'Brien     int     h;
969c80476e4SDavid E. O'Brien 
970c80476e4SDavid E. O'Brien     if (Hist_num == 0) {	/* if really the current line */
97145e5710bSMark Peek 	if (HistBuf.s != NULL)
97245e5710bSMark Peek 	    copyn(InputBuf, HistBuf.s, INBUFSIZE);/*FIXBUF*/
97345e5710bSMark Peek 	else
97445e5710bSMark Peek 	    *InputBuf = '\0';
97545e5710bSMark Peek 	LastChar = InputBuf + HistBuf.len;
976c80476e4SDavid E. O'Brien 
977c80476e4SDavid E. O'Brien #ifdef KSHVI
978c80476e4SDavid E. O'Brien     if (VImode)
979c80476e4SDavid E. O'Brien 	Cursor = InputBuf;
980c80476e4SDavid E. O'Brien     else
981c80476e4SDavid E. O'Brien #endif /* KSHVI */
982c80476e4SDavid E. O'Brien 	Cursor = LastChar;
983c80476e4SDavid E. O'Brien 
984c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
985c80476e4SDavid E. O'Brien     }
986c80476e4SDavid E. O'Brien 
987c80476e4SDavid E. O'Brien     hp = Histlist.Hnext;
988c80476e4SDavid E. O'Brien     if (hp == NULL)
989c80476e4SDavid E. O'Brien 	return(CC_ERROR);
990c80476e4SDavid E. O'Brien 
991c80476e4SDavid E. O'Brien     for (h = 1; h < Hist_num; h++) {
992c80476e4SDavid E. O'Brien 	if ((hp->Hnext) == NULL) {
993c80476e4SDavid E. O'Brien 	    Hist_num = h;
994c80476e4SDavid E. O'Brien 	    return(CC_ERROR);
995c80476e4SDavid E. O'Brien 	}
996c80476e4SDavid E. O'Brien 	hp = hp->Hnext;
997c80476e4SDavid E. O'Brien     }
998c80476e4SDavid E. O'Brien 
999c80476e4SDavid E. O'Brien     if (HistLit && hp->histline) {
100045e5710bSMark Peek 	copyn(InputBuf, hp->histline, INBUFSIZE);/*FIXBUF*/
1001c80476e4SDavid E. O'Brien 	CurrentHistLit = 1;
1002c80476e4SDavid E. O'Brien     }
1003c80476e4SDavid E. O'Brien     else {
100445e5710bSMark Peek 	Char *p;
100545e5710bSMark Peek 
100645e5710bSMark Peek 	p = sprlex(&hp->Hlex);
100745e5710bSMark Peek 	copyn(InputBuf, p, sizeof(InputBuf) / sizeof(Char));/*FIXBUF*/
100845e5710bSMark Peek 	xfree(p);
1009c80476e4SDavid E. O'Brien 	CurrentHistLit = 0;
1010c80476e4SDavid E. O'Brien     }
101145e5710bSMark Peek     LastChar = Strend(InputBuf);
1012c80476e4SDavid E. O'Brien 
1013c80476e4SDavid E. O'Brien     if (LastChar > InputBuf) {
1014c80476e4SDavid E. O'Brien 	if (LastChar[-1] == '\n')
1015c80476e4SDavid E. O'Brien 	    LastChar--;
1016c80476e4SDavid E. O'Brien #if 0
1017c80476e4SDavid E. O'Brien 	if (LastChar[-1] == ' ')
1018c80476e4SDavid E. O'Brien 	    LastChar--;
1019c80476e4SDavid E. O'Brien #endif
1020c80476e4SDavid E. O'Brien 	if (LastChar < InputBuf)
1021c80476e4SDavid E. O'Brien 	    LastChar = InputBuf;
1022c80476e4SDavid E. O'Brien     }
1023c80476e4SDavid E. O'Brien 
1024c80476e4SDavid E. O'Brien #ifdef KSHVI
1025c80476e4SDavid E. O'Brien     if (VImode)
1026c80476e4SDavid E. O'Brien 	Cursor = InputBuf;
1027c80476e4SDavid E. O'Brien     else
1028c80476e4SDavid E. O'Brien #endif /* KSHVI */
1029c80476e4SDavid E. O'Brien 	Cursor = LastChar;
1030c80476e4SDavid E. O'Brien 
1031c80476e4SDavid E. O'Brien     return(CC_REFRESH);
1032c80476e4SDavid E. O'Brien }
1033c80476e4SDavid E. O'Brien 
1034c80476e4SDavid E. O'Brien static CCRETVAL
103545e5710bSMark Peek c_search_line(Char *pattern, int dir)
1036c80476e4SDavid E. O'Brien {
1037c80476e4SDavid E. O'Brien     Char *cp;
103845e5710bSMark Peek     size_t len;
1039c80476e4SDavid E. O'Brien 
104045e5710bSMark Peek     len = Strlen(pattern);
1041c80476e4SDavid E. O'Brien 
1042c80476e4SDavid E. O'Brien     if (dir == F_UP_SEARCH_HIST) {
1043c80476e4SDavid E. O'Brien 	for (cp = Cursor; cp >= InputBuf; cp--)
104445e5710bSMark Peek 	    if (Strncmp(cp, pattern, len) == 0 ||
1045c80476e4SDavid E. O'Brien 		Gmatch(cp, pattern)) {
1046c80476e4SDavid E. O'Brien 		Cursor = cp;
1047c80476e4SDavid E. O'Brien 		return(CC_NORM);
1048c80476e4SDavid E. O'Brien 	    }
1049c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1050c80476e4SDavid E. O'Brien     } else {
1051c80476e4SDavid E. O'Brien 	for (cp = Cursor; *cp != '\0' && cp < InputLim; cp++)
105245e5710bSMark Peek 	    if (Strncmp(cp, pattern, len) == 0 ||
1053c80476e4SDavid E. O'Brien 		Gmatch(cp, pattern)) {
1054c80476e4SDavid E. O'Brien 		Cursor = cp;
1055c80476e4SDavid E. O'Brien 		return(CC_NORM);
1056c80476e4SDavid E. O'Brien 	    }
1057c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1058c80476e4SDavid E. O'Brien     }
1059c80476e4SDavid E. O'Brien }
1060c80476e4SDavid E. O'Brien 
1061c80476e4SDavid E. O'Brien static CCRETVAL
106245e5710bSMark Peek e_inc_search(int dir)
1063c80476e4SDavid E. O'Brien {
106445e5710bSMark Peek     static const Char STRfwd[] = { 'f', 'w', 'd', '\0' },
1065c80476e4SDavid E. O'Brien 		      STRbck[] = { 'b', 'c', 'k', '\0' };
1066c80476e4SDavid E. O'Brien     static Char pchar = ':';	/* ':' = normal, '?' = failed */
1067c80476e4SDavid E. O'Brien     static Char endcmd[2];
106845e5710bSMark Peek     const Char *cp;
106945e5710bSMark Peek     Char ch,
1070c80476e4SDavid E. O'Brien 	*oldCursor = Cursor,
1071c80476e4SDavid E. O'Brien 	oldpchar = pchar;
1072c80476e4SDavid E. O'Brien     CCRETVAL ret = CC_NORM;
1073c80476e4SDavid E. O'Brien     int oldHist_num = Hist_num,
107445e5710bSMark Peek 	oldpatlen = patbuf.len,
1075c80476e4SDavid E. O'Brien 	newdir = dir,
1076c80476e4SDavid E. O'Brien         done, redo;
1077c80476e4SDavid E. O'Brien 
107845e5710bSMark Peek     if (LastChar + sizeof(STRfwd)/sizeof(Char) + 2 + patbuf.len >= InputLim)
1079c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1080c80476e4SDavid E. O'Brien 
1081c80476e4SDavid E. O'Brien     for (;;) {
1082c80476e4SDavid E. O'Brien 
108345e5710bSMark Peek 	if (patbuf.len == 0) {	/* first round */
1084c80476e4SDavid E. O'Brien 	    pchar = ':';
108545e5710bSMark Peek 	    Strbuf_append1(&patbuf, '*');
1086c80476e4SDavid E. O'Brien 	}
1087c80476e4SDavid E. O'Brien 	done = redo = 0;
1088c80476e4SDavid E. O'Brien 	*LastChar++ = '\n';
1089c80476e4SDavid E. O'Brien 	for (cp = newdir == F_UP_SEARCH_HIST ? STRbck : STRfwd;
1090c80476e4SDavid E. O'Brien 	     *cp; *LastChar++ = *cp++)
1091c80476e4SDavid E. O'Brien 	    continue;
1092c80476e4SDavid E. O'Brien 	*LastChar++ = pchar;
109345e5710bSMark Peek 	for (cp = &patbuf.s[1]; cp < &patbuf.s[patbuf.len];
109445e5710bSMark Peek 	     *LastChar++ = *cp++)
1095c80476e4SDavid E. O'Brien 	    continue;
1096c80476e4SDavid E. O'Brien 	*LastChar = '\0';
109745e5710bSMark Peek 	if (adrof(STRhighlight) && pchar == ':') {
109845e5710bSMark Peek 	    /* if the no-glob-search patch is applied, remove the - 1 below */
109945e5710bSMark Peek 	    IncMatchLen = patbuf.len - 1;
110045e5710bSMark Peek 	    ClearLines();
110145e5710bSMark Peek 	    ClearDisp();
110245e5710bSMark Peek 	}
1103c80476e4SDavid E. O'Brien 	Refresh();
1104c80476e4SDavid E. O'Brien 
1105c80476e4SDavid E. O'Brien 	if (GetNextChar(&ch) != 1)
1106c80476e4SDavid E. O'Brien 	    return(e_send_eof(0));
1107c80476e4SDavid E. O'Brien 
110823338178SMark Peek 	switch (ch > NT_NUM_KEYS
110923338178SMark Peek 		? F_INSERT : CurrentKeyMap[(unsigned char) ch]) {
1110c80476e4SDavid E. O'Brien 	case F_INSERT:
1111c80476e4SDavid E. O'Brien 	case F_DIGIT:
1112c80476e4SDavid E. O'Brien 	case F_MAGIC_SPACE:
111345e5710bSMark Peek 	    if (LastChar + 1 >= InputLim) /*FIXBUF*/
1114c80476e4SDavid E. O'Brien 		SoundBeep();
1115c80476e4SDavid E. O'Brien 	    else {
111645e5710bSMark Peek 		Strbuf_append1(&patbuf, ch);
1117c80476e4SDavid E. O'Brien 		*LastChar++ = ch;
1118c80476e4SDavid E. O'Brien 		*LastChar = '\0';
1119c80476e4SDavid E. O'Brien 		Refresh();
1120c80476e4SDavid E. O'Brien 	    }
1121c80476e4SDavid E. O'Brien 	    break;
1122c80476e4SDavid E. O'Brien 
1123c80476e4SDavid E. O'Brien 	case F_INC_FWD:
1124c80476e4SDavid E. O'Brien 	    newdir = F_DOWN_SEARCH_HIST;
1125c80476e4SDavid E. O'Brien 	    redo++;
1126c80476e4SDavid E. O'Brien 	    break;
1127c80476e4SDavid E. O'Brien 
1128c80476e4SDavid E. O'Brien 	case F_INC_BACK:
1129c80476e4SDavid E. O'Brien 	    newdir = F_UP_SEARCH_HIST;
1130c80476e4SDavid E. O'Brien 	    redo++;
1131c80476e4SDavid E. O'Brien 	    break;
1132c80476e4SDavid E. O'Brien 
1133c80476e4SDavid E. O'Brien 	case F_DELPREV:
113445e5710bSMark Peek 	    if (patbuf.len > 1)
1135c80476e4SDavid E. O'Brien 		done++;
1136c80476e4SDavid E. O'Brien 	    else
1137c80476e4SDavid E. O'Brien 		SoundBeep();
1138c80476e4SDavid E. O'Brien 	    break;
1139c80476e4SDavid E. O'Brien 
1140c80476e4SDavid E. O'Brien 	default:
114145e5710bSMark Peek 	    switch (ASC(ch)) {
1142c80476e4SDavid E. O'Brien 	    case 0007:		/* ^G: Abort */
1143c80476e4SDavid E. O'Brien 		ret = CC_ERROR;
1144c80476e4SDavid E. O'Brien 		done++;
1145c80476e4SDavid E. O'Brien 		break;
1146c80476e4SDavid E. O'Brien 
1147c80476e4SDavid E. O'Brien 	    case 0027:		/* ^W: Append word */
1148c80476e4SDavid E. O'Brien 		/* No can do if globbing characters in pattern */
114945e5710bSMark Peek 		for (cp = &patbuf.s[1]; ; cp++)
115045e5710bSMark Peek 		    if (cp >= &patbuf.s[patbuf.len]) {
115145e5710bSMark Peek 			Cursor += patbuf.len - 1;
1152c80476e4SDavid E. O'Brien 			cp = c_next_word(Cursor, LastChar, 1);
1153c80476e4SDavid E. O'Brien 			while (Cursor < cp && *Cursor != '\n') {
115445e5710bSMark Peek 			    if (LastChar + 1 >= InputLim) {/*FIXBUF*/
1155c80476e4SDavid E. O'Brien 				SoundBeep();
1156c80476e4SDavid E. O'Brien 				break;
1157c80476e4SDavid E. O'Brien 			    }
115845e5710bSMark Peek 			    Strbuf_append1(&patbuf, *Cursor);
1159c80476e4SDavid E. O'Brien 			    *LastChar++ = *Cursor++;
1160c80476e4SDavid E. O'Brien 			}
1161c80476e4SDavid E. O'Brien 			Cursor = oldCursor;
1162c80476e4SDavid E. O'Brien 			*LastChar = '\0';
1163c80476e4SDavid E. O'Brien 			Refresh();
1164c80476e4SDavid E. O'Brien 			break;
1165c80476e4SDavid E. O'Brien 		    } else if (isglob(*cp)) {
1166c80476e4SDavid E. O'Brien 			SoundBeep();
1167c80476e4SDavid E. O'Brien 			break;
1168c80476e4SDavid E. O'Brien 		    }
1169c80476e4SDavid E. O'Brien 		break;
1170c80476e4SDavid E. O'Brien 
1171c80476e4SDavid E. O'Brien 	    default:		/* Terminate and execute cmd */
1172c80476e4SDavid E. O'Brien 		endcmd[0] = ch;
1173c80476e4SDavid E. O'Brien 		PushMacro(endcmd);
1174c80476e4SDavid E. O'Brien 		/*FALLTHROUGH*/
1175c80476e4SDavid E. O'Brien 
1176c80476e4SDavid E. O'Brien 	    case 0033:		/* ESC: Terminate */
1177c80476e4SDavid E. O'Brien 		ret = CC_REFRESH;
1178c80476e4SDavid E. O'Brien 		done++;
1179c80476e4SDavid E. O'Brien 		break;
1180c80476e4SDavid E. O'Brien 	    }
1181c80476e4SDavid E. O'Brien 	    break;
1182c80476e4SDavid E. O'Brien 	}
1183c80476e4SDavid E. O'Brien 
1184c80476e4SDavid E. O'Brien 	while (LastChar > InputBuf && *LastChar != '\n')
1185c80476e4SDavid E. O'Brien 	    *LastChar-- = '\0';
1186c80476e4SDavid E. O'Brien 	*LastChar = '\0';
1187c80476e4SDavid E. O'Brien 
1188c80476e4SDavid E. O'Brien 	if (!done) {
1189c80476e4SDavid E. O'Brien 
1190c80476e4SDavid E. O'Brien 	    /* Can't search if unmatched '[' */
119145e5710bSMark Peek 	    for (cp = &patbuf.s[patbuf.len - 1], ch = ']'; cp > patbuf.s; cp--)
1192c80476e4SDavid E. O'Brien 		if (*cp == '[' || *cp == ']') {
1193c80476e4SDavid E. O'Brien 		    ch = *cp;
1194c80476e4SDavid E. O'Brien 		    break;
1195c80476e4SDavid E. O'Brien 		}
1196c80476e4SDavid E. O'Brien 
119745e5710bSMark Peek 	    if (patbuf.len > 1 && ch != '[') {
1198c80476e4SDavid E. O'Brien 		if (redo && newdir == dir) {
1199c80476e4SDavid E. O'Brien 		    if (pchar == '?') {	/* wrap around */
120045e5710bSMark Peek 			Hist_num = newdir == F_UP_SEARCH_HIST ? 0 : INT_MAX;
120145e5710bSMark Peek 			if (GetHistLine() == CC_ERROR)
1202c80476e4SDavid E. O'Brien 			    /* Hist_num was fixed by first call */
120345e5710bSMark Peek 			    (void) GetHistLine();
1204c80476e4SDavid E. O'Brien 			Cursor = newdir == F_UP_SEARCH_HIST ?
1205c80476e4SDavid E. O'Brien 			    LastChar : InputBuf;
1206c80476e4SDavid E. O'Brien 		    } else
1207c80476e4SDavid E. O'Brien 			Cursor += newdir == F_UP_SEARCH_HIST ? -1 : 1;
1208c80476e4SDavid E. O'Brien 		}
120945e5710bSMark Peek 		Strbuf_append1(&patbuf, '*');
121045e5710bSMark Peek 		Strbuf_terminate(&patbuf);
1211c80476e4SDavid E. O'Brien 		if (Cursor < InputBuf || Cursor > LastChar ||
121245e5710bSMark Peek 		    (ret = c_search_line(&patbuf.s[1], newdir)) == CC_ERROR) {
1213c80476e4SDavid E. O'Brien 		    LastCmd = (KEYCMD) newdir; /* avoid c_hsetpat */
1214c80476e4SDavid E. O'Brien 		    ret = newdir == F_UP_SEARCH_HIST ?
1215c80476e4SDavid E. O'Brien 			e_up_search_hist(0) : e_down_search_hist(0);
1216c80476e4SDavid E. O'Brien 		    if (ret != CC_ERROR) {
1217c80476e4SDavid E. O'Brien 			Cursor = newdir == F_UP_SEARCH_HIST ?
1218c80476e4SDavid E. O'Brien 			    LastChar : InputBuf;
121945e5710bSMark Peek 			(void) c_search_line(&patbuf.s[1], newdir);
1220c80476e4SDavid E. O'Brien 		    }
1221c80476e4SDavid E. O'Brien 		}
122245e5710bSMark Peek 		patbuf.s[--patbuf.len] = '\0';
1223c80476e4SDavid E. O'Brien 		if (ret == CC_ERROR) {
1224c80476e4SDavid E. O'Brien 		    SoundBeep();
1225c80476e4SDavid E. O'Brien 		    if (Hist_num != oldHist_num) {
1226c80476e4SDavid E. O'Brien 			Hist_num = oldHist_num;
122745e5710bSMark Peek 			if (GetHistLine() == CC_ERROR)
1228c80476e4SDavid E. O'Brien 			    return(CC_ERROR);
1229c80476e4SDavid E. O'Brien 		    }
1230c80476e4SDavid E. O'Brien 		    Cursor = oldCursor;
1231c80476e4SDavid E. O'Brien 		    pchar = '?';
1232c80476e4SDavid E. O'Brien 		} else {
1233c80476e4SDavid E. O'Brien 		    pchar = ':';
1234c80476e4SDavid E. O'Brien 		}
1235c80476e4SDavid E. O'Brien 	    }
1236c80476e4SDavid E. O'Brien 
1237c80476e4SDavid E. O'Brien 	    ret = e_inc_search(newdir);
1238c80476e4SDavid E. O'Brien 
1239c80476e4SDavid E. O'Brien 	    if (ret == CC_ERROR && pchar == '?' && oldpchar == ':') {
1240c80476e4SDavid E. O'Brien 		/* break abort of failed search at last non-failed */
1241c80476e4SDavid E. O'Brien 		ret = CC_NORM;
1242c80476e4SDavid E. O'Brien 	    }
1243c80476e4SDavid E. O'Brien 
1244c80476e4SDavid E. O'Brien 	}
1245c80476e4SDavid E. O'Brien 
1246c80476e4SDavid E. O'Brien 	if (ret == CC_NORM || (ret == CC_ERROR && oldpatlen == 0)) {
1247c80476e4SDavid E. O'Brien 	    /* restore on normal return or error exit */
1248c80476e4SDavid E. O'Brien 	    pchar = oldpchar;
124945e5710bSMark Peek 	    patbuf.len = oldpatlen;
1250c80476e4SDavid E. O'Brien 	    if (Hist_num != oldHist_num) {
1251c80476e4SDavid E. O'Brien 		Hist_num = oldHist_num;
125245e5710bSMark Peek 		if (GetHistLine() == CC_ERROR)
1253c80476e4SDavid E. O'Brien 		    return(CC_ERROR);
1254c80476e4SDavid E. O'Brien 	    }
1255c80476e4SDavid E. O'Brien 	    Cursor = oldCursor;
1256c80476e4SDavid E. O'Brien 	    if (ret == CC_ERROR)
1257c80476e4SDavid E. O'Brien 		Refresh();
1258c80476e4SDavid E. O'Brien 	}
1259c80476e4SDavid E. O'Brien 	if (done || ret != CC_NORM)
1260c80476e4SDavid E. O'Brien 	    return(ret);
1261c80476e4SDavid E. O'Brien 
1262c80476e4SDavid E. O'Brien     }
1263c80476e4SDavid E. O'Brien 
1264c80476e4SDavid E. O'Brien }
1265c80476e4SDavid E. O'Brien 
1266c80476e4SDavid E. O'Brien static CCRETVAL
126745e5710bSMark Peek v_search(int dir)
1268c80476e4SDavid E. O'Brien {
126945e5710bSMark Peek     struct Strbuf tmpbuf = Strbuf_INIT;
1270c80476e4SDavid E. O'Brien     Char ch;
127145e5710bSMark Peek     Char *oldbuf;
1272c80476e4SDavid E. O'Brien     Char *oldlc, *oldc;
1273c80476e4SDavid E. O'Brien 
127445e5710bSMark Peek     cleanup_push(&tmpbuf, Strbuf_cleanup);
127545e5710bSMark Peek     oldbuf = Strsave(InputBuf);
127645e5710bSMark Peek     cleanup_push(oldbuf, xfree);
1277c80476e4SDavid E. O'Brien     oldlc = LastChar;
1278c80476e4SDavid E. O'Brien     oldc = Cursor;
127945e5710bSMark Peek     Strbuf_append1(&tmpbuf, '*');
1280c80476e4SDavid E. O'Brien 
1281c80476e4SDavid E. O'Brien     InputBuf[0] = '\0';
1282c80476e4SDavid E. O'Brien     LastChar = InputBuf;
1283c80476e4SDavid E. O'Brien     Cursor = InputBuf;
1284c80476e4SDavid E. O'Brien     searchdir = dir;
1285c80476e4SDavid E. O'Brien 
1286c80476e4SDavid E. O'Brien     c_insert(2);	/* prompt + '\n' */
1287c80476e4SDavid E. O'Brien     *Cursor++ = '\n';
1288c80476e4SDavid E. O'Brien     *Cursor++ = dir == F_UP_SEARCH_HIST ? '?' : '/';
1289c80476e4SDavid E. O'Brien     Refresh();
1290c80476e4SDavid E. O'Brien     for (ch = 0;ch == 0;) {
129145e5710bSMark Peek 	if (GetNextChar(&ch) != 1) {
129245e5710bSMark Peek 	    cleanup_until(&tmpbuf);
1293c80476e4SDavid E. O'Brien 	    return(e_send_eof(0));
129445e5710bSMark Peek 	}
1295c80476e4SDavid E. O'Brien 	switch (ASC(ch)) {
1296c80476e4SDavid E. O'Brien 	case 0010:	/* Delete and backspace */
1297c80476e4SDavid E. O'Brien 	case 0177:
129845e5710bSMark Peek 	    if (tmpbuf.len > 1) {
1299c80476e4SDavid E. O'Brien 		*Cursor-- = '\0';
1300c80476e4SDavid E. O'Brien 		LastChar = Cursor;
130145e5710bSMark Peek 		tmpbuf.len--;
1302c80476e4SDavid E. O'Brien 	    }
1303c80476e4SDavid E. O'Brien 	    else {
130445e5710bSMark Peek 		copyn(InputBuf, oldbuf, INBUFSIZE);/*FIXBUF*/
1305c80476e4SDavid E. O'Brien 		LastChar = oldlc;
1306c80476e4SDavid E. O'Brien 		Cursor = oldc;
130745e5710bSMark Peek 		cleanup_until(&tmpbuf);
1308c80476e4SDavid E. O'Brien 		return(CC_REFRESH);
1309c80476e4SDavid E. O'Brien 	    }
1310c80476e4SDavid E. O'Brien 	    Refresh();
1311c80476e4SDavid E. O'Brien 	    ch = 0;
1312c80476e4SDavid E. O'Brien 	    break;
1313c80476e4SDavid E. O'Brien 
1314c80476e4SDavid E. O'Brien 	case 0033:	/* ESC */
13153b6eaa7bSAndrey A. Chernov #ifdef IS_ASCII
1316c80476e4SDavid E. O'Brien 	case '\r':	/* Newline */
1317c80476e4SDavid E. O'Brien 	case '\n':
1318c80476e4SDavid E. O'Brien #else
13193b6eaa7bSAndrey A. Chernov 	case '\012':    /* ASCII Line feed */
13203b6eaa7bSAndrey A. Chernov 	case '\015':    /* ASCII (or EBCDIC) Return */
1321c80476e4SDavid E. O'Brien #endif
1322c80476e4SDavid E. O'Brien 	    break;
1323c80476e4SDavid E. O'Brien 
1324c80476e4SDavid E. O'Brien 	default:
132545e5710bSMark Peek 	    Strbuf_append1(&tmpbuf, ch);
1326c80476e4SDavid E. O'Brien 	    *Cursor++ = ch;
1327c80476e4SDavid E. O'Brien 	    LastChar = Cursor;
1328c80476e4SDavid E. O'Brien 	    Refresh();
1329c80476e4SDavid E. O'Brien 	    ch = 0;
1330c80476e4SDavid E. O'Brien 	    break;
1331c80476e4SDavid E. O'Brien 	}
1332c80476e4SDavid E. O'Brien     }
133345e5710bSMark Peek     cleanup_until(oldbuf);
1334c80476e4SDavid E. O'Brien 
133545e5710bSMark Peek     if (tmpbuf.len == 1) {
1336c80476e4SDavid E. O'Brien 	/*
1337c80476e4SDavid E. O'Brien 	 * Use the old pattern, but wild-card it.
1338c80476e4SDavid E. O'Brien 	 */
133945e5710bSMark Peek 	if (patbuf.len == 0) {
1340c80476e4SDavid E. O'Brien 	    InputBuf[0] = '\0';
1341c80476e4SDavid E. O'Brien 	    LastChar = InputBuf;
1342c80476e4SDavid E. O'Brien 	    Cursor = InputBuf;
1343c80476e4SDavid E. O'Brien 	    Refresh();
134445e5710bSMark Peek 	    cleanup_until(&tmpbuf);
1345c80476e4SDavid E. O'Brien 	    return(CC_ERROR);
1346c80476e4SDavid E. O'Brien 	}
134745e5710bSMark Peek 	if (patbuf.s[0] != '*') {
134845e5710bSMark Peek 	    oldbuf = Strsave(patbuf.s);
134945e5710bSMark Peek 	    patbuf.len = 0;
135045e5710bSMark Peek 	    Strbuf_append1(&patbuf, '*');
135145e5710bSMark Peek 	    Strbuf_append(&patbuf, oldbuf);
135245e5710bSMark Peek 	    xfree(oldbuf);
135345e5710bSMark Peek 	    Strbuf_append1(&patbuf, '*');
135445e5710bSMark Peek 	    Strbuf_terminate(&patbuf);
1355c80476e4SDavid E. O'Brien 	}
1356c80476e4SDavid E. O'Brien     }
1357c80476e4SDavid E. O'Brien     else {
135845e5710bSMark Peek 	Strbuf_append1(&tmpbuf, '*');
135945e5710bSMark Peek 	Strbuf_terminate(&tmpbuf);
136045e5710bSMark Peek 	patbuf.len = 0;
136145e5710bSMark Peek 	Strbuf_append(&patbuf, tmpbuf.s);
136245e5710bSMark Peek 	Strbuf_terminate(&patbuf);
1363c80476e4SDavid E. O'Brien     }
136445e5710bSMark Peek     cleanup_until(&tmpbuf);
1365c80476e4SDavid E. O'Brien     LastCmd = (KEYCMD) dir; /* avoid c_hsetpat */
1366c80476e4SDavid E. O'Brien     Cursor = LastChar = InputBuf;
1367c80476e4SDavid E. O'Brien     if ((dir == F_UP_SEARCH_HIST ? e_up_search_hist(0) :
1368c80476e4SDavid E. O'Brien 				   e_down_search_hist(0)) == CC_ERROR) {
1369c80476e4SDavid E. O'Brien 	Refresh();
1370c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1371c80476e4SDavid E. O'Brien     }
1372c80476e4SDavid E. O'Brien     else {
137345e5710bSMark Peek 	if (ASC(ch) == 0033) {
1374c80476e4SDavid E. O'Brien 	    Refresh();
1375c80476e4SDavid E. O'Brien 	    *LastChar++ = '\n';
1376c80476e4SDavid E. O'Brien 	    *LastChar = '\0';
1377c80476e4SDavid E. O'Brien 	    PastBottom();
1378c80476e4SDavid E. O'Brien 	    return(CC_NEWLINE);
1379c80476e4SDavid E. O'Brien 	}
1380c80476e4SDavid E. O'Brien 	else
1381c80476e4SDavid E. O'Brien 	    return(CC_REFRESH);
1382c80476e4SDavid E. O'Brien     }
1383c80476e4SDavid E. O'Brien }
1384c80476e4SDavid E. O'Brien 
1385c80476e4SDavid E. O'Brien /*
1386c80476e4SDavid E. O'Brien  * semi-PUBLIC routines.  Any routine that is of type CCRETVAL is an
1387c80476e4SDavid E. O'Brien  * entry point, called from the CcKeyMap indirected into the
1388c80476e4SDavid E. O'Brien  * CcFuncTbl array.
1389c80476e4SDavid E. O'Brien  */
1390c80476e4SDavid E. O'Brien 
1391c80476e4SDavid E. O'Brien /*ARGSUSED*/
1392c80476e4SDavid E. O'Brien CCRETVAL
139345e5710bSMark Peek v_cmd_mode(Char c)
1394c80476e4SDavid E. O'Brien {
1395c80476e4SDavid E. O'Brien     USE(c);
1396c80476e4SDavid E. O'Brien     InsertPos = 0;
1397c80476e4SDavid E. O'Brien     ActionFlag = TCSHOP_NOP;	/* [Esc] cancels pending action */
1398c80476e4SDavid E. O'Brien     ActionPos = 0;
1399c80476e4SDavid E. O'Brien     DoingArg = 0;
1400c80476e4SDavid E. O'Brien     if (UndoPtr > Cursor)
1401c80476e4SDavid E. O'Brien 	UndoSize = (int)(UndoPtr - Cursor);
1402c80476e4SDavid E. O'Brien     else
1403c80476e4SDavid E. O'Brien 	UndoSize = (int)(Cursor - UndoPtr);
1404c80476e4SDavid E. O'Brien 
1405c80476e4SDavid E. O'Brien     inputmode = MODE_INSERT;
1406c80476e4SDavid E. O'Brien     c_alternativ_key_map(1);
1407c80476e4SDavid E. O'Brien #ifdef notdef
1408c80476e4SDavid E. O'Brien     /*
1409c80476e4SDavid E. O'Brien      * We don't want to move the cursor, because all the editing
1410c80476e4SDavid E. O'Brien      * commands don't include the character under the cursor.
1411c80476e4SDavid E. O'Brien      */
1412c80476e4SDavid E. O'Brien     if (Cursor > InputBuf)
1413c80476e4SDavid E. O'Brien 	Cursor--;
1414c80476e4SDavid E. O'Brien #endif
1415c80476e4SDavid E. O'Brien     RefCursor();
1416c80476e4SDavid E. O'Brien     return(CC_NORM);
1417c80476e4SDavid E. O'Brien }
1418c80476e4SDavid E. O'Brien 
1419c80476e4SDavid E. O'Brien /*ARGSUSED*/
1420c80476e4SDavid E. O'Brien CCRETVAL
142145e5710bSMark Peek e_unassigned(Char c)
1422c80476e4SDavid E. O'Brien {				/* bound to keys that arn't really assigned */
1423c80476e4SDavid E. O'Brien     USE(c);
1424c80476e4SDavid E. O'Brien     SoundBeep();
1425c80476e4SDavid E. O'Brien     flush();
1426c80476e4SDavid E. O'Brien     return(CC_NORM);
1427c80476e4SDavid E. O'Brien }
1428c80476e4SDavid E. O'Brien 
142945e5710bSMark Peek #ifdef notyet
143023338178SMark Peek static CCRETVAL
143145e5710bSMark Peek e_insert_str(Char *c)
143223338178SMark Peek {
143323338178SMark Peek     int i, n;
143423338178SMark Peek 
143523338178SMark Peek     n = Strlen(c);
143623338178SMark Peek     if (LastChar + Argument * n >= InputLim)
143723338178SMark Peek 	return(CC_ERROR);	/* end of buffer space */
143823338178SMark Peek     if (inputmode != MODE_INSERT) {
143945e5710bSMark Peek 	c_delafter(Argument * Strlen(c));
144023338178SMark Peek     }
144123338178SMark Peek     c_insert(Argument * n);
144223338178SMark Peek     while (Argument--) {
144323338178SMark Peek 	for (i = 0; i < n; i++)
144423338178SMark Peek 	    *Cursor++ = c[i];
144523338178SMark Peek     }
144623338178SMark Peek     Refresh();
144723338178SMark Peek     return(CC_NORM);
144823338178SMark Peek }
144945e5710bSMark Peek #endif
145023338178SMark Peek 
1451c80476e4SDavid E. O'Brien CCRETVAL
145245e5710bSMark Peek e_insert(Char c)
1453c80476e4SDavid E. O'Brien {
1454c80476e4SDavid E. O'Brien #ifndef SHORT_STRINGS
1455c80476e4SDavid E. O'Brien     c &= ASCII;			/* no meta chars ever */
1456c80476e4SDavid E. O'Brien #endif
1457c80476e4SDavid E. O'Brien 
1458c80476e4SDavid E. O'Brien     if (!c)
1459c80476e4SDavid E. O'Brien 	return(CC_ERROR);	/* no NULs in the input ever!! */
1460c80476e4SDavid E. O'Brien 
1461c80476e4SDavid E. O'Brien     if (LastChar + Argument >= InputLim)
1462c80476e4SDavid E. O'Brien 	return(CC_ERROR);	/* end of buffer space */
1463c80476e4SDavid E. O'Brien 
1464c80476e4SDavid E. O'Brien     if (Argument == 1) {  	/* How was this optimized ???? */
1465c80476e4SDavid E. O'Brien 
1466c80476e4SDavid E. O'Brien 	if (inputmode != MODE_INSERT) {
1467c80476e4SDavid E. O'Brien 	    UndoBuf[UndoSize++] = *Cursor;
1468c80476e4SDavid E. O'Brien 	    UndoBuf[UndoSize] = '\0';
1469c80476e4SDavid E. O'Brien 	    c_delafter(1);   /* Do NOT use the saving ONE */
1470c80476e4SDavid E. O'Brien     	}
1471c80476e4SDavid E. O'Brien 
1472c80476e4SDavid E. O'Brien         c_insert(1);
1473c80476e4SDavid E. O'Brien 	*Cursor++ = (Char) c;
1474c80476e4SDavid E. O'Brien 	DoingArg = 0;		/* just in case */
147523338178SMark Peek 	RefPlusOne(1);		/* fast refresh for one char. */
1476c80476e4SDavid E. O'Brien     }
1477c80476e4SDavid E. O'Brien     else {
1478c80476e4SDavid E. O'Brien 	if (inputmode != MODE_INSERT) {
147923338178SMark Peek 	    int i;
1480c80476e4SDavid E. O'Brien 	    for(i = 0; i < Argument; i++)
1481c80476e4SDavid E. O'Brien 		UndoBuf[UndoSize++] = *(Cursor + i);
1482c80476e4SDavid E. O'Brien 
1483c80476e4SDavid E. O'Brien 	    UndoBuf[UndoSize] = '\0';
1484c80476e4SDavid E. O'Brien 	    c_delafter(Argument);   /* Do NOT use the saving ONE */
1485c80476e4SDavid E. O'Brien     	}
1486c80476e4SDavid E. O'Brien 
1487c80476e4SDavid E. O'Brien         c_insert(Argument);
1488c80476e4SDavid E. O'Brien 
1489c80476e4SDavid E. O'Brien 	while (Argument--)
1490c80476e4SDavid E. O'Brien 	    *Cursor++ = (Char) c;
1491c80476e4SDavid E. O'Brien 	Refresh();
1492c80476e4SDavid E. O'Brien     }
1493c80476e4SDavid E. O'Brien 
1494c80476e4SDavid E. O'Brien     if (inputmode == MODE_REPLACE_1)
1495c80476e4SDavid E. O'Brien 	(void) v_cmd_mode(0);
1496c80476e4SDavid E. O'Brien 
1497c80476e4SDavid E. O'Brien     return(CC_NORM);
1498c80476e4SDavid E. O'Brien }
1499c80476e4SDavid E. O'Brien 
1500c80476e4SDavid E. O'Brien int
150145e5710bSMark Peek InsertStr(Char *s)		/* insert ASCIZ s at cursor (for complete) */
1502c80476e4SDavid E. O'Brien {
15036767bd61SMark Peek     int len;
1504c80476e4SDavid E. O'Brien 
1505c80476e4SDavid E. O'Brien     if ((len = (int) Strlen(s)) <= 0)
1506c80476e4SDavid E. O'Brien 	return -1;
1507c80476e4SDavid E. O'Brien     if (LastChar + len >= InputLim)
1508c80476e4SDavid E. O'Brien 	return -1;		/* end of buffer space */
1509c80476e4SDavid E. O'Brien 
1510c80476e4SDavid E. O'Brien     c_insert(len);
1511c80476e4SDavid E. O'Brien     while (len--)
1512c80476e4SDavid E. O'Brien 	*Cursor++ = *s++;
1513c80476e4SDavid E. O'Brien     return 0;
1514c80476e4SDavid E. O'Brien }
1515c80476e4SDavid E. O'Brien 
1516c80476e4SDavid E. O'Brien void
151745e5710bSMark Peek DeleteBack(int n)		/* delete the n characters before . */
1518c80476e4SDavid E. O'Brien {
1519c80476e4SDavid E. O'Brien     if (n <= 0)
1520c80476e4SDavid E. O'Brien 	return;
1521c80476e4SDavid E. O'Brien     if (Cursor >= &InputBuf[n]) {
1522c80476e4SDavid E. O'Brien 	c_delbefore(n);		/* delete before dot */
1523c80476e4SDavid E. O'Brien     }
1524c80476e4SDavid E. O'Brien }
1525c80476e4SDavid E. O'Brien 
1526c80476e4SDavid E. O'Brien CCRETVAL
152745e5710bSMark Peek e_digit(Char c)			/* gray magic here */
1528c80476e4SDavid E. O'Brien {
1529c80476e4SDavid E. O'Brien     if (!Isdigit(c))
1530c80476e4SDavid E. O'Brien 	return(CC_ERROR);	/* no NULs in the input ever!! */
1531c80476e4SDavid E. O'Brien 
1532c80476e4SDavid E. O'Brien     if (DoingArg) {		/* if doing an arg, add this in... */
1533c80476e4SDavid E. O'Brien 	if (LastCmd == F_ARGFOUR)	/* if last command was ^U */
1534c80476e4SDavid E. O'Brien 	    Argument = c - '0';
1535c80476e4SDavid E. O'Brien 	else {
1536c80476e4SDavid E. O'Brien 	    if (Argument > 1000000)
1537c80476e4SDavid E. O'Brien 		return CC_ERROR;
1538c80476e4SDavid E. O'Brien 	    Argument = (Argument * 10) + (c - '0');
1539c80476e4SDavid E. O'Brien 	}
1540c80476e4SDavid E. O'Brien 	return(CC_ARGHACK);
1541c80476e4SDavid E. O'Brien     }
1542c80476e4SDavid E. O'Brien     else {
1543c80476e4SDavid E. O'Brien 	if (LastChar + 1 >= InputLim)
1544c80476e4SDavid E. O'Brien 	    return CC_ERROR;	/* end of buffer space */
1545c80476e4SDavid E. O'Brien 
1546c80476e4SDavid E. O'Brien 	if (inputmode != MODE_INSERT) {
1547c80476e4SDavid E. O'Brien 	    UndoBuf[UndoSize++] = *Cursor;
1548c80476e4SDavid E. O'Brien 	    UndoBuf[UndoSize] = '\0';
1549c80476e4SDavid E. O'Brien 	    c_delafter(1);   /* Do NOT use the saving ONE */
1550c80476e4SDavid E. O'Brien     	}
1551c80476e4SDavid E. O'Brien 	c_insert(1);
1552c80476e4SDavid E. O'Brien 	*Cursor++ = (Char) c;
1553c80476e4SDavid E. O'Brien 	DoingArg = 0;		/* just in case */
155423338178SMark Peek 	RefPlusOne(1);		/* fast refresh for one char. */
1555c80476e4SDavid E. O'Brien     }
1556c80476e4SDavid E. O'Brien     return(CC_NORM);
1557c80476e4SDavid E. O'Brien }
1558c80476e4SDavid E. O'Brien 
1559c80476e4SDavid E. O'Brien CCRETVAL
156045e5710bSMark Peek e_argdigit(Char c)		/* for ESC-n */
1561c80476e4SDavid E. O'Brien {
156245e5710bSMark Peek #ifdef IS_ASCII
1563c80476e4SDavid E. O'Brien     c &= ASCII;
156445e5710bSMark Peek #else
156545e5710bSMark Peek     c = CTL_ESC(ASC(c) & ASCII); /* stripping for EBCDIC done the ASCII way */
156645e5710bSMark Peek #endif
1567c80476e4SDavid E. O'Brien 
1568c80476e4SDavid E. O'Brien     if (!Isdigit(c))
1569c80476e4SDavid E. O'Brien 	return(CC_ERROR);	/* no NULs in the input ever!! */
1570c80476e4SDavid E. O'Brien 
1571c80476e4SDavid E. O'Brien     if (DoingArg) {		/* if doing an arg, add this in... */
1572c80476e4SDavid E. O'Brien 	if (Argument > 1000000)
1573c80476e4SDavid E. O'Brien 	    return CC_ERROR;
1574c80476e4SDavid E. O'Brien 	Argument = (Argument * 10) + (c - '0');
1575c80476e4SDavid E. O'Brien     }
1576c80476e4SDavid E. O'Brien     else {			/* else starting an argument */
1577c80476e4SDavid E. O'Brien 	Argument = c - '0';
1578c80476e4SDavid E. O'Brien 	DoingArg = 1;
1579c80476e4SDavid E. O'Brien     }
1580c80476e4SDavid E. O'Brien     return(CC_ARGHACK);
1581c80476e4SDavid E. O'Brien }
1582c80476e4SDavid E. O'Brien 
1583c80476e4SDavid E. O'Brien CCRETVAL
158445e5710bSMark Peek v_zero(Char c)			/* command mode 0 for vi */
1585c80476e4SDavid E. O'Brien {
1586c80476e4SDavid E. O'Brien     if (DoingArg) {		/* if doing an arg, add this in... */
1587c80476e4SDavid E. O'Brien 	if (Argument > 1000000)
1588c80476e4SDavid E. O'Brien 	    return CC_ERROR;
1589c80476e4SDavid E. O'Brien 	Argument = (Argument * 10) + (c - '0');
1590c80476e4SDavid E. O'Brien 	return(CC_ARGHACK);
1591c80476e4SDavid E. O'Brien     }
1592c80476e4SDavid E. O'Brien     else {			/* else starting an argument */
1593c80476e4SDavid E. O'Brien 	Cursor = InputBuf;
1594c80476e4SDavid E. O'Brien 	if (ActionFlag & TCSHOP_DELETE) {
1595c80476e4SDavid E. O'Brien 	   c_delfini();
1596c80476e4SDavid E. O'Brien 	   return(CC_REFRESH);
1597c80476e4SDavid E. O'Brien         }
1598c80476e4SDavid E. O'Brien 	RefCursor();		/* move the cursor */
1599c80476e4SDavid E. O'Brien 	return(CC_NORM);
1600c80476e4SDavid E. O'Brien     }
1601c80476e4SDavid E. O'Brien }
1602c80476e4SDavid E. O'Brien 
1603c80476e4SDavid E. O'Brien /*ARGSUSED*/
1604c80476e4SDavid E. O'Brien CCRETVAL
160545e5710bSMark Peek e_newline(Char c)
1606c80476e4SDavid E. O'Brien {				/* always ignore argument */
1607c80476e4SDavid E. O'Brien     USE(c);
160845e5710bSMark Peek     if (adrof(STRhighlight) && MarkIsSet) {
160945e5710bSMark Peek 	MarkIsSet = 0;
161045e5710bSMark Peek 	ClearLines();
161145e5710bSMark Peek 	ClearDisp();
161245e5710bSMark Peek 	Refresh();
161345e5710bSMark Peek     }
161445e5710bSMark Peek     MarkIsSet = 0;
161545e5710bSMark Peek 
1616c80476e4SDavid E. O'Brien   /*  PastBottom();  NOW done in ed.inputl.c */
1617c80476e4SDavid E. O'Brien     *LastChar++ = '\n';		/* for the benefit of CSH */
1618c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1619c80476e4SDavid E. O'Brien     if (VImode)
1620c80476e4SDavid E. O'Brien 	InsertPos = InputBuf;	/* Reset editing position */
1621c80476e4SDavid E. O'Brien     return(CC_NEWLINE);
1622c80476e4SDavid E. O'Brien }
1623c80476e4SDavid E. O'Brien 
1624c80476e4SDavid E. O'Brien /*ARGSUSED*/
1625c80476e4SDavid E. O'Brien CCRETVAL
162645e5710bSMark Peek e_newline_hold(Char c)
162745e5710bSMark Peek {
162845e5710bSMark Peek     USE(c);
162945e5710bSMark Peek     c_save_inputbuf();
163045e5710bSMark Peek     HistSaved = 0;
163145e5710bSMark Peek     *LastChar++ = '\n';		/* for the benefit of CSH */
163245e5710bSMark Peek     *LastChar = '\0';		/* just in case */
163345e5710bSMark Peek     return(CC_NEWLINE);
163445e5710bSMark Peek }
163545e5710bSMark Peek 
163645e5710bSMark Peek /*ARGSUSED*/
163745e5710bSMark Peek CCRETVAL
163845e5710bSMark Peek e_newline_down_hist(Char c)
163945e5710bSMark Peek {
164045e5710bSMark Peek     USE(c);
164145e5710bSMark Peek     if (Hist_num > 1) {
164245e5710bSMark Peek 	HistSaved = Hist_num;
164345e5710bSMark Peek     }
164445e5710bSMark Peek     *LastChar++ = '\n';		/* for the benefit of CSH */
164545e5710bSMark Peek     *LastChar = '\0';		/* just in case */
164645e5710bSMark Peek     return(CC_NEWLINE);
164745e5710bSMark Peek }
164845e5710bSMark Peek 
164945e5710bSMark Peek /*ARGSUSED*/
165045e5710bSMark Peek CCRETVAL
165145e5710bSMark Peek e_send_eof(Char c)
1652c80476e4SDavid E. O'Brien {				/* for when ^D is ONLY send-eof */
1653c80476e4SDavid E. O'Brien     USE(c);
1654c80476e4SDavid E. O'Brien     PastBottom();
1655c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1656c80476e4SDavid E. O'Brien     return(CC_EOF);
1657c80476e4SDavid E. O'Brien }
1658c80476e4SDavid E. O'Brien 
1659c80476e4SDavid E. O'Brien /*ARGSUSED*/
1660c80476e4SDavid E. O'Brien CCRETVAL
166145e5710bSMark Peek e_complete(Char c)
1662c80476e4SDavid E. O'Brien {
1663c80476e4SDavid E. O'Brien     USE(c);
1664c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1665c80476e4SDavid E. O'Brien     return(CC_COMPLETE);
1666c80476e4SDavid E. O'Brien }
1667c80476e4SDavid E. O'Brien 
1668c80476e4SDavid E. O'Brien /*ARGSUSED*/
1669c80476e4SDavid E. O'Brien CCRETVAL
167045e5710bSMark Peek e_complete_back(Char c)
1671c80476e4SDavid E. O'Brien {
1672c80476e4SDavid E. O'Brien     USE(c);
1673c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1674c80476e4SDavid E. O'Brien     return(CC_COMPLETE_BACK);
1675c80476e4SDavid E. O'Brien }
1676c80476e4SDavid E. O'Brien 
1677c80476e4SDavid E. O'Brien /*ARGSUSED*/
1678c80476e4SDavid E. O'Brien CCRETVAL
167945e5710bSMark Peek e_complete_fwd(Char c)
1680c80476e4SDavid E. O'Brien {
1681c80476e4SDavid E. O'Brien     USE(c);
1682c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1683c80476e4SDavid E. O'Brien     return(CC_COMPLETE_FWD);
1684c80476e4SDavid E. O'Brien }
1685c80476e4SDavid E. O'Brien 
1686c80476e4SDavid E. O'Brien /*ARGSUSED*/
1687c80476e4SDavid E. O'Brien CCRETVAL
168845e5710bSMark Peek e_complete_all(Char c)
1689c80476e4SDavid E. O'Brien {
1690c80476e4SDavid E. O'Brien     USE(c);
1691c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1692c80476e4SDavid E. O'Brien     return(CC_COMPLETE_ALL);
1693c80476e4SDavid E. O'Brien }
1694c80476e4SDavid E. O'Brien 
1695c80476e4SDavid E. O'Brien /*ARGSUSED*/
1696c80476e4SDavid E. O'Brien CCRETVAL
169745e5710bSMark Peek v_cm_complete(Char c)
1698c80476e4SDavid E. O'Brien {
1699c80476e4SDavid E. O'Brien     USE(c);
1700c80476e4SDavid E. O'Brien     if (Cursor < LastChar)
1701c80476e4SDavid E. O'Brien 	Cursor++;
1702c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1703c80476e4SDavid E. O'Brien     return(CC_COMPLETE);
1704c80476e4SDavid E. O'Brien }
1705c80476e4SDavid E. O'Brien 
1706c80476e4SDavid E. O'Brien /*ARGSUSED*/
1707c80476e4SDavid E. O'Brien CCRETVAL
170845e5710bSMark Peek e_toggle_hist(Char c)
1709c80476e4SDavid E. O'Brien {
1710c80476e4SDavid E. O'Brien     struct Hist *hp;
1711c80476e4SDavid E. O'Brien     int     h;
1712c80476e4SDavid E. O'Brien 
1713c80476e4SDavid E. O'Brien     USE(c);
1714c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1715c80476e4SDavid E. O'Brien 
1716c80476e4SDavid E. O'Brien     if (Hist_num <= 0) {
1717c80476e4SDavid E. O'Brien 	return CC_ERROR;
1718c80476e4SDavid E. O'Brien     }
1719c80476e4SDavid E. O'Brien 
1720c80476e4SDavid E. O'Brien     hp = Histlist.Hnext;
1721c80476e4SDavid E. O'Brien     if (hp == NULL) {	/* this is only if no history */
1722c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1723c80476e4SDavid E. O'Brien     }
1724c80476e4SDavid E. O'Brien 
1725c80476e4SDavid E. O'Brien     for (h = 1; h < Hist_num; h++)
1726c80476e4SDavid E. O'Brien 	hp = hp->Hnext;
1727c80476e4SDavid E. O'Brien 
1728c80476e4SDavid E. O'Brien     if (!CurrentHistLit) {
1729c80476e4SDavid E. O'Brien 	if (hp->histline) {
173045e5710bSMark Peek 	    copyn(InputBuf, hp->histline, INBUFSIZE);/*FIXBUF*/
1731c80476e4SDavid E. O'Brien 	    CurrentHistLit = 1;
1732c80476e4SDavid E. O'Brien 	}
1733c80476e4SDavid E. O'Brien 	else {
1734c80476e4SDavid E. O'Brien 	    return CC_ERROR;
1735c80476e4SDavid E. O'Brien 	}
1736c80476e4SDavid E. O'Brien     }
1737c80476e4SDavid E. O'Brien     else {
173845e5710bSMark Peek 	Char *p;
173945e5710bSMark Peek 
174045e5710bSMark Peek 	p = sprlex(&hp->Hlex);
174145e5710bSMark Peek 	copyn(InputBuf, p, sizeof(InputBuf) / sizeof(Char));/*FIXBUF*/
174245e5710bSMark Peek 	xfree(p);
1743c80476e4SDavid E. O'Brien 	CurrentHistLit = 0;
1744c80476e4SDavid E. O'Brien     }
1745c80476e4SDavid E. O'Brien 
174645e5710bSMark Peek     LastChar = Strend(InputBuf);
1747c80476e4SDavid E. O'Brien     if (LastChar > InputBuf) {
1748c80476e4SDavid E. O'Brien 	if (LastChar[-1] == '\n')
1749c80476e4SDavid E. O'Brien 	    LastChar--;
1750c80476e4SDavid E. O'Brien 	if (LastChar[-1] == ' ')
1751c80476e4SDavid E. O'Brien 	    LastChar--;
1752c80476e4SDavid E. O'Brien 	if (LastChar < InputBuf)
1753c80476e4SDavid E. O'Brien 	    LastChar = InputBuf;
1754c80476e4SDavid E. O'Brien     }
1755c80476e4SDavid E. O'Brien 
1756c80476e4SDavid E. O'Brien #ifdef KSHVI
1757c80476e4SDavid E. O'Brien     if (VImode)
1758c80476e4SDavid E. O'Brien 	Cursor = InputBuf;
1759c80476e4SDavid E. O'Brien     else
1760c80476e4SDavid E. O'Brien #endif /* KSHVI */
1761c80476e4SDavid E. O'Brien 	Cursor = LastChar;
1762c80476e4SDavid E. O'Brien 
1763c80476e4SDavid E. O'Brien     return(CC_REFRESH);
1764c80476e4SDavid E. O'Brien }
1765c80476e4SDavid E. O'Brien 
1766c80476e4SDavid E. O'Brien /*ARGSUSED*/
1767c80476e4SDavid E. O'Brien CCRETVAL
176845e5710bSMark Peek e_up_hist(Char c)
1769c80476e4SDavid E. O'Brien {
1770c80476e4SDavid E. O'Brien     Char    beep = 0;
1771c80476e4SDavid E. O'Brien 
1772c80476e4SDavid E. O'Brien     USE(c);
1773c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_NOP;
1774c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1775c80476e4SDavid E. O'Brien 
1776c80476e4SDavid E. O'Brien     if (Hist_num == 0) {	/* save the current buffer away */
177745e5710bSMark Peek 	HistBuf.len = 0;
177845e5710bSMark Peek 	Strbuf_append(&HistBuf, InputBuf);
177945e5710bSMark Peek 	Strbuf_terminate(&HistBuf);
1780c80476e4SDavid E. O'Brien     }
1781c80476e4SDavid E. O'Brien 
1782c80476e4SDavid E. O'Brien     Hist_num += Argument;
1783c80476e4SDavid E. O'Brien 
178445e5710bSMark Peek     if (GetHistLine() == CC_ERROR) {
1785c80476e4SDavid E. O'Brien 	beep = 1;
178645e5710bSMark Peek 	(void) GetHistLine(); /* Hist_num was fixed by first call */
1787c80476e4SDavid E. O'Brien     }
1788c80476e4SDavid E. O'Brien 
1789c80476e4SDavid E. O'Brien     Refresh();
1790c80476e4SDavid E. O'Brien     if (beep)
1791c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1792c80476e4SDavid E. O'Brien     else
1793c80476e4SDavid E. O'Brien 	return(CC_NORM);	/* was CC_UP_HIST */
1794c80476e4SDavid E. O'Brien }
1795c80476e4SDavid E. O'Brien 
1796c80476e4SDavid E. O'Brien /*ARGSUSED*/
1797c80476e4SDavid E. O'Brien CCRETVAL
179845e5710bSMark Peek e_down_hist(Char c)
1799c80476e4SDavid E. O'Brien {
1800c80476e4SDavid E. O'Brien     USE(c);
1801c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_NOP;
1802c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1803c80476e4SDavid E. O'Brien 
1804c80476e4SDavid E. O'Brien     Hist_num -= Argument;
1805c80476e4SDavid E. O'Brien 
1806c80476e4SDavid E. O'Brien     if (Hist_num < 0) {
1807c80476e4SDavid E. O'Brien 	Hist_num = 0;
1808c80476e4SDavid E. O'Brien 	return(CC_ERROR);	/* make it beep */
1809c80476e4SDavid E. O'Brien     }
1810c80476e4SDavid E. O'Brien 
181145e5710bSMark Peek     return(GetHistLine());
1812c80476e4SDavid E. O'Brien }
1813c80476e4SDavid E. O'Brien 
1814c80476e4SDavid E. O'Brien 
1815c80476e4SDavid E. O'Brien 
1816c80476e4SDavid E. O'Brien /*
1817c80476e4SDavid E. O'Brien  * c_hmatch() return True if the pattern matches the prefix
1818c80476e4SDavid E. O'Brien  */
1819c80476e4SDavid E. O'Brien static int
182045e5710bSMark Peek c_hmatch(Char *str)
1821c80476e4SDavid E. O'Brien {
182245e5710bSMark Peek     if (Strncmp(patbuf.s, str, patbuf.len) == 0)
1823c80476e4SDavid E. O'Brien 	return 1;
182445e5710bSMark Peek     return Gmatch(str, patbuf.s);
1825c80476e4SDavid E. O'Brien }
1826c80476e4SDavid E. O'Brien 
1827c80476e4SDavid E. O'Brien /*
1828c80476e4SDavid E. O'Brien  * c_hsetpat(): Set the history seatch pattern
1829c80476e4SDavid E. O'Brien  */
1830c80476e4SDavid E. O'Brien static void
183145e5710bSMark Peek c_hsetpat(void)
1832c80476e4SDavid E. O'Brien {
1833c80476e4SDavid E. O'Brien     if (LastCmd != F_UP_SEARCH_HIST && LastCmd != F_DOWN_SEARCH_HIST) {
183445e5710bSMark Peek 	patbuf.len = 0;
183545e5710bSMark Peek 	Strbuf_appendn(&patbuf, InputBuf, Cursor - InputBuf);
183645e5710bSMark Peek 	Strbuf_terminate(&patbuf);
1837c80476e4SDavid E. O'Brien     }
1838c80476e4SDavid E. O'Brien #ifdef SDEBUG
1839c80476e4SDavid E. O'Brien     xprintf("\nHist_num = %d\n", Hist_num);
184045e5710bSMark Peek     xprintf("patlen = %d\n", (int)patbuf.len);
184145e5710bSMark Peek     xprintf("patbuf = \"%S\"\n", patbuf.s);
1842c80476e4SDavid E. O'Brien     xprintf("Cursor %d LastChar %d\n", Cursor - InputBuf, LastChar - InputBuf);
1843c80476e4SDavid E. O'Brien #endif
1844c80476e4SDavid E. O'Brien }
1845c80476e4SDavid E. O'Brien 
1846c80476e4SDavid E. O'Brien /*ARGSUSED*/
1847c80476e4SDavid E. O'Brien CCRETVAL
184845e5710bSMark Peek e_up_search_hist(Char c)
1849c80476e4SDavid E. O'Brien {
1850c80476e4SDavid E. O'Brien     struct Hist *hp;
1851c80476e4SDavid E. O'Brien     int h;
185223338178SMark Peek     int    found = 0;
1853c80476e4SDavid E. O'Brien 
1854c80476e4SDavid E. O'Brien     USE(c);
1855c80476e4SDavid E. O'Brien     ActionFlag = TCSHOP_NOP;
1856c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_NOP;
1857c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1858c80476e4SDavid E. O'Brien     if (Hist_num < 0) {
1859c80476e4SDavid E. O'Brien #ifdef DEBUG_EDIT
1860c80476e4SDavid E. O'Brien 	xprintf("%s: e_up_search_hist(): Hist_num < 0; resetting.\n", progname);
1861c80476e4SDavid E. O'Brien #endif
1862c80476e4SDavid E. O'Brien 	Hist_num = 0;
1863c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1864c80476e4SDavid E. O'Brien     }
1865c80476e4SDavid E. O'Brien 
186645e5710bSMark Peek     if (Hist_num == 0) {
186745e5710bSMark Peek 	HistBuf.len = 0;
186845e5710bSMark Peek 	Strbuf_append(&HistBuf, InputBuf);
186945e5710bSMark Peek 	Strbuf_terminate(&HistBuf);
1870c80476e4SDavid E. O'Brien     }
1871c80476e4SDavid E. O'Brien 
1872c80476e4SDavid E. O'Brien 
1873c80476e4SDavid E. O'Brien     hp = Histlist.Hnext;
1874c80476e4SDavid E. O'Brien     if (hp == NULL)
1875c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1876c80476e4SDavid E. O'Brien 
1877c80476e4SDavid E. O'Brien     c_hsetpat();		/* Set search pattern !! */
1878c80476e4SDavid E. O'Brien 
1879c80476e4SDavid E. O'Brien     for (h = 1; h <= Hist_num; h++)
1880c80476e4SDavid E. O'Brien 	hp = hp->Hnext;
1881c80476e4SDavid E. O'Brien 
1882c80476e4SDavid E. O'Brien     while (hp != NULL) {
188345e5710bSMark Peek 	Char *hl;
188445e5710bSMark Peek 	int matched;
188545e5710bSMark Peek 
188645e5710bSMark Peek 	if (hp->histline == NULL)
188745e5710bSMark Peek 	    hp->histline = sprlex(&hp->Hlex);
188845e5710bSMark Peek 	if (HistLit)
188945e5710bSMark Peek 	    hl = hp->histline;
189045e5710bSMark Peek 	else {
189145e5710bSMark Peek 	    hl = sprlex(&hp->Hlex);
189245e5710bSMark Peek 	    cleanup_push(hl, xfree);
1893c80476e4SDavid E. O'Brien 	}
1894c80476e4SDavid E. O'Brien #ifdef SDEBUG
1895c80476e4SDavid E. O'Brien 	xprintf("Comparing with \"%S\"\n", hl);
1896c80476e4SDavid E. O'Brien #endif
189745e5710bSMark Peek 	matched = (Strncmp(hl, InputBuf, (size_t) (LastChar - InputBuf)) ||
189845e5710bSMark Peek 		   hl[LastChar-InputBuf]) && c_hmatch(hl);
189945e5710bSMark Peek 	if (!HistLit)
190045e5710bSMark Peek 	    cleanup_until(hl);
190145e5710bSMark Peek 	if (matched) {
1902c80476e4SDavid E. O'Brien 	    found++;
1903c80476e4SDavid E. O'Brien 	    break;
1904c80476e4SDavid E. O'Brien 	}
1905c80476e4SDavid E. O'Brien 	h++;
1906c80476e4SDavid E. O'Brien 	hp = hp->Hnext;
1907c80476e4SDavid E. O'Brien     }
1908c80476e4SDavid E. O'Brien 
1909c80476e4SDavid E. O'Brien     if (!found) {
1910c80476e4SDavid E. O'Brien #ifdef SDEBUG
1911c80476e4SDavid E. O'Brien 	xprintf("not found\n");
1912c80476e4SDavid E. O'Brien #endif
1913c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1914c80476e4SDavid E. O'Brien     }
1915c80476e4SDavid E. O'Brien 
1916c80476e4SDavid E. O'Brien     Hist_num = h;
1917c80476e4SDavid E. O'Brien 
191845e5710bSMark Peek     return(GetHistLine());
1919c80476e4SDavid E. O'Brien }
1920c80476e4SDavid E. O'Brien 
1921c80476e4SDavid E. O'Brien /*ARGSUSED*/
1922c80476e4SDavid E. O'Brien CCRETVAL
192345e5710bSMark Peek e_down_search_hist(Char c)
1924c80476e4SDavid E. O'Brien {
1925c80476e4SDavid E. O'Brien     struct Hist *hp;
1926c80476e4SDavid E. O'Brien     int h;
192723338178SMark Peek     int    found = 0;
1928c80476e4SDavid E. O'Brien 
1929c80476e4SDavid E. O'Brien     USE(c);
1930c80476e4SDavid E. O'Brien     ActionFlag = TCSHOP_NOP;
1931c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_NOP;
1932c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1933c80476e4SDavid E. O'Brien 
1934c80476e4SDavid E. O'Brien     if (Hist_num == 0)
1935c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1936c80476e4SDavid E. O'Brien 
1937c80476e4SDavid E. O'Brien     hp = Histlist.Hnext;
1938c80476e4SDavid E. O'Brien     if (hp == 0)
1939c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1940c80476e4SDavid E. O'Brien 
1941c80476e4SDavid E. O'Brien     c_hsetpat();		/* Set search pattern !! */
1942c80476e4SDavid E. O'Brien 
1943c80476e4SDavid E. O'Brien     for (h = 1; h < Hist_num && hp; h++) {
194445e5710bSMark Peek 	Char *hl;
194545e5710bSMark Peek 	if (hp->histline == NULL)
194645e5710bSMark Peek 	    hp->histline = sprlex(&hp->Hlex);
194745e5710bSMark Peek 	if (HistLit)
194845e5710bSMark Peek 	    hl = hp->histline;
194945e5710bSMark Peek 	else {
195045e5710bSMark Peek 	    hl = sprlex(&hp->Hlex);
195145e5710bSMark Peek 	    cleanup_push(hl, xfree);
1952c80476e4SDavid E. O'Brien 	}
1953c80476e4SDavid E. O'Brien #ifdef SDEBUG
1954c80476e4SDavid E. O'Brien 	xprintf("Comparing with \"%S\"\n", hl);
1955c80476e4SDavid E. O'Brien #endif
1956c80476e4SDavid E. O'Brien 	if ((Strncmp(hl, InputBuf, (size_t) (LastChar - InputBuf)) ||
1957c80476e4SDavid E. O'Brien 	     hl[LastChar-InputBuf]) && c_hmatch(hl))
1958c80476e4SDavid E. O'Brien 	    found = h;
195945e5710bSMark Peek 	if (!HistLit)
196045e5710bSMark Peek 	    cleanup_until(hl);
1961c80476e4SDavid E. O'Brien 	hp = hp->Hnext;
1962c80476e4SDavid E. O'Brien     }
1963c80476e4SDavid E. O'Brien 
1964c80476e4SDavid E. O'Brien     if (!found) {		/* is it the current history number? */
196545e5710bSMark Peek 	if (!c_hmatch(HistBuf.s)) {
1966c80476e4SDavid E. O'Brien #ifdef SDEBUG
1967c80476e4SDavid E. O'Brien 	    xprintf("not found\n");
1968c80476e4SDavid E. O'Brien #endif
1969c80476e4SDavid E. O'Brien 	    return(CC_ERROR);
1970c80476e4SDavid E. O'Brien 	}
1971c80476e4SDavid E. O'Brien     }
1972c80476e4SDavid E. O'Brien 
1973c80476e4SDavid E. O'Brien     Hist_num = found;
1974c80476e4SDavid E. O'Brien 
197545e5710bSMark Peek     return(GetHistLine());
1976c80476e4SDavid E. O'Brien }
1977c80476e4SDavid E. O'Brien 
1978c80476e4SDavid E. O'Brien /*ARGSUSED*/
1979c80476e4SDavid E. O'Brien CCRETVAL
198045e5710bSMark Peek e_helpme(Char c)
1981c80476e4SDavid E. O'Brien {
1982c80476e4SDavid E. O'Brien     USE(c);
1983c80476e4SDavid E. O'Brien     PastBottom();
1984c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1985c80476e4SDavid E. O'Brien     return(CC_HELPME);
1986c80476e4SDavid E. O'Brien }
1987c80476e4SDavid E. O'Brien 
1988c80476e4SDavid E. O'Brien /*ARGSUSED*/
1989c80476e4SDavid E. O'Brien CCRETVAL
199045e5710bSMark Peek e_correct(Char c)
1991c80476e4SDavid E. O'Brien {
1992c80476e4SDavid E. O'Brien     USE(c);
1993c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1994c80476e4SDavid E. O'Brien     return(CC_CORRECT);
1995c80476e4SDavid E. O'Brien }
1996c80476e4SDavid E. O'Brien 
1997c80476e4SDavid E. O'Brien /*ARGSUSED*/
1998c80476e4SDavid E. O'Brien CCRETVAL
199945e5710bSMark Peek e_correctl(Char c)
2000c80476e4SDavid E. O'Brien {
2001c80476e4SDavid E. O'Brien     USE(c);
2002c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2003c80476e4SDavid E. O'Brien     return(CC_CORRECT_L);
2004c80476e4SDavid E. O'Brien }
2005c80476e4SDavid E. O'Brien 
2006c80476e4SDavid E. O'Brien /*ARGSUSED*/
2007c80476e4SDavid E. O'Brien CCRETVAL
200845e5710bSMark Peek e_run_fg_editor(Char c)
2009c80476e4SDavid E. O'Brien {
20106767bd61SMark Peek     struct process *pp;
2011c80476e4SDavid E. O'Brien 
2012c80476e4SDavid E. O'Brien     USE(c);
2013c80476e4SDavid E. O'Brien     if ((pp = find_stop_ed()) != NULL) {
2014c80476e4SDavid E. O'Brien 	/* save our editor state so we can restore it */
201545e5710bSMark Peek 	c_save_inputbuf();
2016c80476e4SDavid E. O'Brien 	Hist_num = 0;		/* for the history commands */
2017c80476e4SDavid E. O'Brien 
2018c80476e4SDavid E. O'Brien 	/* put the tty in a sane mode */
2019c80476e4SDavid E. O'Brien 	PastBottom();
2020c80476e4SDavid E. O'Brien 	(void) Cookedmode();	/* make sure the tty is set up correctly */
2021c80476e4SDavid E. O'Brien 
2022c80476e4SDavid E. O'Brien 	/* do it! */
2023c80476e4SDavid E. O'Brien 	fg_proc_entry(pp);
2024c80476e4SDavid E. O'Brien 
2025c80476e4SDavid E. O'Brien 	(void) Rawmode();	/* go on */
2026c80476e4SDavid E. O'Brien 	Refresh();
202745e5710bSMark Peek 	RestoreSaved = 0;
202845e5710bSMark Peek 	HistSaved = 0;
2029c80476e4SDavid E. O'Brien     }
2030c80476e4SDavid E. O'Brien     return(CC_NORM);
2031c80476e4SDavid E. O'Brien }
2032c80476e4SDavid E. O'Brien 
2033c80476e4SDavid E. O'Brien /*ARGSUSED*/
2034c80476e4SDavid E. O'Brien CCRETVAL
203545e5710bSMark Peek e_list_choices(Char c)
2036c80476e4SDavid E. O'Brien {
2037c80476e4SDavid E. O'Brien     USE(c);
2038c80476e4SDavid E. O'Brien     PastBottom();
2039c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2040c80476e4SDavid E. O'Brien     return(CC_LIST_CHOICES);
2041c80476e4SDavid E. O'Brien }
2042c80476e4SDavid E. O'Brien 
2043c80476e4SDavid E. O'Brien /*ARGSUSED*/
2044c80476e4SDavid E. O'Brien CCRETVAL
204545e5710bSMark Peek e_list_all(Char c)
2046c80476e4SDavid E. O'Brien {
2047c80476e4SDavid E. O'Brien     USE(c);
2048c80476e4SDavid E. O'Brien     PastBottom();
2049c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2050c80476e4SDavid E. O'Brien     return(CC_LIST_ALL);
2051c80476e4SDavid E. O'Brien }
2052c80476e4SDavid E. O'Brien 
2053c80476e4SDavid E. O'Brien /*ARGSUSED*/
2054c80476e4SDavid E. O'Brien CCRETVAL
205545e5710bSMark Peek e_list_glob(Char c)
2056c80476e4SDavid E. O'Brien {
2057c80476e4SDavid E. O'Brien     USE(c);
2058c80476e4SDavid E. O'Brien     PastBottom();
2059c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2060c80476e4SDavid E. O'Brien     return(CC_LIST_GLOB);
2061c80476e4SDavid E. O'Brien }
2062c80476e4SDavid E. O'Brien 
2063c80476e4SDavid E. O'Brien /*ARGSUSED*/
2064c80476e4SDavid E. O'Brien CCRETVAL
206545e5710bSMark Peek e_expand_glob(Char c)
2066c80476e4SDavid E. O'Brien {
2067c80476e4SDavid E. O'Brien     USE(c);
2068c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2069c80476e4SDavid E. O'Brien     return(CC_EXPAND_GLOB);
2070c80476e4SDavid E. O'Brien }
2071c80476e4SDavid E. O'Brien 
2072c80476e4SDavid E. O'Brien /*ARGSUSED*/
2073c80476e4SDavid E. O'Brien CCRETVAL
207445e5710bSMark Peek e_normalize_path(Char c)
2075c80476e4SDavid E. O'Brien {
2076c80476e4SDavid E. O'Brien     USE(c);
2077c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2078c80476e4SDavid E. O'Brien     return(CC_NORMALIZE_PATH);
2079c80476e4SDavid E. O'Brien }
2080c80476e4SDavid E. O'Brien 
2081c80476e4SDavid E. O'Brien /*ARGSUSED*/
2082c80476e4SDavid E. O'Brien CCRETVAL
208345e5710bSMark Peek e_normalize_command(Char c)
2084c80476e4SDavid E. O'Brien {
2085c80476e4SDavid E. O'Brien     USE(c);
2086c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2087c80476e4SDavid E. O'Brien     return(CC_NORMALIZE_COMMAND);
2088c80476e4SDavid E. O'Brien }
2089c80476e4SDavid E. O'Brien 
2090c80476e4SDavid E. O'Brien /*ARGSUSED*/
2091c80476e4SDavid E. O'Brien CCRETVAL
209245e5710bSMark Peek e_expand_vars(Char c)
2093c80476e4SDavid E. O'Brien {
2094c80476e4SDavid E. O'Brien     USE(c);
2095c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2096c80476e4SDavid E. O'Brien     return(CC_EXPAND_VARS);
2097c80476e4SDavid E. O'Brien }
2098c80476e4SDavid E. O'Brien 
2099c80476e4SDavid E. O'Brien /*ARGSUSED*/
2100c80476e4SDavid E. O'Brien CCRETVAL
210145e5710bSMark Peek e_which(Char c)
2102c80476e4SDavid E. O'Brien {				/* do a fast command line which(1) */
2103c80476e4SDavid E. O'Brien     USE(c);
210445e5710bSMark Peek     c_save_inputbuf();
210545e5710bSMark Peek     Hist_num = 0;		/* for the history commands */
2106c80476e4SDavid E. O'Brien     PastBottom();
2107c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2108c80476e4SDavid E. O'Brien     return(CC_WHICH);
2109c80476e4SDavid E. O'Brien }
2110c80476e4SDavid E. O'Brien 
2111c80476e4SDavid E. O'Brien /*ARGSUSED*/
2112c80476e4SDavid E. O'Brien CCRETVAL
211345e5710bSMark Peek e_last_item(Char c)
2114c80476e4SDavid E. O'Brien {				/* insert the last element of the prev. cmd */
21156767bd61SMark Peek     struct Hist *hp;
21166767bd61SMark Peek     struct wordent *wp, *firstp;
21176767bd61SMark Peek     int i;
211845e5710bSMark Peek     Char *expanded;
2119c80476e4SDavid E. O'Brien 
2120c80476e4SDavid E. O'Brien     USE(c);
2121c80476e4SDavid E. O'Brien     if (Argument <= 0)
2122c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2123c80476e4SDavid E. O'Brien 
2124c80476e4SDavid E. O'Brien     hp = Histlist.Hnext;
2125c80476e4SDavid E. O'Brien     if (hp == NULL) {	/* this is only if no history */
2126c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2127c80476e4SDavid E. O'Brien     }
2128c80476e4SDavid E. O'Brien 
2129c80476e4SDavid E. O'Brien     wp = (hp->Hlex).prev;
2130c80476e4SDavid E. O'Brien 
2131c80476e4SDavid E. O'Brien     if (wp->prev == (struct wordent *) NULL)
2132c80476e4SDavid E. O'Brien 	return(CC_ERROR);	/* an empty history entry */
2133c80476e4SDavid E. O'Brien 
2134c80476e4SDavid E. O'Brien     firstp = (hp->Hlex).next;
2135c80476e4SDavid E. O'Brien 
2136c80476e4SDavid E. O'Brien     /* back up arg words in lex */
2137c80476e4SDavid E. O'Brien     for (i = 0; i < Argument && wp != firstp; i++) {
2138c80476e4SDavid E. O'Brien 	wp = wp->prev;
2139c80476e4SDavid E. O'Brien     }
2140c80476e4SDavid E. O'Brien 
214145e5710bSMark Peek     expanded = expand_lex(wp->prev, 0, i - 1);
214245e5710bSMark Peek     if (InsertStr(expanded)) {
214345e5710bSMark Peek 	xfree(expanded);
2144c80476e4SDavid E. O'Brien 	return(CC_ERROR);
214545e5710bSMark Peek     }
2146c80476e4SDavid E. O'Brien 
214745e5710bSMark Peek     xfree(expanded);
2148c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2149c80476e4SDavid E. O'Brien }
2150c80476e4SDavid E. O'Brien 
2151c80476e4SDavid E. O'Brien /*ARGSUSED*/
2152c80476e4SDavid E. O'Brien CCRETVAL
215345e5710bSMark Peek e_dabbrev_expand(Char c)
2154c80476e4SDavid E. O'Brien {				/* expand to preceding word matching prefix */
21556767bd61SMark Peek     Char *cp, *ncp, *bp;
21566767bd61SMark Peek     struct Hist *hp;
215745e5710bSMark Peek     int arg = 0, i;
215845e5710bSMark Peek     size_t len = 0;
215923338178SMark Peek     int found = 0;
216045e5710bSMark Peek     Char *hbuf;
2161c80476e4SDavid E. O'Brien     static int oldevent, hist, word;
2162c80476e4SDavid E. O'Brien     static Char *start, *oldcursor;
2163c80476e4SDavid E. O'Brien 
2164c80476e4SDavid E. O'Brien     USE(c);
2165c80476e4SDavid E. O'Brien     if (Argument <= 0)
2166c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2167c80476e4SDavid E. O'Brien 
21686767bd61SMark Peek     cp = c_preword(Cursor, InputBuf, 1, STRshwordsep);
2169c80476e4SDavid E. O'Brien     if (cp == Cursor || Isspace(*cp))
2170c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2171c80476e4SDavid E. O'Brien 
217245e5710bSMark Peek     hbuf = NULL;
2173c80476e4SDavid E. O'Brien     hp = Histlist.Hnext;
2174c80476e4SDavid E. O'Brien     bp = InputBuf;
2175c80476e4SDavid E. O'Brien     if (Argument == 1 && eventno == oldevent && cp == start &&
217645e5710bSMark Peek 	Cursor == oldcursor && patbuf.len > 0
217745e5710bSMark Peek 	&& Strncmp(patbuf.s, cp, patbuf.len) == 0){
2178c80476e4SDavid E. O'Brien 	/* continue previous search - go to last match (hist/word) */
2179c80476e4SDavid E. O'Brien 	if (hist != 0) {		/* need to move up history */
2180c80476e4SDavid E. O'Brien 	    for (i = 1; i < hist && hp != NULL; i++)
2181c80476e4SDavid E. O'Brien 		hp = hp->Hnext;
2182c80476e4SDavid E. O'Brien 	    if (hp == NULL)	/* "can't happen" */
218345e5710bSMark Peek 		goto err_hbuf;
218445e5710bSMark Peek 	    hbuf = expand_lex(&hp->Hlex, 0, INT_MAX);
218545e5710bSMark Peek 	    cp = Strend(hbuf);
2186c80476e4SDavid E. O'Brien 	    bp = hbuf;
2187c80476e4SDavid E. O'Brien 	    hp = hp->Hnext;
2188c80476e4SDavid E. O'Brien 	}
21896767bd61SMark Peek 	cp = c_preword(cp, bp, word, STRshwordsep);
2190c80476e4SDavid E. O'Brien     } else {			/* starting new search */
2191c80476e4SDavid E. O'Brien 	oldevent = eventno;
2192c80476e4SDavid E. O'Brien 	start = cp;
219345e5710bSMark Peek 	patbuf.len = 0;
219445e5710bSMark Peek 	Strbuf_appendn(&patbuf, cp, Cursor - cp);
2195c80476e4SDavid E. O'Brien 	hist = 0;
2196c80476e4SDavid E. O'Brien 	word = 0;
2197c80476e4SDavid E. O'Brien     }
2198c80476e4SDavid E. O'Brien 
2199c80476e4SDavid E. O'Brien     while (!found) {
22006767bd61SMark Peek 	ncp = c_preword(cp, bp, 1, STRshwordsep);
2201c80476e4SDavid E. O'Brien 	if (ncp == cp || Isspace(*ncp)) { /* beginning of line */
2202c80476e4SDavid E. O'Brien 	    hist++;
2203c80476e4SDavid E. O'Brien 	    word = 0;
2204c80476e4SDavid E. O'Brien 	    if (hp == NULL)
220545e5710bSMark Peek 		goto err_hbuf;
220645e5710bSMark Peek 	    hbuf = expand_lex(&hp->Hlex, 0, INT_MAX);
220745e5710bSMark Peek 	    cp = Strend(hbuf);
2208c80476e4SDavid E. O'Brien 	    bp = hbuf;
2209c80476e4SDavid E. O'Brien 	    hp = hp->Hnext;
2210c80476e4SDavid E. O'Brien 	    continue;
2211c80476e4SDavid E. O'Brien 	} else {
2212c80476e4SDavid E. O'Brien 	    word++;
221345e5710bSMark Peek 	    len = c_endword(ncp-1, cp, 1, STRshwordsep) - ncp + 1;
2214c80476e4SDavid E. O'Brien 	    cp = ncp;
2215c80476e4SDavid E. O'Brien 	}
221645e5710bSMark Peek 	if (len > patbuf.len && Strncmp(cp, patbuf.s, patbuf.len) == 0) {
2217c80476e4SDavid E. O'Brien 	    /* We don't fully check distinct matches as Gnuemacs does: */
2218c80476e4SDavid E. O'Brien 	    if (Argument > 1) {	/* just count matches */
2219c80476e4SDavid E. O'Brien 		if (++arg >= Argument)
2220c80476e4SDavid E. O'Brien 		    found++;
2221c80476e4SDavid E. O'Brien 	    } else {		/* match if distinct from previous */
222245e5710bSMark Peek 		if (len != (size_t)(Cursor - start)
222345e5710bSMark Peek 		    || Strncmp(cp, start, len) != 0)
2224c80476e4SDavid E. O'Brien 		    found++;
2225c80476e4SDavid E. O'Brien 	    }
2226c80476e4SDavid E. O'Brien 	}
2227c80476e4SDavid E. O'Brien     }
2228c80476e4SDavid E. O'Brien 
2229c80476e4SDavid E. O'Brien     if (LastChar + len - (Cursor - start) >= InputLim)
223045e5710bSMark Peek 	goto err_hbuf;	/* no room */
2231c80476e4SDavid E. O'Brien     DeleteBack(Cursor - start);
2232c80476e4SDavid E. O'Brien     c_insert(len);
2233c80476e4SDavid E. O'Brien     while (len--)
2234c80476e4SDavid E. O'Brien 	*Cursor++ = *cp++;
2235c80476e4SDavid E. O'Brien     oldcursor = Cursor;
223645e5710bSMark Peek     xfree(hbuf);
2237c80476e4SDavid E. O'Brien     return(CC_REFRESH);
223845e5710bSMark Peek 
223945e5710bSMark Peek  err_hbuf:
224045e5710bSMark Peek     xfree(hbuf);
224145e5710bSMark Peek     return CC_ERROR;
2242c80476e4SDavid E. O'Brien }
2243c80476e4SDavid E. O'Brien 
2244c80476e4SDavid E. O'Brien /*ARGSUSED*/
2245c80476e4SDavid E. O'Brien CCRETVAL
224645e5710bSMark Peek e_yank_kill(Char c)
2247c80476e4SDavid E. O'Brien {				/* almost like GnuEmacs */
22486767bd61SMark Peek     int len;
22496767bd61SMark Peek     Char *kp, *cp;
2250c80476e4SDavid E. O'Brien 
2251c80476e4SDavid E. O'Brien     USE(c);
22526767bd61SMark Peek     if (KillRingLen == 0)	/* nothing killed */
2253c80476e4SDavid E. O'Brien 	return(CC_ERROR);
22546767bd61SMark Peek     len = Strlen(KillRing[YankPos].buf);
22556767bd61SMark Peek     if (LastChar + len >= InputLim)
2256c80476e4SDavid E. O'Brien 	return(CC_ERROR);	/* end of buffer space */
2257c80476e4SDavid E. O'Brien 
2258c80476e4SDavid E. O'Brien     /* else */
2259c80476e4SDavid E. O'Brien     cp = Cursor;		/* for speed */
2260c80476e4SDavid E. O'Brien 
22616767bd61SMark Peek     c_insert(len);		/* open the space, */
22626767bd61SMark Peek     for (kp = KillRing[YankPos].buf; *kp; kp++)	/* copy the chars */
2263c80476e4SDavid E. O'Brien 	*cp++ = *kp;
2264c80476e4SDavid E. O'Brien 
22656767bd61SMark Peek     if (Argument == 1) {	/* if no arg */
22666767bd61SMark Peek 	Mark = Cursor;		/* mark at beginning, cursor at end */
22676767bd61SMark Peek 	Cursor = cp;
22686767bd61SMark Peek     } else {
22696767bd61SMark Peek 	Mark = cp;		/* else cursor at beginning, mark at end */
22706767bd61SMark Peek     }
22716767bd61SMark Peek 
227245e5710bSMark Peek     if (adrof(STRhighlight) && MarkIsSet) {
227345e5710bSMark Peek 	ClearLines();
227445e5710bSMark Peek 	ClearDisp();
227545e5710bSMark Peek     }
227645e5710bSMark Peek     MarkIsSet = 0;
22776767bd61SMark Peek     return(CC_REFRESH);
22786767bd61SMark Peek }
22796767bd61SMark Peek 
22806767bd61SMark Peek /*ARGSUSED*/
22816767bd61SMark Peek CCRETVAL
228245e5710bSMark Peek e_yank_pop(Char c)
22836767bd61SMark Peek {				/* almost like GnuEmacs */
22846767bd61SMark Peek     int m_bef_c, del_len, ins_len;
22856767bd61SMark Peek     Char *kp, *cp;
22866767bd61SMark Peek 
22876767bd61SMark Peek     USE(c);
22886767bd61SMark Peek 
22896767bd61SMark Peek #if 0
22906767bd61SMark Peek     /* XXX This "should" be here, but doesn't work, since LastCmd
22916767bd61SMark Peek        gets set on CC_ERROR and CC_ARGHACK, which it shouldn't(?).
22926767bd61SMark Peek        (But what about F_ARGFOUR?) I.e. if you hit M-y twice the
22936767bd61SMark Peek        second one will "succeed" even if the first one wasn't preceded
22946767bd61SMark Peek        by a yank, and giving an argument is impossible. Now we "succeed"
22956767bd61SMark Peek        regardless of previous command, which is wrong too of course. */
22966767bd61SMark Peek     if (LastCmd != F_YANK_KILL && LastCmd != F_YANK_POP)
22976767bd61SMark Peek 	return(CC_ERROR);
22986767bd61SMark Peek #endif
22996767bd61SMark Peek 
23006767bd61SMark Peek     if (KillRingLen == 0)	/* nothing killed */
23016767bd61SMark Peek 	return(CC_ERROR);
23026767bd61SMark Peek     YankPos -= Argument;
23036767bd61SMark Peek     while (YankPos < 0)
23046767bd61SMark Peek 	YankPos += KillRingLen;
23056767bd61SMark Peek     YankPos %= KillRingLen;
23066767bd61SMark Peek 
23076767bd61SMark Peek     if (Cursor > Mark) {
23086767bd61SMark Peek 	del_len = Cursor - Mark;
23096767bd61SMark Peek 	m_bef_c = 1;
23106767bd61SMark Peek     } else {
23116767bd61SMark Peek 	del_len = Mark - Cursor;
23126767bd61SMark Peek 	m_bef_c = 0;
23136767bd61SMark Peek     }
23146767bd61SMark Peek     ins_len = Strlen(KillRing[YankPos].buf);
23156767bd61SMark Peek     if (LastChar + ins_len - del_len >= InputLim)
23166767bd61SMark Peek 	return(CC_ERROR);	/* end of buffer space */
23176767bd61SMark Peek 
23186767bd61SMark Peek     if (m_bef_c) {
23196767bd61SMark Peek 	c_delbefore(del_len);
23206767bd61SMark Peek     } else {
23216767bd61SMark Peek 	c_delafter(del_len);
23226767bd61SMark Peek     }
23236767bd61SMark Peek     cp = Cursor;		/* for speed */
23246767bd61SMark Peek 
23256767bd61SMark Peek     c_insert(ins_len);		/* open the space, */
23266767bd61SMark Peek     for (kp = KillRing[YankPos].buf; *kp; kp++)	/* copy the chars */
23276767bd61SMark Peek 	*cp++ = *kp;
23286767bd61SMark Peek 
23296767bd61SMark Peek     if (m_bef_c) {
23306767bd61SMark Peek 	Mark = Cursor;		/* mark at beginning, cursor at end */
23316767bd61SMark Peek 	Cursor = cp;
23326767bd61SMark Peek     } else {
23336767bd61SMark Peek 	Mark = cp;		/* else cursor at beginning, mark at end */
23346767bd61SMark Peek     }
2335c80476e4SDavid E. O'Brien 
233645e5710bSMark Peek     if (adrof(STRhighlight) && MarkIsSet) {
233745e5710bSMark Peek 	ClearLines();
233845e5710bSMark Peek 	ClearDisp();
233945e5710bSMark Peek     }
234045e5710bSMark Peek     MarkIsSet = 0;
2341c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2342c80476e4SDavid E. O'Brien }
2343c80476e4SDavid E. O'Brien 
2344c80476e4SDavid E. O'Brien /*ARGSUSED*/
2345c80476e4SDavid E. O'Brien CCRETVAL
234645e5710bSMark Peek v_delprev(Char c) 		/* Backspace key in insert mode */
2347c80476e4SDavid E. O'Brien {
2348c80476e4SDavid E. O'Brien     int rc;
2349c80476e4SDavid E. O'Brien 
2350c80476e4SDavid E. O'Brien     USE(c);
2351c80476e4SDavid E. O'Brien     rc = CC_ERROR;
2352c80476e4SDavid E. O'Brien 
2353c80476e4SDavid E. O'Brien     if (InsertPos != 0) {
2354c80476e4SDavid E. O'Brien 	if (Argument <= Cursor - InsertPos) {
2355c80476e4SDavid E. O'Brien 	    c_delbefore(Argument);	/* delete before */
2356c80476e4SDavid E. O'Brien 	    rc = CC_REFRESH;
2357c80476e4SDavid E. O'Brien 	}
2358c80476e4SDavid E. O'Brien     }
2359c80476e4SDavid E. O'Brien     return(rc);
2360c80476e4SDavid E. O'Brien }   /* v_delprev  */
2361c80476e4SDavid E. O'Brien 
2362c80476e4SDavid E. O'Brien /*ARGSUSED*/
2363c80476e4SDavid E. O'Brien CCRETVAL
236445e5710bSMark Peek e_delprev(Char c)
2365c80476e4SDavid E. O'Brien {
2366c80476e4SDavid E. O'Brien     USE(c);
2367c80476e4SDavid E. O'Brien     if (Cursor > InputBuf) {
2368c80476e4SDavid E. O'Brien 	c_delbefore(Argument);	/* delete before dot */
2369c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
2370c80476e4SDavid E. O'Brien     }
2371c80476e4SDavid E. O'Brien     else {
2372c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2373c80476e4SDavid E. O'Brien     }
2374c80476e4SDavid E. O'Brien }
2375c80476e4SDavid E. O'Brien 
2376c80476e4SDavid E. O'Brien /*ARGSUSED*/
2377c80476e4SDavid E. O'Brien CCRETVAL
237845e5710bSMark Peek e_delwordprev(Char c)
2379c80476e4SDavid E. O'Brien {
23806767bd61SMark Peek     Char *cp;
2381c80476e4SDavid E. O'Brien 
2382c80476e4SDavid E. O'Brien     USE(c);
2383c80476e4SDavid E. O'Brien     if (Cursor == InputBuf)
2384c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2385c80476e4SDavid E. O'Brien     /* else */
2386c80476e4SDavid E. O'Brien 
2387c80476e4SDavid E. O'Brien     cp = c_prev_word(Cursor, InputBuf, Argument);
2388c80476e4SDavid E. O'Brien 
23896767bd61SMark Peek     c_push_kill(cp, Cursor);	/* save the text */
2390c80476e4SDavid E. O'Brien 
2391c80476e4SDavid E. O'Brien     c_delbefore((int)(Cursor - cp));	/* delete before dot */
2392c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2393c80476e4SDavid E. O'Brien }
2394c80476e4SDavid E. O'Brien 
2395c80476e4SDavid E. O'Brien /* DCS <dcs@neutron.chem.yale.edu>, 9 Oct 93
2396c80476e4SDavid E. O'Brien  *
2397c80476e4SDavid E. O'Brien  * Changed the names of some of the ^D family of editor functions to
2398c80476e4SDavid E. O'Brien  * correspond to what they actually do and created new e_delnext_list
2399c80476e4SDavid E. O'Brien  * for completeness.
2400c80476e4SDavid E. O'Brien  *
2401c80476e4SDavid E. O'Brien  *   Old names:			New names:
2402c80476e4SDavid E. O'Brien  *
2403c80476e4SDavid E. O'Brien  *   delete-char		delete-char-or-eof
2404c80476e4SDavid E. O'Brien  *     F_DELNEXT		  F_DELNEXT_EOF
2405c80476e4SDavid E. O'Brien  *     e_delnext		  e_delnext_eof
2406c80476e4SDavid E. O'Brien  *     edelnxt			  edelnxteof
2407c80476e4SDavid E. O'Brien  *   delete-char-or-eof		delete-char
2408c80476e4SDavid E. O'Brien  *     F_DELNEXT_EOF		  F_DELNEXT
2409c80476e4SDavid E. O'Brien  *     e_delnext_eof		  e_delnext
2410c80476e4SDavid E. O'Brien  *     edelnxteof		  edelnxt
2411c80476e4SDavid E. O'Brien  *   delete-char-or-list	delete-char-or-list-or-eof
2412c80476e4SDavid E. O'Brien  *     F_LIST_DELNEXT		  F_DELNEXT_LIST_EOF
2413c80476e4SDavid E. O'Brien  *     e_list_delnext		  e_delnext_list_eof
2414c80476e4SDavid E. O'Brien  *   				  edellsteof
2415c80476e4SDavid E. O'Brien  *   (no old equivalent)	delete-char-or-list
2416c80476e4SDavid E. O'Brien  *   				  F_DELNEXT_LIST
2417c80476e4SDavid E. O'Brien  *   				  e_delnext_list
2418c80476e4SDavid E. O'Brien  *   				  e_delnxtlst
2419c80476e4SDavid E. O'Brien  */
2420c80476e4SDavid E. O'Brien 
2421c80476e4SDavid E. O'Brien /* added by mtk@ari.ncl.omron.co.jp (920818) */
2422c80476e4SDavid E. O'Brien /* rename e_delnext() -> e_delnext_eof() */
2423c80476e4SDavid E. O'Brien /*ARGSUSED*/
2424c80476e4SDavid E. O'Brien CCRETVAL
242545e5710bSMark Peek e_delnext(Char c)
2426c80476e4SDavid E. O'Brien {
2427c80476e4SDavid E. O'Brien     USE(c);
2428c80476e4SDavid E. O'Brien     if (Cursor == LastChar) {/* if I'm at the end */
2429c80476e4SDavid E. O'Brien 	if (!VImode) {
2430c80476e4SDavid E. O'Brien 		return(CC_ERROR);
2431c80476e4SDavid E. O'Brien 	}
2432c80476e4SDavid E. O'Brien 	else {
2433c80476e4SDavid E. O'Brien 	    if (Cursor != InputBuf)
2434c80476e4SDavid E. O'Brien 		Cursor--;
2435c80476e4SDavid E. O'Brien 	    else
2436c80476e4SDavid E. O'Brien 		return(CC_ERROR);
2437c80476e4SDavid E. O'Brien 	}
2438c80476e4SDavid E. O'Brien     }
2439c80476e4SDavid E. O'Brien     c_delafter(Argument);	/* delete after dot */
2440c80476e4SDavid E. O'Brien     if (Cursor > LastChar)
2441c80476e4SDavid E. O'Brien 	Cursor = LastChar;	/* bounds check */
2442c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2443c80476e4SDavid E. O'Brien }
2444c80476e4SDavid E. O'Brien 
2445c80476e4SDavid E. O'Brien 
2446c80476e4SDavid E. O'Brien /*ARGSUSED*/
2447c80476e4SDavid E. O'Brien CCRETVAL
244845e5710bSMark Peek e_delnext_eof(Char c)
2449c80476e4SDavid E. O'Brien {
2450c80476e4SDavid E. O'Brien     USE(c);
2451c80476e4SDavid E. O'Brien     if (Cursor == LastChar) {/* if I'm at the end */
2452c80476e4SDavid E. O'Brien 	if (!VImode) {
2453c80476e4SDavid E. O'Brien 	    if (Cursor == InputBuf) {
2454c80476e4SDavid E. O'Brien 		/* if I'm also at the beginning */
2455c80476e4SDavid E. O'Brien 		so_write(STReof, 4);/* then do a EOF */
2456c80476e4SDavid E. O'Brien 		flush();
2457c80476e4SDavid E. O'Brien 		return(CC_EOF);
2458c80476e4SDavid E. O'Brien 	    }
2459c80476e4SDavid E. O'Brien 	    else
2460c80476e4SDavid E. O'Brien 		return(CC_ERROR);
2461c80476e4SDavid E. O'Brien 	}
2462c80476e4SDavid E. O'Brien 	else {
2463c80476e4SDavid E. O'Brien 	    if (Cursor != InputBuf)
2464c80476e4SDavid E. O'Brien 		Cursor--;
2465c80476e4SDavid E. O'Brien 	    else
2466c80476e4SDavid E. O'Brien 		return(CC_ERROR);
2467c80476e4SDavid E. O'Brien 	}
2468c80476e4SDavid E. O'Brien     }
2469c80476e4SDavid E. O'Brien     c_delafter(Argument);	/* delete after dot */
2470c80476e4SDavid E. O'Brien     if (Cursor > LastChar)
2471c80476e4SDavid E. O'Brien 	Cursor = LastChar;	/* bounds check */
2472c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2473c80476e4SDavid E. O'Brien }
2474c80476e4SDavid E. O'Brien 
2475c80476e4SDavid E. O'Brien /*ARGSUSED*/
2476c80476e4SDavid E. O'Brien CCRETVAL
247745e5710bSMark Peek e_delnext_list(Char c)
2478c80476e4SDavid E. O'Brien {
2479c80476e4SDavid E. O'Brien     USE(c);
2480c80476e4SDavid E. O'Brien     if (Cursor == LastChar) {	/* if I'm at the end */
2481c80476e4SDavid E. O'Brien 	PastBottom();
2482c80476e4SDavid E. O'Brien 	*LastChar = '\0';	/* just in case */
2483c80476e4SDavid E. O'Brien 	return(CC_LIST_CHOICES);
2484c80476e4SDavid E. O'Brien     }
2485c80476e4SDavid E. O'Brien     else {
2486c80476e4SDavid E. O'Brien 	c_delafter(Argument);	/* delete after dot */
2487c80476e4SDavid E. O'Brien 	if (Cursor > LastChar)
2488c80476e4SDavid E. O'Brien 	    Cursor = LastChar;	/* bounds check */
2489c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
2490c80476e4SDavid E. O'Brien     }
2491c80476e4SDavid E. O'Brien }
2492c80476e4SDavid E. O'Brien 
2493c80476e4SDavid E. O'Brien /*ARGSUSED*/
2494c80476e4SDavid E. O'Brien CCRETVAL
249545e5710bSMark Peek e_delnext_list_eof(Char c)
2496c80476e4SDavid E. O'Brien {
2497c80476e4SDavid E. O'Brien     USE(c);
2498c80476e4SDavid E. O'Brien     if (Cursor == LastChar) {	/* if I'm at the end */
2499c80476e4SDavid E. O'Brien 	if (Cursor == InputBuf) {	/* if I'm also at the beginning */
2500c80476e4SDavid E. O'Brien 	    so_write(STReof, 4);/* then do a EOF */
2501c80476e4SDavid E. O'Brien 	    flush();
2502c80476e4SDavid E. O'Brien 	    return(CC_EOF);
2503c80476e4SDavid E. O'Brien 	}
2504c80476e4SDavid E. O'Brien 	else {
2505c80476e4SDavid E. O'Brien 	    PastBottom();
2506c80476e4SDavid E. O'Brien 	    *LastChar = '\0';	/* just in case */
2507c80476e4SDavid E. O'Brien 	    return(CC_LIST_CHOICES);
2508c80476e4SDavid E. O'Brien 	}
2509c80476e4SDavid E. O'Brien     }
2510c80476e4SDavid E. O'Brien     else {
2511c80476e4SDavid E. O'Brien 	c_delafter(Argument);	/* delete after dot */
2512c80476e4SDavid E. O'Brien 	if (Cursor > LastChar)
2513c80476e4SDavid E. O'Brien 	    Cursor = LastChar;	/* bounds check */
2514c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
2515c80476e4SDavid E. O'Brien     }
2516c80476e4SDavid E. O'Brien }
2517c80476e4SDavid E. O'Brien 
2518c80476e4SDavid E. O'Brien /*ARGSUSED*/
2519c80476e4SDavid E. O'Brien CCRETVAL
252045e5710bSMark Peek e_list_eof(Char c)
2521c80476e4SDavid E. O'Brien {
2522c80476e4SDavid E. O'Brien     CCRETVAL rv;
2523c80476e4SDavid E. O'Brien 
2524c80476e4SDavid E. O'Brien     USE(c);
2525c80476e4SDavid E. O'Brien     if (Cursor == LastChar && Cursor == InputBuf) {
2526c80476e4SDavid E. O'Brien 	so_write(STReof, 4);	/* then do a EOF */
2527c80476e4SDavid E. O'Brien 	flush();
2528c80476e4SDavid E. O'Brien 	rv = CC_EOF;
2529c80476e4SDavid E. O'Brien     }
2530c80476e4SDavid E. O'Brien     else {
2531c80476e4SDavid E. O'Brien 	PastBottom();
2532c80476e4SDavid E. O'Brien 	*LastChar = '\0';	/* just in case */
2533c80476e4SDavid E. O'Brien 	rv = CC_LIST_CHOICES;
2534c80476e4SDavid E. O'Brien     }
2535c80476e4SDavid E. O'Brien     return rv;
2536c80476e4SDavid E. O'Brien }
2537c80476e4SDavid E. O'Brien 
2538c80476e4SDavid E. O'Brien /*ARGSUSED*/
2539c80476e4SDavid E. O'Brien CCRETVAL
254045e5710bSMark Peek e_delwordnext(Char c)
2541c80476e4SDavid E. O'Brien {
25426767bd61SMark Peek     Char *cp;
2543c80476e4SDavid E. O'Brien 
2544c80476e4SDavid E. O'Brien     USE(c);
2545c80476e4SDavid E. O'Brien     if (Cursor == LastChar)
2546c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2547c80476e4SDavid E. O'Brien     /* else */
2548c80476e4SDavid E. O'Brien 
2549c80476e4SDavid E. O'Brien     cp = c_next_word(Cursor, LastChar, Argument);
2550c80476e4SDavid E. O'Brien 
25516767bd61SMark Peek     c_push_kill(Cursor, cp);	/* save the text */
2552c80476e4SDavid E. O'Brien 
2553c80476e4SDavid E. O'Brien     c_delafter((int)(cp - Cursor));	/* delete after dot */
2554c80476e4SDavid E. O'Brien     if (Cursor > LastChar)
2555c80476e4SDavid E. O'Brien 	Cursor = LastChar;	/* bounds check */
2556c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2557c80476e4SDavid E. O'Brien }
2558c80476e4SDavid E. O'Brien 
2559c80476e4SDavid E. O'Brien /*ARGSUSED*/
2560c80476e4SDavid E. O'Brien CCRETVAL
256145e5710bSMark Peek e_toend(Char c)
2562c80476e4SDavid E. O'Brien {
2563c80476e4SDavid E. O'Brien     USE(c);
2564c80476e4SDavid E. O'Brien     Cursor = LastChar;
2565c80476e4SDavid E. O'Brien     if (VImode)
2566c80476e4SDavid E. O'Brien 	if (ActionFlag & TCSHOP_DELETE) {
2567c80476e4SDavid E. O'Brien 	    c_delfini();
2568c80476e4SDavid E. O'Brien 	    return(CC_REFRESH);
2569c80476e4SDavid E. O'Brien 	}
2570c80476e4SDavid E. O'Brien     RefCursor();		/* move the cursor */
2571c80476e4SDavid E. O'Brien     return(CC_NORM);
2572c80476e4SDavid E. O'Brien }
2573c80476e4SDavid E. O'Brien 
2574c80476e4SDavid E. O'Brien /*ARGSUSED*/
2575c80476e4SDavid E. O'Brien CCRETVAL
257645e5710bSMark Peek e_tobeg(Char c)
2577c80476e4SDavid E. O'Brien {
2578c80476e4SDavid E. O'Brien     USE(c);
2579c80476e4SDavid E. O'Brien     Cursor = InputBuf;
2580c80476e4SDavid E. O'Brien 
2581c80476e4SDavid E. O'Brien     if (VImode) {
2582c80476e4SDavid E. O'Brien        while (Isspace(*Cursor)) /* We want FIRST non space character */
2583c80476e4SDavid E. O'Brien 	Cursor++;
2584c80476e4SDavid E. O'Brien 	if (ActionFlag & TCSHOP_DELETE) {
2585c80476e4SDavid E. O'Brien 	    c_delfini();
2586c80476e4SDavid E. O'Brien 	    return(CC_REFRESH);
2587c80476e4SDavid E. O'Brien 	}
2588c80476e4SDavid E. O'Brien     }
2589c80476e4SDavid E. O'Brien 
2590c80476e4SDavid E. O'Brien     RefCursor();		/* move the cursor */
2591c80476e4SDavid E. O'Brien     return(CC_NORM);
2592c80476e4SDavid E. O'Brien }
2593c80476e4SDavid E. O'Brien 
2594c80476e4SDavid E. O'Brien /*ARGSUSED*/
2595c80476e4SDavid E. O'Brien CCRETVAL
259645e5710bSMark Peek e_killend(Char c)
2597c80476e4SDavid E. O'Brien {
2598c80476e4SDavid E. O'Brien     USE(c);
25996767bd61SMark Peek     c_push_kill(Cursor, LastChar); /* copy it */
260045e5710bSMark Peek     LastChar = Cursor;		/* zap! -- delete to end */
260145e5710bSMark Peek     if (Mark > Cursor)
260245e5710bSMark Peek         Mark = Cursor;
260345e5710bSMark Peek     MarkIsSet = 0;
2604c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2605c80476e4SDavid E. O'Brien }
2606c80476e4SDavid E. O'Brien 
2607c80476e4SDavid E. O'Brien 
2608c80476e4SDavid E. O'Brien /*ARGSUSED*/
2609c80476e4SDavid E. O'Brien CCRETVAL
261045e5710bSMark Peek e_killbeg(Char c)
2611c80476e4SDavid E. O'Brien {
2612c80476e4SDavid E. O'Brien     USE(c);
26136767bd61SMark Peek     c_push_kill(InputBuf, Cursor); /* copy it */
2614c80476e4SDavid E. O'Brien     c_delbefore((int)(Cursor - InputBuf));
261523338178SMark Peek     if (Mark && Mark > Cursor)
261623338178SMark Peek         Mark -= Cursor-InputBuf;
2617c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2618c80476e4SDavid E. O'Brien }
2619c80476e4SDavid E. O'Brien 
2620c80476e4SDavid E. O'Brien /*ARGSUSED*/
2621c80476e4SDavid E. O'Brien CCRETVAL
262245e5710bSMark Peek e_killall(Char c)
2623c80476e4SDavid E. O'Brien {
2624c80476e4SDavid E. O'Brien     USE(c);
26256767bd61SMark Peek     c_push_kill(InputBuf, LastChar); /* copy it */
262623338178SMark Peek     Cursor = Mark = LastChar = InputBuf;	/* zap! -- delete all of it */
262745e5710bSMark Peek     MarkIsSet = 0;
2628c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2629c80476e4SDavid E. O'Brien }
2630c80476e4SDavid E. O'Brien 
2631c80476e4SDavid E. O'Brien /*ARGSUSED*/
2632c80476e4SDavid E. O'Brien CCRETVAL
263345e5710bSMark Peek e_killregion(Char c)
2634c80476e4SDavid E. O'Brien {
2635c80476e4SDavid E. O'Brien     USE(c);
2636c80476e4SDavid E. O'Brien     if (!Mark)
2637c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2638c80476e4SDavid E. O'Brien 
2639c80476e4SDavid E. O'Brien     if (Mark > Cursor) {
26406767bd61SMark Peek 	c_push_kill(Cursor, Mark); /* copy it */
26416767bd61SMark Peek 	c_delafter((int)(Mark - Cursor)); /* delete it - UNUSED BY VI mode */
26426767bd61SMark Peek 	Mark = Cursor;
2643c80476e4SDavid E. O'Brien     }
2644c80476e4SDavid E. O'Brien     else {			/* mark is before cursor */
26456767bd61SMark Peek 	c_push_kill(Mark, Cursor); /* copy it */
26466767bd61SMark Peek 	c_delbefore((int)(Cursor - Mark));
2647c80476e4SDavid E. O'Brien     }
264845e5710bSMark Peek     if (adrof(STRhighlight) && MarkIsSet) {
264945e5710bSMark Peek 	ClearLines();
265045e5710bSMark Peek 	ClearDisp();
265145e5710bSMark Peek     }
265245e5710bSMark Peek     MarkIsSet = 0;
2653c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2654c80476e4SDavid E. O'Brien }
2655c80476e4SDavid E. O'Brien 
2656c80476e4SDavid E. O'Brien /*ARGSUSED*/
2657c80476e4SDavid E. O'Brien CCRETVAL
265845e5710bSMark Peek e_copyregion(Char c)
2659c80476e4SDavid E. O'Brien {
2660c80476e4SDavid E. O'Brien     USE(c);
2661c80476e4SDavid E. O'Brien     if (!Mark)
2662c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2663c80476e4SDavid E. O'Brien 
2664c80476e4SDavid E. O'Brien     if (Mark > Cursor) {
26656767bd61SMark Peek 	c_push_kill(Cursor, Mark); /* copy it */
2666c80476e4SDavid E. O'Brien     }
2667c80476e4SDavid E. O'Brien     else {			/* mark is before cursor */
26686767bd61SMark Peek 	c_push_kill(Mark, Cursor); /* copy it */
2669c80476e4SDavid E. O'Brien     }
2670c80476e4SDavid E. O'Brien     return(CC_NORM);		/* don't even need to Refresh() */
2671c80476e4SDavid E. O'Brien }
2672c80476e4SDavid E. O'Brien 
2673c80476e4SDavid E. O'Brien /*ARGSUSED*/
2674c80476e4SDavid E. O'Brien CCRETVAL
267545e5710bSMark Peek e_charswitch(Char cc)
2676c80476e4SDavid E. O'Brien {
26776767bd61SMark Peek     Char c;
2678c80476e4SDavid E. O'Brien 
2679c80476e4SDavid E. O'Brien     USE(cc);
2680c80476e4SDavid E. O'Brien 
2681c80476e4SDavid E. O'Brien     /* do nothing if we are at beginning of line or have only one char */
2682c80476e4SDavid E. O'Brien     if (Cursor == &InputBuf[0] || LastChar == &InputBuf[1]) {
2683c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2684c80476e4SDavid E. O'Brien     }
2685c80476e4SDavid E. O'Brien 
2686c80476e4SDavid E. O'Brien     if (Cursor < LastChar) {
2687c80476e4SDavid E. O'Brien 	Cursor++;
2688c80476e4SDavid E. O'Brien     }
2689c80476e4SDavid E. O'Brien     c = Cursor[-2];
2690c80476e4SDavid E. O'Brien     Cursor[-2] = Cursor[-1];
2691c80476e4SDavid E. O'Brien     Cursor[-1] = c;
2692c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2693c80476e4SDavid E. O'Brien }
2694c80476e4SDavid E. O'Brien 
2695c80476e4SDavid E. O'Brien /*ARGSUSED*/
2696c80476e4SDavid E. O'Brien CCRETVAL
269745e5710bSMark Peek e_gcharswitch(Char cc)
2698c80476e4SDavid E. O'Brien {				/* gosmacs style ^T */
26996767bd61SMark Peek     Char c;
2700c80476e4SDavid E. O'Brien 
2701c80476e4SDavid E. O'Brien     USE(cc);
2702c80476e4SDavid E. O'Brien     if (Cursor > &InputBuf[1]) {/* must have at least two chars entered */
2703c80476e4SDavid E. O'Brien 	c = Cursor[-2];
2704c80476e4SDavid E. O'Brien 	Cursor[-2] = Cursor[-1];
2705c80476e4SDavid E. O'Brien 	Cursor[-1] = c;
2706c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
2707c80476e4SDavid E. O'Brien     }
2708c80476e4SDavid E. O'Brien     else {
2709c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2710c80476e4SDavid E. O'Brien     }
2711c80476e4SDavid E. O'Brien }
2712c80476e4SDavid E. O'Brien 
2713c80476e4SDavid E. O'Brien /*ARGSUSED*/
2714c80476e4SDavid E. O'Brien CCRETVAL
271545e5710bSMark Peek e_charback(Char c)
2716c80476e4SDavid E. O'Brien {
2717c80476e4SDavid E. O'Brien     USE(c);
2718c80476e4SDavid E. O'Brien     if (Cursor > InputBuf) {
271945e5710bSMark Peek 	if (Argument > Cursor - InputBuf)
2720c80476e4SDavid E. O'Brien 	    Cursor = InputBuf;
2721c80476e4SDavid E. O'Brien 	else
272245e5710bSMark Peek 	    Cursor -= Argument;
2723c80476e4SDavid E. O'Brien 
2724c80476e4SDavid E. O'Brien 	if (VImode)
2725c80476e4SDavid E. O'Brien 	    if (ActionFlag & TCSHOP_DELETE) {
2726c80476e4SDavid E. O'Brien 		c_delfini();
2727c80476e4SDavid E. O'Brien 		return(CC_REFRESH);
2728c80476e4SDavid E. O'Brien 	    }
2729c80476e4SDavid E. O'Brien 
2730c80476e4SDavid E. O'Brien 	RefCursor();
2731c80476e4SDavid E. O'Brien 	return(CC_NORM);
2732c80476e4SDavid E. O'Brien     }
2733c80476e4SDavid E. O'Brien     else {
2734c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2735c80476e4SDavid E. O'Brien     }
2736c80476e4SDavid E. O'Brien }
2737c80476e4SDavid E. O'Brien 
2738c80476e4SDavid E. O'Brien /*ARGSUSED*/
2739c80476e4SDavid E. O'Brien CCRETVAL
274045e5710bSMark Peek v_wordback(Char c)
2741c80476e4SDavid E. O'Brien {
2742c80476e4SDavid E. O'Brien     USE(c);
2743c80476e4SDavid E. O'Brien     if (Cursor == InputBuf)
2744c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2745c80476e4SDavid E. O'Brien     /* else */
2746c80476e4SDavid E. O'Brien 
27476767bd61SMark Peek     Cursor = c_preword(Cursor, InputBuf, Argument, STRshwspace); /* bounds check */
2748c80476e4SDavid E. O'Brien 
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_wordback(Char c)
2761c80476e4SDavid E. O'Brien {
2762c80476e4SDavid E. O'Brien     USE(c);
2763c80476e4SDavid E. O'Brien     if (Cursor == InputBuf)
2764c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2765c80476e4SDavid E. O'Brien     /* else */
2766c80476e4SDavid E. O'Brien 
2767c80476e4SDavid E. O'Brien     Cursor = c_prev_word(Cursor, InputBuf, Argument); /* bounds check */
2768c80476e4SDavid E. O'Brien 
2769c80476e4SDavid E. O'Brien     if (VImode)
2770c80476e4SDavid E. O'Brien 	if (ActionFlag & TCSHOP_DELETE) {
2771c80476e4SDavid E. O'Brien 	    c_delfini();
2772c80476e4SDavid E. O'Brien 	    return(CC_REFRESH);
2773c80476e4SDavid E. O'Brien 	}
2774c80476e4SDavid E. O'Brien 
2775c80476e4SDavid E. O'Brien     RefCursor();
2776c80476e4SDavid E. O'Brien     return(CC_NORM);
2777c80476e4SDavid E. O'Brien }
2778c80476e4SDavid E. O'Brien 
2779c80476e4SDavid E. O'Brien /*ARGSUSED*/
2780c80476e4SDavid E. O'Brien CCRETVAL
278145e5710bSMark Peek e_charfwd(Char c)
2782c80476e4SDavid E. O'Brien {
2783c80476e4SDavid E. O'Brien     USE(c);
2784c80476e4SDavid E. O'Brien     if (Cursor < LastChar) {
278545e5710bSMark Peek 	Cursor += Argument;
2786c80476e4SDavid E. O'Brien 	if (Cursor > LastChar)
2787c80476e4SDavid E. O'Brien 	    Cursor = LastChar;
2788c80476e4SDavid E. O'Brien 
2789c80476e4SDavid E. O'Brien 	if (VImode)
2790c80476e4SDavid E. O'Brien 	    if (ActionFlag & TCSHOP_DELETE) {
2791c80476e4SDavid E. O'Brien 		c_delfini();
2792c80476e4SDavid E. O'Brien 		return(CC_REFRESH);
2793c80476e4SDavid E. O'Brien 	    }
2794c80476e4SDavid E. O'Brien 
2795c80476e4SDavid E. O'Brien 	RefCursor();
2796c80476e4SDavid E. O'Brien 	return(CC_NORM);
2797c80476e4SDavid E. O'Brien     }
2798c80476e4SDavid E. O'Brien     else {
2799c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2800c80476e4SDavid E. O'Brien     }
2801c80476e4SDavid E. O'Brien }
2802c80476e4SDavid E. O'Brien 
2803c80476e4SDavid E. O'Brien /*ARGSUSED*/
2804c80476e4SDavid E. O'Brien CCRETVAL
280545e5710bSMark Peek e_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_next_word(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_wordfwd(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_nexword(Cursor, LastChar, Argument);
2834c80476e4SDavid E. O'Brien 
2835c80476e4SDavid E. O'Brien     if (VImode)
2836c80476e4SDavid E. O'Brien 	if (ActionFlag & TCSHOP_DELETE) {
2837c80476e4SDavid E. O'Brien 	    c_delfini();
2838c80476e4SDavid E. O'Brien 	    return(CC_REFRESH);
2839c80476e4SDavid E. O'Brien 	}
2840c80476e4SDavid E. O'Brien 
2841c80476e4SDavid E. O'Brien     RefCursor();
2842c80476e4SDavid E. O'Brien     return(CC_NORM);
2843c80476e4SDavid E. O'Brien }
2844c80476e4SDavid E. O'Brien 
2845c80476e4SDavid E. O'Brien /*ARGSUSED*/
2846c80476e4SDavid E. O'Brien CCRETVAL
284745e5710bSMark Peek v_wordbegnext(Char c)
2848c80476e4SDavid E. O'Brien {
2849c80476e4SDavid E. O'Brien     USE(c);
2850c80476e4SDavid E. O'Brien     if (Cursor == LastChar)
2851c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2852c80476e4SDavid E. O'Brien     /* else */
2853c80476e4SDavid E. O'Brien 
2854c80476e4SDavid E. O'Brien     Cursor = c_next_word(Cursor, LastChar, Argument);
2855c80476e4SDavid E. O'Brien     if (Cursor < LastChar)
2856c80476e4SDavid E. O'Brien 	Cursor++;
2857c80476e4SDavid E. O'Brien 
2858c80476e4SDavid E. O'Brien     if (VImode)
2859c80476e4SDavid E. O'Brien 	if (ActionFlag & TCSHOP_DELETE) {
2860c80476e4SDavid E. O'Brien 	    c_delfini();
2861c80476e4SDavid E. O'Brien 	    return(CC_REFRESH);
2862c80476e4SDavid E. O'Brien 	}
2863c80476e4SDavid E. O'Brien 
2864c80476e4SDavid E. O'Brien     RefCursor();
2865c80476e4SDavid E. O'Brien     return(CC_NORM);
2866c80476e4SDavid E. O'Brien }
2867c80476e4SDavid E. O'Brien 
2868c80476e4SDavid E. O'Brien /*ARGSUSED*/
2869c80476e4SDavid E. O'Brien static CCRETVAL
287045e5710bSMark Peek v_repeat_srch(int c)
2871c80476e4SDavid E. O'Brien {
2872c80476e4SDavid E. O'Brien     CCRETVAL rv = CC_ERROR;
2873c80476e4SDavid E. O'Brien #ifdef SDEBUG
2874c80476e4SDavid E. O'Brien     xprintf("dir %d patlen %d patbuf %S\n",
287545e5710bSMark Peek 	    c, (int)patbuf.len, patbuf.s);
2876c80476e4SDavid E. O'Brien #endif
2877c80476e4SDavid E. O'Brien 
2878c80476e4SDavid E. O'Brien     LastCmd = (KEYCMD) c;  /* Hack to stop c_hsetpat */
2879c80476e4SDavid E. O'Brien     LastChar = InputBuf;
2880c80476e4SDavid E. O'Brien     switch (c) {
2881c80476e4SDavid E. O'Brien     case F_DOWN_SEARCH_HIST:
2882c80476e4SDavid E. O'Brien 	rv = e_down_search_hist(0);
2883c80476e4SDavid E. O'Brien 	break;
2884c80476e4SDavid E. O'Brien     case F_UP_SEARCH_HIST:
2885c80476e4SDavid E. O'Brien 	rv = e_up_search_hist(0);
2886c80476e4SDavid E. O'Brien 	break;
2887c80476e4SDavid E. O'Brien     default:
2888c80476e4SDavid E. O'Brien 	break;
2889c80476e4SDavid E. O'Brien     }
2890c80476e4SDavid E. O'Brien     return rv;
2891c80476e4SDavid E. O'Brien }
2892c80476e4SDavid E. O'Brien 
2893c80476e4SDavid E. O'Brien static CCRETVAL
289445e5710bSMark Peek v_csearch_back(Char ch, int count, int tflag)
2895c80476e4SDavid E. O'Brien {
2896c80476e4SDavid E. O'Brien     Char *cp;
2897c80476e4SDavid E. O'Brien 
2898c80476e4SDavid E. O'Brien     cp = Cursor;
2899c80476e4SDavid E. O'Brien     while (count--) {
2900c80476e4SDavid E. O'Brien 	if (*cp == ch)
2901c80476e4SDavid E. O'Brien 	    cp--;
2902c80476e4SDavid E. O'Brien 	while (cp > InputBuf && *cp != ch)
2903c80476e4SDavid E. O'Brien 	    cp--;
2904c80476e4SDavid E. O'Brien     }
2905c80476e4SDavid E. O'Brien 
2906c80476e4SDavid E. O'Brien     if (cp < InputBuf || (cp == InputBuf && *cp != ch))
2907c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2908c80476e4SDavid E. O'Brien 
2909c80476e4SDavid E. O'Brien     if (*cp == ch && tflag)
2910c80476e4SDavid E. O'Brien 	cp++;
2911c80476e4SDavid E. O'Brien 
2912c80476e4SDavid E. O'Brien     Cursor = cp;
2913c80476e4SDavid E. O'Brien 
2914c80476e4SDavid E. O'Brien     if (ActionFlag & TCSHOP_DELETE) {
2915c80476e4SDavid E. O'Brien 	Cursor++;
2916c80476e4SDavid E. O'Brien 	c_delfini();
2917c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
2918c80476e4SDavid E. O'Brien     }
2919c80476e4SDavid E. O'Brien 
2920c80476e4SDavid E. O'Brien     RefCursor();
2921c80476e4SDavid E. O'Brien     return(CC_NORM);
2922c80476e4SDavid E. O'Brien }
2923c80476e4SDavid E. O'Brien 
2924c80476e4SDavid E. O'Brien static CCRETVAL
292545e5710bSMark Peek v_csearch_fwd(Char ch, int count, int tflag)
2926c80476e4SDavid E. O'Brien {
2927c80476e4SDavid E. O'Brien     Char *cp;
2928c80476e4SDavid E. O'Brien 
2929c80476e4SDavid E. O'Brien     cp = Cursor;
2930c80476e4SDavid E. O'Brien     while (count--) {
2931c80476e4SDavid E. O'Brien 	if(*cp == ch)
2932c80476e4SDavid E. O'Brien 	    cp++;
2933c80476e4SDavid E. O'Brien 	while (cp < LastChar && *cp != ch)
2934c80476e4SDavid E. O'Brien 	    cp++;
2935c80476e4SDavid E. O'Brien     }
2936c80476e4SDavid E. O'Brien 
2937c80476e4SDavid E. O'Brien     if (cp >= LastChar)
2938c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2939c80476e4SDavid E. O'Brien 
2940c80476e4SDavid E. O'Brien     if (*cp == ch && tflag)
2941c80476e4SDavid E. O'Brien 	cp--;
2942c80476e4SDavid E. O'Brien 
2943c80476e4SDavid E. O'Brien     Cursor = cp;
2944c80476e4SDavid E. O'Brien 
2945c80476e4SDavid E. O'Brien     if (ActionFlag & TCSHOP_DELETE) {
2946c80476e4SDavid E. O'Brien 	Cursor++;
2947c80476e4SDavid E. O'Brien 	c_delfini();
2948c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
2949c80476e4SDavid E. O'Brien     }
2950c80476e4SDavid E. O'Brien     RefCursor();
2951c80476e4SDavid E. O'Brien     return(CC_NORM);
2952c80476e4SDavid E. O'Brien }
2953c80476e4SDavid E. O'Brien 
2954c80476e4SDavid E. O'Brien /*ARGSUSED*/
2955c80476e4SDavid E. O'Brien static CCRETVAL
295645e5710bSMark Peek v_action(int c)
2957c80476e4SDavid E. O'Brien {
29586767bd61SMark Peek     Char *cp, *kp;
2959c80476e4SDavid E. O'Brien 
2960c80476e4SDavid E. O'Brien     if (ActionFlag == TCSHOP_DELETE) {
2961c80476e4SDavid E. O'Brien 	ActionFlag = TCSHOP_NOP;
2962c80476e4SDavid E. O'Brien 	ActionPos = 0;
2963c80476e4SDavid E. O'Brien 
2964c80476e4SDavid E. O'Brien 	UndoSize = 0;
2965c80476e4SDavid E. O'Brien 	kp = UndoBuf;
2966c80476e4SDavid E. O'Brien 	for (cp = InputBuf; cp < LastChar; cp++) {
2967c80476e4SDavid E. O'Brien 	    *kp++ = *cp;
2968c80476e4SDavid E. O'Brien 	    UndoSize++;
2969c80476e4SDavid E. O'Brien 	}
2970c80476e4SDavid E. O'Brien 
2971c80476e4SDavid E. O'Brien 	UndoAction = TCSHOP_INSERT;
2972c80476e4SDavid E. O'Brien 	UndoPtr  = InputBuf;
2973c80476e4SDavid E. O'Brien 	LastChar = InputBuf;
2974c80476e4SDavid E. O'Brien 	Cursor   = InputBuf;
2975c80476e4SDavid E. O'Brien 	if (c & TCSHOP_INSERT)
2976c80476e4SDavid E. O'Brien 	    c_alternativ_key_map(0);
2977c80476e4SDavid E. O'Brien 
2978c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
2979c80476e4SDavid E. O'Brien     }
2980c80476e4SDavid E. O'Brien #ifdef notdef
2981c80476e4SDavid E. O'Brien     else if (ActionFlag == TCSHOP_NOP) {
2982c80476e4SDavid E. O'Brien #endif
2983c80476e4SDavid E. O'Brien 	ActionPos = Cursor;
2984c80476e4SDavid E. O'Brien 	ActionFlag = c;
2985c80476e4SDavid E. O'Brien 	return(CC_ARGHACK);  /* Do NOT clear out argument */
2986c80476e4SDavid E. O'Brien #ifdef notdef
2987c80476e4SDavid E. O'Brien     }
2988c80476e4SDavid E. O'Brien     else {
2989c80476e4SDavid E. O'Brien 	ActionFlag = 0;
2990c80476e4SDavid E. O'Brien 	ActionPos = 0;
2991c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2992c80476e4SDavid E. O'Brien     }
2993c80476e4SDavid E. O'Brien #endif
2994c80476e4SDavid E. O'Brien }
2995c80476e4SDavid E. O'Brien 
2996c80476e4SDavid E. O'Brien #ifdef COMMENT
2997c80476e4SDavid E. O'Brien /* by: Brian Allison <uiucdcs!convex!allison@RUTGERS.EDU> */
2998c80476e4SDavid E. O'Brien static void
299945e5710bSMark Peek c_get_word(Char **begin, Char **end)
3000c80476e4SDavid E. O'Brien {
3001c80476e4SDavid E. O'Brien     Char   *cp;
3002c80476e4SDavid E. O'Brien 
3003c80476e4SDavid E. O'Brien     cp = &Cursor[0];
3004c80476e4SDavid E. O'Brien     while (Argument--) {
3005c80476e4SDavid E. O'Brien 	while ((cp <= LastChar) && (isword(*cp)))
3006c80476e4SDavid E. O'Brien 	    cp++;
3007c80476e4SDavid E. O'Brien 	*end = --cp;
3008c80476e4SDavid E. O'Brien 	while ((cp >= InputBuf) && (isword(*cp)))
3009c80476e4SDavid E. O'Brien 	    cp--;
3010c80476e4SDavid E. O'Brien 	*begin = ++cp;
3011c80476e4SDavid E. O'Brien     }
3012c80476e4SDavid E. O'Brien }
3013c80476e4SDavid E. O'Brien #endif /* COMMENT */
3014c80476e4SDavid E. O'Brien 
3015c80476e4SDavid E. O'Brien /*ARGSUSED*/
3016c80476e4SDavid E. O'Brien CCRETVAL
301745e5710bSMark Peek e_uppercase(Char c)
3018c80476e4SDavid E. O'Brien {
3019c80476e4SDavid E. O'Brien     Char   *cp, *end;
3020c80476e4SDavid E. O'Brien 
3021c80476e4SDavid E. O'Brien     USE(c);
3022c80476e4SDavid E. O'Brien     end = c_next_word(Cursor, LastChar, Argument);
3023c80476e4SDavid E. O'Brien 
3024c80476e4SDavid E. O'Brien     for (cp = Cursor; cp < end; cp++)	/* PWP: was cp=begin */
3025c80476e4SDavid E. O'Brien 	if (Islower(*cp))
3026c80476e4SDavid E. O'Brien 	    *cp = Toupper(*cp);
3027c80476e4SDavid E. O'Brien 
3028c80476e4SDavid E. O'Brien     Cursor = end;
3029c80476e4SDavid E. O'Brien     if (Cursor > LastChar)
3030c80476e4SDavid E. O'Brien 	Cursor = LastChar;
3031c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3032c80476e4SDavid E. O'Brien }
3033c80476e4SDavid E. O'Brien 
3034c80476e4SDavid E. O'Brien 
3035c80476e4SDavid E. O'Brien /*ARGSUSED*/
3036c80476e4SDavid E. O'Brien CCRETVAL
303719d2e3deSDmitry Chagin e_capitalcase(Char c)
3038c80476e4SDavid E. O'Brien {
3039c80476e4SDavid E. O'Brien     Char   *cp, *end;
3040c80476e4SDavid E. O'Brien 
3041c80476e4SDavid E. O'Brien     USE(c);
3042c80476e4SDavid E. O'Brien     end = c_next_word(Cursor, LastChar, Argument);
3043c80476e4SDavid E. O'Brien 
3044c80476e4SDavid E. O'Brien     cp = Cursor;
3045c80476e4SDavid E. O'Brien     for (; cp < end; cp++) {
3046c80476e4SDavid E. O'Brien 	if (Isalpha(*cp)) {
3047c80476e4SDavid E. O'Brien 	    if (Islower(*cp))
3048c80476e4SDavid E. O'Brien 		*cp = Toupper(*cp);
3049c80476e4SDavid E. O'Brien 	    cp++;
3050c80476e4SDavid E. O'Brien 	    break;
3051c80476e4SDavid E. O'Brien 	}
3052c80476e4SDavid E. O'Brien     }
3053c80476e4SDavid E. O'Brien     for (; cp < end; cp++)
3054c80476e4SDavid E. O'Brien 	if (Isupper(*cp))
3055c80476e4SDavid E. O'Brien 	    *cp = Tolower(*cp);
3056c80476e4SDavid E. O'Brien 
3057c80476e4SDavid E. O'Brien     Cursor = end;
3058c80476e4SDavid E. O'Brien     if (Cursor > LastChar)
3059c80476e4SDavid E. O'Brien 	Cursor = LastChar;
3060c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3061c80476e4SDavid E. O'Brien }
3062c80476e4SDavid E. O'Brien 
3063c80476e4SDavid E. O'Brien /*ARGSUSED*/
3064c80476e4SDavid E. O'Brien CCRETVAL
306545e5710bSMark Peek e_lowercase(Char c)
3066c80476e4SDavid E. O'Brien {
3067c80476e4SDavid E. O'Brien     Char   *cp, *end;
3068c80476e4SDavid E. O'Brien 
3069c80476e4SDavid E. O'Brien     USE(c);
3070c80476e4SDavid E. O'Brien     end = c_next_word(Cursor, LastChar, Argument);
3071c80476e4SDavid E. O'Brien 
3072c80476e4SDavid E. O'Brien     for (cp = Cursor; cp < end; cp++)
3073c80476e4SDavid E. O'Brien 	if (Isupper(*cp))
3074c80476e4SDavid E. O'Brien 	    *cp = Tolower(*cp);
3075c80476e4SDavid E. O'Brien 
3076c80476e4SDavid E. O'Brien     Cursor = end;
3077c80476e4SDavid E. O'Brien     if (Cursor > LastChar)
3078c80476e4SDavid E. O'Brien 	Cursor = LastChar;
3079c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3080c80476e4SDavid E. O'Brien }
3081c80476e4SDavid E. O'Brien 
3082c80476e4SDavid E. O'Brien 
3083c80476e4SDavid E. O'Brien /*ARGSUSED*/
3084c80476e4SDavid E. O'Brien CCRETVAL
308545e5710bSMark Peek e_set_mark(Char c)
3086c80476e4SDavid E. O'Brien {
3087c80476e4SDavid E. O'Brien     USE(c);
308845e5710bSMark Peek     if (adrof(STRhighlight) && MarkIsSet && Mark != Cursor) {
308945e5710bSMark Peek 	ClearLines();
309045e5710bSMark Peek 	ClearDisp();
309145e5710bSMark Peek 	Refresh();
309245e5710bSMark Peek     }
3093c80476e4SDavid E. O'Brien     Mark = Cursor;
309445e5710bSMark Peek     MarkIsSet = 1;
3095c80476e4SDavid E. O'Brien     return(CC_NORM);
3096c80476e4SDavid E. O'Brien }
3097c80476e4SDavid E. O'Brien 
3098c80476e4SDavid E. O'Brien /*ARGSUSED*/
3099c80476e4SDavid E. O'Brien CCRETVAL
310045e5710bSMark Peek e_exchange_mark(Char c)
3101c80476e4SDavid E. O'Brien {
31026767bd61SMark Peek     Char *cp;
3103c80476e4SDavid E. O'Brien 
3104c80476e4SDavid E. O'Brien     USE(c);
3105c80476e4SDavid E. O'Brien     cp = Cursor;
3106c80476e4SDavid E. O'Brien     Cursor = Mark;
3107c80476e4SDavid E. O'Brien     Mark = cp;
3108c80476e4SDavid E. O'Brien     RefCursor();
3109c80476e4SDavid E. O'Brien     return(CC_NORM);
3110c80476e4SDavid E. O'Brien }
3111c80476e4SDavid E. O'Brien 
3112c80476e4SDavid E. O'Brien /*ARGSUSED*/
3113c80476e4SDavid E. O'Brien CCRETVAL
311445e5710bSMark Peek e_argfour(Char c)
3115c80476e4SDavid E. O'Brien {				/* multiply current argument by 4 */
3116c80476e4SDavid E. O'Brien     USE(c);
3117c80476e4SDavid E. O'Brien     if (Argument > 1000000)
3118c80476e4SDavid E. O'Brien 	return CC_ERROR;
3119c80476e4SDavid E. O'Brien     DoingArg = 1;
3120c80476e4SDavid E. O'Brien     Argument *= 4;
3121c80476e4SDavid E. O'Brien     return(CC_ARGHACK);
3122c80476e4SDavid E. O'Brien }
3123c80476e4SDavid E. O'Brien 
312445e5710bSMark Peek static void
312545e5710bSMark Peek quote_mode_cleanup(void *unused)
312645e5710bSMark Peek {
312745e5710bSMark Peek     USE(unused);
312845e5710bSMark Peek     QuoteModeOff();
312945e5710bSMark Peek }
313045e5710bSMark Peek 
3131c80476e4SDavid E. O'Brien /*ARGSUSED*/
3132c80476e4SDavid E. O'Brien CCRETVAL
313345e5710bSMark Peek e_quote(Char c)
3134c80476e4SDavid E. O'Brien {
3135c80476e4SDavid E. O'Brien     Char    ch;
3136c80476e4SDavid E. O'Brien     int     num;
3137c80476e4SDavid E. O'Brien 
3138c80476e4SDavid E. O'Brien     USE(c);
3139c80476e4SDavid E. O'Brien     QuoteModeOn();
314045e5710bSMark Peek     cleanup_push(&c, quote_mode_cleanup); /* Using &c just as a mark */
3141c80476e4SDavid E. O'Brien     num = GetNextChar(&ch);
314245e5710bSMark Peek     cleanup_until(&c);
3143c80476e4SDavid E. O'Brien     if (num == 1)
3144c80476e4SDavid E. O'Brien 	return e_insert(ch);
3145c80476e4SDavid E. O'Brien     else
3146c80476e4SDavid E. O'Brien 	return e_send_eof(0);
3147c80476e4SDavid E. O'Brien }
3148c80476e4SDavid E. O'Brien 
3149c80476e4SDavid E. O'Brien /*ARGSUSED*/
3150c80476e4SDavid E. O'Brien CCRETVAL
315145e5710bSMark Peek e_metanext(Char c)
3152c80476e4SDavid E. O'Brien {
3153c80476e4SDavid E. O'Brien     USE(c);
3154c80476e4SDavid E. O'Brien     MetaNext = 1;
3155c80476e4SDavid E. O'Brien     return(CC_ARGHACK);	/* preserve argument */
3156c80476e4SDavid E. O'Brien }
3157c80476e4SDavid E. O'Brien 
3158c80476e4SDavid E. O'Brien #ifdef notdef
3159c80476e4SDavid E. O'Brien /*ARGSUSED*/
3160c80476e4SDavid E. O'Brien CCRETVAL
316145e5710bSMark Peek e_extendnext(Char c)
3162c80476e4SDavid E. O'Brien {
3163c80476e4SDavid E. O'Brien     CurrentKeyMap = CcAltMap;
3164c80476e4SDavid E. O'Brien     return(CC_ARGHACK);	/* preserve argument */
3165c80476e4SDavid E. O'Brien }
3166c80476e4SDavid E. O'Brien 
3167c80476e4SDavid E. O'Brien #endif
3168c80476e4SDavid E. O'Brien 
3169c80476e4SDavid E. O'Brien /*ARGSUSED*/
3170c80476e4SDavid E. O'Brien CCRETVAL
317145e5710bSMark Peek v_insbeg(Char c)
3172c80476e4SDavid E. O'Brien {				/* move to beginning of line and start vi
3173c80476e4SDavid E. O'Brien 				 * insert mode */
3174c80476e4SDavid E. O'Brien     USE(c);
3175c80476e4SDavid E. O'Brien     Cursor = InputBuf;
3176c80476e4SDavid E. O'Brien     InsertPos = Cursor;
3177c80476e4SDavid E. O'Brien 
3178c80476e4SDavid E. O'Brien     UndoPtr  = Cursor;
3179c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_DELETE;
3180c80476e4SDavid E. O'Brien 
3181c80476e4SDavid E. O'Brien     RefCursor();		/* move the cursor */
3182c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
3183c80476e4SDavid E. O'Brien     return(CC_NORM);
3184c80476e4SDavid E. O'Brien }
3185c80476e4SDavid E. O'Brien 
3186c80476e4SDavid E. O'Brien /*ARGSUSED*/
3187c80476e4SDavid E. O'Brien CCRETVAL
318845e5710bSMark Peek v_replone(Char c)
3189c80476e4SDavid E. O'Brien {				/* vi mode overwrite one character */
3190c80476e4SDavid E. O'Brien     USE(c);
3191c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
3192c80476e4SDavid E. O'Brien     inputmode = MODE_REPLACE_1;
3193c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_CHANGE;	/* Set Up for VI undo command */
3194c80476e4SDavid E. O'Brien     UndoPtr = Cursor;
3195c80476e4SDavid E. O'Brien     UndoSize = 0;
3196c80476e4SDavid E. O'Brien     return(CC_NORM);
3197c80476e4SDavid E. O'Brien }
3198c80476e4SDavid E. O'Brien 
3199c80476e4SDavid E. O'Brien /*ARGSUSED*/
3200c80476e4SDavid E. O'Brien CCRETVAL
320145e5710bSMark Peek v_replmode(Char c)
3202c80476e4SDavid E. O'Brien {				/* vi mode start overwriting */
3203c80476e4SDavid E. O'Brien     USE(c);
3204c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
3205c80476e4SDavid E. O'Brien     inputmode = MODE_REPLACE;
3206c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_CHANGE;	/* Set Up for VI undo command */
3207c80476e4SDavid E. O'Brien     UndoPtr = Cursor;
3208c80476e4SDavid E. O'Brien     UndoSize = 0;
3209c80476e4SDavid E. O'Brien     return(CC_NORM);
3210c80476e4SDavid E. O'Brien }
3211c80476e4SDavid E. O'Brien 
3212c80476e4SDavid E. O'Brien /*ARGSUSED*/
3213c80476e4SDavid E. O'Brien CCRETVAL
321445e5710bSMark Peek v_substchar(Char c)
3215c80476e4SDavid E. O'Brien {				/* vi mode substitute for one char */
3216c80476e4SDavid E. O'Brien     USE(c);
3217c80476e4SDavid E. O'Brien     c_delafter(Argument);
3218c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
3219c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3220c80476e4SDavid E. O'Brien }
3221c80476e4SDavid E. O'Brien 
3222c80476e4SDavid E. O'Brien /*ARGSUSED*/
3223c80476e4SDavid E. O'Brien CCRETVAL
322445e5710bSMark Peek v_substline(Char c)
3225c80476e4SDavid E. O'Brien {				/* vi mode replace whole line */
3226c80476e4SDavid E. O'Brien     USE(c);
3227c80476e4SDavid E. O'Brien     (void) e_killall(0);
3228c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
3229c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3230c80476e4SDavid E. O'Brien }
3231c80476e4SDavid E. O'Brien 
3232c80476e4SDavid E. O'Brien /*ARGSUSED*/
3233c80476e4SDavid E. O'Brien CCRETVAL
323445e5710bSMark Peek v_chgtoend(Char c)
3235c80476e4SDavid E. O'Brien {				/* vi mode change to end of line */
3236c80476e4SDavid E. O'Brien     USE(c);
3237c80476e4SDavid E. O'Brien     (void) e_killend(0);
3238c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
3239c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3240c80476e4SDavid E. O'Brien }
3241c80476e4SDavid E. O'Brien 
3242c80476e4SDavid E. O'Brien /*ARGSUSED*/
3243c80476e4SDavid E. O'Brien CCRETVAL
324445e5710bSMark Peek v_insert(Char c)
3245c80476e4SDavid E. O'Brien {				/* vi mode start inserting */
3246c80476e4SDavid E. O'Brien     USE(c);
3247c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
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_add(Char c)
3259c80476e4SDavid E. O'Brien {				/* vi mode start adding */
3260c80476e4SDavid E. O'Brien     USE(c);
3261c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
3262c80476e4SDavid E. O'Brien     if (Cursor < LastChar)
3263c80476e4SDavid E. O'Brien     {
3264c80476e4SDavid E. O'Brien 	Cursor++;
3265c80476e4SDavid E. O'Brien 	if (Cursor > LastChar)
3266c80476e4SDavid E. O'Brien 	    Cursor = LastChar;
3267c80476e4SDavid E. O'Brien 	RefCursor();
3268c80476e4SDavid E. O'Brien     }
3269c80476e4SDavid E. O'Brien 
3270c80476e4SDavid E. O'Brien     InsertPos = Cursor;
3271c80476e4SDavid E. O'Brien     UndoPtr = Cursor;
3272c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_DELETE;
3273c80476e4SDavid E. O'Brien 
3274c80476e4SDavid E. O'Brien     return(CC_NORM);
3275c80476e4SDavid E. O'Brien }
3276c80476e4SDavid E. O'Brien 
3277c80476e4SDavid E. O'Brien /*ARGSUSED*/
3278c80476e4SDavid E. O'Brien CCRETVAL
327945e5710bSMark Peek v_addend(Char c)
3280c80476e4SDavid E. O'Brien {				/* vi mode to add at end of line */
3281c80476e4SDavid E. O'Brien     USE(c);
3282c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
3283c80476e4SDavid E. O'Brien     Cursor = LastChar;
3284c80476e4SDavid E. O'Brien 
3285c80476e4SDavid E. O'Brien     InsertPos = LastChar;	/* Mark where insertion begins */
3286c80476e4SDavid E. O'Brien     UndoPtr = LastChar;
3287c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_DELETE;
3288c80476e4SDavid E. O'Brien 
3289c80476e4SDavid E. O'Brien     RefCursor();
3290c80476e4SDavid E. O'Brien     return(CC_NORM);
3291c80476e4SDavid E. O'Brien }
3292c80476e4SDavid E. O'Brien 
3293c80476e4SDavid E. O'Brien /*ARGSUSED*/
3294c80476e4SDavid E. O'Brien CCRETVAL
329545e5710bSMark Peek v_change_case(Char cc)
3296c80476e4SDavid E. O'Brien {
329723338178SMark Peek     Char    c;
3298c80476e4SDavid E. O'Brien 
3299c80476e4SDavid E. O'Brien     USE(cc);
3300c80476e4SDavid E. O'Brien     if (Cursor < LastChar) {
33013b6eaa7bSAndrey A. Chernov #ifndef WINNT_NATIVE
3302c80476e4SDavid E. O'Brien 	c = *Cursor;
3303c80476e4SDavid E. O'Brien #else
3304c80476e4SDavid E. O'Brien 	c = CHAR & *Cursor;
33053b6eaa7bSAndrey A. Chernov #endif /* WINNT_NATIVE */
3306c80476e4SDavid E. O'Brien 	if (Isupper(c))
3307c80476e4SDavid E. O'Brien 	    *Cursor++ = Tolower(c);
3308c80476e4SDavid E. O'Brien 	else if (Islower(c))
3309c80476e4SDavid E. O'Brien 	    *Cursor++ = Toupper(c);
3310c80476e4SDavid E. O'Brien 	else
3311c80476e4SDavid E. O'Brien 	    Cursor++;
331223338178SMark Peek 	RefPlusOne(1);		/* fast refresh for one char */
3313c80476e4SDavid E. O'Brien 	return(CC_NORM);
3314c80476e4SDavid E. O'Brien     }
3315c80476e4SDavid E. O'Brien     return(CC_ERROR);
3316c80476e4SDavid E. O'Brien }
3317c80476e4SDavid E. O'Brien 
3318c80476e4SDavid E. O'Brien /*ARGSUSED*/
3319c80476e4SDavid E. O'Brien CCRETVAL
332045e5710bSMark Peek e_expand(Char c)
3321c80476e4SDavid E. O'Brien {
33226767bd61SMark Peek     Char *p;
3323c80476e4SDavid E. O'Brien 
3324c80476e4SDavid E. O'Brien     USE(c);
3325c80476e4SDavid E. O'Brien     for (p = InputBuf; Isspace(*p); p++)
3326c80476e4SDavid E. O'Brien 	continue;
3327c80476e4SDavid E. O'Brien     if (p == LastChar)
3328c80476e4SDavid E. O'Brien 	return(CC_ERROR);
3329c80476e4SDavid E. O'Brien 
3330c80476e4SDavid E. O'Brien     justpr++;
3331c80476e4SDavid E. O'Brien     Expand++;
3332c80476e4SDavid E. O'Brien     return(e_newline(0));
3333c80476e4SDavid E. O'Brien }
3334c80476e4SDavid E. O'Brien 
3335c80476e4SDavid E. O'Brien /*ARGSUSED*/
3336c80476e4SDavid E. O'Brien CCRETVAL
333745e5710bSMark Peek e_startover(Char c)
3338c80476e4SDavid E. O'Brien {				/* erase all of current line, start again */
3339c80476e4SDavid E. O'Brien     USE(c);
3340c80476e4SDavid E. O'Brien     ResetInLine(0);		/* reset the input pointers */
3341c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3342c80476e4SDavid E. O'Brien }
3343c80476e4SDavid E. O'Brien 
3344c80476e4SDavid E. O'Brien /*ARGSUSED*/
3345c80476e4SDavid E. O'Brien CCRETVAL
334645e5710bSMark Peek e_redisp(Char c)
3347c80476e4SDavid E. O'Brien {
3348c80476e4SDavid E. O'Brien     USE(c);
3349c80476e4SDavid E. O'Brien     ClearLines();
3350c80476e4SDavid E. O'Brien     ClearDisp();
3351c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3352c80476e4SDavid E. O'Brien }
3353c80476e4SDavid E. O'Brien 
3354c80476e4SDavid E. O'Brien /*ARGSUSED*/
3355c80476e4SDavid E. O'Brien CCRETVAL
335645e5710bSMark Peek e_cleardisp(Char c)
3357c80476e4SDavid E. O'Brien {
3358c80476e4SDavid E. O'Brien     USE(c);
3359c80476e4SDavid E. O'Brien     ClearScreen();		/* clear the whole real screen */
3360c80476e4SDavid E. O'Brien     ClearDisp();		/* reset everything */
3361c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3362c80476e4SDavid E. O'Brien }
3363c80476e4SDavid E. O'Brien 
3364c80476e4SDavid E. O'Brien /*ARGSUSED*/
3365c80476e4SDavid E. O'Brien CCRETVAL
336645e5710bSMark Peek e_tty_int(Char c)
3367c80476e4SDavid E. O'Brien {
3368c80476e4SDavid E. O'Brien     USE(c);
33693b6eaa7bSAndrey A. Chernov #if defined(_MINIX) || defined(WINNT_NATIVE)
3370c80476e4SDavid E. O'Brien     /* SAK PATCH: erase all of current line, start again */
3371c80476e4SDavid E. O'Brien     ResetInLine(0);		/* reset the input pointers */
3372c80476e4SDavid E. O'Brien     xputchar('\n');
3373c80476e4SDavid E. O'Brien     ClearDisp();
3374c80476e4SDavid E. O'Brien     return (CC_REFRESH);
33753b6eaa7bSAndrey A. Chernov #else /* !_MINIX && !WINNT_NATIVE */
3376c80476e4SDavid E. O'Brien     /* do no editing */
3377c80476e4SDavid E. O'Brien     return (CC_NORM);
33783b6eaa7bSAndrey A. Chernov #endif /* _MINIX || WINNT_NATIVE */
3379c80476e4SDavid E. O'Brien }
3380c80476e4SDavid E. O'Brien 
3381c80476e4SDavid E. O'Brien /*
3382c80476e4SDavid E. O'Brien  * From: ghazi@cesl.rutgers.edu (Kaveh R. Ghazi)
3383c80476e4SDavid E. O'Brien  * Function to send a character back to the input stream in cooked
3384c80476e4SDavid E. O'Brien  * mode. Only works if we have TIOCSTI
3385c80476e4SDavid E. O'Brien  */
3386c80476e4SDavid E. O'Brien /*ARGSUSED*/
3387c80476e4SDavid E. O'Brien CCRETVAL
338845e5710bSMark Peek e_stuff_char(Char c)
3389c80476e4SDavid E. O'Brien {
3390c80476e4SDavid E. O'Brien #ifdef TIOCSTI
3391c80476e4SDavid E. O'Brien      int was_raw = Tty_raw_mode;
339223338178SMark Peek      char buf[MB_LEN_MAX];
339323338178SMark Peek      size_t i, len;
3394c80476e4SDavid E. O'Brien 
3395c80476e4SDavid E. O'Brien      if (was_raw)
3396c80476e4SDavid E. O'Brien          (void) Cookedmode();
3397c80476e4SDavid E. O'Brien 
339845e5710bSMark Peek      (void) xwrite(SHIN, "\n", 1);
339919d2e3deSDmitry Chagin      len = one_wctomb(buf, c);
340023338178SMark Peek      for (i = 0; i < len; i++)
340123338178SMark Peek 	 (void) ioctl(SHIN, TIOCSTI, (ioctl_t) &buf[i]);
3402c80476e4SDavid E. O'Brien 
3403c80476e4SDavid E. O'Brien      if (was_raw)
3404c80476e4SDavid E. O'Brien 	 (void) Rawmode();
3405c80476e4SDavid E. O'Brien      return(e_redisp(c));
3406c80476e4SDavid E. O'Brien #else /* !TIOCSTI */
3407c80476e4SDavid E. O'Brien      return(CC_ERROR);
3408c80476e4SDavid E. O'Brien #endif /* !TIOCSTI */
3409c80476e4SDavid E. O'Brien }
3410c80476e4SDavid E. O'Brien 
3411c80476e4SDavid E. O'Brien /*ARGSUSED*/
3412c80476e4SDavid E. O'Brien CCRETVAL
341345e5710bSMark Peek e_insovr(Char c)
3414c80476e4SDavid E. O'Brien {
3415c80476e4SDavid E. O'Brien     USE(c);
3416c80476e4SDavid E. O'Brien     inputmode = (inputmode == MODE_INSERT ? MODE_REPLACE : MODE_INSERT);
3417c80476e4SDavid E. O'Brien     return(CC_NORM);
3418c80476e4SDavid E. O'Brien }
3419c80476e4SDavid E. O'Brien 
3420c80476e4SDavid E. O'Brien /*ARGSUSED*/
3421c80476e4SDavid E. O'Brien CCRETVAL
342245e5710bSMark Peek e_tty_dsusp(Char c)
3423c80476e4SDavid E. O'Brien {
3424c80476e4SDavid E. O'Brien     USE(c);
3425c80476e4SDavid E. O'Brien     /* do no editing */
3426c80476e4SDavid E. O'Brien     return(CC_NORM);
3427c80476e4SDavid E. O'Brien }
3428c80476e4SDavid E. O'Brien 
3429c80476e4SDavid E. O'Brien /*ARGSUSED*/
3430c80476e4SDavid E. O'Brien CCRETVAL
343145e5710bSMark Peek e_tty_flusho(Char c)
3432c80476e4SDavid E. O'Brien {
3433c80476e4SDavid E. O'Brien     USE(c);
3434c80476e4SDavid E. O'Brien     /* do no editing */
3435c80476e4SDavid E. O'Brien     return(CC_NORM);
3436c80476e4SDavid E. O'Brien }
3437c80476e4SDavid E. O'Brien 
3438c80476e4SDavid E. O'Brien /*ARGSUSED*/
3439c80476e4SDavid E. O'Brien CCRETVAL
344045e5710bSMark Peek e_tty_quit(Char c)
3441c80476e4SDavid E. O'Brien {
3442c80476e4SDavid E. O'Brien     USE(c);
3443c80476e4SDavid E. O'Brien     /* do no editing */
3444c80476e4SDavid E. O'Brien     return(CC_NORM);
3445c80476e4SDavid E. O'Brien }
3446c80476e4SDavid E. O'Brien 
3447c80476e4SDavid E. O'Brien /*ARGSUSED*/
3448c80476e4SDavid E. O'Brien CCRETVAL
344945e5710bSMark Peek e_tty_tsusp(Char c)
3450c80476e4SDavid E. O'Brien {
3451c80476e4SDavid E. O'Brien     USE(c);
3452c80476e4SDavid E. O'Brien     /* do no editing */
3453c80476e4SDavid E. O'Brien     return(CC_NORM);
3454c80476e4SDavid E. O'Brien }
3455c80476e4SDavid E. O'Brien 
3456c80476e4SDavid E. O'Brien /*ARGSUSED*/
3457c80476e4SDavid E. O'Brien CCRETVAL
345845e5710bSMark Peek e_tty_stopo(Char c)
3459c80476e4SDavid E. O'Brien {
3460c80476e4SDavid E. O'Brien     USE(c);
3461c80476e4SDavid E. O'Brien     /* do no editing */
3462c80476e4SDavid E. O'Brien     return(CC_NORM);
3463c80476e4SDavid E. O'Brien }
3464c80476e4SDavid E. O'Brien 
3465a15e6f9aSMark Peek /* returns the number of (attempted) expansions */
3466a15e6f9aSMark Peek int
3467a15e6f9aSMark Peek ExpandHistory(void)
3468a15e6f9aSMark Peek {
3469a15e6f9aSMark Peek     *LastChar = '\0';		/* just in case */
3470a15e6f9aSMark Peek     return c_substitute();
3471a15e6f9aSMark Peek }
3472a15e6f9aSMark Peek 
3473c80476e4SDavid E. O'Brien /*ARGSUSED*/
3474c80476e4SDavid E. O'Brien CCRETVAL
347545e5710bSMark Peek e_expand_history(Char c)
3476c80476e4SDavid E. O'Brien {
3477c80476e4SDavid E. O'Brien     USE(c);
3478a15e6f9aSMark Peek     (void)ExpandHistory();
3479c80476e4SDavid E. O'Brien     return(CC_NORM);
3480c80476e4SDavid E. O'Brien }
3481c80476e4SDavid E. O'Brien 
3482c80476e4SDavid E. O'Brien /*ARGSUSED*/
3483c80476e4SDavid E. O'Brien CCRETVAL
348445e5710bSMark Peek e_magic_space(Char c)
3485c80476e4SDavid E. O'Brien {
3486c80476e4SDavid E. O'Brien     USE(c);
3487c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
3488a15e6f9aSMark Peek     (void)c_substitute();
3489c80476e4SDavid E. O'Brien     return(e_insert(' '));
3490c80476e4SDavid E. O'Brien }
3491c80476e4SDavid E. O'Brien 
3492c80476e4SDavid E. O'Brien /*ARGSUSED*/
3493c80476e4SDavid E. O'Brien CCRETVAL
349445e5710bSMark Peek e_inc_fwd(Char c)
3495c80476e4SDavid E. O'Brien {
349645e5710bSMark Peek     CCRETVAL ret;
349745e5710bSMark Peek 
3498c80476e4SDavid E. O'Brien     USE(c);
349945e5710bSMark Peek     patbuf.len = 0;
350045e5710bSMark Peek     MarkIsSet = 0;
350145e5710bSMark Peek     ret = e_inc_search(F_DOWN_SEARCH_HIST);
350245e5710bSMark Peek     if (adrof(STRhighlight) && IncMatchLen) {
350345e5710bSMark Peek 	IncMatchLen = 0;
350445e5710bSMark Peek 	ClearLines();
350545e5710bSMark Peek 	ClearDisp();
350645e5710bSMark Peek 	Refresh();
350745e5710bSMark Peek     }
350845e5710bSMark Peek     IncMatchLen = 0;
350945e5710bSMark Peek     return ret;
3510c80476e4SDavid E. O'Brien }
3511c80476e4SDavid E. O'Brien 
3512c80476e4SDavid E. O'Brien 
3513c80476e4SDavid E. O'Brien /*ARGSUSED*/
3514c80476e4SDavid E. O'Brien CCRETVAL
351545e5710bSMark Peek e_inc_back(Char c)
3516c80476e4SDavid E. O'Brien {
351745e5710bSMark Peek     CCRETVAL ret;
351845e5710bSMark Peek 
3519c80476e4SDavid E. O'Brien     USE(c);
352045e5710bSMark Peek     patbuf.len = 0;
352145e5710bSMark Peek     MarkIsSet = 0;
352245e5710bSMark Peek     ret = e_inc_search(F_UP_SEARCH_HIST);
352345e5710bSMark Peek     if (adrof(STRhighlight) && IncMatchLen) {
352445e5710bSMark Peek 	IncMatchLen = 0;
352545e5710bSMark Peek 	ClearLines();
352645e5710bSMark Peek 	ClearDisp();
352745e5710bSMark Peek 	Refresh();
352845e5710bSMark Peek     }
352945e5710bSMark Peek     IncMatchLen = 0;
353045e5710bSMark Peek     return ret;
3531c80476e4SDavid E. O'Brien }
3532c80476e4SDavid E. O'Brien 
3533c80476e4SDavid E. O'Brien /*ARGSUSED*/
3534c80476e4SDavid E. O'Brien CCRETVAL
353545e5710bSMark Peek e_copyprev(Char c)
3536c80476e4SDavid E. O'Brien {
35376767bd61SMark Peek     Char *cp, *oldc, *dp;
3538c80476e4SDavid E. O'Brien 
3539c80476e4SDavid E. O'Brien     USE(c);
3540c80476e4SDavid E. O'Brien     if (Cursor == InputBuf)
3541c80476e4SDavid E. O'Brien 	return(CC_ERROR);
3542c80476e4SDavid E. O'Brien     /* else */
3543c80476e4SDavid E. O'Brien 
3544c80476e4SDavid E. O'Brien     oldc = Cursor;
3545c80476e4SDavid E. O'Brien     /* does a bounds check */
3546c80476e4SDavid E. O'Brien     cp = c_prev_word(Cursor, InputBuf, Argument);
3547c80476e4SDavid E. O'Brien 
3548c80476e4SDavid E. O'Brien     c_insert((int)(oldc - cp));
3549c80476e4SDavid E. O'Brien     for (dp = oldc; cp < oldc && dp < LastChar; cp++)
3550c80476e4SDavid E. O'Brien 	*dp++ = *cp;
3551c80476e4SDavid E. O'Brien 
3552c80476e4SDavid E. O'Brien     Cursor = dp;		/* put cursor at end */
3553c80476e4SDavid E. O'Brien 
3554c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3555c80476e4SDavid E. O'Brien }
3556c80476e4SDavid E. O'Brien 
3557c80476e4SDavid E. O'Brien /*ARGSUSED*/
3558c80476e4SDavid E. O'Brien CCRETVAL
355945e5710bSMark Peek e_tty_starto(Char c)
3560c80476e4SDavid E. O'Brien {
3561c80476e4SDavid E. O'Brien     USE(c);
3562c80476e4SDavid E. O'Brien     /* do no editing */
3563c80476e4SDavid E. O'Brien     return(CC_NORM);
3564c80476e4SDavid E. O'Brien }
3565c80476e4SDavid E. O'Brien 
3566c80476e4SDavid E. O'Brien /*ARGSUSED*/
3567c80476e4SDavid E. O'Brien CCRETVAL
356845e5710bSMark Peek e_load_average(Char c)
3569c80476e4SDavid E. O'Brien {
3570c80476e4SDavid E. O'Brien     USE(c);
3571c80476e4SDavid E. O'Brien     PastBottom();
3572c80476e4SDavid E. O'Brien #ifdef TIOCSTAT
3573c80476e4SDavid E. O'Brien     /*
3574c80476e4SDavid E. O'Brien      * Here we pass &c to the ioctl because some os's (NetBSD) expect it
3575c80476e4SDavid E. O'Brien      * there even if they don't use it. (lukem@netbsd.org)
3576c80476e4SDavid E. O'Brien      */
3577c80476e4SDavid E. O'Brien     if (ioctl(SHIN, TIOCSTAT, (ioctl_t) &c) < 0)
3578c80476e4SDavid E. O'Brien #endif
3579a15e6f9aSMark Peek 	xprintf("%s", CGETS(5, 1, "Load average unavailable\n"));
3580c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3581c80476e4SDavid E. O'Brien }
3582c80476e4SDavid E. O'Brien 
3583c80476e4SDavid E. O'Brien /*ARGSUSED*/
3584c80476e4SDavid E. O'Brien CCRETVAL
358545e5710bSMark Peek v_chgmeta(Char c)
3586c80476e4SDavid E. O'Brien {
3587c80476e4SDavid E. O'Brien     USE(c);
3588c80476e4SDavid E. O'Brien     /*
3589c80476e4SDavid E. O'Brien      * Delete with insert == change: first we delete and then we leave in
3590c80476e4SDavid E. O'Brien      * insert mode.
3591c80476e4SDavid E. O'Brien      */
3592c80476e4SDavid E. O'Brien     return(v_action(TCSHOP_DELETE|TCSHOP_INSERT));
3593c80476e4SDavid E. O'Brien }
3594c80476e4SDavid E. O'Brien 
3595c80476e4SDavid E. O'Brien /*ARGSUSED*/
3596c80476e4SDavid E. O'Brien CCRETVAL
359745e5710bSMark Peek v_delmeta(Char c)
3598c80476e4SDavid E. O'Brien {
3599c80476e4SDavid E. O'Brien     USE(c);
3600c80476e4SDavid E. O'Brien     return(v_action(TCSHOP_DELETE));
3601c80476e4SDavid E. O'Brien }
3602c80476e4SDavid E. O'Brien 
3603c80476e4SDavid E. O'Brien 
3604c80476e4SDavid E. O'Brien /*ARGSUSED*/
3605c80476e4SDavid E. O'Brien CCRETVAL
360645e5710bSMark Peek v_endword(Char c)
3607c80476e4SDavid E. O'Brien {
3608c80476e4SDavid E. O'Brien     USE(c);
3609c80476e4SDavid E. O'Brien     if (Cursor == LastChar)
3610c80476e4SDavid E. O'Brien 	return(CC_ERROR);
3611c80476e4SDavid E. O'Brien     /* else */
3612c80476e4SDavid E. O'Brien 
36136767bd61SMark Peek     Cursor = c_endword(Cursor, LastChar, Argument, STRshwspace);
3614c80476e4SDavid E. O'Brien 
3615c80476e4SDavid E. O'Brien     if (ActionFlag & TCSHOP_DELETE)
3616c80476e4SDavid E. O'Brien     {
3617c80476e4SDavid E. O'Brien 	Cursor++;
3618c80476e4SDavid E. O'Brien 	c_delfini();
3619c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
3620c80476e4SDavid E. O'Brien     }
3621c80476e4SDavid E. O'Brien 
3622c80476e4SDavid E. O'Brien     RefCursor();
3623c80476e4SDavid E. O'Brien     return(CC_NORM);
3624c80476e4SDavid E. O'Brien }
3625c80476e4SDavid E. O'Brien 
3626c80476e4SDavid E. O'Brien /*ARGSUSED*/
3627c80476e4SDavid E. O'Brien CCRETVAL
362845e5710bSMark Peek v_eword(Char c)
3629c80476e4SDavid E. O'Brien {
3630c80476e4SDavid E. O'Brien     USE(c);
3631c80476e4SDavid E. O'Brien     if (Cursor == LastChar)
3632c80476e4SDavid E. O'Brien 	return(CC_ERROR);
3633c80476e4SDavid E. O'Brien     /* else */
3634c80476e4SDavid E. O'Brien 
3635c80476e4SDavid E. O'Brien     Cursor = c_eword(Cursor, LastChar, Argument);
3636c80476e4SDavid E. O'Brien 
3637c80476e4SDavid E. O'Brien     if (ActionFlag & TCSHOP_DELETE) {
3638c80476e4SDavid E. O'Brien 	Cursor++;
3639c80476e4SDavid E. O'Brien 	c_delfini();
3640c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
3641c80476e4SDavid E. O'Brien     }
3642c80476e4SDavid E. O'Brien 
3643c80476e4SDavid E. O'Brien     RefCursor();
3644c80476e4SDavid E. O'Brien     return(CC_NORM);
3645c80476e4SDavid E. O'Brien }
3646c80476e4SDavid E. O'Brien 
3647c80476e4SDavid E. O'Brien /*ARGSUSED*/
3648c80476e4SDavid E. O'Brien CCRETVAL
364945e5710bSMark Peek v_char_fwd(Char c)
3650c80476e4SDavid E. O'Brien {
3651c80476e4SDavid E. O'Brien     Char ch;
3652c80476e4SDavid E. O'Brien 
3653c80476e4SDavid E. O'Brien     USE(c);
3654c80476e4SDavid E. O'Brien     if (GetNextChar(&ch) != 1)
3655c80476e4SDavid E. O'Brien 	return e_send_eof(0);
3656c80476e4SDavid E. O'Brien 
3657c80476e4SDavid E. O'Brien     srch_dir = CHAR_FWD;
3658c80476e4SDavid E. O'Brien     srch_char = ch;
3659c80476e4SDavid E. O'Brien 
3660c80476e4SDavid E. O'Brien     return v_csearch_fwd(ch, Argument, 0);
3661c80476e4SDavid E. O'Brien 
3662c80476e4SDavid E. O'Brien }
3663c80476e4SDavid E. O'Brien 
3664c80476e4SDavid E. O'Brien /*ARGSUSED*/
3665c80476e4SDavid E. O'Brien CCRETVAL
366645e5710bSMark Peek v_char_back(Char c)
3667c80476e4SDavid E. O'Brien {
3668c80476e4SDavid E. O'Brien     Char ch;
3669c80476e4SDavid E. O'Brien 
3670c80476e4SDavid E. O'Brien     USE(c);
3671c80476e4SDavid E. O'Brien     if (GetNextChar(&ch) != 1)
3672c80476e4SDavid E. O'Brien 	return e_send_eof(0);
3673c80476e4SDavid E. O'Brien 
3674c80476e4SDavid E. O'Brien     srch_dir = CHAR_BACK;
3675c80476e4SDavid E. O'Brien     srch_char = ch;
3676c80476e4SDavid E. O'Brien 
3677c80476e4SDavid E. O'Brien     return v_csearch_back(ch, Argument, 0);
3678c80476e4SDavid E. O'Brien }
3679c80476e4SDavid E. O'Brien 
3680c80476e4SDavid E. O'Brien /*ARGSUSED*/
3681c80476e4SDavid E. O'Brien CCRETVAL
368245e5710bSMark Peek v_charto_fwd(Char c)
3683c80476e4SDavid E. O'Brien {
3684c80476e4SDavid E. O'Brien     Char ch;
3685c80476e4SDavid E. O'Brien 
3686c80476e4SDavid E. O'Brien     USE(c);
3687c80476e4SDavid E. O'Brien     if (GetNextChar(&ch) != 1)
3688c80476e4SDavid E. O'Brien 	return e_send_eof(0);
3689c80476e4SDavid E. O'Brien 
3690c80476e4SDavid E. O'Brien     return v_csearch_fwd(ch, Argument, 1);
3691c80476e4SDavid E. O'Brien 
3692c80476e4SDavid E. O'Brien }
3693c80476e4SDavid E. O'Brien 
3694c80476e4SDavid E. O'Brien /*ARGSUSED*/
3695c80476e4SDavid E. O'Brien CCRETVAL
369645e5710bSMark Peek v_charto_back(Char c)
3697c80476e4SDavid E. O'Brien {
3698c80476e4SDavid E. O'Brien     Char ch;
3699c80476e4SDavid E. O'Brien 
3700c80476e4SDavid E. O'Brien     USE(c);
3701c80476e4SDavid E. O'Brien     if (GetNextChar(&ch) != 1)
3702c80476e4SDavid E. O'Brien 	return e_send_eof(0);
3703c80476e4SDavid E. O'Brien 
3704c80476e4SDavid E. O'Brien     return v_csearch_back(ch, Argument, 1);
3705c80476e4SDavid E. O'Brien }
3706c80476e4SDavid E. O'Brien 
3707c80476e4SDavid E. O'Brien /*ARGSUSED*/
3708c80476e4SDavid E. O'Brien CCRETVAL
370945e5710bSMark Peek v_rchar_fwd(Char c)
3710c80476e4SDavid E. O'Brien {
3711c80476e4SDavid E. O'Brien     USE(c);
3712c80476e4SDavid E. O'Brien     if (srch_char == 0)
3713c80476e4SDavid E. O'Brien 	return CC_ERROR;
3714c80476e4SDavid E. O'Brien 
3715c80476e4SDavid E. O'Brien     return srch_dir == CHAR_FWD ? v_csearch_fwd(srch_char, Argument, 0) :
3716c80476e4SDavid E. O'Brien 			          v_csearch_back(srch_char, Argument, 0);
3717c80476e4SDavid E. O'Brien }
3718c80476e4SDavid E. O'Brien 
3719c80476e4SDavid E. O'Brien /*ARGSUSED*/
3720c80476e4SDavid E. O'Brien CCRETVAL
372145e5710bSMark Peek v_rchar_back(Char c)
3722c80476e4SDavid E. O'Brien {
3723c80476e4SDavid E. O'Brien     USE(c);
3724c80476e4SDavid E. O'Brien     if (srch_char == 0)
3725c80476e4SDavid E. O'Brien 	return CC_ERROR;
3726c80476e4SDavid E. O'Brien 
3727c80476e4SDavid E. O'Brien     return srch_dir == CHAR_BACK ? v_csearch_fwd(srch_char, Argument, 0) :
3728c80476e4SDavid E. O'Brien 			           v_csearch_back(srch_char, Argument, 0);
3729c80476e4SDavid E. O'Brien }
3730c80476e4SDavid E. O'Brien 
3731c80476e4SDavid E. O'Brien /*ARGSUSED*/
3732c80476e4SDavid E. O'Brien CCRETVAL
373345e5710bSMark Peek v_undo(Char c)
3734c80476e4SDavid E. O'Brien {
37356767bd61SMark Peek     int  loop;
37366767bd61SMark Peek     Char *kp, *cp;
3737c80476e4SDavid E. O'Brien     Char temp;
3738c80476e4SDavid E. O'Brien     int	 size;
3739c80476e4SDavid E. O'Brien 
3740c80476e4SDavid E. O'Brien     USE(c);
3741c80476e4SDavid E. O'Brien     switch (UndoAction) {
3742c80476e4SDavid E. O'Brien     case TCSHOP_DELETE|TCSHOP_INSERT:
3743c80476e4SDavid E. O'Brien     case TCSHOP_DELETE:
3744c80476e4SDavid E. O'Brien 	if (UndoSize == 0) return(CC_NORM);
3745c80476e4SDavid E. O'Brien 	cp = UndoPtr;
3746c80476e4SDavid E. O'Brien 	kp = UndoBuf;
3747c80476e4SDavid E. O'Brien 	for (loop=0; loop < UndoSize; loop++)	/* copy the chars */
3748c80476e4SDavid E. O'Brien 	    *kp++ = *cp++;			/* into UndoBuf   */
3749c80476e4SDavid E. O'Brien 
3750c80476e4SDavid E. O'Brien 	for (cp = UndoPtr; cp <= LastChar; cp++)
3751c80476e4SDavid E. O'Brien 	    *cp = cp[UndoSize];
3752c80476e4SDavid E. O'Brien 
3753c80476e4SDavid E. O'Brien 	LastChar -= UndoSize;
3754c80476e4SDavid E. O'Brien 	Cursor   =  UndoPtr;
3755c80476e4SDavid E. O'Brien 
3756c80476e4SDavid E. O'Brien 	UndoAction = TCSHOP_INSERT;
3757c80476e4SDavid E. O'Brien 	break;
3758c80476e4SDavid E. O'Brien 
3759c80476e4SDavid E. O'Brien     case TCSHOP_INSERT:
3760c80476e4SDavid E. O'Brien 	if (UndoSize == 0) return(CC_NORM);
3761c80476e4SDavid E. O'Brien 	cp = UndoPtr;
3762c80476e4SDavid E. O'Brien 	Cursor = UndoPtr;
3763c80476e4SDavid E. O'Brien 	kp = UndoBuf;
3764c80476e4SDavid E. O'Brien 	c_insert(UndoSize);		/* open the space, */
3765c80476e4SDavid E. O'Brien 	for (loop = 0; loop < UndoSize; loop++)	/* copy the chars */
3766c80476e4SDavid E. O'Brien 	    *cp++ = *kp++;
3767c80476e4SDavid E. O'Brien 
3768c80476e4SDavid E. O'Brien 	UndoAction = TCSHOP_DELETE;
3769c80476e4SDavid E. O'Brien 	break;
3770c80476e4SDavid E. O'Brien 
3771c80476e4SDavid E. O'Brien     case TCSHOP_CHANGE:
3772c80476e4SDavid E. O'Brien 	if (UndoSize == 0) return(CC_NORM);
3773c80476e4SDavid E. O'Brien 	cp = UndoPtr;
3774c80476e4SDavid E. O'Brien 	Cursor = UndoPtr;
3775c80476e4SDavid E. O'Brien 	kp = UndoBuf;
3776c80476e4SDavid E. O'Brien 	size = (int)(Cursor-LastChar); /*  NOT NSL independant */
3777c80476e4SDavid E. O'Brien 	if (size < UndoSize)
3778c80476e4SDavid E. O'Brien 	    size = UndoSize;
3779c80476e4SDavid E. O'Brien 	for(loop = 0; loop < size; loop++) {
3780c80476e4SDavid E. O'Brien 	    temp = *kp;
3781c80476e4SDavid E. O'Brien 	    *kp++ = *cp;
3782c80476e4SDavid E. O'Brien 	    *cp++ = temp;
3783c80476e4SDavid E. O'Brien 	}
3784c80476e4SDavid E. O'Brien 	break;
3785c80476e4SDavid E. O'Brien 
3786c80476e4SDavid E. O'Brien     default:
3787c80476e4SDavid E. O'Brien 	return(CC_ERROR);
3788c80476e4SDavid E. O'Brien     }
3789c80476e4SDavid E. O'Brien 
3790c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3791c80476e4SDavid E. O'Brien }
3792c80476e4SDavid E. O'Brien 
3793c80476e4SDavid E. O'Brien /*ARGSUSED*/
3794c80476e4SDavid E. O'Brien CCRETVAL
379545e5710bSMark Peek v_ush_meta(Char c)
3796c80476e4SDavid E. O'Brien {
3797c80476e4SDavid E. O'Brien     USE(c);
3798c80476e4SDavid E. O'Brien     return v_search(F_UP_SEARCH_HIST);
3799c80476e4SDavid E. O'Brien }
3800c80476e4SDavid E. O'Brien 
3801c80476e4SDavid E. O'Brien /*ARGSUSED*/
3802c80476e4SDavid E. O'Brien CCRETVAL
380345e5710bSMark Peek v_dsh_meta(Char c)
3804c80476e4SDavid E. O'Brien {
3805c80476e4SDavid E. O'Brien     USE(c);
3806c80476e4SDavid E. O'Brien     return v_search(F_DOWN_SEARCH_HIST);
3807c80476e4SDavid E. O'Brien }
3808c80476e4SDavid E. O'Brien 
3809c80476e4SDavid E. O'Brien /*ARGSUSED*/
3810c80476e4SDavid E. O'Brien CCRETVAL
381145e5710bSMark Peek v_rsrch_fwd(Char c)
3812c80476e4SDavid E. O'Brien {
3813c80476e4SDavid E. O'Brien     USE(c);
381445e5710bSMark Peek     if (patbuf.len == 0) return(CC_ERROR);
3815c80476e4SDavid E. O'Brien     return(v_repeat_srch(searchdir));
3816c80476e4SDavid E. O'Brien }
3817c80476e4SDavid E. O'Brien 
3818c80476e4SDavid E. O'Brien /*ARGSUSED*/
3819c80476e4SDavid E. O'Brien CCRETVAL
382045e5710bSMark Peek v_rsrch_back(Char c)
3821c80476e4SDavid E. O'Brien {
3822c80476e4SDavid E. O'Brien     USE(c);
382345e5710bSMark Peek     if (patbuf.len == 0) return(CC_ERROR);
3824c80476e4SDavid E. O'Brien     return(v_repeat_srch(searchdir == F_UP_SEARCH_HIST ?
3825c80476e4SDavid E. O'Brien 			 F_DOWN_SEARCH_HIST : F_UP_SEARCH_HIST));
3826c80476e4SDavid E. O'Brien }
3827c80476e4SDavid E. O'Brien 
38283b6eaa7bSAndrey A. Chernov #ifndef WINNT_NATIVE
3829c80476e4SDavid E. O'Brien /* Since ed.defns.h  is generated from ed.defns.c, these empty
3830c80476e4SDavid E. O'Brien    functions will keep the F_NUM_FNS consistent
3831c80476e4SDavid E. O'Brien  */
3832c80476e4SDavid E. O'Brien CCRETVAL
383345e5710bSMark Peek e_copy_to_clipboard(Char c)
3834c80476e4SDavid E. O'Brien {
3835c80476e4SDavid E. O'Brien     USE(c);
3836c80476e4SDavid E. O'Brien     return CC_ERROR;
3837c80476e4SDavid E. O'Brien }
3838c80476e4SDavid E. O'Brien 
3839c80476e4SDavid E. O'Brien CCRETVAL
384045e5710bSMark Peek e_paste_from_clipboard(Char c)
3841c80476e4SDavid E. O'Brien {
3842c80476e4SDavid E. O'Brien     USE(c);
3843c80476e4SDavid E. O'Brien     return (CC_ERROR);
3844c80476e4SDavid E. O'Brien }
3845c80476e4SDavid E. O'Brien 
3846c80476e4SDavid E. O'Brien CCRETVAL
384745e5710bSMark Peek e_dosify_next(Char c)
3848c80476e4SDavid E. O'Brien {
3849c80476e4SDavid E. O'Brien     USE(c);
3850c80476e4SDavid E. O'Brien     return (CC_ERROR);
3851c80476e4SDavid E. O'Brien }
3852c80476e4SDavid E. O'Brien CCRETVAL
385345e5710bSMark Peek e_dosify_prev(Char c)
3854c80476e4SDavid E. O'Brien {
3855c80476e4SDavid E. O'Brien     USE(c);
3856c80476e4SDavid E. O'Brien     return (CC_ERROR);
3857c80476e4SDavid E. O'Brien }
3858c80476e4SDavid E. O'Brien CCRETVAL
385945e5710bSMark Peek e_page_up(Char c)
3860c80476e4SDavid E. O'Brien {
3861c80476e4SDavid E. O'Brien     USE(c);
3862c80476e4SDavid E. O'Brien     return (CC_ERROR);
3863c80476e4SDavid E. O'Brien }
3864c80476e4SDavid E. O'Brien CCRETVAL
386545e5710bSMark Peek e_page_down(Char c)
3866c80476e4SDavid E. O'Brien {
3867c80476e4SDavid E. O'Brien     USE(c);
3868c80476e4SDavid E. O'Brien     return (CC_ERROR);
3869c80476e4SDavid E. O'Brien }
38703b6eaa7bSAndrey A. Chernov #endif /* !WINNT_NATIVE */
3871c80476e4SDavid E. O'Brien 
3872c80476e4SDavid E. O'Brien #ifdef notdef
3873c80476e4SDavid E. O'Brien void
387445e5710bSMark Peek MoveCursor(int n)		/* move cursor + right - left char */
3875c80476e4SDavid E. O'Brien {
3876c80476e4SDavid E. O'Brien     Cursor = Cursor + n;
3877c80476e4SDavid E. O'Brien     if (Cursor < InputBuf)
3878c80476e4SDavid E. O'Brien 	Cursor = InputBuf;
3879c80476e4SDavid E. O'Brien     if (Cursor > LastChar)
3880c80476e4SDavid E. O'Brien 	Cursor = LastChar;
3881c80476e4SDavid E. O'Brien     return;
3882c80476e4SDavid E. O'Brien }
3883c80476e4SDavid E. O'Brien 
3884c80476e4SDavid E. O'Brien Char *
388545e5710bSMark Peek GetCursor(void)
3886c80476e4SDavid E. O'Brien {
3887c80476e4SDavid E. O'Brien     return(Cursor);
3888c80476e4SDavid E. O'Brien }
3889c80476e4SDavid E. O'Brien 
3890c80476e4SDavid E. O'Brien int
389145e5710bSMark Peek PutCursor(Char *p)
3892c80476e4SDavid E. O'Brien {
3893c80476e4SDavid E. O'Brien     if (p < InputBuf || p > LastChar)
3894c80476e4SDavid E. O'Brien 	return 1;		/* Error */
3895c80476e4SDavid E. O'Brien     Cursor = p;
3896c80476e4SDavid E. O'Brien     return 0;
3897c80476e4SDavid E. O'Brien }
3898c80476e4SDavid E. O'Brien #endif
3899