1da2e3ebdSchin /***********************************************************************
2da2e3ebdSchin *                                                                      *
3da2e3ebdSchin *               This software is part of the ast package               *
4*b30d1939SAndy Fiddaman *          Copyright (c) 1982-2012 AT&T Intellectual Property          *
5da2e3ebdSchin *                      and is licensed under the                       *
6*b30d1939SAndy Fiddaman *                 Eclipse Public License, Version 1.0                  *
77c2fbfb3SApril Chin *                    by AT&T Intellectual Property                     *
8da2e3ebdSchin *                                                                      *
9da2e3ebdSchin *                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)         *
12da2e3ebdSchin *                                                                      *
13da2e3ebdSchin *              Information and Software Systems Research               *
14da2e3ebdSchin *                            AT&T Research                             *
15da2e3ebdSchin *                           Florham Park NJ                            *
16da2e3ebdSchin *                                                                      *
17da2e3ebdSchin *                  David Korn <dgk@research.att.com>                   *
18da2e3ebdSchin *                                                                      *
19da2e3ebdSchin ***********************************************************************/
20da2e3ebdSchin #pragma prototyped
21da2e3ebdSchin #ifndef SEARCHSIZE
22da2e3ebdSchin /*
23da2e3ebdSchin  *  edit.h -  common data structure for vi and emacs edit options
24da2e3ebdSchin  *
25da2e3ebdSchin  *   David Korn
26da2e3ebdSchin  *   AT&T Labs
27da2e3ebdSchin  *
28da2e3ebdSchin  */
29da2e3ebdSchin 
30da2e3ebdSchin #define SEARCHSIZE	80
31da2e3ebdSchin 
32da2e3ebdSchin #include	"FEATURE/options"
33da2e3ebdSchin #include        "FEATURE/locale"
34da2e3ebdSchin #if !SHOPT_VSH && !SHOPT_ESH
35da2e3ebdSchin #   define ed_winsize()	(SEARCHSIZE)
36da2e3ebdSchin #else
37da2e3ebdSchin 
38da2e3ebdSchin #if !KSHELL
39da2e3ebdSchin #   include	<setjmp.h>
40da2e3ebdSchin #   include	<sig.h>
41da2e3ebdSchin #   include	<ctype.h>
42da2e3ebdSchin #endif /* KSHELL */
43da2e3ebdSchin 
44da2e3ebdSchin #include	"FEATURE/setjmp"
45da2e3ebdSchin #include	"terminal.h"
46da2e3ebdSchin 
47da2e3ebdSchin #define STRIP		0377
48da2e3ebdSchin #define LOOKAHEAD	80
49da2e3ebdSchin 
50da2e3ebdSchin #if SHOPT_MULTIBYTE
51da2e3ebdSchin #   ifndef ESS_MAXCHAR
52da2e3ebdSchin #	include	"national.h"
53da2e3ebdSchin #   endif /* ESS_MAXCHAR */
54da2e3ebdSchin     typedef wchar_t genchar;
55da2e3ebdSchin #   define CHARSIZE	(sizeof(wchar_t)<=2?3:sizeof(wchar_t))
56da2e3ebdSchin #else
57da2e3ebdSchin     typedef char genchar;
58da2e3ebdSchin #   define CHARSIZE	1
59da2e3ebdSchin #endif /* SHOPT_MULTIBYTE */
60da2e3ebdSchin 
61da2e3ebdSchin #define TABSIZE	8
62*b30d1939SAndy Fiddaman #define PRSIZE	256
63da2e3ebdSchin #define MAXLINE	1024		/* longest edit line permitted */
64da2e3ebdSchin 
65da2e3ebdSchin typedef struct _edit_pos
66da2e3ebdSchin {
67da2e3ebdSchin 	unsigned short line;
68da2e3ebdSchin 	unsigned short col;
69da2e3ebdSchin } Edpos_t;
70da2e3ebdSchin 
71*b30d1939SAndy Fiddaman #if SHOPT_EDPREDICT
72*b30d1939SAndy Fiddaman typedef struct Histmatch
73*b30d1939SAndy Fiddaman {
74*b30d1939SAndy Fiddaman 	struct Histmatch	*next;
75*b30d1939SAndy Fiddaman 	int			index;
76*b30d1939SAndy Fiddaman 	short			len;
77*b30d1939SAndy Fiddaman 	short			count;
78*b30d1939SAndy Fiddaman 	char			data[1];
79*b30d1939SAndy Fiddaman } Histmatch_t;
80*b30d1939SAndy Fiddaman #endif /* SHOPT_EDPREDICT */
81*b30d1939SAndy Fiddaman 
82*b30d1939SAndy Fiddaman 
83*b30d1939SAndy Fiddaman 
84da2e3ebdSchin typedef struct edit
85da2e3ebdSchin {
86da2e3ebdSchin 	sigjmp_buf e_env;
87*b30d1939SAndy Fiddaman 	int	e_intr;
88da2e3ebdSchin 	int	e_kill;
89da2e3ebdSchin 	int	e_erase;
90da2e3ebdSchin 	int	e_werase;
91da2e3ebdSchin 	int	e_eof;
92da2e3ebdSchin 	int	e_lnext;
93da2e3ebdSchin 	int	e_fchar;
94da2e3ebdSchin 	int	e_plen;		/* length of prompt string */
957c2fbfb3SApril Chin 	char	e_crlf;		/* zero if cannot return to beginning of line */
967c2fbfb3SApril Chin 	char	e_nocrnl;	/* don't put a new-line with ^L */
97*b30d1939SAndy Fiddaman 	char	e_keytrap;	/* set when in keytrap */
98da2e3ebdSchin 	int	e_llimit;	/* line length limit */
99da2e3ebdSchin 	int	e_hline;	/* current history line number */
100da2e3ebdSchin 	int	e_hloff;	/* line number offset for command */
101da2e3ebdSchin 	int	e_hismin;	/* minimum history line number */
102da2e3ebdSchin 	int	e_hismax;	/* maximum history line number */
103da2e3ebdSchin 	int	e_raw;		/* set when in raw mode or alt mode */
104da2e3ebdSchin 	int	e_cur;		/* current line position */
105da2e3ebdSchin 	int	e_eol;		/* end-of-line position */
106da2e3ebdSchin 	int	e_pcur;		/* current physical line position */
107da2e3ebdSchin 	int	e_peol;		/* end of physical line position */
108da2e3ebdSchin 	int	e_mode;		/* edit mode */
109da2e3ebdSchin 	int	e_lookahead;	/* index in look-ahead buffer */
110da2e3ebdSchin 	int	e_repeat;
111da2e3ebdSchin 	int	e_saved;
112da2e3ebdSchin 	int	e_fcol;		/* first column */
113da2e3ebdSchin 	int	e_ucol;		/* column for undo */
114da2e3ebdSchin 	int	e_wsize;	/* width of display window */
115da2e3ebdSchin 	char	*e_outbase;	/* pointer to start of output buffer */
116da2e3ebdSchin 	char	*e_outptr;	/* pointer to position in output buffer */
117da2e3ebdSchin 	char	*e_outlast;	/* pointer to end of output buffer */
118da2e3ebdSchin 	genchar	*e_inbuf;	/* pointer to input buffer */
119da2e3ebdSchin 	char	*e_prompt;	/* pointer to buffer containing the prompt */
120da2e3ebdSchin 	genchar	*e_ubuf;	/* pointer to the undo buffer */
121da2e3ebdSchin 	genchar	*e_killbuf;	/* pointer to delete buffer */
122da2e3ebdSchin 	char	e_search[SEARCHSIZE];	/* search string */
123da2e3ebdSchin 	genchar	*e_Ubuf;	/* temporary workspace buffer */
124da2e3ebdSchin 	genchar	*e_physbuf;	/* temporary workspace buffer */
125da2e3ebdSchin 	int	e_lbuf[LOOKAHEAD];/* pointer to look-ahead buffer */
126da2e3ebdSchin 	int	e_fd;		/* file descriptor */
127da2e3ebdSchin 	int	e_ttyspeed;	/* line speed, also indicates tty parms are valid */
128da2e3ebdSchin 	int	e_tabcount;
129da2e3ebdSchin #ifdef _hdr_utime
130da2e3ebdSchin 	ino_t	e_tty_ino;
131da2e3ebdSchin 	dev_t	e_tty_dev;
132da2e3ebdSchin 	char	*e_tty;
133da2e3ebdSchin #endif
134da2e3ebdSchin #if SHOPT_OLDTERMIO
135da2e3ebdSchin 	char	e_echoctl;
136da2e3ebdSchin 	char	e_tcgeta;
137da2e3ebdSchin 	struct termio e_ott;
138da2e3ebdSchin #endif
139da2e3ebdSchin #if SHOPT_MULTIBYTE
140da2e3ebdSchin 	int	e_curchar;
141da2e3ebdSchin 	int	e_cursize;
142da2e3ebdSchin #endif
143da2e3ebdSchin 	int	*e_globals;	/* global variables */
144da2e3ebdSchin 	genchar	*e_window;	/* display window  image */
145da2e3ebdSchin 	char	e_inmacro;	/* processing macro expansion */
146da2e3ebdSchin #if KSHELL
147da2e3ebdSchin 	char	e_vi_insert[2];	/* for sh_keytrap */
148da2e3ebdSchin 	int32_t e_col;		/* for sh_keytrap */
149da2e3ebdSchin #else
150da2e3ebdSchin 	char	e_prbuff[PRSIZE]; /* prompt buffer */
151da2e3ebdSchin #endif /* KSHELL */
152da2e3ebdSchin 	struct termios	e_ttyparm;      /* initial tty parameters */
153da2e3ebdSchin 	struct termios	e_nttyparm;     /* raw tty parameters */
154da2e3ebdSchin 	struct termios e_savetty;	/* saved terminal state */
155da2e3ebdSchin 	int	e_savefd;	/* file descriptor for saved terminal state */
156da2e3ebdSchin 	char	e_macro[4];	/* macro buffer */
157da2e3ebdSchin 	void	*e_vi;		/* vi specific data */
158da2e3ebdSchin 	void	*e_emacs;	/* emacs specific data */
159da2e3ebdSchin 	Shell_t	*sh;		/* interpreter pointer */
160da2e3ebdSchin 	char	*e_stkptr;	/* saved stack pointer */
161da2e3ebdSchin 	int	e_stkoff;	/* saved stack offset */
162da2e3ebdSchin 	char	**e_clist;	/* completion list after <ESC>= */
163da2e3ebdSchin 	int	e_nlist;	/* number of elements on completion list */
164da2e3ebdSchin 	int	e_multiline;	/* allow multiple lines for editing */
165da2e3ebdSchin 	int	e_winsz;	/* columns in window */
166da2e3ebdSchin 	Edpos_t	e_curpos;	/* cursor line and column */
167da2e3ebdSchin 	Namval_t *e_default;	/* variable containing default value */
168da2e3ebdSchin 	Namval_t *e_term;	/* TERM variable */
169da2e3ebdSchin 	char 	e_termname[80];	/* terminal name */
170*b30d1939SAndy Fiddaman #if SHOPT_EDPREDICT
171*b30d1939SAndy Fiddaman 	Histmatch_t	**hlist;
172*b30d1939SAndy Fiddaman 	Histmatch_t	*hfirst;
173*b30d1939SAndy Fiddaman 	unsigned short	nhlist;
174*b30d1939SAndy Fiddaman 	unsigned short	hoff;
175*b30d1939SAndy Fiddaman 	unsigned short	hmax;
176*b30d1939SAndy Fiddaman 	char		hpat[40];
177*b30d1939SAndy Fiddaman 	char		*hstak;
178*b30d1939SAndy Fiddaman #endif /* SHOPT_EDPREDICT */
179da2e3ebdSchin } Edit_t;
180da2e3ebdSchin 
181da2e3ebdSchin #undef MAXWINDOW
182da2e3ebdSchin #define MAXWINDOW	300	/* maximum width window */
183da2e3ebdSchin #define FAST	2
184da2e3ebdSchin #define SLOW	1
185da2e3ebdSchin #define ESC	cntl('[')
186da2e3ebdSchin #define	UEOF	-2			/* user eof char synonym */
187da2e3ebdSchin #define	UINTR	-3			/* user intr char synonym */
188da2e3ebdSchin #define	UERASE	-4			/* user erase char synonym */
189da2e3ebdSchin #define	UKILL	-5			/* user kill char synonym */
190da2e3ebdSchin #define	UWERASE	-6			/* user word erase char synonym */
191da2e3ebdSchin #define	ULNEXT	-7			/* user next literal char synonym */
192da2e3ebdSchin 
193da2e3ebdSchin #if ( 'a' == 97) /* ASCII? */
194da2e3ebdSchin #   define	cntl(x)		(x&037)
195da2e3ebdSchin #else
196da2e3ebdSchin #   define cntl(c) (c=='D'?55:(c=='E'?45:(c=='F'?46:(c=='G'?'\a':(c=='H'?'\b': \
197da2e3ebdSchin 		(c=='I'?'\t':(c=='J'?'\n':(c=='T'?60:(c=='U'?61:(c=='V'?50: \
198da2e3ebdSchin 		(c=='W'?38:(c=='Z'?63:(c=='['?39:(c==']'?29: \
199da2e3ebdSchin 		(c<'J'?c+1-'A':(c+10-'J'))))))))))))))))
200da2e3ebdSchin #endif
201da2e3ebdSchin 
202da2e3ebdSchin #if !KSHELL
203da2e3ebdSchin #   define STRIP	0377
204da2e3ebdSchin #   define GMACS	1
205da2e3ebdSchin #   define EMACS	2
206da2e3ebdSchin #   define VIRAW	4
207da2e3ebdSchin #   define EDITVI	8
208da2e3ebdSchin #   define NOHIST	16
209da2e3ebdSchin #   define EDITMASK	15
210da2e3ebdSchin #   define is_option(m)	(opt_flag&(m))
211da2e3ebdSchin     extern char opt_flag;
212da2e3ebdSchin #   ifdef SYSCALL
213da2e3ebdSchin #	define read(fd,buff,n)	syscall(3,fd,buff,n)
214da2e3ebdSchin #   else
215da2e3ebdSchin #	define read(fd,buff,n)	rEAd(fd,buff,n)
216da2e3ebdSchin #   endif /* SYSCALL */
217da2e3ebdSchin #endif	/* KSHELL */
218da2e3ebdSchin 
219da2e3ebdSchin extern void	ed_crlf(Edit_t*);
220da2e3ebdSchin extern void	ed_putchar(Edit_t*, int);
221da2e3ebdSchin extern void	ed_ringbell(void);
222da2e3ebdSchin extern void	ed_setup(Edit_t*,int, int);
223da2e3ebdSchin extern void	ed_flush(Edit_t*);
224da2e3ebdSchin extern int	ed_getchar(Edit_t*,int);
225da2e3ebdSchin extern int	ed_virt_to_phys(Edit_t*,genchar*,genchar*,int,int,int);
226da2e3ebdSchin extern int	ed_window(void);
227da2e3ebdSchin extern void	ed_ungetchar(Edit_t*,int);
228da2e3ebdSchin extern int	ed_viread(void*, int, char*, int, int);
229da2e3ebdSchin extern int	ed_read(void*, int, char*, int, int);
230da2e3ebdSchin extern int	ed_emacsread(void*, int, char*, int, int);
231da2e3ebdSchin extern Edpos_t	ed_curpos(Edit_t*, genchar*, int, int, Edpos_t);
232da2e3ebdSchin extern int	ed_setcursor(Edit_t*, genchar*, int, int, int);
233da2e3ebdSchin #if KSHELL
234da2e3ebdSchin 	extern int	ed_macro(Edit_t*,int);
235da2e3ebdSchin 	extern int	ed_expand(Edit_t*, char[],int*,int*,int,int);
236da2e3ebdSchin 	extern int	ed_fulledit(Edit_t*);
237da2e3ebdSchin 	extern void	*ed_open(Shell_t*);
238da2e3ebdSchin #endif /* KSHELL */
239da2e3ebdSchin #   if SHOPT_MULTIBYTE
240da2e3ebdSchin 	extern int ed_internal(const char*, genchar*);
241da2e3ebdSchin 	extern int ed_external(const genchar*, char*);
242da2e3ebdSchin 	extern void ed_gencpy(genchar*,const genchar*);
243da2e3ebdSchin 	extern void ed_genncpy(genchar*,const genchar*,int);
244da2e3ebdSchin 	extern int ed_genlen(const genchar*);
245da2e3ebdSchin 	extern int ed_setwidth(const char*);
246da2e3ebdSchin #  endif /* SHOPT_MULTIBYTE */
247*b30d1939SAndy Fiddaman #if SHOPT_EDPREDICT
248*b30d1939SAndy Fiddaman    extern int	ed_histgen(Edit_t*, const char*);
249*b30d1939SAndy Fiddaman    extern void	ed_histlist(Edit_t*, int);
250*b30d1939SAndy Fiddaman #endif /* SHOPT_EDPREDICT */
251da2e3ebdSchin 
252da2e3ebdSchin extern const char	e_runvi[];
253da2e3ebdSchin #if !KSHELL
254da2e3ebdSchin    extern const char	e_version[];
255da2e3ebdSchin #endif /* KSHELL */
256da2e3ebdSchin 
257da2e3ebdSchin #if SHOPT_HISTEXPAND
258da2e3ebdSchin 
259da2e3ebdSchin /* flags */
260da2e3ebdSchin 
261da2e3ebdSchin #define	HIST_EVENT	0x1	/* event designator seen */
262da2e3ebdSchin #define HIST_QUESTION	0x2	/* question mark event designator */
263da2e3ebdSchin #define	HIST_HASH	0x4	/* hash event designator */
264da2e3ebdSchin #define HIST_WORDDSGN	0x8	/* word designator seen */
265da2e3ebdSchin #define HIST_QUICKSUBST	0x10	/* quick substition designator seen */
266da2e3ebdSchin #define HIST_SUBSTITUTE	0x20	/* for substition loop */
267da2e3ebdSchin #define	HIST_NEWLINE	0x40	/* newline in squashed white space */
268da2e3ebdSchin 
269da2e3ebdSchin /* modifier flags */
270da2e3ebdSchin 
271da2e3ebdSchin #define	HIST_PRINT		0x100	/* print new command */
272da2e3ebdSchin #define	HIST_QUOTE		0x200	/* quote resulting history line */
273da2e3ebdSchin #define	HIST_QUOTE_BR		0x400	/* quote every word on space break */
274da2e3ebdSchin #define	HIST_GLOBALSUBST	0x800	/* apply substition globally */
275da2e3ebdSchin 
276da2e3ebdSchin #define	HIST_ERROR		0x1000	/* an error ocurred */
277da2e3ebdSchin 
278da2e3ebdSchin /* flags to be returned */
279da2e3ebdSchin 
280da2e3ebdSchin #define	HIST_FLAG_RETURN_MASK	(HIST_EVENT|HIST_PRINT|HIST_ERROR)
281da2e3ebdSchin 
282da2e3ebdSchin extern int hist_expand(const char *, char **);
283da2e3ebdSchin #endif
284da2e3ebdSchin 
285da2e3ebdSchin #endif
286da2e3ebdSchin #endif
287