xref: /freebsd/contrib/tcsh/ed.chared.c (revision 6767bd61d2a712aa8c1df05b77201db4e0fb7dc7)
16767bd61SMark Peek /* $Header: /src/pub/tcsh/ed.chared.c,v 3.70 2001/09/02 21:06:02 christos Exp $ */
2c80476e4SDavid E. O'Brien /*
3c80476e4SDavid E. O'Brien  * ed.chared.c: Character editing functions.
4c80476e4SDavid E. O'Brien  */
5c80476e4SDavid E. O'Brien /*-
6c80476e4SDavid E. O'Brien  * Copyright (c) 1980, 1991 The Regents of the University of California.
7c80476e4SDavid E. O'Brien  * All rights reserved.
8c80476e4SDavid E. O'Brien  *
9c80476e4SDavid E. O'Brien  * Redistribution and use in source and binary forms, with or without
10c80476e4SDavid E. O'Brien  * modification, are permitted provided that the following conditions
11c80476e4SDavid E. O'Brien  * are met:
12c80476e4SDavid E. O'Brien  * 1. Redistributions of source code must retain the above copyright
13c80476e4SDavid E. O'Brien  *    notice, this list of conditions and the following disclaimer.
14c80476e4SDavid E. O'Brien  * 2. Redistributions in binary form must reproduce the above copyright
15c80476e4SDavid E. O'Brien  *    notice, this list of conditions and the following disclaimer in the
16c80476e4SDavid E. O'Brien  *    documentation and/or other materials provided with the distribution.
17c80476e4SDavid E. O'Brien  * 3. All advertising materials mentioning features or use of this software
18c80476e4SDavid E. O'Brien  *    must display the following acknowledgement:
19c80476e4SDavid E. O'Brien  *	This product includes software developed by the University of
20c80476e4SDavid E. O'Brien  *	California, Berkeley and its contributors.
21c80476e4SDavid E. O'Brien  * 4. Neither the name of the University nor the names of its contributors
22c80476e4SDavid E. O'Brien  *    may be used to endorse or promote products derived from this software
23c80476e4SDavid E. O'Brien  *    without specific prior written permission.
24c80476e4SDavid E. O'Brien  *
25c80476e4SDavid E. O'Brien  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26c80476e4SDavid E. O'Brien  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27c80476e4SDavid E. O'Brien  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28c80476e4SDavid E. O'Brien  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29c80476e4SDavid E. O'Brien  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30c80476e4SDavid E. O'Brien  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31c80476e4SDavid E. O'Brien  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32c80476e4SDavid E. O'Brien  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33c80476e4SDavid E. O'Brien  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34c80476e4SDavid E. O'Brien  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35c80476e4SDavid E. O'Brien  * SUCH DAMAGE.
36c80476e4SDavid E. O'Brien  */
37c80476e4SDavid E. O'Brien /*
38c80476e4SDavid E. O'Brien   Bjorn Knutsson @ Thu Jun 24 19:02:17 1999
39c80476e4SDavid E. O'Brien 
40c80476e4SDavid E. O'Brien   e_dabbrev_expand() did not do proper completion if quoted spaces were present
41c80476e4SDavid E. O'Brien   in the string being completed. Exemple:
42c80476e4SDavid E. O'Brien 
43c80476e4SDavid E. O'Brien   # echo hello\ world
44c80476e4SDavid E. O'Brien   hello world
45c80476e4SDavid E. O'Brien   # echo h<press key bound to dabbrev-expande>
46c80476e4SDavid E. O'Brien   # echo hello\<cursor>
47c80476e4SDavid E. O'Brien 
48c80476e4SDavid E. O'Brien   Correct behavior is:
49c80476e4SDavid E. O'Brien   # echo h<press key bound to dabbrev-expande>
50c80476e4SDavid E. O'Brien   # echo hello\ world<cursor>
51c80476e4SDavid E. O'Brien 
52c80476e4SDavid E. O'Brien   The same problem occured if spaces were present in a string withing quotation
53c80476e4SDavid E. O'Brien   marks. Example:
54c80476e4SDavid E. O'Brien 
55c80476e4SDavid E. O'Brien   # echo "hello world"
56c80476e4SDavid E. O'Brien   hello world
57c80476e4SDavid E. O'Brien   # echo "h<press key bound to dabbrev-expande>
58c80476e4SDavid E. O'Brien   # echo "hello<cursor>
59c80476e4SDavid E. O'Brien 
60c80476e4SDavid E. O'Brien   The former problem could be solved with minor modifications of c_preword()
61c80476e4SDavid E. O'Brien   and c_endword(). The latter, however, required a significant rewrite of
62c80476e4SDavid E. O'Brien   c_preword(), since quoted strings must be parsed from start to end to
63c80476e4SDavid E. O'Brien   determine if a given character is inside or outside the quotation marks.
64c80476e4SDavid E. O'Brien 
65c80476e4SDavid E. O'Brien   Compare the following two strings:
66c80476e4SDavid E. O'Brien 
67c80476e4SDavid E. O'Brien   # echo \"" 'foo \' bar\"
68c80476e4SDavid E. O'Brien   " 'foo \' bar\
69c80476e4SDavid E. O'Brien   # echo '\"" 'foo \' bar\"
70c80476e4SDavid E. O'Brien   \"" foo ' bar"
71c80476e4SDavid E. O'Brien 
72c80476e4SDavid E. O'Brien   The only difference between the two echo lines is in the first character
73c80476e4SDavid E. O'Brien   after the echo command. The result is either one or three arguments.
74c80476e4SDavid E. O'Brien 
75c80476e4SDavid E. O'Brien  */
76c80476e4SDavid E. O'Brien 
77c80476e4SDavid E. O'Brien #include "sh.h"
78c80476e4SDavid E. O'Brien 
796767bd61SMark Peek RCSID("$Id: ed.chared.c,v 3.70 2001/09/02 21:06:02 christos Exp $")
80c80476e4SDavid E. O'Brien 
81c80476e4SDavid E. O'Brien #include "ed.h"
82c80476e4SDavid E. O'Brien #include "tw.h"
83c80476e4SDavid E. O'Brien #include "ed.defns.h"
84c80476e4SDavid E. O'Brien 
85c80476e4SDavid E. O'Brien /* #define SDEBUG */
86c80476e4SDavid E. O'Brien 
87c80476e4SDavid E. O'Brien #define TCSHOP_NOP    	  0x00
88c80476e4SDavid E. O'Brien #define TCSHOP_DELETE 	  0x01
89c80476e4SDavid E. O'Brien #define TCSHOP_INSERT 	  0x02
90c80476e4SDavid E. O'Brien #define TCSHOP_CHANGE 	  0x04
91c80476e4SDavid E. O'Brien 
92c80476e4SDavid E. O'Brien #define CHAR_FWD	0
93c80476e4SDavid E. O'Brien #define CHAR_BACK	1
94c80476e4SDavid E. O'Brien 
95c80476e4SDavid E. O'Brien /*
96c80476e4SDavid E. O'Brien  * vi word treatment
97c80476e4SDavid E. O'Brien  * from: Gert-Jan Vons <vons@cesar.crbca1.sinet.slb.com>
98c80476e4SDavid E. O'Brien  */
99c80476e4SDavid E. O'Brien #define C_CLASS_WHITE	1
100c80476e4SDavid E. O'Brien #define C_CLASS_ALNUM	2
101c80476e4SDavid E. O'Brien #define C_CLASS_OTHER	3
102c80476e4SDavid E. O'Brien 
103c80476e4SDavid E. O'Brien static Char *InsertPos = InputBuf; /* Where insertion starts */
104c80476e4SDavid E. O'Brien static Char *ActionPos = 0;	   /* Where action begins  */
105c80476e4SDavid E. O'Brien static int  ActionFlag = TCSHOP_NOP;	   /* What delayed action to take */
106c80476e4SDavid E. O'Brien /*
107c80476e4SDavid E. O'Brien  * Word search state
108c80476e4SDavid E. O'Brien  */
109c80476e4SDavid E. O'Brien static int  searchdir = F_UP_SEARCH_HIST; 	/* Direction of last search */
110c80476e4SDavid E. O'Brien static Char patbuf[INBUFSIZE];			/* Search target */
111c80476e4SDavid E. O'Brien static int patlen = 0;
112c80476e4SDavid E. O'Brien /*
113c80476e4SDavid E. O'Brien  * Char search state
114c80476e4SDavid E. O'Brien  */
115c80476e4SDavid E. O'Brien static int  srch_dir = CHAR_FWD;		/* Direction of last search */
116c80476e4SDavid E. O'Brien static Char srch_char = 0;			/* Search target */
117c80476e4SDavid E. O'Brien 
118c80476e4SDavid E. O'Brien /* all routines that start with c_ are private to this set of routines */
119c80476e4SDavid E. O'Brien static	void	 c_alternativ_key_map	__P((int));
1206767bd61SMark Peek void	 c_insert		__P((int));
1213b6eaa7bSAndrey A. Chernov void	 c_delafter		__P((int));
1223b6eaa7bSAndrey A. Chernov void	 c_delbefore		__P((int));
123c80476e4SDavid E. O'Brien static 	int	 c_to_class		__P((int));
124c80476e4SDavid E. O'Brien static	Char	*c_prev_word		__P((Char *, Char *, int));
125c80476e4SDavid E. O'Brien static	Char	*c_next_word		__P((Char *, Char *, int));
126c80476e4SDavid E. O'Brien static	Char	*c_number		__P((Char *, int *, int));
127c80476e4SDavid E. O'Brien static	Char	*c_expand		__P((Char *));
128c80476e4SDavid E. O'Brien static	void	 c_excl			__P((Char *));
129c80476e4SDavid E. O'Brien static	void	 c_substitute		__P((void));
130c80476e4SDavid E. O'Brien static	void	 c_delfini		__P((void));
131c80476e4SDavid E. O'Brien static	int	 c_hmatch		__P((Char *));
132c80476e4SDavid E. O'Brien static	void	 c_hsetpat		__P((void));
133c80476e4SDavid E. O'Brien #ifdef COMMENT
134c80476e4SDavid E. O'Brien static	void	 c_get_word		__P((Char **, Char **));
135c80476e4SDavid E. O'Brien #endif
1366767bd61SMark Peek static	Char	*c_preword		__P((Char *, Char *, int, Char *));
137c80476e4SDavid E. O'Brien static	Char	*c_nexword		__P((Char *, Char *, int));
1386767bd61SMark Peek static	Char	*c_endword		__P((Char *, Char *, int, Char *));
139c80476e4SDavid E. O'Brien static	Char	*c_eword		__P((Char *, Char *, int));
1406767bd61SMark Peek static	void	 c_push_kill		__P((Char *, Char *));
141c80476e4SDavid E. O'Brien static  CCRETVAL c_get_histline		__P((void));
142c80476e4SDavid E. O'Brien static  CCRETVAL c_search_line		__P((Char *, int));
143c80476e4SDavid E. O'Brien static  CCRETVAL v_repeat_srch		__P((int));
144c80476e4SDavid E. O'Brien static	CCRETVAL e_inc_search		__P((int));
145c80476e4SDavid E. O'Brien static	CCRETVAL v_search		__P((int));
146c80476e4SDavid E. O'Brien static	CCRETVAL v_csearch_fwd		__P((int, int, int));
147c80476e4SDavid E. O'Brien static	CCRETVAL v_action		__P((int));
148c80476e4SDavid E. O'Brien static	CCRETVAL v_csearch_back		__P((int, int, int));
149c80476e4SDavid E. O'Brien 
150c80476e4SDavid E. O'Brien #if defined(DSPMBYTE)
151c80476e4SDavid E. O'Brien static	void 	 e_charfwd_mbyte	__P((int));
152c80476e4SDavid E. O'Brien static	void 	 e_charback_mbyte	__P((int));
153c80476e4SDavid E. O'Brien static  int extdel;
154c80476e4SDavid E. O'Brien static  int extins = 0;
155c80476e4SDavid E. O'Brien #endif
156c80476e4SDavid E. O'Brien 
157c80476e4SDavid E. O'Brien static void
158c80476e4SDavid E. O'Brien c_alternativ_key_map(state)
159c80476e4SDavid E. O'Brien     int     state;
160c80476e4SDavid E. O'Brien {
161c80476e4SDavid E. O'Brien     switch (state) {
162c80476e4SDavid E. O'Brien     case 0:
163c80476e4SDavid E. O'Brien 	CurrentKeyMap = CcKeyMap;
164c80476e4SDavid E. O'Brien 	break;
165c80476e4SDavid E. O'Brien     case 1:
166c80476e4SDavid E. O'Brien 	CurrentKeyMap = CcAltMap;
167c80476e4SDavid E. O'Brien 	break;
168c80476e4SDavid E. O'Brien     default:
169c80476e4SDavid E. O'Brien 	return;
170c80476e4SDavid E. O'Brien     }
171c80476e4SDavid E. O'Brien 
172c80476e4SDavid E. O'Brien     AltKeyMap = (Char) state;
173c80476e4SDavid E. O'Brien }
174c80476e4SDavid E. O'Brien 
1756767bd61SMark Peek void
176c80476e4SDavid E. O'Brien c_insert(num)
1776767bd61SMark Peek     int num;
178c80476e4SDavid E. O'Brien {
1796767bd61SMark Peek     Char *cp;
180c80476e4SDavid E. O'Brien 
181c80476e4SDavid E. O'Brien     if (LastChar + num >= InputLim)
182c80476e4SDavid E. O'Brien 	return;			/* can't go past end of buffer */
183c80476e4SDavid E. O'Brien 
184c80476e4SDavid E. O'Brien     if (Cursor < LastChar) {	/* if I must move chars */
185c80476e4SDavid E. O'Brien 	for (cp = LastChar; cp >= Cursor; cp--)
186c80476e4SDavid E. O'Brien 	    cp[num] = *cp;
187c80476e4SDavid E. O'Brien     }
188c80476e4SDavid E. O'Brien     LastChar += num;
189c80476e4SDavid E. O'Brien }
190c80476e4SDavid E. O'Brien 
1913b6eaa7bSAndrey A. Chernov void
192c80476e4SDavid E. O'Brien c_delafter(num)
1936767bd61SMark Peek     int num;
194c80476e4SDavid E. O'Brien {
1956767bd61SMark Peek     Char *cp, *kp = NULL;
196c80476e4SDavid E. O'Brien 
197c80476e4SDavid E. O'Brien #if defined(DSPMBYTE)
198c80476e4SDavid E. O'Brien     Char *wkcp;
199c80476e4SDavid E. O'Brien 
200c80476e4SDavid E. O'Brien     extdel = 0;
201c80476e4SDavid E. O'Brien #endif
202c80476e4SDavid E. O'Brien 
203c80476e4SDavid E. O'Brien     if (num > LastChar - Cursor)
204c80476e4SDavid E. O'Brien 	num = (int) (LastChar - Cursor);	/* bounds check */
205c80476e4SDavid E. O'Brien 
206c80476e4SDavid E. O'Brien     if (num > 0) {			/* if I can delete anything */
207c80476e4SDavid E. O'Brien #if defined(DSPMBYTE)
208c80476e4SDavid E. O'Brien 	/* check for code of deleted character */
209c80476e4SDavid E. O'Brien 	if (_enable_mbdisp) {
210c80476e4SDavid E. O'Brien 	    for (wkcp = Cursor ; wkcp < Cursor + num; wkcp++) {
211c80476e4SDavid E. O'Brien 		if (extdel == 0)
212c80476e4SDavid E. O'Brien 		    extdel = Ismbyte1(*wkcp); /* check to 1st. byte */
213c80476e4SDavid E. O'Brien 		else
214c80476e4SDavid E. O'Brien 		    extdel = 0;	/* if 2nd. byte, force set to 0 */
215c80476e4SDavid E. O'Brien 	    }
216c80476e4SDavid E. O'Brien 	}
217c80476e4SDavid E. O'Brien #endif
218c80476e4SDavid E. O'Brien 	if (VImode) {
219c80476e4SDavid E. O'Brien 	    kp = UndoBuf;		/* Set Up for VI undo command */
220c80476e4SDavid E. O'Brien 	    UndoAction = TCSHOP_INSERT;
221c80476e4SDavid E. O'Brien 	    UndoSize = num;
222c80476e4SDavid E. O'Brien 	    UndoPtr  = Cursor;
223c80476e4SDavid E. O'Brien 	    for (cp = Cursor; cp <= LastChar; cp++) {
224c80476e4SDavid E. O'Brien 		*kp++ = *cp;	/* Save deleted chars into undobuf */
225c80476e4SDavid E. O'Brien 		*cp = cp[num];
226c80476e4SDavid E. O'Brien 	    }
227c80476e4SDavid E. O'Brien 	}
228c80476e4SDavid E. O'Brien 	else
229c80476e4SDavid E. O'Brien 	    for (cp = Cursor; cp <= LastChar; cp++)
230c80476e4SDavid E. O'Brien 		*cp = cp[num];
231c80476e4SDavid E. O'Brien 	LastChar -= num;
232c80476e4SDavid E. O'Brien #if defined(DSPMBYTE)
233c80476e4SDavid E. O'Brien 	if (_enable_mbdisp && extdel && Ismbyte2(*Cursor)) {
234c80476e4SDavid E. O'Brien 	    if( VImode ) {
235c80476e4SDavid E. O'Brien 		UndoSize++;
236c80476e4SDavid E. O'Brien 		*kp++ = *Cursor; /* Save deleted chars into undobuf */
237c80476e4SDavid E. O'Brien 	    }
238c80476e4SDavid E. O'Brien 	    for (cp = Cursor; cp <= LastChar; cp++)
239c80476e4SDavid E. O'Brien 		*cp = cp[1];
240c80476e4SDavid E. O'Brien 	    LastChar--;
241c80476e4SDavid E. O'Brien 	    e_redisp( 1 );
242c80476e4SDavid E. O'Brien 	}
243c80476e4SDavid E. O'Brien 	else
244c80476e4SDavid E. O'Brien 	    extdel = 0;
245c80476e4SDavid E. O'Brien #endif
246c80476e4SDavid E. O'Brien     }
247c80476e4SDavid E. O'Brien #ifdef notdef
248c80476e4SDavid E. O'Brien     else {
249c80476e4SDavid E. O'Brien 	/*
250c80476e4SDavid E. O'Brien 	 * XXX: We don't want to do that. In emacs mode overwrite should be
251c80476e4SDavid E. O'Brien 	 * sticky. I am not sure how that affects vi mode
252c80476e4SDavid E. O'Brien 	 */
253c80476e4SDavid E. O'Brien 	inputmode = MODE_INSERT;
254c80476e4SDavid E. O'Brien     }
255c80476e4SDavid E. O'Brien #endif /* notdef */
256c80476e4SDavid E. O'Brien }
257c80476e4SDavid E. O'Brien 
2583b6eaa7bSAndrey A. Chernov void
259c80476e4SDavid E. O'Brien c_delbefore(num)		/* delete before dot, with bounds checking */
2606767bd61SMark Peek     int num;
261c80476e4SDavid E. O'Brien {
2626767bd61SMark Peek     Char *cp, *kp = NULL;
263c80476e4SDavid E. O'Brien 
264c80476e4SDavid E. O'Brien #if defined(DSPMBYTE)
265c80476e4SDavid E. O'Brien     Char *nowcur, *wkcp;
266c80476e4SDavid E. O'Brien     Char delc;
267c80476e4SDavid E. O'Brien 
268c80476e4SDavid E. O'Brien     extdel = 0;
269c80476e4SDavid E. O'Brien #endif
270c80476e4SDavid E. O'Brien 
271c80476e4SDavid E. O'Brien     if (num > Cursor - InputBuf)
272c80476e4SDavid E. O'Brien 	num = (int) (Cursor - InputBuf);	/* bounds check */
273c80476e4SDavid E. O'Brien 
274c80476e4SDavid E. O'Brien     if (num > 0) {			/* if I can delete anything */
275c80476e4SDavid E. O'Brien #if defined(DSPMBYTE)
276c80476e4SDavid E. O'Brien 	nowcur = Cursor - num;
277c80476e4SDavid E. O'Brien 	delc = *nowcur;
278c80476e4SDavid E. O'Brien #endif
279c80476e4SDavid E. O'Brien 	if (VImode) {
280c80476e4SDavid E. O'Brien 	    kp = UndoBuf;		/* Set Up for VI undo command */
281c80476e4SDavid E. O'Brien 	    UndoAction = TCSHOP_INSERT;
282c80476e4SDavid E. O'Brien 	    UndoSize = num;
283c80476e4SDavid E. O'Brien 	    UndoPtr  = Cursor - num;
284c80476e4SDavid E. O'Brien 	    for (cp = Cursor - num; cp <= LastChar; cp++) {
285c80476e4SDavid E. O'Brien 		*kp++ = *cp;
286c80476e4SDavid E. O'Brien 		*cp = cp[num];
287c80476e4SDavid E. O'Brien 	    }
288c80476e4SDavid E. O'Brien 	}
289c80476e4SDavid E. O'Brien 	else
290c80476e4SDavid E. O'Brien 	    for (cp = Cursor - num; cp <= LastChar; cp++)
291c80476e4SDavid E. O'Brien 		*cp = cp[num];
292c80476e4SDavid E. O'Brien 	LastChar -= num;
293c80476e4SDavid E. O'Brien #if defined(DSPMBYTE)
294c80476e4SDavid E. O'Brien 	if (_enable_mbdisp) {
295c80476e4SDavid E. O'Brien 	    for (wkcp = InputBuf; wkcp < nowcur; wkcp++) {
296c80476e4SDavid E. O'Brien 		if(extdel == 0)
297c80476e4SDavid E. O'Brien 		    extdel = Ismbyte1(*wkcp); /* check to 1st. byte */
298c80476e4SDavid E. O'Brien 		else
299c80476e4SDavid E. O'Brien 		    extdel = 0;	/* if 2nd. byte, force set to 0 */
300c80476e4SDavid E. O'Brien 	    }
301c80476e4SDavid E. O'Brien 	    if (extdel && Ismbyte2(delc)) {
302c80476e4SDavid E. O'Brien 		if( VImode ) {
303c80476e4SDavid E. O'Brien 		    UndoSize++;
304c80476e4SDavid E. O'Brien 		    UndoPtr--;
305c80476e4SDavid E. O'Brien 		    *kp++ = *(nowcur-1);
306c80476e4SDavid E. O'Brien 				/* Save deleted chars into undobuf */
307c80476e4SDavid E. O'Brien 		}
308c80476e4SDavid E. O'Brien 		for (cp = nowcur - 1; cp <= LastChar; cp++)
309c80476e4SDavid E. O'Brien 		    *cp = cp[1];
310c80476e4SDavid E. O'Brien 		LastChar--;
311c80476e4SDavid E. O'Brien 	    }
312c80476e4SDavid E. O'Brien 	}
313c80476e4SDavid E. O'Brien 	else
314c80476e4SDavid E. O'Brien 	    extdel = 0;
315c80476e4SDavid E. O'Brien #endif
316c80476e4SDavid E. O'Brien     }
317c80476e4SDavid E. O'Brien }
318c80476e4SDavid E. O'Brien 
319c80476e4SDavid E. O'Brien static Char *
3206767bd61SMark Peek c_preword(p, low, n, delim)
3216767bd61SMark Peek     Char *p, *low, *delim;
3226767bd61SMark Peek     int n;
323c80476e4SDavid E. O'Brien {
324c80476e4SDavid E. O'Brien   while (n--) {
3256767bd61SMark Peek     Char *prev = low;
3266767bd61SMark Peek     Char *new;
327c80476e4SDavid E. O'Brien 
3286767bd61SMark Peek     while (prev < p) {		/* Skip initial non-word chars */
3296767bd61SMark Peek       if (!Strchr(delim, *prev) || *(prev-1) == (Char)'\\')
330c80476e4SDavid E. O'Brien 	break;
331c80476e4SDavid E. O'Brien       prev++;
332c80476e4SDavid E. O'Brien     }
333c80476e4SDavid E. O'Brien 
334c80476e4SDavid E. O'Brien     new = prev;
335c80476e4SDavid E. O'Brien 
336c80476e4SDavid E. O'Brien     while (new < p) {
337c80476e4SDavid E. O'Brien       prev = new;
3386767bd61SMark Peek       new = c_endword(prev-1, p, 1, delim); /* Skip to next non-word char */
339c80476e4SDavid E. O'Brien       new++;			/* Step away from end of word */
3406767bd61SMark Peek       while (new <= p) {	/* Skip trailing non-word chars */
3416767bd61SMark Peek 	if (!Strchr(delim, *new) || *(new-1) == (Char)'\\')
342c80476e4SDavid E. O'Brien 	  break;
343c80476e4SDavid E. O'Brien 	new++;
344c80476e4SDavid E. O'Brien       }
345c80476e4SDavid E. O'Brien     }
346c80476e4SDavid E. O'Brien 
347c80476e4SDavid E. O'Brien     p = prev;			/* Set to previous word start */
348c80476e4SDavid E. O'Brien 
349c80476e4SDavid E. O'Brien   }
350c80476e4SDavid E. O'Brien   if (p < low)
351c80476e4SDavid E. O'Brien     p = low;
352c80476e4SDavid E. O'Brien   return (p);
353c80476e4SDavid E. O'Brien }
354c80476e4SDavid E. O'Brien 
355c80476e4SDavid E. O'Brien /*
356c80476e4SDavid E. O'Brien  * c_to_class() returns the class of the given character.
357c80476e4SDavid E. O'Brien  *
358c80476e4SDavid E. O'Brien  * This is used to make the c_prev_word() and c_next_word() functions
359c80476e4SDavid E. O'Brien  * work like vi's, which classify characters. A word is a sequence of
360c80476e4SDavid E. O'Brien  * characters belonging to the same class, classes being defined as
361c80476e4SDavid E. O'Brien  * follows:
362c80476e4SDavid E. O'Brien  *
363c80476e4SDavid E. O'Brien  *	1/ whitespace
364c80476e4SDavid E. O'Brien  *	2/ alphanumeric chars, + underscore
365c80476e4SDavid E. O'Brien  *	3/ others
366c80476e4SDavid E. O'Brien  */
367c80476e4SDavid E. O'Brien static int
368c80476e4SDavid E. O'Brien c_to_class(ch)
3696767bd61SMark Peek int  ch;
370c80476e4SDavid E. O'Brien {
371c80476e4SDavid E. O'Brien     if (Isspace(ch))
372c80476e4SDavid E. O'Brien         return C_CLASS_WHITE;
373c80476e4SDavid E. O'Brien 
374c80476e4SDavid E. O'Brien     if (Isdigit(ch) || Isalpha(ch) || ch == '_')
375c80476e4SDavid E. O'Brien         return C_CLASS_ALNUM;
376c80476e4SDavid E. O'Brien 
377c80476e4SDavid E. O'Brien     return C_CLASS_OTHER;
378c80476e4SDavid E. O'Brien }
379c80476e4SDavid E. O'Brien 
380c80476e4SDavid E. O'Brien static Char *
381c80476e4SDavid E. O'Brien c_prev_word(p, low, n)
3826767bd61SMark Peek     Char *p, *low;
3836767bd61SMark Peek     int n;
384c80476e4SDavid E. O'Brien {
385c80476e4SDavid E. O'Brien     p--;
386c80476e4SDavid E. O'Brien 
387c80476e4SDavid E. O'Brien     if (!VImode) {
388c80476e4SDavid E. O'Brien 	while (n--) {
389c80476e4SDavid E. O'Brien 	    while ((p >= low) && !isword(*p))
390c80476e4SDavid E. O'Brien 		p--;
391c80476e4SDavid E. O'Brien 	    while ((p >= low) && isword(*p))
392c80476e4SDavid E. O'Brien 		p--;
393c80476e4SDavid E. O'Brien 	}
394c80476e4SDavid E. O'Brien 
395c80476e4SDavid E. O'Brien 	/* cp now points to one character before the word */
396c80476e4SDavid E. O'Brien 	p++;
397c80476e4SDavid E. O'Brien 	if (p < low)
398c80476e4SDavid E. O'Brien 	    p = low;
399c80476e4SDavid E. O'Brien 	/* cp now points where we want it */
400c80476e4SDavid E. O'Brien 	return(p);
401c80476e4SDavid E. O'Brien     }
402c80476e4SDavid E. O'Brien 
403c80476e4SDavid E. O'Brien     while (n--) {
4046767bd61SMark Peek         int  c_class;
405c80476e4SDavid E. O'Brien 
406c80476e4SDavid E. O'Brien         if (p < low)
407c80476e4SDavid E. O'Brien             break;
408c80476e4SDavid E. O'Brien 
409c80476e4SDavid E. O'Brien         /* scan until beginning of current word (may be all whitespace!) */
410c80476e4SDavid E. O'Brien         c_class = c_to_class(*p);
411c80476e4SDavid E. O'Brien         while ((p >= low) && c_class == c_to_class(*p))
412c80476e4SDavid E. O'Brien             p--;
413c80476e4SDavid E. O'Brien 
414c80476e4SDavid E. O'Brien         /* if this was a non_whitespace word, we're ready */
415c80476e4SDavid E. O'Brien         if (c_class != C_CLASS_WHITE)
416c80476e4SDavid E. O'Brien             continue;
417c80476e4SDavid E. O'Brien 
418c80476e4SDavid E. O'Brien         /* otherwise, move back to beginning of the word just found */
419c80476e4SDavid E. O'Brien         c_class = c_to_class(*p);
420c80476e4SDavid E. O'Brien         while ((p >= low) && c_class == c_to_class(*p))
421c80476e4SDavid E. O'Brien             p--;
422c80476e4SDavid E. O'Brien     }
423c80476e4SDavid E. O'Brien 
424c80476e4SDavid E. O'Brien     p++;                        /* correct overshoot */
425c80476e4SDavid E. O'Brien 
426c80476e4SDavid E. O'Brien     return (p);
427c80476e4SDavid E. O'Brien }
428c80476e4SDavid E. O'Brien 
429c80476e4SDavid E. O'Brien static Char *
430c80476e4SDavid E. O'Brien c_next_word(p, high, n)
4316767bd61SMark Peek     Char *p, *high;
4326767bd61SMark Peek     int n;
433c80476e4SDavid E. O'Brien {
434c80476e4SDavid E. O'Brien     if (!VImode) {
435c80476e4SDavid E. O'Brien 	while (n--) {
436c80476e4SDavid E. O'Brien 	    while ((p < high) && !isword(*p))
437c80476e4SDavid E. O'Brien 		p++;
438c80476e4SDavid E. O'Brien 	    while ((p < high) && isword(*p))
439c80476e4SDavid E. O'Brien 		p++;
440c80476e4SDavid E. O'Brien 	}
441c80476e4SDavid E. O'Brien 	if (p > high)
442c80476e4SDavid E. O'Brien 	    p = high;
443c80476e4SDavid E. O'Brien 	/* p now points where we want it */
444c80476e4SDavid E. O'Brien 	return(p);
445c80476e4SDavid E. O'Brien     }
446c80476e4SDavid E. O'Brien 
447c80476e4SDavid E. O'Brien     while (n--) {
4486767bd61SMark Peek         int  c_class;
449c80476e4SDavid E. O'Brien 
450c80476e4SDavid E. O'Brien         if (p >= high)
451c80476e4SDavid E. O'Brien             break;
452c80476e4SDavid E. O'Brien 
453c80476e4SDavid E. O'Brien         /* scan until end of current word (may be all whitespace!) */
454c80476e4SDavid E. O'Brien         c_class = c_to_class(*p);
455c80476e4SDavid E. O'Brien         while ((p < high) && c_class == c_to_class(*p))
456c80476e4SDavid E. O'Brien             p++;
457c80476e4SDavid E. O'Brien 
458c80476e4SDavid E. O'Brien         /* if this was all whitespace, we're ready */
459c80476e4SDavid E. O'Brien         if (c_class == C_CLASS_WHITE)
460c80476e4SDavid E. O'Brien             continue;
461c80476e4SDavid E. O'Brien 
462c80476e4SDavid E. O'Brien 	/* if we've found white-space at the end of the word, skip it */
463c80476e4SDavid E. O'Brien         while ((p < high) && c_to_class(*p) == C_CLASS_WHITE)
464c80476e4SDavid E. O'Brien             p++;
465c80476e4SDavid E. O'Brien     }
466c80476e4SDavid E. O'Brien 
467c80476e4SDavid E. O'Brien     p--;                        /* correct overshoot */
468c80476e4SDavid E. O'Brien 
469c80476e4SDavid E. O'Brien     return (p);
470c80476e4SDavid E. O'Brien }
471c80476e4SDavid E. O'Brien 
472c80476e4SDavid E. O'Brien static Char *
473c80476e4SDavid E. O'Brien c_nexword(p, high, n)
4746767bd61SMark Peek     Char *p, *high;
4756767bd61SMark Peek     int n;
476c80476e4SDavid E. O'Brien {
477c80476e4SDavid E. O'Brien     while (n--) {
478c80476e4SDavid E. O'Brien 	while ((p < high) && !Isspace(*p))
479c80476e4SDavid E. O'Brien 	    p++;
480c80476e4SDavid E. O'Brien 	while ((p < high) && Isspace(*p))
481c80476e4SDavid E. O'Brien 	    p++;
482c80476e4SDavid E. O'Brien     }
483c80476e4SDavid E. O'Brien 
484c80476e4SDavid E. O'Brien     if (p > high)
485c80476e4SDavid E. O'Brien 	p = high;
486c80476e4SDavid E. O'Brien     /* p now points where we want it */
487c80476e4SDavid E. O'Brien     return(p);
488c80476e4SDavid E. O'Brien }
489c80476e4SDavid E. O'Brien 
490c80476e4SDavid E. O'Brien /*
491c80476e4SDavid E. O'Brien  * Expand-History (originally "Magic-Space") code added by
492c80476e4SDavid E. O'Brien  * Ray Moody <ray@gibbs.physics.purdue.edu>
493c80476e4SDavid E. O'Brien  * this is a neat, but odd, addition.
494c80476e4SDavid E. O'Brien  */
495c80476e4SDavid E. O'Brien 
496c80476e4SDavid E. O'Brien /*
497c80476e4SDavid E. O'Brien  * c_number: Ignore character p points to, return number appearing after that.
498c80476e4SDavid E. O'Brien  * A '$' by itself means a big number; "$-" is for negative; '^' means 1.
499c80476e4SDavid E. O'Brien  * Return p pointing to last char used.
500c80476e4SDavid E. O'Brien  */
501c80476e4SDavid E. O'Brien 
502c80476e4SDavid E. O'Brien /*
503c80476e4SDavid E. O'Brien  * dval is the number to subtract from for things like $-3
504c80476e4SDavid E. O'Brien  */
505c80476e4SDavid E. O'Brien 
506c80476e4SDavid E. O'Brien static Char *
507c80476e4SDavid E. O'Brien c_number(p, num, dval)
5086767bd61SMark Peek     Char *p;
5096767bd61SMark Peek     int *num;
5106767bd61SMark Peek     int dval;
511c80476e4SDavid E. O'Brien {
5126767bd61SMark Peek     int i;
5136767bd61SMark Peek     int sign = 1;
514c80476e4SDavid E. O'Brien 
515c80476e4SDavid E. O'Brien     if (*++p == '^') {
516c80476e4SDavid E. O'Brien 	*num = 1;
517c80476e4SDavid E. O'Brien 	return(p);
518c80476e4SDavid E. O'Brien     }
519c80476e4SDavid E. O'Brien     if (*p == '$') {
520c80476e4SDavid E. O'Brien 	if (*++p != '-') {
521c80476e4SDavid E. O'Brien 	    *num = NCARGS;	/* Handle $ */
522c80476e4SDavid E. O'Brien 	    return(--p);
523c80476e4SDavid E. O'Brien 	}
524c80476e4SDavid E. O'Brien 	sign = -1;		/* Handle $- */
525c80476e4SDavid E. O'Brien 	++p;
526c80476e4SDavid E. O'Brien     }
527c80476e4SDavid E. O'Brien     for (i = 0; *p >= '0' && *p <= '9'; i = 10 * i + *p++ - '0')
528c80476e4SDavid E. O'Brien 	continue;
529c80476e4SDavid E. O'Brien     *num = (sign < 0 ? dval - i : i);
530c80476e4SDavid E. O'Brien     return(--p);
531c80476e4SDavid E. O'Brien }
532c80476e4SDavid E. O'Brien 
533c80476e4SDavid E. O'Brien /*
534c80476e4SDavid E. O'Brien  * excl_expand: There is an excl to be expanded to p -- do the right thing
535c80476e4SDavid E. O'Brien  * with it and return a version of p advanced over the expanded stuff.  Also,
536c80476e4SDavid E. O'Brien  * update tsh_cur and related things as appropriate...
537c80476e4SDavid E. O'Brien  */
538c80476e4SDavid E. O'Brien 
539c80476e4SDavid E. O'Brien static Char *
540c80476e4SDavid E. O'Brien c_expand(p)
5416767bd61SMark Peek     Char *p;
542c80476e4SDavid E. O'Brien {
5436767bd61SMark Peek     Char *q;
5446767bd61SMark Peek     struct Hist *h = Histlist.Hnext;
5456767bd61SMark Peek     struct wordent *l;
546c80476e4SDavid E. O'Brien     int     i, from, to, dval;
547c80476e4SDavid E. O'Brien     bool    all_dig;
548c80476e4SDavid E. O'Brien     bool    been_once = 0;
549c80476e4SDavid E. O'Brien     Char   *op = p;
550c80476e4SDavid E. O'Brien     Char    buf[INBUFSIZE];
551c80476e4SDavid E. O'Brien     Char   *bend = buf;
552c80476e4SDavid E. O'Brien     Char   *modbuf, *omodbuf;
553c80476e4SDavid E. O'Brien 
554c80476e4SDavid E. O'Brien     if (!h)
555c80476e4SDavid E. O'Brien 	goto excl_err;
556c80476e4SDavid E. O'Brien excl_sw:
557c80476e4SDavid E. O'Brien     switch (*(q = p + 1)) {
558c80476e4SDavid E. O'Brien 
559c80476e4SDavid E. O'Brien     case '^':
560c80476e4SDavid E. O'Brien 	bend = expand_lex(buf, INBUFSIZE, &h->Hlex, 1, 1);
561c80476e4SDavid E. O'Brien 	break;
562c80476e4SDavid E. O'Brien 
563c80476e4SDavid E. O'Brien     case '$':
564c80476e4SDavid E. O'Brien 	if ((l = (h->Hlex).prev) != 0)
565c80476e4SDavid E. O'Brien 	    bend = expand_lex(buf, INBUFSIZE, l->prev->prev, 0, 0);
566c80476e4SDavid E. O'Brien 	break;
567c80476e4SDavid E. O'Brien 
568c80476e4SDavid E. O'Brien     case '*':
569c80476e4SDavid E. O'Brien 	bend = expand_lex(buf, INBUFSIZE, &h->Hlex, 1, NCARGS);
570c80476e4SDavid E. O'Brien 	break;
571c80476e4SDavid E. O'Brien 
572c80476e4SDavid E. O'Brien     default:
573c80476e4SDavid E. O'Brien 	if (been_once) {	/* unknown argument */
574c80476e4SDavid E. O'Brien 	    /* assume it's a modifier, e.g. !foo:h, and get whole cmd */
575c80476e4SDavid E. O'Brien 	    bend = expand_lex(buf, INBUFSIZE, &h->Hlex, 0, NCARGS);
576c80476e4SDavid E. O'Brien 	    q -= 2;
577c80476e4SDavid E. O'Brien 	    break;
578c80476e4SDavid E. O'Brien 	}
579c80476e4SDavid E. O'Brien 	been_once = 1;
580c80476e4SDavid E. O'Brien 
581c80476e4SDavid E. O'Brien 	if (*q == ':')		/* short form: !:arg */
582c80476e4SDavid E. O'Brien 	    --q;
583c80476e4SDavid E. O'Brien 
584c80476e4SDavid E. O'Brien 	if (*q != HIST) {
585c80476e4SDavid E. O'Brien 	    /*
586c80476e4SDavid E. O'Brien 	     * Search for a space, tab, or colon.  See if we have a number (as
587c80476e4SDavid E. O'Brien 	     * in !1234:xyz).  Remember the number.
588c80476e4SDavid E. O'Brien 	     */
589c80476e4SDavid E. O'Brien 	    for (i = 0, all_dig = 1;
590c80476e4SDavid E. O'Brien 		 *q != ' ' && *q != '\t' && *q != ':' && q < Cursor; q++) {
591c80476e4SDavid E. O'Brien 		/*
592c80476e4SDavid E. O'Brien 		 * PWP: !-4 is a valid history argument too, therefore the test
593c80476e4SDavid E. O'Brien 		 * is if not a digit, or not a - as the first character.
594c80476e4SDavid E. O'Brien 		 */
595c80476e4SDavid E. O'Brien 		if ((*q < '0' || *q > '9') && (*q != '-' || q != p + 1))
596c80476e4SDavid E. O'Brien 		    all_dig = 0;
597c80476e4SDavid E. O'Brien 		else if (*q == '-')
598c80476e4SDavid E. O'Brien 		    all_dig = 2;/* we are sneeky about this */
599c80476e4SDavid E. O'Brien 		else
600c80476e4SDavid E. O'Brien 		    i = 10 * i + *q - '0';
601c80476e4SDavid E. O'Brien 	    }
602c80476e4SDavid E. O'Brien 	    --q;
603c80476e4SDavid E. O'Brien 
604c80476e4SDavid E. O'Brien 	    /*
605c80476e4SDavid E. O'Brien 	     * If we have a number, search for event i.  Otherwise, search for
606c80476e4SDavid E. O'Brien 	     * a named event (as in !foo).  (In this case, I is the length of
607c80476e4SDavid E. O'Brien 	     * the named event).
608c80476e4SDavid E. O'Brien 	     */
609c80476e4SDavid E. O'Brien 	    if (all_dig) {
610c80476e4SDavid E. O'Brien 		if (all_dig == 2)
611c80476e4SDavid E. O'Brien 		    i = -i;	/* make it negitive */
612c80476e4SDavid E. O'Brien 		if (i < 0)	/* if !-4 (for example) */
613c80476e4SDavid E. O'Brien 		    i = eventno + 1 + i;	/* remember: i is < 0 */
614c80476e4SDavid E. O'Brien 		for (; h; h = h->Hnext) {
615c80476e4SDavid E. O'Brien 		    if (h->Hnum == i)
616c80476e4SDavid E. O'Brien 			break;
617c80476e4SDavid E. O'Brien 		}
618c80476e4SDavid E. O'Brien 	    }
619c80476e4SDavid E. O'Brien 	    else {
620c80476e4SDavid E. O'Brien 		for (i = (int) (q - p); h; h = h->Hnext) {
621c80476e4SDavid E. O'Brien 		    if ((l = &h->Hlex) != 0) {
622c80476e4SDavid E. O'Brien 			if (!Strncmp(p + 1, l->next->word, (size_t) i))
623c80476e4SDavid E. O'Brien 			    break;
624c80476e4SDavid E. O'Brien 		    }
625c80476e4SDavid E. O'Brien 		}
626c80476e4SDavid E. O'Brien 	    }
627c80476e4SDavid E. O'Brien 	}
628c80476e4SDavid E. O'Brien 	if (!h)
629c80476e4SDavid E. O'Brien 	    goto excl_err;
630c80476e4SDavid E. O'Brien 	if (q[1] == ':' || q[1] == '-' || q[1] == '*' ||
631c80476e4SDavid E. O'Brien 	    q[1] == '$' || q[1] == '^') {	/* get some args */
632c80476e4SDavid E. O'Brien 	    p = q[1] == ':' ? ++q : q;
633c80476e4SDavid E. O'Brien 	    /*
634c80476e4SDavid E. O'Brien 	     * Go handle !foo:*
635c80476e4SDavid E. O'Brien 	     */
636c80476e4SDavid E. O'Brien 	    if ((q[1] < '0' || q[1] > '9') &&
637c80476e4SDavid E. O'Brien 		q[1] != '-' && q[1] != '$' && q[1] != '^')
638c80476e4SDavid E. O'Brien 		goto excl_sw;
639c80476e4SDavid E. O'Brien 	    /*
640c80476e4SDavid E. O'Brien 	     * Go handle !foo:$
641c80476e4SDavid E. O'Brien 	     */
642c80476e4SDavid E. O'Brien 	    if (q[1] == '$' && (q[2] != '-' || q[3] < '0' || q[3] > '9'))
643c80476e4SDavid E. O'Brien 		goto excl_sw;
644c80476e4SDavid E. O'Brien 	    /*
645c80476e4SDavid E. O'Brien 	     * Count up the number of words in this event.  Store it in dval.
646c80476e4SDavid E. O'Brien 	     * Dval will be fed to number.
647c80476e4SDavid E. O'Brien 	     */
648c80476e4SDavid E. O'Brien 	    dval = 0;
649c80476e4SDavid E. O'Brien 	    if ((l = h->Hlex.prev) != 0) {
650c80476e4SDavid E. O'Brien 		for (l = l->prev; l != h->Hlex.next; l = l->prev, dval++)
651c80476e4SDavid E. O'Brien 		    continue;
652c80476e4SDavid E. O'Brien 	    }
653c80476e4SDavid E. O'Brien 	    if (!dval)
654c80476e4SDavid E. O'Brien 		goto excl_err;
655c80476e4SDavid E. O'Brien 	    if (q[1] == '-')
656c80476e4SDavid E. O'Brien 		from = 0;
657c80476e4SDavid E. O'Brien 	    else
658c80476e4SDavid E. O'Brien 		q = c_number(q, &from, dval);
659c80476e4SDavid E. O'Brien 	    if (q[1] == '-') {
660c80476e4SDavid E. O'Brien 		++q;
661c80476e4SDavid E. O'Brien 		if ((q[1] < '0' || q[1] > '9') && q[1] != '$')
662c80476e4SDavid E. O'Brien 		    to = dval - 1;
663c80476e4SDavid E. O'Brien 		else
664c80476e4SDavid E. O'Brien 		    q = c_number(q, &to, dval);
665c80476e4SDavid E. O'Brien 	    }
666c80476e4SDavid E. O'Brien 	    else if (q[1] == '*') {
667c80476e4SDavid E. O'Brien 		++q;
668c80476e4SDavid E. O'Brien 		to = NCARGS;
669c80476e4SDavid E. O'Brien 	    }
670c80476e4SDavid E. O'Brien 	    else {
671c80476e4SDavid E. O'Brien 		to = from;
672c80476e4SDavid E. O'Brien 	    }
673c80476e4SDavid E. O'Brien 	    if (from < 0 || to < from)
674c80476e4SDavid E. O'Brien 		goto excl_err;
675c80476e4SDavid E. O'Brien 	    bend = expand_lex(buf, INBUFSIZE, &h->Hlex, from, to);
676c80476e4SDavid E. O'Brien 	}
677c80476e4SDavid E. O'Brien 	else {			/* get whole cmd */
678c80476e4SDavid E. O'Brien 	    bend = expand_lex(buf, INBUFSIZE, &h->Hlex, 0, NCARGS);
679c80476e4SDavid E. O'Brien 	}
680c80476e4SDavid E. O'Brien 	break;
681c80476e4SDavid E. O'Brien     }
682c80476e4SDavid E. O'Brien 
683c80476e4SDavid E. O'Brien     /*
684c80476e4SDavid E. O'Brien      * Apply modifiers, if any.
685c80476e4SDavid E. O'Brien      */
686c80476e4SDavid E. O'Brien     if (q[1] == ':') {
687c80476e4SDavid E. O'Brien 	*bend = '\0';
688c80476e4SDavid E. O'Brien 	modbuf = omodbuf = buf;
689c80476e4SDavid E. O'Brien 	while (q[1] == ':' && modbuf != NULL) {
690c80476e4SDavid E. O'Brien 	    switch (q[2]) {
691c80476e4SDavid E. O'Brien 	    case 'r':
692c80476e4SDavid E. O'Brien 	    case 'e':
693c80476e4SDavid E. O'Brien 	    case 'h':
694c80476e4SDavid E. O'Brien 	    case 't':
695c80476e4SDavid E. O'Brien 	    case 'q':
696c80476e4SDavid E. O'Brien 	    case 'x':
697c80476e4SDavid E. O'Brien 	    case 'u':
698c80476e4SDavid E. O'Brien 	    case 'l':
699c80476e4SDavid E. O'Brien 		if ((modbuf = domod(omodbuf, (int) q[2])) != NULL) {
700c80476e4SDavid E. O'Brien 		    if (omodbuf != buf)
701c80476e4SDavid E. O'Brien 			xfree((ptr_t) omodbuf);
702c80476e4SDavid E. O'Brien 		    omodbuf = modbuf;
703c80476e4SDavid E. O'Brien 		}
704c80476e4SDavid E. O'Brien 		++q;
705c80476e4SDavid E. O'Brien 		break;
706c80476e4SDavid E. O'Brien 
707c80476e4SDavid E. O'Brien 	    case 'a':
708c80476e4SDavid E. O'Brien 	    case 'g':
709c80476e4SDavid E. O'Brien 		/* Not implemented; this needs to be done before expanding
710c80476e4SDavid E. O'Brien 		 * lex. We don't have the words available to us anymore.
711c80476e4SDavid E. O'Brien 		 */
712c80476e4SDavid E. O'Brien 		++q;
713c80476e4SDavid E. O'Brien 		break;
714c80476e4SDavid E. O'Brien 
715c80476e4SDavid E. O'Brien 	    case 'p':
716c80476e4SDavid E. O'Brien 		/* Ok */
717c80476e4SDavid E. O'Brien 		++q;
718c80476e4SDavid E. O'Brien 		break;
719c80476e4SDavid E. O'Brien 
720c80476e4SDavid E. O'Brien 	    case '\0':
721c80476e4SDavid E. O'Brien 		break;
722c80476e4SDavid E. O'Brien 
723c80476e4SDavid E. O'Brien 	    default:
724c80476e4SDavid E. O'Brien 		++q;
725c80476e4SDavid E. O'Brien 		break;
726c80476e4SDavid E. O'Brien 	    }
727c80476e4SDavid E. O'Brien 	    if (q[1])
728c80476e4SDavid E. O'Brien 		++q;
729c80476e4SDavid E. O'Brien 	}
730c80476e4SDavid E. O'Brien 	if (omodbuf != buf) {
731c80476e4SDavid E. O'Brien 	    (void) Strcpy(buf, omodbuf);
732c80476e4SDavid E. O'Brien 	    xfree((ptr_t) omodbuf);
733c80476e4SDavid E. O'Brien 	    bend = Strend(buf);
734c80476e4SDavid E. O'Brien 	}
735c80476e4SDavid E. O'Brien     }
736c80476e4SDavid E. O'Brien 
737c80476e4SDavid E. O'Brien     /*
738c80476e4SDavid E. O'Brien      * Now replace the text from op to q inclusive with the text from buf to
739c80476e4SDavid E. O'Brien      * bend.
740c80476e4SDavid E. O'Brien      */
741c80476e4SDavid E. O'Brien     q++;
742c80476e4SDavid E. O'Brien 
743c80476e4SDavid E. O'Brien     /*
744c80476e4SDavid E. O'Brien      * Now replace text non-inclusively like a real CS major!
745c80476e4SDavid E. O'Brien      */
746c80476e4SDavid E. O'Brien     if (LastChar + (bend - buf) - (q - op) >= InputLim)
747c80476e4SDavid E. O'Brien 	goto excl_err;
748c80476e4SDavid E. O'Brien     (void) memmove((ptr_t) (q + (bend - buf) - (q - op)), (ptr_t) q,
749c80476e4SDavid E. O'Brien 		   (size_t) ((LastChar - q) * sizeof(Char)));
750c80476e4SDavid E. O'Brien     LastChar += (bend - buf) - (q - op);
751c80476e4SDavid E. O'Brien     Cursor += (bend - buf) - (q - op);
752c80476e4SDavid E. O'Brien     (void) memmove((ptr_t) op, (ptr_t) buf,
753c80476e4SDavid E. O'Brien 		   (size_t) ((bend - buf) * sizeof(Char)));
754c80476e4SDavid E. O'Brien     *LastChar = '\0';
755c80476e4SDavid E. O'Brien     return(op + (bend - buf));
756c80476e4SDavid E. O'Brien excl_err:
757c80476e4SDavid E. O'Brien     SoundBeep();
758c80476e4SDavid E. O'Brien     return(op + 1);
759c80476e4SDavid E. O'Brien }
760c80476e4SDavid E. O'Brien 
761c80476e4SDavid E. O'Brien /*
762c80476e4SDavid E. O'Brien  * c_excl: An excl has been found at point p -- back up and find some white
763c80476e4SDavid E. O'Brien  * space (or the beginning of the buffer) and properly expand all the excl's
764c80476e4SDavid E. O'Brien  * from there up to the current cursor position. We also avoid (trying to)
765c80476e4SDavid E. O'Brien  * expanding '>!'
766c80476e4SDavid E. O'Brien  */
767c80476e4SDavid E. O'Brien 
768c80476e4SDavid E. O'Brien static void
769c80476e4SDavid E. O'Brien c_excl(p)
7706767bd61SMark Peek     Char *p;
771c80476e4SDavid E. O'Brien {
7726767bd61SMark Peek     int i;
7736767bd61SMark Peek     Char *q;
774c80476e4SDavid E. O'Brien 
775c80476e4SDavid E. O'Brien     /*
776c80476e4SDavid E. O'Brien      * if />[SPC TAB]*![SPC TAB]/, back up p to just after the >. otherwise,
777c80476e4SDavid E. O'Brien      * back p up to just before the current word.
778c80476e4SDavid E. O'Brien      */
779c80476e4SDavid E. O'Brien     if ((p[1] == ' ' || p[1] == '\t') &&
780c80476e4SDavid E. O'Brien 	(p[-1] == ' ' || p[-1] == '\t' || p[-1] == '>')) {
781c80476e4SDavid E. O'Brien 	for (q = p - 1; q > InputBuf && (*q == ' ' || *q == '\t'); --q)
782c80476e4SDavid E. O'Brien 	    continue;
783c80476e4SDavid E. O'Brien 	if (*q == '>')
784c80476e4SDavid E. O'Brien 	    ++p;
785c80476e4SDavid E. O'Brien     }
786c80476e4SDavid E. O'Brien     else {
787c80476e4SDavid E. O'Brien 	while (*p != ' ' && *p != '\t' && p > InputBuf)
788c80476e4SDavid E. O'Brien 	    --p;
789c80476e4SDavid E. O'Brien     }
790c80476e4SDavid E. O'Brien 
791c80476e4SDavid E. O'Brien     /*
792c80476e4SDavid E. O'Brien      * Forever: Look for history char.  (Stop looking when we find the cursor.)
793c80476e4SDavid E. O'Brien      * Count backslashes.  Of odd, skip history char. Return if all done.
794c80476e4SDavid E. O'Brien      * Expand if even number of backslashes.
795c80476e4SDavid E. O'Brien      */
796c80476e4SDavid E. O'Brien     for (;;) {
797c80476e4SDavid E. O'Brien 	while (*p != HIST && p < Cursor)
798c80476e4SDavid E. O'Brien 	    ++p;
799c80476e4SDavid E. O'Brien 	for (i = 1; (p - i) >= InputBuf && p[-i] == '\\'; i++)
800c80476e4SDavid E. O'Brien 	    continue;
801c80476e4SDavid E. O'Brien 	if (i % 2 == 0)
802c80476e4SDavid E. O'Brien 	    ++p;
803c80476e4SDavid E. O'Brien 	if (p >= Cursor)
804c80476e4SDavid E. O'Brien 	    return;
805c80476e4SDavid E. O'Brien 	if (i % 2 == 1)
806c80476e4SDavid E. O'Brien 	    p = c_expand(p);
807c80476e4SDavid E. O'Brien     }
808c80476e4SDavid E. O'Brien }
809c80476e4SDavid E. O'Brien 
810c80476e4SDavid E. O'Brien 
811c80476e4SDavid E. O'Brien static void
812c80476e4SDavid E. O'Brien c_substitute()
813c80476e4SDavid E. O'Brien {
8146767bd61SMark Peek     Char *p;
815c80476e4SDavid E. O'Brien 
816c80476e4SDavid E. O'Brien     /*
817c80476e4SDavid E. O'Brien      * Start p out one character before the cursor.  Move it backwards looking
818c80476e4SDavid E. O'Brien      * for white space, the beginning of the line, or a history character.
819c80476e4SDavid E. O'Brien      */
820c80476e4SDavid E. O'Brien     for (p = Cursor - 1;
821c80476e4SDavid E. O'Brien 	 p > InputBuf && *p != ' ' && *p != '\t' && *p != HIST; --p)
822c80476e4SDavid E. O'Brien 	continue;
823c80476e4SDavid E. O'Brien 
824c80476e4SDavid E. O'Brien     /*
825c80476e4SDavid E. O'Brien      * If we found a history character, go expand it.
826c80476e4SDavid E. O'Brien      */
827c80476e4SDavid E. O'Brien     if (*p == HIST)
828c80476e4SDavid E. O'Brien 	c_excl(p);
829c80476e4SDavid E. O'Brien     Refresh();
830c80476e4SDavid E. O'Brien }
831c80476e4SDavid E. O'Brien 
832c80476e4SDavid E. O'Brien static void
833c80476e4SDavid E. O'Brien c_delfini()		/* Finish up delete action */
834c80476e4SDavid E. O'Brien {
8356767bd61SMark Peek     int Size;
836c80476e4SDavid E. O'Brien 
837c80476e4SDavid E. O'Brien     if (ActionFlag & TCSHOP_INSERT)
838c80476e4SDavid E. O'Brien 	c_alternativ_key_map(0);
839c80476e4SDavid E. O'Brien 
840c80476e4SDavid E. O'Brien     ActionFlag = TCSHOP_NOP;
841c80476e4SDavid E. O'Brien 
842c80476e4SDavid E. O'Brien     if (ActionPos == 0)
843c80476e4SDavid E. O'Brien 	return;
844c80476e4SDavid E. O'Brien 
845c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_INSERT;
846c80476e4SDavid E. O'Brien 
847c80476e4SDavid E. O'Brien     if (Cursor > ActionPos) {
848c80476e4SDavid E. O'Brien 	Size = (int) (Cursor-ActionPos);
849c80476e4SDavid E. O'Brien 	c_delbefore(Size);
850c80476e4SDavid E. O'Brien 	Cursor = ActionPos;
851c80476e4SDavid E. O'Brien #if defined(DSPMBYTE)
852c80476e4SDavid E. O'Brien 	if (_enable_mbdisp && extdel) {
853c80476e4SDavid E. O'Brien 	    Cursor--;
854c80476e4SDavid E. O'Brien 	    e_redisp(1);
855c80476e4SDavid E. O'Brien 	}
856c80476e4SDavid E. O'Brien #endif
857c80476e4SDavid E. O'Brien 	RefCursor();
858c80476e4SDavid E. O'Brien     }
859c80476e4SDavid E. O'Brien     else if (Cursor < ActionPos) {
860c80476e4SDavid E. O'Brien 	Size = (int)(ActionPos-Cursor);
861c80476e4SDavid E. O'Brien 	c_delafter(Size);
862c80476e4SDavid E. O'Brien     }
863c80476e4SDavid E. O'Brien     else  {
864c80476e4SDavid E. O'Brien 	Size = 1;
865c80476e4SDavid E. O'Brien 	c_delafter(Size);
866c80476e4SDavid E. O'Brien     }
867c80476e4SDavid E. O'Brien     UndoPtr = Cursor;
868c80476e4SDavid E. O'Brien     UndoSize = Size;
869c80476e4SDavid E. O'Brien }
870c80476e4SDavid E. O'Brien 
871c80476e4SDavid E. O'Brien static Char *
8726767bd61SMark Peek c_endword(p, high, n, delim)
8736767bd61SMark Peek     Char *p, *high, *delim;
8746767bd61SMark Peek     int n;
875c80476e4SDavid E. O'Brien {
8766767bd61SMark Peek     int inquote = 0;
877c80476e4SDavid E. O'Brien     p++;
878c80476e4SDavid E. O'Brien 
879c80476e4SDavid E. O'Brien     while (n--) {
8806767bd61SMark Peek         while (p < high) {	/* Skip non-word chars */
8816767bd61SMark Peek 	  if (!Strchr(delim, *p) || *(p-1) == (Char)'\\')
882c80476e4SDavid E. O'Brien 	    break;
883c80476e4SDavid E. O'Brien 	  p++;
884c80476e4SDavid E. O'Brien         }
885c80476e4SDavid E. O'Brien 	while (p < high) {	/* Skip string */
886c80476e4SDavid E. O'Brien 	  if ((*p == (Char)'\'' || *p == (Char)'"')) { /* Quotation marks? */
8876767bd61SMark Peek 	    if (inquote || *(p-1) != (Char)'\\') { /* Should it be honored? */
888c80476e4SDavid E. O'Brien 	      if (inquote == 0) inquote = *p;
889c80476e4SDavid E. O'Brien 	      else if (inquote == *p) inquote = 0;
890c80476e4SDavid E. O'Brien 	    }
891c80476e4SDavid E. O'Brien 	  }
8926767bd61SMark Peek 	  /* Break if unquoted non-word char */
8936767bd61SMark Peek 	  if (!inquote && Strchr(delim, *p) && *(p-1) != (Char)'\\')
894c80476e4SDavid E. O'Brien 	    break;
895c80476e4SDavid E. O'Brien 	  p++;
896c80476e4SDavid E. O'Brien 	}
897c80476e4SDavid E. O'Brien     }
898c80476e4SDavid E. O'Brien 
899c80476e4SDavid E. O'Brien     p--;
900c80476e4SDavid E. O'Brien     return(p);
901c80476e4SDavid E. O'Brien }
902c80476e4SDavid E. O'Brien 
903c80476e4SDavid E. O'Brien 
904c80476e4SDavid E. O'Brien static Char *
905c80476e4SDavid E. O'Brien c_eword(p, high, n)
9066767bd61SMark Peek     Char *p, *high;
9076767bd61SMark Peek     int n;
908c80476e4SDavid E. O'Brien {
909c80476e4SDavid E. O'Brien     p++;
910c80476e4SDavid E. O'Brien 
911c80476e4SDavid E. O'Brien     while (n--) {
912c80476e4SDavid E. O'Brien 	while ((p < high) && Isspace(*p))
913c80476e4SDavid E. O'Brien 	    p++;
914c80476e4SDavid E. O'Brien 
915c80476e4SDavid E. O'Brien 	if (Isalnum(*p))
916c80476e4SDavid E. O'Brien 	    while ((p < high) && Isalnum(*p))
917c80476e4SDavid E. O'Brien 		p++;
918c80476e4SDavid E. O'Brien 	else
919c80476e4SDavid E. O'Brien 	    while ((p < high) && !(Isspace(*p) || Isalnum(*p)))
920c80476e4SDavid E. O'Brien 		p++;
921c80476e4SDavid E. O'Brien     }
922c80476e4SDavid E. O'Brien 
923c80476e4SDavid E. O'Brien     p--;
924c80476e4SDavid E. O'Brien     return(p);
925c80476e4SDavid E. O'Brien }
926c80476e4SDavid E. O'Brien 
9276767bd61SMark Peek /* Set the max length of the kill ring */
9286767bd61SMark Peek void
9296767bd61SMark Peek SetKillRing(max)
9306767bd61SMark Peek     int max;
9316767bd61SMark Peek {
9326767bd61SMark Peek     CStr *new;
9336767bd61SMark Peek     int count, i, j;
9346767bd61SMark Peek 
9356767bd61SMark Peek     if (max < 1)
9366767bd61SMark Peek 	max = 1;		/* no ring, but always one buffer */
9376767bd61SMark Peek     if (max == KillRingMax)
9386767bd61SMark Peek 	return;
9396767bd61SMark Peek     new = (CStr *)xcalloc((size_t) max, sizeof(CStr));
9406767bd61SMark Peek     if (KillRing != NULL) {
9416767bd61SMark Peek 	if (KillRingLen != 0) {
9426767bd61SMark Peek 	    if (max >= KillRingLen) {
9436767bd61SMark Peek 		count = KillRingLen;
9446767bd61SMark Peek 		j = KillPos;
9456767bd61SMark Peek 	    } else {
9466767bd61SMark Peek 		count = max;
9476767bd61SMark Peek 		j = (KillPos - count + KillRingLen) % KillRingLen;
9486767bd61SMark Peek 	    }
9496767bd61SMark Peek 	    for (i = 0; i < KillRingLen; i++) {
9506767bd61SMark Peek 		if (i < count)	/* copy latest */
9516767bd61SMark Peek 		    new[i] = KillRing[j];
9526767bd61SMark Peek 		else		/* free the others */
9536767bd61SMark Peek 		    xfree(KillRing[j].buf);
9546767bd61SMark Peek 		j = (j + 1) % KillRingLen;
9556767bd61SMark Peek 	    }
9566767bd61SMark Peek 	    KillRingLen = count;
9576767bd61SMark Peek 	    KillPos = count % max;
9586767bd61SMark Peek 	    YankPos = count - 1;
9596767bd61SMark Peek 	}
9606767bd61SMark Peek 	xfree(KillRing);
9616767bd61SMark Peek     }
9626767bd61SMark Peek     KillRing = new;
9636767bd61SMark Peek     KillRingMax = max;
9646767bd61SMark Peek }
9656767bd61SMark Peek 
9666767bd61SMark Peek /* Push string from start upto (but not including) end onto kill ring */
9676767bd61SMark Peek static void
9686767bd61SMark Peek c_push_kill(start, end)
9696767bd61SMark Peek     Char *start, *end;
9706767bd61SMark Peek {
9716767bd61SMark Peek     CStr save, *pos;
9726767bd61SMark Peek     Char *dp, *cp, *kp;
9736767bd61SMark Peek     int len = end - start, i, j, k;
9746767bd61SMark Peek 
9756767bd61SMark Peek     /* Check for duplicates? */
9766767bd61SMark Peek     if (KillRingLen > 0 && (dp = varval(STRkilldup)) != STRNULL) {
9776767bd61SMark Peek 	YankPos = (KillPos - 1 + KillRingLen) % KillRingLen;
9786767bd61SMark Peek 	if (eq(dp, STRerase)) {	/* erase earlier one (actually move up) */
9796767bd61SMark Peek 	    j = YankPos;
9806767bd61SMark Peek 	    for (i = 0; i < KillRingLen; i++) {
9816767bd61SMark Peek 		if (Strncmp(KillRing[j].buf, start, (size_t) len) == 0 &&
9826767bd61SMark Peek 		    KillRing[j].buf[len] == '\0') {
9836767bd61SMark Peek 		    save = KillRing[j];
9846767bd61SMark Peek 		    for ( ; i > 0; i--) {
9856767bd61SMark Peek 			k = j;
9866767bd61SMark Peek 			j = (j + 1) % KillRingLen;
9876767bd61SMark Peek 			KillRing[k] = KillRing[j];
9886767bd61SMark Peek 		    }
9896767bd61SMark Peek 		    KillRing[j] = save;
9906767bd61SMark Peek 		    return;
9916767bd61SMark Peek 		}
9926767bd61SMark Peek 		j = (j - 1 + KillRingLen) % KillRingLen;
9936767bd61SMark Peek 	    }
9946767bd61SMark Peek 	} else if (eq(dp, STRall)) { /* skip if any earlier */
9956767bd61SMark Peek 	    for (i = 0; i < KillRingLen; i++)
9966767bd61SMark Peek 		if (Strncmp(KillRing[i].buf, start, (size_t) len) == 0 &&
9976767bd61SMark Peek 		    KillRing[i].buf[len] == '\0')
9986767bd61SMark Peek 		    return;
9996767bd61SMark Peek 	} else if (eq(dp, STRprev)) { /* skip if immediately previous */
10006767bd61SMark Peek 	    j = YankPos;
10016767bd61SMark Peek 	    if (Strncmp(KillRing[j].buf, start, (size_t) len) == 0 &&
10026767bd61SMark Peek 		KillRing[j].buf[len] == '\0')
10036767bd61SMark Peek 		return;
10046767bd61SMark Peek 	}
10056767bd61SMark Peek     }
10066767bd61SMark Peek 
10076767bd61SMark Peek     /* No duplicate, go ahead and push */
10086767bd61SMark Peek     len++;			/* need space for '\0' */
10096767bd61SMark Peek     YankPos = KillPos;
10106767bd61SMark Peek     if (KillRingLen < KillRingMax)
10116767bd61SMark Peek 	KillRingLen++;
10126767bd61SMark Peek     pos = &KillRing[KillPos];
10136767bd61SMark Peek     KillPos = (KillPos + 1) % KillRingMax;
10146767bd61SMark Peek     if (pos->len < len) {
10156767bd61SMark Peek 	if (pos->buf == NULL)
10166767bd61SMark Peek 	    pos->buf = (Char *) xmalloc(len * sizeof(Char));
10176767bd61SMark Peek 	else
10186767bd61SMark Peek 	    pos->buf = (Char *) xrealloc((ptr_t) pos->buf, len * sizeof(Char));
10196767bd61SMark Peek 	pos->len = len;
10206767bd61SMark Peek     }
10216767bd61SMark Peek     cp = start;
10226767bd61SMark Peek     kp = pos->buf;
10236767bd61SMark Peek     while (cp < end)
10246767bd61SMark Peek 	*kp++ = *cp++;
10256767bd61SMark Peek     *kp = '\0';
10266767bd61SMark Peek }
10276767bd61SMark Peek 
1028c80476e4SDavid E. O'Brien static CCRETVAL
1029c80476e4SDavid E. O'Brien c_get_histline()
1030c80476e4SDavid E. O'Brien {
1031c80476e4SDavid E. O'Brien     struct Hist *hp;
1032c80476e4SDavid E. O'Brien     int     h;
1033c80476e4SDavid E. O'Brien 
1034c80476e4SDavid E. O'Brien     if (Hist_num == 0) {	/* if really the current line */
1035c80476e4SDavid E. O'Brien 	copyn(InputBuf, HistBuf, INBUFSIZE);
1036c80476e4SDavid E. O'Brien 	LastChar = InputBuf + (LastHist - HistBuf);
1037c80476e4SDavid E. O'Brien 
1038c80476e4SDavid E. O'Brien #ifdef KSHVI
1039c80476e4SDavid E. O'Brien     if (VImode)
1040c80476e4SDavid E. O'Brien 	Cursor = InputBuf;
1041c80476e4SDavid E. O'Brien     else
1042c80476e4SDavid E. O'Brien #endif /* KSHVI */
1043c80476e4SDavid E. O'Brien 	Cursor = LastChar;
1044c80476e4SDavid E. O'Brien 
1045c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
1046c80476e4SDavid E. O'Brien     }
1047c80476e4SDavid E. O'Brien 
1048c80476e4SDavid E. O'Brien     hp = Histlist.Hnext;
1049c80476e4SDavid E. O'Brien     if (hp == NULL)
1050c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1051c80476e4SDavid E. O'Brien 
1052c80476e4SDavid E. O'Brien     for (h = 1; h < Hist_num; h++) {
1053c80476e4SDavid E. O'Brien 	if ((hp->Hnext) == NULL) {
1054c80476e4SDavid E. O'Brien 	    Hist_num = h;
1055c80476e4SDavid E. O'Brien 	    return(CC_ERROR);
1056c80476e4SDavid E. O'Brien 	}
1057c80476e4SDavid E. O'Brien 	hp = hp->Hnext;
1058c80476e4SDavid E. O'Brien     }
1059c80476e4SDavid E. O'Brien 
1060c80476e4SDavid E. O'Brien     if (HistLit && hp->histline) {
1061c80476e4SDavid E. O'Brien 	copyn(InputBuf, hp->histline, INBUFSIZE);
1062c80476e4SDavid E. O'Brien 	CurrentHistLit = 1;
1063c80476e4SDavid E. O'Brien     }
1064c80476e4SDavid E. O'Brien     else {
1065b2be84b1SDavid E. O'Brien 	(void) sprlex(InputBuf, sizeof(InputBuf) / sizeof(Char), &hp->Hlex);
1066c80476e4SDavid E. O'Brien 	CurrentHistLit = 0;
1067c80476e4SDavid E. O'Brien     }
1068c80476e4SDavid E. O'Brien     LastChar = InputBuf + Strlen(InputBuf);
1069c80476e4SDavid E. O'Brien 
1070c80476e4SDavid E. O'Brien     if (LastChar > InputBuf) {
1071c80476e4SDavid E. O'Brien 	if (LastChar[-1] == '\n')
1072c80476e4SDavid E. O'Brien 	    LastChar--;
1073c80476e4SDavid E. O'Brien #if 0
1074c80476e4SDavid E. O'Brien 	if (LastChar[-1] == ' ')
1075c80476e4SDavid E. O'Brien 	    LastChar--;
1076c80476e4SDavid E. O'Brien #endif
1077c80476e4SDavid E. O'Brien 	if (LastChar < InputBuf)
1078c80476e4SDavid E. O'Brien 	    LastChar = InputBuf;
1079c80476e4SDavid E. O'Brien     }
1080c80476e4SDavid E. O'Brien 
1081c80476e4SDavid E. O'Brien #ifdef KSHVI
1082c80476e4SDavid E. O'Brien     if (VImode)
1083c80476e4SDavid E. O'Brien 	Cursor = InputBuf;
1084c80476e4SDavid E. O'Brien     else
1085c80476e4SDavid E. O'Brien #endif /* KSHVI */
1086c80476e4SDavid E. O'Brien 	Cursor = LastChar;
1087c80476e4SDavid E. O'Brien 
1088c80476e4SDavid E. O'Brien     return(CC_REFRESH);
1089c80476e4SDavid E. O'Brien }
1090c80476e4SDavid E. O'Brien 
1091c80476e4SDavid E. O'Brien static CCRETVAL
1092c80476e4SDavid E. O'Brien c_search_line(pattern, dir)
1093c80476e4SDavid E. O'Brien Char *pattern;
1094c80476e4SDavid E. O'Brien int dir;
1095c80476e4SDavid E. O'Brien {
1096c80476e4SDavid E. O'Brien     Char *cp;
1097c80476e4SDavid E. O'Brien     int len;
1098c80476e4SDavid E. O'Brien 
1099c80476e4SDavid E. O'Brien     len = (int) Strlen(pattern);
1100c80476e4SDavid E. O'Brien 
1101c80476e4SDavid E. O'Brien     if (dir == F_UP_SEARCH_HIST) {
1102c80476e4SDavid E. O'Brien 	for (cp = Cursor; cp >= InputBuf; cp--)
1103c80476e4SDavid E. O'Brien 	    if (Strncmp(cp, pattern, (size_t) len) == 0 ||
1104c80476e4SDavid E. O'Brien 		Gmatch(cp, pattern)) {
1105c80476e4SDavid E. O'Brien 		Cursor = cp;
1106c80476e4SDavid E. O'Brien 		return(CC_NORM);
1107c80476e4SDavid E. O'Brien 	    }
1108c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1109c80476e4SDavid E. O'Brien     } else {
1110c80476e4SDavid E. O'Brien 	for (cp = Cursor; *cp != '\0' && cp < InputLim; cp++)
1111c80476e4SDavid E. O'Brien 	    if (Strncmp(cp, pattern, (size_t) len) == 0 ||
1112c80476e4SDavid E. O'Brien 		Gmatch(cp, pattern)) {
1113c80476e4SDavid E. O'Brien 		Cursor = cp;
1114c80476e4SDavid E. O'Brien 		return(CC_NORM);
1115c80476e4SDavid E. O'Brien 	    }
1116c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1117c80476e4SDavid E. O'Brien     }
1118c80476e4SDavid E. O'Brien }
1119c80476e4SDavid E. O'Brien 
1120c80476e4SDavid E. O'Brien static CCRETVAL
1121c80476e4SDavid E. O'Brien e_inc_search(dir)
1122c80476e4SDavid E. O'Brien     int dir;
1123c80476e4SDavid E. O'Brien {
1124c80476e4SDavid E. O'Brien     static Char STRfwd[] = { 'f', 'w', 'd', '\0' },
1125c80476e4SDavid E. O'Brien 		STRbck[] = { 'b', 'c', 'k', '\0' };
1126c80476e4SDavid E. O'Brien     static Char pchar = ':';	/* ':' = normal, '?' = failed */
1127c80476e4SDavid E. O'Brien     static Char endcmd[2];
1128c80476e4SDavid E. O'Brien     Char ch, *cp,
1129c80476e4SDavid E. O'Brien 	*oldCursor = Cursor,
1130c80476e4SDavid E. O'Brien 	oldpchar = pchar;
1131c80476e4SDavid E. O'Brien     CCRETVAL ret = CC_NORM;
1132c80476e4SDavid E. O'Brien     int oldHist_num = Hist_num,
1133c80476e4SDavid E. O'Brien 	oldpatlen = patlen,
1134c80476e4SDavid E. O'Brien 	newdir = dir,
1135c80476e4SDavid E. O'Brien         done, redo;
1136c80476e4SDavid E. O'Brien 
1137c80476e4SDavid E. O'Brien     if (LastChar + sizeof(STRfwd)/sizeof(Char) + 2 + patlen >= InputLim)
1138c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1139c80476e4SDavid E. O'Brien 
1140c80476e4SDavid E. O'Brien     for (;;) {
1141c80476e4SDavid E. O'Brien 
1142c80476e4SDavid E. O'Brien 	if (patlen == 0) {	/* first round */
1143c80476e4SDavid E. O'Brien 	    pchar = ':';
1144c80476e4SDavid E. O'Brien 	    patbuf[patlen++] = '*';
1145c80476e4SDavid E. O'Brien 	}
1146c80476e4SDavid E. O'Brien 	done = redo = 0;
1147c80476e4SDavid E. O'Brien 	*LastChar++ = '\n';
1148c80476e4SDavid E. O'Brien 	for (cp = newdir == F_UP_SEARCH_HIST ? STRbck : STRfwd;
1149c80476e4SDavid E. O'Brien 	     *cp; *LastChar++ = *cp++)
1150c80476e4SDavid E. O'Brien 	    continue;
1151c80476e4SDavid E. O'Brien 	*LastChar++ = pchar;
1152c80476e4SDavid E. O'Brien 	for (cp = &patbuf[1]; cp < &patbuf[patlen]; *LastChar++ = *cp++)
1153c80476e4SDavid E. O'Brien 	    continue;
1154c80476e4SDavid E. O'Brien 	*LastChar = '\0';
1155c80476e4SDavid E. O'Brien 	Refresh();
1156c80476e4SDavid E. O'Brien 
1157c80476e4SDavid E. O'Brien 	if (GetNextChar(&ch) != 1)
1158c80476e4SDavid E. O'Brien 	    return(e_send_eof(0));
1159c80476e4SDavid E. O'Brien 
1160c80476e4SDavid E. O'Brien 	switch (CurrentKeyMap[(unsigned char) ch]) {
1161c80476e4SDavid E. O'Brien 	case F_INSERT:
1162c80476e4SDavid E. O'Brien 	case F_DIGIT:
1163c80476e4SDavid E. O'Brien 	case F_MAGIC_SPACE:
1164c80476e4SDavid E. O'Brien 	    if (patlen > INBUFSIZE - 3)
1165c80476e4SDavid E. O'Brien 		SoundBeep();
1166c80476e4SDavid E. O'Brien 	    else {
1167c80476e4SDavid E. O'Brien 		patbuf[patlen++] = ch;
1168c80476e4SDavid E. O'Brien 		*LastChar++ = ch;
1169c80476e4SDavid E. O'Brien 		*LastChar = '\0';
1170c80476e4SDavid E. O'Brien 		Refresh();
1171c80476e4SDavid E. O'Brien 	    }
1172c80476e4SDavid E. O'Brien 	    break;
1173c80476e4SDavid E. O'Brien 
1174c80476e4SDavid E. O'Brien 	case F_INC_FWD:
1175c80476e4SDavid E. O'Brien 	    newdir = F_DOWN_SEARCH_HIST;
1176c80476e4SDavid E. O'Brien 	    redo++;
1177c80476e4SDavid E. O'Brien 	    break;
1178c80476e4SDavid E. O'Brien 
1179c80476e4SDavid E. O'Brien 	case F_INC_BACK:
1180c80476e4SDavid E. O'Brien 	    newdir = F_UP_SEARCH_HIST;
1181c80476e4SDavid E. O'Brien 	    redo++;
1182c80476e4SDavid E. O'Brien 	    break;
1183c80476e4SDavid E. O'Brien 
1184c80476e4SDavid E. O'Brien 	case F_DELPREV:
1185c80476e4SDavid E. O'Brien 	    if (patlen > 1)
1186c80476e4SDavid E. O'Brien 		done++;
1187c80476e4SDavid E. O'Brien 	    else
1188c80476e4SDavid E. O'Brien 		SoundBeep();
1189c80476e4SDavid E. O'Brien 	    break;
1190c80476e4SDavid E. O'Brien 
1191c80476e4SDavid E. O'Brien 	default:
1192c80476e4SDavid E. O'Brien 	    switch (ch) {
1193c80476e4SDavid E. O'Brien 	    case 0007:		/* ^G: Abort */
1194c80476e4SDavid E. O'Brien 		ret = CC_ERROR;
1195c80476e4SDavid E. O'Brien 		done++;
1196c80476e4SDavid E. O'Brien 		break;
1197c80476e4SDavid E. O'Brien 
1198c80476e4SDavid E. O'Brien 	    case 0027:		/* ^W: Append word */
1199c80476e4SDavid E. O'Brien 		/* No can do if globbing characters in pattern */
1200c80476e4SDavid E. O'Brien 		for (cp = &patbuf[1]; ; cp++)
1201c80476e4SDavid E. O'Brien 		    if (cp >= &patbuf[patlen]) {
1202c80476e4SDavid E. O'Brien 			Cursor += patlen - 1;
1203c80476e4SDavid E. O'Brien 			cp = c_next_word(Cursor, LastChar, 1);
1204c80476e4SDavid E. O'Brien 			while (Cursor < cp && *Cursor != '\n') {
1205c80476e4SDavid E. O'Brien 			    if (patlen > INBUFSIZE - 3) {
1206c80476e4SDavid E. O'Brien 				SoundBeep();
1207c80476e4SDavid E. O'Brien 				break;
1208c80476e4SDavid E. O'Brien 			    }
1209c80476e4SDavid E. O'Brien 			    patbuf[patlen++] = *Cursor;
1210c80476e4SDavid E. O'Brien 			    *LastChar++ = *Cursor++;
1211c80476e4SDavid E. O'Brien 			}
1212c80476e4SDavid E. O'Brien 			Cursor = oldCursor;
1213c80476e4SDavid E. O'Brien 			*LastChar = '\0';
1214c80476e4SDavid E. O'Brien 			Refresh();
1215c80476e4SDavid E. O'Brien 			break;
1216c80476e4SDavid E. O'Brien 		    } else if (isglob(*cp)) {
1217c80476e4SDavid E. O'Brien 			SoundBeep();
1218c80476e4SDavid E. O'Brien 			break;
1219c80476e4SDavid E. O'Brien 		    }
1220c80476e4SDavid E. O'Brien 		break;
1221c80476e4SDavid E. O'Brien 
1222c80476e4SDavid E. O'Brien 	    default:		/* Terminate and execute cmd */
1223c80476e4SDavid E. O'Brien 		endcmd[0] = ch;
1224c80476e4SDavid E. O'Brien 		PushMacro(endcmd);
1225c80476e4SDavid E. O'Brien 		/*FALLTHROUGH*/
1226c80476e4SDavid E. O'Brien 
1227c80476e4SDavid E. O'Brien 	    case 0033:		/* ESC: Terminate */
1228c80476e4SDavid E. O'Brien 		ret = CC_REFRESH;
1229c80476e4SDavid E. O'Brien 		done++;
1230c80476e4SDavid E. O'Brien 		break;
1231c80476e4SDavid E. O'Brien 	    }
1232c80476e4SDavid E. O'Brien 	    break;
1233c80476e4SDavid E. O'Brien 	}
1234c80476e4SDavid E. O'Brien 
1235c80476e4SDavid E. O'Brien 	while (LastChar > InputBuf && *LastChar != '\n')
1236c80476e4SDavid E. O'Brien 	    *LastChar-- = '\0';
1237c80476e4SDavid E. O'Brien 	*LastChar = '\0';
1238c80476e4SDavid E. O'Brien 
1239c80476e4SDavid E. O'Brien 	if (!done) {
1240c80476e4SDavid E. O'Brien 
1241c80476e4SDavid E. O'Brien 	    /* Can't search if unmatched '[' */
1242c80476e4SDavid E. O'Brien 	    for (cp = &patbuf[patlen - 1], ch = ']'; cp > patbuf; cp--)
1243c80476e4SDavid E. O'Brien 		if (*cp == '[' || *cp == ']') {
1244c80476e4SDavid E. O'Brien 		    ch = *cp;
1245c80476e4SDavid E. O'Brien 		    break;
1246c80476e4SDavid E. O'Brien 		}
1247c80476e4SDavid E. O'Brien 
1248c80476e4SDavid E. O'Brien 	    if (patlen > 1 && ch != '[') {
1249c80476e4SDavid E. O'Brien 		if (redo && newdir == dir) {
1250c80476e4SDavid E. O'Brien 		    if (pchar == '?') {	/* wrap around */
1251c80476e4SDavid E. O'Brien 			Hist_num = newdir == F_UP_SEARCH_HIST ? 0 : 0x7fffffff;
1252c80476e4SDavid E. O'Brien 			if (c_get_histline() == CC_ERROR)
1253c80476e4SDavid E. O'Brien 			    /* Hist_num was fixed by first call */
1254c80476e4SDavid E. O'Brien 			    (void) c_get_histline();
1255c80476e4SDavid E. O'Brien 			Cursor = newdir == F_UP_SEARCH_HIST ?
1256c80476e4SDavid E. O'Brien 			    LastChar : InputBuf;
1257c80476e4SDavid E. O'Brien 		    } else
1258c80476e4SDavid E. O'Brien 			Cursor += newdir == F_UP_SEARCH_HIST ? -1 : 1;
1259c80476e4SDavid E. O'Brien 		}
1260c80476e4SDavid E. O'Brien 		patbuf[patlen++] = '*';
1261c80476e4SDavid E. O'Brien 		patbuf[patlen] = '\0';
1262c80476e4SDavid E. O'Brien 		if (Cursor < InputBuf || Cursor > LastChar ||
1263c80476e4SDavid E. O'Brien 		    (ret = c_search_line(&patbuf[1], newdir)) == CC_ERROR) {
1264c80476e4SDavid E. O'Brien 		    LastCmd = (KEYCMD) newdir; /* avoid c_hsetpat */
1265c80476e4SDavid E. O'Brien 		    ret = newdir == F_UP_SEARCH_HIST ?
1266c80476e4SDavid E. O'Brien 			e_up_search_hist(0) : e_down_search_hist(0);
1267c80476e4SDavid E. O'Brien 		    if (ret != CC_ERROR) {
1268c80476e4SDavid E. O'Brien 			Cursor = newdir == F_UP_SEARCH_HIST ?
1269c80476e4SDavid E. O'Brien 			    LastChar : InputBuf;
1270c80476e4SDavid E. O'Brien 			(void) c_search_line(&patbuf[1], newdir);
1271c80476e4SDavid E. O'Brien 		    }
1272c80476e4SDavid E. O'Brien 		}
1273c80476e4SDavid E. O'Brien 		patbuf[--patlen] = '\0';
1274c80476e4SDavid E. O'Brien 		if (ret == CC_ERROR) {
1275c80476e4SDavid E. O'Brien 		    SoundBeep();
1276c80476e4SDavid E. O'Brien 		    if (Hist_num != oldHist_num) {
1277c80476e4SDavid E. O'Brien 			Hist_num = oldHist_num;
1278c80476e4SDavid E. O'Brien 			if (c_get_histline() == CC_ERROR)
1279c80476e4SDavid E. O'Brien 			    return(CC_ERROR);
1280c80476e4SDavid E. O'Brien 		    }
1281c80476e4SDavid E. O'Brien 		    Cursor = oldCursor;
1282c80476e4SDavid E. O'Brien 		    pchar = '?';
1283c80476e4SDavid E. O'Brien 		} else {
1284c80476e4SDavid E. O'Brien 		    pchar = ':';
1285c80476e4SDavid E. O'Brien 		}
1286c80476e4SDavid E. O'Brien 	    }
1287c80476e4SDavid E. O'Brien 
1288c80476e4SDavid E. O'Brien 	    ret = e_inc_search(newdir);
1289c80476e4SDavid E. O'Brien 
1290c80476e4SDavid E. O'Brien 	    if (ret == CC_ERROR && pchar == '?' && oldpchar == ':') {
1291c80476e4SDavid E. O'Brien 		/* break abort of failed search at last non-failed */
1292c80476e4SDavid E. O'Brien 		ret = CC_NORM;
1293c80476e4SDavid E. O'Brien 	    }
1294c80476e4SDavid E. O'Brien 
1295c80476e4SDavid E. O'Brien 	}
1296c80476e4SDavid E. O'Brien 
1297c80476e4SDavid E. O'Brien 	if (ret == CC_NORM || (ret == CC_ERROR && oldpatlen == 0)) {
1298c80476e4SDavid E. O'Brien 	    /* restore on normal return or error exit */
1299c80476e4SDavid E. O'Brien 	    pchar = oldpchar;
1300c80476e4SDavid E. O'Brien 	    patlen = oldpatlen;
1301c80476e4SDavid E. O'Brien 	    if (Hist_num != oldHist_num) {
1302c80476e4SDavid E. O'Brien 		Hist_num = oldHist_num;
1303c80476e4SDavid E. O'Brien 		if (c_get_histline() == CC_ERROR)
1304c80476e4SDavid E. O'Brien 		    return(CC_ERROR);
1305c80476e4SDavid E. O'Brien 	    }
1306c80476e4SDavid E. O'Brien 	    Cursor = oldCursor;
1307c80476e4SDavid E. O'Brien 	    if (ret == CC_ERROR)
1308c80476e4SDavid E. O'Brien 		Refresh();
1309c80476e4SDavid E. O'Brien 	}
1310c80476e4SDavid E. O'Brien 	if (done || ret != CC_NORM)
1311c80476e4SDavid E. O'Brien 	    return(ret);
1312c80476e4SDavid E. O'Brien 
1313c80476e4SDavid E. O'Brien     }
1314c80476e4SDavid E. O'Brien 
1315c80476e4SDavid E. O'Brien }
1316c80476e4SDavid E. O'Brien 
1317c80476e4SDavid E. O'Brien static CCRETVAL
1318c80476e4SDavid E. O'Brien v_search(dir)
1319c80476e4SDavid E. O'Brien     int dir;
1320c80476e4SDavid E. O'Brien {
1321c80476e4SDavid E. O'Brien     Char ch;
1322c80476e4SDavid E. O'Brien     Char tmpbuf[INBUFSIZE];
1323c80476e4SDavid E. O'Brien     Char oldbuf[INBUFSIZE];
1324c80476e4SDavid E. O'Brien     Char *oldlc, *oldc;
1325c80476e4SDavid E. O'Brien     int tmplen;
1326c80476e4SDavid E. O'Brien 
1327c80476e4SDavid E. O'Brien     copyn(oldbuf, InputBuf, INBUFSIZE);
1328c80476e4SDavid E. O'Brien     oldlc = LastChar;
1329c80476e4SDavid E. O'Brien     oldc = Cursor;
1330c80476e4SDavid E. O'Brien     tmplen = 0;
1331c80476e4SDavid E. O'Brien     tmpbuf[tmplen++] = '*';
1332c80476e4SDavid E. O'Brien 
1333c80476e4SDavid E. O'Brien     InputBuf[0] = '\0';
1334c80476e4SDavid E. O'Brien     LastChar = InputBuf;
1335c80476e4SDavid E. O'Brien     Cursor = InputBuf;
1336c80476e4SDavid E. O'Brien     searchdir = dir;
1337c80476e4SDavid E. O'Brien 
1338c80476e4SDavid E. O'Brien     c_insert(2);	/* prompt + '\n' */
1339c80476e4SDavid E. O'Brien     *Cursor++ = '\n';
1340c80476e4SDavid E. O'Brien     *Cursor++ = dir == F_UP_SEARCH_HIST ? '?' : '/';
1341c80476e4SDavid E. O'Brien     Refresh();
1342c80476e4SDavid E. O'Brien     for (ch = 0;ch == 0;) {
1343c80476e4SDavid E. O'Brien 	if (GetNextChar(&ch) != 1)
1344c80476e4SDavid E. O'Brien 	    return(e_send_eof(0));
1345c80476e4SDavid E. O'Brien 	switch (ASC(ch)) {
1346c80476e4SDavid E. O'Brien 	case 0010:	/* Delete and backspace */
1347c80476e4SDavid E. O'Brien 	case 0177:
1348c80476e4SDavid E. O'Brien 	    if (tmplen > 1) {
1349c80476e4SDavid E. O'Brien 		*Cursor-- = '\0';
1350c80476e4SDavid E. O'Brien 		LastChar = Cursor;
1351c80476e4SDavid E. O'Brien 		tmpbuf[tmplen--] = '\0';
1352c80476e4SDavid E. O'Brien 	    }
1353c80476e4SDavid E. O'Brien 	    else {
1354c80476e4SDavid E. O'Brien 		copyn(InputBuf, oldbuf, INBUFSIZE);
1355c80476e4SDavid E. O'Brien 		LastChar = oldlc;
1356c80476e4SDavid E. O'Brien 		Cursor = oldc;
1357c80476e4SDavid E. O'Brien 		return(CC_REFRESH);
1358c80476e4SDavid E. O'Brien 	    }
1359c80476e4SDavid E. O'Brien 	    Refresh();
1360c80476e4SDavid E. O'Brien 	    ch = 0;
1361c80476e4SDavid E. O'Brien 	    break;
1362c80476e4SDavid E. O'Brien 
1363c80476e4SDavid E. O'Brien 	case 0033:	/* ESC */
13643b6eaa7bSAndrey A. Chernov #ifdef IS_ASCII
1365c80476e4SDavid E. O'Brien 	case '\r':	/* Newline */
1366c80476e4SDavid E. O'Brien 	case '\n':
1367c80476e4SDavid E. O'Brien #else
13683b6eaa7bSAndrey A. Chernov 	case '\012':    /* ASCII Line feed */
13693b6eaa7bSAndrey A. Chernov 	case '\015':    /* ASCII (or EBCDIC) Return */
1370c80476e4SDavid E. O'Brien #endif
1371c80476e4SDavid E. O'Brien 	    break;
1372c80476e4SDavid E. O'Brien 
1373c80476e4SDavid E. O'Brien 	default:
1374c80476e4SDavid E. O'Brien 	    if (tmplen >= INBUFSIZE)
1375c80476e4SDavid E. O'Brien 		SoundBeep();
1376c80476e4SDavid E. O'Brien 	    else {
1377c80476e4SDavid E. O'Brien 		tmpbuf[tmplen++] = ch;
1378c80476e4SDavid E. O'Brien 		*Cursor++ = ch;
1379c80476e4SDavid E. O'Brien 		LastChar = Cursor;
1380c80476e4SDavid E. O'Brien 	    }
1381c80476e4SDavid E. O'Brien 	    Refresh();
1382c80476e4SDavid E. O'Brien 	    ch = 0;
1383c80476e4SDavid E. O'Brien 	    break;
1384c80476e4SDavid E. O'Brien 	}
1385c80476e4SDavid E. O'Brien     }
1386c80476e4SDavid E. O'Brien 
1387c80476e4SDavid E. O'Brien     if (tmplen == 1) {
1388c80476e4SDavid E. O'Brien 	/*
1389c80476e4SDavid E. O'Brien 	 * Use the old pattern, but wild-card it.
1390c80476e4SDavid E. O'Brien 	 */
1391c80476e4SDavid E. O'Brien 	if (patlen == 0) {
1392c80476e4SDavid E. O'Brien 	    InputBuf[0] = '\0';
1393c80476e4SDavid E. O'Brien 	    LastChar = InputBuf;
1394c80476e4SDavid E. O'Brien 	    Cursor = InputBuf;
1395c80476e4SDavid E. O'Brien 	    Refresh();
1396c80476e4SDavid E. O'Brien 	    return(CC_ERROR);
1397c80476e4SDavid E. O'Brien 	}
1398c80476e4SDavid E. O'Brien 	if (patbuf[0] != '*') {
1399c80476e4SDavid E. O'Brien 	    (void) Strcpy(tmpbuf, patbuf);
1400c80476e4SDavid E. O'Brien 	    patbuf[0] = '*';
1401c80476e4SDavid E. O'Brien 	    (void) Strcpy(&patbuf[1], tmpbuf);
1402c80476e4SDavid E. O'Brien 	    patlen++;
1403c80476e4SDavid E. O'Brien 	    patbuf[patlen++] = '*';
1404c80476e4SDavid E. O'Brien 	    patbuf[patlen] = '\0';
1405c80476e4SDavid E. O'Brien 	}
1406c80476e4SDavid E. O'Brien     }
1407c80476e4SDavid E. O'Brien     else {
1408c80476e4SDavid E. O'Brien 	tmpbuf[tmplen++] = '*';
1409c80476e4SDavid E. O'Brien 	tmpbuf[tmplen] = '\0';
1410c80476e4SDavid E. O'Brien 	(void) Strcpy(patbuf, tmpbuf);
1411c80476e4SDavid E. O'Brien 	patlen = tmplen;
1412c80476e4SDavid E. O'Brien     }
1413c80476e4SDavid E. O'Brien     LastCmd = (KEYCMD) dir; /* avoid c_hsetpat */
1414c80476e4SDavid E. O'Brien     Cursor = LastChar = InputBuf;
1415c80476e4SDavid E. O'Brien     if ((dir == F_UP_SEARCH_HIST ? e_up_search_hist(0) :
1416c80476e4SDavid E. O'Brien 				   e_down_search_hist(0)) == CC_ERROR) {
1417c80476e4SDavid E. O'Brien 	Refresh();
1418c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1419c80476e4SDavid E. O'Brien     }
1420c80476e4SDavid E. O'Brien     else {
1421c80476e4SDavid E. O'Brien 	if (ch == 0033) {
1422c80476e4SDavid E. O'Brien 	    Refresh();
1423c80476e4SDavid E. O'Brien 	    *LastChar++ = '\n';
1424c80476e4SDavid E. O'Brien 	    *LastChar = '\0';
1425c80476e4SDavid E. O'Brien 	    PastBottom();
1426c80476e4SDavid E. O'Brien 	    return(CC_NEWLINE);
1427c80476e4SDavid E. O'Brien 	}
1428c80476e4SDavid E. O'Brien 	else
1429c80476e4SDavid E. O'Brien 	    return(CC_REFRESH);
1430c80476e4SDavid E. O'Brien     }
1431c80476e4SDavid E. O'Brien }
1432c80476e4SDavid E. O'Brien 
1433c80476e4SDavid E. O'Brien /*
1434c80476e4SDavid E. O'Brien  * semi-PUBLIC routines.  Any routine that is of type CCRETVAL is an
1435c80476e4SDavid E. O'Brien  * entry point, called from the CcKeyMap indirected into the
1436c80476e4SDavid E. O'Brien  * CcFuncTbl array.
1437c80476e4SDavid E. O'Brien  */
1438c80476e4SDavid E. O'Brien 
1439c80476e4SDavid E. O'Brien /*ARGSUSED*/
1440c80476e4SDavid E. O'Brien CCRETVAL
1441c80476e4SDavid E. O'Brien v_cmd_mode(c)
1442c80476e4SDavid E. O'Brien     int c;
1443c80476e4SDavid E. O'Brien {
1444c80476e4SDavid E. O'Brien     USE(c);
1445c80476e4SDavid E. O'Brien     InsertPos = 0;
1446c80476e4SDavid E. O'Brien     ActionFlag = TCSHOP_NOP;	/* [Esc] cancels pending action */
1447c80476e4SDavid E. O'Brien     ActionPos = 0;
1448c80476e4SDavid E. O'Brien     DoingArg = 0;
1449c80476e4SDavid E. O'Brien     if (UndoPtr > Cursor)
1450c80476e4SDavid E. O'Brien 	UndoSize = (int)(UndoPtr - Cursor);
1451c80476e4SDavid E. O'Brien     else
1452c80476e4SDavid E. O'Brien 	UndoSize = (int)(Cursor - UndoPtr);
1453c80476e4SDavid E. O'Brien 
1454c80476e4SDavid E. O'Brien     inputmode = MODE_INSERT;
1455c80476e4SDavid E. O'Brien     c_alternativ_key_map(1);
1456c80476e4SDavid E. O'Brien #ifdef notdef
1457c80476e4SDavid E. O'Brien     /*
1458c80476e4SDavid E. O'Brien      * We don't want to move the cursor, because all the editing
1459c80476e4SDavid E. O'Brien      * commands don't include the character under the cursor.
1460c80476e4SDavid E. O'Brien      */
1461c80476e4SDavid E. O'Brien     if (Cursor > InputBuf)
1462c80476e4SDavid E. O'Brien 	Cursor--;
1463c80476e4SDavid E. O'Brien #endif
1464c80476e4SDavid E. O'Brien     RefCursor();
1465c80476e4SDavid E. O'Brien     return(CC_NORM);
1466c80476e4SDavid E. O'Brien }
1467c80476e4SDavid E. O'Brien 
1468c80476e4SDavid E. O'Brien /*ARGSUSED*/
1469c80476e4SDavid E. O'Brien CCRETVAL
1470c80476e4SDavid E. O'Brien e_unassigned(c)
1471c80476e4SDavid E. O'Brien     int c;
1472c80476e4SDavid E. O'Brien {				/* bound to keys that arn't really assigned */
1473c80476e4SDavid E. O'Brien     USE(c);
1474c80476e4SDavid E. O'Brien     SoundBeep();
1475c80476e4SDavid E. O'Brien     flush();
1476c80476e4SDavid E. O'Brien     return(CC_NORM);
1477c80476e4SDavid E. O'Brien }
1478c80476e4SDavid E. O'Brien 
1479c80476e4SDavid E. O'Brien CCRETVAL
1480c80476e4SDavid E. O'Brien e_insert(c)
14816767bd61SMark Peek     int c;
1482c80476e4SDavid E. O'Brien {
14836767bd61SMark Peek     int i;
1484c80476e4SDavid E. O'Brien #if defined(DSPMBYTE)
1485c80476e4SDavid E. O'Brien     CCRETVAL ret;
1486c80476e4SDavid E. O'Brien     static Char savec;
1487c80476e4SDavid E. O'Brien     static int exterr = 0;
1488c80476e4SDavid E. O'Brien #endif
1489c80476e4SDavid E. O'Brien #ifndef SHORT_STRINGS
1490c80476e4SDavid E. O'Brien     c &= ASCII;			/* no meta chars ever */
1491c80476e4SDavid E. O'Brien #endif
1492c80476e4SDavid E. O'Brien #if defined(DSPMBYTE)
1493c80476e4SDavid E. O'Brien     ret = (CCRETVAL) CC_NORM;
1494c80476e4SDavid E. O'Brien #endif
1495c80476e4SDavid E. O'Brien 
1496c80476e4SDavid E. O'Brien     if (!c)
1497c80476e4SDavid E. O'Brien 	return(CC_ERROR);	/* no NULs in the input ever!! */
1498c80476e4SDavid E. O'Brien 
1499c80476e4SDavid E. O'Brien     if (LastChar + Argument >= InputLim)
1500c80476e4SDavid E. O'Brien 	return(CC_ERROR);	/* end of buffer space */
1501c80476e4SDavid E. O'Brien 
1502c80476e4SDavid E. O'Brien     if (Argument == 1) {  	/* How was this optimized ???? */
1503c80476e4SDavid E. O'Brien 
1504c80476e4SDavid E. O'Brien #if defined(DSPMBYTE)
1505c80476e4SDavid E. O'Brien 	if(_enable_mbdisp && extins && exterr && Ismbyte2(c)) {
1506c80476e4SDavid E. O'Brien 	    extins = 0;
1507c80476e4SDavid E. O'Brien 	    exterr = 0;
1508c80476e4SDavid E. O'Brien 	    return(CC_ERROR);
1509c80476e4SDavid E. O'Brien 	}
1510c80476e4SDavid E. O'Brien #endif
1511c80476e4SDavid E. O'Brien 	if (inputmode != MODE_INSERT) {
1512c80476e4SDavid E. O'Brien 	    UndoBuf[UndoSize++] = *Cursor;
1513c80476e4SDavid E. O'Brien 	    UndoBuf[UndoSize] = '\0';
1514c80476e4SDavid E. O'Brien 	    c_delafter(1);   /* Do NOT use the saving ONE */
1515c80476e4SDavid E. O'Brien     	}
1516c80476e4SDavid E. O'Brien 
1517c80476e4SDavid E. O'Brien         c_insert(1);
1518c80476e4SDavid E. O'Brien 
1519c80476e4SDavid E. O'Brien #if defined(DSPMBYTE)
1520c80476e4SDavid E. O'Brien 	/* 1st. byte is store to special buffer, and replace space */
1521c80476e4SDavid E. O'Brien 	if(_enable_mbdisp && extins == 0 && Ismbyte1(c)) {
1522c80476e4SDavid E. O'Brien 	    extins++;
1523c80476e4SDavid E. O'Brien 	    savec = (Char) c;
1524c80476e4SDavid E. O'Brien 	    *Cursor++ = (Char) ' ';
1525c80476e4SDavid E. O'Brien 	}
1526c80476e4SDavid E. O'Brien 	else if (_enable_mbdisp && extins && Ismbyte2(c)) {
1527c80476e4SDavid E. O'Brien 	    *(Cursor-1) = savec;
1528c80476e4SDavid E. O'Brien 	    *Cursor++ = (Char) c;
1529c80476e4SDavid E. O'Brien 	    extins = 0;
1530c80476e4SDavid E. O'Brien 	    e_redisp(1);
1531c80476e4SDavid E. O'Brien 	    Refresh();
1532c80476e4SDavid E. O'Brien 	    ret = CC_REFRESH;
1533c80476e4SDavid E. O'Brien 	}
1534c80476e4SDavid E. O'Brien 	else
1535c80476e4SDavid E. O'Brien 	    *Cursor++ = (Char) c;
1536c80476e4SDavid E. O'Brien 	DoingArg = 0;		/* just in case */
1537c80476e4SDavid E. O'Brien 	if (ret != CC_REFRESH)
1538c80476e4SDavid E. O'Brien 	    RefPlusOne();	/* fast refresh for one char. */
1539c80476e4SDavid E. O'Brien #else
1540c80476e4SDavid E. O'Brien 	*Cursor++ = (Char) c;
1541c80476e4SDavid E. O'Brien 	DoingArg = 0;		/* just in case */
1542c80476e4SDavid E. O'Brien 	RefPlusOne();		/* fast refresh for one char. */
1543c80476e4SDavid E. O'Brien #endif
1544c80476e4SDavid E. O'Brien     }
1545c80476e4SDavid E. O'Brien     else {
1546c80476e4SDavid E. O'Brien #if defined(DSPMBYTE)
1547c80476e4SDavid E. O'Brien 	/* Cannot use ESC-(number) for multi-byte */
1548c80476e4SDavid E. O'Brien 	if (_enable_mbdisp && extins == 0 && Ismbyte1(c)) {
1549c80476e4SDavid E. O'Brien 	    extins++;
1550c80476e4SDavid E. O'Brien 	    exterr++;
1551c80476e4SDavid E. O'Brien 	    return(CC_ERROR);
1552c80476e4SDavid E. O'Brien 	}
1553c80476e4SDavid E. O'Brien 	else if (_enable_mbdisp && extins && exterr && Ismbyte2(c))
1554c80476e4SDavid E. O'Brien 	{
1555c80476e4SDavid E. O'Brien 	    extins = 0;
1556c80476e4SDavid E. O'Brien 	    exterr = 0;
1557c80476e4SDavid E. O'Brien 	    return(CC_ERROR);
1558c80476e4SDavid E. O'Brien 	}
1559c80476e4SDavid E. O'Brien #endif
1560c80476e4SDavid E. O'Brien 	if (inputmode != MODE_INSERT) {
1561c80476e4SDavid E. O'Brien 
1562c80476e4SDavid E. O'Brien 	    for(i=0;i<Argument;i++)
1563c80476e4SDavid E. O'Brien 		UndoBuf[UndoSize++] = *(Cursor+i);
1564c80476e4SDavid E. O'Brien 
1565c80476e4SDavid E. O'Brien 	    UndoBuf[UndoSize] = '\0';
1566c80476e4SDavid E. O'Brien 	    c_delafter(Argument);   /* Do NOT use the saving ONE */
1567c80476e4SDavid E. O'Brien     	}
1568c80476e4SDavid E. O'Brien 
1569c80476e4SDavid E. O'Brien         c_insert(Argument);
1570c80476e4SDavid E. O'Brien 
1571c80476e4SDavid E. O'Brien 	while (Argument--)
1572c80476e4SDavid E. O'Brien 	    *Cursor++ = (Char) c;
1573c80476e4SDavid E. O'Brien 	Refresh();
1574c80476e4SDavid E. O'Brien     }
1575c80476e4SDavid E. O'Brien 
1576c80476e4SDavid E. O'Brien     if (inputmode == MODE_REPLACE_1)
1577c80476e4SDavid E. O'Brien 	(void) v_cmd_mode(0);
1578c80476e4SDavid E. O'Brien 
1579c80476e4SDavid E. O'Brien #if defined(DSPMBYTE)
1580c80476e4SDavid E. O'Brien     return(ret);
1581c80476e4SDavid E. O'Brien #else
1582c80476e4SDavid E. O'Brien     return(CC_NORM);
1583c80476e4SDavid E. O'Brien #endif
1584c80476e4SDavid E. O'Brien }
1585c80476e4SDavid E. O'Brien 
1586c80476e4SDavid E. O'Brien int
1587c80476e4SDavid E. O'Brien InsertStr(s)			/* insert ASCIZ s at cursor (for complete) */
1588c80476e4SDavid E. O'Brien     Char   *s;
1589c80476e4SDavid E. O'Brien {
15906767bd61SMark Peek     int len;
1591c80476e4SDavid E. O'Brien 
1592c80476e4SDavid E. O'Brien     if ((len = (int) Strlen(s)) <= 0)
1593c80476e4SDavid E. O'Brien 	return -1;
1594c80476e4SDavid E. O'Brien     if (LastChar + len >= InputLim)
1595c80476e4SDavid E. O'Brien 	return -1;		/* end of buffer space */
1596c80476e4SDavid E. O'Brien 
1597c80476e4SDavid E. O'Brien     c_insert(len);
1598c80476e4SDavid E. O'Brien     while (len--)
1599c80476e4SDavid E. O'Brien 	*Cursor++ = *s++;
1600c80476e4SDavid E. O'Brien     return 0;
1601c80476e4SDavid E. O'Brien }
1602c80476e4SDavid E. O'Brien 
1603c80476e4SDavid E. O'Brien void
1604c80476e4SDavid E. O'Brien DeleteBack(n)			/* delete the n characters before . */
1605c80476e4SDavid E. O'Brien     int     n;
1606c80476e4SDavid E. O'Brien {
1607c80476e4SDavid E. O'Brien     if (n <= 0)
1608c80476e4SDavid E. O'Brien 	return;
1609c80476e4SDavid E. O'Brien     if (Cursor >= &InputBuf[n]) {
1610c80476e4SDavid E. O'Brien 	c_delbefore(n);		/* delete before dot */
1611c80476e4SDavid E. O'Brien 	if (n > Cursor - InputBuf)
1612c80476e4SDavid E. O'Brien 	    Cursor = InputBuf;	/* bounds check */
1613c80476e4SDavid E. O'Brien 	else
1614c80476e4SDavid E. O'Brien 	    Cursor -= n;
1615c80476e4SDavid E. O'Brien #if defined(DSPMBYTE)
1616c80476e4SDavid E. O'Brien 	if(_enable_mbdisp && extdel && Cursor > InputBuf) {
1617c80476e4SDavid E. O'Brien 	    Cursor--;
1618c80476e4SDavid E. O'Brien 	    e_redisp(1);
1619c80476e4SDavid E. O'Brien 	}
1620c80476e4SDavid E. O'Brien #endif
1621c80476e4SDavid E. O'Brien     }
1622c80476e4SDavid E. O'Brien }
1623c80476e4SDavid E. O'Brien 
1624c80476e4SDavid E. O'Brien CCRETVAL
1625c80476e4SDavid E. O'Brien e_digit(c)			/* gray magic here */
16266767bd61SMark Peek     int c;
1627c80476e4SDavid E. O'Brien {
1628c80476e4SDavid E. O'Brien     if (!Isdigit(c))
1629c80476e4SDavid E. O'Brien 	return(CC_ERROR);	/* no NULs in the input ever!! */
1630c80476e4SDavid E. O'Brien 
1631c80476e4SDavid E. O'Brien     if (DoingArg) {		/* if doing an arg, add this in... */
1632c80476e4SDavid E. O'Brien 	if (LastCmd == F_ARGFOUR)	/* if last command was ^U */
1633c80476e4SDavid E. O'Brien 	    Argument = c - '0';
1634c80476e4SDavid E. O'Brien 	else {
1635c80476e4SDavid E. O'Brien 	    if (Argument > 1000000)
1636c80476e4SDavid E. O'Brien 		return CC_ERROR;
1637c80476e4SDavid E. O'Brien 	    Argument = (Argument * 10) + (c - '0');
1638c80476e4SDavid E. O'Brien 	}
1639c80476e4SDavid E. O'Brien 	return(CC_ARGHACK);
1640c80476e4SDavid E. O'Brien     }
1641c80476e4SDavid E. O'Brien     else {
1642c80476e4SDavid E. O'Brien 	if (LastChar + 1 >= InputLim)
1643c80476e4SDavid E. O'Brien 	    return CC_ERROR;	/* end of buffer space */
1644c80476e4SDavid E. O'Brien 
1645c80476e4SDavid E. O'Brien 	if (inputmode != MODE_INSERT) {
1646c80476e4SDavid E. O'Brien 	    UndoBuf[UndoSize++] = *Cursor;
1647c80476e4SDavid E. O'Brien 	    UndoBuf[UndoSize] = '\0';
1648c80476e4SDavid E. O'Brien 	    c_delafter(1);   /* Do NOT use the saving ONE */
1649c80476e4SDavid E. O'Brien     	}
1650c80476e4SDavid E. O'Brien 	c_insert(1);
1651c80476e4SDavid E. O'Brien 	*Cursor++ = (Char) c;
1652c80476e4SDavid E. O'Brien 	DoingArg = 0;		/* just in case */
1653c80476e4SDavid E. O'Brien 	RefPlusOne();		/* fast refresh for one char. */
1654c80476e4SDavid E. O'Brien     }
1655c80476e4SDavid E. O'Brien     return(CC_NORM);
1656c80476e4SDavid E. O'Brien }
1657c80476e4SDavid E. O'Brien 
1658c80476e4SDavid E. O'Brien CCRETVAL
1659c80476e4SDavid E. O'Brien e_argdigit(c)			/* for ESC-n */
16606767bd61SMark Peek     int c;
1661c80476e4SDavid E. O'Brien {
1662c80476e4SDavid E. O'Brien     c &= ASCII;
1663c80476e4SDavid E. O'Brien 
1664c80476e4SDavid E. O'Brien     if (!Isdigit(c))
1665c80476e4SDavid E. O'Brien 	return(CC_ERROR);	/* no NULs in the input ever!! */
1666c80476e4SDavid E. O'Brien 
1667c80476e4SDavid E. O'Brien     if (DoingArg) {		/* if doing an arg, add this in... */
1668c80476e4SDavid E. O'Brien 	if (Argument > 1000000)
1669c80476e4SDavid E. O'Brien 	    return CC_ERROR;
1670c80476e4SDavid E. O'Brien 	Argument = (Argument * 10) + (c - '0');
1671c80476e4SDavid E. O'Brien     }
1672c80476e4SDavid E. O'Brien     else {			/* else starting an argument */
1673c80476e4SDavid E. O'Brien 	Argument = c - '0';
1674c80476e4SDavid E. O'Brien 	DoingArg = 1;
1675c80476e4SDavid E. O'Brien     }
1676c80476e4SDavid E. O'Brien     return(CC_ARGHACK);
1677c80476e4SDavid E. O'Brien }
1678c80476e4SDavid E. O'Brien 
1679c80476e4SDavid E. O'Brien CCRETVAL
1680c80476e4SDavid E. O'Brien v_zero(c)			/* command mode 0 for vi */
16816767bd61SMark Peek     int c;
1682c80476e4SDavid E. O'Brien {
1683c80476e4SDavid E. O'Brien     if (DoingArg) {		/* if doing an arg, add this in... */
1684c80476e4SDavid E. O'Brien 	if (Argument > 1000000)
1685c80476e4SDavid E. O'Brien 	    return CC_ERROR;
1686c80476e4SDavid E. O'Brien 	Argument = (Argument * 10) + (c - '0');
1687c80476e4SDavid E. O'Brien 	return(CC_ARGHACK);
1688c80476e4SDavid E. O'Brien     }
1689c80476e4SDavid E. O'Brien     else {			/* else starting an argument */
1690c80476e4SDavid E. O'Brien 	Cursor = InputBuf;
1691c80476e4SDavid E. O'Brien 	if (ActionFlag & TCSHOP_DELETE) {
1692c80476e4SDavid E. O'Brien 	   c_delfini();
1693c80476e4SDavid E. O'Brien 	   return(CC_REFRESH);
1694c80476e4SDavid E. O'Brien         }
1695c80476e4SDavid E. O'Brien 	RefCursor();		/* move the cursor */
1696c80476e4SDavid E. O'Brien 	return(CC_NORM);
1697c80476e4SDavid E. O'Brien     }
1698c80476e4SDavid E. O'Brien }
1699c80476e4SDavid E. O'Brien 
1700c80476e4SDavid E. O'Brien /*ARGSUSED*/
1701c80476e4SDavid E. O'Brien CCRETVAL
1702c80476e4SDavid E. O'Brien e_newline(c)
1703c80476e4SDavid E. O'Brien     int c;
1704c80476e4SDavid E. O'Brien {				/* always ignore argument */
1705c80476e4SDavid E. O'Brien     USE(c);
1706c80476e4SDavid E. O'Brien   /*  PastBottom();  NOW done in ed.inputl.c */
1707c80476e4SDavid E. O'Brien     *LastChar++ = '\n';		/* for the benefit of CSH */
1708c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1709c80476e4SDavid E. O'Brien     if (VImode)
1710c80476e4SDavid E. O'Brien 	InsertPos = InputBuf;	/* Reset editing position */
1711c80476e4SDavid E. O'Brien     return(CC_NEWLINE);
1712c80476e4SDavid E. O'Brien }
1713c80476e4SDavid E. O'Brien 
1714c80476e4SDavid E. O'Brien /*ARGSUSED*/
1715c80476e4SDavid E. O'Brien CCRETVAL
1716c80476e4SDavid E. O'Brien e_send_eof(c)
1717c80476e4SDavid E. O'Brien     int c;
1718c80476e4SDavid E. O'Brien {				/* for when ^D is ONLY send-eof */
1719c80476e4SDavid E. O'Brien     USE(c);
1720c80476e4SDavid E. O'Brien     PastBottom();
1721c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1722c80476e4SDavid E. O'Brien     return(CC_EOF);
1723c80476e4SDavid E. O'Brien }
1724c80476e4SDavid E. O'Brien 
1725c80476e4SDavid E. O'Brien /*ARGSUSED*/
1726c80476e4SDavid E. O'Brien CCRETVAL
1727c80476e4SDavid E. O'Brien e_complete(c)
1728c80476e4SDavid E. O'Brien     int c;
1729c80476e4SDavid E. O'Brien {
1730c80476e4SDavid E. O'Brien     USE(c);
1731c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1732c80476e4SDavid E. O'Brien     return(CC_COMPLETE);
1733c80476e4SDavid E. O'Brien }
1734c80476e4SDavid E. O'Brien 
1735c80476e4SDavid E. O'Brien /*ARGSUSED*/
1736c80476e4SDavid E. O'Brien CCRETVAL
1737c80476e4SDavid E. O'Brien e_complete_back(c)
1738c80476e4SDavid E. O'Brien     int c;
1739c80476e4SDavid E. O'Brien {
1740c80476e4SDavid E. O'Brien     USE(c);
1741c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1742c80476e4SDavid E. O'Brien     return(CC_COMPLETE_BACK);
1743c80476e4SDavid E. O'Brien }
1744c80476e4SDavid E. O'Brien 
1745c80476e4SDavid E. O'Brien /*ARGSUSED*/
1746c80476e4SDavid E. O'Brien CCRETVAL
1747c80476e4SDavid E. O'Brien e_complete_fwd(c)
1748c80476e4SDavid E. O'Brien     int c;
1749c80476e4SDavid E. O'Brien {
1750c80476e4SDavid E. O'Brien     USE(c);
1751c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1752c80476e4SDavid E. O'Brien     return(CC_COMPLETE_FWD);
1753c80476e4SDavid E. O'Brien }
1754c80476e4SDavid E. O'Brien 
1755c80476e4SDavid E. O'Brien /*ARGSUSED*/
1756c80476e4SDavid E. O'Brien CCRETVAL
1757c80476e4SDavid E. O'Brien e_complete_all(c)
1758c80476e4SDavid E. O'Brien     int c;
1759c80476e4SDavid E. O'Brien {
1760c80476e4SDavid E. O'Brien     USE(c);
1761c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1762c80476e4SDavid E. O'Brien     return(CC_COMPLETE_ALL);
1763c80476e4SDavid E. O'Brien }
1764c80476e4SDavid E. O'Brien 
1765c80476e4SDavid E. O'Brien /*ARGSUSED*/
1766c80476e4SDavid E. O'Brien CCRETVAL
1767c80476e4SDavid E. O'Brien v_cm_complete(c)
1768c80476e4SDavid E. O'Brien     int c;
1769c80476e4SDavid E. O'Brien {
1770c80476e4SDavid E. O'Brien     USE(c);
1771c80476e4SDavid E. O'Brien     if (Cursor < LastChar)
1772c80476e4SDavid E. O'Brien 	Cursor++;
1773c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1774c80476e4SDavid E. O'Brien     return(CC_COMPLETE);
1775c80476e4SDavid E. O'Brien }
1776c80476e4SDavid E. O'Brien 
1777c80476e4SDavid E. O'Brien /*ARGSUSED*/
1778c80476e4SDavid E. O'Brien CCRETVAL
1779c80476e4SDavid E. O'Brien e_toggle_hist(c)
1780c80476e4SDavid E. O'Brien     int c;
1781c80476e4SDavid E. O'Brien {
1782c80476e4SDavid E. O'Brien     struct Hist *hp;
1783c80476e4SDavid E. O'Brien     int     h;
1784c80476e4SDavid E. O'Brien 
1785c80476e4SDavid E. O'Brien     USE(c);
1786c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1787c80476e4SDavid E. O'Brien 
1788c80476e4SDavid E. O'Brien     if (Hist_num <= 0) {
1789c80476e4SDavid E. O'Brien 	return CC_ERROR;
1790c80476e4SDavid E. O'Brien     }
1791c80476e4SDavid E. O'Brien 
1792c80476e4SDavid E. O'Brien     hp = Histlist.Hnext;
1793c80476e4SDavid E. O'Brien     if (hp == NULL) {	/* this is only if no history */
1794c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1795c80476e4SDavid E. O'Brien     }
1796c80476e4SDavid E. O'Brien 
1797c80476e4SDavid E. O'Brien     for (h = 1; h < Hist_num; h++)
1798c80476e4SDavid E. O'Brien 	hp = hp->Hnext;
1799c80476e4SDavid E. O'Brien 
1800c80476e4SDavid E. O'Brien     if (!CurrentHistLit) {
1801c80476e4SDavid E. O'Brien 	if (hp->histline) {
1802c80476e4SDavid E. O'Brien 	    copyn(InputBuf, hp->histline, INBUFSIZE);
1803c80476e4SDavid E. O'Brien 	    CurrentHistLit = 1;
1804c80476e4SDavid E. O'Brien 	}
1805c80476e4SDavid E. O'Brien 	else {
1806c80476e4SDavid E. O'Brien 	    return CC_ERROR;
1807c80476e4SDavid E. O'Brien 	}
1808c80476e4SDavid E. O'Brien     }
1809c80476e4SDavid E. O'Brien     else {
1810b2be84b1SDavid E. O'Brien 	(void) sprlex(InputBuf, sizeof(InputBuf) / sizeof(Char), &hp->Hlex);
1811c80476e4SDavid E. O'Brien 	CurrentHistLit = 0;
1812c80476e4SDavid E. O'Brien     }
1813c80476e4SDavid E. O'Brien 
1814c80476e4SDavid E. O'Brien     LastChar = InputBuf + Strlen(InputBuf);
1815c80476e4SDavid E. O'Brien     if (LastChar > InputBuf) {
1816c80476e4SDavid E. O'Brien 	if (LastChar[-1] == '\n')
1817c80476e4SDavid E. O'Brien 	    LastChar--;
1818c80476e4SDavid E. O'Brien 	if (LastChar[-1] == ' ')
1819c80476e4SDavid E. O'Brien 	    LastChar--;
1820c80476e4SDavid E. O'Brien 	if (LastChar < InputBuf)
1821c80476e4SDavid E. O'Brien 	    LastChar = InputBuf;
1822c80476e4SDavid E. O'Brien     }
1823c80476e4SDavid E. O'Brien 
1824c80476e4SDavid E. O'Brien #ifdef KSHVI
1825c80476e4SDavid E. O'Brien     if (VImode)
1826c80476e4SDavid E. O'Brien 	Cursor = InputBuf;
1827c80476e4SDavid E. O'Brien     else
1828c80476e4SDavid E. O'Brien #endif /* KSHVI */
1829c80476e4SDavid E. O'Brien 	Cursor = LastChar;
1830c80476e4SDavid E. O'Brien 
1831c80476e4SDavid E. O'Brien     return(CC_REFRESH);
1832c80476e4SDavid E. O'Brien }
1833c80476e4SDavid E. O'Brien 
1834c80476e4SDavid E. O'Brien /*ARGSUSED*/
1835c80476e4SDavid E. O'Brien CCRETVAL
1836c80476e4SDavid E. O'Brien e_up_hist(c)
1837c80476e4SDavid E. O'Brien     int c;
1838c80476e4SDavid E. O'Brien {
1839c80476e4SDavid E. O'Brien     Char    beep = 0;
1840c80476e4SDavid E. O'Brien 
1841c80476e4SDavid E. O'Brien     USE(c);
1842c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_NOP;
1843c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1844c80476e4SDavid E. O'Brien 
1845c80476e4SDavid E. O'Brien     if (Hist_num == 0) {	/* save the current buffer away */
1846c80476e4SDavid E. O'Brien 	copyn(HistBuf, InputBuf, INBUFSIZE);
1847c80476e4SDavid E. O'Brien 	LastHist = HistBuf + (LastChar - InputBuf);
1848c80476e4SDavid E. O'Brien     }
1849c80476e4SDavid E. O'Brien 
1850c80476e4SDavid E. O'Brien     Hist_num += Argument;
1851c80476e4SDavid E. O'Brien 
1852c80476e4SDavid E. O'Brien     if (c_get_histline() == CC_ERROR) {
1853c80476e4SDavid E. O'Brien 	beep = 1;
1854c80476e4SDavid E. O'Brien 	(void) c_get_histline(); /* Hist_num was fixed by first call */
1855c80476e4SDavid E. O'Brien     }
1856c80476e4SDavid E. O'Brien 
1857c80476e4SDavid E. O'Brien     Refresh();
1858c80476e4SDavid E. O'Brien     if (beep)
1859c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1860c80476e4SDavid E. O'Brien     else
1861c80476e4SDavid E. O'Brien 	return(CC_NORM);	/* was CC_UP_HIST */
1862c80476e4SDavid E. O'Brien }
1863c80476e4SDavid E. O'Brien 
1864c80476e4SDavid E. O'Brien /*ARGSUSED*/
1865c80476e4SDavid E. O'Brien CCRETVAL
1866c80476e4SDavid E. O'Brien e_down_hist(c)
1867c80476e4SDavid E. O'Brien     int c;
1868c80476e4SDavid E. O'Brien {
1869c80476e4SDavid E. O'Brien     USE(c);
1870c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_NOP;
1871c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1872c80476e4SDavid E. O'Brien 
1873c80476e4SDavid E. O'Brien     Hist_num -= Argument;
1874c80476e4SDavid E. O'Brien 
1875c80476e4SDavid E. O'Brien     if (Hist_num < 0) {
1876c80476e4SDavid E. O'Brien 	Hist_num = 0;
1877c80476e4SDavid E. O'Brien 	return(CC_ERROR);	/* make it beep */
1878c80476e4SDavid E. O'Brien     }
1879c80476e4SDavid E. O'Brien 
1880c80476e4SDavid E. O'Brien     return(c_get_histline());
1881c80476e4SDavid E. O'Brien }
1882c80476e4SDavid E. O'Brien 
1883c80476e4SDavid E. O'Brien 
1884c80476e4SDavid E. O'Brien 
1885c80476e4SDavid E. O'Brien /*
1886c80476e4SDavid E. O'Brien  * c_hmatch() return True if the pattern matches the prefix
1887c80476e4SDavid E. O'Brien  */
1888c80476e4SDavid E. O'Brien static int
1889c80476e4SDavid E. O'Brien c_hmatch(str)
1890c80476e4SDavid E. O'Brien Char *str;
1891c80476e4SDavid E. O'Brien {
1892c80476e4SDavid E. O'Brien     if (Strncmp(patbuf, str, (size_t) patlen) == 0)
1893c80476e4SDavid E. O'Brien 	return 1;
1894c80476e4SDavid E. O'Brien     return Gmatch(str, patbuf);
1895c80476e4SDavid E. O'Brien }
1896c80476e4SDavid E. O'Brien 
1897c80476e4SDavid E. O'Brien /*
1898c80476e4SDavid E. O'Brien  * c_hsetpat(): Set the history seatch pattern
1899c80476e4SDavid E. O'Brien  */
1900c80476e4SDavid E. O'Brien static void
1901c80476e4SDavid E. O'Brien c_hsetpat()
1902c80476e4SDavid E. O'Brien {
1903c80476e4SDavid E. O'Brien     if (LastCmd != F_UP_SEARCH_HIST && LastCmd != F_DOWN_SEARCH_HIST) {
1904c80476e4SDavid E. O'Brien 	patlen = (int) (Cursor - InputBuf);
1905c80476e4SDavid E. O'Brien 	if (patlen >= INBUFSIZE) patlen = INBUFSIZE -1;
1906c80476e4SDavid E. O'Brien 	if (patlen >= 0)  {
1907c80476e4SDavid E. O'Brien 	    (void) Strncpy(patbuf, InputBuf, (size_t) patlen);
1908c80476e4SDavid E. O'Brien 	    patbuf[patlen] = '\0';
1909c80476e4SDavid E. O'Brien 	}
1910c80476e4SDavid E. O'Brien 	else
1911c80476e4SDavid E. O'Brien 	    patlen = (int) Strlen(patbuf);
1912c80476e4SDavid E. O'Brien     }
1913c80476e4SDavid E. O'Brien #ifdef SDEBUG
1914c80476e4SDavid E. O'Brien     xprintf("\nHist_num = %d\n", Hist_num);
1915c80476e4SDavid E. O'Brien     xprintf("patlen = %d\n", patlen);
1916c80476e4SDavid E. O'Brien     xprintf("patbuf = \"%S\"\n", patbuf);
1917c80476e4SDavid E. O'Brien     xprintf("Cursor %d LastChar %d\n", Cursor - InputBuf, LastChar - InputBuf);
1918c80476e4SDavid E. O'Brien #endif
1919c80476e4SDavid E. O'Brien }
1920c80476e4SDavid E. O'Brien 
1921c80476e4SDavid E. O'Brien /*ARGSUSED*/
1922c80476e4SDavid E. O'Brien CCRETVAL
1923c80476e4SDavid E. O'Brien e_up_search_hist(c)
1924c80476e4SDavid E. O'Brien     int c;
1925c80476e4SDavid E. O'Brien {
1926c80476e4SDavid E. O'Brien     struct Hist *hp;
1927c80476e4SDavid E. O'Brien     int h;
1928c80476e4SDavid E. O'Brien     bool    found = 0;
1929c80476e4SDavid E. O'Brien 
1930c80476e4SDavid E. O'Brien     USE(c);
1931c80476e4SDavid E. O'Brien     ActionFlag = TCSHOP_NOP;
1932c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_NOP;
1933c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
1934c80476e4SDavid E. O'Brien     if (Hist_num < 0) {
1935c80476e4SDavid E. O'Brien #ifdef DEBUG_EDIT
1936c80476e4SDavid E. O'Brien 	xprintf("%s: e_up_search_hist(): Hist_num < 0; resetting.\n", progname);
1937c80476e4SDavid E. O'Brien #endif
1938c80476e4SDavid E. O'Brien 	Hist_num = 0;
1939c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1940c80476e4SDavid E. O'Brien     }
1941c80476e4SDavid E. O'Brien 
1942c80476e4SDavid E. O'Brien     if (Hist_num == 0)
1943c80476e4SDavid E. O'Brien     {
1944c80476e4SDavid E. O'Brien 	copyn(HistBuf, InputBuf, INBUFSIZE);
1945c80476e4SDavid E. O'Brien 	LastHist = HistBuf + (LastChar - InputBuf);
1946c80476e4SDavid E. O'Brien     }
1947c80476e4SDavid E. O'Brien 
1948c80476e4SDavid E. O'Brien 
1949c80476e4SDavid E. O'Brien     hp = Histlist.Hnext;
1950c80476e4SDavid E. O'Brien     if (hp == NULL)
1951c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1952c80476e4SDavid E. O'Brien 
1953c80476e4SDavid E. O'Brien     c_hsetpat();		/* Set search pattern !! */
1954c80476e4SDavid E. O'Brien 
1955c80476e4SDavid E. O'Brien     for (h = 1; h <= Hist_num; h++)
1956c80476e4SDavid E. O'Brien 	hp = hp->Hnext;
1957c80476e4SDavid E. O'Brien 
1958c80476e4SDavid E. O'Brien     while (hp != NULL) {
1959c80476e4SDavid E. O'Brien 	Char sbuf[INBUFSIZE], *hl;
1960c80476e4SDavid E. O'Brien 	if (hp->histline == NULL) {
1961b2be84b1SDavid E. O'Brien 	    hp->histline = Strsave(sprlex(sbuf, sizeof(sbuf) / sizeof(Char),
1962b2be84b1SDavid E. O'Brien 				   &hp->Hlex));
1963c80476e4SDavid E. O'Brien 	}
1964b2be84b1SDavid E. O'Brien 	hl = HistLit ? hp->histline : sprlex(sbuf, sizeof(sbuf) / sizeof(Char),
1965b2be84b1SDavid E. O'Brien 					     &hp->Hlex);
1966c80476e4SDavid E. O'Brien #ifdef SDEBUG
1967c80476e4SDavid E. O'Brien 	xprintf("Comparing with \"%S\"\n", hl);
1968c80476e4SDavid E. O'Brien #endif
1969c80476e4SDavid E. O'Brien 	if ((Strncmp(hl, InputBuf, (size_t) (LastChar - InputBuf)) ||
1970c80476e4SDavid E. O'Brien 	     hl[LastChar-InputBuf]) && c_hmatch(hl)) {
1971c80476e4SDavid E. O'Brien 	    found++;
1972c80476e4SDavid E. O'Brien 	    break;
1973c80476e4SDavid E. O'Brien 	}
1974c80476e4SDavid E. O'Brien 	h++;
1975c80476e4SDavid E. O'Brien 	hp = hp->Hnext;
1976c80476e4SDavid E. O'Brien     }
1977c80476e4SDavid E. O'Brien 
1978c80476e4SDavid E. O'Brien     if (!found) {
1979c80476e4SDavid E. O'Brien #ifdef SDEBUG
1980c80476e4SDavid E. O'Brien 	xprintf("not found\n");
1981c80476e4SDavid E. O'Brien #endif
1982c80476e4SDavid E. O'Brien 	return(CC_ERROR);
1983c80476e4SDavid E. O'Brien     }
1984c80476e4SDavid E. O'Brien 
1985c80476e4SDavid E. O'Brien     Hist_num = h;
1986c80476e4SDavid E. O'Brien 
1987c80476e4SDavid E. O'Brien     return(c_get_histline());
1988c80476e4SDavid E. O'Brien }
1989c80476e4SDavid E. O'Brien 
1990c80476e4SDavid E. O'Brien /*ARGSUSED*/
1991c80476e4SDavid E. O'Brien CCRETVAL
1992c80476e4SDavid E. O'Brien e_down_search_hist(c)
1993c80476e4SDavid E. O'Brien     int c;
1994c80476e4SDavid E. O'Brien {
1995c80476e4SDavid E. O'Brien     struct Hist *hp;
1996c80476e4SDavid E. O'Brien     int h;
1997c80476e4SDavid E. O'Brien     bool    found = 0;
1998c80476e4SDavid E. O'Brien 
1999c80476e4SDavid E. O'Brien     USE(c);
2000c80476e4SDavid E. O'Brien     ActionFlag = TCSHOP_NOP;
2001c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_NOP;
2002c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2003c80476e4SDavid E. O'Brien 
2004c80476e4SDavid E. O'Brien     if (Hist_num == 0)
2005c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2006c80476e4SDavid E. O'Brien 
2007c80476e4SDavid E. O'Brien     hp = Histlist.Hnext;
2008c80476e4SDavid E. O'Brien     if (hp == 0)
2009c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2010c80476e4SDavid E. O'Brien 
2011c80476e4SDavid E. O'Brien     c_hsetpat();		/* Set search pattern !! */
2012c80476e4SDavid E. O'Brien 
2013c80476e4SDavid E. O'Brien     for (h = 1; h < Hist_num && hp; h++) {
2014c80476e4SDavid E. O'Brien 	Char sbuf[INBUFSIZE], *hl;
2015c80476e4SDavid E. O'Brien 	if (hp->histline == NULL) {
2016b2be84b1SDavid E. O'Brien 	    hp->histline = Strsave(sprlex(sbuf, sizeof(sbuf) / sizeof(Char),
2017b2be84b1SDavid E. O'Brien 				   &hp->Hlex));
2018c80476e4SDavid E. O'Brien 	}
2019b2be84b1SDavid E. O'Brien 	hl = HistLit ? hp->histline : sprlex(sbuf, sizeof(sbuf) / sizeof(Char),
2020b2be84b1SDavid E. O'Brien 					     &hp->Hlex);
2021c80476e4SDavid E. O'Brien #ifdef SDEBUG
2022c80476e4SDavid E. O'Brien 	xprintf("Comparing with \"%S\"\n", hl);
2023c80476e4SDavid E. O'Brien #endif
2024c80476e4SDavid E. O'Brien 	if ((Strncmp(hl, InputBuf, (size_t) (LastChar - InputBuf)) ||
2025c80476e4SDavid E. O'Brien 	     hl[LastChar-InputBuf]) && c_hmatch(hl))
2026c80476e4SDavid E. O'Brien 	    found = h;
2027c80476e4SDavid E. O'Brien 	hp = hp->Hnext;
2028c80476e4SDavid E. O'Brien     }
2029c80476e4SDavid E. O'Brien 
2030c80476e4SDavid E. O'Brien     if (!found) {		/* is it the current history number? */
2031c80476e4SDavid E. O'Brien 	if (!c_hmatch(HistBuf)) {
2032c80476e4SDavid E. O'Brien #ifdef SDEBUG
2033c80476e4SDavid E. O'Brien 	    xprintf("not found\n");
2034c80476e4SDavid E. O'Brien #endif
2035c80476e4SDavid E. O'Brien 	    return(CC_ERROR);
2036c80476e4SDavid E. O'Brien 	}
2037c80476e4SDavid E. O'Brien     }
2038c80476e4SDavid E. O'Brien 
2039c80476e4SDavid E. O'Brien     Hist_num = found;
2040c80476e4SDavid E. O'Brien 
2041c80476e4SDavid E. O'Brien     return(c_get_histline());
2042c80476e4SDavid E. O'Brien }
2043c80476e4SDavid E. O'Brien 
2044c80476e4SDavid E. O'Brien /*ARGSUSED*/
2045c80476e4SDavid E. O'Brien CCRETVAL
2046c80476e4SDavid E. O'Brien e_helpme(c)
2047c80476e4SDavid E. O'Brien     int c;
2048c80476e4SDavid E. O'Brien {
2049c80476e4SDavid E. O'Brien     USE(c);
2050c80476e4SDavid E. O'Brien     PastBottom();
2051c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2052c80476e4SDavid E. O'Brien     return(CC_HELPME);
2053c80476e4SDavid E. O'Brien }
2054c80476e4SDavid E. O'Brien 
2055c80476e4SDavid E. O'Brien /*ARGSUSED*/
2056c80476e4SDavid E. O'Brien CCRETVAL
2057c80476e4SDavid E. O'Brien e_correct(c)
2058c80476e4SDavid E. O'Brien     int c;
2059c80476e4SDavid E. O'Brien {
2060c80476e4SDavid E. O'Brien     USE(c);
2061c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2062c80476e4SDavid E. O'Brien     return(CC_CORRECT);
2063c80476e4SDavid E. O'Brien }
2064c80476e4SDavid E. O'Brien 
2065c80476e4SDavid E. O'Brien /*ARGSUSED*/
2066c80476e4SDavid E. O'Brien CCRETVAL
2067c80476e4SDavid E. O'Brien e_correctl(c)
2068c80476e4SDavid E. O'Brien     int c;
2069c80476e4SDavid E. O'Brien {
2070c80476e4SDavid E. O'Brien     USE(c);
2071c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2072c80476e4SDavid E. O'Brien     return(CC_CORRECT_L);
2073c80476e4SDavid E. O'Brien }
2074c80476e4SDavid E. O'Brien 
2075c80476e4SDavid E. O'Brien /*ARGSUSED*/
2076c80476e4SDavid E. O'Brien CCRETVAL
2077c80476e4SDavid E. O'Brien e_run_fg_editor(c)
2078c80476e4SDavid E. O'Brien     int c;
2079c80476e4SDavid E. O'Brien {
20806767bd61SMark Peek     struct process *pp;
2081c80476e4SDavid E. O'Brien     extern bool tellwhat;
2082c80476e4SDavid E. O'Brien 
2083c80476e4SDavid E. O'Brien     USE(c);
2084c80476e4SDavid E. O'Brien     if ((pp = find_stop_ed()) != NULL) {
2085c80476e4SDavid E. O'Brien 	/* save our editor state so we can restore it */
2086c80476e4SDavid E. O'Brien 	tellwhat = 1;
2087c80476e4SDavid E. O'Brien 	copyn(WhichBuf, InputBuf, INBUFSIZE);
2088c80476e4SDavid E. O'Brien 	LastWhich = WhichBuf + (LastChar - InputBuf);
2089c80476e4SDavid E. O'Brien 	CursWhich = WhichBuf + (Cursor - InputBuf);
2090c80476e4SDavid E. O'Brien 	HistWhich = Hist_num;
2091c80476e4SDavid E. O'Brien 	Hist_num = 0;		/* for the history commands */
2092c80476e4SDavid E. O'Brien 
2093c80476e4SDavid E. O'Brien 	/* put the tty in a sane mode */
2094c80476e4SDavid E. O'Brien 	PastBottom();
2095c80476e4SDavid E. O'Brien 	(void) Cookedmode();	/* make sure the tty is set up correctly */
2096c80476e4SDavid E. O'Brien 
2097c80476e4SDavid E. O'Brien 	/* do it! */
2098c80476e4SDavid E. O'Brien 	fg_proc_entry(pp);
2099c80476e4SDavid E. O'Brien 
2100c80476e4SDavid E. O'Brien 	(void) Rawmode();	/* go on */
2101c80476e4SDavid E. O'Brien 	Refresh();
2102c80476e4SDavid E. O'Brien 	tellwhat = 0;
2103c80476e4SDavid E. O'Brien     }
2104c80476e4SDavid E. O'Brien     return(CC_NORM);
2105c80476e4SDavid E. O'Brien }
2106c80476e4SDavid E. O'Brien 
2107c80476e4SDavid E. O'Brien /*ARGSUSED*/
2108c80476e4SDavid E. O'Brien CCRETVAL
2109c80476e4SDavid E. O'Brien e_list_choices(c)
2110c80476e4SDavid E. O'Brien     int c;
2111c80476e4SDavid E. O'Brien {
2112c80476e4SDavid E. O'Brien     USE(c);
2113c80476e4SDavid E. O'Brien     PastBottom();
2114c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2115c80476e4SDavid E. O'Brien     return(CC_LIST_CHOICES);
2116c80476e4SDavid E. O'Brien }
2117c80476e4SDavid E. O'Brien 
2118c80476e4SDavid E. O'Brien /*ARGSUSED*/
2119c80476e4SDavid E. O'Brien CCRETVAL
2120c80476e4SDavid E. O'Brien e_list_all(c)
2121c80476e4SDavid E. O'Brien     int c;
2122c80476e4SDavid E. O'Brien {
2123c80476e4SDavid E. O'Brien     USE(c);
2124c80476e4SDavid E. O'Brien     PastBottom();
2125c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2126c80476e4SDavid E. O'Brien     return(CC_LIST_ALL);
2127c80476e4SDavid E. O'Brien }
2128c80476e4SDavid E. O'Brien 
2129c80476e4SDavid E. O'Brien /*ARGSUSED*/
2130c80476e4SDavid E. O'Brien CCRETVAL
2131c80476e4SDavid E. O'Brien e_list_glob(c)
2132c80476e4SDavid E. O'Brien     int c;
2133c80476e4SDavid E. O'Brien {
2134c80476e4SDavid E. O'Brien     USE(c);
2135c80476e4SDavid E. O'Brien     PastBottom();
2136c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2137c80476e4SDavid E. O'Brien     return(CC_LIST_GLOB);
2138c80476e4SDavid E. O'Brien }
2139c80476e4SDavid E. O'Brien 
2140c80476e4SDavid E. O'Brien /*ARGSUSED*/
2141c80476e4SDavid E. O'Brien CCRETVAL
2142c80476e4SDavid E. O'Brien e_expand_glob(c)
2143c80476e4SDavid E. O'Brien     int c;
2144c80476e4SDavid E. O'Brien {
2145c80476e4SDavid E. O'Brien     USE(c);
2146c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2147c80476e4SDavid E. O'Brien     return(CC_EXPAND_GLOB);
2148c80476e4SDavid E. O'Brien }
2149c80476e4SDavid E. O'Brien 
2150c80476e4SDavid E. O'Brien /*ARGSUSED*/
2151c80476e4SDavid E. O'Brien CCRETVAL
2152c80476e4SDavid E. O'Brien e_normalize_path(c)
2153c80476e4SDavid E. O'Brien     int c;
2154c80476e4SDavid E. O'Brien {
2155c80476e4SDavid E. O'Brien     USE(c);
2156c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2157c80476e4SDavid E. O'Brien     return(CC_NORMALIZE_PATH);
2158c80476e4SDavid E. O'Brien }
2159c80476e4SDavid E. O'Brien 
2160c80476e4SDavid E. O'Brien /*ARGSUSED*/
2161c80476e4SDavid E. O'Brien CCRETVAL
2162c80476e4SDavid E. O'Brien e_normalize_command(c)
2163c80476e4SDavid E. O'Brien     int c;
2164c80476e4SDavid E. O'Brien {
2165c80476e4SDavid E. O'Brien     USE(c);
2166c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2167c80476e4SDavid E. O'Brien     return(CC_NORMALIZE_COMMAND);
2168c80476e4SDavid E. O'Brien }
2169c80476e4SDavid E. O'Brien 
2170c80476e4SDavid E. O'Brien /*ARGSUSED*/
2171c80476e4SDavid E. O'Brien CCRETVAL
2172c80476e4SDavid E. O'Brien e_expand_vars(c)
2173c80476e4SDavid E. O'Brien     int c;
2174c80476e4SDavid E. O'Brien {
2175c80476e4SDavid E. O'Brien     USE(c);
2176c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2177c80476e4SDavid E. O'Brien     return(CC_EXPAND_VARS);
2178c80476e4SDavid E. O'Brien }
2179c80476e4SDavid E. O'Brien 
2180c80476e4SDavid E. O'Brien /*ARGSUSED*/
2181c80476e4SDavid E. O'Brien CCRETVAL
2182c80476e4SDavid E. O'Brien e_which(c)
2183c80476e4SDavid E. O'Brien     int c;
2184c80476e4SDavid E. O'Brien {				/* do a fast command line which(1) */
2185c80476e4SDavid E. O'Brien     USE(c);
2186c80476e4SDavid E. O'Brien     PastBottom();
2187c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
2188c80476e4SDavid E. O'Brien     return(CC_WHICH);
2189c80476e4SDavid E. O'Brien }
2190c80476e4SDavid E. O'Brien 
2191c80476e4SDavid E. O'Brien /*ARGSUSED*/
2192c80476e4SDavid E. O'Brien CCRETVAL
2193c80476e4SDavid E. O'Brien e_last_item(c)
2194c80476e4SDavid E. O'Brien     int c;
2195c80476e4SDavid E. O'Brien {				/* insert the last element of the prev. cmd */
21966767bd61SMark Peek     Char *cp;
21976767bd61SMark Peek     struct Hist *hp;
21986767bd61SMark Peek     struct wordent *wp, *firstp;
21996767bd61SMark Peek     int i;
2200c80476e4SDavid E. O'Brien     Char buf[INBUFSIZE];
2201c80476e4SDavid E. O'Brien 
2202c80476e4SDavid E. O'Brien     USE(c);
2203c80476e4SDavid E. O'Brien     if (Argument <= 0)
2204c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2205c80476e4SDavid E. O'Brien 
2206c80476e4SDavid E. O'Brien     hp = Histlist.Hnext;
2207c80476e4SDavid E. O'Brien     if (hp == NULL) {	/* this is only if no history */
2208c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2209c80476e4SDavid E. O'Brien     }
2210c80476e4SDavid E. O'Brien 
2211c80476e4SDavid E. O'Brien     wp = (hp->Hlex).prev;
2212c80476e4SDavid E. O'Brien 
2213c80476e4SDavid E. O'Brien     if (wp->prev == (struct wordent *) NULL)
2214c80476e4SDavid E. O'Brien 	return(CC_ERROR);	/* an empty history entry */
2215c80476e4SDavid E. O'Brien 
2216c80476e4SDavid E. O'Brien     firstp = (hp->Hlex).next;
2217c80476e4SDavid E. O'Brien 
2218c80476e4SDavid E. O'Brien     /* back up arg words in lex */
2219c80476e4SDavid E. O'Brien     for (i = 0; i < Argument && wp != firstp; i++) {
2220c80476e4SDavid E. O'Brien 	wp = wp->prev;
2221c80476e4SDavid E. O'Brien     }
2222c80476e4SDavid E. O'Brien 
2223c80476e4SDavid E. O'Brien     cp = expand_lex(buf, INBUFSIZE, wp->prev, 0, i - 1);
2224c80476e4SDavid E. O'Brien     *cp = '\0';
2225c80476e4SDavid E. O'Brien     if (InsertStr(buf))
2226c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2227c80476e4SDavid E. O'Brien 
2228c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2229c80476e4SDavid E. O'Brien }
2230c80476e4SDavid E. O'Brien 
2231c80476e4SDavid E. O'Brien /*ARGSUSED*/
2232c80476e4SDavid E. O'Brien CCRETVAL
2233c80476e4SDavid E. O'Brien e_dabbrev_expand(c)
2234c80476e4SDavid E. O'Brien     int c;
2235c80476e4SDavid E. O'Brien {				/* expand to preceding word matching prefix */
22366767bd61SMark Peek     Char *cp, *ncp, *bp;
22376767bd61SMark Peek     struct Hist *hp;
22386767bd61SMark Peek     int arg = 0, len = 0, i; /* len = 0 to shut up gcc -Wall */
22396767bd61SMark Peek     bool found = 0;
2240c80476e4SDavid E. O'Brien     Char hbuf[INBUFSIZE];
2241c80476e4SDavid E. O'Brien     static int oldevent, hist, word;
2242c80476e4SDavid E. O'Brien     static Char *start, *oldcursor;
2243c80476e4SDavid E. O'Brien 
2244c80476e4SDavid E. O'Brien     USE(c);
2245c80476e4SDavid E. O'Brien     if (Argument <= 0)
2246c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2247c80476e4SDavid E. O'Brien 
22486767bd61SMark Peek     cp = c_preword(Cursor, InputBuf, 1, STRshwordsep);
2249c80476e4SDavid E. O'Brien     if (cp == Cursor || Isspace(*cp))
2250c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2251c80476e4SDavid E. O'Brien 
2252c80476e4SDavid E. O'Brien     hp = Histlist.Hnext;
2253c80476e4SDavid E. O'Brien     bp = InputBuf;
2254c80476e4SDavid E. O'Brien     if (Argument == 1 && eventno == oldevent && cp == start &&
2255c80476e4SDavid E. O'Brien 	Cursor == oldcursor && patlen > 0 && Strncmp(patbuf, cp, patlen) == 0){
2256c80476e4SDavid E. O'Brien 	/* continue previous search - go to last match (hist/word) */
2257c80476e4SDavid E. O'Brien 	if (hist != 0) {		/* need to move up history */
2258c80476e4SDavid E. O'Brien 	    for (i = 1; i < hist && hp != NULL; i++)
2259c80476e4SDavid E. O'Brien 		hp = hp->Hnext;
2260c80476e4SDavid E. O'Brien 	    if (hp == NULL)	/* "can't happen" */
2261c80476e4SDavid E. O'Brien 		return(CC_ERROR);
2262c80476e4SDavid E. O'Brien 	    cp = expand_lex(hbuf, INBUFSIZE, &hp->Hlex, 0, NCARGS);
2263c80476e4SDavid E. O'Brien 	    *cp = '\0';
2264c80476e4SDavid E. O'Brien 	    bp = hbuf;
2265c80476e4SDavid E. O'Brien 	    hp = hp->Hnext;
2266c80476e4SDavid E. O'Brien 	}
22676767bd61SMark Peek 	cp = c_preword(cp, bp, word, STRshwordsep);
2268c80476e4SDavid E. O'Brien     } else {			/* starting new search */
2269c80476e4SDavid E. O'Brien 	oldevent = eventno;
2270c80476e4SDavid E. O'Brien 	start = cp;
2271c80476e4SDavid E. O'Brien 	patlen = (int) (Cursor - cp);
2272c80476e4SDavid E. O'Brien 	(void) Strncpy(patbuf, cp, patlen);
2273c80476e4SDavid E. O'Brien 	hist = 0;
2274c80476e4SDavid E. O'Brien 	word = 0;
2275c80476e4SDavid E. O'Brien     }
2276c80476e4SDavid E. O'Brien 
2277c80476e4SDavid E. O'Brien     while (!found) {
22786767bd61SMark Peek 	ncp = c_preword(cp, bp, 1, STRshwordsep);
2279c80476e4SDavid E. O'Brien 	if (ncp == cp || Isspace(*ncp)) { /* beginning of line */
2280c80476e4SDavid E. O'Brien 	    hist++;
2281c80476e4SDavid E. O'Brien 	    word = 0;
2282c80476e4SDavid E. O'Brien 	    if (hp == NULL)
2283c80476e4SDavid E. O'Brien 		return(CC_ERROR);
2284c80476e4SDavid E. O'Brien 	    cp = expand_lex(hbuf, INBUFSIZE, &hp->Hlex, 0, NCARGS);
2285c80476e4SDavid E. O'Brien 	    *cp = '\0';
2286c80476e4SDavid E. O'Brien 	    bp = hbuf;
2287c80476e4SDavid E. O'Brien 	    hp = hp->Hnext;
2288c80476e4SDavid E. O'Brien 	    continue;
2289c80476e4SDavid E. O'Brien 	} else {
2290c80476e4SDavid E. O'Brien 	    word++;
22916767bd61SMark Peek 	    len = (int) (c_endword(ncp-1, cp, 1, STRshwordsep) - ncp + 1);
2292c80476e4SDavid E. O'Brien 	    cp = ncp;
2293c80476e4SDavid E. O'Brien 	}
2294c80476e4SDavid E. O'Brien 	if (len > patlen && Strncmp(cp, patbuf, patlen) == 0) {
2295c80476e4SDavid E. O'Brien 	    /* We don't fully check distinct matches as Gnuemacs does: */
2296c80476e4SDavid E. O'Brien 	    if (Argument > 1) {	/* just count matches */
2297c80476e4SDavid E. O'Brien 		if (++arg >= Argument)
2298c80476e4SDavid E. O'Brien 		    found++;
2299c80476e4SDavid E. O'Brien 	    } else {		/* match if distinct from previous */
2300c80476e4SDavid E. O'Brien 		if (len != Cursor - start || Strncmp(cp, start, len) != 0)
2301c80476e4SDavid E. O'Brien 		    found++;
2302c80476e4SDavid E. O'Brien 	    }
2303c80476e4SDavid E. O'Brien 	}
2304c80476e4SDavid E. O'Brien     }
2305c80476e4SDavid E. O'Brien 
2306c80476e4SDavid E. O'Brien     if (LastChar + len - (Cursor - start) >= InputLim)
2307c80476e4SDavid E. O'Brien 	return(CC_ERROR);	/* no room */
2308c80476e4SDavid E. O'Brien     DeleteBack(Cursor - start);
2309c80476e4SDavid E. O'Brien     c_insert(len);
2310c80476e4SDavid E. O'Brien     while (len--)
2311c80476e4SDavid E. O'Brien 	*Cursor++ = *cp++;
2312c80476e4SDavid E. O'Brien     oldcursor = Cursor;
2313c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2314c80476e4SDavid E. O'Brien }
2315c80476e4SDavid E. O'Brien 
2316c80476e4SDavid E. O'Brien /*ARGSUSED*/
2317c80476e4SDavid E. O'Brien CCRETVAL
2318c80476e4SDavid E. O'Brien e_yank_kill(c)
2319c80476e4SDavid E. O'Brien     int c;
2320c80476e4SDavid E. O'Brien {				/* almost like GnuEmacs */
23216767bd61SMark Peek     int len;
23226767bd61SMark Peek     Char *kp, *cp;
2323c80476e4SDavid E. O'Brien 
2324c80476e4SDavid E. O'Brien     USE(c);
23256767bd61SMark Peek     if (KillRingLen == 0)	/* nothing killed */
2326c80476e4SDavid E. O'Brien 	return(CC_ERROR);
23276767bd61SMark Peek     len = Strlen(KillRing[YankPos].buf);
23286767bd61SMark Peek     if (LastChar + len >= InputLim)
2329c80476e4SDavid E. O'Brien 	return(CC_ERROR);	/* end of buffer space */
2330c80476e4SDavid E. O'Brien 
2331c80476e4SDavid E. O'Brien     /* else */
2332c80476e4SDavid E. O'Brien     cp = Cursor;		/* for speed */
2333c80476e4SDavid E. O'Brien 
23346767bd61SMark Peek     c_insert(len);		/* open the space, */
23356767bd61SMark Peek     for (kp = KillRing[YankPos].buf; *kp; kp++)	/* copy the chars */
2336c80476e4SDavid E. O'Brien 	*cp++ = *kp;
2337c80476e4SDavid E. O'Brien 
23386767bd61SMark Peek     if (Argument == 1) {	/* if no arg */
23396767bd61SMark Peek 	Mark = Cursor;		/* mark at beginning, cursor at end */
23406767bd61SMark Peek 	Cursor = cp;
23416767bd61SMark Peek     } else {
23426767bd61SMark Peek 	Mark = cp;		/* else cursor at beginning, mark at end */
23436767bd61SMark Peek     }
23446767bd61SMark Peek 
23456767bd61SMark Peek     return(CC_REFRESH);
23466767bd61SMark Peek }
23476767bd61SMark Peek 
23486767bd61SMark Peek /*ARGSUSED*/
23496767bd61SMark Peek CCRETVAL
23506767bd61SMark Peek e_yank_pop(c)
23516767bd61SMark Peek     int c;
23526767bd61SMark Peek {				/* almost like GnuEmacs */
23536767bd61SMark Peek     int m_bef_c, del_len, ins_len;
23546767bd61SMark Peek     Char *kp, *cp;
23556767bd61SMark Peek 
23566767bd61SMark Peek     USE(c);
23576767bd61SMark Peek 
23586767bd61SMark Peek #if 0
23596767bd61SMark Peek     /* XXX This "should" be here, but doesn't work, since LastCmd
23606767bd61SMark Peek        gets set on CC_ERROR and CC_ARGHACK, which it shouldn't(?).
23616767bd61SMark Peek        (But what about F_ARGFOUR?) I.e. if you hit M-y twice the
23626767bd61SMark Peek        second one will "succeed" even if the first one wasn't preceded
23636767bd61SMark Peek        by a yank, and giving an argument is impossible. Now we "succeed"
23646767bd61SMark Peek        regardless of previous command, which is wrong too of course. */
23656767bd61SMark Peek     if (LastCmd != F_YANK_KILL && LastCmd != F_YANK_POP)
23666767bd61SMark Peek 	return(CC_ERROR);
23676767bd61SMark Peek #endif
23686767bd61SMark Peek 
23696767bd61SMark Peek     if (KillRingLen == 0)	/* nothing killed */
23706767bd61SMark Peek 	return(CC_ERROR);
23716767bd61SMark Peek     YankPos -= Argument;
23726767bd61SMark Peek     while (YankPos < 0)
23736767bd61SMark Peek 	YankPos += KillRingLen;
23746767bd61SMark Peek     YankPos %= KillRingLen;
23756767bd61SMark Peek 
23766767bd61SMark Peek     if (Cursor > Mark) {
23776767bd61SMark Peek 	del_len = Cursor - Mark;
23786767bd61SMark Peek 	m_bef_c = 1;
23796767bd61SMark Peek     } else {
23806767bd61SMark Peek 	del_len = Mark - Cursor;
23816767bd61SMark Peek 	m_bef_c = 0;
23826767bd61SMark Peek     }
23836767bd61SMark Peek     ins_len = Strlen(KillRing[YankPos].buf);
23846767bd61SMark Peek     if (LastChar + ins_len - del_len >= InputLim)
23856767bd61SMark Peek 	return(CC_ERROR);	/* end of buffer space */
23866767bd61SMark Peek 
23876767bd61SMark Peek     if (m_bef_c) {
23886767bd61SMark Peek 	c_delbefore(del_len);
23896767bd61SMark Peek 	Cursor = Mark;
23906767bd61SMark Peek     } else {
23916767bd61SMark Peek 	c_delafter(del_len);
23926767bd61SMark Peek     }
23936767bd61SMark Peek     cp = Cursor;		/* for speed */
23946767bd61SMark Peek 
23956767bd61SMark Peek     c_insert(ins_len);		/* open the space, */
23966767bd61SMark Peek     for (kp = KillRing[YankPos].buf; *kp; kp++)	/* copy the chars */
23976767bd61SMark Peek 	*cp++ = *kp;
23986767bd61SMark Peek 
23996767bd61SMark Peek     if (m_bef_c) {
24006767bd61SMark Peek 	Mark = Cursor;		/* mark at beginning, cursor at end */
24016767bd61SMark Peek 	Cursor = cp;
24026767bd61SMark Peek     } else {
24036767bd61SMark Peek 	Mark = cp;		/* else cursor at beginning, mark at end */
24046767bd61SMark Peek     }
2405c80476e4SDavid E. O'Brien 
2406c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2407c80476e4SDavid E. O'Brien }
2408c80476e4SDavid E. O'Brien 
2409c80476e4SDavid E. O'Brien /*ARGSUSED*/
2410c80476e4SDavid E. O'Brien CCRETVAL
2411c80476e4SDavid E. O'Brien v_delprev(c) 		/* Backspace key in insert mode */
2412c80476e4SDavid E. O'Brien     int c;
2413c80476e4SDavid E. O'Brien {
2414c80476e4SDavid E. O'Brien     int rc;
2415c80476e4SDavid E. O'Brien 
2416c80476e4SDavid E. O'Brien     USE(c);
2417c80476e4SDavid E. O'Brien     rc = CC_ERROR;
2418c80476e4SDavid E. O'Brien 
2419c80476e4SDavid E. O'Brien     if (InsertPos != 0) {
2420c80476e4SDavid E. O'Brien 	if (Argument <= Cursor - InsertPos) {
2421c80476e4SDavid E. O'Brien 	    c_delbefore(Argument);	/* delete before */
2422c80476e4SDavid E. O'Brien 	    Cursor -= Argument;
2423c80476e4SDavid E. O'Brien #if defined(DSPMBYTE)
2424c80476e4SDavid E. O'Brien 	if (_enable_mbdisp && extdel) {
2425c80476e4SDavid E. O'Brien 	    Cursor--;
2426c80476e4SDavid E. O'Brien 	    e_redisp(c);
2427c80476e4SDavid E. O'Brien 	}
2428c80476e4SDavid E. O'Brien #endif
2429c80476e4SDavid E. O'Brien 	    rc = CC_REFRESH;
2430c80476e4SDavid E. O'Brien 	}
2431c80476e4SDavid E. O'Brien     }
2432c80476e4SDavid E. O'Brien     return(rc);
2433c80476e4SDavid E. O'Brien }   /* v_delprev  */
2434c80476e4SDavid E. O'Brien 
2435c80476e4SDavid E. O'Brien /*ARGSUSED*/
2436c80476e4SDavid E. O'Brien CCRETVAL
2437c80476e4SDavid E. O'Brien e_delprev(c)
2438c80476e4SDavid E. O'Brien     int c;
2439c80476e4SDavid E. O'Brien {
2440c80476e4SDavid E. O'Brien     USE(c);
2441c80476e4SDavid E. O'Brien     if (Cursor > InputBuf) {
2442c80476e4SDavid E. O'Brien 	c_delbefore(Argument);	/* delete before dot */
2443c80476e4SDavid E. O'Brien 	if (Argument > Cursor - InputBuf)
2444c80476e4SDavid E. O'Brien 	    Cursor = InputBuf;	/* bounds check */
2445c80476e4SDavid E. O'Brien 	else
2446c80476e4SDavid E. O'Brien 	    Cursor -= Argument;
2447c80476e4SDavid E. O'Brien #if defined(DSPMBYTE)
2448c80476e4SDavid E. O'Brien 	if (_enable_mbdisp && extdel && Cursor > InputBuf) {
2449c80476e4SDavid E. O'Brien 	    Cursor--;
2450c80476e4SDavid E. O'Brien 	    e_redisp(c);
2451c80476e4SDavid E. O'Brien 	}
2452c80476e4SDavid E. O'Brien #endif
2453c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
2454c80476e4SDavid E. O'Brien     }
2455c80476e4SDavid E. O'Brien     else {
2456c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2457c80476e4SDavid E. O'Brien     }
2458c80476e4SDavid E. O'Brien }
2459c80476e4SDavid E. O'Brien 
2460c80476e4SDavid E. O'Brien /*ARGSUSED*/
2461c80476e4SDavid E. O'Brien CCRETVAL
2462c80476e4SDavid E. O'Brien e_delwordprev(c)
2463c80476e4SDavid E. O'Brien     int c;
2464c80476e4SDavid E. O'Brien {
24656767bd61SMark Peek     Char *cp;
2466c80476e4SDavid E. O'Brien 
2467c80476e4SDavid E. O'Brien     USE(c);
2468c80476e4SDavid E. O'Brien     if (Cursor == InputBuf)
2469c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2470c80476e4SDavid E. O'Brien     /* else */
2471c80476e4SDavid E. O'Brien 
2472c80476e4SDavid E. O'Brien     cp = c_prev_word(Cursor, InputBuf, Argument);
2473c80476e4SDavid E. O'Brien 
24746767bd61SMark Peek     c_push_kill(cp, Cursor);	/* save the text */
2475c80476e4SDavid E. O'Brien 
2476c80476e4SDavid E. O'Brien     c_delbefore((int)(Cursor - cp));	/* delete before dot */
2477c80476e4SDavid E. O'Brien     Cursor = cp;
2478c80476e4SDavid E. O'Brien     if (Cursor < InputBuf)
2479c80476e4SDavid E. O'Brien 	Cursor = InputBuf;	/* bounds check */
2480c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2481c80476e4SDavid E. O'Brien }
2482c80476e4SDavid E. O'Brien 
2483c80476e4SDavid E. O'Brien /* DCS <dcs@neutron.chem.yale.edu>, 9 Oct 93
2484c80476e4SDavid E. O'Brien  *
2485c80476e4SDavid E. O'Brien  * Changed the names of some of the ^D family of editor functions to
2486c80476e4SDavid E. O'Brien  * correspond to what they actually do and created new e_delnext_list
2487c80476e4SDavid E. O'Brien  * for completeness.
2488c80476e4SDavid E. O'Brien  *
2489c80476e4SDavid E. O'Brien  *   Old names:			New names:
2490c80476e4SDavid E. O'Brien  *
2491c80476e4SDavid E. O'Brien  *   delete-char		delete-char-or-eof
2492c80476e4SDavid E. O'Brien  *     F_DELNEXT		  F_DELNEXT_EOF
2493c80476e4SDavid E. O'Brien  *     e_delnext		  e_delnext_eof
2494c80476e4SDavid E. O'Brien  *     edelnxt			  edelnxteof
2495c80476e4SDavid E. O'Brien  *   delete-char-or-eof		delete-char
2496c80476e4SDavid E. O'Brien  *     F_DELNEXT_EOF		  F_DELNEXT
2497c80476e4SDavid E. O'Brien  *     e_delnext_eof		  e_delnext
2498c80476e4SDavid E. O'Brien  *     edelnxteof		  edelnxt
2499c80476e4SDavid E. O'Brien  *   delete-char-or-list	delete-char-or-list-or-eof
2500c80476e4SDavid E. O'Brien  *     F_LIST_DELNEXT		  F_DELNEXT_LIST_EOF
2501c80476e4SDavid E. O'Brien  *     e_list_delnext		  e_delnext_list_eof
2502c80476e4SDavid E. O'Brien  *   				  edellsteof
2503c80476e4SDavid E. O'Brien  *   (no old equivalent)	delete-char-or-list
2504c80476e4SDavid E. O'Brien  *   				  F_DELNEXT_LIST
2505c80476e4SDavid E. O'Brien  *   				  e_delnext_list
2506c80476e4SDavid E. O'Brien  *   				  e_delnxtlst
2507c80476e4SDavid E. O'Brien  */
2508c80476e4SDavid E. O'Brien 
2509c80476e4SDavid E. O'Brien /* added by mtk@ari.ncl.omron.co.jp (920818) */
2510c80476e4SDavid E. O'Brien /* rename e_delnext() -> e_delnext_eof() */
2511c80476e4SDavid E. O'Brien /*ARGSUSED*/
2512c80476e4SDavid E. O'Brien CCRETVAL
2513c80476e4SDavid E. O'Brien e_delnext(c)
2514c80476e4SDavid E. O'Brien     int c;
2515c80476e4SDavid E. O'Brien {
2516c80476e4SDavid E. O'Brien     USE(c);
2517c80476e4SDavid E. O'Brien     if (Cursor == LastChar) {/* if I'm at the end */
2518c80476e4SDavid E. O'Brien 	if (!VImode) {
2519c80476e4SDavid E. O'Brien 		return(CC_ERROR);
2520c80476e4SDavid E. O'Brien 	}
2521c80476e4SDavid E. O'Brien 	else {
2522c80476e4SDavid E. O'Brien 	    if (Cursor != InputBuf)
2523c80476e4SDavid E. O'Brien 		Cursor--;
2524c80476e4SDavid E. O'Brien 	    else
2525c80476e4SDavid E. O'Brien 		return(CC_ERROR);
2526c80476e4SDavid E. O'Brien 	}
2527c80476e4SDavid E. O'Brien     }
2528c80476e4SDavid E. O'Brien     c_delafter(Argument);	/* delete after dot */
2529c80476e4SDavid E. O'Brien     if (Cursor > LastChar)
2530c80476e4SDavid E. O'Brien 	Cursor = LastChar;	/* bounds check */
2531c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2532c80476e4SDavid E. O'Brien }
2533c80476e4SDavid E. O'Brien 
2534c80476e4SDavid E. O'Brien 
2535c80476e4SDavid E. O'Brien /*ARGSUSED*/
2536c80476e4SDavid E. O'Brien CCRETVAL
2537c80476e4SDavid E. O'Brien e_delnext_eof(c)
2538c80476e4SDavid E. O'Brien     int c;
2539c80476e4SDavid E. O'Brien {
2540c80476e4SDavid E. O'Brien     USE(c);
2541c80476e4SDavid E. O'Brien     if (Cursor == LastChar) {/* if I'm at the end */
2542c80476e4SDavid E. O'Brien 	if (!VImode) {
2543c80476e4SDavid E. O'Brien 	    if (Cursor == InputBuf) {
2544c80476e4SDavid E. O'Brien 		/* if I'm also at the beginning */
2545c80476e4SDavid E. O'Brien 		so_write(STReof, 4);/* then do a EOF */
2546c80476e4SDavid E. O'Brien 		flush();
2547c80476e4SDavid E. O'Brien 		return(CC_EOF);
2548c80476e4SDavid E. O'Brien 	    }
2549c80476e4SDavid E. O'Brien 	    else
2550c80476e4SDavid E. O'Brien 		return(CC_ERROR);
2551c80476e4SDavid E. O'Brien 	}
2552c80476e4SDavid E. O'Brien 	else {
2553c80476e4SDavid E. O'Brien 	    if (Cursor != InputBuf)
2554c80476e4SDavid E. O'Brien 		Cursor--;
2555c80476e4SDavid E. O'Brien 	    else
2556c80476e4SDavid E. O'Brien 		return(CC_ERROR);
2557c80476e4SDavid E. O'Brien 	}
2558c80476e4SDavid E. O'Brien     }
2559c80476e4SDavid E. O'Brien     c_delafter(Argument);	/* delete after dot */
2560c80476e4SDavid E. O'Brien     if (Cursor > LastChar)
2561c80476e4SDavid E. O'Brien 	Cursor = LastChar;	/* bounds check */
2562c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2563c80476e4SDavid E. O'Brien }
2564c80476e4SDavid E. O'Brien 
2565c80476e4SDavid E. O'Brien /*ARGSUSED*/
2566c80476e4SDavid E. O'Brien CCRETVAL
2567c80476e4SDavid E. O'Brien e_delnext_list(c)
2568c80476e4SDavid E. O'Brien     int c;
2569c80476e4SDavid E. O'Brien {
2570c80476e4SDavid E. O'Brien     USE(c);
2571c80476e4SDavid E. O'Brien     if (Cursor == LastChar) {	/* if I'm at the end */
2572c80476e4SDavid E. O'Brien 	PastBottom();
2573c80476e4SDavid E. O'Brien 	*LastChar = '\0';	/* just in case */
2574c80476e4SDavid E. O'Brien 	return(CC_LIST_CHOICES);
2575c80476e4SDavid E. O'Brien     }
2576c80476e4SDavid E. O'Brien     else {
2577c80476e4SDavid E. O'Brien 	c_delafter(Argument);	/* delete after dot */
2578c80476e4SDavid E. O'Brien 	if (Cursor > LastChar)
2579c80476e4SDavid E. O'Brien 	    Cursor = LastChar;	/* bounds check */
2580c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
2581c80476e4SDavid E. O'Brien     }
2582c80476e4SDavid E. O'Brien }
2583c80476e4SDavid E. O'Brien 
2584c80476e4SDavid E. O'Brien /*ARGSUSED*/
2585c80476e4SDavid E. O'Brien CCRETVAL
2586c80476e4SDavid E. O'Brien e_delnext_list_eof(c)
2587c80476e4SDavid E. O'Brien     int c;
2588c80476e4SDavid E. O'Brien {
2589c80476e4SDavid E. O'Brien     USE(c);
2590c80476e4SDavid E. O'Brien     if (Cursor == LastChar) {	/* if I'm at the end */
2591c80476e4SDavid E. O'Brien 	if (Cursor == InputBuf) {	/* if I'm also at the beginning */
2592c80476e4SDavid E. O'Brien 	    so_write(STReof, 4);/* then do a EOF */
2593c80476e4SDavid E. O'Brien 	    flush();
2594c80476e4SDavid E. O'Brien 	    return(CC_EOF);
2595c80476e4SDavid E. O'Brien 	}
2596c80476e4SDavid E. O'Brien 	else {
2597c80476e4SDavid E. O'Brien 	    PastBottom();
2598c80476e4SDavid E. O'Brien 	    *LastChar = '\0';	/* just in case */
2599c80476e4SDavid E. O'Brien 	    return(CC_LIST_CHOICES);
2600c80476e4SDavid E. O'Brien 	}
2601c80476e4SDavid E. O'Brien     }
2602c80476e4SDavid E. O'Brien     else {
2603c80476e4SDavid E. O'Brien 	c_delafter(Argument);	/* delete after dot */
2604c80476e4SDavid E. O'Brien 	if (Cursor > LastChar)
2605c80476e4SDavid E. O'Brien 	    Cursor = LastChar;	/* bounds check */
2606c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
2607c80476e4SDavid E. O'Brien     }
2608c80476e4SDavid E. O'Brien }
2609c80476e4SDavid E. O'Brien 
2610c80476e4SDavid E. O'Brien /*ARGSUSED*/
2611c80476e4SDavid E. O'Brien CCRETVAL
2612c80476e4SDavid E. O'Brien e_list_eof(c)
2613c80476e4SDavid E. O'Brien     int c;
2614c80476e4SDavid E. O'Brien {
2615c80476e4SDavid E. O'Brien     CCRETVAL rv;
2616c80476e4SDavid E. O'Brien 
2617c80476e4SDavid E. O'Brien     USE(c);
2618c80476e4SDavid E. O'Brien     if (Cursor == LastChar && Cursor == InputBuf) {
2619c80476e4SDavid E. O'Brien 	so_write(STReof, 4);	/* then do a EOF */
2620c80476e4SDavid E. O'Brien 	flush();
2621c80476e4SDavid E. O'Brien 	rv = CC_EOF;
2622c80476e4SDavid E. O'Brien     }
2623c80476e4SDavid E. O'Brien     else {
2624c80476e4SDavid E. O'Brien 	PastBottom();
2625c80476e4SDavid E. O'Brien 	*LastChar = '\0';	/* just in case */
2626c80476e4SDavid E. O'Brien 	rv = CC_LIST_CHOICES;
2627c80476e4SDavid E. O'Brien     }
2628c80476e4SDavid E. O'Brien     return rv;
2629c80476e4SDavid E. O'Brien }
2630c80476e4SDavid E. O'Brien 
2631c80476e4SDavid E. O'Brien /*ARGSUSED*/
2632c80476e4SDavid E. O'Brien CCRETVAL
2633c80476e4SDavid E. O'Brien e_delwordnext(c)
2634c80476e4SDavid E. O'Brien     int c;
2635c80476e4SDavid E. O'Brien {
26366767bd61SMark Peek     Char *cp;
2637c80476e4SDavid E. O'Brien 
2638c80476e4SDavid E. O'Brien     USE(c);
2639c80476e4SDavid E. O'Brien     if (Cursor == LastChar)
2640c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2641c80476e4SDavid E. O'Brien     /* else */
2642c80476e4SDavid E. O'Brien 
2643c80476e4SDavid E. O'Brien     cp = c_next_word(Cursor, LastChar, Argument);
2644c80476e4SDavid E. O'Brien 
26456767bd61SMark Peek     c_push_kill(Cursor, cp);	/* save the text */
2646c80476e4SDavid E. O'Brien 
2647c80476e4SDavid E. O'Brien     c_delafter((int)(cp - Cursor));	/* delete after dot */
2648c80476e4SDavid E. O'Brien     if (Cursor > LastChar)
2649c80476e4SDavid E. O'Brien 	Cursor = LastChar;	/* bounds check */
2650c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2651c80476e4SDavid E. O'Brien }
2652c80476e4SDavid E. O'Brien 
2653c80476e4SDavid E. O'Brien /*ARGSUSED*/
2654c80476e4SDavid E. O'Brien CCRETVAL
2655c80476e4SDavid E. O'Brien e_toend(c)
2656c80476e4SDavid E. O'Brien     int c;
2657c80476e4SDavid E. O'Brien {
2658c80476e4SDavid E. O'Brien     USE(c);
2659c80476e4SDavid E. O'Brien     Cursor = LastChar;
2660c80476e4SDavid E. O'Brien     if (VImode)
2661c80476e4SDavid E. O'Brien 	if (ActionFlag & TCSHOP_DELETE) {
2662c80476e4SDavid E. O'Brien 	    c_delfini();
2663c80476e4SDavid E. O'Brien 	    return(CC_REFRESH);
2664c80476e4SDavid E. O'Brien 	}
2665c80476e4SDavid E. O'Brien     RefCursor();		/* move the cursor */
2666c80476e4SDavid E. O'Brien     return(CC_NORM);
2667c80476e4SDavid E. O'Brien }
2668c80476e4SDavid E. O'Brien 
2669c80476e4SDavid E. O'Brien /*ARGSUSED*/
2670c80476e4SDavid E. O'Brien CCRETVAL
2671c80476e4SDavid E. O'Brien e_tobeg(c)
2672c80476e4SDavid E. O'Brien     int c;
2673c80476e4SDavid E. O'Brien {
2674c80476e4SDavid E. O'Brien     USE(c);
2675c80476e4SDavid E. O'Brien     Cursor = InputBuf;
2676c80476e4SDavid E. O'Brien 
2677c80476e4SDavid E. O'Brien     if (VImode) {
2678c80476e4SDavid E. O'Brien        while (Isspace(*Cursor)) /* We want FIRST non space character */
2679c80476e4SDavid E. O'Brien 	Cursor++;
2680c80476e4SDavid E. O'Brien 	if (ActionFlag & TCSHOP_DELETE) {
2681c80476e4SDavid E. O'Brien 	    c_delfini();
2682c80476e4SDavid E. O'Brien 	    return(CC_REFRESH);
2683c80476e4SDavid E. O'Brien 	}
2684c80476e4SDavid E. O'Brien     }
2685c80476e4SDavid E. O'Brien 
2686c80476e4SDavid E. O'Brien     RefCursor();		/* move the cursor */
2687c80476e4SDavid E. O'Brien     return(CC_NORM);
2688c80476e4SDavid E. O'Brien }
2689c80476e4SDavid E. O'Brien 
2690c80476e4SDavid E. O'Brien /*ARGSUSED*/
2691c80476e4SDavid E. O'Brien CCRETVAL
2692c80476e4SDavid E. O'Brien e_killend(c)
2693c80476e4SDavid E. O'Brien     int c;
2694c80476e4SDavid E. O'Brien {
2695c80476e4SDavid E. O'Brien     USE(c);
26966767bd61SMark Peek     c_push_kill(Cursor, LastChar); /* copy it */
2697c80476e4SDavid E. O'Brien     LastChar = Cursor;		/* zap! -- delete to end */
2698c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2699c80476e4SDavid E. O'Brien }
2700c80476e4SDavid E. O'Brien 
2701c80476e4SDavid E. O'Brien 
2702c80476e4SDavid E. O'Brien /*ARGSUSED*/
2703c80476e4SDavid E. O'Brien CCRETVAL
2704c80476e4SDavid E. O'Brien e_killbeg(c)
2705c80476e4SDavid E. O'Brien     int c;
2706c80476e4SDavid E. O'Brien {
2707c80476e4SDavid E. O'Brien     USE(c);
27086767bd61SMark Peek     c_push_kill(InputBuf, Cursor); /* copy it */
2709c80476e4SDavid E. O'Brien     c_delbefore((int)(Cursor - InputBuf));
2710c80476e4SDavid E. O'Brien     Cursor = InputBuf;		/* zap! */
2711c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2712c80476e4SDavid E. O'Brien }
2713c80476e4SDavid E. O'Brien 
2714c80476e4SDavid E. O'Brien /*ARGSUSED*/
2715c80476e4SDavid E. O'Brien CCRETVAL
2716c80476e4SDavid E. O'Brien e_killall(c)
2717c80476e4SDavid E. O'Brien     int c;
2718c80476e4SDavid E. O'Brien {
2719c80476e4SDavid E. O'Brien     USE(c);
27206767bd61SMark Peek     c_push_kill(InputBuf, LastChar); /* copy it */
2721c80476e4SDavid E. O'Brien     LastChar = InputBuf;	/* zap! -- delete all of it */
2722c80476e4SDavid E. O'Brien     Cursor = InputBuf;
2723c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2724c80476e4SDavid E. O'Brien }
2725c80476e4SDavid E. O'Brien 
2726c80476e4SDavid E. O'Brien /*ARGSUSED*/
2727c80476e4SDavid E. O'Brien CCRETVAL
2728c80476e4SDavid E. O'Brien e_killregion(c)
2729c80476e4SDavid E. O'Brien     int c;
2730c80476e4SDavid E. O'Brien {
2731c80476e4SDavid E. O'Brien     USE(c);
2732c80476e4SDavid E. O'Brien     if (!Mark)
2733c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2734c80476e4SDavid E. O'Brien 
2735c80476e4SDavid E. O'Brien     if (Mark > Cursor) {
27366767bd61SMark Peek 	c_push_kill(Cursor, Mark); /* copy it */
27376767bd61SMark Peek 	c_delafter((int)(Mark - Cursor)); /* delete it - UNUSED BY VI mode */
27386767bd61SMark Peek 	Mark = Cursor;
2739c80476e4SDavid E. O'Brien     }
2740c80476e4SDavid E. O'Brien     else {			/* mark is before cursor */
27416767bd61SMark Peek 	c_push_kill(Mark, Cursor); /* copy it */
27426767bd61SMark Peek 	c_delbefore((int)(Cursor - Mark));
2743c80476e4SDavid E. O'Brien 	Cursor = Mark;
2744c80476e4SDavid E. O'Brien     }
2745c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2746c80476e4SDavid E. O'Brien }
2747c80476e4SDavid E. O'Brien 
2748c80476e4SDavid E. O'Brien /*ARGSUSED*/
2749c80476e4SDavid E. O'Brien CCRETVAL
2750c80476e4SDavid E. O'Brien e_copyregion(c)
2751c80476e4SDavid E. O'Brien     int c;
2752c80476e4SDavid E. O'Brien {
2753c80476e4SDavid E. O'Brien     USE(c);
2754c80476e4SDavid E. O'Brien     if (!Mark)
2755c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2756c80476e4SDavid E. O'Brien 
2757c80476e4SDavid E. O'Brien     if (Mark > Cursor) {
27586767bd61SMark Peek 	c_push_kill(Cursor, Mark); /* copy it */
2759c80476e4SDavid E. O'Brien     }
2760c80476e4SDavid E. O'Brien     else {			/* mark is before cursor */
27616767bd61SMark Peek 	c_push_kill(Mark, Cursor); /* copy it */
2762c80476e4SDavid E. O'Brien     }
2763c80476e4SDavid E. O'Brien     return(CC_NORM);		/* don't even need to Refresh() */
2764c80476e4SDavid E. O'Brien }
2765c80476e4SDavid E. O'Brien 
2766c80476e4SDavid E. O'Brien /*ARGSUSED*/
2767c80476e4SDavid E. O'Brien CCRETVAL
2768c80476e4SDavid E. O'Brien e_charswitch(cc)
2769c80476e4SDavid E. O'Brien     int cc;
2770c80476e4SDavid E. O'Brien {
27716767bd61SMark Peek     Char c;
2772c80476e4SDavid E. O'Brien 
2773c80476e4SDavid E. O'Brien     USE(cc);
2774c80476e4SDavid E. O'Brien 
2775c80476e4SDavid E. O'Brien     /* do nothing if we are at beginning of line or have only one char */
2776c80476e4SDavid E. O'Brien     if (Cursor == &InputBuf[0] || LastChar == &InputBuf[1]) {
2777c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2778c80476e4SDavid E. O'Brien     }
2779c80476e4SDavid E. O'Brien 
2780c80476e4SDavid E. O'Brien     if (Cursor < LastChar) {
2781c80476e4SDavid E. O'Brien 	Cursor++;
2782c80476e4SDavid E. O'Brien     }
2783c80476e4SDavid E. O'Brien     c = Cursor[-2];
2784c80476e4SDavid E. O'Brien     Cursor[-2] = Cursor[-1];
2785c80476e4SDavid E. O'Brien     Cursor[-1] = c;
2786c80476e4SDavid E. O'Brien     return(CC_REFRESH);
2787c80476e4SDavid E. O'Brien }
2788c80476e4SDavid E. O'Brien 
2789c80476e4SDavid E. O'Brien /*ARGSUSED*/
2790c80476e4SDavid E. O'Brien CCRETVAL
2791c80476e4SDavid E. O'Brien e_gcharswitch(cc)
2792c80476e4SDavid E. O'Brien     int cc;
2793c80476e4SDavid E. O'Brien {				/* gosmacs style ^T */
27946767bd61SMark Peek     Char c;
2795c80476e4SDavid E. O'Brien 
2796c80476e4SDavid E. O'Brien     USE(cc);
2797c80476e4SDavid E. O'Brien     if (Cursor > &InputBuf[1]) {/* must have at least two chars entered */
2798c80476e4SDavid E. O'Brien 	c = Cursor[-2];
2799c80476e4SDavid E. O'Brien 	Cursor[-2] = Cursor[-1];
2800c80476e4SDavid E. O'Brien 	Cursor[-1] = c;
2801c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
2802c80476e4SDavid E. O'Brien     }
2803c80476e4SDavid E. O'Brien     else {
2804c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2805c80476e4SDavid E. O'Brien     }
2806c80476e4SDavid E. O'Brien }
2807c80476e4SDavid E. O'Brien 
2808c80476e4SDavid E. O'Brien #if defined(DSPMBYTE) /* BY TAGA Nayuta VERY THANKS */
2809c80476e4SDavid E. O'Brien /*ARGSUSED*/
2810c80476e4SDavid E. O'Brien static void
2811c80476e4SDavid E. O'Brien e_charback_mbyte(argument)
2812c80476e4SDavid E. O'Brien      int argument;
2813c80476e4SDavid E. O'Brien {
2814c80476e4SDavid E. O'Brien     if (!_enable_mbdisp) {
2815c80476e4SDavid E. O'Brien 	if (Argument > Cursor - InputBuf)
2816c80476e4SDavid E. O'Brien 	    Cursor = InputBuf;
2817c80476e4SDavid E. O'Brien 	else
2818c80476e4SDavid E. O'Brien 	    Cursor -= Argument;
2819c80476e4SDavid E. O'Brien     }
2820c80476e4SDavid E. O'Brien     else {
2821c80476e4SDavid E. O'Brien 	while (0 < argument && Cursor > InputBuf) {
2822c80476e4SDavid E. O'Brien 	    if (Cursor - 1 != InputBuf &&
2823c80476e4SDavid E. O'Brien 		Ismbyte1(*(Cursor - 2)) && Ismbyte2(*(Cursor - 1))) {
2824c80476e4SDavid E. O'Brien 		Cursor--;
2825c80476e4SDavid E. O'Brien 	    }
2826c80476e4SDavid E. O'Brien 	    Cursor--;
2827c80476e4SDavid E. O'Brien 	    argument--;
2828c80476e4SDavid E. O'Brien 	}
2829c80476e4SDavid E. O'Brien     }
2830c80476e4SDavid E. O'Brien }
2831c80476e4SDavid E. O'Brien #endif
2832c80476e4SDavid E. O'Brien 
2833c80476e4SDavid E. O'Brien /*ARGSUSED*/
2834c80476e4SDavid E. O'Brien CCRETVAL
2835c80476e4SDavid E. O'Brien e_charback(c)
2836c80476e4SDavid E. O'Brien     int c;
2837c80476e4SDavid E. O'Brien {
2838c80476e4SDavid E. O'Brien     USE(c);
2839c80476e4SDavid E. O'Brien     if (Cursor > InputBuf) {
2840c80476e4SDavid E. O'Brien #if defined(DSPMBYTE) /* BY TAGA Nayuta VERY THANKS */
2841c80476e4SDavid E. O'Brien 	e_charback_mbyte(Argument);
2842c80476e4SDavid E. O'Brien #else
2843c80476e4SDavid E. O'Brien 	if (Argument > Cursor - InputBuf)
2844c80476e4SDavid E. O'Brien 	    Cursor = InputBuf;
2845c80476e4SDavid E. O'Brien 	else
2846c80476e4SDavid E. O'Brien 	    Cursor -= Argument;
2847c80476e4SDavid E. O'Brien #endif
2848c80476e4SDavid E. O'Brien 
2849c80476e4SDavid E. O'Brien 	if (VImode)
2850c80476e4SDavid E. O'Brien 	    if (ActionFlag & TCSHOP_DELETE) {
2851c80476e4SDavid E. O'Brien 		c_delfini();
2852c80476e4SDavid E. O'Brien 		return(CC_REFRESH);
2853c80476e4SDavid E. O'Brien 	    }
2854c80476e4SDavid E. O'Brien 
2855c80476e4SDavid E. O'Brien 	RefCursor();
2856c80476e4SDavid E. O'Brien 	return(CC_NORM);
2857c80476e4SDavid E. O'Brien     }
2858c80476e4SDavid E. O'Brien     else {
2859c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2860c80476e4SDavid E. O'Brien     }
2861c80476e4SDavid E. O'Brien }
2862c80476e4SDavid E. O'Brien 
2863c80476e4SDavid E. O'Brien /*ARGSUSED*/
2864c80476e4SDavid E. O'Brien CCRETVAL
2865c80476e4SDavid E. O'Brien v_wordback(c)
2866c80476e4SDavid E. O'Brien     int c;
2867c80476e4SDavid E. O'Brien {
2868c80476e4SDavid E. O'Brien     USE(c);
2869c80476e4SDavid E. O'Brien     if (Cursor == InputBuf)
2870c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2871c80476e4SDavid E. O'Brien     /* else */
2872c80476e4SDavid E. O'Brien 
28736767bd61SMark Peek     Cursor = c_preword(Cursor, InputBuf, Argument, STRshwspace); /* bounds check */
2874c80476e4SDavid E. O'Brien 
2875c80476e4SDavid E. O'Brien     if (ActionFlag & TCSHOP_DELETE) {
2876c80476e4SDavid E. O'Brien 	c_delfini();
2877c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
2878c80476e4SDavid E. O'Brien     }
2879c80476e4SDavid E. O'Brien 
2880c80476e4SDavid E. O'Brien     RefCursor();
2881c80476e4SDavid E. O'Brien     return(CC_NORM);
2882c80476e4SDavid E. O'Brien }
2883c80476e4SDavid E. O'Brien 
2884c80476e4SDavid E. O'Brien /*ARGSUSED*/
2885c80476e4SDavid E. O'Brien CCRETVAL
2886c80476e4SDavid E. O'Brien e_wordback(c)
2887c80476e4SDavid E. O'Brien     int c;
2888c80476e4SDavid E. O'Brien {
2889c80476e4SDavid E. O'Brien     USE(c);
2890c80476e4SDavid E. O'Brien     if (Cursor == InputBuf)
2891c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2892c80476e4SDavid E. O'Brien     /* else */
2893c80476e4SDavid E. O'Brien 
2894c80476e4SDavid E. O'Brien     Cursor = c_prev_word(Cursor, InputBuf, Argument); /* bounds check */
2895c80476e4SDavid E. O'Brien 
2896c80476e4SDavid E. O'Brien     if (VImode)
2897c80476e4SDavid E. O'Brien 	if (ActionFlag & TCSHOP_DELETE) {
2898c80476e4SDavid E. O'Brien 	    c_delfini();
2899c80476e4SDavid E. O'Brien 	    return(CC_REFRESH);
2900c80476e4SDavid E. O'Brien 	}
2901c80476e4SDavid E. O'Brien 
2902c80476e4SDavid E. O'Brien     RefCursor();
2903c80476e4SDavid E. O'Brien     return(CC_NORM);
2904c80476e4SDavid E. O'Brien }
2905c80476e4SDavid E. O'Brien 
2906c80476e4SDavid E. O'Brien #if defined(DSPMBYTE) /* BY TAGA Nayuta VERY THANKS */
2907c80476e4SDavid E. O'Brien /*ARGSUSED*/
2908c80476e4SDavid E. O'Brien static void
2909c80476e4SDavid E. O'Brien e_charfwd_mbyte(argument)
2910c80476e4SDavid E. O'Brien      int argument;
2911c80476e4SDavid E. O'Brien {
2912c80476e4SDavid E. O'Brien     if (!_enable_mbdisp)
2913c80476e4SDavid E. O'Brien 	Cursor += argument;
2914c80476e4SDavid E. O'Brien     else
2915c80476e4SDavid E. O'Brien 	while (0 < argument && Cursor < LastChar) {
2916c80476e4SDavid E. O'Brien 	    if (Cursor + 1 != LastChar &&
2917c80476e4SDavid E. O'Brien 		Ismbyte1(*Cursor) && Ismbyte2(*(Cursor + 1))) {
2918c80476e4SDavid E. O'Brien 		Cursor++;
2919c80476e4SDavid E. O'Brien 	    }
2920c80476e4SDavid E. O'Brien 	    Cursor++;
2921c80476e4SDavid E. O'Brien 	    argument--;
2922c80476e4SDavid E. O'Brien 	}
2923c80476e4SDavid E. O'Brien }
2924c80476e4SDavid E. O'Brien #endif
2925c80476e4SDavid E. O'Brien 
2926c80476e4SDavid E. O'Brien /*ARGSUSED*/
2927c80476e4SDavid E. O'Brien CCRETVAL
2928c80476e4SDavid E. O'Brien e_charfwd(c)
2929c80476e4SDavid E. O'Brien     int c;
2930c80476e4SDavid E. O'Brien {
2931c80476e4SDavid E. O'Brien     USE(c);
2932c80476e4SDavid E. O'Brien     if (Cursor < LastChar) {
2933c80476e4SDavid E. O'Brien #if defined(DSPMBYTE) /* BY TAGA Nayuta VERY THANKS */
2934c80476e4SDavid E. O'Brien 	e_charfwd_mbyte(Argument);
2935c80476e4SDavid E. O'Brien #else
2936c80476e4SDavid E. O'Brien 	Cursor += Argument;
2937c80476e4SDavid E. O'Brien #endif
2938c80476e4SDavid E. O'Brien 	if (Cursor > LastChar)
2939c80476e4SDavid E. O'Brien 	    Cursor = LastChar;
2940c80476e4SDavid E. O'Brien 
2941c80476e4SDavid E. O'Brien 	if (VImode)
2942c80476e4SDavid E. O'Brien 	    if (ActionFlag & TCSHOP_DELETE) {
2943c80476e4SDavid E. O'Brien 		c_delfini();
2944c80476e4SDavid E. O'Brien 		return(CC_REFRESH);
2945c80476e4SDavid E. O'Brien 	    }
2946c80476e4SDavid E. O'Brien 
2947c80476e4SDavid E. O'Brien 	RefCursor();
2948c80476e4SDavid E. O'Brien 	return(CC_NORM);
2949c80476e4SDavid E. O'Brien     }
2950c80476e4SDavid E. O'Brien     else {
2951c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2952c80476e4SDavid E. O'Brien     }
2953c80476e4SDavid E. O'Brien }
2954c80476e4SDavid E. O'Brien 
2955c80476e4SDavid E. O'Brien /*ARGSUSED*/
2956c80476e4SDavid E. O'Brien CCRETVAL
2957c80476e4SDavid E. O'Brien e_wordfwd(c)
2958c80476e4SDavid E. O'Brien     int c;
2959c80476e4SDavid E. O'Brien {
2960c80476e4SDavid E. O'Brien     USE(c);
2961c80476e4SDavid E. O'Brien     if (Cursor == LastChar)
2962c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2963c80476e4SDavid E. O'Brien     /* else */
2964c80476e4SDavid E. O'Brien 
2965c80476e4SDavid E. O'Brien     Cursor = c_next_word(Cursor, LastChar, Argument);
2966c80476e4SDavid E. O'Brien 
2967c80476e4SDavid E. O'Brien     if (VImode)
2968c80476e4SDavid E. O'Brien 	if (ActionFlag & TCSHOP_DELETE) {
2969c80476e4SDavid E. O'Brien 	    c_delfini();
2970c80476e4SDavid E. O'Brien 	    return(CC_REFRESH);
2971c80476e4SDavid E. O'Brien 	}
2972c80476e4SDavid E. O'Brien 
2973c80476e4SDavid E. O'Brien     RefCursor();
2974c80476e4SDavid E. O'Brien     return(CC_NORM);
2975c80476e4SDavid E. O'Brien }
2976c80476e4SDavid E. O'Brien 
2977c80476e4SDavid E. O'Brien /*ARGSUSED*/
2978c80476e4SDavid E. O'Brien CCRETVAL
2979c80476e4SDavid E. O'Brien v_wordfwd(c)
2980c80476e4SDavid E. O'Brien     int c;
2981c80476e4SDavid E. O'Brien {
2982c80476e4SDavid E. O'Brien     USE(c);
2983c80476e4SDavid E. O'Brien     if (Cursor == LastChar)
2984c80476e4SDavid E. O'Brien 	return(CC_ERROR);
2985c80476e4SDavid E. O'Brien     /* else */
2986c80476e4SDavid E. O'Brien 
2987c80476e4SDavid E. O'Brien     Cursor = c_nexword(Cursor, LastChar, Argument);
2988c80476e4SDavid E. O'Brien 
2989c80476e4SDavid E. O'Brien     if (VImode)
2990c80476e4SDavid E. O'Brien 	if (ActionFlag & TCSHOP_DELETE) {
2991c80476e4SDavid E. O'Brien 	    c_delfini();
2992c80476e4SDavid E. O'Brien 	    return(CC_REFRESH);
2993c80476e4SDavid E. O'Brien 	}
2994c80476e4SDavid E. O'Brien 
2995c80476e4SDavid E. O'Brien     RefCursor();
2996c80476e4SDavid E. O'Brien     return(CC_NORM);
2997c80476e4SDavid E. O'Brien }
2998c80476e4SDavid E. O'Brien 
2999c80476e4SDavid E. O'Brien /*ARGSUSED*/
3000c80476e4SDavid E. O'Brien CCRETVAL
3001c80476e4SDavid E. O'Brien v_wordbegnext(c)
3002c80476e4SDavid E. O'Brien     int c;
3003c80476e4SDavid E. O'Brien {
3004c80476e4SDavid E. O'Brien     USE(c);
3005c80476e4SDavid E. O'Brien     if (Cursor == LastChar)
3006c80476e4SDavid E. O'Brien 	return(CC_ERROR);
3007c80476e4SDavid E. O'Brien     /* else */
3008c80476e4SDavid E. O'Brien 
3009c80476e4SDavid E. O'Brien     Cursor = c_next_word(Cursor, LastChar, Argument);
3010c80476e4SDavid E. O'Brien     if (Cursor < LastChar)
3011c80476e4SDavid E. O'Brien 	Cursor++;
3012c80476e4SDavid E. O'Brien 
3013c80476e4SDavid E. O'Brien     if (VImode)
3014c80476e4SDavid E. O'Brien 	if (ActionFlag & TCSHOP_DELETE) {
3015c80476e4SDavid E. O'Brien 	    c_delfini();
3016c80476e4SDavid E. O'Brien 	    return(CC_REFRESH);
3017c80476e4SDavid E. O'Brien 	}
3018c80476e4SDavid E. O'Brien 
3019c80476e4SDavid E. O'Brien     RefCursor();
3020c80476e4SDavid E. O'Brien     return(CC_NORM);
3021c80476e4SDavid E. O'Brien }
3022c80476e4SDavid E. O'Brien 
3023c80476e4SDavid E. O'Brien /*ARGSUSED*/
3024c80476e4SDavid E. O'Brien static CCRETVAL
3025c80476e4SDavid E. O'Brien v_repeat_srch(c)
3026c80476e4SDavid E. O'Brien     int c;
3027c80476e4SDavid E. O'Brien {
3028c80476e4SDavid E. O'Brien     CCRETVAL rv = CC_ERROR;
3029c80476e4SDavid E. O'Brien #ifdef SDEBUG
3030c80476e4SDavid E. O'Brien     xprintf("dir %d patlen %d patbuf %S\n",
3031c80476e4SDavid E. O'Brien 	    c, patlen, patbuf);
3032c80476e4SDavid E. O'Brien #endif
3033c80476e4SDavid E. O'Brien 
3034c80476e4SDavid E. O'Brien     LastCmd = (KEYCMD) c;  /* Hack to stop c_hsetpat */
3035c80476e4SDavid E. O'Brien     LastChar = InputBuf;
3036c80476e4SDavid E. O'Brien     switch (c) {
3037c80476e4SDavid E. O'Brien     case F_DOWN_SEARCH_HIST:
3038c80476e4SDavid E. O'Brien 	rv = e_down_search_hist(0);
3039c80476e4SDavid E. O'Brien 	break;
3040c80476e4SDavid E. O'Brien     case F_UP_SEARCH_HIST:
3041c80476e4SDavid E. O'Brien 	rv = e_up_search_hist(0);
3042c80476e4SDavid E. O'Brien 	break;
3043c80476e4SDavid E. O'Brien     default:
3044c80476e4SDavid E. O'Brien 	break;
3045c80476e4SDavid E. O'Brien     }
3046c80476e4SDavid E. O'Brien     return rv;
3047c80476e4SDavid E. O'Brien }
3048c80476e4SDavid E. O'Brien 
3049c80476e4SDavid E. O'Brien static CCRETVAL
3050c80476e4SDavid E. O'Brien v_csearch_back(ch, count, tflag)
3051c80476e4SDavid E. O'Brien     int ch, count, tflag;
3052c80476e4SDavid E. O'Brien {
3053c80476e4SDavid E. O'Brien     Char *cp;
3054c80476e4SDavid E. O'Brien 
3055c80476e4SDavid E. O'Brien     cp = Cursor;
3056c80476e4SDavid E. O'Brien     while (count--) {
3057c80476e4SDavid E. O'Brien 	if (*cp == ch)
3058c80476e4SDavid E. O'Brien 	    cp--;
3059c80476e4SDavid E. O'Brien 	while (cp > InputBuf && *cp != ch)
3060c80476e4SDavid E. O'Brien 	    cp--;
3061c80476e4SDavid E. O'Brien     }
3062c80476e4SDavid E. O'Brien 
3063c80476e4SDavid E. O'Brien     if (cp < InputBuf || (cp == InputBuf && *cp != ch))
3064c80476e4SDavid E. O'Brien 	return(CC_ERROR);
3065c80476e4SDavid E. O'Brien 
3066c80476e4SDavid E. O'Brien     if (*cp == ch && tflag)
3067c80476e4SDavid E. O'Brien 	cp++;
3068c80476e4SDavid E. O'Brien 
3069c80476e4SDavid E. O'Brien     Cursor = cp;
3070c80476e4SDavid E. O'Brien 
3071c80476e4SDavid E. O'Brien     if (ActionFlag & TCSHOP_DELETE) {
3072c80476e4SDavid E. O'Brien 	Cursor++;
3073c80476e4SDavid E. O'Brien 	c_delfini();
3074c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
3075c80476e4SDavid E. O'Brien     }
3076c80476e4SDavid E. O'Brien 
3077c80476e4SDavid E. O'Brien     RefCursor();
3078c80476e4SDavid E. O'Brien     return(CC_NORM);
3079c80476e4SDavid E. O'Brien }
3080c80476e4SDavid E. O'Brien 
3081c80476e4SDavid E. O'Brien static CCRETVAL
3082c80476e4SDavid E. O'Brien v_csearch_fwd(ch, count, tflag)
3083c80476e4SDavid E. O'Brien     int ch, count, tflag;
3084c80476e4SDavid E. O'Brien {
3085c80476e4SDavid E. O'Brien     Char *cp;
3086c80476e4SDavid E. O'Brien 
3087c80476e4SDavid E. O'Brien     cp = Cursor;
3088c80476e4SDavid E. O'Brien     while (count--) {
3089c80476e4SDavid E. O'Brien 	if(*cp == ch)
3090c80476e4SDavid E. O'Brien 	    cp++;
3091c80476e4SDavid E. O'Brien 	while (cp < LastChar && *cp != ch)
3092c80476e4SDavid E. O'Brien 	    cp++;
3093c80476e4SDavid E. O'Brien     }
3094c80476e4SDavid E. O'Brien 
3095c80476e4SDavid E. O'Brien     if (cp >= LastChar)
3096c80476e4SDavid E. O'Brien 	return(CC_ERROR);
3097c80476e4SDavid E. O'Brien 
3098c80476e4SDavid E. O'Brien     if (*cp == ch && tflag)
3099c80476e4SDavid E. O'Brien 	cp--;
3100c80476e4SDavid E. O'Brien 
3101c80476e4SDavid E. O'Brien     Cursor = cp;
3102c80476e4SDavid E. O'Brien 
3103c80476e4SDavid E. O'Brien     if (ActionFlag & TCSHOP_DELETE) {
3104c80476e4SDavid E. O'Brien 	Cursor++;
3105c80476e4SDavid E. O'Brien 	c_delfini();
3106c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
3107c80476e4SDavid E. O'Brien     }
3108c80476e4SDavid E. O'Brien     RefCursor();
3109c80476e4SDavid E. O'Brien     return(CC_NORM);
3110c80476e4SDavid E. O'Brien }
3111c80476e4SDavid E. O'Brien 
3112c80476e4SDavid E. O'Brien /*ARGSUSED*/
3113c80476e4SDavid E. O'Brien static CCRETVAL
3114c80476e4SDavid E. O'Brien v_action(c)
3115c80476e4SDavid E. O'Brien     int c;
3116c80476e4SDavid E. O'Brien {
31176767bd61SMark Peek     Char *cp, *kp;
3118c80476e4SDavid E. O'Brien 
3119c80476e4SDavid E. O'Brien     if (ActionFlag == TCSHOP_DELETE) {
3120c80476e4SDavid E. O'Brien 	ActionFlag = TCSHOP_NOP;
3121c80476e4SDavid E. O'Brien 	ActionPos = 0;
3122c80476e4SDavid E. O'Brien 
3123c80476e4SDavid E. O'Brien 	UndoSize = 0;
3124c80476e4SDavid E. O'Brien 	kp = UndoBuf;
3125c80476e4SDavid E. O'Brien 	for (cp = InputBuf; cp < LastChar; cp++) {
3126c80476e4SDavid E. O'Brien 	    *kp++ = *cp;
3127c80476e4SDavid E. O'Brien 	    UndoSize++;
3128c80476e4SDavid E. O'Brien 	}
3129c80476e4SDavid E. O'Brien 
3130c80476e4SDavid E. O'Brien 	UndoAction = TCSHOP_INSERT;
3131c80476e4SDavid E. O'Brien 	UndoPtr  = InputBuf;
3132c80476e4SDavid E. O'Brien 	LastChar = InputBuf;
3133c80476e4SDavid E. O'Brien 	Cursor   = InputBuf;
3134c80476e4SDavid E. O'Brien 	if (c & TCSHOP_INSERT)
3135c80476e4SDavid E. O'Brien 	    c_alternativ_key_map(0);
3136c80476e4SDavid E. O'Brien 
3137c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
3138c80476e4SDavid E. O'Brien     }
3139c80476e4SDavid E. O'Brien #ifdef notdef
3140c80476e4SDavid E. O'Brien     else if (ActionFlag == TCSHOP_NOP) {
3141c80476e4SDavid E. O'Brien #endif
3142c80476e4SDavid E. O'Brien 	ActionPos = Cursor;
3143c80476e4SDavid E. O'Brien 	ActionFlag = c;
3144c80476e4SDavid E. O'Brien 	return(CC_ARGHACK);  /* Do NOT clear out argument */
3145c80476e4SDavid E. O'Brien #ifdef notdef
3146c80476e4SDavid E. O'Brien     }
3147c80476e4SDavid E. O'Brien     else {
3148c80476e4SDavid E. O'Brien 	ActionFlag = 0;
3149c80476e4SDavid E. O'Brien 	ActionPos = 0;
3150c80476e4SDavid E. O'Brien 	return(CC_ERROR);
3151c80476e4SDavid E. O'Brien     }
3152c80476e4SDavid E. O'Brien #endif
3153c80476e4SDavid E. O'Brien }
3154c80476e4SDavid E. O'Brien 
3155c80476e4SDavid E. O'Brien #ifdef COMMENT
3156c80476e4SDavid E. O'Brien /* by: Brian Allison <uiucdcs!convex!allison@RUTGERS.EDU> */
3157c80476e4SDavid E. O'Brien static void
3158c80476e4SDavid E. O'Brien c_get_word(begin, end)
3159c80476e4SDavid E. O'Brien     Char  **begin;
3160c80476e4SDavid E. O'Brien     Char  **end;
3161c80476e4SDavid E. O'Brien {
3162c80476e4SDavid E. O'Brien     Char   *cp;
3163c80476e4SDavid E. O'Brien 
3164c80476e4SDavid E. O'Brien     cp = &Cursor[0];
3165c80476e4SDavid E. O'Brien     while (Argument--) {
3166c80476e4SDavid E. O'Brien 	while ((cp <= LastChar) && (isword(*cp)))
3167c80476e4SDavid E. O'Brien 	    cp++;
3168c80476e4SDavid E. O'Brien 	*end = --cp;
3169c80476e4SDavid E. O'Brien 	while ((cp >= InputBuf) && (isword(*cp)))
3170c80476e4SDavid E. O'Brien 	    cp--;
3171c80476e4SDavid E. O'Brien 	*begin = ++cp;
3172c80476e4SDavid E. O'Brien     }
3173c80476e4SDavid E. O'Brien }
3174c80476e4SDavid E. O'Brien #endif /* COMMENT */
3175c80476e4SDavid E. O'Brien 
3176c80476e4SDavid E. O'Brien /*ARGSUSED*/
3177c80476e4SDavid E. O'Brien CCRETVAL
3178c80476e4SDavid E. O'Brien e_uppercase(c)
3179c80476e4SDavid E. O'Brien     int c;
3180c80476e4SDavid E. O'Brien {
3181c80476e4SDavid E. O'Brien     Char   *cp, *end;
3182c80476e4SDavid E. O'Brien 
3183c80476e4SDavid E. O'Brien     USE(c);
3184c80476e4SDavid E. O'Brien     end = c_next_word(Cursor, LastChar, Argument);
3185c80476e4SDavid E. O'Brien 
3186c80476e4SDavid E. O'Brien     for (cp = Cursor; cp < end; cp++)	/* PWP: was cp=begin */
3187c80476e4SDavid E. O'Brien 	if (Islower(*cp))
3188c80476e4SDavid E. O'Brien 	    *cp = Toupper(*cp);
3189c80476e4SDavid E. O'Brien 
3190c80476e4SDavid E. O'Brien     Cursor = end;
3191c80476e4SDavid E. O'Brien     if (Cursor > LastChar)
3192c80476e4SDavid E. O'Brien 	Cursor = LastChar;
3193c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3194c80476e4SDavid E. O'Brien }
3195c80476e4SDavid E. O'Brien 
3196c80476e4SDavid E. O'Brien 
3197c80476e4SDavid E. O'Brien /*ARGSUSED*/
3198c80476e4SDavid E. O'Brien CCRETVAL
3199c80476e4SDavid E. O'Brien e_capitolcase(c)
3200c80476e4SDavid E. O'Brien     int c;
3201c80476e4SDavid E. O'Brien {
3202c80476e4SDavid E. O'Brien     Char   *cp, *end;
3203c80476e4SDavid E. O'Brien 
3204c80476e4SDavid E. O'Brien     USE(c);
3205c80476e4SDavid E. O'Brien     end = c_next_word(Cursor, LastChar, Argument);
3206c80476e4SDavid E. O'Brien 
3207c80476e4SDavid E. O'Brien     cp = Cursor;
3208c80476e4SDavid E. O'Brien     for (; cp < end; cp++) {
3209c80476e4SDavid E. O'Brien 	if (Isalpha(*cp)) {
3210c80476e4SDavid E. O'Brien 	    if (Islower(*cp))
3211c80476e4SDavid E. O'Brien 		*cp = Toupper(*cp);
3212c80476e4SDavid E. O'Brien 	    cp++;
3213c80476e4SDavid E. O'Brien 	    break;
3214c80476e4SDavid E. O'Brien 	}
3215c80476e4SDavid E. O'Brien     }
3216c80476e4SDavid E. O'Brien     for (; cp < end; cp++)
3217c80476e4SDavid E. O'Brien 	if (Isupper(*cp))
3218c80476e4SDavid E. O'Brien 	    *cp = Tolower(*cp);
3219c80476e4SDavid E. O'Brien 
3220c80476e4SDavid E. O'Brien     Cursor = end;
3221c80476e4SDavid E. O'Brien     if (Cursor > LastChar)
3222c80476e4SDavid E. O'Brien 	Cursor = LastChar;
3223c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3224c80476e4SDavid E. O'Brien }
3225c80476e4SDavid E. O'Brien 
3226c80476e4SDavid E. O'Brien /*ARGSUSED*/
3227c80476e4SDavid E. O'Brien CCRETVAL
3228c80476e4SDavid E. O'Brien e_lowercase(c)
3229c80476e4SDavid E. O'Brien     int c;
3230c80476e4SDavid E. O'Brien {
3231c80476e4SDavid E. O'Brien     Char   *cp, *end;
3232c80476e4SDavid E. O'Brien 
3233c80476e4SDavid E. O'Brien     USE(c);
3234c80476e4SDavid E. O'Brien     end = c_next_word(Cursor, LastChar, Argument);
3235c80476e4SDavid E. O'Brien 
3236c80476e4SDavid E. O'Brien     for (cp = Cursor; cp < end; cp++)
3237c80476e4SDavid E. O'Brien 	if (Isupper(*cp))
3238c80476e4SDavid E. O'Brien 	    *cp = Tolower(*cp);
3239c80476e4SDavid E. O'Brien 
3240c80476e4SDavid E. O'Brien     Cursor = end;
3241c80476e4SDavid E. O'Brien     if (Cursor > LastChar)
3242c80476e4SDavid E. O'Brien 	Cursor = LastChar;
3243c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3244c80476e4SDavid E. O'Brien }
3245c80476e4SDavid E. O'Brien 
3246c80476e4SDavid E. O'Brien 
3247c80476e4SDavid E. O'Brien /*ARGSUSED*/
3248c80476e4SDavid E. O'Brien CCRETVAL
3249c80476e4SDavid E. O'Brien e_set_mark(c)
3250c80476e4SDavid E. O'Brien     int c;
3251c80476e4SDavid E. O'Brien {
3252c80476e4SDavid E. O'Brien     USE(c);
3253c80476e4SDavid E. O'Brien     Mark = Cursor;
3254c80476e4SDavid E. O'Brien     return(CC_NORM);
3255c80476e4SDavid E. O'Brien }
3256c80476e4SDavid E. O'Brien 
3257c80476e4SDavid E. O'Brien /*ARGSUSED*/
3258c80476e4SDavid E. O'Brien CCRETVAL
3259c80476e4SDavid E. O'Brien e_exchange_mark(c)
3260c80476e4SDavid E. O'Brien     int c;
3261c80476e4SDavid E. O'Brien {
32626767bd61SMark Peek     Char *cp;
3263c80476e4SDavid E. O'Brien 
3264c80476e4SDavid E. O'Brien     USE(c);
3265c80476e4SDavid E. O'Brien     cp = Cursor;
3266c80476e4SDavid E. O'Brien     Cursor = Mark;
3267c80476e4SDavid E. O'Brien     Mark = cp;
3268c80476e4SDavid E. O'Brien     RefCursor();
3269c80476e4SDavid E. O'Brien     return(CC_NORM);
3270c80476e4SDavid E. O'Brien }
3271c80476e4SDavid E. O'Brien 
3272c80476e4SDavid E. O'Brien /*ARGSUSED*/
3273c80476e4SDavid E. O'Brien CCRETVAL
3274c80476e4SDavid E. O'Brien e_argfour(c)
3275c80476e4SDavid E. O'Brien     int c;
3276c80476e4SDavid E. O'Brien {				/* multiply current argument by 4 */
3277c80476e4SDavid E. O'Brien     USE(c);
3278c80476e4SDavid E. O'Brien     if (Argument > 1000000)
3279c80476e4SDavid E. O'Brien 	return CC_ERROR;
3280c80476e4SDavid E. O'Brien     DoingArg = 1;
3281c80476e4SDavid E. O'Brien     Argument *= 4;
3282c80476e4SDavid E. O'Brien     return(CC_ARGHACK);
3283c80476e4SDavid E. O'Brien }
3284c80476e4SDavid E. O'Brien 
3285c80476e4SDavid E. O'Brien /*ARGSUSED*/
3286c80476e4SDavid E. O'Brien CCRETVAL
3287c80476e4SDavid E. O'Brien e_quote(c)
3288c80476e4SDavid E. O'Brien     int c;
3289c80476e4SDavid E. O'Brien {
3290c80476e4SDavid E. O'Brien     Char    ch;
3291c80476e4SDavid E. O'Brien     int     num;
3292c80476e4SDavid E. O'Brien 
3293c80476e4SDavid E. O'Brien     USE(c);
3294c80476e4SDavid E. O'Brien     QuoteModeOn();
3295c80476e4SDavid E. O'Brien     num = GetNextChar(&ch);
3296c80476e4SDavid E. O'Brien     QuoteModeOff();
3297c80476e4SDavid E. O'Brien     if (num == 1)
3298c80476e4SDavid E. O'Brien 	return e_insert(ch);
3299c80476e4SDavid E. O'Brien     else
3300c80476e4SDavid E. O'Brien 	return e_send_eof(0);
3301c80476e4SDavid E. O'Brien }
3302c80476e4SDavid E. O'Brien 
3303c80476e4SDavid E. O'Brien /*ARGSUSED*/
3304c80476e4SDavid E. O'Brien CCRETVAL
3305c80476e4SDavid E. O'Brien e_metanext(c)
3306c80476e4SDavid E. O'Brien     int c;
3307c80476e4SDavid E. O'Brien {
3308c80476e4SDavid E. O'Brien     USE(c);
3309c80476e4SDavid E. O'Brien     MetaNext = 1;
3310c80476e4SDavid E. O'Brien     return(CC_ARGHACK);	/* preserve argument */
3311c80476e4SDavid E. O'Brien }
3312c80476e4SDavid E. O'Brien 
3313c80476e4SDavid E. O'Brien #ifdef notdef
3314c80476e4SDavid E. O'Brien /*ARGSUSED*/
3315c80476e4SDavid E. O'Brien CCRETVAL
3316c80476e4SDavid E. O'Brien e_extendnext(c)
3317c80476e4SDavid E. O'Brien     int c;
3318c80476e4SDavid E. O'Brien {
3319c80476e4SDavid E. O'Brien     CurrentKeyMap = CcAltMap;
3320c80476e4SDavid E. O'Brien     return(CC_ARGHACK);	/* preserve argument */
3321c80476e4SDavid E. O'Brien }
3322c80476e4SDavid E. O'Brien 
3323c80476e4SDavid E. O'Brien #endif
3324c80476e4SDavid E. O'Brien 
3325c80476e4SDavid E. O'Brien /*ARGSUSED*/
3326c80476e4SDavid E. O'Brien CCRETVAL
3327c80476e4SDavid E. O'Brien v_insbeg(c)
3328c80476e4SDavid E. O'Brien     int c;
3329c80476e4SDavid E. O'Brien {				/* move to beginning of line and start vi
3330c80476e4SDavid E. O'Brien 				 * insert mode */
3331c80476e4SDavid E. O'Brien     USE(c);
3332c80476e4SDavid E. O'Brien     Cursor = InputBuf;
3333c80476e4SDavid E. O'Brien     InsertPos = Cursor;
3334c80476e4SDavid E. O'Brien 
3335c80476e4SDavid E. O'Brien     UndoPtr  = Cursor;
3336c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_DELETE;
3337c80476e4SDavid E. O'Brien 
3338c80476e4SDavid E. O'Brien     RefCursor();		/* move the cursor */
3339c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
3340c80476e4SDavid E. O'Brien     return(CC_NORM);
3341c80476e4SDavid E. O'Brien }
3342c80476e4SDavid E. O'Brien 
3343c80476e4SDavid E. O'Brien /*ARGSUSED*/
3344c80476e4SDavid E. O'Brien CCRETVAL
3345c80476e4SDavid E. O'Brien v_replone(c)
3346c80476e4SDavid E. O'Brien     int c;
3347c80476e4SDavid E. O'Brien {				/* vi mode overwrite one character */
3348c80476e4SDavid E. O'Brien     USE(c);
3349c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
3350c80476e4SDavid E. O'Brien     inputmode = MODE_REPLACE_1;
3351c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_CHANGE;	/* Set Up for VI undo command */
3352c80476e4SDavid E. O'Brien     UndoPtr = Cursor;
3353c80476e4SDavid E. O'Brien     UndoSize = 0;
3354c80476e4SDavid E. O'Brien     return(CC_NORM);
3355c80476e4SDavid E. O'Brien }
3356c80476e4SDavid E. O'Brien 
3357c80476e4SDavid E. O'Brien /*ARGSUSED*/
3358c80476e4SDavid E. O'Brien CCRETVAL
3359c80476e4SDavid E. O'Brien v_replmode(c)
3360c80476e4SDavid E. O'Brien     int c;
3361c80476e4SDavid E. O'Brien {				/* vi mode start overwriting */
3362c80476e4SDavid E. O'Brien     USE(c);
3363c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
3364c80476e4SDavid E. O'Brien     inputmode = MODE_REPLACE;
3365c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_CHANGE;	/* Set Up for VI undo command */
3366c80476e4SDavid E. O'Brien     UndoPtr = Cursor;
3367c80476e4SDavid E. O'Brien     UndoSize = 0;
3368c80476e4SDavid E. O'Brien     return(CC_NORM);
3369c80476e4SDavid E. O'Brien }
3370c80476e4SDavid E. O'Brien 
3371c80476e4SDavid E. O'Brien /*ARGSUSED*/
3372c80476e4SDavid E. O'Brien CCRETVAL
3373c80476e4SDavid E. O'Brien v_substchar(c)
3374c80476e4SDavid E. O'Brien     int c;
3375c80476e4SDavid E. O'Brien {				/* vi mode substitute for one char */
3376c80476e4SDavid E. O'Brien     USE(c);
3377c80476e4SDavid E. O'Brien     c_delafter(Argument);
3378c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
3379c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3380c80476e4SDavid E. O'Brien }
3381c80476e4SDavid E. O'Brien 
3382c80476e4SDavid E. O'Brien /*ARGSUSED*/
3383c80476e4SDavid E. O'Brien CCRETVAL
3384c80476e4SDavid E. O'Brien v_substline(c)
3385c80476e4SDavid E. O'Brien     int c;
3386c80476e4SDavid E. O'Brien {				/* vi mode replace whole line */
3387c80476e4SDavid E. O'Brien     USE(c);
3388c80476e4SDavid E. O'Brien     (void) e_killall(0);
3389c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
3390c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3391c80476e4SDavid E. O'Brien }
3392c80476e4SDavid E. O'Brien 
3393c80476e4SDavid E. O'Brien /*ARGSUSED*/
3394c80476e4SDavid E. O'Brien CCRETVAL
3395c80476e4SDavid E. O'Brien v_chgtoend(c)
3396c80476e4SDavid E. O'Brien     int c;
3397c80476e4SDavid E. O'Brien {				/* vi mode change to end of line */
3398c80476e4SDavid E. O'Brien     USE(c);
3399c80476e4SDavid E. O'Brien     (void) e_killend(0);
3400c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
3401c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3402c80476e4SDavid E. O'Brien }
3403c80476e4SDavid E. O'Brien 
3404c80476e4SDavid E. O'Brien /*ARGSUSED*/
3405c80476e4SDavid E. O'Brien CCRETVAL
3406c80476e4SDavid E. O'Brien v_insert(c)
3407c80476e4SDavid E. O'Brien     int c;
3408c80476e4SDavid E. O'Brien {				/* vi mode start inserting */
3409c80476e4SDavid E. O'Brien     USE(c);
3410c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
3411c80476e4SDavid E. O'Brien 
3412c80476e4SDavid E. O'Brien     InsertPos = Cursor;
3413c80476e4SDavid E. O'Brien     UndoPtr = Cursor;
3414c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_DELETE;
3415c80476e4SDavid E. O'Brien 
3416c80476e4SDavid E. O'Brien     return(CC_NORM);
3417c80476e4SDavid E. O'Brien }
3418c80476e4SDavid E. O'Brien 
3419c80476e4SDavid E. O'Brien /*ARGSUSED*/
3420c80476e4SDavid E. O'Brien CCRETVAL
3421c80476e4SDavid E. O'Brien v_add(c)
3422c80476e4SDavid E. O'Brien     int c;
3423c80476e4SDavid E. O'Brien {				/* vi mode start adding */
3424c80476e4SDavid E. O'Brien     USE(c);
3425c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
3426c80476e4SDavid E. O'Brien     if (Cursor < LastChar)
3427c80476e4SDavid E. O'Brien     {
3428c80476e4SDavid E. O'Brien 	Cursor++;
3429c80476e4SDavid E. O'Brien 	if (Cursor > LastChar)
3430c80476e4SDavid E. O'Brien 	    Cursor = LastChar;
3431c80476e4SDavid E. O'Brien 	RefCursor();
3432c80476e4SDavid E. O'Brien     }
3433c80476e4SDavid E. O'Brien 
3434c80476e4SDavid E. O'Brien     InsertPos = Cursor;
3435c80476e4SDavid E. O'Brien     UndoPtr = Cursor;
3436c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_DELETE;
3437c80476e4SDavid E. O'Brien 
3438c80476e4SDavid E. O'Brien     return(CC_NORM);
3439c80476e4SDavid E. O'Brien }
3440c80476e4SDavid E. O'Brien 
3441c80476e4SDavid E. O'Brien /*ARGSUSED*/
3442c80476e4SDavid E. O'Brien CCRETVAL
3443c80476e4SDavid E. O'Brien v_addend(c)
3444c80476e4SDavid E. O'Brien     int c;
3445c80476e4SDavid E. O'Brien {				/* vi mode to add at end of line */
3446c80476e4SDavid E. O'Brien     USE(c);
3447c80476e4SDavid E. O'Brien     c_alternativ_key_map(0);
3448c80476e4SDavid E. O'Brien     Cursor = LastChar;
3449c80476e4SDavid E. O'Brien 
3450c80476e4SDavid E. O'Brien     InsertPos = LastChar;	/* Mark where insertion begins */
3451c80476e4SDavid E. O'Brien     UndoPtr = LastChar;
3452c80476e4SDavid E. O'Brien     UndoAction = TCSHOP_DELETE;
3453c80476e4SDavid E. O'Brien 
3454c80476e4SDavid E. O'Brien     RefCursor();
3455c80476e4SDavid E. O'Brien     return(CC_NORM);
3456c80476e4SDavid E. O'Brien }
3457c80476e4SDavid E. O'Brien 
3458c80476e4SDavid E. O'Brien /*ARGSUSED*/
3459c80476e4SDavid E. O'Brien CCRETVAL
3460c80476e4SDavid E. O'Brien v_change_case(cc)
3461c80476e4SDavid E. O'Brien     int cc;
3462c80476e4SDavid E. O'Brien {
3463c80476e4SDavid E. O'Brien     char    c;
3464c80476e4SDavid E. O'Brien 
3465c80476e4SDavid E. O'Brien     USE(cc);
3466c80476e4SDavid E. O'Brien     if (Cursor < LastChar) {
34673b6eaa7bSAndrey A. Chernov #ifndef WINNT_NATIVE
3468c80476e4SDavid E. O'Brien 	c = *Cursor;
3469c80476e4SDavid E. O'Brien #else
3470c80476e4SDavid E. O'Brien 	c = CHAR & *Cursor;
34713b6eaa7bSAndrey A. Chernov #endif /* WINNT_NATIVE */
3472c80476e4SDavid E. O'Brien 	if (Isupper(c))
3473c80476e4SDavid E. O'Brien 	    *Cursor++ = Tolower(c);
3474c80476e4SDavid E. O'Brien 	else if (Islower(c))
3475c80476e4SDavid E. O'Brien 	    *Cursor++ = Toupper(c);
3476c80476e4SDavid E. O'Brien 	else
3477c80476e4SDavid E. O'Brien 	    Cursor++;
3478c80476e4SDavid E. O'Brien 	RefPlusOne();		/* fast refresh for one char */
3479c80476e4SDavid E. O'Brien 	return(CC_NORM);
3480c80476e4SDavid E. O'Brien     }
3481c80476e4SDavid E. O'Brien     return(CC_ERROR);
3482c80476e4SDavid E. O'Brien }
3483c80476e4SDavid E. O'Brien 
3484c80476e4SDavid E. O'Brien /*ARGSUSED*/
3485c80476e4SDavid E. O'Brien CCRETVAL
3486c80476e4SDavid E. O'Brien e_expand(c)
3487c80476e4SDavid E. O'Brien     int c;
3488c80476e4SDavid E. O'Brien {
34896767bd61SMark Peek     Char *p;
3490c80476e4SDavid E. O'Brien     extern bool justpr;
3491c80476e4SDavid E. O'Brien 
3492c80476e4SDavid E. O'Brien     USE(c);
3493c80476e4SDavid E. O'Brien     for (p = InputBuf; Isspace(*p); p++)
3494c80476e4SDavid E. O'Brien 	continue;
3495c80476e4SDavid E. O'Brien     if (p == LastChar)
3496c80476e4SDavid E. O'Brien 	return(CC_ERROR);
3497c80476e4SDavid E. O'Brien 
3498c80476e4SDavid E. O'Brien     justpr++;
3499c80476e4SDavid E. O'Brien     Expand++;
3500c80476e4SDavid E. O'Brien     return(e_newline(0));
3501c80476e4SDavid E. O'Brien }
3502c80476e4SDavid E. O'Brien 
3503c80476e4SDavid E. O'Brien /*ARGSUSED*/
3504c80476e4SDavid E. O'Brien CCRETVAL
3505c80476e4SDavid E. O'Brien e_startover(c)
3506c80476e4SDavid E. O'Brien     int c;
3507c80476e4SDavid E. O'Brien {				/* erase all of current line, start again */
3508c80476e4SDavid E. O'Brien     USE(c);
3509c80476e4SDavid E. O'Brien     ResetInLine(0);		/* reset the input pointers */
3510c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3511c80476e4SDavid E. O'Brien }
3512c80476e4SDavid E. O'Brien 
3513c80476e4SDavid E. O'Brien /*ARGSUSED*/
3514c80476e4SDavid E. O'Brien CCRETVAL
3515c80476e4SDavid E. O'Brien e_redisp(c)
3516c80476e4SDavid E. O'Brien     int c;
3517c80476e4SDavid E. O'Brien {
3518c80476e4SDavid E. O'Brien     USE(c);
3519c80476e4SDavid E. O'Brien     ClearLines();
3520c80476e4SDavid E. O'Brien     ClearDisp();
3521c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3522c80476e4SDavid E. O'Brien }
3523c80476e4SDavid E. O'Brien 
3524c80476e4SDavid E. O'Brien /*ARGSUSED*/
3525c80476e4SDavid E. O'Brien CCRETVAL
3526c80476e4SDavid E. O'Brien e_cleardisp(c)
3527c80476e4SDavid E. O'Brien     int c;
3528c80476e4SDavid E. O'Brien {
3529c80476e4SDavid E. O'Brien     USE(c);
3530c80476e4SDavid E. O'Brien     ClearScreen();		/* clear the whole real screen */
3531c80476e4SDavid E. O'Brien     ClearDisp();		/* reset everything */
3532c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3533c80476e4SDavid E. O'Brien }
3534c80476e4SDavid E. O'Brien 
3535c80476e4SDavid E. O'Brien /*ARGSUSED*/
3536c80476e4SDavid E. O'Brien CCRETVAL
3537c80476e4SDavid E. O'Brien e_tty_int(c)
3538c80476e4SDavid E. O'Brien     int c;
3539c80476e4SDavid E. O'Brien {
3540c80476e4SDavid E. O'Brien     USE(c);
35413b6eaa7bSAndrey A. Chernov #if defined(_MINIX) || defined(WINNT_NATIVE)
3542c80476e4SDavid E. O'Brien     /* SAK PATCH: erase all of current line, start again */
3543c80476e4SDavid E. O'Brien     ResetInLine(0);		/* reset the input pointers */
3544c80476e4SDavid E. O'Brien     xputchar('\n');
3545c80476e4SDavid E. O'Brien     ClearDisp();
3546c80476e4SDavid E. O'Brien     return (CC_REFRESH);
35473b6eaa7bSAndrey A. Chernov #else /* !_MINIX && !WINNT_NATIVE */
3548c80476e4SDavid E. O'Brien     /* do no editing */
3549c80476e4SDavid E. O'Brien     return (CC_NORM);
35503b6eaa7bSAndrey A. Chernov #endif /* _MINIX || WINNT_NATIVE */
3551c80476e4SDavid E. O'Brien }
3552c80476e4SDavid E. O'Brien 
3553c80476e4SDavid E. O'Brien /*
3554c80476e4SDavid E. O'Brien  * From: ghazi@cesl.rutgers.edu (Kaveh R. Ghazi)
3555c80476e4SDavid E. O'Brien  * Function to send a character back to the input stream in cooked
3556c80476e4SDavid E. O'Brien  * mode. Only works if we have TIOCSTI
3557c80476e4SDavid E. O'Brien  */
3558c80476e4SDavid E. O'Brien /*ARGSUSED*/
3559c80476e4SDavid E. O'Brien CCRETVAL
3560c80476e4SDavid E. O'Brien e_stuff_char(c)
3561c80476e4SDavid E. O'Brien      int c;
3562c80476e4SDavid E. O'Brien {
3563c80476e4SDavid E. O'Brien #ifdef TIOCSTI
3564c80476e4SDavid E. O'Brien      extern int Tty_raw_mode;
3565c80476e4SDavid E. O'Brien      int was_raw = Tty_raw_mode;
3566c80476e4SDavid E. O'Brien      char ch = (char) c;
3567c80476e4SDavid E. O'Brien 
3568c80476e4SDavid E. O'Brien      if (was_raw)
3569c80476e4SDavid E. O'Brien          (void) Cookedmode();
3570c80476e4SDavid E. O'Brien 
3571c80476e4SDavid E. O'Brien      (void) write(SHIN, "\n", 1);
3572c80476e4SDavid E. O'Brien      (void) ioctl(SHIN, TIOCSTI, (ioctl_t) &ch);
3573c80476e4SDavid E. O'Brien 
3574c80476e4SDavid E. O'Brien      if (was_raw)
3575c80476e4SDavid E. O'Brien          (void) Rawmode();
3576c80476e4SDavid E. O'Brien      return(e_redisp(c));
3577c80476e4SDavid E. O'Brien #else /* !TIOCSTI */
3578c80476e4SDavid E. O'Brien      return(CC_ERROR);
3579c80476e4SDavid E. O'Brien #endif /* !TIOCSTI */
3580c80476e4SDavid E. O'Brien }
3581c80476e4SDavid E. O'Brien 
3582c80476e4SDavid E. O'Brien /*ARGSUSED*/
3583c80476e4SDavid E. O'Brien CCRETVAL
3584c80476e4SDavid E. O'Brien e_insovr(c)
3585c80476e4SDavid E. O'Brien     int c;
3586c80476e4SDavid E. O'Brien {
3587c80476e4SDavid E. O'Brien     USE(c);
3588c80476e4SDavid E. O'Brien     inputmode = (inputmode == MODE_INSERT ? MODE_REPLACE : MODE_INSERT);
3589c80476e4SDavid E. O'Brien     return(CC_NORM);
3590c80476e4SDavid E. O'Brien }
3591c80476e4SDavid E. O'Brien 
3592c80476e4SDavid E. O'Brien /*ARGSUSED*/
3593c80476e4SDavid E. O'Brien CCRETVAL
3594c80476e4SDavid E. O'Brien e_tty_dsusp(c)
3595c80476e4SDavid E. O'Brien     int c;
3596c80476e4SDavid E. O'Brien {
3597c80476e4SDavid E. O'Brien     USE(c);
3598c80476e4SDavid E. O'Brien     /* do no editing */
3599c80476e4SDavid E. O'Brien     return(CC_NORM);
3600c80476e4SDavid E. O'Brien }
3601c80476e4SDavid E. O'Brien 
3602c80476e4SDavid E. O'Brien /*ARGSUSED*/
3603c80476e4SDavid E. O'Brien CCRETVAL
3604c80476e4SDavid E. O'Brien e_tty_flusho(c)
3605c80476e4SDavid E. O'Brien     int c;
3606c80476e4SDavid E. O'Brien {
3607c80476e4SDavid E. O'Brien     USE(c);
3608c80476e4SDavid E. O'Brien     /* do no editing */
3609c80476e4SDavid E. O'Brien     return(CC_NORM);
3610c80476e4SDavid E. O'Brien }
3611c80476e4SDavid E. O'Brien 
3612c80476e4SDavid E. O'Brien /*ARGSUSED*/
3613c80476e4SDavid E. O'Brien CCRETVAL
3614c80476e4SDavid E. O'Brien e_tty_quit(c)
3615c80476e4SDavid E. O'Brien     int c;
3616c80476e4SDavid E. O'Brien {
3617c80476e4SDavid E. O'Brien     USE(c);
3618c80476e4SDavid E. O'Brien     /* do no editing */
3619c80476e4SDavid E. O'Brien     return(CC_NORM);
3620c80476e4SDavid E. O'Brien }
3621c80476e4SDavid E. O'Brien 
3622c80476e4SDavid E. O'Brien /*ARGSUSED*/
3623c80476e4SDavid E. O'Brien CCRETVAL
3624c80476e4SDavid E. O'Brien e_tty_tsusp(c)
3625c80476e4SDavid E. O'Brien     int c;
3626c80476e4SDavid E. O'Brien {
3627c80476e4SDavid E. O'Brien     USE(c);
3628c80476e4SDavid E. O'Brien     /* do no editing */
3629c80476e4SDavid E. O'Brien     return(CC_NORM);
3630c80476e4SDavid E. O'Brien }
3631c80476e4SDavid E. O'Brien 
3632c80476e4SDavid E. O'Brien /*ARGSUSED*/
3633c80476e4SDavid E. O'Brien CCRETVAL
3634c80476e4SDavid E. O'Brien e_tty_stopo(c)
3635c80476e4SDavid E. O'Brien     int c;
3636c80476e4SDavid E. O'Brien {
3637c80476e4SDavid E. O'Brien     USE(c);
3638c80476e4SDavid E. O'Brien     /* do no editing */
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
3644c80476e4SDavid E. O'Brien e_expand_history(c)
3645c80476e4SDavid E. O'Brien     int c;
3646c80476e4SDavid E. O'Brien {
3647c80476e4SDavid E. O'Brien     USE(c);
3648c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
3649c80476e4SDavid E. O'Brien     c_substitute();
3650c80476e4SDavid E. O'Brien     return(CC_NORM);
3651c80476e4SDavid E. O'Brien }
3652c80476e4SDavid E. O'Brien 
3653c80476e4SDavid E. O'Brien /*ARGSUSED*/
3654c80476e4SDavid E. O'Brien CCRETVAL
3655c80476e4SDavid E. O'Brien e_magic_space(c)
3656c80476e4SDavid E. O'Brien     int c;
3657c80476e4SDavid E. O'Brien {
3658c80476e4SDavid E. O'Brien     USE(c);
3659c80476e4SDavid E. O'Brien     *LastChar = '\0';		/* just in case */
3660c80476e4SDavid E. O'Brien     c_substitute();
3661c80476e4SDavid E. O'Brien     return(e_insert(' '));
3662c80476e4SDavid E. O'Brien }
3663c80476e4SDavid E. O'Brien 
3664c80476e4SDavid E. O'Brien /*ARGSUSED*/
3665c80476e4SDavid E. O'Brien CCRETVAL
3666c80476e4SDavid E. O'Brien e_inc_fwd(c)
3667c80476e4SDavid E. O'Brien     int c;
3668c80476e4SDavid E. O'Brien {
3669c80476e4SDavid E. O'Brien     USE(c);
3670c80476e4SDavid E. O'Brien     patlen = 0;
3671c80476e4SDavid E. O'Brien     return e_inc_search(F_DOWN_SEARCH_HIST);
3672c80476e4SDavid E. O'Brien }
3673c80476e4SDavid E. O'Brien 
3674c80476e4SDavid E. O'Brien 
3675c80476e4SDavid E. O'Brien /*ARGSUSED*/
3676c80476e4SDavid E. O'Brien CCRETVAL
3677c80476e4SDavid E. O'Brien e_inc_back(c)
3678c80476e4SDavid E. O'Brien     int c;
3679c80476e4SDavid E. O'Brien {
3680c80476e4SDavid E. O'Brien     USE(c);
3681c80476e4SDavid E. O'Brien     patlen = 0;
3682c80476e4SDavid E. O'Brien     return e_inc_search(F_UP_SEARCH_HIST);
3683c80476e4SDavid E. O'Brien }
3684c80476e4SDavid E. O'Brien 
3685c80476e4SDavid E. O'Brien /*ARGSUSED*/
3686c80476e4SDavid E. O'Brien CCRETVAL
3687c80476e4SDavid E. O'Brien e_copyprev(c)
3688c80476e4SDavid E. O'Brien     int c;
3689c80476e4SDavid E. O'Brien {
36906767bd61SMark Peek     Char *cp, *oldc, *dp;
3691c80476e4SDavid E. O'Brien 
3692c80476e4SDavid E. O'Brien     USE(c);
3693c80476e4SDavid E. O'Brien     if (Cursor == InputBuf)
3694c80476e4SDavid E. O'Brien 	return(CC_ERROR);
3695c80476e4SDavid E. O'Brien     /* else */
3696c80476e4SDavid E. O'Brien 
3697c80476e4SDavid E. O'Brien     oldc = Cursor;
3698c80476e4SDavid E. O'Brien     /* does a bounds check */
3699c80476e4SDavid E. O'Brien     cp = c_prev_word(Cursor, InputBuf, Argument);
3700c80476e4SDavid E. O'Brien 
3701c80476e4SDavid E. O'Brien     c_insert((int)(oldc - cp));
3702c80476e4SDavid E. O'Brien     for (dp = oldc; cp < oldc && dp < LastChar; cp++)
3703c80476e4SDavid E. O'Brien 	*dp++ = *cp;
3704c80476e4SDavid E. O'Brien 
3705c80476e4SDavid E. O'Brien     Cursor = dp;		/* put cursor at end */
3706c80476e4SDavid E. O'Brien 
3707c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3708c80476e4SDavid E. O'Brien }
3709c80476e4SDavid E. O'Brien 
3710c80476e4SDavid E. O'Brien /*ARGSUSED*/
3711c80476e4SDavid E. O'Brien CCRETVAL
3712c80476e4SDavid E. O'Brien e_tty_starto(c)
3713c80476e4SDavid E. O'Brien     int c;
3714c80476e4SDavid E. O'Brien {
3715c80476e4SDavid E. O'Brien     USE(c);
3716c80476e4SDavid E. O'Brien     /* do no editing */
3717c80476e4SDavid E. O'Brien     return(CC_NORM);
3718c80476e4SDavid E. O'Brien }
3719c80476e4SDavid E. O'Brien 
3720c80476e4SDavid E. O'Brien /*ARGSUSED*/
3721c80476e4SDavid E. O'Brien CCRETVAL
3722c80476e4SDavid E. O'Brien e_load_average(c)
3723c80476e4SDavid E. O'Brien     int c;
3724c80476e4SDavid E. O'Brien {
3725c80476e4SDavid E. O'Brien     USE(c);
3726c80476e4SDavid E. O'Brien     PastBottom();
3727c80476e4SDavid E. O'Brien #ifdef TIOCSTAT
3728c80476e4SDavid E. O'Brien     /*
3729c80476e4SDavid E. O'Brien      * Here we pass &c to the ioctl because some os's (NetBSD) expect it
3730c80476e4SDavid E. O'Brien      * there even if they don't use it. (lukem@netbsd.org)
3731c80476e4SDavid E. O'Brien      */
3732c80476e4SDavid E. O'Brien     if (ioctl(SHIN, TIOCSTAT, (ioctl_t) &c) < 0)
3733c80476e4SDavid E. O'Brien #endif
3734c80476e4SDavid E. O'Brien 	xprintf(CGETS(5, 1, "Load average unavailable\n"));
3735c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3736c80476e4SDavid E. O'Brien }
3737c80476e4SDavid E. O'Brien 
3738c80476e4SDavid E. O'Brien /*ARGSUSED*/
3739c80476e4SDavid E. O'Brien CCRETVAL
3740c80476e4SDavid E. O'Brien v_chgmeta(c)
3741c80476e4SDavid E. O'Brien     int c;
3742c80476e4SDavid E. O'Brien {
3743c80476e4SDavid E. O'Brien     USE(c);
3744c80476e4SDavid E. O'Brien     /*
3745c80476e4SDavid E. O'Brien      * Delete with insert == change: first we delete and then we leave in
3746c80476e4SDavid E. O'Brien      * insert mode.
3747c80476e4SDavid E. O'Brien      */
3748c80476e4SDavid E. O'Brien     return(v_action(TCSHOP_DELETE|TCSHOP_INSERT));
3749c80476e4SDavid E. O'Brien }
3750c80476e4SDavid E. O'Brien 
3751c80476e4SDavid E. O'Brien /*ARGSUSED*/
3752c80476e4SDavid E. O'Brien CCRETVAL
3753c80476e4SDavid E. O'Brien v_delmeta(c)
3754c80476e4SDavid E. O'Brien     int c;
3755c80476e4SDavid E. O'Brien {
3756c80476e4SDavid E. O'Brien     USE(c);
3757c80476e4SDavid E. O'Brien     return(v_action(TCSHOP_DELETE));
3758c80476e4SDavid E. O'Brien }
3759c80476e4SDavid E. O'Brien 
3760c80476e4SDavid E. O'Brien 
3761c80476e4SDavid E. O'Brien /*ARGSUSED*/
3762c80476e4SDavid E. O'Brien CCRETVAL
3763c80476e4SDavid E. O'Brien v_endword(c)
3764c80476e4SDavid E. O'Brien     int c;
3765c80476e4SDavid E. O'Brien {
3766c80476e4SDavid E. O'Brien     USE(c);
3767c80476e4SDavid E. O'Brien     if (Cursor == LastChar)
3768c80476e4SDavid E. O'Brien 	return(CC_ERROR);
3769c80476e4SDavid E. O'Brien     /* else */
3770c80476e4SDavid E. O'Brien 
37716767bd61SMark Peek     Cursor = c_endword(Cursor, LastChar, Argument, STRshwspace);
3772c80476e4SDavid E. O'Brien 
3773c80476e4SDavid E. O'Brien     if (ActionFlag & TCSHOP_DELETE)
3774c80476e4SDavid E. O'Brien     {
3775c80476e4SDavid E. O'Brien 	Cursor++;
3776c80476e4SDavid E. O'Brien 	c_delfini();
3777c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
3778c80476e4SDavid E. O'Brien     }
3779c80476e4SDavid E. O'Brien 
3780c80476e4SDavid E. O'Brien     RefCursor();
3781c80476e4SDavid E. O'Brien     return(CC_NORM);
3782c80476e4SDavid E. O'Brien }
3783c80476e4SDavid E. O'Brien 
3784c80476e4SDavid E. O'Brien /*ARGSUSED*/
3785c80476e4SDavid E. O'Brien CCRETVAL
3786c80476e4SDavid E. O'Brien v_eword(c)
3787c80476e4SDavid E. O'Brien     int c;
3788c80476e4SDavid E. O'Brien {
3789c80476e4SDavid E. O'Brien     USE(c);
3790c80476e4SDavid E. O'Brien     if (Cursor == LastChar)
3791c80476e4SDavid E. O'Brien 	return(CC_ERROR);
3792c80476e4SDavid E. O'Brien     /* else */
3793c80476e4SDavid E. O'Brien 
3794c80476e4SDavid E. O'Brien     Cursor = c_eword(Cursor, LastChar, Argument);
3795c80476e4SDavid E. O'Brien 
3796c80476e4SDavid E. O'Brien     if (ActionFlag & TCSHOP_DELETE) {
3797c80476e4SDavid E. O'Brien 	Cursor++;
3798c80476e4SDavid E. O'Brien 	c_delfini();
3799c80476e4SDavid E. O'Brien 	return(CC_REFRESH);
3800c80476e4SDavid E. O'Brien     }
3801c80476e4SDavid E. O'Brien 
3802c80476e4SDavid E. O'Brien     RefCursor();
3803c80476e4SDavid E. O'Brien     return(CC_NORM);
3804c80476e4SDavid E. O'Brien }
3805c80476e4SDavid E. O'Brien 
3806c80476e4SDavid E. O'Brien /*ARGSUSED*/
3807c80476e4SDavid E. O'Brien CCRETVAL
3808c80476e4SDavid E. O'Brien v_char_fwd(c)
3809c80476e4SDavid E. O'Brien     int c;
3810c80476e4SDavid E. O'Brien {
3811c80476e4SDavid E. O'Brien     Char ch;
3812c80476e4SDavid E. O'Brien 
3813c80476e4SDavid E. O'Brien     USE(c);
3814c80476e4SDavid E. O'Brien     if (GetNextChar(&ch) != 1)
3815c80476e4SDavid E. O'Brien 	return e_send_eof(0);
3816c80476e4SDavid E. O'Brien 
3817c80476e4SDavid E. O'Brien     srch_dir = CHAR_FWD;
3818c80476e4SDavid E. O'Brien     srch_char = ch;
3819c80476e4SDavid E. O'Brien 
3820c80476e4SDavid E. O'Brien     return v_csearch_fwd(ch, Argument, 0);
3821c80476e4SDavid E. O'Brien 
3822c80476e4SDavid E. O'Brien }
3823c80476e4SDavid E. O'Brien 
3824c80476e4SDavid E. O'Brien /*ARGSUSED*/
3825c80476e4SDavid E. O'Brien CCRETVAL
3826c80476e4SDavid E. O'Brien v_char_back(c)
3827c80476e4SDavid E. O'Brien     int c;
3828c80476e4SDavid E. O'Brien {
3829c80476e4SDavid E. O'Brien     Char ch;
3830c80476e4SDavid E. O'Brien 
3831c80476e4SDavid E. O'Brien     USE(c);
3832c80476e4SDavid E. O'Brien     if (GetNextChar(&ch) != 1)
3833c80476e4SDavid E. O'Brien 	return e_send_eof(0);
3834c80476e4SDavid E. O'Brien 
3835c80476e4SDavid E. O'Brien     srch_dir = CHAR_BACK;
3836c80476e4SDavid E. O'Brien     srch_char = ch;
3837c80476e4SDavid E. O'Brien 
3838c80476e4SDavid E. O'Brien     return v_csearch_back(ch, Argument, 0);
3839c80476e4SDavid E. O'Brien }
3840c80476e4SDavid E. O'Brien 
3841c80476e4SDavid E. O'Brien /*ARGSUSED*/
3842c80476e4SDavid E. O'Brien CCRETVAL
3843c80476e4SDavid E. O'Brien v_charto_fwd(c)
3844c80476e4SDavid E. O'Brien     int c;
3845c80476e4SDavid E. O'Brien {
3846c80476e4SDavid E. O'Brien     Char ch;
3847c80476e4SDavid E. O'Brien 
3848c80476e4SDavid E. O'Brien     USE(c);
3849c80476e4SDavid E. O'Brien     if (GetNextChar(&ch) != 1)
3850c80476e4SDavid E. O'Brien 	return e_send_eof(0);
3851c80476e4SDavid E. O'Brien 
3852c80476e4SDavid E. O'Brien     return v_csearch_fwd(ch, Argument, 1);
3853c80476e4SDavid E. O'Brien 
3854c80476e4SDavid E. O'Brien }
3855c80476e4SDavid E. O'Brien 
3856c80476e4SDavid E. O'Brien /*ARGSUSED*/
3857c80476e4SDavid E. O'Brien CCRETVAL
3858c80476e4SDavid E. O'Brien v_charto_back(c)
3859c80476e4SDavid E. O'Brien     int c;
3860c80476e4SDavid E. O'Brien {
3861c80476e4SDavid E. O'Brien     Char ch;
3862c80476e4SDavid E. O'Brien 
3863c80476e4SDavid E. O'Brien     USE(c);
3864c80476e4SDavid E. O'Brien     if (GetNextChar(&ch) != 1)
3865c80476e4SDavid E. O'Brien 	return e_send_eof(0);
3866c80476e4SDavid E. O'Brien 
3867c80476e4SDavid E. O'Brien     return v_csearch_back(ch, Argument, 1);
3868c80476e4SDavid E. O'Brien }
3869c80476e4SDavid E. O'Brien 
3870c80476e4SDavid E. O'Brien /*ARGSUSED*/
3871c80476e4SDavid E. O'Brien CCRETVAL
3872c80476e4SDavid E. O'Brien v_rchar_fwd(c)
3873c80476e4SDavid E. O'Brien     int c;
3874c80476e4SDavid E. O'Brien {
3875c80476e4SDavid E. O'Brien     USE(c);
3876c80476e4SDavid E. O'Brien     if (srch_char == 0)
3877c80476e4SDavid E. O'Brien 	return CC_ERROR;
3878c80476e4SDavid E. O'Brien 
3879c80476e4SDavid E. O'Brien     return srch_dir == CHAR_FWD ? v_csearch_fwd(srch_char, Argument, 0) :
3880c80476e4SDavid E. O'Brien 			          v_csearch_back(srch_char, Argument, 0);
3881c80476e4SDavid E. O'Brien }
3882c80476e4SDavid E. O'Brien 
3883c80476e4SDavid E. O'Brien /*ARGSUSED*/
3884c80476e4SDavid E. O'Brien CCRETVAL
3885c80476e4SDavid E. O'Brien v_rchar_back(c)
3886c80476e4SDavid E. O'Brien     int c;
3887c80476e4SDavid E. O'Brien {
3888c80476e4SDavid E. O'Brien     USE(c);
3889c80476e4SDavid E. O'Brien     if (srch_char == 0)
3890c80476e4SDavid E. O'Brien 	return CC_ERROR;
3891c80476e4SDavid E. O'Brien 
3892c80476e4SDavid E. O'Brien     return srch_dir == CHAR_BACK ? v_csearch_fwd(srch_char, Argument, 0) :
3893c80476e4SDavid E. O'Brien 			           v_csearch_back(srch_char, Argument, 0);
3894c80476e4SDavid E. O'Brien }
3895c80476e4SDavid E. O'Brien 
3896c80476e4SDavid E. O'Brien /*ARGSUSED*/
3897c80476e4SDavid E. O'Brien CCRETVAL
3898c80476e4SDavid E. O'Brien v_undo(c)
3899c80476e4SDavid E. O'Brien     int c;
3900c80476e4SDavid E. O'Brien {
39016767bd61SMark Peek     int  loop;
39026767bd61SMark Peek     Char *kp, *cp;
3903c80476e4SDavid E. O'Brien     Char temp;
3904c80476e4SDavid E. O'Brien     int	 size;
3905c80476e4SDavid E. O'Brien 
3906c80476e4SDavid E. O'Brien     USE(c);
3907c80476e4SDavid E. O'Brien     switch (UndoAction) {
3908c80476e4SDavid E. O'Brien     case TCSHOP_DELETE|TCSHOP_INSERT:
3909c80476e4SDavid E. O'Brien     case TCSHOP_DELETE:
3910c80476e4SDavid E. O'Brien 	if (UndoSize == 0) return(CC_NORM);
3911c80476e4SDavid E. O'Brien 	cp = UndoPtr;
3912c80476e4SDavid E. O'Brien 	kp = UndoBuf;
3913c80476e4SDavid E. O'Brien 	for (loop=0; loop < UndoSize; loop++)	/* copy the chars */
3914c80476e4SDavid E. O'Brien 	    *kp++ = *cp++;			/* into UndoBuf   */
3915c80476e4SDavid E. O'Brien 
3916c80476e4SDavid E. O'Brien 	for (cp = UndoPtr; cp <= LastChar; cp++)
3917c80476e4SDavid E. O'Brien 	    *cp = cp[UndoSize];
3918c80476e4SDavid E. O'Brien 
3919c80476e4SDavid E. O'Brien 	LastChar -= UndoSize;
3920c80476e4SDavid E. O'Brien 	Cursor   =  UndoPtr;
3921c80476e4SDavid E. O'Brien 
3922c80476e4SDavid E. O'Brien 	UndoAction = TCSHOP_INSERT;
3923c80476e4SDavid E. O'Brien 	break;
3924c80476e4SDavid E. O'Brien 
3925c80476e4SDavid E. O'Brien     case TCSHOP_INSERT:
3926c80476e4SDavid E. O'Brien 	if (UndoSize == 0) return(CC_NORM);
3927c80476e4SDavid E. O'Brien 	cp = UndoPtr;
3928c80476e4SDavid E. O'Brien 	Cursor = UndoPtr;
3929c80476e4SDavid E. O'Brien 	kp = UndoBuf;
3930c80476e4SDavid E. O'Brien 	c_insert(UndoSize);		/* open the space, */
3931c80476e4SDavid E. O'Brien 	for (loop = 0; loop < UndoSize; loop++)	/* copy the chars */
3932c80476e4SDavid E. O'Brien 	    *cp++ = *kp++;
3933c80476e4SDavid E. O'Brien 
3934c80476e4SDavid E. O'Brien 	UndoAction = TCSHOP_DELETE;
3935c80476e4SDavid E. O'Brien 	break;
3936c80476e4SDavid E. O'Brien 
3937c80476e4SDavid E. O'Brien     case TCSHOP_CHANGE:
3938c80476e4SDavid E. O'Brien 	if (UndoSize == 0) return(CC_NORM);
3939c80476e4SDavid E. O'Brien 	cp = UndoPtr;
3940c80476e4SDavid E. O'Brien 	Cursor = UndoPtr;
3941c80476e4SDavid E. O'Brien 	kp = UndoBuf;
3942c80476e4SDavid E. O'Brien 	size = (int)(Cursor-LastChar); /*  NOT NSL independant */
3943c80476e4SDavid E. O'Brien 	if (size < UndoSize)
3944c80476e4SDavid E. O'Brien 	    size = UndoSize;
3945c80476e4SDavid E. O'Brien 	for(loop = 0; loop < size; loop++) {
3946c80476e4SDavid E. O'Brien 	    temp = *kp;
3947c80476e4SDavid E. O'Brien 	    *kp++ = *cp;
3948c80476e4SDavid E. O'Brien 	    *cp++ = temp;
3949c80476e4SDavid E. O'Brien 	}
3950c80476e4SDavid E. O'Brien 	break;
3951c80476e4SDavid E. O'Brien 
3952c80476e4SDavid E. O'Brien     default:
3953c80476e4SDavid E. O'Brien 	return(CC_ERROR);
3954c80476e4SDavid E. O'Brien     }
3955c80476e4SDavid E. O'Brien 
3956c80476e4SDavid E. O'Brien     return(CC_REFRESH);
3957c80476e4SDavid E. O'Brien }
3958c80476e4SDavid E. O'Brien 
3959c80476e4SDavid E. O'Brien /*ARGSUSED*/
3960c80476e4SDavid E. O'Brien CCRETVAL
3961c80476e4SDavid E. O'Brien v_ush_meta(c)
3962c80476e4SDavid E. O'Brien     int c;
3963c80476e4SDavid E. O'Brien {
3964c80476e4SDavid E. O'Brien     USE(c);
3965c80476e4SDavid E. O'Brien     return v_search(F_UP_SEARCH_HIST);
3966c80476e4SDavid E. O'Brien }
3967c80476e4SDavid E. O'Brien 
3968c80476e4SDavid E. O'Brien /*ARGSUSED*/
3969c80476e4SDavid E. O'Brien CCRETVAL
3970c80476e4SDavid E. O'Brien v_dsh_meta(c)
3971c80476e4SDavid E. O'Brien     int c;
3972c80476e4SDavid E. O'Brien {
3973c80476e4SDavid E. O'Brien     USE(c);
3974c80476e4SDavid E. O'Brien     return v_search(F_DOWN_SEARCH_HIST);
3975c80476e4SDavid E. O'Brien }
3976c80476e4SDavid E. O'Brien 
3977c80476e4SDavid E. O'Brien /*ARGSUSED*/
3978c80476e4SDavid E. O'Brien CCRETVAL
3979c80476e4SDavid E. O'Brien v_rsrch_fwd(c)
3980c80476e4SDavid E. O'Brien     int c;
3981c80476e4SDavid E. O'Brien {
3982c80476e4SDavid E. O'Brien     USE(c);
3983c80476e4SDavid E. O'Brien     if (patlen == 0) return(CC_ERROR);
3984c80476e4SDavid E. O'Brien     return(v_repeat_srch(searchdir));
3985c80476e4SDavid E. O'Brien }
3986c80476e4SDavid E. O'Brien 
3987c80476e4SDavid E. O'Brien /*ARGSUSED*/
3988c80476e4SDavid E. O'Brien CCRETVAL
3989c80476e4SDavid E. O'Brien v_rsrch_back(c)
3990c80476e4SDavid E. O'Brien     int c;
3991c80476e4SDavid E. O'Brien {
3992c80476e4SDavid E. O'Brien     USE(c);
3993c80476e4SDavid E. O'Brien     if (patlen == 0) return(CC_ERROR);
3994c80476e4SDavid E. O'Brien     return(v_repeat_srch(searchdir == F_UP_SEARCH_HIST ?
3995c80476e4SDavid E. O'Brien 			 F_DOWN_SEARCH_HIST : F_UP_SEARCH_HIST));
3996c80476e4SDavid E. O'Brien }
3997c80476e4SDavid E. O'Brien 
39983b6eaa7bSAndrey A. Chernov #ifndef WINNT_NATIVE
3999c80476e4SDavid E. O'Brien /* Since ed.defns.h  is generated from ed.defns.c, these empty
4000c80476e4SDavid E. O'Brien    functions will keep the F_NUM_FNS consistent
4001c80476e4SDavid E. O'Brien  */
4002c80476e4SDavid E. O'Brien CCRETVAL
4003c80476e4SDavid E. O'Brien e_copy_to_clipboard(c)
4004c80476e4SDavid E. O'Brien     int c;
4005c80476e4SDavid E. O'Brien {
4006c80476e4SDavid E. O'Brien     USE(c);
4007c80476e4SDavid E. O'Brien     return CC_ERROR;
4008c80476e4SDavid E. O'Brien }
4009c80476e4SDavid E. O'Brien 
4010c80476e4SDavid E. O'Brien CCRETVAL
4011c80476e4SDavid E. O'Brien e_paste_from_clipboard(c)
4012c80476e4SDavid E. O'Brien     int c;
4013c80476e4SDavid E. O'Brien {
4014c80476e4SDavid E. O'Brien     USE(c);
4015c80476e4SDavid E. O'Brien     return (CC_ERROR);
4016c80476e4SDavid E. O'Brien }
4017c80476e4SDavid E. O'Brien 
4018c80476e4SDavid E. O'Brien CCRETVAL
4019c80476e4SDavid E. O'Brien e_dosify_next(c)
4020c80476e4SDavid E. O'Brien     int c;
4021c80476e4SDavid E. O'Brien {
4022c80476e4SDavid E. O'Brien     USE(c);
4023c80476e4SDavid E. O'Brien     return (CC_ERROR);
4024c80476e4SDavid E. O'Brien }
4025c80476e4SDavid E. O'Brien CCRETVAL
4026c80476e4SDavid E. O'Brien e_dosify_prev(c)
4027c80476e4SDavid E. O'Brien     int c;
4028c80476e4SDavid E. O'Brien {
4029c80476e4SDavid E. O'Brien     USE(c);
4030c80476e4SDavid E. O'Brien     return (CC_ERROR);
4031c80476e4SDavid E. O'Brien }
4032c80476e4SDavid E. O'Brien CCRETVAL
40333b6eaa7bSAndrey A. Chernov e_page_up(c)
4034c80476e4SDavid E. O'Brien     int c;
4035c80476e4SDavid E. O'Brien {
4036c80476e4SDavid E. O'Brien     USE(c);
4037c80476e4SDavid E. O'Brien     return (CC_ERROR);
4038c80476e4SDavid E. O'Brien }
4039c80476e4SDavid E. O'Brien CCRETVAL
40403b6eaa7bSAndrey A. Chernov e_page_down(c)
4041c80476e4SDavid E. O'Brien     int c;
4042c80476e4SDavid E. O'Brien {
4043c80476e4SDavid E. O'Brien     USE(c);
4044c80476e4SDavid E. O'Brien     return (CC_ERROR);
4045c80476e4SDavid E. O'Brien }
40463b6eaa7bSAndrey A. Chernov #endif /* !WINNT_NATIVE */
4047c80476e4SDavid E. O'Brien 
4048c80476e4SDavid E. O'Brien #ifdef notdef
4049c80476e4SDavid E. O'Brien void
4050c80476e4SDavid E. O'Brien MoveCursor(n)			/* move cursor + right - left char */
4051c80476e4SDavid E. O'Brien     int     n;
4052c80476e4SDavid E. O'Brien {
4053c80476e4SDavid E. O'Brien     Cursor = Cursor + n;
4054c80476e4SDavid E. O'Brien     if (Cursor < InputBuf)
4055c80476e4SDavid E. O'Brien 	Cursor = InputBuf;
4056c80476e4SDavid E. O'Brien     if (Cursor > LastChar)
4057c80476e4SDavid E. O'Brien 	Cursor = LastChar;
4058c80476e4SDavid E. O'Brien     return;
4059c80476e4SDavid E. O'Brien }
4060c80476e4SDavid E. O'Brien 
4061c80476e4SDavid E. O'Brien Char *
4062c80476e4SDavid E. O'Brien GetCursor()
4063c80476e4SDavid E. O'Brien {
4064c80476e4SDavid E. O'Brien     return(Cursor);
4065c80476e4SDavid E. O'Brien }
4066c80476e4SDavid E. O'Brien 
4067c80476e4SDavid E. O'Brien int
4068c80476e4SDavid E. O'Brien PutCursor(p)
4069c80476e4SDavid E. O'Brien     Char   *p;
4070c80476e4SDavid E. O'Brien {
4071c80476e4SDavid E. O'Brien     if (p < InputBuf || p > LastChar)
4072c80476e4SDavid E. O'Brien 	return 1;		/* Error */
4073c80476e4SDavid E. O'Brien     Cursor = p;
4074c80476e4SDavid E. O'Brien     return 0;
4075c80476e4SDavid E. O'Brien }
4076c80476e4SDavid E. O'Brien #endif
4077