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