xref: /plan9/sys/src/cmd/acme/edit.h (revision af2e6ba6a88ebbe37fe767755ab16d53fbb9977b)
159cc4ca5SDavid du Colombier #pragma	varargck	argpos	editerror	1
259cc4ca5SDavid du Colombier 
359cc4ca5SDavid du Colombier typedef struct Addr	Addr;
459cc4ca5SDavid du Colombier typedef struct Address	Address;
559cc4ca5SDavid du Colombier typedef struct Cmd	Cmd;
659cc4ca5SDavid du Colombier typedef struct List	List;
759cc4ca5SDavid du Colombier typedef struct String	String;
859cc4ca5SDavid du Colombier 
959cc4ca5SDavid du Colombier struct String
1059cc4ca5SDavid du Colombier {
1159cc4ca5SDavid du Colombier 	int	n;		/* excludes NUL */
1259cc4ca5SDavid du Colombier 	Rune	*r;		/* includes NUL */
1359cc4ca5SDavid du Colombier 	int	nalloc;
1459cc4ca5SDavid du Colombier };
1559cc4ca5SDavid du Colombier 
1659cc4ca5SDavid du Colombier struct Addr
1759cc4ca5SDavid du Colombier {
1859cc4ca5SDavid du Colombier 	char	type;	/* # (char addr), l (line addr), / ? . $ + - , ; */
1959cc4ca5SDavid du Colombier 	union{
2059cc4ca5SDavid du Colombier 		String	*re;
2159cc4ca5SDavid du Colombier 		Addr	*left;		/* left side of , and ; */
2259cc4ca5SDavid du Colombier 	};
2359cc4ca5SDavid du Colombier 	ulong	num;
2459cc4ca5SDavid du Colombier 	Addr	*next;			/* or right side of , and ; */
2559cc4ca5SDavid du Colombier };
2659cc4ca5SDavid du Colombier 
2759cc4ca5SDavid du Colombier struct Address
2859cc4ca5SDavid du Colombier {
2959cc4ca5SDavid du Colombier 	Range	r;
3059cc4ca5SDavid du Colombier 	File	*f;
3159cc4ca5SDavid du Colombier };
3259cc4ca5SDavid du Colombier 
3359cc4ca5SDavid du Colombier struct Cmd
3459cc4ca5SDavid du Colombier {
3559cc4ca5SDavid du Colombier 	Addr	*addr;			/* address (range of text) */
3659cc4ca5SDavid du Colombier 	String	*re;			/* regular expression for e.g. 'x' */
3759cc4ca5SDavid du Colombier 	union{
3859cc4ca5SDavid du Colombier 		Cmd	*cmd;		/* target of x, g, {, etc. */
3959cc4ca5SDavid du Colombier 		String	*text;		/* text of a, c, i; rhs of s */
4059cc4ca5SDavid du Colombier 		Addr	*mtaddr;		/* address for m, t */
4159cc4ca5SDavid du Colombier 	};
4259cc4ca5SDavid du Colombier 	Cmd	*next;			/* pointer to next element in {} */
4359cc4ca5SDavid du Colombier 	short	num;
4459cc4ca5SDavid du Colombier 	ushort	flag;			/* whatever */
4559cc4ca5SDavid du Colombier 	ushort	cmdc;			/* command character; 'x' etc. */
4659cc4ca5SDavid du Colombier };
4759cc4ca5SDavid du Colombier 
4859cc4ca5SDavid du Colombier extern struct cmdtab{
4959cc4ca5SDavid du Colombier 	ushort	cmdc;		/* command character */
5059cc4ca5SDavid du Colombier 	uchar	text;		/* takes a textual argument? */
5159cc4ca5SDavid du Colombier 	uchar	regexp;		/* takes a regular expression? */
5259cc4ca5SDavid du Colombier 	uchar	addr;		/* takes an address (m or t)? */
5359cc4ca5SDavid du Colombier 	uchar	defcmd;		/* default command; 0==>none */
5459cc4ca5SDavid du Colombier 	uchar	defaddr;	/* default address */
5559cc4ca5SDavid du Colombier 	uchar	count;		/* takes a count e.g. s2/// */
5659cc4ca5SDavid du Colombier 	char	*token;		/* takes text terminated by one of these */
5759cc4ca5SDavid du Colombier 	int	(*fn)(Text*, Cmd*);	/* function to call with parse tree */
5859cc4ca5SDavid du Colombier }cmdtab[];
5959cc4ca5SDavid du Colombier 
6059cc4ca5SDavid du Colombier #define	INCR	25	/* delta when growing list */
6159cc4ca5SDavid du Colombier 
62*af2e6ba6SDavid du Colombier struct List
6359cc4ca5SDavid du Colombier {
6459cc4ca5SDavid du Colombier 	int	nalloc;
6559cc4ca5SDavid du Colombier 	int	nused;
6659cc4ca5SDavid du Colombier 	union{
6759cc4ca5SDavid du Colombier 		void	*listptr;
68*af2e6ba6SDavid du Colombier 		void*	*ptr;
6959cc4ca5SDavid du Colombier 		uchar*	*ucharptr;
7059cc4ca5SDavid du Colombier 		String*	*stringptr;
7159cc4ca5SDavid du Colombier 	};
7259cc4ca5SDavid du Colombier };
7359cc4ca5SDavid du Colombier 
7459cc4ca5SDavid du Colombier enum Defaddr{	/* default addresses */
7559cc4ca5SDavid du Colombier 	aNo,
7659cc4ca5SDavid du Colombier 	aDot,
7759cc4ca5SDavid du Colombier 	aAll,
7859cc4ca5SDavid du Colombier };
7959cc4ca5SDavid du Colombier 
8059cc4ca5SDavid du Colombier int	nl_cmd(Text*, Cmd*), a_cmd(Text*, Cmd*), b_cmd(Text*, Cmd*);
8159cc4ca5SDavid du Colombier int	c_cmd(Text*, Cmd*), d_cmd(Text*, Cmd*);
8259cc4ca5SDavid du Colombier int	B_cmd(Text*, Cmd*), D_cmd(Text*, Cmd*), e_cmd(Text*, Cmd*);
8359cc4ca5SDavid du Colombier int	f_cmd(Text*, Cmd*), g_cmd(Text*, Cmd*), i_cmd(Text*, Cmd*);
8459cc4ca5SDavid du Colombier int	k_cmd(Text*, Cmd*), m_cmd(Text*, Cmd*), n_cmd(Text*, Cmd*);
8559cc4ca5SDavid du Colombier int	p_cmd(Text*, Cmd*);
8659cc4ca5SDavid du Colombier int	s_cmd(Text*, Cmd*), u_cmd(Text*, Cmd*), w_cmd(Text*, Cmd*);
8759cc4ca5SDavid du Colombier int	x_cmd(Text*, Cmd*), X_cmd(Text*, Cmd*), pipe_cmd(Text*, Cmd*);
8859cc4ca5SDavid du Colombier int	eq_cmd(Text*, Cmd*);
8959cc4ca5SDavid du Colombier 
9059cc4ca5SDavid du Colombier String	*allocstring(int);
9159cc4ca5SDavid du Colombier void	freestring(String*);
9259cc4ca5SDavid du Colombier String	*getregexp(int);
9359cc4ca5SDavid du Colombier Addr	*newaddr(void);
9459cc4ca5SDavid du Colombier Address	cmdaddress(Addr*, Address, int);
9559cc4ca5SDavid du Colombier int	cmdexec(Text*, Cmd*);
9659cc4ca5SDavid du Colombier void	editerror(char*, ...);
9759cc4ca5SDavid du Colombier int	cmdlookup(int);
9859cc4ca5SDavid du Colombier void	resetxec(void);
9959cc4ca5SDavid du Colombier void	Straddc(String*, int);
100