V9/jtools/src/sam/parse.h

typedef struct Addr Addr;
struct Addr{
	char	type;	/* # (char addr), l (line addr), / ? . $ + - , ; */
	union{
		Regexp	*aure;
		Addr	*auprev;	/* left side of , and ; */
	}au;
	int	num;
	Addr	*next;			/* or right side of , and ; */
};
#define	are	au.aure
#define	aprev	au.auprev
typedef struct Cmd Cmd;
struct Cmd{
	Addr	*addr;			/* address (range of text) */
	Regexp	*re;			/* regular expression for e.g. 'x' */
	union{
		Cmd	*cucmd;		/* target of x, g, {, etc. */
		String	*cutext;	/* text of a, c, i; rhs of s */
		Addr	*cuaddr;	/* address for m, t */
	}cu;
	Cmd	*next;			/* pointer to next element in {} */
	short	num;
	ushort	flag;			/* whatever */
	ushort	cmdc;			/* command character; 'x' etc. */
};
#define	ccmd	cu.cucmd
#define	ctext	cu.cutext
#define	caddr	cu.cuaddr
extern struct cmdtab{
	ushort	cmdc;		/* command character */
	uchar	text;		/* takes a textual argument? */
	uchar	regexp;		/* takes a regular expression? */
	uchar	addr;		/* takes an address (m or t)? */
	uchar	defcmd;		/* default command; 0==>none */
	uchar	defaddr;	/* default address */
	uchar	count;		/* takes a count e.g. s2/// */
	char	*token;		/* takes text terminated by one of these */
	int	(*fn)();	/* function to call with parse tree */
}cmdtab[];
enum Defaddr{	/* default addresses */
	aNo,
	aDot,
	aAll,
};
extern Regexp	*getregexp();
extern Addr	*newaddr();