typedef struct Addr Addr;typedef struct Cmd Cmd;struct Addr{ char type; /* # (char addr), l (line addr), / ? . $ + - , ; */ union{ String *re; Addr *aleft; /* left side of , and ; */ } g; Posn num; Addr *next; /* or right side of , and ; */}; #define are g.re#define left g.aleft struct Cmd{ Addr *addr; /* address (range of text) */ String *re; /* regular expression for e.g. 'x' */ union{ Cmd *cmd; /* target of x, g, {, etc. */ String *text; /* text of a, c, i; rhs of s */ Addr *addr; /* address for m, t */ } g; Cmd *next; /* pointer to next element in {} */ short num; ushort flag; /* whatever */ ushort cmdc; /* command character; 'x' etc. */}; #define ccmd g.cmd#define ctext g.text#define caddr g.addr 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)(File*, Cmd*); /* function to call with parse tree */}cmdtab[]; enum Defaddr{ /* default addresses */ aNo, aDot, aAll,}; int nl_cmd(File*, Cmd*), a_cmd(File*, Cmd*), b_cmd(File*, Cmd*);int c_cmd(File*, Cmd*), cd_cmd(File*, Cmd*), d_cmd(File*, Cmd*);int D_cmd(File*, Cmd*), e_cmd(File*, Cmd*);int f_cmd(File*, Cmd*), g_cmd(File*, Cmd*), i_cmd(File*, Cmd*);int k_cmd(File*, Cmd*), m_cmd(File*, Cmd*), n_cmd(File*, Cmd*);int p_cmd(File*, Cmd*), q_cmd(File*, Cmd*);int s_cmd(File*, Cmd*), u_cmd(File*, Cmd*), w_cmd(File*, Cmd*);int x_cmd(File*, Cmd*), X_cmd(File*, Cmd*), plan9_cmd(File*, Cmd*);int eq_cmd(File*, Cmd*); String *getregexp(int);Addr *newaddr(void);Address address(Addr*, Address, int);int cmdexec(File*, Cmd*);
typedef struct Addr Addr;
typedef struct Cmd Cmd;
struct Addr
{
char type; /* # (char addr), l (line addr), / ? . $ + - , ; */
union{
String *re;
Addr *aleft; /* left side of , and ; */
} g;
Posn num;
Addr *next; /* or right side of , and ; */
};
#define are g.re
#define left g.aleft
struct Cmd
{
Addr *addr; /* address (range of text) */
String *re; /* regular expression for e.g. 'x' */
union{
Cmd *cmd; /* target of x, g, {, etc. */
String *text; /* text of a, c, i; rhs of s */
Addr *addr; /* address for m, t */
} g;
Cmd *next; /* pointer to next element in {} */
short num;
ushort flag; /* whatever */
ushort cmdc; /* command character; 'x' etc. */
};
#define ccmd g.cmd
#define ctext g.text
#define caddr g.addr
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)(File*, Cmd*); /* function to call with parse tree */
}cmdtab[];
enum Defaddr{ /* default addresses */
aNo,
aDot,
aAll,
};
int nl_cmd(File*, Cmd*), a_cmd(File*, Cmd*), b_cmd(File*, Cmd*);
int c_cmd(File*, Cmd*), cd_cmd(File*, Cmd*), d_cmd(File*, Cmd*);
int D_cmd(File*, Cmd*), e_cmd(File*, Cmd*);
int f_cmd(File*, Cmd*), g_cmd(File*, Cmd*), i_cmd(File*, Cmd*);
int k_cmd(File*, Cmd*), m_cmd(File*, Cmd*), n_cmd(File*, Cmd*);
int p_cmd(File*, Cmd*), q_cmd(File*, Cmd*);
int s_cmd(File*, Cmd*), u_cmd(File*, Cmd*), w_cmd(File*, Cmd*);
int x_cmd(File*, Cmd*), X_cmd(File*, Cmd*), plan9_cmd(File*, Cmd*);
int eq_cmd(File*, Cmd*);
String *getregexp(int);
Addr *newaddr(void);
Address address(Addr*, Address, int);
int cmdexec(File*, Cmd*);