xref: /openbsd/usr.bin/vi/ex/ex.h (revision 721c3ea3)
1 /*	$OpenBSD: ex.h,v 1.11 2016/05/27 09:18:12 martijn Exp $	*/
2 
3 /*-
4  * Copyright (c) 1992, 1993, 1994
5  *	The Regents of the University of California.  All rights reserved.
6  * Copyright (c) 1992, 1993, 1994, 1995, 1996
7  *	Keith Bostic.  All rights reserved.
8  *
9  * See the LICENSE file for redistribution information.
10  *
11  *	@(#)ex.h	10.24 (Berkeley) 8/12/96
12  */
13 
14 #define	PROMPTCHAR	':'		/* Prompt using a colon. */
15 
16 typedef struct _excmdlist {		/* Ex command table structure. */
17 	char *name;			/* Command name, underlying function. */
18 	int (*fn)(SCR *, EXCMD *);
19 
20 #define	E_ADDR1		0x00000001	/* One address. */
21 #define	E_ADDR2		0x00000002	/* Two addresses. */
22 #define	E_ADDR2_ALL	0x00000004	/* Zero/two addresses; zero == all. */
23 #define	E_ADDR2_NONE	0x00000008	/* Zero/two addresses; zero == none. */
24 #define	E_ADDR_ZERO	0x00000010	/* 0 is a legal addr1. */
25 #define	E_ADDR_ZERODEF	0x00000020	/* 0 is default addr1 of empty files. */
26 #define	E_AUTOPRINT	0x00000040	/* Command always sets autoprint. */
27 #define	E_CLRFLAG	0x00000080	/* Clear the print (#, l, p) flags. */
28 #define	E_NEWSCREEN	0x00000100	/* Create a new screen. */
29 #define	E_SECURE	0x00000200	/* Permission denied if O_SECURE set. */
30 #define	E_VIONLY	0x00000400	/* Meaningful only in vi. */
31 #define	__INUSE1	0xfffff800	/* Same name space as EX_PRIVATE. */
32 	u_int16_t flags;
33 
34 	char *syntax;			/* Syntax script. */
35 	char *usage;			/* Usage line. */
36 	char *help;			/* Help line. */
37 } EXCMDLIST;
38 
39 #define	MAXCMDNAMELEN	12		/* Longest command name. */
40 extern EXCMDLIST const cmds[];		/* Table of ex commands. */
41 
42 /*
43  * !!!
44  * QUOTING NOTE:
45  *
46  * Historically, .exrc files and EXINIT variables could only use ^V as an
47  * escape character, neither ^Q or a user specified character worked.  We
48  * enforce that here, just in case someone depends on it.
49  */
50 #define	IS_ESCAPE(sp, cmdp, ch)						\
51 	(F_ISSET((cmdp), E_VLITONLY) ?					\
52 	    (ch) == CH_LITERAL : KEY_VAL((sp), (ch)) == K_VLNEXT)
53 
54 /*
55  * File state must be checked for each command -- any ex command may be entered
56  * at any time, and most of them won't work well if a file hasn't yet been read
57  * in.  Historic vi generally took the easy way out and dropped core.
58  */
59 #define	NEEDFILE(sp, cmdp) {						\
60 	if ((sp)->ep == NULL) {						\
61 		ex_emsg((sp), (cmdp)->cmd->name, EXM_NOFILEYET);	\
62 		return (1);						\
63 	}								\
64 }
65 
66 /* Range structures for global and @ commands. */
67 typedef struct _range RANGE;
68 struct _range {				/* Global command range. */
69 	TAILQ_ENTRY(_range) q;	/* Linked list of ranges. */
70 	recno_t start, stop;		/* Start/stop of the range. */
71 };
72 
73 /* Ex command structure. */
74 struct _excmd {
75 	LIST_ENTRY(_excmd) q;		/* Linked list of commands. */
76 
77 	char	 *if_name;		/* Associated file. */
78 	recno_t	  if_lno;		/* Associated line number. */
79 
80 	/* Clear the structure for the ex parser. */
81 #define	CLEAR_EX_PARSER(cmdp)						\
82 	memset(&((cmdp)->cp), 0, ((char *)&(cmdp)->flags -		\
83 	    (char *)&((cmdp)->cp)) + sizeof((cmdp)->flags))
84 
85 	char	 *cp;			/* Current command text. */
86 	size_t	  clen;			/* Current command length. */
87 
88 	char	 *save_cmd;		/* Remaining command. */
89 	size_t	  save_cmdlen;		/* Remaining command length. */
90 
91 	EXCMDLIST const *cmd;		/* Command: entry in command table. */
92 	EXCMDLIST rcmd;			/* Command: table entry/replacement. */
93 
94 	TAILQ_HEAD(_rh, _range) rq;	/* @/global range: linked list. */
95 	recno_t   range_lno;		/* @/global range: set line number. */
96 	char	 *o_cp;			/* Original @/global command. */
97 	size_t	  o_clen;		/* Original @/global command length. */
98 #define	AGV_AT		0x01		/* @ buffer execution. */
99 #define	AGV_AT_NORANGE	0x02		/* @ buffer execution without range. */
100 #define	AGV_GLOBAL	0x04		/* global command. */
101 #define	AGV_V		0x08		/* v command. */
102 #define	AGV_ALL		(AGV_AT | AGV_AT_NORANGE | AGV_GLOBAL | AGV_V)
103 	u_int8_t  agv_flags;
104 
105 	/* Clear the structure before each ex command. */
106 #define	CLEAR_EX_CMD(cmdp) {						\
107 	u_int32_t L__f = F_ISSET((cmdp), E_PRESERVE);			\
108 	memset(&((cmdp)->buffer), 0, ((char *)&(cmdp)->flags -		\
109 	    (char *)&((cmdp)->buffer)) + sizeof((cmdp)->flags));	\
110 	F_SET((cmdp), L__f);						\
111 }
112 
113 	CHAR_T	  buffer;		/* Command: named buffer. */
114 	recno_t	  lineno;		/* Command: line number. */
115 	long	  count;		/* Command: signed count. */
116 	long	  flagoff;		/* Command: signed flag offset. */
117 	int	  addrcnt;		/* Command: addresses (0, 1 or 2). */
118 	MARK	  addr1;		/* Command: 1st address. */
119 	MARK	  addr2;		/* Command: 2nd address. */
120 	ARGS	**argv;			/* Command: array of arguments. */
121 	int	  argc;			/* Command: count of arguments. */
122 
123 #define	E_C_BUFFER	0x00001		/* Buffer name specified. */
124 #define	E_C_CARAT	0x00002		/*  ^ flag. */
125 #define	E_C_COUNT	0x00004		/* Count specified. */
126 #define	E_C_COUNT_NEG	0x00008		/* Count was signed negative. */
127 #define	E_C_COUNT_POS	0x00010		/* Count was signed positive. */
128 #define	E_C_DASH	0x00020		/*  - flag. */
129 #define	E_C_DOT		0x00040		/*  . flag. */
130 #define	E_C_EQUAL	0x00080		/*  = flag. */
131 #define	E_C_FORCE	0x00100		/*  ! flag. */
132 #define	E_C_HASH	0x00200		/*  # flag. */
133 #define	E_C_LIST	0x00400		/*  l flag. */
134 #define	E_C_PLUS	0x00800		/*  + flag. */
135 #define	E_C_PRINT	0x01000		/*  p flag. */
136 	u_int16_t iflags;		/* User input information. */
137 
138 #define	__INUSE2	0x000004ff	/* Same name space as EXCMDLIST. */
139 #define	E_BLIGNORE	0x00000800	/* Ignore blank lines. */
140 #define	E_NAMEDISCARD	0x00001000	/* Free/discard the name. */
141 #define	E_NOAUTO	0x00002000	/* Don't do autoprint output. */
142 #define	E_NOPRDEF	0x00004000	/* Don't print as default. */
143 #define	E_NRSEP		0x00008000	/* Need to line adjust ex output. */
144 #define	E_OPTNUM	0x00010000	/* Number edit option affected. */
145 #define	E_VLITONLY	0x00020000	/* Use ^V quoting only. */
146 #define	E_PRESERVE	0x0003f800	/* Bits to preserve across commands. */
147 
148 #define	E_ABSMARK	0x00040000	/* Set the absolute mark. */
149 #define	E_ADDR_DEF	0x00080000	/* Default addresses used. */
150 #define	E_DELTA		0x00100000	/* Search address with delta. */
151 #define	E_MODIFY	0x00200000	/* File name expansion modified arg. */
152 #define	E_MOVETOEND	0x00400000	/* Move to the end of the file first. */
153 #define	E_NEWLINE	0x00800000	/* Found ending <newline>. */
154 #define	E_SEARCH_WMSG	0x01000000	/* Display search-wrapped message. */
155 #define	E_USELASTCMD	0x02000000	/* Use the last command. */
156 #define	E_VISEARCH	0x04000000	/* It's really a vi search command. */
157 	u_int32_t flags;		/* Current flags. */
158 };
159 
160 /* Ex private, per-screen memory. */
161 typedef struct _ex_private {
162 	TAILQ_HEAD(_tqh, _tagq) tq;	/* Tag queue. */
163 	TAILQ_HEAD(_tagfh, _tagf) tagfq;/* Tag file list. */
164 	char	*tag_last;		/* Saved last tag string. */
165 
166 	CHAR_T	*lastbcomm;		/* Last bang command. */
167 
168 	ARGS   **args;			/* Command: argument list. */
169 	int	 argscnt;		/* Command: argument list count. */
170 	int	 argsoff;		/* Command: offset into arguments. */
171 
172 	u_int32_t fdef;			/* Saved E_C_* default command flags. */
173 
174 	char	*ibp;			/* File line input buffer. */
175 	size_t	 ibp_len;		/* File line input buffer length. */
176 
177 	/*
178 	 * Buffers for the ex output.  The screen/vi support doesn't do any
179 	 * character buffering of any kind.  We do it here so that we're not
180 	 * calling the screen output routines on every character.
181 	 *
182 	 * XXX
183 	 * Change to grow dynamically.
184 	 */
185 	char	 obp[1024];		/* Ex output buffer. */
186 	size_t	 obp_len;		/* Ex output buffer length. */
187 
188 	u_int8_t flags;
189 } EX_PRIVATE;
190 #define	EXP(sp)	((EX_PRIVATE *)((sp)->ex_private))
191 
192 /*
193  * Filter actions:
194  *
195  *	FILTER_BANG	!:	filter text through the utility.
196  *	FILTER_RBANG	!:	read from the utility (without stdin).
197  *	FILTER_READ	read:	read from the utility (with stdin).
198  *	FILTER_WRITE	write:	write to the utility, display its output.
199  */
200 enum filtertype { FILTER_BANG, FILTER_RBANG, FILTER_READ, FILTER_WRITE };
201 
202 /* Ex common error messages. */
203 typedef enum {
204 	EXM_EMPTYBUF,			/* Empty buffer. */
205 	EXM_FILECOUNT,			/* Too many file names. */
206 	EXM_NOCANON,			/* No terminal interface. */
207 	EXM_NOCANON_F,			/* EXM_NOCANO: filter version. */
208 	EXM_NOFILEYET,			/* Illegal until a file read in. */
209 	EXM_NOPREVBUF,			/* No previous buffer specified. */
210 	EXM_NOPREVRE,			/* No previous RE specified. */
211 	EXM_NOSUSPEND,			/* No suspension. */
212 	EXM_SECURE,			/* Illegal if secure edit option set. */
213 	EXM_SECURE_F,			/* EXM_SECURE: filter version */
214 	EXM_USAGE			/* Standard usage message. */
215 } exm_t;
216 
217 /* Ex address error types. */
218 enum badaddr { A_COMBO, A_EMPTY, A_EOF, A_NOTSET, A_ZERO };
219 
220 /* Ex common tag error messages. */
221 typedef enum {
222 	TAG_BADLNO,		/* Tag line doesn't exist. */
223 	TAG_EMPTY,		/* Tags stack is empty. */
224 	TAG_SEARCH		/* Tags search pattern wasn't found. */
225 } tagmsg_t;
226 
227 #include "ex_def.h"
228 #include "ex_extern.h"
229