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