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