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