2 |
- |
1 |
typedef struct Addr Addr;
|
|
|
2 |
typedef struct Cmd Cmd;
|
|
|
3 |
struct Addr
|
|
|
4 |
{
|
|
|
5 |
char type; /* # (char addr), l (line addr), / ? . $ + - , ; */
|
|
|
6 |
union{
|
|
|
7 |
String *re;
|
|
|
8 |
Addr *aleft; /* left side of , and ; */
|
|
|
9 |
} g;
|
|
|
10 |
Posn num;
|
|
|
11 |
Addr *next; /* or right side of , and ; */
|
|
|
12 |
};
|
|
|
13 |
|
|
|
14 |
#define are g.re
|
|
|
15 |
#define left g.aleft
|
|
|
16 |
|
|
|
17 |
struct Cmd
|
|
|
18 |
{
|
|
|
19 |
Addr *addr; /* address (range of text) */
|
|
|
20 |
String *re; /* regular expression for e.g. 'x' */
|
|
|
21 |
union{
|
|
|
22 |
Cmd *cmd; /* target of x, g, {, etc. */
|
|
|
23 |
String *text; /* text of a, c, i; rhs of s */
|
|
|
24 |
Addr *addr; /* address for m, t */
|
|
|
25 |
} g;
|
|
|
26 |
Cmd *next; /* pointer to next element in {} */
|
|
|
27 |
short num;
|
|
|
28 |
ushort flag; /* whatever */
|
|
|
29 |
ushort cmdc; /* command character; 'x' etc. */
|
|
|
30 |
};
|
|
|
31 |
|
|
|
32 |
#define ccmd g.cmd
|
|
|
33 |
#define ctext g.text
|
|
|
34 |
#define caddr g.addr
|
|
|
35 |
|
|
|
36 |
typedef struct Cmdtab Cmdtab;
|
|
|
37 |
struct Cmdtab
|
|
|
38 |
{
|
|
|
39 |
ushort cmdc; /* command character */
|
|
|
40 |
uchar text; /* takes a textual argument? */
|
|
|
41 |
uchar regexp; /* takes a regular expression? */
|
|
|
42 |
uchar addr; /* takes an address (m or t)? */
|
|
|
43 |
uchar defcmd; /* default command; 0==>none */
|
|
|
44 |
uchar defaddr; /* default address */
|
|
|
45 |
uchar count; /* takes a count e.g. s2/// */
|
|
|
46 |
char *token; /* takes text terminated by one of these */
|
|
|
47 |
int (*fn)(File*, Cmd*); /* function to call with parse tree */
|
|
|
48 |
}cmdtab[];
|
|
|
49 |
|
|
|
50 |
enum Defaddr{ /* default addresses */
|
|
|
51 |
aNo,
|
|
|
52 |
aDot,
|
|
|
53 |
aAll,
|
|
|
54 |
};
|
|
|
55 |
|
|
|
56 |
int nl_cmd(File*, Cmd*), a_cmd(File*, Cmd*), b_cmd(File*, Cmd*);
|
|
|
57 |
int c_cmd(File*, Cmd*), cd_cmd(File*, Cmd*), d_cmd(File*, Cmd*);
|
|
|
58 |
int D_cmd(File*, Cmd*), e_cmd(File*, Cmd*);
|
|
|
59 |
int f_cmd(File*, Cmd*), g_cmd(File*, Cmd*), i_cmd(File*, Cmd*);
|
|
|
60 |
int k_cmd(File*, Cmd*), m_cmd(File*, Cmd*), n_cmd(File*, Cmd*);
|
|
|
61 |
int p_cmd(File*, Cmd*), q_cmd(File*, Cmd*);
|
|
|
62 |
int s_cmd(File*, Cmd*), u_cmd(File*, Cmd*), w_cmd(File*, Cmd*);
|
|
|
63 |
int x_cmd(File*, Cmd*), X_cmd(File*, Cmd*), plan9_cmd(File*, Cmd*);
|
|
|
64 |
int eq_cmd(File*, Cmd*);
|
|
|
65 |
|
|
|
66 |
|
|
|
67 |
String *getregexp(int);
|
|
|
68 |
Addr *newaddr(void);
|
|
|
69 |
Address address(Addr*, Address, int);
|
|
|
70 |
int cmdexec(File*, Cmd*);
|