1*b30d1939SAndy Fiddaman /***********************************************************************
2*b30d1939SAndy Fiddaman *                                                                      *
3*b30d1939SAndy Fiddaman *               This software is part of the ast package               *
4*b30d1939SAndy Fiddaman *          Copyright (c) 1982-2012 AT&T Intellectual Property          *
5*b30d1939SAndy Fiddaman *                      and is licensed under the                       *
6*b30d1939SAndy Fiddaman *                 Eclipse Public License, Version 1.0                  *
7*b30d1939SAndy Fiddaman *                    by AT&T Intellectual Property                     *
8*b30d1939SAndy Fiddaman *                                                                      *
9*b30d1939SAndy Fiddaman *                A copy of the License is available at                 *
10*b30d1939SAndy Fiddaman *          http://www.eclipse.org/org/documents/epl-v10.html           *
11*b30d1939SAndy Fiddaman *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12*b30d1939SAndy Fiddaman *                                                                      *
13*b30d1939SAndy Fiddaman *              Information and Software Systems Research               *
14*b30d1939SAndy Fiddaman *                            AT&T Research                             *
15*b30d1939SAndy Fiddaman *                           Florham Park NJ                            *
16*b30d1939SAndy Fiddaman *                                                                      *
17*b30d1939SAndy Fiddaman *                  David Korn <dgk@research.att.com>                   *
18*b30d1939SAndy Fiddaman *                                                                      *
19*b30d1939SAndy Fiddaman ***********************************************************************/
20*b30d1939SAndy Fiddaman #pragma prototyped
21*b30d1939SAndy Fiddaman /* Original version by Michael T. Veach
22*b30d1939SAndy Fiddaman  * Adapted for ksh by David Korn */
23*b30d1939SAndy Fiddaman /* EMACS_MODES: c tabstop=4
24*b30d1939SAndy Fiddaman 
25*b30d1939SAndy Fiddaman One line screen editor for any program
26*b30d1939SAndy Fiddaman 
27*b30d1939SAndy Fiddaman */
28*b30d1939SAndy Fiddaman 
29*b30d1939SAndy Fiddaman 
30*b30d1939SAndy Fiddaman /*	The following is provided by:
31*b30d1939SAndy Fiddaman  *
32*b30d1939SAndy Fiddaman  *			Matthijs N. Melchior
33*b30d1939SAndy Fiddaman  *			AT&T Network Systems International
34*b30d1939SAndy Fiddaman  *			APT Nederland
35*b30d1939SAndy Fiddaman  *			HV BZ335 x2962
36*b30d1939SAndy Fiddaman  *			hvlpb!mmelchio
37*b30d1939SAndy Fiddaman  *
38*b30d1939SAndy Fiddaman  *  These are now on by default
39*b30d1939SAndy Fiddaman  *
40*b30d1939SAndy Fiddaman  *  ESH_NFIRST
41*b30d1939SAndy Fiddaman  *	-  A ^N as first history related command after the prompt will move
42*b30d1939SAndy Fiddaman  *	   to the next command relative to the last known history position.
43*b30d1939SAndy Fiddaman  *	   It will not start at the position where the last command was entered
44*b30d1939SAndy Fiddaman  *	   as is done by the ^P command.  Every history related command will
45*b30d1939SAndy Fiddaman  *	   set both the current and last position.  Executing a command will
46*b30d1939SAndy Fiddaman  *	   only set the current position.
47*b30d1939SAndy Fiddaman  *
48*b30d1939SAndy Fiddaman  *  ESH_KAPPEND
49*b30d1939SAndy Fiddaman  *	-  Successive kill and delete commands will accumulate their data
50*b30d1939SAndy Fiddaman  *	   in the kill buffer, by appending or prepending as appropriate.
51*b30d1939SAndy Fiddaman  *	   This mode will be reset by any command not adding something to the
52*b30d1939SAndy Fiddaman  *	   kill buffer.
53*b30d1939SAndy Fiddaman  *
54*b30d1939SAndy Fiddaman  *  ESH_BETTER
55*b30d1939SAndy Fiddaman  *	-  Some enhancements:
56*b30d1939SAndy Fiddaman  *		- argument for a macro is passed to its replacement
57*b30d1939SAndy Fiddaman  *		- ^X^H command to find out about history position (debugging)
58*b30d1939SAndy Fiddaman  *		- ^X^D command to show any debugging info
59*b30d1939SAndy Fiddaman  *
60*b30d1939SAndy Fiddaman  *  I do not pretend these for changes are completely independent,
61*b30d1939SAndy Fiddaman  *  but you can use them to seperate features.
62*b30d1939SAndy Fiddaman  */
63*b30d1939SAndy Fiddaman 
64*b30d1939SAndy Fiddaman #include	<ast.h>
65*b30d1939SAndy Fiddaman #include	"FEATURE/cmds"
66*b30d1939SAndy Fiddaman #if KSHELL
67*b30d1939SAndy Fiddaman #   include	"defs.h"
68*b30d1939SAndy Fiddaman #else
69*b30d1939SAndy Fiddaman #   include	<ctype.h>
70*b30d1939SAndy Fiddaman #endif	/* KSHELL */
71*b30d1939SAndy Fiddaman #include	"io.h"
72*b30d1939SAndy Fiddaman 
73*b30d1939SAndy Fiddaman #include	"history.h"
74*b30d1939SAndy Fiddaman #include	"edit.h"
75*b30d1939SAndy Fiddaman #include	"terminal.h"
76*b30d1939SAndy Fiddaman 
77*b30d1939SAndy Fiddaman #define ESH_NFIRST
78*b30d1939SAndy Fiddaman #define ESH_KAPPEND
79*b30d1939SAndy Fiddaman #define ESH_BETTER
80*b30d1939SAndy Fiddaman 
81*b30d1939SAndy Fiddaman #undef putchar
82*b30d1939SAndy Fiddaman #define putchar(ed,c)	ed_putchar(ed,c)
83*b30d1939SAndy Fiddaman #define beep()		ed_ringbell()
84*b30d1939SAndy Fiddaman 
85*b30d1939SAndy Fiddaman 
86*b30d1939SAndy Fiddaman #if SHOPT_MULTIBYTE
87*b30d1939SAndy Fiddaman #   define gencpy(a,b)	ed_gencpy(a,b)
88*b30d1939SAndy Fiddaman #   define genncpy(a,b,n)	ed_genncpy(a,b,n)
89*b30d1939SAndy Fiddaman #   define genlen(str)	ed_genlen(str)
90*b30d1939SAndy Fiddaman     static int	print(int);
91*b30d1939SAndy Fiddaman     static int	_isword(int);
92*b30d1939SAndy Fiddaman #   define  isword(c)	_isword(out[c])
93*b30d1939SAndy Fiddaman #   define digit(c)	((c&~STRIP)==0 && isdigit(c))
94*b30d1939SAndy Fiddaman 
95*b30d1939SAndy Fiddaman #else
96*b30d1939SAndy Fiddaman #   define gencpy(a,b)	strcpy((char*)(a),(char*)(b))
97*b30d1939SAndy Fiddaman #   define genncpy(a,b,n)	strncpy((char*)(a),(char*)(b),n)
98*b30d1939SAndy Fiddaman #   define genlen(str)	strlen(str)
99*b30d1939SAndy Fiddaman #   define print(c)	isprint(c)
100*b30d1939SAndy Fiddaman #   define isword(c)	(isalnum(out[c]) || (out[c]=='_'))
101*b30d1939SAndy Fiddaman #   define digit(c)	isdigit(c)
102*b30d1939SAndy Fiddaman #endif /*SHOPT_MULTIBYTE */
103*b30d1939SAndy Fiddaman 
104*b30d1939SAndy Fiddaman typedef struct _emacs_
105*b30d1939SAndy Fiddaman {
106*b30d1939SAndy Fiddaman 	genchar *screen;	/* pointer to window buffer */
107*b30d1939SAndy Fiddaman 	genchar *cursor;	/* Cursor in real screen */
108*b30d1939SAndy Fiddaman 	int 	mark;
109*b30d1939SAndy Fiddaman 	int 	in_mult;
110*b30d1939SAndy Fiddaman 	char	cr_ok;
111*b30d1939SAndy Fiddaman 	char	CntrlO;
112*b30d1939SAndy Fiddaman 	char	overflow;		/* Screen overflow flag set */
113*b30d1939SAndy Fiddaman 	char	scvalid;		/* Screen is up to date */
114*b30d1939SAndy Fiddaman 	char	lastdraw;	/* last update type */
115*b30d1939SAndy Fiddaman 	int	offset;		/* Screen offset */
116*b30d1939SAndy Fiddaman 	enum
117*b30d1939SAndy Fiddaman 	{
118*b30d1939SAndy Fiddaman 		CRT=0,	/* Crt terminal */
119*b30d1939SAndy Fiddaman 		PAPER	/* Paper terminal */
120*b30d1939SAndy Fiddaman 	} terminal;
121*b30d1939SAndy Fiddaman 	Histloc_t _location;
122*b30d1939SAndy Fiddaman 	int	prevdirection;
123*b30d1939SAndy Fiddaman 	Edit_t	*ed;	/* pointer to edit data */
124*b30d1939SAndy Fiddaman } Emacs_t;
125*b30d1939SAndy Fiddaman 
126*b30d1939SAndy Fiddaman #define	editb		(*ep->ed)
127*b30d1939SAndy Fiddaman #define eol		editb.e_eol
128*b30d1939SAndy Fiddaman #define cur		editb.e_cur
129*b30d1939SAndy Fiddaman #define hline		editb.e_hline
130*b30d1939SAndy Fiddaman #define hloff		editb.e_hloff
131*b30d1939SAndy Fiddaman #define hismin		editb.e_hismin
132*b30d1939SAndy Fiddaman #define usrkill		editb.e_kill
133*b30d1939SAndy Fiddaman #define usrlnext	editb.e_lnext
134*b30d1939SAndy Fiddaman #define usreof		editb.e_eof
135*b30d1939SAndy Fiddaman #define usrerase	editb.e_erase
136*b30d1939SAndy Fiddaman #define crallowed	editb.e_crlf
137*b30d1939SAndy Fiddaman #define Prompt		editb.e_prompt
138*b30d1939SAndy Fiddaman #define plen		editb.e_plen
139*b30d1939SAndy Fiddaman #define kstack		editb.e_killbuf
140*b30d1939SAndy Fiddaman #define lstring		editb.e_search
141*b30d1939SAndy Fiddaman #define lookahead	editb.e_lookahead
142*b30d1939SAndy Fiddaman #define env		editb.e_env
143*b30d1939SAndy Fiddaman #define raw		editb.e_raw
144*b30d1939SAndy Fiddaman #define histlines	editb.e_hismax
145*b30d1939SAndy Fiddaman #define w_size		editb.e_wsize
146*b30d1939SAndy Fiddaman #define drawbuff	editb.e_inbuf
147*b30d1939SAndy Fiddaman #define killing		editb.e_mode
148*b30d1939SAndy Fiddaman #define location	ep->_location
149*b30d1939SAndy Fiddaman 
150*b30d1939SAndy Fiddaman #define LBUF	100
151*b30d1939SAndy Fiddaman #define KILLCHAR	UKILL
152*b30d1939SAndy Fiddaman #define ERASECHAR	UERASE
153*b30d1939SAndy Fiddaman #define EOFCHAR		UEOF
154*b30d1939SAndy Fiddaman #define LNEXTCHAR		ULNEXT
155*b30d1939SAndy Fiddaman #define DELETE		('a'==97?0177:7)
156*b30d1939SAndy Fiddaman 
157*b30d1939SAndy Fiddaman /**********************
158*b30d1939SAndy Fiddaman A large lookahead helps when the user is inserting
159*b30d1939SAndy Fiddaman characters in the middle of the line.
160*b30d1939SAndy Fiddaman ************************/
161*b30d1939SAndy Fiddaman 
162*b30d1939SAndy Fiddaman 
163*b30d1939SAndy Fiddaman typedef enum
164*b30d1939SAndy Fiddaman {
165*b30d1939SAndy Fiddaman 	FIRST,		/* First time thru for logical line, prompt on screen */
166*b30d1939SAndy Fiddaman 	REFRESH,	/* Redraw entire screen */
167*b30d1939SAndy Fiddaman 	APPEND,		/* Append char before cursor to screen */
168*b30d1939SAndy Fiddaman 	UPDATE,		/* Update the screen as need be */
169*b30d1939SAndy Fiddaman 	FINAL		/* Update screen even if pending look ahead */
170*b30d1939SAndy Fiddaman } Draw_t;
171*b30d1939SAndy Fiddaman 
172*b30d1939SAndy Fiddaman static void draw(Emacs_t*,Draw_t);
173*b30d1939SAndy Fiddaman static int escape(Emacs_t*,genchar*, int);
174*b30d1939SAndy Fiddaman static void putstring(Emacs_t*,char*);
175*b30d1939SAndy Fiddaman static void search(Emacs_t*,genchar*,int);
176*b30d1939SAndy Fiddaman static void setcursor(Emacs_t*,int, int);
177*b30d1939SAndy Fiddaman static void show_info(Emacs_t*,const char*);
178*b30d1939SAndy Fiddaman static void xcommands(Emacs_t*,int);
179*b30d1939SAndy Fiddaman 
ed_emacsread(void * context,int fd,char * buff,int scend,int reedit)180*b30d1939SAndy Fiddaman int ed_emacsread(void *context, int fd,char *buff,int scend, int reedit)
181*b30d1939SAndy Fiddaman {
182*b30d1939SAndy Fiddaman 	Edit_t *ed = (Edit_t*)context;
183*b30d1939SAndy Fiddaman 	register int c;
184*b30d1939SAndy Fiddaman 	register int i;
185*b30d1939SAndy Fiddaman 	register genchar *out;
186*b30d1939SAndy Fiddaman 	register int count;
187*b30d1939SAndy Fiddaman 	register Emacs_t *ep = ed->e_emacs;
188*b30d1939SAndy Fiddaman 	int adjust,oadjust;
189*b30d1939SAndy Fiddaman 	char backslash;
190*b30d1939SAndy Fiddaman 	genchar *kptr;
191*b30d1939SAndy Fiddaman 	char prompt[PRSIZE];
192*b30d1939SAndy Fiddaman 	genchar Screen[MAXLINE];
193*b30d1939SAndy Fiddaman 	memset(Screen,0,sizeof(Screen));
194*b30d1939SAndy Fiddaman 	if(!ep)
195*b30d1939SAndy Fiddaman 	{
196*b30d1939SAndy Fiddaman 		ep = ed->e_emacs = newof(0,Emacs_t,1,0);
197*b30d1939SAndy Fiddaman 		ep->ed = ed;
198*b30d1939SAndy Fiddaman 		ep->prevdirection =  1;
199*b30d1939SAndy Fiddaman 		location.hist_command =  -5;
200*b30d1939SAndy Fiddaman 	}
201*b30d1939SAndy Fiddaman 	Prompt = prompt;
202*b30d1939SAndy Fiddaman 	ep->screen = Screen;
203*b30d1939SAndy Fiddaman 	ep->lastdraw = FINAL;
204*b30d1939SAndy Fiddaman 	if(tty_raw(ERRIO,0) < 0)
205*b30d1939SAndy Fiddaman 	{
206*b30d1939SAndy Fiddaman 		 return(reedit?reedit:ed_read(context, fd,buff,scend,0));
207*b30d1939SAndy Fiddaman 	}
208*b30d1939SAndy Fiddaman 	raw = 1;
209*b30d1939SAndy Fiddaman 	/* This mess in case the read system call fails */
210*b30d1939SAndy Fiddaman 
211*b30d1939SAndy Fiddaman 	ed_setup(ep->ed,fd,reedit);
212*b30d1939SAndy Fiddaman 	out = (genchar*)buff;
213*b30d1939SAndy Fiddaman #if SHOPT_MULTIBYTE
214*b30d1939SAndy Fiddaman 	out = (genchar*)roundof(buff-(char*)0,sizeof(genchar));
215*b30d1939SAndy Fiddaman 	if(reedit)
216*b30d1939SAndy Fiddaman 		ed_internal(buff,out);
217*b30d1939SAndy Fiddaman #endif /* SHOPT_MULTIBYTE */
218*b30d1939SAndy Fiddaman 	if(!kstack)
219*b30d1939SAndy Fiddaman 	{
220*b30d1939SAndy Fiddaman 		kstack = (genchar*)malloc(CHARSIZE*MAXLINE);
221*b30d1939SAndy Fiddaman 		kstack[0] = '\0';
222*b30d1939SAndy Fiddaman 	}
223*b30d1939SAndy Fiddaman 	drawbuff = out;
224*b30d1939SAndy Fiddaman #ifdef ESH_NFIRST
225*b30d1939SAndy Fiddaman 	if (location.hist_command == -5)		/* to be initialized */
226*b30d1939SAndy Fiddaman 	{
227*b30d1939SAndy Fiddaman 		kstack[0] = '\0';		/* also clear kstack... */
228*b30d1939SAndy Fiddaman 		location.hist_command = hline;
229*b30d1939SAndy Fiddaman 		location.hist_line = hloff;
230*b30d1939SAndy Fiddaman 	}
231*b30d1939SAndy Fiddaman 	if (location.hist_command <= hismin)	/* don't start below minimum */
232*b30d1939SAndy Fiddaman 	{
233*b30d1939SAndy Fiddaman 		location.hist_command = hismin + 1;
234*b30d1939SAndy Fiddaman 		location.hist_line = 0;
235*b30d1939SAndy Fiddaman 	}
236*b30d1939SAndy Fiddaman 	ep->in_mult = hloff;			/* save pos in last command */
237*b30d1939SAndy Fiddaman #endif /* ESH_NFIRST */
238*b30d1939SAndy Fiddaman 	i = sigsetjmp(env,0);
239*b30d1939SAndy Fiddaman 	if (i !=0)
240*b30d1939SAndy Fiddaman 	{
241*b30d1939SAndy Fiddaman 		if(ep->ed->e_multiline)
242*b30d1939SAndy Fiddaman 		{
243*b30d1939SAndy Fiddaman 			cur = eol;
244*b30d1939SAndy Fiddaman 			draw(ep,FINAL);
245*b30d1939SAndy Fiddaman 			ed_flush(ep->ed);
246*b30d1939SAndy Fiddaman 		}
247*b30d1939SAndy Fiddaman 		tty_cooked(ERRIO);
248*b30d1939SAndy Fiddaman 		if (i == UEOF)
249*b30d1939SAndy Fiddaman 		{
250*b30d1939SAndy Fiddaman 			return(0); /* EOF */
251*b30d1939SAndy Fiddaman 		}
252*b30d1939SAndy Fiddaman 		return(-1); /* some other error */
253*b30d1939SAndy Fiddaman 	}
254*b30d1939SAndy Fiddaman 	out[reedit] = 0;
255*b30d1939SAndy Fiddaman 	if(scend+plen > (MAXLINE-2))
256*b30d1939SAndy Fiddaman 		scend = (MAXLINE-2)-plen;
257*b30d1939SAndy Fiddaman 	ep->mark = 0;
258*b30d1939SAndy Fiddaman 	cur = eol;
259*b30d1939SAndy Fiddaman 	draw(ep,reedit?REFRESH:FIRST);
260*b30d1939SAndy Fiddaman 	adjust = -1;
261*b30d1939SAndy Fiddaman 	backslash = 0;
262*b30d1939SAndy Fiddaman 	if (ep->CntrlO)
263*b30d1939SAndy Fiddaman 	{
264*b30d1939SAndy Fiddaman #ifdef ESH_NFIRST
265*b30d1939SAndy Fiddaman 		ed_ungetchar(ep->ed,cntl('N'));
266*b30d1939SAndy Fiddaman #else
267*b30d1939SAndy Fiddaman 		location = hist_locate(shgd->hist_ptr,location.hist_command,location.hist_line,1);
268*b30d1939SAndy Fiddaman 		if (location.hist_command < histlines)
269*b30d1939SAndy Fiddaman 		{
270*b30d1939SAndy Fiddaman 			hline = location.hist_command;
271*b30d1939SAndy Fiddaman 			hloff = location.hist_line;
272*b30d1939SAndy Fiddaman 			hist_copy((char*)kstack,MAXLINE, hline,hloff);
273*b30d1939SAndy Fiddaman #   if SHOPT_MULTIBYTE
274*b30d1939SAndy Fiddaman 			ed_internal((char*)kstack,kstack);
275*b30d1939SAndy Fiddaman #   endif /* SHOPT_MULTIBYTE */
276*b30d1939SAndy Fiddaman 			ed_ungetchar(ep->ed,cntl('Y'));
277*b30d1939SAndy Fiddaman 		}
278*b30d1939SAndy Fiddaman #endif /* ESH_NFIRST */
279*b30d1939SAndy Fiddaman 	}
280*b30d1939SAndy Fiddaman 	ep->CntrlO = 0;
281*b30d1939SAndy Fiddaman 	while ((c = ed_getchar(ep->ed,0)) != (-1))
282*b30d1939SAndy Fiddaman 	{
283*b30d1939SAndy Fiddaman 		if (backslash)
284*b30d1939SAndy Fiddaman 		{
285*b30d1939SAndy Fiddaman 			backslash = 0;
286*b30d1939SAndy Fiddaman 			if (c==usrerase||c==usrkill||(!print(c) &&
287*b30d1939SAndy Fiddaman 				(c!='\r'&&c!='\n')))
288*b30d1939SAndy Fiddaman 			{
289*b30d1939SAndy Fiddaman 				/* accept a backslashed character */
290*b30d1939SAndy Fiddaman 				cur--;
291*b30d1939SAndy Fiddaman 				out[cur++] = c;
292*b30d1939SAndy Fiddaman 				out[eol] = '\0';
293*b30d1939SAndy Fiddaman 				draw(ep,APPEND);
294*b30d1939SAndy Fiddaman 				continue;
295*b30d1939SAndy Fiddaman 			}
296*b30d1939SAndy Fiddaman 		}
297*b30d1939SAndy Fiddaman 		if (c == usrkill)
298*b30d1939SAndy Fiddaman 		{
299*b30d1939SAndy Fiddaman 			c = KILLCHAR ;
300*b30d1939SAndy Fiddaman 		}
301*b30d1939SAndy Fiddaman 		else if (c == usrerase)
302*b30d1939SAndy Fiddaman 		{
303*b30d1939SAndy Fiddaman 			c = ERASECHAR ;
304*b30d1939SAndy Fiddaman 		}
305*b30d1939SAndy Fiddaman 		else if (c == usrlnext)
306*b30d1939SAndy Fiddaman 		{
307*b30d1939SAndy Fiddaman 			c = LNEXTCHAR ;
308*b30d1939SAndy Fiddaman 		}
309*b30d1939SAndy Fiddaman 		else if ((c == usreof)&&(eol == 0))
310*b30d1939SAndy Fiddaman 		{
311*b30d1939SAndy Fiddaman 			c = EOFCHAR;
312*b30d1939SAndy Fiddaman 		}
313*b30d1939SAndy Fiddaman #ifdef ESH_KAPPEND
314*b30d1939SAndy Fiddaman 		if (--killing <= 0)	/* reset killing flag */
315*b30d1939SAndy Fiddaman 			killing = 0;
316*b30d1939SAndy Fiddaman #endif
317*b30d1939SAndy Fiddaman 		oadjust = count = adjust;
318*b30d1939SAndy Fiddaman 		if(count<0)
319*b30d1939SAndy Fiddaman 			count = 1;
320*b30d1939SAndy Fiddaman 		adjust = -1;
321*b30d1939SAndy Fiddaman 		i = cur;
322*b30d1939SAndy Fiddaman 		if(c!='\t' && c!=ESC && !digit(c))
323*b30d1939SAndy Fiddaman 			ep->ed->e_tabcount = 0;
324*b30d1939SAndy Fiddaman 		switch(c)
325*b30d1939SAndy Fiddaman 		{
326*b30d1939SAndy Fiddaman 		case LNEXTCHAR:
327*b30d1939SAndy Fiddaman 			c = ed_getchar(ep->ed,2);
328*b30d1939SAndy Fiddaman 			goto do_default_processing;
329*b30d1939SAndy Fiddaman 		case cntl('V'):
330*b30d1939SAndy Fiddaman 			show_info(ep,fmtident(e_version));
331*b30d1939SAndy Fiddaman 			continue;
332*b30d1939SAndy Fiddaman 		case '\0':
333*b30d1939SAndy Fiddaman 			ep->mark = i;
334*b30d1939SAndy Fiddaman 			continue;
335*b30d1939SAndy Fiddaman 		case cntl('X'):
336*b30d1939SAndy Fiddaman 			xcommands(ep,count);
337*b30d1939SAndy Fiddaman 			continue;
338*b30d1939SAndy Fiddaman 		case EOFCHAR:
339*b30d1939SAndy Fiddaman 			ed_flush(ep->ed);
340*b30d1939SAndy Fiddaman 			tty_cooked(ERRIO);
341*b30d1939SAndy Fiddaman 			return(0);
342*b30d1939SAndy Fiddaman #ifdef u370
343*b30d1939SAndy Fiddaman 		case cntl('S') :
344*b30d1939SAndy Fiddaman 		case cntl('Q') :
345*b30d1939SAndy Fiddaman 			continue;
346*b30d1939SAndy Fiddaman #endif	/* u370 */
347*b30d1939SAndy Fiddaman 		case '\t':
348*b30d1939SAndy Fiddaman 			if(cur>0  && ep->ed->sh->nextprompt)
349*b30d1939SAndy Fiddaman 			{
350*b30d1939SAndy Fiddaman 				if(ep->ed->e_tabcount==0)
351*b30d1939SAndy Fiddaman 				{
352*b30d1939SAndy Fiddaman 					ep->ed->e_tabcount=1;
353*b30d1939SAndy Fiddaman 					ed_ungetchar(ep->ed,ESC);
354*b30d1939SAndy Fiddaman 					goto do_escape;
355*b30d1939SAndy Fiddaman 				}
356*b30d1939SAndy Fiddaman 				else if(ep->ed->e_tabcount==1)
357*b30d1939SAndy Fiddaman 				{
358*b30d1939SAndy Fiddaman 					ed_ungetchar(ep->ed,'=');
359*b30d1939SAndy Fiddaman 					goto do_escape;
360*b30d1939SAndy Fiddaman 				}
361*b30d1939SAndy Fiddaman 				ep->ed->e_tabcount = 0;
362*b30d1939SAndy Fiddaman 			}
363*b30d1939SAndy Fiddaman 			/* FALLTHROUGH */
364*b30d1939SAndy Fiddaman 		do_default_processing:
365*b30d1939SAndy Fiddaman 		default:
366*b30d1939SAndy Fiddaman 
367*b30d1939SAndy Fiddaman 			if ((eol+1) >= (scend)) /*  will not fit on line */
368*b30d1939SAndy Fiddaman 			{
369*b30d1939SAndy Fiddaman 				ed_ungetchar(ep->ed,c); /* save character for next line */
370*b30d1939SAndy Fiddaman 				goto process;
371*b30d1939SAndy Fiddaman 			}
372*b30d1939SAndy Fiddaman 			for(i= ++eol; i>cur; i--)
373*b30d1939SAndy Fiddaman 				out[i] = out[i-1];
374*b30d1939SAndy Fiddaman 			backslash =  (c == '\\');
375*b30d1939SAndy Fiddaman 			out[cur++] = c;
376*b30d1939SAndy Fiddaman 			draw(ep,APPEND);
377*b30d1939SAndy Fiddaman 			continue;
378*b30d1939SAndy Fiddaman 		case cntl('Y') :
379*b30d1939SAndy Fiddaman 			{
380*b30d1939SAndy Fiddaman 				c = genlen(kstack);
381*b30d1939SAndy Fiddaman 				if ((c + eol) > scend)
382*b30d1939SAndy Fiddaman 				{
383*b30d1939SAndy Fiddaman 					beep();
384*b30d1939SAndy Fiddaman 					continue;
385*b30d1939SAndy Fiddaman 				}
386*b30d1939SAndy Fiddaman 				ep->mark = i;
387*b30d1939SAndy Fiddaman 				for(i=eol;i>=cur;i--)
388*b30d1939SAndy Fiddaman 					out[c+i] = out[i];
389*b30d1939SAndy Fiddaman 				kptr=kstack;
390*b30d1939SAndy Fiddaman 				while (i = *kptr++)
391*b30d1939SAndy Fiddaman 					out[cur++] = i;
392*b30d1939SAndy Fiddaman 				draw(ep,UPDATE);
393*b30d1939SAndy Fiddaman 				eol = genlen(out);
394*b30d1939SAndy Fiddaman 				continue;
395*b30d1939SAndy Fiddaman 			}
396*b30d1939SAndy Fiddaman 		case '\n':
397*b30d1939SAndy Fiddaman 		case '\r':
398*b30d1939SAndy Fiddaman 			c = '\n';
399*b30d1939SAndy Fiddaman 			goto process;
400*b30d1939SAndy Fiddaman 
401*b30d1939SAndy Fiddaman 		case DELETE:	/* delete char 0x7f */
402*b30d1939SAndy Fiddaman 		case '\b':	/* backspace, ^h */
403*b30d1939SAndy Fiddaman 		case ERASECHAR :
404*b30d1939SAndy Fiddaman 			if (count > i)
405*b30d1939SAndy Fiddaman 				count = i;
406*b30d1939SAndy Fiddaman #ifdef ESH_KAPPEND
407*b30d1939SAndy Fiddaman 			kptr = &kstack[count];	/* move old contents here */
408*b30d1939SAndy Fiddaman 			if (killing)		/* prepend to killbuf */
409*b30d1939SAndy Fiddaman 			{
410*b30d1939SAndy Fiddaman 				c = genlen(kstack) + CHARSIZE; /* include '\0' */
411*b30d1939SAndy Fiddaman 				while(c--)	/* copy stuff */
412*b30d1939SAndy Fiddaman 					kptr[c] = kstack[c];
413*b30d1939SAndy Fiddaman 			}
414*b30d1939SAndy Fiddaman 			else
415*b30d1939SAndy Fiddaman 				*kptr = 0;	/* this is end of data */
416*b30d1939SAndy Fiddaman 			killing = 2;		/* we are killing */
417*b30d1939SAndy Fiddaman 			i -= count;
418*b30d1939SAndy Fiddaman 			eol -= count;
419*b30d1939SAndy Fiddaman 			genncpy(kstack,out+i,cur-i);
420*b30d1939SAndy Fiddaman #else
421*b30d1939SAndy Fiddaman 			while ((count--)&&(i>0))
422*b30d1939SAndy Fiddaman 			{
423*b30d1939SAndy Fiddaman 				i--;
424*b30d1939SAndy Fiddaman 				eol--;
425*b30d1939SAndy Fiddaman 			}
426*b30d1939SAndy Fiddaman 			genncpy(kstack,out+i,cur-i);
427*b30d1939SAndy Fiddaman 			kstack[cur-i] = 0;
428*b30d1939SAndy Fiddaman #endif /* ESH_KAPPEND */
429*b30d1939SAndy Fiddaman 			gencpy(out+i,out+cur);
430*b30d1939SAndy Fiddaman 			ep->mark = i;
431*b30d1939SAndy Fiddaman 			goto update;
432*b30d1939SAndy Fiddaman 		case cntl('W') :
433*b30d1939SAndy Fiddaman #ifdef ESH_KAPPEND
434*b30d1939SAndy Fiddaman 			++killing;		/* keep killing flag */
435*b30d1939SAndy Fiddaman #endif
436*b30d1939SAndy Fiddaman 			if (ep->mark > eol )
437*b30d1939SAndy Fiddaman 				ep->mark = eol;
438*b30d1939SAndy Fiddaman 			if (ep->mark == i)
439*b30d1939SAndy Fiddaman 				continue;
440*b30d1939SAndy Fiddaman 			if (ep->mark > i)
441*b30d1939SAndy Fiddaman 			{
442*b30d1939SAndy Fiddaman 				adjust = ep->mark - i;
443*b30d1939SAndy Fiddaman 				ed_ungetchar(ep->ed,cntl('D'));
444*b30d1939SAndy Fiddaman 				continue;
445*b30d1939SAndy Fiddaman 			}
446*b30d1939SAndy Fiddaman 			adjust = i - ep->mark;
447*b30d1939SAndy Fiddaman 			ed_ungetchar(ep->ed,usrerase);
448*b30d1939SAndy Fiddaman 			continue;
449*b30d1939SAndy Fiddaman 		case cntl('D') :
450*b30d1939SAndy Fiddaman 			ep->mark = i;
451*b30d1939SAndy Fiddaman #ifdef ESH_KAPPEND
452*b30d1939SAndy Fiddaman 			if (killing)
453*b30d1939SAndy Fiddaman 				kptr = &kstack[genlen(kstack)];	/* append here */
454*b30d1939SAndy Fiddaman 			else
455*b30d1939SAndy Fiddaman 				kptr = kstack;
456*b30d1939SAndy Fiddaman 			killing = 2;			/* we are now killing */
457*b30d1939SAndy Fiddaman #else
458*b30d1939SAndy Fiddaman 			kptr = kstack;
459*b30d1939SAndy Fiddaman #endif /* ESH_KAPPEND */
460*b30d1939SAndy Fiddaman 			while ((count--)&&(eol>0)&&(i<eol))
461*b30d1939SAndy Fiddaman 			{
462*b30d1939SAndy Fiddaman 				*kptr++ = out[i];
463*b30d1939SAndy Fiddaman 				eol--;
464*b30d1939SAndy Fiddaman 				while(1)
465*b30d1939SAndy Fiddaman 				{
466*b30d1939SAndy Fiddaman 					if ((out[i] = out[(i+1)])==0)
467*b30d1939SAndy Fiddaman 						break;
468*b30d1939SAndy Fiddaman 					i++;
469*b30d1939SAndy Fiddaman 				}
470*b30d1939SAndy Fiddaman 				i = cur;
471*b30d1939SAndy Fiddaman 			}
472*b30d1939SAndy Fiddaman 			*kptr = '\0';
473*b30d1939SAndy Fiddaman 			goto update;
474*b30d1939SAndy Fiddaman 		case cntl('C') :
475*b30d1939SAndy Fiddaman 		case cntl('F') :
476*b30d1939SAndy Fiddaman 		{
477*b30d1939SAndy Fiddaman 			int cntlC = (c==cntl('C'));
478*b30d1939SAndy Fiddaman 			while (count-- && eol>i)
479*b30d1939SAndy Fiddaman 			{
480*b30d1939SAndy Fiddaman 				if (cntlC)
481*b30d1939SAndy Fiddaman 				{
482*b30d1939SAndy Fiddaman 					c = out[i];
483*b30d1939SAndy Fiddaman #if SHOPT_MULTIBYTE
484*b30d1939SAndy Fiddaman 					if((c&~STRIP)==0 && islower(c))
485*b30d1939SAndy Fiddaman #else
486*b30d1939SAndy Fiddaman 					if(islower(c))
487*b30d1939SAndy Fiddaman #endif /* SHOPT_MULTIBYTE */
488*b30d1939SAndy Fiddaman 					{
489*b30d1939SAndy Fiddaman 						c += 'A' - 'a';
490*b30d1939SAndy Fiddaman 						out[i] = c;
491*b30d1939SAndy Fiddaman 					}
492*b30d1939SAndy Fiddaman 				}
493*b30d1939SAndy Fiddaman 				i++;
494*b30d1939SAndy Fiddaman 			}
495*b30d1939SAndy Fiddaman 			goto update;
496*b30d1939SAndy Fiddaman 		}
497*b30d1939SAndy Fiddaman 		case cntl(']') :
498*b30d1939SAndy Fiddaman 			c = ed_getchar(ep->ed,1);
499*b30d1939SAndy Fiddaman 			if ((count == 0) || (count > eol))
500*b30d1939SAndy Fiddaman                         {
501*b30d1939SAndy Fiddaman                                 beep();
502*b30d1939SAndy Fiddaman                                 continue;
503*b30d1939SAndy Fiddaman                         }
504*b30d1939SAndy Fiddaman 			if (out[i])
505*b30d1939SAndy Fiddaman 				i++;
506*b30d1939SAndy Fiddaman 			while (i < eol)
507*b30d1939SAndy Fiddaman 			{
508*b30d1939SAndy Fiddaman 				if (out[i] == c && --count==0)
509*b30d1939SAndy Fiddaman 					goto update;
510*b30d1939SAndy Fiddaman 				i++;
511*b30d1939SAndy Fiddaman 			}
512*b30d1939SAndy Fiddaman 			i = 0;
513*b30d1939SAndy Fiddaman 			while (i < cur)
514*b30d1939SAndy Fiddaman 			{
515*b30d1939SAndy Fiddaman 				if (out[i] == c && --count==0)
516*b30d1939SAndy Fiddaman 					break;
517*b30d1939SAndy Fiddaman 				i++;
518*b30d1939SAndy Fiddaman 			};
519*b30d1939SAndy Fiddaman 
520*b30d1939SAndy Fiddaman update:
521*b30d1939SAndy Fiddaman 			cur = i;
522*b30d1939SAndy Fiddaman 			draw(ep,UPDATE);
523*b30d1939SAndy Fiddaman 			continue;
524*b30d1939SAndy Fiddaman 
525*b30d1939SAndy Fiddaman 		case cntl('B') :
526*b30d1939SAndy Fiddaman 			if (count > i)
527*b30d1939SAndy Fiddaman 				count = i;
528*b30d1939SAndy Fiddaman 			i -= count;
529*b30d1939SAndy Fiddaman 			goto update;
530*b30d1939SAndy Fiddaman 		case cntl('T') :
531*b30d1939SAndy Fiddaman 			if ((sh_isoption(SH_EMACS))&& (eol!=i))
532*b30d1939SAndy Fiddaman 				i++;
533*b30d1939SAndy Fiddaman 			if (i >= 2)
534*b30d1939SAndy Fiddaman 			{
535*b30d1939SAndy Fiddaman 				c = out[i - 1];
536*b30d1939SAndy Fiddaman 				out[i-1] = out[i-2];
537*b30d1939SAndy Fiddaman 				out[i-2] = c;
538*b30d1939SAndy Fiddaman 			}
539*b30d1939SAndy Fiddaman 			else
540*b30d1939SAndy Fiddaman 			{
541*b30d1939SAndy Fiddaman 				if(sh_isoption(SH_EMACS))
542*b30d1939SAndy Fiddaman 					i--;
543*b30d1939SAndy Fiddaman 				beep();
544*b30d1939SAndy Fiddaman 				continue;
545*b30d1939SAndy Fiddaman 			}
546*b30d1939SAndy Fiddaman 			goto update;
547*b30d1939SAndy Fiddaman 		case cntl('A') :
548*b30d1939SAndy Fiddaman 			i = 0;
549*b30d1939SAndy Fiddaman 			goto update;
550*b30d1939SAndy Fiddaman 		case cntl('E') :
551*b30d1939SAndy Fiddaman 			i = eol;
552*b30d1939SAndy Fiddaman 			goto update;
553*b30d1939SAndy Fiddaman 		case cntl('U') :
554*b30d1939SAndy Fiddaman 			adjust = 4*count;
555*b30d1939SAndy Fiddaman 			continue;
556*b30d1939SAndy Fiddaman 		case KILLCHAR :
557*b30d1939SAndy Fiddaman 			cur = 0;
558*b30d1939SAndy Fiddaman 			oadjust = -1;
559*b30d1939SAndy Fiddaman 			/* FALLTHROUGH */
560*b30d1939SAndy Fiddaman 		case cntl('K') :
561*b30d1939SAndy Fiddaman 			if(oadjust >= 0)
562*b30d1939SAndy Fiddaman 			{
563*b30d1939SAndy Fiddaman #ifdef ESH_KAPPEND
564*b30d1939SAndy Fiddaman 				killing = 2;		/* set killing signal */
565*b30d1939SAndy Fiddaman #endif
566*b30d1939SAndy Fiddaman 				ep->mark = count;
567*b30d1939SAndy Fiddaman 				ed_ungetchar(ep->ed,cntl('W'));
568*b30d1939SAndy Fiddaman 				continue;
569*b30d1939SAndy Fiddaman 			}
570*b30d1939SAndy Fiddaman 			i = cur;
571*b30d1939SAndy Fiddaman 			eol = i;
572*b30d1939SAndy Fiddaman 			ep->mark = i;
573*b30d1939SAndy Fiddaman #ifdef ESH_KAPPEND
574*b30d1939SAndy Fiddaman 			if (killing)			/* append to kill buffer */
575*b30d1939SAndy Fiddaman 				gencpy(&kstack[genlen(kstack)], &out[i]);
576*b30d1939SAndy Fiddaman 			else
577*b30d1939SAndy Fiddaman 				gencpy(kstack,&out[i]);
578*b30d1939SAndy Fiddaman 			killing = 2;			/* set killing signal */
579*b30d1939SAndy Fiddaman #else
580*b30d1939SAndy Fiddaman 			gencpy(kstack,&out[i]);
581*b30d1939SAndy Fiddaman #endif /* ESH_KAPPEND */
582*b30d1939SAndy Fiddaman 			out[i] = 0;
583*b30d1939SAndy Fiddaman 			draw(ep,UPDATE);
584*b30d1939SAndy Fiddaman 			if (c == KILLCHAR)
585*b30d1939SAndy Fiddaman 			{
586*b30d1939SAndy Fiddaman 				if (ep->terminal == PAPER)
587*b30d1939SAndy Fiddaman 				{
588*b30d1939SAndy Fiddaman 					putchar(ep->ed,'\n');
589*b30d1939SAndy Fiddaman 					putstring(ep,Prompt);
590*b30d1939SAndy Fiddaman 				}
591*b30d1939SAndy Fiddaman 				c = ed_getchar(ep->ed,0);
592*b30d1939SAndy Fiddaman 				if (c != usrkill)
593*b30d1939SAndy Fiddaman 				{
594*b30d1939SAndy Fiddaman 					ed_ungetchar(ep->ed,c);
595*b30d1939SAndy Fiddaman 					continue;
596*b30d1939SAndy Fiddaman 				}
597*b30d1939SAndy Fiddaman 				if (ep->terminal == PAPER)
598*b30d1939SAndy Fiddaman 					ep->terminal = CRT;
599*b30d1939SAndy Fiddaman 				else
600*b30d1939SAndy Fiddaman 				{
601*b30d1939SAndy Fiddaman 					ep->terminal = PAPER;
602*b30d1939SAndy Fiddaman 					putchar(ep->ed,'\n');
603*b30d1939SAndy Fiddaman 					putstring(ep,Prompt);
604*b30d1939SAndy Fiddaman 				}
605*b30d1939SAndy Fiddaman 			}
606*b30d1939SAndy Fiddaman 			continue;
607*b30d1939SAndy Fiddaman 		case cntl('L'):
608*b30d1939SAndy Fiddaman 			if(!ep->ed->e_nocrnl)
609*b30d1939SAndy Fiddaman 				ed_crlf(ep->ed);
610*b30d1939SAndy Fiddaman 			draw(ep,REFRESH);
611*b30d1939SAndy Fiddaman 			ep->ed->e_nocrnl = 0;
612*b30d1939SAndy Fiddaman 			continue;
613*b30d1939SAndy Fiddaman 		case cntl('[') :
614*b30d1939SAndy Fiddaman 		do_escape:
615*b30d1939SAndy Fiddaman 			adjust = escape(ep,out,oadjust);
616*b30d1939SAndy Fiddaman 			continue;
617*b30d1939SAndy Fiddaman 		case cntl('R') :
618*b30d1939SAndy Fiddaman 			search(ep,out,count);
619*b30d1939SAndy Fiddaman 			goto drawline;
620*b30d1939SAndy Fiddaman 		case cntl('P') :
621*b30d1939SAndy Fiddaman #if SHOPT_EDPREDICT
622*b30d1939SAndy Fiddaman 			if(ep->ed->hlist)
623*b30d1939SAndy Fiddaman 			{
624*b30d1939SAndy Fiddaman 				if(ep->ed->hoff == 0)
625*b30d1939SAndy Fiddaman 				{
626*b30d1939SAndy Fiddaman 					beep();
627*b30d1939SAndy Fiddaman 					continue;
628*b30d1939SAndy Fiddaman 				}
629*b30d1939SAndy Fiddaman 				ep->ed->hoff--;
630*b30d1939SAndy Fiddaman 				goto hupdate;
631*b30d1939SAndy Fiddaman 			}
632*b30d1939SAndy Fiddaman #endif /* SHOPT_EDPREDICT */
633*b30d1939SAndy Fiddaman                         if (count <= hloff)
634*b30d1939SAndy Fiddaman                                 hloff -= count;
635*b30d1939SAndy Fiddaman                         else
636*b30d1939SAndy Fiddaman                         {
637*b30d1939SAndy Fiddaman                                 hline -= count - hloff;
638*b30d1939SAndy Fiddaman                                 hloff = 0;
639*b30d1939SAndy Fiddaman                         }
640*b30d1939SAndy Fiddaman #ifdef ESH_NFIRST
641*b30d1939SAndy Fiddaman 			if (hline <= hismin)
642*b30d1939SAndy Fiddaman #else
643*b30d1939SAndy Fiddaman 			if (hline < hismin)
644*b30d1939SAndy Fiddaman #endif /* ESH_NFIRST */
645*b30d1939SAndy Fiddaman 			{
646*b30d1939SAndy Fiddaman 				hline = hismin+1;
647*b30d1939SAndy Fiddaman 				beep();
648*b30d1939SAndy Fiddaman #ifndef ESH_NFIRST
649*b30d1939SAndy Fiddaman 				continue;
650*b30d1939SAndy Fiddaman #endif
651*b30d1939SAndy Fiddaman 			}
652*b30d1939SAndy Fiddaman 			goto common;
653*b30d1939SAndy Fiddaman 
654*b30d1939SAndy Fiddaman 		case cntl('O') :
655*b30d1939SAndy Fiddaman 			location.hist_command = hline;
656*b30d1939SAndy Fiddaman 			location.hist_line = hloff;
657*b30d1939SAndy Fiddaman 			ep->CntrlO = 1;
658*b30d1939SAndy Fiddaman 			c = '\n';
659*b30d1939SAndy Fiddaman 			goto process;
660*b30d1939SAndy Fiddaman 		case cntl('N') :
661*b30d1939SAndy Fiddaman #if SHOPT_EDPREDICT
662*b30d1939SAndy Fiddaman 			if(ep->ed->hlist)
663*b30d1939SAndy Fiddaman 			{
664*b30d1939SAndy Fiddaman 				if(ep->ed->hoff >= ep->ed->hmax)
665*b30d1939SAndy Fiddaman 				{
666*b30d1939SAndy Fiddaman 					beep();
667*b30d1939SAndy Fiddaman 					continue;
668*b30d1939SAndy Fiddaman 				}
669*b30d1939SAndy Fiddaman 				ep->ed->hoff++;
670*b30d1939SAndy Fiddaman 			 hupdate:
671*b30d1939SAndy Fiddaman 				ed_histlist(ep->ed,*ep->ed->hlist!=0);
672*b30d1939SAndy Fiddaman 				draw(ep,REFRESH);
673*b30d1939SAndy Fiddaman 				continue;
674*b30d1939SAndy Fiddaman 			}
675*b30d1939SAndy Fiddaman #endif /* SHOPT_EDPREDICT */
676*b30d1939SAndy Fiddaman #ifdef ESH_NFIRST
677*b30d1939SAndy Fiddaman 			hline = location.hist_command;	/* start at saved position */
678*b30d1939SAndy Fiddaman 			hloff = location.hist_line;
679*b30d1939SAndy Fiddaman #endif /* ESH_NFIRST */
680*b30d1939SAndy Fiddaman 			location = hist_locate(shgd->hist_ptr,hline,hloff,count);
681*b30d1939SAndy Fiddaman 			if (location.hist_command > histlines)
682*b30d1939SAndy Fiddaman 			{
683*b30d1939SAndy Fiddaman 				beep();
684*b30d1939SAndy Fiddaman #ifdef ESH_NFIRST
685*b30d1939SAndy Fiddaman 				location.hist_command = histlines;
686*b30d1939SAndy Fiddaman 				location.hist_line = ep->in_mult;
687*b30d1939SAndy Fiddaman #else
688*b30d1939SAndy Fiddaman 				continue;
689*b30d1939SAndy Fiddaman #endif /* ESH_NFIRST */
690*b30d1939SAndy Fiddaman 			}
691*b30d1939SAndy Fiddaman 			hline = location.hist_command;
692*b30d1939SAndy Fiddaman 			hloff = location.hist_line;
693*b30d1939SAndy Fiddaman 		common:
694*b30d1939SAndy Fiddaman #ifdef ESH_NFIRST
695*b30d1939SAndy Fiddaman 			location.hist_command = hline;	/* save current position */
696*b30d1939SAndy Fiddaman 			location.hist_line = hloff;
697*b30d1939SAndy Fiddaman #endif
698*b30d1939SAndy Fiddaman 			cur = 0;
699*b30d1939SAndy Fiddaman 			draw(ep,UPDATE);
700*b30d1939SAndy Fiddaman 			hist_copy((char*)out,MAXLINE, hline,hloff);
701*b30d1939SAndy Fiddaman #if SHOPT_MULTIBYTE
702*b30d1939SAndy Fiddaman 			ed_internal((char*)(out),out);
703*b30d1939SAndy Fiddaman #endif /* SHOPT_MULTIBYTE */
704*b30d1939SAndy Fiddaman 		drawline:
705*b30d1939SAndy Fiddaman 			eol = genlen(out);
706*b30d1939SAndy Fiddaman 			cur = eol;
707*b30d1939SAndy Fiddaman 			draw(ep,UPDATE);
708*b30d1939SAndy Fiddaman 			continue;
709*b30d1939SAndy Fiddaman 		}
710*b30d1939SAndy Fiddaman 
711*b30d1939SAndy Fiddaman 	}
712*b30d1939SAndy Fiddaman 
713*b30d1939SAndy Fiddaman process:
714*b30d1939SAndy Fiddaman 
715*b30d1939SAndy Fiddaman 	if (c == (-1))
716*b30d1939SAndy Fiddaman 	{
717*b30d1939SAndy Fiddaman 		lookahead = 0;
718*b30d1939SAndy Fiddaman 		beep();
719*b30d1939SAndy Fiddaman 		*out = '\0';
720*b30d1939SAndy Fiddaman 	}
721*b30d1939SAndy Fiddaman 	draw(ep,FINAL);
722*b30d1939SAndy Fiddaman 	tty_cooked(ERRIO);
723*b30d1939SAndy Fiddaman 	if(ed->e_nlist)
724*b30d1939SAndy Fiddaman 	{
725*b30d1939SAndy Fiddaman 		ed->e_nlist = 0;
726*b30d1939SAndy Fiddaman 		stakset(ed->e_stkptr,ed->e_stkoff);
727*b30d1939SAndy Fiddaman 	}
728*b30d1939SAndy Fiddaman 	if(c == '\n')
729*b30d1939SAndy Fiddaman 	{
730*b30d1939SAndy Fiddaman 		out[eol++] = '\n';
731*b30d1939SAndy Fiddaman 		out[eol] = '\0';
732*b30d1939SAndy Fiddaman 		ed_crlf(ep->ed);
733*b30d1939SAndy Fiddaman 	}
734*b30d1939SAndy Fiddaman #if SHOPT_MULTIBYTE
735*b30d1939SAndy Fiddaman 	ed_external(out,buff);
736*b30d1939SAndy Fiddaman #endif /* SHOPT_MULTIBYTE */
737*b30d1939SAndy Fiddaman 	i = (int)strlen(buff);
738*b30d1939SAndy Fiddaman 	if (i)
739*b30d1939SAndy Fiddaman 		return(i);
740*b30d1939SAndy Fiddaman 	return(-1);
741*b30d1939SAndy Fiddaman }
742*b30d1939SAndy Fiddaman 
show_info(Emacs_t * ep,const char * str)743*b30d1939SAndy Fiddaman static void show_info(Emacs_t *ep,const char *str)
744*b30d1939SAndy Fiddaman {
745*b30d1939SAndy Fiddaman 	register genchar *out = drawbuff;
746*b30d1939SAndy Fiddaman 	register int c;
747*b30d1939SAndy Fiddaman 	genchar string[LBUF];
748*b30d1939SAndy Fiddaman 	int sav_cur = cur;
749*b30d1939SAndy Fiddaman 	/* save current line */
750*b30d1939SAndy Fiddaman 	genncpy(string,out,sizeof(string)/sizeof(*string));
751*b30d1939SAndy Fiddaman 	*out = 0;
752*b30d1939SAndy Fiddaman 	cur = 0;
753*b30d1939SAndy Fiddaman #if SHOPT_MULTIBYTE
754*b30d1939SAndy Fiddaman 	ed_internal(str,out);
755*b30d1939SAndy Fiddaman #else
756*b30d1939SAndy Fiddaman 	gencpy(out,str);
757*b30d1939SAndy Fiddaman #endif	/* SHOPT_MULTIBYTE */
758*b30d1939SAndy Fiddaman 	draw(ep,UPDATE);
759*b30d1939SAndy Fiddaman 	c = ed_getchar(ep->ed,0);
760*b30d1939SAndy Fiddaman 	if(c!=' ')
761*b30d1939SAndy Fiddaman 		ed_ungetchar(ep->ed,c);
762*b30d1939SAndy Fiddaman 	/* restore line */
763*b30d1939SAndy Fiddaman 	cur = sav_cur;
764*b30d1939SAndy Fiddaman 	genncpy(out,string,sizeof(string)/sizeof(*string));
765*b30d1939SAndy Fiddaman 	draw(ep,UPDATE);
766*b30d1939SAndy Fiddaman }
767*b30d1939SAndy Fiddaman 
putstring(Emacs_t * ep,register char * sp)768*b30d1939SAndy Fiddaman static void putstring(Emacs_t* ep,register char *sp)
769*b30d1939SAndy Fiddaman {
770*b30d1939SAndy Fiddaman 	register int c;
771*b30d1939SAndy Fiddaman 	while (c= *sp++)
772*b30d1939SAndy Fiddaman 		 putchar(ep->ed,c);
773*b30d1939SAndy Fiddaman }
774*b30d1939SAndy Fiddaman 
775*b30d1939SAndy Fiddaman 
escape(register Emacs_t * ep,register genchar * out,int count)776*b30d1939SAndy Fiddaman static int escape(register Emacs_t* ep,register genchar *out,int count)
777*b30d1939SAndy Fiddaman {
778*b30d1939SAndy Fiddaman 	register int i,value;
779*b30d1939SAndy Fiddaman 	int digit,ch;
780*b30d1939SAndy Fiddaman 	digit = 0;
781*b30d1939SAndy Fiddaman 	value = 0;
782*b30d1939SAndy Fiddaman 	while ((i=ed_getchar(ep->ed,0)),digit(i))
783*b30d1939SAndy Fiddaman 	{
784*b30d1939SAndy Fiddaman 		value *= 10;
785*b30d1939SAndy Fiddaman 		value += (i - '0');
786*b30d1939SAndy Fiddaman 		digit = 1;
787*b30d1939SAndy Fiddaman 	}
788*b30d1939SAndy Fiddaman 	if (digit)
789*b30d1939SAndy Fiddaman 	{
790*b30d1939SAndy Fiddaman 		ed_ungetchar(ep->ed,i) ;
791*b30d1939SAndy Fiddaman #ifdef ESH_KAPPEND
792*b30d1939SAndy Fiddaman 		++killing;		/* don't modify killing signal */
793*b30d1939SAndy Fiddaman #endif
794*b30d1939SAndy Fiddaman 		return(value);
795*b30d1939SAndy Fiddaman 	}
796*b30d1939SAndy Fiddaman 	value = count;
797*b30d1939SAndy Fiddaman 	if(value<0)
798*b30d1939SAndy Fiddaman 		value = 1;
799*b30d1939SAndy Fiddaman 	switch(ch=i)
800*b30d1939SAndy Fiddaman 	{
801*b30d1939SAndy Fiddaman 		case cntl('V'):
802*b30d1939SAndy Fiddaman 			show_info(ep,fmtident(e_version));
803*b30d1939SAndy Fiddaman 			return(-1);
804*b30d1939SAndy Fiddaman 		case ' ':
805*b30d1939SAndy Fiddaman 			ep->mark = cur;
806*b30d1939SAndy Fiddaman 			return(-1);
807*b30d1939SAndy Fiddaman 
808*b30d1939SAndy Fiddaman #ifdef ESH_KAPPEND
809*b30d1939SAndy Fiddaman 		case '+':		/* M-+ = append next kill */
810*b30d1939SAndy Fiddaman 			killing = 2;
811*b30d1939SAndy Fiddaman 			return -1;	/* no argument for next command */
812*b30d1939SAndy Fiddaman #endif
813*b30d1939SAndy Fiddaman 
814*b30d1939SAndy Fiddaman 		case 'p':	/* M-p == ^W^Y (copy stack == kill & yank) */
815*b30d1939SAndy Fiddaman 			ed_ungetchar(ep->ed,cntl('Y'));
816*b30d1939SAndy Fiddaman 			ed_ungetchar(ep->ed,cntl('W'));
817*b30d1939SAndy Fiddaman #ifdef ESH_KAPPEND
818*b30d1939SAndy Fiddaman 			killing = 0;	/* start fresh */
819*b30d1939SAndy Fiddaman #endif
820*b30d1939SAndy Fiddaman 			return(-1);
821*b30d1939SAndy Fiddaman 
822*b30d1939SAndy Fiddaman 		case 'l':	/* M-l == lower-case */
823*b30d1939SAndy Fiddaman 		case 'd':
824*b30d1939SAndy Fiddaman 		case 'c':
825*b30d1939SAndy Fiddaman 		case 'f':
826*b30d1939SAndy Fiddaman 		{
827*b30d1939SAndy Fiddaman 			i = cur;
828*b30d1939SAndy Fiddaman 			while(value-- && i<eol)
829*b30d1939SAndy Fiddaman 			{
830*b30d1939SAndy Fiddaman 				while ((out[i])&&(!isword(i)))
831*b30d1939SAndy Fiddaman 					i++;
832*b30d1939SAndy Fiddaman 				while ((out[i])&&(isword(i)))
833*b30d1939SAndy Fiddaman 					i++;
834*b30d1939SAndy Fiddaman 			}
835*b30d1939SAndy Fiddaman 			if(ch=='l')
836*b30d1939SAndy Fiddaman 			{
837*b30d1939SAndy Fiddaman 				value = i-cur;
838*b30d1939SAndy Fiddaman 				while (value-- > 0)
839*b30d1939SAndy Fiddaman 				{
840*b30d1939SAndy Fiddaman 					i = out[cur];
841*b30d1939SAndy Fiddaman #if SHOPT_MULTIBYTE
842*b30d1939SAndy Fiddaman 					if((i&~STRIP)==0 && isupper(i))
843*b30d1939SAndy Fiddaman #else
844*b30d1939SAndy Fiddaman 					if(isupper(i))
845*b30d1939SAndy Fiddaman #endif /* SHOPT_MULTIBYTE */
846*b30d1939SAndy Fiddaman 					{
847*b30d1939SAndy Fiddaman 						i += 'a' - 'A';
848*b30d1939SAndy Fiddaman 						out[cur] = i;
849*b30d1939SAndy Fiddaman 					}
850*b30d1939SAndy Fiddaman 					cur++;
851*b30d1939SAndy Fiddaman 				}
852*b30d1939SAndy Fiddaman 				draw(ep,UPDATE);
853*b30d1939SAndy Fiddaman 				return(-1);
854*b30d1939SAndy Fiddaman 			}
855*b30d1939SAndy Fiddaman 
856*b30d1939SAndy Fiddaman 			else if(ch=='f')
857*b30d1939SAndy Fiddaman 				goto update;
858*b30d1939SAndy Fiddaman 			else if(ch=='c')
859*b30d1939SAndy Fiddaman 			{
860*b30d1939SAndy Fiddaman 				ed_ungetchar(ep->ed,cntl('C'));
861*b30d1939SAndy Fiddaman 				return(i-cur);
862*b30d1939SAndy Fiddaman 			}
863*b30d1939SAndy Fiddaman 			else
864*b30d1939SAndy Fiddaman 			{
865*b30d1939SAndy Fiddaman 				if (i-cur)
866*b30d1939SAndy Fiddaman 				{
867*b30d1939SAndy Fiddaman 					ed_ungetchar(ep->ed,cntl('D'));
868*b30d1939SAndy Fiddaman #ifdef ESH_KAPPEND
869*b30d1939SAndy Fiddaman 					++killing;	/* keep killing signal */
870*b30d1939SAndy Fiddaman #endif
871*b30d1939SAndy Fiddaman 					return(i-cur);
872*b30d1939SAndy Fiddaman 				}
873*b30d1939SAndy Fiddaman 				beep();
874*b30d1939SAndy Fiddaman 				return(-1);
875*b30d1939SAndy Fiddaman 			}
876*b30d1939SAndy Fiddaman 		}
877*b30d1939SAndy Fiddaman 
878*b30d1939SAndy Fiddaman 
879*b30d1939SAndy Fiddaman 		case 'b':
880*b30d1939SAndy Fiddaman 		case DELETE :
881*b30d1939SAndy Fiddaman 		case '\b':
882*b30d1939SAndy Fiddaman 		case 'h':
883*b30d1939SAndy Fiddaman 		{
884*b30d1939SAndy Fiddaman 			i = cur;
885*b30d1939SAndy Fiddaman 			while(value-- && i>0)
886*b30d1939SAndy Fiddaman 			{
887*b30d1939SAndy Fiddaman 				i--;
888*b30d1939SAndy Fiddaman 				while ((i>0)&&(!isword(i)))
889*b30d1939SAndy Fiddaman 					i--;
890*b30d1939SAndy Fiddaman 				while ((i>0)&&(isword(i-1)))
891*b30d1939SAndy Fiddaman 					i--;
892*b30d1939SAndy Fiddaman 			}
893*b30d1939SAndy Fiddaman 			if(ch=='b')
894*b30d1939SAndy Fiddaman 				goto update;
895*b30d1939SAndy Fiddaman 			else
896*b30d1939SAndy Fiddaman 			{
897*b30d1939SAndy Fiddaman 				ed_ungetchar(ep->ed,usrerase);
898*b30d1939SAndy Fiddaman #ifdef ESH_KAPPEND
899*b30d1939SAndy Fiddaman 				++killing;
900*b30d1939SAndy Fiddaman #endif
901*b30d1939SAndy Fiddaman 				return(cur-i);
902*b30d1939SAndy Fiddaman 			}
903*b30d1939SAndy Fiddaman 		}
904*b30d1939SAndy Fiddaman 
905*b30d1939SAndy Fiddaman 		case '>':
906*b30d1939SAndy Fiddaman 			ed_ungetchar(ep->ed,cntl('N'));
907*b30d1939SAndy Fiddaman #ifdef ESH_NFIRST
908*b30d1939SAndy Fiddaman 			if (ep->in_mult)
909*b30d1939SAndy Fiddaman 			{
910*b30d1939SAndy Fiddaman 				location.hist_command = histlines;
911*b30d1939SAndy Fiddaman 				location.hist_line = ep->in_mult - 1;
912*b30d1939SAndy Fiddaman 			}
913*b30d1939SAndy Fiddaman 			else
914*b30d1939SAndy Fiddaman 			{
915*b30d1939SAndy Fiddaman 				location.hist_command = histlines - 1;
916*b30d1939SAndy Fiddaman 				location.hist_line = 0;
917*b30d1939SAndy Fiddaman 			}
918*b30d1939SAndy Fiddaman #else
919*b30d1939SAndy Fiddaman 			hline = histlines-1;
920*b30d1939SAndy Fiddaman 			hloff = 0;
921*b30d1939SAndy Fiddaman #endif /* ESH_NFIRST */
922*b30d1939SAndy Fiddaman 			return(0);
923*b30d1939SAndy Fiddaman 
924*b30d1939SAndy Fiddaman 		case '<':
925*b30d1939SAndy Fiddaman 			ed_ungetchar(ep->ed,cntl('P'));
926*b30d1939SAndy Fiddaman 			hloff = 0;
927*b30d1939SAndy Fiddaman #ifdef ESH_NFIRST
928*b30d1939SAndy Fiddaman 			hline = hismin + 1;
929*b30d1939SAndy Fiddaman 			return 0;
930*b30d1939SAndy Fiddaman #else
931*b30d1939SAndy Fiddaman 			return(hline-hismin);
932*b30d1939SAndy Fiddaman #endif /* ESH_NFIRST */
933*b30d1939SAndy Fiddaman 
934*b30d1939SAndy Fiddaman 
935*b30d1939SAndy Fiddaman 		case '#':
936*b30d1939SAndy Fiddaman 			ed_ungetchar(ep->ed,'\n');
937*b30d1939SAndy Fiddaman 			ed_ungetchar(ep->ed,(out[0]=='#')?cntl('D'):'#');
938*b30d1939SAndy Fiddaman 			ed_ungetchar(ep->ed,cntl('A'));
939*b30d1939SAndy Fiddaman 			return(-1);
940*b30d1939SAndy Fiddaman 		case '_' :
941*b30d1939SAndy Fiddaman 		case '.' :
942*b30d1939SAndy Fiddaman 		{
943*b30d1939SAndy Fiddaman 			genchar name[MAXLINE];
944*b30d1939SAndy Fiddaman 			char buf[MAXLINE];
945*b30d1939SAndy Fiddaman 			char *ptr;
946*b30d1939SAndy Fiddaman 			ptr = hist_word(buf,MAXLINE,(count?count:-1));
947*b30d1939SAndy Fiddaman 			if(ptr==0)
948*b30d1939SAndy Fiddaman 			{
949*b30d1939SAndy Fiddaman 				beep();
950*b30d1939SAndy Fiddaman 				break;
951*b30d1939SAndy Fiddaman 			}
952*b30d1939SAndy Fiddaman 			if ((eol - cur) >= sizeof(name))
953*b30d1939SAndy Fiddaman 			{
954*b30d1939SAndy Fiddaman 				beep();
955*b30d1939SAndy Fiddaman 				return(-1);
956*b30d1939SAndy Fiddaman 			}
957*b30d1939SAndy Fiddaman 			ep->mark = cur;
958*b30d1939SAndy Fiddaman 			gencpy(name,&out[cur]);
959*b30d1939SAndy Fiddaman 			while(*ptr)
960*b30d1939SAndy Fiddaman 			{
961*b30d1939SAndy Fiddaman 				out[cur++] = *ptr++;
962*b30d1939SAndy Fiddaman 				eol++;
963*b30d1939SAndy Fiddaman 			}
964*b30d1939SAndy Fiddaman 			gencpy(&out[cur],name);
965*b30d1939SAndy Fiddaman 			draw(ep,UPDATE);
966*b30d1939SAndy Fiddaman 			return(-1);
967*b30d1939SAndy Fiddaman 		}
968*b30d1939SAndy Fiddaman #if KSHELL
969*b30d1939SAndy Fiddaman 
970*b30d1939SAndy Fiddaman #if SHOPT_EDPREDICT
971*b30d1939SAndy Fiddaman 		case '\n':  case '\t':
972*b30d1939SAndy Fiddaman 			if(!ep->ed->hlist)
973*b30d1939SAndy Fiddaman 			{
974*b30d1939SAndy Fiddaman 				beep();
975*b30d1939SAndy Fiddaman 				break;
976*b30d1939SAndy Fiddaman 			}
977*b30d1939SAndy Fiddaman 			if(ch=='\n')
978*b30d1939SAndy Fiddaman 				ed_ungetchar(ep->ed,'\n');
979*b30d1939SAndy Fiddaman #endif /* SHOPT_EDPREDICT */
980*b30d1939SAndy Fiddaman 		/* file name expansion */
981*b30d1939SAndy Fiddaman 		case cntl('[') :	/* filename completion */
982*b30d1939SAndy Fiddaman #if SHOPT_EDPREDICT
983*b30d1939SAndy Fiddaman 			if(ep->ed->hlist)
984*b30d1939SAndy Fiddaman 			{
985*b30d1939SAndy Fiddaman 				value += ep->ed->hoff;
986*b30d1939SAndy Fiddaman 				if(value > ep->ed->nhlist)
987*b30d1939SAndy Fiddaman 					beep();
988*b30d1939SAndy Fiddaman 				else
989*b30d1939SAndy Fiddaman 				{
990*b30d1939SAndy Fiddaman 					value = histlines - ep->ed->hlist[value-1]->index;
991*b30d1939SAndy Fiddaman 					ed_histlist(ep->ed,0);
992*b30d1939SAndy Fiddaman 					ed_ungetchar(ep->ed,cntl('P'));
993*b30d1939SAndy Fiddaman 					return(value);
994*b30d1939SAndy Fiddaman 				}
995*b30d1939SAndy Fiddaman 			}
996*b30d1939SAndy Fiddaman #endif /* SHOPT_EDPREDICT */
997*b30d1939SAndy Fiddaman 			i = '\\';
998*b30d1939SAndy Fiddaman 			/* FALLTHROUGH */
999*b30d1939SAndy Fiddaman 		case '*':		/* filename expansion */
1000*b30d1939SAndy Fiddaman 		case '=':	/* escape = - list all matching file names */
1001*b30d1939SAndy Fiddaman 			ep->mark = cur;
1002*b30d1939SAndy Fiddaman 			if(ed_expand(ep->ed,(char*)out,&cur,&eol,i,count) < 0)
1003*b30d1939SAndy Fiddaman 			{
1004*b30d1939SAndy Fiddaman 				if(ep->ed->e_tabcount==1)
1005*b30d1939SAndy Fiddaman 				{
1006*b30d1939SAndy Fiddaman 					ep->ed->e_tabcount=2;
1007*b30d1939SAndy Fiddaman 					ed_ungetchar(ep->ed,cntl('\t'));
1008*b30d1939SAndy Fiddaman 					return(-1);
1009*b30d1939SAndy Fiddaman 				}
1010*b30d1939SAndy Fiddaman 				beep();
1011*b30d1939SAndy Fiddaman 			}
1012*b30d1939SAndy Fiddaman 			else if(i=='=' || (i=='\\' && out[cur-1]=='/'))
1013*b30d1939SAndy Fiddaman 			{
1014*b30d1939SAndy Fiddaman 				draw(ep,REFRESH);
1015*b30d1939SAndy Fiddaman 				if(count>0)
1016*b30d1939SAndy Fiddaman 					ep->ed->e_tabcount=0;
1017*b30d1939SAndy Fiddaman 				else
1018*b30d1939SAndy Fiddaman 				{
1019*b30d1939SAndy Fiddaman 					i=ed_getchar(ep->ed,0);
1020*b30d1939SAndy Fiddaman 					ed_ungetchar(ep->ed,i);
1021*b30d1939SAndy Fiddaman 					if(digit(i))
1022*b30d1939SAndy Fiddaman 						ed_ungetchar(ep->ed,ESC);
1023*b30d1939SAndy Fiddaman 				}
1024*b30d1939SAndy Fiddaman 			}
1025*b30d1939SAndy Fiddaman 			else
1026*b30d1939SAndy Fiddaman 			{
1027*b30d1939SAndy Fiddaman 				if(i=='\\' && cur>ep->mark && (out[cur-1]=='/' || out[cur-1]==' '))
1028*b30d1939SAndy Fiddaman 					ep->ed->e_tabcount=0;
1029*b30d1939SAndy Fiddaman 				draw(ep,UPDATE);
1030*b30d1939SAndy Fiddaman 			}
1031*b30d1939SAndy Fiddaman 			return(-1);
1032*b30d1939SAndy Fiddaman 
1033*b30d1939SAndy Fiddaman 		/* search back for character */
1034*b30d1939SAndy Fiddaman 		case cntl(']'):	/* feature not in book */
1035*b30d1939SAndy Fiddaman 		{
1036*b30d1939SAndy Fiddaman 			int c = ed_getchar(ep->ed,1);
1037*b30d1939SAndy Fiddaman 			if ((value == 0) || (value > eol))
1038*b30d1939SAndy Fiddaman 			{
1039*b30d1939SAndy Fiddaman 				beep();
1040*b30d1939SAndy Fiddaman 				return(-1);
1041*b30d1939SAndy Fiddaman 			}
1042*b30d1939SAndy Fiddaman 			i = cur;
1043*b30d1939SAndy Fiddaman 			if (i > 0)
1044*b30d1939SAndy Fiddaman 				i--;
1045*b30d1939SAndy Fiddaman 			while (i >= 0)
1046*b30d1939SAndy Fiddaman 			{
1047*b30d1939SAndy Fiddaman 				if (out[i] == c && --value==0)
1048*b30d1939SAndy Fiddaman 					goto update;
1049*b30d1939SAndy Fiddaman 				i--;
1050*b30d1939SAndy Fiddaman 			}
1051*b30d1939SAndy Fiddaman 			i = eol;
1052*b30d1939SAndy Fiddaman 			while (i > cur)
1053*b30d1939SAndy Fiddaman 			{
1054*b30d1939SAndy Fiddaman 				if (out[i] == c && --value==0)
1055*b30d1939SAndy Fiddaman 					break;
1056*b30d1939SAndy Fiddaman 				i--;
1057*b30d1939SAndy Fiddaman 			};
1058*b30d1939SAndy Fiddaman 
1059*b30d1939SAndy Fiddaman 		}
1060*b30d1939SAndy Fiddaman 		update:
1061*b30d1939SAndy Fiddaman 			cur = i;
1062*b30d1939SAndy Fiddaman 			draw(ep,UPDATE);
1063*b30d1939SAndy Fiddaman 			return(-1);
1064*b30d1939SAndy Fiddaman 
1065*b30d1939SAndy Fiddaman #ifdef _cmd_tput
1066*b30d1939SAndy Fiddaman 		case cntl('L'): /* clear screen */
1067*b30d1939SAndy Fiddaman 			sh_trap("tput clear", 0);
1068*b30d1939SAndy Fiddaman 			draw(ep,REFRESH);
1069*b30d1939SAndy Fiddaman 			return(-1);
1070*b30d1939SAndy Fiddaman #endif
1071*b30d1939SAndy Fiddaman 		case '[':	/* feature not in book */
1072*b30d1939SAndy Fiddaman 			switch(i=ed_getchar(ep->ed,1))
1073*b30d1939SAndy Fiddaman 			{
1074*b30d1939SAndy Fiddaman 			    case 'A':
1075*b30d1939SAndy Fiddaman #if SHOPT_EDPREDICT
1076*b30d1939SAndy Fiddaman 				if(!ep->ed->hlist && cur>0 && eol==cur && (cur<(SEARCHSIZE-2) || ep->prevdirection == -2))
1077*b30d1939SAndy Fiddaman #else
1078*b30d1939SAndy Fiddaman 				if(cur>0 && eol==cur && (cur<(SEARCHSIZE-2) || ep->prevdirection == -2))
1079*b30d1939SAndy Fiddaman #endif /* SHOPT_EDPREDICT */
1080*b30d1939SAndy Fiddaman 				{
1081*b30d1939SAndy Fiddaman 					if(ep->lastdraw==APPEND && ep->prevdirection != -2)
1082*b30d1939SAndy Fiddaman 					{
1083*b30d1939SAndy Fiddaman 						out[cur] = 0;
1084*b30d1939SAndy Fiddaman 						gencpy((genchar*)lstring+1,out);
1085*b30d1939SAndy Fiddaman #if SHOPT_MULTIBYTE
1086*b30d1939SAndy Fiddaman 						ed_external((genchar*)lstring+1,lstring+1);
1087*b30d1939SAndy Fiddaman #endif /* SHOPT_MULTIBYTE */
1088*b30d1939SAndy Fiddaman 						*lstring = '^';
1089*b30d1939SAndy Fiddaman 						ep->prevdirection = -2;
1090*b30d1939SAndy Fiddaman 					}
1091*b30d1939SAndy Fiddaman 					if(*lstring)
1092*b30d1939SAndy Fiddaman 					{
1093*b30d1939SAndy Fiddaman 						ed_ungetchar(ep->ed,'\r');
1094*b30d1939SAndy Fiddaman 						ed_ungetchar(ep->ed,cntl('R'));
1095*b30d1939SAndy Fiddaman 						return(-1);
1096*b30d1939SAndy Fiddaman 					}
1097*b30d1939SAndy Fiddaman 				}
1098*b30d1939SAndy Fiddaman 				*lstring = 0;
1099*b30d1939SAndy Fiddaman 				ed_ungetchar(ep->ed,cntl('P'));
1100*b30d1939SAndy Fiddaman 				return(-1);
1101*b30d1939SAndy Fiddaman 			    case 'B':
1102*b30d1939SAndy Fiddaman 				ed_ungetchar(ep->ed,cntl('N'));
1103*b30d1939SAndy Fiddaman 				return(-1);
1104*b30d1939SAndy Fiddaman 			    case 'C':
1105*b30d1939SAndy Fiddaman 				ed_ungetchar(ep->ed,cntl('F'));
1106*b30d1939SAndy Fiddaman 				return(-1);
1107*b30d1939SAndy Fiddaman 			    case 'D':
1108*b30d1939SAndy Fiddaman 				ed_ungetchar(ep->ed,cntl('B'));
1109*b30d1939SAndy Fiddaman 				return(-1);
1110*b30d1939SAndy Fiddaman 			    case 'H':
1111*b30d1939SAndy Fiddaman 				ed_ungetchar(ep->ed,cntl('A'));
1112*b30d1939SAndy Fiddaman 				return(-1);
1113*b30d1939SAndy Fiddaman 			    case 'Y':
1114*b30d1939SAndy Fiddaman 				ed_ungetchar(ep->ed,cntl('E'));
1115*b30d1939SAndy Fiddaman 				return(-1);
1116*b30d1939SAndy Fiddaman 			    default:
1117*b30d1939SAndy Fiddaman 				ed_ungetchar(ep->ed,i);
1118*b30d1939SAndy Fiddaman 			}
1119*b30d1939SAndy Fiddaman 			i = '_';
1120*b30d1939SAndy Fiddaman 			/* FALLTHROUGH */
1121*b30d1939SAndy Fiddaman 
1122*b30d1939SAndy Fiddaman 		default:
1123*b30d1939SAndy Fiddaman 			/* look for user defined macro definitions */
1124*b30d1939SAndy Fiddaman 			if(ed_macro(ep->ed,i))
1125*b30d1939SAndy Fiddaman #   ifdef ESH_BETTER
1126*b30d1939SAndy Fiddaman 				return(count);	/* pass argument to macro */
1127*b30d1939SAndy Fiddaman #   else
1128*b30d1939SAndy Fiddaman 				return(-1);
1129*b30d1939SAndy Fiddaman #   endif /* ESH_BETTER */
1130*b30d1939SAndy Fiddaman #else
1131*b30d1939SAndy Fiddaman 		update:
1132*b30d1939SAndy Fiddaman 			cur = i;
1133*b30d1939SAndy Fiddaman 			draw(ep,UPDATE);
1134*b30d1939SAndy Fiddaman 			return(-1);
1135*b30d1939SAndy Fiddaman 
1136*b30d1939SAndy Fiddaman 		default:
1137*b30d1939SAndy Fiddaman #endif	/* KSHELL */
1138*b30d1939SAndy Fiddaman 		beep();
1139*b30d1939SAndy Fiddaman 		return(-1);
1140*b30d1939SAndy Fiddaman 	}
1141*b30d1939SAndy Fiddaman 	return(-1);
1142*b30d1939SAndy Fiddaman }
1143*b30d1939SAndy Fiddaman 
1144*b30d1939SAndy Fiddaman 
1145*b30d1939SAndy Fiddaman /*
1146*b30d1939SAndy Fiddaman  * This routine process all commands starting with ^X
1147*b30d1939SAndy Fiddaman  */
1148*b30d1939SAndy Fiddaman 
xcommands(register Emacs_t * ep,int count)1149*b30d1939SAndy Fiddaman static void xcommands(register Emacs_t *ep,int count)
1150*b30d1939SAndy Fiddaman {
1151*b30d1939SAndy Fiddaman         register int i = ed_getchar(ep->ed,0);
1152*b30d1939SAndy Fiddaman 	NOT_USED(count);
1153*b30d1939SAndy Fiddaman         switch(i)
1154*b30d1939SAndy Fiddaman         {
1155*b30d1939SAndy Fiddaman                 case cntl('X'):	/* exchange dot and mark */
1156*b30d1939SAndy Fiddaman                         if (ep->mark > eol)
1157*b30d1939SAndy Fiddaman                                 ep->mark = eol;
1158*b30d1939SAndy Fiddaman                         i = ep->mark;
1159*b30d1939SAndy Fiddaman                         ep->mark = cur;
1160*b30d1939SAndy Fiddaman                         cur = i;
1161*b30d1939SAndy Fiddaman                         draw(ep,UPDATE);
1162*b30d1939SAndy Fiddaman                         return;
1163*b30d1939SAndy Fiddaman 
1164*b30d1939SAndy Fiddaman #if KSHELL
1165*b30d1939SAndy Fiddaman #   ifdef ESH_BETTER
1166*b30d1939SAndy Fiddaman                 case cntl('E'):	/* invoke emacs on current command */
1167*b30d1939SAndy Fiddaman 			if(ed_fulledit(ep->ed)==-1)
1168*b30d1939SAndy Fiddaman 				beep();
1169*b30d1939SAndy Fiddaman 			else
1170*b30d1939SAndy Fiddaman 			{
1171*b30d1939SAndy Fiddaman #if SHOPT_MULTIBYTE
1172*b30d1939SAndy Fiddaman 				ed_internal((char*)drawbuff,drawbuff);
1173*b30d1939SAndy Fiddaman #endif /* SHOPT_MULTIBYTE */
1174*b30d1939SAndy Fiddaman 				ed_ungetchar(ep->ed,'\n');
1175*b30d1939SAndy Fiddaman 			}
1176*b30d1939SAndy Fiddaman 			return;
1177*b30d1939SAndy Fiddaman 
1178*b30d1939SAndy Fiddaman #	define itos(i)	fmtbase((long)(i),0,0)/* want signed conversion */
1179*b30d1939SAndy Fiddaman 
1180*b30d1939SAndy Fiddaman 		case cntl('H'):		/* ^X^H show history info */
1181*b30d1939SAndy Fiddaman 			{
1182*b30d1939SAndy Fiddaman 				char hbuf[MAXLINE];
1183*b30d1939SAndy Fiddaman 
1184*b30d1939SAndy Fiddaman 				strcpy(hbuf, "Current command ");
1185*b30d1939SAndy Fiddaman 				strcat(hbuf, itos(hline));
1186*b30d1939SAndy Fiddaman 				if (hloff)
1187*b30d1939SAndy Fiddaman 				{
1188*b30d1939SAndy Fiddaman 					strcat(hbuf, " (line ");
1189*b30d1939SAndy Fiddaman 					strcat(hbuf, itos(hloff+1));
1190*b30d1939SAndy Fiddaman 					strcat(hbuf, ")");
1191*b30d1939SAndy Fiddaman 				}
1192*b30d1939SAndy Fiddaman 				if ((hline != location.hist_command) ||
1193*b30d1939SAndy Fiddaman 				    (hloff != location.hist_line))
1194*b30d1939SAndy Fiddaman 				{
1195*b30d1939SAndy Fiddaman 					strcat(hbuf, "; Previous command ");
1196*b30d1939SAndy Fiddaman 					strcat(hbuf, itos(location.hist_command));
1197*b30d1939SAndy Fiddaman 					if (location.hist_line)
1198*b30d1939SAndy Fiddaman 					{
1199*b30d1939SAndy Fiddaman 						strcat(hbuf, " (line ");
1200*b30d1939SAndy Fiddaman 						strcat(hbuf, itos(location.hist_line+1));
1201*b30d1939SAndy Fiddaman 						strcat(hbuf, ")");
1202*b30d1939SAndy Fiddaman 					}
1203*b30d1939SAndy Fiddaman 				}
1204*b30d1939SAndy Fiddaman 				show_info(ep,hbuf);
1205*b30d1939SAndy Fiddaman 				return;
1206*b30d1939SAndy Fiddaman 			}
1207*b30d1939SAndy Fiddaman #	if 0	/* debugging, modify as required */
1208*b30d1939SAndy Fiddaman 		case cntl('D'):		/* ^X^D show debugging info */
1209*b30d1939SAndy Fiddaman 			{
1210*b30d1939SAndy Fiddaman 				char debugbuf[MAXLINE];
1211*b30d1939SAndy Fiddaman 
1212*b30d1939SAndy Fiddaman 				strcpy(debugbuf, "count=");
1213*b30d1939SAndy Fiddaman 				strcat(debugbuf, itos(count));
1214*b30d1939SAndy Fiddaman 				strcat(debugbuf, " eol=");
1215*b30d1939SAndy Fiddaman 				strcat(debugbuf, itos(eol));
1216*b30d1939SAndy Fiddaman 				strcat(debugbuf, " cur=");
1217*b30d1939SAndy Fiddaman 				strcat(debugbuf, itos(cur));
1218*b30d1939SAndy Fiddaman 				strcat(debugbuf, " crallowed=");
1219*b30d1939SAndy Fiddaman 				strcat(debugbuf, itos(crallowed));
1220*b30d1939SAndy Fiddaman 				strcat(debugbuf, " plen=");
1221*b30d1939SAndy Fiddaman 				strcat(debugbuf, itos(plen));
1222*b30d1939SAndy Fiddaman 				strcat(debugbuf, " w_size=");
1223*b30d1939SAndy Fiddaman 				strcat(debugbuf, itos(w_size));
1224*b30d1939SAndy Fiddaman 
1225*b30d1939SAndy Fiddaman 				show_info(ep,debugbuf);
1226*b30d1939SAndy Fiddaman 				return;
1227*b30d1939SAndy Fiddaman 			}
1228*b30d1939SAndy Fiddaman #	endif /* debugging code */
1229*b30d1939SAndy Fiddaman #   endif /* ESH_BETTER */
1230*b30d1939SAndy Fiddaman #endif /* KSHELL */
1231*b30d1939SAndy Fiddaman 
1232*b30d1939SAndy Fiddaman                 default:
1233*b30d1939SAndy Fiddaman                         beep();
1234*b30d1939SAndy Fiddaman                         return;
1235*b30d1939SAndy Fiddaman 	}
1236*b30d1939SAndy Fiddaman }
1237*b30d1939SAndy Fiddaman 
search(Emacs_t * ep,genchar * out,int direction)1238*b30d1939SAndy Fiddaman static void search(Emacs_t* ep,genchar *out,int direction)
1239*b30d1939SAndy Fiddaman {
1240*b30d1939SAndy Fiddaman #ifndef ESH_NFIRST
1241*b30d1939SAndy Fiddaman 	Histloc_t location;
1242*b30d1939SAndy Fiddaman #endif
1243*b30d1939SAndy Fiddaman 	register int i,sl;
1244*b30d1939SAndy Fiddaman 	genchar str_buff[LBUF];
1245*b30d1939SAndy Fiddaman 	register genchar *string = drawbuff;
1246*b30d1939SAndy Fiddaman 	/* save current line */
1247*b30d1939SAndy Fiddaman 	int sav_cur = cur;
1248*b30d1939SAndy Fiddaman 	genncpy(str_buff,string,sizeof(str_buff)/sizeof(*str_buff));
1249*b30d1939SAndy Fiddaman 	string[0] = '^';
1250*b30d1939SAndy Fiddaman 	string[1] = 'R';
1251*b30d1939SAndy Fiddaman 	string[2] = '\0';
1252*b30d1939SAndy Fiddaman 	sl = 2;
1253*b30d1939SAndy Fiddaman 	cur = sl;
1254*b30d1939SAndy Fiddaman 	draw(ep,UPDATE);
1255*b30d1939SAndy Fiddaman 	while ((i = ed_getchar(ep->ed,1))&&(i != '\r')&&(i != '\n'))
1256*b30d1939SAndy Fiddaman 	{
1257*b30d1939SAndy Fiddaman 		if (i==usrerase || i==DELETE || i=='\b' || i==ERASECHAR)
1258*b30d1939SAndy Fiddaman 		{
1259*b30d1939SAndy Fiddaman 			if (sl > 2)
1260*b30d1939SAndy Fiddaman 			{
1261*b30d1939SAndy Fiddaman 				string[--sl] = '\0';
1262*b30d1939SAndy Fiddaman 				cur = sl;
1263*b30d1939SAndy Fiddaman 				draw(ep,UPDATE);
1264*b30d1939SAndy Fiddaman 			}
1265*b30d1939SAndy Fiddaman 			else
1266*b30d1939SAndy Fiddaman 				goto restore;
1267*b30d1939SAndy Fiddaman 			continue;
1268*b30d1939SAndy Fiddaman 		}
1269*b30d1939SAndy Fiddaman 		if(i == ep->ed->e_intr)
1270*b30d1939SAndy Fiddaman 			goto restore;
1271*b30d1939SAndy Fiddaman 		if (i==usrkill)
1272*b30d1939SAndy Fiddaman 		{
1273*b30d1939SAndy Fiddaman 			beep();
1274*b30d1939SAndy Fiddaman 			goto restore;
1275*b30d1939SAndy Fiddaman 		}
1276*b30d1939SAndy Fiddaman 		if (i == '\\')
1277*b30d1939SAndy Fiddaman 		{
1278*b30d1939SAndy Fiddaman 			string[sl++] = '\\';
1279*b30d1939SAndy Fiddaman 			string[sl] = '\0';
1280*b30d1939SAndy Fiddaman 			cur = sl;
1281*b30d1939SAndy Fiddaman 			draw(ep,APPEND);
1282*b30d1939SAndy Fiddaman 			i = ed_getchar(ep->ed,1);
1283*b30d1939SAndy Fiddaman 			string[--sl] = '\0';
1284*b30d1939SAndy Fiddaman 		}
1285*b30d1939SAndy Fiddaman 		string[sl++] = i;
1286*b30d1939SAndy Fiddaman 		string[sl] = '\0';
1287*b30d1939SAndy Fiddaman 		cur = sl;
1288*b30d1939SAndy Fiddaman 		draw(ep,APPEND);
1289*b30d1939SAndy Fiddaman 	}
1290*b30d1939SAndy Fiddaman 	i = genlen(string);
1291*b30d1939SAndy Fiddaman 
1292*b30d1939SAndy Fiddaman 	if(ep->prevdirection == -2 && i!=2 || direction!=1)
1293*b30d1939SAndy Fiddaman 		ep->prevdirection = -1;
1294*b30d1939SAndy Fiddaman 	if (direction < 1)
1295*b30d1939SAndy Fiddaman 	{
1296*b30d1939SAndy Fiddaman 		ep->prevdirection = -ep->prevdirection;
1297*b30d1939SAndy Fiddaman 		direction = 1;
1298*b30d1939SAndy Fiddaman 	}
1299*b30d1939SAndy Fiddaman 	else
1300*b30d1939SAndy Fiddaman 		direction = -1;
1301*b30d1939SAndy Fiddaman 	if (i != 2)
1302*b30d1939SAndy Fiddaman 	{
1303*b30d1939SAndy Fiddaman #if SHOPT_MULTIBYTE
1304*b30d1939SAndy Fiddaman 		ed_external(string,(char*)string);
1305*b30d1939SAndy Fiddaman #endif /* SHOPT_MULTIBYTE */
1306*b30d1939SAndy Fiddaman 		strncpy(lstring,((char*)string)+2,SEARCHSIZE);
1307*b30d1939SAndy Fiddaman 		lstring[SEARCHSIZE-1] = 0;
1308*b30d1939SAndy Fiddaman 		ep->prevdirection = direction;
1309*b30d1939SAndy Fiddaman 	}
1310*b30d1939SAndy Fiddaman 	else
1311*b30d1939SAndy Fiddaman 		direction = ep->prevdirection ;
1312*b30d1939SAndy Fiddaman 	location = hist_find(shgd->hist_ptr,(char*)lstring,hline,1,direction);
1313*b30d1939SAndy Fiddaman 	i = location.hist_command;
1314*b30d1939SAndy Fiddaman 	if(i>0)
1315*b30d1939SAndy Fiddaman 	{
1316*b30d1939SAndy Fiddaman 		hline = i;
1317*b30d1939SAndy Fiddaman #ifdef ESH_NFIRST
1318*b30d1939SAndy Fiddaman 		hloff = location.hist_line = 0;	/* display first line of multi line command */
1319*b30d1939SAndy Fiddaman #else
1320*b30d1939SAndy Fiddaman 		hloff = location.hist_line;
1321*b30d1939SAndy Fiddaman #endif /* ESH_NFIRST */
1322*b30d1939SAndy Fiddaman 		hist_copy((char*)out,MAXLINE, hline,hloff);
1323*b30d1939SAndy Fiddaman #if SHOPT_MULTIBYTE
1324*b30d1939SAndy Fiddaman 		ed_internal((char*)out,out);
1325*b30d1939SAndy Fiddaman #endif /* SHOPT_MULTIBYTE */
1326*b30d1939SAndy Fiddaman 		return;
1327*b30d1939SAndy Fiddaman 	}
1328*b30d1939SAndy Fiddaman 	if (i < 0)
1329*b30d1939SAndy Fiddaman 	{
1330*b30d1939SAndy Fiddaman 		beep();
1331*b30d1939SAndy Fiddaman #ifdef ESH_NFIRST
1332*b30d1939SAndy Fiddaman 		location.hist_command = hline;
1333*b30d1939SAndy Fiddaman 		location.hist_line = hloff;
1334*b30d1939SAndy Fiddaman #else
1335*b30d1939SAndy Fiddaman 		hloff = 0;
1336*b30d1939SAndy Fiddaman 		hline = histlines;
1337*b30d1939SAndy Fiddaman #endif /* ESH_NFIRST */
1338*b30d1939SAndy Fiddaman 	}
1339*b30d1939SAndy Fiddaman restore:
1340*b30d1939SAndy Fiddaman 	genncpy(string,str_buff,sizeof(str_buff)/sizeof(*str_buff));
1341*b30d1939SAndy Fiddaman 	cur = sav_cur;
1342*b30d1939SAndy Fiddaman 	return;
1343*b30d1939SAndy Fiddaman }
1344*b30d1939SAndy Fiddaman 
1345*b30d1939SAndy Fiddaman 
1346*b30d1939SAndy Fiddaman /* Adjust screen to agree with inputs: logical line and cursor */
1347*b30d1939SAndy Fiddaman /* If 'first' assume screen is blank */
1348*b30d1939SAndy Fiddaman /* Prompt is always kept on the screen */
1349*b30d1939SAndy Fiddaman 
draw(register Emacs_t * ep,Draw_t option)1350*b30d1939SAndy Fiddaman static void draw(register Emacs_t *ep,Draw_t option)
1351*b30d1939SAndy Fiddaman {
1352*b30d1939SAndy Fiddaman #define	NORMAL ' '
1353*b30d1939SAndy Fiddaman #define	LOWER  '<'
1354*b30d1939SAndy Fiddaman #define	BOTH   '*'
1355*b30d1939SAndy Fiddaman #define	UPPER  '>'
1356*b30d1939SAndy Fiddaman 
1357*b30d1939SAndy Fiddaman 	register genchar *sptr;		/* Pointer within screen */
1358*b30d1939SAndy Fiddaman 	genchar nscreen[2*MAXLINE];	/* New entire screen */
1359*b30d1939SAndy Fiddaman 	genchar *ncursor;		/* New cursor */
1360*b30d1939SAndy Fiddaman 	register genchar *nptr;		/* Pointer to New screen */
1361*b30d1939SAndy Fiddaman 	char  longline;			/* Line overflow */
1362*b30d1939SAndy Fiddaman 	genchar *logcursor;
1363*b30d1939SAndy Fiddaman 	genchar *nscend;		/* end of logical screen */
1364*b30d1939SAndy Fiddaman 	register int i;
1365*b30d1939SAndy Fiddaman 
1366*b30d1939SAndy Fiddaman 	nptr = nscreen;
1367*b30d1939SAndy Fiddaman 	sptr = drawbuff;
1368*b30d1939SAndy Fiddaman 	logcursor = sptr + cur;
1369*b30d1939SAndy Fiddaman 	longline = NORMAL;
1370*b30d1939SAndy Fiddaman 	ep->lastdraw = option;
1371*b30d1939SAndy Fiddaman 
1372*b30d1939SAndy Fiddaman 	if (option == FIRST || option == REFRESH)
1373*b30d1939SAndy Fiddaman 	{
1374*b30d1939SAndy Fiddaman 		ep->overflow = NORMAL;
1375*b30d1939SAndy Fiddaman 		ep->cursor = ep->screen;
1376*b30d1939SAndy Fiddaman 		ep->offset = 0;
1377*b30d1939SAndy Fiddaman 		ep->cr_ok = crallowed;
1378*b30d1939SAndy Fiddaman 		if (option == FIRST)
1379*b30d1939SAndy Fiddaman 		{
1380*b30d1939SAndy Fiddaman 			ep->scvalid = 1;
1381*b30d1939SAndy Fiddaman 			return;
1382*b30d1939SAndy Fiddaman 		}
1383*b30d1939SAndy Fiddaman 		*ep->cursor = '\0';
1384*b30d1939SAndy Fiddaman 		putstring(ep,Prompt);	/* start with prompt */
1385*b30d1939SAndy Fiddaman 	}
1386*b30d1939SAndy Fiddaman 
1387*b30d1939SAndy Fiddaman 	/*********************
1388*b30d1939SAndy Fiddaman 	 Do not update screen if pending characters
1389*b30d1939SAndy Fiddaman 	**********************/
1390*b30d1939SAndy Fiddaman 
1391*b30d1939SAndy Fiddaman 	if ((lookahead)&&(option != FINAL))
1392*b30d1939SAndy Fiddaman 	{
1393*b30d1939SAndy Fiddaman 
1394*b30d1939SAndy Fiddaman 		ep->scvalid = 0; /* Screen is out of date, APPEND will not work */
1395*b30d1939SAndy Fiddaman 
1396*b30d1939SAndy Fiddaman 		return;
1397*b30d1939SAndy Fiddaman 	}
1398*b30d1939SAndy Fiddaman 
1399*b30d1939SAndy Fiddaman 	/***************************************
1400*b30d1939SAndy Fiddaman 	If in append mode, cursor at end of line, screen up to date,
1401*b30d1939SAndy Fiddaman 	the previous character was a 'normal' character,
1402*b30d1939SAndy Fiddaman 	and the window has room for another character.
1403*b30d1939SAndy Fiddaman 	Then output the character and adjust the screen only.
1404*b30d1939SAndy Fiddaman 	*****************************************/
1405*b30d1939SAndy Fiddaman 
1406*b30d1939SAndy Fiddaman 
1407*b30d1939SAndy Fiddaman 	i = *(logcursor-1);	/* last character inserted */
1408*b30d1939SAndy Fiddaman #if SHOPT_EDPREDICT
1409*b30d1939SAndy Fiddaman 	if(option==FINAL)
1410*b30d1939SAndy Fiddaman 	{
1411*b30d1939SAndy Fiddaman 		if(ep->ed->hlist)
1412*b30d1939SAndy Fiddaman 			ed_histlist(ep->ed,0);
1413*b30d1939SAndy Fiddaman 	}
1414*b30d1939SAndy Fiddaman 	else if((option==UPDATE||option==APPEND) && drawbuff[0]=='#' && cur>1 && cur==eol && drawbuff[cur-1]!='*')
1415*b30d1939SAndy Fiddaman 	{
1416*b30d1939SAndy Fiddaman 		int		n;
1417*b30d1939SAndy Fiddaman 		drawbuff[cur+1]=0;
1418*b30d1939SAndy Fiddaman #   if SHOPT_MULTIBYTE
1419*b30d1939SAndy Fiddaman 		ed_external(drawbuff,(char*)drawbuff);
1420*b30d1939SAndy Fiddaman #   endif /*SHOPT_MULTIBYTE */
1421*b30d1939SAndy Fiddaman 		n = ed_histgen(ep->ed,(char*)drawbuff);
1422*b30d1939SAndy Fiddaman #   if SHOPT_MULTIBYTE
1423*b30d1939SAndy Fiddaman 		ed_internal((char*)drawbuff,drawbuff);
1424*b30d1939SAndy Fiddaman #   endif /*SHOPT_MULTIBYTE */
1425*b30d1939SAndy Fiddaman 		if(ep->ed->hlist)
1426*b30d1939SAndy Fiddaman 		{
1427*b30d1939SAndy Fiddaman 			ed_histlist(ep->ed,n);
1428*b30d1939SAndy Fiddaman 			putstring(ep,Prompt);
1429*b30d1939SAndy Fiddaman 			ed_setcursor(ep->ed,ep->screen,0,ep->cursor-ep->screen, 0);
1430*b30d1939SAndy Fiddaman 		}
1431*b30d1939SAndy Fiddaman 		else
1432*b30d1939SAndy Fiddaman 			ed_ringbell();
1433*b30d1939SAndy Fiddaman 
1434*b30d1939SAndy Fiddaman 		}
1435*b30d1939SAndy Fiddaman #endif /* SHOPT_EDPREDICT */
1436*b30d1939SAndy Fiddaman 
1437*b30d1939SAndy Fiddaman 	if ((option == APPEND)&&(ep->scvalid)&&(*logcursor == '\0')&&
1438*b30d1939SAndy Fiddaman 	    print(i)&&((ep->cursor-ep->screen)<(w_size-1)))
1439*b30d1939SAndy Fiddaman 	{
1440*b30d1939SAndy Fiddaman 		putchar(ep->ed,i);
1441*b30d1939SAndy Fiddaman 		*ep->cursor++ = i;
1442*b30d1939SAndy Fiddaman 		*ep->cursor = '\0';
1443*b30d1939SAndy Fiddaman 		return;
1444*b30d1939SAndy Fiddaman 	}
1445*b30d1939SAndy Fiddaman 
1446*b30d1939SAndy Fiddaman 	/* copy the line */
1447*b30d1939SAndy Fiddaman 	ncursor = nptr + ed_virt_to_phys(ep->ed,sptr,nptr,cur,0,0);
1448*b30d1939SAndy Fiddaman 	nptr += genlen(nptr);
1449*b30d1939SAndy Fiddaman 	sptr += genlen(sptr);
1450*b30d1939SAndy Fiddaman 	nscend = nptr - 1;
1451*b30d1939SAndy Fiddaman 	if(sptr == logcursor)
1452*b30d1939SAndy Fiddaman 		ncursor = nptr;
1453*b30d1939SAndy Fiddaman 
1454*b30d1939SAndy Fiddaman 	/*********************
1455*b30d1939SAndy Fiddaman 	 Does ncursor appear on the screen?
1456*b30d1939SAndy Fiddaman 	 If not, adjust the screen offset so it does.
1457*b30d1939SAndy Fiddaman 	**********************/
1458*b30d1939SAndy Fiddaman 
1459*b30d1939SAndy Fiddaman 	i = ncursor - nscreen;
1460*b30d1939SAndy Fiddaman 
1461*b30d1939SAndy Fiddaman 	if ((ep->offset && i<=ep->offset)||(i >= (ep->offset+w_size)))
1462*b30d1939SAndy Fiddaman 	{
1463*b30d1939SAndy Fiddaman 		/* Center the cursor on the screen */
1464*b30d1939SAndy Fiddaman 		ep->offset = i - (w_size>>1);
1465*b30d1939SAndy Fiddaman 		if (--ep->offset < 0)
1466*b30d1939SAndy Fiddaman 			ep->offset = 0;
1467*b30d1939SAndy Fiddaman 	}
1468*b30d1939SAndy Fiddaman 
1469*b30d1939SAndy Fiddaman 	/*********************
1470*b30d1939SAndy Fiddaman 	 Is the range of screen[0] thru screen[w_size] up-to-date
1471*b30d1939SAndy Fiddaman 	 with nscreen[offset] thru nscreen[offset+w_size] ?
1472*b30d1939SAndy Fiddaman 	 If not, update as need be.
1473*b30d1939SAndy Fiddaman 	***********************/
1474*b30d1939SAndy Fiddaman 
1475*b30d1939SAndy Fiddaman 	nptr = &nscreen[ep->offset];
1476*b30d1939SAndy Fiddaman 	sptr = ep->screen;
1477*b30d1939SAndy Fiddaman 
1478*b30d1939SAndy Fiddaman 	i = w_size;
1479*b30d1939SAndy Fiddaman 
1480*b30d1939SAndy Fiddaman 	while (i-- > 0)
1481*b30d1939SAndy Fiddaman 	{
1482*b30d1939SAndy Fiddaman 
1483*b30d1939SAndy Fiddaman 		if (*nptr == '\0')
1484*b30d1939SAndy Fiddaman 		{
1485*b30d1939SAndy Fiddaman 			*(nptr + 1) = '\0';
1486*b30d1939SAndy Fiddaman 			*nptr = ' ';
1487*b30d1939SAndy Fiddaman 		}
1488*b30d1939SAndy Fiddaman 		if (*sptr == '\0')
1489*b30d1939SAndy Fiddaman 		{
1490*b30d1939SAndy Fiddaman 			*(sptr + 1) = '\0';
1491*b30d1939SAndy Fiddaman 			*sptr = ' ';
1492*b30d1939SAndy Fiddaman 		}
1493*b30d1939SAndy Fiddaman 		if (*nptr == *sptr)
1494*b30d1939SAndy Fiddaman 		{
1495*b30d1939SAndy Fiddaman 			nptr++;
1496*b30d1939SAndy Fiddaman 			sptr++;
1497*b30d1939SAndy Fiddaman 			continue;
1498*b30d1939SAndy Fiddaman 		}
1499*b30d1939SAndy Fiddaman 		setcursor(ep,sptr-ep->screen,*nptr);
1500*b30d1939SAndy Fiddaman 		*sptr++ = *nptr++;
1501*b30d1939SAndy Fiddaman #if SHOPT_MULTIBYTE
1502*b30d1939SAndy Fiddaman 		while(*nptr==MARKER)
1503*b30d1939SAndy Fiddaman 		{
1504*b30d1939SAndy Fiddaman 			if(*sptr=='\0')
1505*b30d1939SAndy Fiddaman 				*(sptr + 1) = '\0';
1506*b30d1939SAndy Fiddaman 			*sptr++ = *nptr++;
1507*b30d1939SAndy Fiddaman 			i--;
1508*b30d1939SAndy Fiddaman 			ep->cursor++;
1509*b30d1939SAndy Fiddaman 		}
1510*b30d1939SAndy Fiddaman #endif /* SHOPT_MULTIBYTE */
1511*b30d1939SAndy Fiddaman 	}
1512*b30d1939SAndy Fiddaman 	if(ep->ed->e_multiline && option == REFRESH && ep->ed->e_nocrnl==0)
1513*b30d1939SAndy Fiddaman 		ed_setcursor(ep->ed, ep->screen, ep->cursor-ep->screen, ep->ed->e_peol, -1);
1514*b30d1939SAndy Fiddaman 
1515*b30d1939SAndy Fiddaman 
1516*b30d1939SAndy Fiddaman 	/******************
1517*b30d1939SAndy Fiddaman 
1518*b30d1939SAndy Fiddaman 	Screen overflow checks
1519*b30d1939SAndy Fiddaman 
1520*b30d1939SAndy Fiddaman 	********************/
1521*b30d1939SAndy Fiddaman 
1522*b30d1939SAndy Fiddaman 	if (nscend >= &nscreen[ep->offset+w_size])
1523*b30d1939SAndy Fiddaman 	{
1524*b30d1939SAndy Fiddaman 		if (ep->offset > 0)
1525*b30d1939SAndy Fiddaman 			longline = BOTH;
1526*b30d1939SAndy Fiddaman 		else
1527*b30d1939SAndy Fiddaman 			longline = UPPER;
1528*b30d1939SAndy Fiddaman 	}
1529*b30d1939SAndy Fiddaman 	else
1530*b30d1939SAndy Fiddaman 	{
1531*b30d1939SAndy Fiddaman 		if (ep->offset > 0)
1532*b30d1939SAndy Fiddaman 			longline = LOWER;
1533*b30d1939SAndy Fiddaman 	}
1534*b30d1939SAndy Fiddaman 
1535*b30d1939SAndy Fiddaman 	/* Update screen overflow indicator if need be */
1536*b30d1939SAndy Fiddaman 
1537*b30d1939SAndy Fiddaman 	if (longline != ep->overflow)
1538*b30d1939SAndy Fiddaman 	{
1539*b30d1939SAndy Fiddaman 		setcursor(ep,w_size,longline);
1540*b30d1939SAndy Fiddaman 		ep->overflow = longline;
1541*b30d1939SAndy Fiddaman 	}
1542*b30d1939SAndy Fiddaman 	i = (ncursor-nscreen) - ep->offset;
1543*b30d1939SAndy Fiddaman 	setcursor(ep,i,0);
1544*b30d1939SAndy Fiddaman 	if(option==FINAL && ep->ed->e_multiline)
1545*b30d1939SAndy Fiddaman 		setcursor(ep,nscend+1-nscreen,0);
1546*b30d1939SAndy Fiddaman 	ep->scvalid = 1;
1547*b30d1939SAndy Fiddaman 	return;
1548*b30d1939SAndy Fiddaman }
1549*b30d1939SAndy Fiddaman 
1550*b30d1939SAndy Fiddaman /*
1551*b30d1939SAndy Fiddaman  * put the cursor to the <newp> position within screen buffer
1552*b30d1939SAndy Fiddaman  * if <c> is non-zero then output this character
1553*b30d1939SAndy Fiddaman  * cursor is set to reflect the change
1554*b30d1939SAndy Fiddaman  */
1555*b30d1939SAndy Fiddaman 
setcursor(register Emacs_t * ep,register int newp,int c)1556*b30d1939SAndy Fiddaman static void setcursor(register Emacs_t *ep,register int newp,int c)
1557*b30d1939SAndy Fiddaman {
1558*b30d1939SAndy Fiddaman 	register int oldp = ep->cursor - ep->screen;
1559*b30d1939SAndy Fiddaman 	newp  = ed_setcursor(ep->ed, ep->screen, oldp, newp, 0);
1560*b30d1939SAndy Fiddaman 	if(c)
1561*b30d1939SAndy Fiddaman 	{
1562*b30d1939SAndy Fiddaman 		putchar(ep->ed,c);
1563*b30d1939SAndy Fiddaman 		newp++;
1564*b30d1939SAndy Fiddaman 	}
1565*b30d1939SAndy Fiddaman 	ep->cursor = ep->screen+newp;
1566*b30d1939SAndy Fiddaman 	return;
1567*b30d1939SAndy Fiddaman }
1568*b30d1939SAndy Fiddaman 
1569*b30d1939SAndy Fiddaman #if SHOPT_MULTIBYTE
print(register int c)1570*b30d1939SAndy Fiddaman static int print(register int c)
1571*b30d1939SAndy Fiddaman {
1572*b30d1939SAndy Fiddaman 	return((c&~STRIP)==0 && isprint(c));
1573*b30d1939SAndy Fiddaman }
1574*b30d1939SAndy Fiddaman 
_isword(register int c)1575*b30d1939SAndy Fiddaman static int _isword(register int c)
1576*b30d1939SAndy Fiddaman {
1577*b30d1939SAndy Fiddaman 	return((c&~STRIP) || isalnum(c) || c=='_');
1578*b30d1939SAndy Fiddaman }
1579*b30d1939SAndy Fiddaman #endif /* SHOPT_MULTIBYTE */
1580