xref: /titanic_51/usr/src/cmd/vi/port/ex.h (revision 8eea8e29cc4374d1ee24c25a07f45af132db3499)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
23 /*	  All Rights Reserved  	*/
24 
25 
26 /* Copyright (c) 1981 Regents of the University of California */
27 
28 /*
29  * Copyright (c) 2000 by Sun Microsystems, Inc.
30  * All rights reserved.
31  */
32 
33 #ident	"%Z%%M%	%I%	%E% SMI"	/* SVr4.0 1.34	*/
34 /*
35  * This file contains most of the declarations common to a large number
36  * of routines.  The file ex_vis.h contains declarations
37  * which are used only inside the screen editor.
38  * The file ex_tune.h contains parameters which can be diddled per installation.
39  *
40  * The declarations relating to the argument list, regular expressions,
41  * the temporary file data structure used by the editor
42  * and the data describing terminals are each fairly substantial and
43  * are kept in the files ex_{argv,re,temp,tty}.h which
44  * we #include separately.
45  *
46  * If you are going to dig into ex, you should look at the outline of the
47  * distribution of the code into files at the beginning of ex.c and ex_v.c.
48  * Code which is similar to that of ed is lightly or undocumented in spots
49  * (e.g. the regular expression code).  Newer code (e.g. open and visual)
50  * is much more carefully documented, and still rough in spots.
51  *
52  */
53 #ifdef UCBV7
54 #include <whoami.h>
55 #endif
56 #include <sys/types.h>
57 #include <ctype.h>
58 #include <errno.h>
59 #include <signal.h>
60 #include <setjmp.h>
61 #include <sys/stat.h>
62 #include <stdlib.h>
63 #include <limits.h>
64 
65 #define MULTI_BYTE_MAX MB_LEN_MAX
66 #define FTYPE(A)	(A.st_mode)
67 #define FMODE(A)	(A.st_mode)
68 #define	IDENTICAL(A,B)	(A.st_dev==B.st_dev && A.st_ino==B.st_ino)
69 #define ISBLK(A)	((A.st_mode & S_IFMT) == S_IFBLK)
70 #define ISCHR(A)	((A.st_mode & S_IFMT) == S_IFCHR)
71 #define ISDIR(A)	((A.st_mode & S_IFMT) == S_IFDIR)
72 #define ISFIFO(A)	((A.st_mode & S_IFMT) == S_IFIFO)
73 #define ISREG(A)	((A.st_mode & S_IFMT) == S_IFREG)
74 
75 #ifdef USG
76 #include <termio.h>
77 typedef struct termios SGTTY;
78 #else
79 #include <sgtty.h>
80 typedef struct sgttyb SGTTY;
81 #endif
82 
83 #ifdef PAVEL
84 #define SGTTY struct sgttyb	/* trick Pavel curses to not include <curses.h> */
85 #endif
86 typedef char bool;
87 typedef unsigned long chtype;
88 #include <term.h>
89 #define bool vi_bool
90 #ifdef PAVEL
91 #undef SGTTY
92 #endif
93 #ifndef var
94 #define var	extern
95 #endif
96 var char *exit_bold;		/* string to exit standout mode */
97 
98 /*
99  *	The following little dance copes with the new USG tty handling.
100  *	This stuff has the advantage of considerable flexibility, and
101  *	the disadvantage of being incompatible with anything else.
102  *	The presence of the symbol USG will indicate the new code:
103  *	in this case, we define CBREAK (because we can simulate it exactly),
104  *	but we won't actually use it, so we set it to a value that will
105  *	probably blow the compilation if we goof up.
106  */
107 #ifdef USG
108 #define CBREAK xxxxx
109 #endif
110 
111 extern	int errno;
112 
113 #ifndef VMUNIX
114 typedef	short	line;
115 #else
116 typedef	int	line;
117 #endif
118 typedef	short	bool;
119 
120 #include "ex_tune.h"
121 #include "ex_vars.h"
122 /*
123  * Options in the editor are referred to usually by "value(vi_name)" where
124  * name is all uppercase, i.e. "value(vi_PROMPT)".  This is actually a macro
125  * which expands to a fixed field in a static structure and so generates
126  * very little code.  The offsets for the option names in the structure
127  * are generated automagically from the structure initializing them in
128  * ex_data.c... see the shell script "makeoptions".
129  */
130 struct	option {
131 	unsigned char	*oname;
132 	unsigned char	*oabbrev;
133 	short	otype;		/* Types -- see below */
134 	short	odefault;	/* Default value */
135 	short	ovalue;		/* Current value */
136 	unsigned char	*osvalue;
137 };
138 
139 #define	ONOFF	0
140 #define	NUMERIC	1
141 #define	STRING	2		/* SHELL or DIRECTORY */
142 #define	OTERM	3
143 
144 #define	value(a)	options[a].ovalue
145 #define	svalue(a)	options[a].osvalue
146 
147 extern	 struct	option options[vi_NOPTS + 1];
148 
149 
150 /*
151  * The editor does not normally use the standard i/o library.  Because
152  * we expect the editor to be a heavily used program and because it
153  * does a substantial amount of input/output processing it is appropriate
154  * for it to call low level read/write primitives directly.  In fact,
155  * when debugging the editor we use the standard i/o library.  In any
156  * case the editor needs a printf which prints through "putchar" ala the
157  * old version 6 printf.  Thus we normally steal a copy of the "printf.c"
158  * and "strout" code from the standard i/o library and mung it for our
159  * purposes to avoid dragging in the stdio library headers, etc if we
160  * are not debugging.  Such a modified printf exists in "printf.c" here.
161  */
162 #ifdef TRACE
163 #include <stdio.h>
164 	var	FILE	*trace;
165 	var	bool	trubble;
166 	var	bool	techoin;
167 	var	unsigned char	tracbuf[BUFSIZ];
168 #undef	putchar
169 #undef	getchar
170 #else
171 /*
172  * Warning: do not change BUFSIZ without also changing LBSIZE in ex_tune.h
173  * Running with BUFSIZ set to anything besides what is in <stdio.h> is
174  * not recommended, if you use stdio.
175  */
176 #ifdef u370
177 #define	BUFSIZE	4096
178 #else
179 #define	BUFSIZE	(LINE_MAX*2)
180 #endif
181 #undef	NULL
182 #define	NULL	0
183 #undef	EOF
184 #define	EOF	-1
185 #endif
186 
187 /*
188  * Character constants and bits
189  *
190  * The editor uses the QUOTE bit as a flag to pass on with characters
191  * e.g. to the putchar routine.  The editor never uses a simple char variable.
192  * Only arrays of and pointers to characters are used and parameters and
193  * registers are never declared character.
194  */
195 #define	QUOTE	020000000000
196 #define	TRIM	017777777777
197 #define	NL	'\n'
198 #define	CR	'\r'
199 #define	DELETE	0177		/* See also ATTN, QUIT in ex_tune.h */
200 #define	ESCAPE	033
201 #undef	CTRL
202 #define	CTRL(c)	(c & 037)
203 
204 /*
205  * Miscellaneous random variables used in more than one place
206  */
207 var bool multibyte;
208 var	bool	aiflag;		/* Append/change/insert with autoindent */
209 var	bool	anymarks;	/* We have used '[a-z] */
210 var	int	chng;		/* Warn "No write" */
211 var	unsigned char	*Command;
212 var	short	defwind;	/* -w# change default window size */
213 var	int	dirtcnt;	/* When >= MAXDIRT, should sync temporary */
214 #ifdef SIGTSTP
215 var	bool	dosusp;		/* Do SIGTSTP in visual when ^Z typed */
216 #endif
217 var	bool	edited;		/* Current file is [Edited] */
218 var	line	*endcore;	/* Last available core location */
219 extern	 bool	endline;	/* Last cmd mode command ended with \n */
220 var	line	*fendcore;	/* First address in line pointer space */
221 var	unsigned char	file[FNSIZE];	/* Working file name */
222 var	unsigned char	genbuf[LBSIZE];	/* Working buffer when manipulating linebuf */
223 var	bool	hush;		/* Command line option - was given, hush up! */
224 var	unsigned char	*globp;		/* (Untyped) input string to command mode */
225 var	bool	holdcm;		/* Don't cursor address */
226 var	bool	inappend;	/* in ex command append mode */
227 var	bool	inglobal;	/* Inside g//... or v//... */
228 var	unsigned char	*initev;	/* Initial : escape for visual */
229 var	bool	inopen;		/* Inside open or visual */
230 var	unsigned char	*input;		/* Current position in cmd line input buffer */
231 var	bool	intty;		/* Input is a tty */
232 var	short	io;		/* General i/o unit (auto-closed on error!) */
233 extern	 short	lastc;		/* Last character ret'd from cmd input */
234 var	bool	laste;		/* Last command was an "e" (or "rec") */
235 var	unsigned char	lastmac;	/* Last macro called for ** */
236 var	unsigned char	lasttag[TAGSIZE];	/* Last argument to a tag command */
237 var	unsigned char	*linebp;	/* Used in substituting in \n */
238 var	unsigned char	linebuf[LBSIZE];	/* The primary line buffer */
239 var	bool	listf;		/* Command should run in list mode */
240 var	line	names['z'-'a'+2];	/* Mark registers a-z,' */
241 var	int	notecnt;	/* Count for notify (to visual from cmd) */
242 var	bool	numberf;	/* Command should run in number mode */
243 var	unsigned char	obuf[BUFSIZE];	/* Buffer for tty output */
244 var	short	oprompt;	/* Saved during source */
245 var	short	ospeed;		/* Output speed (from gtty) */
246 var	int	otchng;		/* Backup tchng to find changes in macros */
247 var	int	peekc;		/* Peek ahead character (cmd mode input) */
248 var	unsigned char	*pkill[2];	/* Trim for put with ragged (LISP) delete */
249 var	bool	pfast;		/* Have stty -nl'ed to go faster */
250 var	pid_t	pid;		/* Process id of child */
251 var	pid_t	ppid;		/* Process id of parent (e.g. main ex proc) */
252 var	jmp_buf	resetlab;	/* For error throws to top level (cmd mode) */
253 var	pid_t	rpid;		/* Pid returned from wait() */
254 var	bool	ruptible;	/* Interruptible is normal state */
255 var	bool	seenprompt;	/* 1 if have gotten user input */
256 var	bool	shudclob;	/* Have a prompt to clobber (e.g. on ^D) */
257 var	int	status;		/* Status returned from wait() */
258 var	int	tchng;		/* If nonzero, then [Modified] */
259 extern	short	tfile;		/* Temporary file unit */
260 var	bool	vcatch;		/* Want to catch an error (open/visual) */
261 var	jmp_buf	vreslab;	/* For error throws to a visual catch */
262 var	bool	writing;	/* 1 if in middle of a file write */
263 var	int	xchng;		/* Suppresses multiple "No writes" in !cmd */
264 #ifndef PRESUNEUC
265 var	char	mc_filler;	/* Right margin filler for multicolumn char */
266 var	bool	mc_wrap;	/* Multicolumn character wrap at right margin */
267 #endif /* PRESUNEUC */
268 var     int     inexrc;         /* boolean: in .exrc initialization */
269 
270 extern	int	termiosflag;	/* flag for using termios */
271 
272 /*
273  * Macros
274  */
275 #define	CP(a, b)	((void)strcpy(a, b))
276 			/*
277 			 * FIXUNDO: do we want to mung undo vars?
278 			 * Usually yes unless in a macro or global.
279 			 */
280 #define FIXUNDO		(inopen >= 0 && (inopen || !inglobal))
281 #define ckaw()		{if (chng && value(vi_AUTOWRITE) && !value(vi_READONLY)) \
282 				wop(0);\
283 			}
284 #define	copy(a,b,c)	Copy((char *) (a), (char *) (b), (c))
285 #define	eq(a, b)	((a) && (b) && strcmp(a, b) == 0)
286 #define	getexit(a)	copy(a, resetlab, sizeof (jmp_buf))
287 #define	lastchar()	lastc
288 #define	outchar(c)	(*Outchar)(c)
289 #define	pastwh()	((void)skipwh())
290 #define	pline(no)	(*Pline)(no)
291 #define	reset()		longjmp(resetlab,1)
292 #define	resexit(a)	copy(resetlab, a, sizeof (jmp_buf))
293 #define	setexit()	setjmp(resetlab)
294 #define	setlastchar(c)	lastc = c
295 #define	ungetchar(c)	peekc = c
296 
297 #define	CATCH		vcatch = 1; if (setjmp(vreslab) == 0) {
298 #define	ONERR		} else { vcatch = 0;
299 #define	ENDCATCH	} vcatch = 0;
300 
301 /*
302  * Environment like memory
303  */
304 var	unsigned char	altfile[FNSIZE];	/* Alternate file name */
305 extern	unsigned char	direct[ONMSZ];		/* Temp file goes here */
306 extern	unsigned char	shell[ONMSZ];		/* Copied to be settable */
307 var	unsigned char	uxb[UXBSIZE + 2];	/* Last !command for !! */
308 
309 /*
310  * The editor data structure for accessing the current file consists
311  * of an incore array of pointers into the temporary file tfile.
312  * Each pointer is 15 bits (the low bit is used by global) and is
313  * padded with zeroes to make an index into the temp file where the
314  * actual text of the line is stored.
315  *
316  * To effect undo, copies of affected lines are saved after the last
317  * line considered to be in the buffer, between dol and unddol.
318  * During an open or visual, which uses the command mode undo between
319  * dol and unddol, a copy of the entire, pre-command buffer state
320  * is saved between unddol and truedol.
321  */
322 var	line	*addr1;			/* First addressed line in a command */
323 var	line	*addr2;			/* Second addressed line */
324 var	line	*dol;			/* Last line in buffer */
325 var	line	*dot;			/* Current line */
326 var	line	*one;			/* First line */
327 var	line	*truedol;		/* End of all lines, including saves */
328 var	line	*unddol;		/* End of undo saved lines */
329 var	line	*zero;			/* Points to empty slot before one */
330 
331 /*
332  * Undo information
333  *
334  * For most commands we save lines changed by salting them away between
335  * dol and unddol before they are changed (i.e. we save the descriptors
336  * into the temp file tfile which is never garbage collected).  The
337  * lines put here go back after unddel, and to complete the undo
338  * we delete the lines [undap1,undap2).
339  *
340  * Undoing a move is much easier and we treat this as a special case.
341  * Similarly undoing a "put" is a special case for although there
342  * are lines saved between dol and unddol we don't stick these back
343  * into the buffer.
344  */
345 var	short	undkind;
346 
347 var	line	*unddel;	/* Saved deleted lines go after here */
348 var	line	*undap1;	/* Beginning of new lines */
349 var	line	*undap2;	/* New lines end before undap2 */
350 var	line	*undadot;	/* If we saved all lines, dot reverts here */
351 
352 #define	UNDCHANGE	0
353 #define	UNDMOVE		1
354 #define	UNDALL		2
355 #define	UNDNONE		3
356 #define	UNDPUT		4
357 
358 /*
359  * Various miscellaneous flags and buffers needed by the encryption routines.
360  */
361 #define	KSIZE   9       /* key size for encryption */
362 var	int	xflag;		/* True if we are in encryption mode */
363 var	int	xtflag;		/* True if the temp file is being encrypted */
364 var	int	kflag;		/* True if the key has been accepted */
365 var	int	crflag;		/* True if the key has been accepted  and the file
366 				   being read is ciphertext
367 				 */
368 var	int	perm[2];	/* pipe connection to crypt for file being edited */
369 var	int	tperm[2];	/* pipe connection to crypt for temporary file */
370 var	int permflag;
371 var 	int tpermflag;
372 var	unsigned char	*key;
373 var	unsigned char	crbuf[CRSIZE];
374 char	*getpass();
375 
376 var	bool	write_quit;	/* True if executing a 'wq' command */
377 var	int	errcnt;		/* number of error/warning messages in */
378 				/*	editing session (global flag)  */
379 /*
380  * Function type definitions
381  */
382 #define	NOSTR	(char *) 0
383 #define	NOLINE	(line *) 0
384 
385 extern	int	(*Outchar)();
386 extern	int	(*Pline)();
387 extern	int	(*Putchar)();
388 var	void	(*oldhup)();
389 int	(*setlist())();
390 int	(*setnorm())();
391 int	(*setnorm())();
392 int	(*setnumb())();
393 #ifndef PRESUNEUC
394 int	(*wdwc)(wchar_t);	/* tells kind of word character */
395 int	(*wdbdg)(wchar_t, wchar_t, int);	/* tells word binding force */
396 wchar_t	*(*wddlm)(wchar_t, wchar_t, int);	/* tells desired delimiter */
397 wchar_t	(*mcfllr)(void);	/* tells multicolumn filler character */
398 #endif /* PRESUNEUC */
399 char	*sbrk();
400 line	*address();
401 unsigned char	*cgoto();
402 unsigned char	*genindent();
403 unsigned char	*getblock();
404 char	*getenv();
405 line	*getmark();
406 unsigned char	*mesg();
407 unsigned char	*place();
408 unsigned char	*plural();
409 line	*scanfor();
410 line	*setin();
411 unsigned char	*strcat();
412 unsigned char	*strcpy();
413 unsigned char	*strend();
414 unsigned char	*tailpath();
415 char	*tgetstr();
416 char	*tgoto();
417 char	*ttyname();
418 line	*vback();
419 unsigned char	*vfindcol();
420 unsigned char	*vgetline();
421 unsigned char	*vinit();
422 unsigned char	*vpastwh();
423 unsigned char	*vskipwh();
424 int	put();
425 int	putreg();
426 int	YANKreg();
427 int	delete();
428 int	execlp();
429 int	vi_filter();
430 int	getfile();
431 int	getsub();
432 int	gettty();
433 int	join();
434 int	listchar();
435 off_t	lseek();
436 int	normchar();
437 int	normline();
438 int	numbline();
439 var	void	(*oldquit)();
440 #ifdef __STDC__
441 void	onhup(int);
442 void	onintr(int);
443 void	onemt(int);
444 void	oncore(int);
445 #ifdef CBREAK
446 void	vintr(int);
447 #endif
448 void	onsusp(int);
449 int	putch(char);
450 int	plodput(char);
451 int	vputch(char);
452 #else
453 void	onhup();
454 void	onintr();
455 void	onemt();
456 void	oncore();
457 #ifdef CBREAK
458 void	vintr();
459 #endif
460 void	onsusp();
461 int	putch();
462 int	plodput();
463 int	vputch();
464 #endif /* __STDC__ */
465 
466 int	shift();
467 int	termchar();
468 int	vfilter();
469 int	vshftop();
470 int	yank();
471 unsigned char *lastchr();
472 unsigned char *nextchr();
473 bool putoctal;
474 int	shift();
475 int	termchar();
476 int	vfilter();
477 int	vshftop();
478 int	yank();
479 unsigned char *lastchr();
480 unsigned char *nextchr();
481 bool putoctal;
482