119304Speter/*- 219304Speter * Copyright (c) 1992, 1993, 1994 319304Speter * The Regents of the University of California. All rights reserved. 419304Speter * Copyright (c) 1992, 1993, 1994, 1995, 1996 519304Speter * Keith Bostic. All rights reserved. 619304Speter * 719304Speter * See the LICENSE file for redistribution information. 819304Speter * 9254225Speter * $Id: ex.h,v 10.31 2012/10/03 02:33:24 zy Exp $ 1019304Speter */ 1119304Speter 1219304Speter#define PROMPTCHAR ':' /* Prompt using a colon. */ 1319304Speter 1419304Spetertypedef struct _excmdlist { /* Ex command table structure. */ 15254225Speter CHAR_T *name; /* Command name, underlying function. */ 16281373Sbapt int (*fn)(SCR *, EXCMD *); 1719304Speter 1819304Speter#define E_ADDR1 0x00000001 /* One address. */ 1919304Speter#define E_ADDR2 0x00000002 /* Two addresses. */ 2019304Speter#define E_ADDR2_ALL 0x00000004 /* Zero/two addresses; zero == all. */ 2119304Speter#define E_ADDR2_NONE 0x00000008 /* Zero/two addresses; zero == none. */ 2219304Speter#define E_ADDR_ZERO 0x00000010 /* 0 is a legal addr1. */ 2319304Speter#define E_ADDR_ZERODEF 0x00000020 /* 0 is default addr1 of empty files. */ 2419304Speter#define E_AUTOPRINT 0x00000040 /* Command always sets autoprint. */ 2519304Speter#define E_CLRFLAG 0x00000080 /* Clear the print (#, l, p) flags. */ 2619304Speter#define E_NEWSCREEN 0x00000100 /* Create a new screen. */ 2719304Speter#define E_SECURE 0x00000200 /* Permission denied if O_SECURE set. */ 2819304Speter#define E_VIONLY 0x00000400 /* Meaningful only in vi. */ 2919304Speter#define __INUSE1 0xfffff800 /* Same name space as EX_PRIVATE. */ 3019304Speter u_int16_t flags; 3119304Speter 3219304Speter char *syntax; /* Syntax script. */ 3319304Speter char *usage; /* Usage line. */ 3419304Speter char *help; /* Help line. */ 3519304Speter} EXCMDLIST; 3619304Speter 3719304Speter#define MAXCMDNAMELEN 12 /* Longest command name. */ 3819304Speterextern EXCMDLIST const cmds[]; /* Table of ex commands. */ 3919304Speter 4019304Speter/* 4119304Speter * !!! 4219304Speter * QUOTING NOTE: 4319304Speter * 4419304Speter * Historically, .exrc files and EXINIT variables could only use ^V as an 4519304Speter * escape character, neither ^Q or a user specified character worked. We 4619304Speter * enforce that here, just in case someone depends on it. 4719304Speter */ 4819304Speter#define IS_ESCAPE(sp, cmdp, ch) \ 4919304Speter (F_ISSET(cmdp, E_VLITONLY) ? \ 5019304Speter (ch) == CH_LITERAL : KEY_VAL(sp, ch) == K_VLNEXT) 5119304Speter 52254225Speter#define IS_SHELLMETA(sp, ch) \ 53254225Speter ((ch) <= CHAR_MAX && strchr(O_STR(sp, O_SHELLMETA), ch) != NULL) 54254225Speter 5519304Speter/* 5619304Speter * File state must be checked for each command -- any ex command may be entered 5719304Speter * at any time, and most of them won't work well if a file hasn't yet been read 5819304Speter * in. Historic vi generally took the easy way out and dropped core. 5919304Speter */ 6019304Speter#define NEEDFILE(sp, cmdp) { \ 6119304Speter if ((sp)->ep == NULL) { \ 62254225Speter ex_wemsg(sp, (cmdp)->cmd->name, EXM_NOFILEYET); \ 6319304Speter return (1); \ 6419304Speter } \ 6519304Speter} 6619304Speter 6719304Speter/* Range structures for global and @ commands. */ 6819304Spetertypedef struct _range RANGE; 6919304Speterstruct _range { /* Global command range. */ 70254225Speter TAILQ_ENTRY(_range) q; /* Linked list of ranges. */ 7119304Speter recno_t start, stop; /* Start/stop of the range. */ 7219304Speter}; 7319304Speter 7419304Speter/* Ex command structure. */ 7519304Speterstruct _excmd { 76254225Speter SLIST_ENTRY(_excmd) q; /* Linked list of commands. */ 7719304Speter 7819304Speter char *if_name; /* Associated file. */ 7919304Speter recno_t if_lno; /* Associated line number. */ 8019304Speter 8119304Speter /* Clear the structure for the ex parser. */ 8219304Speter#define CLEAR_EX_PARSER(cmdp) \ 8319304Speter memset(&((cmdp)->cp), 0, ((char *)&(cmdp)->flags - \ 8419304Speter (char *)&((cmdp)->cp)) + sizeof((cmdp)->flags)) 8519304Speter 86254225Speter CHAR_T *cp; /* Current command text. */ 8719304Speter size_t clen; /* Current command length. */ 8819304Speter 89254225Speter CHAR_T *save_cmd; /* Remaining command. */ 9019304Speter size_t save_cmdlen; /* Remaining command length. */ 9119304Speter 9219304Speter EXCMDLIST const *cmd; /* Command: entry in command table. */ 9319304Speter EXCMDLIST rcmd; /* Command: table entry/replacement. */ 9419304Speter 95254225Speter TAILQ_HEAD(_rh, _range) rq[1]; /* @/global range: linked list. */ 9619304Speter recno_t range_lno; /* @/global range: set line number. */ 97254225Speter CHAR_T *o_cp; /* Original @/global command. */ 9819304Speter size_t o_clen; /* Original @/global command length. */ 9919304Speter#define AGV_AT 0x01 /* @ buffer execution. */ 10019304Speter#define AGV_AT_NORANGE 0x02 /* @ buffer execution without range. */ 10119304Speter#define AGV_GLOBAL 0x04 /* global command. */ 10219304Speter#define AGV_V 0x08 /* v command. */ 10319304Speter#define AGV_ALL (AGV_AT | AGV_AT_NORANGE | AGV_GLOBAL | AGV_V) 10419304Speter u_int8_t agv_flags; 10519304Speter 10619304Speter /* Clear the structure before each ex command. */ 10719304Speter#define CLEAR_EX_CMD(cmdp) { \ 10819304Speter u_int32_t L__f = F_ISSET(cmdp, E_PRESERVE); \ 10919304Speter memset(&((cmdp)->buffer), 0, ((char *)&(cmdp)->flags - \ 11019304Speter (char *)&((cmdp)->buffer)) + sizeof((cmdp)->flags)); \ 11119304Speter F_SET(cmdp, L__f); \ 11219304Speter} 11319304Speter 11419304Speter CHAR_T buffer; /* Command: named buffer. */ 11519304Speter recno_t lineno; /* Command: line number. */ 11619304Speter long count; /* Command: signed count. */ 11719304Speter long flagoff; /* Command: signed flag offset. */ 11819304Speter int addrcnt; /* Command: addresses (0, 1 or 2). */ 11919304Speter MARK addr1; /* Command: 1st address. */ 12019304Speter MARK addr2; /* Command: 2nd address. */ 12119304Speter ARGS **argv; /* Command: array of arguments. */ 12219304Speter int argc; /* Command: count of arguments. */ 12319304Speter 12419304Speter#define E_C_BUFFER 0x00001 /* Buffer name specified. */ 12519304Speter#define E_C_CARAT 0x00002 /* ^ flag. */ 12619304Speter#define E_C_COUNT 0x00004 /* Count specified. */ 12719304Speter#define E_C_COUNT_NEG 0x00008 /* Count was signed negative. */ 12819304Speter#define E_C_COUNT_POS 0x00010 /* Count was signed positive. */ 12919304Speter#define E_C_DASH 0x00020 /* - flag. */ 13019304Speter#define E_C_DOT 0x00040 /* . flag. */ 13119304Speter#define E_C_EQUAL 0x00080 /* = flag. */ 13219304Speter#define E_C_FORCE 0x00100 /* ! flag. */ 13319304Speter#define E_C_HASH 0x00200 /* # flag. */ 13419304Speter#define E_C_LIST 0x00400 /* l flag. */ 13519304Speter#define E_C_PLUS 0x00800 /* + flag. */ 13619304Speter#define E_C_PRINT 0x01000 /* p flag. */ 13719304Speter u_int16_t iflags; /* User input information. */ 13819304Speter 139254225Speter#define __INUSE2 0x000007ff /* Same name space as EXCMDLIST. */ 14019304Speter#define E_BLIGNORE 0x00000800 /* Ignore blank lines. */ 14119304Speter#define E_NAMEDISCARD 0x00001000 /* Free/discard the name. */ 14219304Speter#define E_NOAUTO 0x00002000 /* Don't do autoprint output. */ 14319304Speter#define E_NOPRDEF 0x00004000 /* Don't print as default. */ 14419304Speter#define E_NRSEP 0x00008000 /* Need to line adjust ex output. */ 14519304Speter#define E_OPTNUM 0x00010000 /* Number edit option affected. */ 14619304Speter#define E_VLITONLY 0x00020000 /* Use ^V quoting only. */ 14719304Speter#define E_PRESERVE 0x0003f800 /* Bits to preserve across commands. */ 14819304Speter 14919304Speter#define E_ABSMARK 0x00040000 /* Set the absolute mark. */ 15019304Speter#define E_ADDR_DEF 0x00080000 /* Default addresses used. */ 15119304Speter#define E_DELTA 0x00100000 /* Search address with delta. */ 15219304Speter#define E_MODIFY 0x00200000 /* File name expansion modified arg. */ 15319304Speter#define E_MOVETOEND 0x00400000 /* Move to the end of the file first. */ 15419304Speter#define E_NEWLINE 0x00800000 /* Found ending <newline>. */ 15519304Speter#define E_SEARCH_WMSG 0x01000000 /* Display search-wrapped message. */ 15619304Speter#define E_USELASTCMD 0x02000000 /* Use the last command. */ 15719304Speter#define E_VISEARCH 0x04000000 /* It's really a vi search command. */ 15819304Speter u_int32_t flags; /* Current flags. */ 15919304Speter}; 16019304Speter 16119304Speter/* Ex private, per-screen memory. */ 16219304Spetertypedef struct _ex_private { 163254225Speter /* Tag file list. */ 164254225Speter TAILQ_HEAD(_tagfh, _tagf) tagfq[1]; 165254225Speter TAILQ_HEAD(_tqh, _tagq) tq[1]; /* Tag queue. */ 166254225Speter SLIST_HEAD(_csch, _csc) cscq[1];/* Cscope connection list. */ 167254225Speter CHAR_T *tag_last; /* Saved last tag string. */ 16819304Speter 16919304Speter CHAR_T *lastbcomm; /* Last bang command. */ 17019304Speter 17119304Speter ARGS **args; /* Command: argument list. */ 17219304Speter int argscnt; /* Command: argument list count. */ 17319304Speter int argsoff; /* Command: offset into arguments. */ 17419304Speter 17519304Speter u_int32_t fdef; /* Saved E_C_* default command flags. */ 17619304Speter 17719304Speter char *ibp; /* File line input buffer. */ 17819304Speter size_t ibp_len; /* File line input buffer length. */ 179254225Speter CONVWIN ibcw; /* File line input conversion buffer. */ 18019304Speter 18119304Speter /* 18219304Speter * Buffers for the ex output. The screen/vi support doesn't do any 18319304Speter * character buffering of any kind. We do it here so that we're not 18419304Speter * calling the screen output routines on every character. 18519304Speter * 18619304Speter * XXX 18719304Speter * Change to grow dynamically. 18819304Speter */ 18919304Speter char obp[1024]; /* Ex output buffer. */ 19019304Speter size_t obp_len; /* Ex output buffer length. */ 19119304Speter 19219304Speter#define EXP_CSCINIT 0x01 /* Cscope initialized. */ 19319304Speter u_int8_t flags; 19419304Speter} EX_PRIVATE; 19519304Speter#define EXP(sp) ((EX_PRIVATE *)((sp)->ex_private)) 19619304Speter 19719304Speter/* 19819304Speter * Filter actions: 19919304Speter * 20019304Speter * FILTER_BANG !: filter text through the utility. 20119304Speter * FILTER_RBANG !: read from the utility (without stdin). 20219304Speter * FILTER_READ read: read from the utility (with stdin). 20319304Speter * FILTER_WRITE write: write to the utility, display its output. 20419304Speter */ 20519304Speterenum filtertype { FILTER_BANG, FILTER_RBANG, FILTER_READ, FILTER_WRITE }; 20619304Speter 20719304Speter/* Ex common error messages. */ 20819304Spetertypedef enum { 20919304Speter EXM_EMPTYBUF, /* Empty buffer. */ 21019304Speter EXM_FILECOUNT, /* Too many file names. */ 21119304Speter EXM_NOCANON, /* No terminal interface. */ 21219304Speter EXM_NOCANON_F, /* EXM_NOCANO: filter version. */ 21319304Speter EXM_NOFILEYET, /* Illegal until a file read in. */ 21419304Speter EXM_NOPREVBUF, /* No previous buffer specified. */ 21519304Speter EXM_NOPREVRE, /* No previous RE specified. */ 21619304Speter EXM_NOSUSPEND, /* No suspension. */ 21719304Speter EXM_SECURE, /* Illegal if secure edit option set. */ 21819304Speter EXM_SECURE_F, /* EXM_SECURE: filter version */ 21919304Speter EXM_USAGE /* Standard usage message. */ 22019304Speter} exm_t; 22119304Speter 22219304Speter/* Ex address error types. */ 22319304Speterenum badaddr { A_COMBO, A_EMPTY, A_EOF, A_NOTSET, A_ZERO }; 22419304Speter 225281373Sbapt/* Ex common tag error messages. */ 22619304Spetertypedef enum { 22719304Speter TAG_BADLNO, /* Tag line doesn't exist. */ 22819304Speter TAG_EMPTY, /* Tags stack is empty. */ 22919304Speter TAG_SEARCH /* Tags search pattern wasn't found. */ 23019304Speter} tagmsg_t; 23119304Speter 23219304Speter#include "ex_def.h" 233254225Speter#include "extern.h" 234