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