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 16typedef 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. */ 40extern 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. */ 67typedef struct _range RANGE; 68struct _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. */ 74struct _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. */ 161typedef 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 */ 200enum filtertype { FILTER_BANG, FILTER_RBANG, FILTER_READ, FILTER_WRITE }; 201 202/* Ex common error messages. */ 203typedef 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. */ 218enum badaddr { A_COMBO, A_EMPTY, A_EOF, A_NOTSET, A_ZERO }; 219 220/* Ex common tag error messages. */ 221typedef 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