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