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