xref: /original-bsd/usr.bin/ex/ex.h (revision 5998a314)
1 /* Copyright (c) 1981 Regents of the University of California */
2 /* sccs id:	@(#)ex.h	7.4	09/03/81  */
3 #ifdef V6
4 #include <retrofit.h>
5 #endif
6 
7 /*
8  * Ex version 3 (see exact version in ex_cmds.c, search for /Version/)
9  *
10  * Mark Horton, UC Berkeley
11  * Bill Joy, UC Berkeley
12  * November 1979
13  *
14  * This file contains most of the declarations common to a large number
15  * of routines.  The file ex_vis.h contains declarations
16  * which are used only inside the screen editor.
17  * The file ex_tune.h contains parameters which can be diddled per installation.
18  *
19  * The declarations relating to the argument list, regular expressions,
20  * the temporary file data structure used by the editor
21  * and the data describing terminals are each fairly substantial and
22  * are kept in the files ex_{argv,re,temp,tty}.h which
23  * we #include separately.
24  *
25  * If you are going to dig into ex, you should look at the outline of the
26  * distribution of the code into files at the beginning of ex.c and ex_v.c.
27  * Code which is similar to that of ed is lightly or undocumented in spots
28  * (e.g. the regular expression code).  Newer code (e.g. open and visual)
29  * is much more carefully documented, and still rough in spots.
30  *
31  * Please forward bug reports to
32  *
33  *	Mark Horton
34  *	Computer Science Division, EECS
35  *	EVANS HALL
36  *	U.C. Berkeley 94704
37  *	(415) 642-4948
38  *	(415) 642-1024 (dept. office)
39  *
40  * or to csvax.mark@berkeley on the ARPA-net.  I would particularly like to hear
41  * of additional terminal descriptions you add to the termcap data base.
42  */
43 
44 #include <sys/types.h>
45 #include <ctype.h>
46 #include <errno.h>
47 #include <signal.h>
48 #include <setjmp.h>
49 #include <sys/stat.h>
50 
51 #ifndef var
52 #define var	extern
53 #endif
54 /*
55  *	The following little dance copes with the new USG tty handling.
56  *	This stuff has the advantage of considerable flexibility, and
57  *	the disadvantage of being incompatible with anything else.
58  *	The presence of the symbol USG3TTY will indicate the new code:
59  *	in this case, we define CBREAK (because we can simulate it exactly),
60  *	but we won't actually use it, so we set it to a value that will
61  *	probably blow the compilation if we goof up.
62  */
63 #ifdef USG3TTY
64 #include <termio.h>
65 #define CBREAK xxxxx
66 #else
67 #include <sgtty.h>
68 #endif
69 
70 extern	int errno;
71 
72 #ifndef VMUNIX
73 typedef	short	line;
74 #else
75 typedef	int	line;
76 #endif
77 typedef	short	bool;
78 
79 #include "ex_tune.h"
80 #include "ex_vars.h"
81 /*
82  * Options in the editor are referred to usually by "value(name)" where
83  * name is all uppercase, i.e. "value(PROMPT)".  This is actually a macro
84  * which expands to a fixed field in a static structure and so generates
85  * very little code.  The offsets for the option names in the structure
86  * are generated automagically from the structure initializing them in
87  * ex_data.c... see the shell script "makeoptions".
88  */
89 struct	option {
90 	char	*oname;
91 	char	*oabbrev;
92 	short	otype;		/* Types -- see below */
93 	short	odefault;	/* Default value */
94 	short	ovalue;		/* Current value */
95 	char	*osvalue;
96 };
97 
98 #define	ONOFF	0
99 #define	NUMERIC	1
100 #define	STRING	2		/* SHELL or DIRECTORY */
101 #define	OTERM	3
102 
103 #define	value(a)	options[a].ovalue
104 #define	svalue(a)	options[a].osvalue
105 
106 extern	 struct	option options[NOPTS + 1];
107 
108 
109 /*
110  * The editor does not normally use the standard i/o library.  Because
111  * we expect the editor to be a heavily used program and because it
112  * does a substantial amount of input/output processing it is appropriate
113  * for it to call low level read/write primitives directly.  In fact,
114  * when debugging the editor we use the standard i/o library.  In any
115  * case the editor needs a printf which prints through "putchar" ala the
116  * old version 6 printf.  Thus we normally steal a copy of the "printf.c"
117  * and "strout" code from the standard i/o library and mung it for our
118  * purposes to avoid dragging in the stdio library headers, etc if we
119  * are not debugging.  Such a modified printf exists in "printf.c" here.
120  */
121 #ifdef TRACE
122 #	include <stdio.h>
123 	var	FILE	*trace;
124 	var	bool	trubble;
125 	var	bool	techoin;
126 	var	char	tracbuf[BUFSIZ];
127 #	undef	putchar
128 #	undef	getchar
129 #else
130 # ifdef	VMUNIX
131 #	define	BUFSIZ	1024
132 # else
133 #  ifdef u370
134 #	define	BUFSIZ	4096
135 #  else
136 #	define	BUFSIZ	512
137 #  endif
138 # endif
139 #	define	NULL	0
140 #	define	EOF	-1
141 #endif
142 
143 /*
144  * Character constants and bits
145  *
146  * The editor uses the QUOTE bit as a flag to pass on with characters
147  * e.g. to the putchar routine.  The editor never uses a simple char variable.
148  * Only arrays of and pointers to characters are used and parameters and
149  * registers are never declared character.
150  */
151 #define	QUOTE	0200
152 #define	TRIM	0177
153 #define	CTRL(c)	('c' & 037)
154 #define	NL	CTRL(j)
155 #define	CR	CTRL(m)
156 #define	DELETE	0177		/* See also ATTN, QUIT in ex_tune.h */
157 #define	ESCAPE	033
158 
159 /*
160  * Miscellaneous random variables used in more than one place
161  */
162 var	bool	aiflag;		/* Append/change/insert with autoindent */
163 var	bool	anymarks;	/* We have used '[a-z] */
164 var	int	chng;		/* Warn "No write" */
165 var	char	*Command;
166 var	short	defwind;	/* -w# change default window size */
167 var	int	dirtcnt;	/* When >= MAXDIRT, should sync temporary */
168 #ifdef TIOCLGET
169 var	bool	dosusp;		/* Do SIGTSTP in visual when ^Z typed */
170 #endif
171 var	bool	edited;		/* Current file is [Edited] */
172 var	line	*endcore;	/* Last available core location */
173 extern	 bool	endline;	/* Last cmd mode command ended with \n */
174 #ifndef VMUNIX
175 var	short	erfile;		/* Error message file unit */
176 #endif
177 var	line	*fendcore;	/* First address in line pointer space */
178 var	char	file[FNSIZE];	/* Working file name */
179 var	char	genbuf[LBSIZE];	/* Working buffer when manipulating linebuf */
180 var	bool	hush;		/* Command line option - was given, hush up! */
181 var	char	*globp;		/* (Untyped) input string to command mode */
182 var	bool	holdcm;		/* Don't cursor address */
183 var	bool	inappend;	/* in ex command append mode */
184 var	bool	inglobal;	/* Inside g//... or v//... */
185 var	char	*initev;	/* Initial : escape for visual */
186 var	bool	inopen;		/* Inside open or visual */
187 var	char	*input;		/* Current position in cmd line input buffer */
188 var	bool	intty;		/* Input is a tty */
189 var	short	io;		/* General i/o unit (auto-closed on error!) */
190 extern	 short	lastc;		/* Last character ret'd from cmd input */
191 var	bool	laste;		/* Last command was an "e" (or "rec") */
192 var	char	lastmac;	/* Last macro called for ** */
193 var	char	lasttag[TAGSIZE];	/* Last argument to a tag command */
194 var	char	*linebp;	/* Used in substituting in \n */
195 var	char	linebuf[LBSIZE];	/* The primary line buffer */
196 var	bool	listf;		/* Command should run in list mode */
197 var	char	*loc1;		/* Where re began to match (in linebuf) */
198 var	char	*loc2;		/* First char after re match (") */
199 var	line	names['z'-'a'+2];	/* Mark registers a-z,' */
200 var	int	notecnt;	/* Count for notify (to visual from cmd) */
201 var	bool	numberf;	/* Command should run in number mode */
202 var	char	obuf[BUFSIZ];	/* Buffer for tty output */
203 var	short	oprompt;	/* Saved during source */
204 extern	short	ospeed;		/* Output speed (from gtty) */
205 var	int	otchng;		/* Backup tchng to find changes in macros */
206 var	short	peekc;		/* Peek ahead character (cmd mode input) */
207 var	char	*pkill[2];	/* Trim for put with ragged (LISP) delete */
208 var	bool	pfast;		/* Have stty -nl'ed to go faster */
209 var	int	pid;		/* Process id of child */
210 var	int	ppid;		/* Process id of parent (e.g. main ex proc) */
211 var	jmp_buf	resetlab;	/* For error throws to top level (cmd mode) */
212 var	int	rpid;		/* Pid returned from wait() */
213 var	bool	ruptible;	/* Interruptible is normal state */
214 var	bool	seenprompt;	/* 1 if have gotten user input */
215 var	bool	shudclob;	/* Have a prompt to clobber (e.g. on ^D) */
216 var	int	status;		/* Status returned from wait() */
217 var	int	tchng;		/* If nonzero, then [Modified] */
218 extern	short	tfile;		/* Temporary file unit */
219 var	bool	vcatch;		/* Want to catch an error (open/visual) */
220 var	jmp_buf	vreslab;	/* For error throws to a visual catch */
221 var	bool	writing;	/* 1 if in middle of a file write */
222 var	int	xchng;		/* Suppresses multiple "No writes" in !cmd */
223 
224 /*
225  * Macros
226  */
227 #define	CP(a, b)	(ignore(strcpy(a, b)))
228 			/*
229 			 * FIXUNDO: do we want to mung undo vars?
230 			 * Usually yes unless in a macro or global.
231 			 */
232 #define FIXUNDO		(inopen >= 0 && (inopen || !inglobal))
233 #define ckaw()		{if (chng && value(AUTOWRITE)) wop(0);}
234 #define	copy(a,b,c)	Copy((char *) a, (char *) b, c)
235 #define	eq(a, b)	((a) && (b) && strcmp(a, b) == 0)
236 #define	getexit(a)	copy(a, resetlab, sizeof (jmp_buf))
237 #define	lastchar()	lastc
238 #define	outchar(c)	(*Outchar)(c)
239 #define	pastwh()	(ignore(skipwh()))
240 #define	pline(no)	(*Pline)(no)
241 #define	reset()		longjmp(resetlab,1)
242 #define	resexit(a)	copy(resetlab, a, sizeof (jmp_buf))
243 #define	setexit()	setjmp(resetlab)
244 #define	setlastchar(c)	lastc = c
245 #define	ungetchar(c)	peekc = c
246 
247 #define	CATCH		vcatch = 1; if (setjmp(vreslab) == 0) {
248 #define	ONERR		} else { vcatch = 0;
249 #define	ENDCATCH	} vcatch = 0;
250 
251 /*
252  * Environment like memory
253  */
254 var	char	altfile[FNSIZE];	/* Alternate file name */
255 extern	 char	direct[ONMSZ];		/* Temp file goes here */
256 extern	 char	shell[ONMSZ];		/* Copied to be settable */
257 extern	 char	ttytype[ONMSZ];		/* A long and pretty name */
258 var	char	uxb[UXBSIZE + 2];	/* Last !command for !! */
259 
260 /*
261  * The editor data structure for accessing the current file consists
262  * of an incore array of pointers into the temporary file tfile.
263  * Each pointer is 15 bits (the low bit is used by global) and is
264  * padded with zeroes to make an index into the temp file where the
265  * actual text of the line is stored.
266  *
267  * To effect undo, copies of affected lines are saved after the last
268  * line considered to be in the buffer, between dol and unddol.
269  * During an open or visual, which uses the command mode undo between
270  * dol and unddol, a copy of the entire, pre-command buffer state
271  * is saved between unddol and truedol.
272  */
273 var	line	*addr1;			/* First addressed line in a command */
274 var	line	*addr2;			/* Second addressed line */
275 var	line	*dol;			/* Last line in buffer */
276 var	line	*dot;			/* Current line */
277 var	line	*one;			/* First line */
278 var	line	*truedol;		/* End of all lines, including saves */
279 var	line	*unddol;		/* End of undo saved lines */
280 var	line	*zero;			/* Points to empty slot before one */
281 
282 /*
283  * Undo information
284  *
285  * For most commands we save lines changed by salting them away between
286  * dol and unddol before they are changed (i.e. we save the descriptors
287  * into the temp file tfile which is never garbage collected).  The
288  * lines put here go back after unddel, and to complete the undo
289  * we delete the lines [undap1,undap2).
290  *
291  * Undoing a move is much easier and we treat this as a special case.
292  * Similarly undoing a "put" is a special case for although there
293  * are lines saved between dol and unddol we don't stick these back
294  * into the buffer.
295  */
296 var	short	undkind;
297 
298 var	line	*unddel;	/* Saved deleted lines go after here */
299 var	line	*undap1;	/* Beginning of new lines */
300 var	line	*undap2;	/* New lines end before undap2 */
301 var	line	*undadot;	/* If we saved all lines, dot reverts here */
302 
303 #define	UNDCHANGE	0
304 #define	UNDMOVE		1
305 #define	UNDALL		2
306 #define	UNDNONE		3
307 #define	UNDPUT		4
308 
309 #ifdef CRYPT
310 /*
311  * Various miscellaneous flags and buffers needed by the encryption routines.
312  */
313 #define	KSIZE   9       /* key size for encryption */
314 #define	KEYPROMPT       "Key: "
315 var	int	xflag;		/* True if we are in encryption mode */
316 var	int	xtflag;		/* True if the temp file is being encrypted */
317 var	int	kflag;		/* True if the key has been accepted */
318 var	char	perm[768];
319 var	char	tperm[768];
320 var	char	*key;
321 var	char	crbuf[CRSIZE];
322 char	*getpass();
323 #endif
324 
325 /*
326  * Function type definitions
327  */
328 #define	NOSTR	(char *) 0
329 #define	NOLINE	(line *) 0
330 
331 extern	int	(*Outchar)();
332 extern	int	(*Pline)();
333 extern	int	(*Putchar)();
334 var	int	(*oldhup)();
335 int	(*setlist())();
336 int	(*setnorm())();
337 int	(*setnorm())();
338 int	(*setnumb())();
339 line	*address();
340 char	*cgoto();
341 char	*genindent();
342 char	*getblock();
343 char	*getenv();
344 line	*getmark();
345 char	*longname();
346 char	*mesg();
347 char	*place();
348 char	*plural();
349 line	*scanfor();
350 line	*setin();
351 char	*strcat();
352 char	*strcpy();
353 char	*strend();
354 char	*tailpath();
355 char	*tgetstr();
356 char	*tgoto();
357 char	*ttyname();
358 line	*vback();
359 char	*vfindcol();
360 char	*vgetline();
361 char	*vinit();
362 char	*vpastwh();
363 char	*vskipwh();
364 int	put();
365 int	putreg();
366 int	YANKreg();
367 int	delete();
368 int	execl();
369 int	filter();
370 int	getfile();
371 int	getsub();
372 int	gettty();
373 int	join();
374 int	listchar();
375 off_t	lseek();
376 int	normchar();
377 int	normline();
378 int	numbline();
379 var	int	(*oldquit)();
380 int	onhup();
381 int	onintr();
382 int	onsusp();
383 int	putch();
384 int	shift();
385 int	termchar();
386 int	vfilter();
387 #ifdef CBREAK
388 int	vintr();
389 #endif
390 int	vputch();
391 int	vshftop();
392 int	yank();
393 
394 /*
395  * C doesn't have a (void) cast, so we have to fake it for lint's sake.
396  */
397 #ifdef lint
398 #	define	ignore(a)	Ignore((char *) (a))
399 #	define	ignorf(a)	Ignorf((int (*) ()) (a))
400 #else
401 #	define	ignore(a)	a
402 #	define	ignorf(a)	a
403 #endif
404