aboutsummaryrefslogtreecommitdiff
path: root/tecparse.h
blob: fcccd2540755a42225c1b24fde010b95ba8fe9d3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
/*
 * $Date: 2007/12/10 22:13:07 $
 * $Source: /cvsroot/videoteco/videoteco/tecparse.h,v $
 * $Revision: 1.2 $
 * $Locker:  $
 */

/**
 * \file tecparse.h
 * \brief Definitions for TECO parser
 */

/*
 *
 *                     Copyright (C) 1985-2007 BY Paul Cantrell
 *
 *    This program is free software: you can redistribute it and/or modify
 *    it under the terms of the GNU General Public License as published by
 *    the Free Software Foundation, either version 3 of the License, or
 *    (at your option) any later version.
 *
 *    This program is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU General Public License for more details.
 *
 *    You should have received a copy of the GNU General Public License
 *    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * This structure holds the context which must be passed forward as the
 * parse progresses. We split it out of the cmd_token structure so that
 * it can be easily duplicated.
 */
struct cmd_context {
	char	state;
	char	flags;
	char	go_flag;
	char	pnest;
	char	inest;
	char	cnest;
	char	iarg1_flag;
	char	iarg2_flag;
	char	delimeter;
	int	iarg1;
	int	iarg2;
	char	*carg;
	int	tmpval;
	int	return_state;
	struct	cmd_token *caller_token;
};

/**
 * Define the structure which we use to describe commands
 */
struct cmd_token {
	char	opcode;
	char	input_byte;
	char	q_register;
	char	flags;
	int	execute_state;
	struct	cmd_token *next_token;
	struct	cmd_token *prev_token;
	struct	undo_token *undo_list;
	struct	cmd_context ctx;
};

struct undo_token {
	char	opcode;
	int	iarg1;
	int	iarg2;
	char	*carg1;
	struct	undo_token *next_token;
};

#define TRACE_C_PARSE		1
#define TRACE_C_EXEC		2
#define TRACE_C_MACRO		3

#define TOK_M_EAT_TOKEN		(1 << 0)
#define TOK_M_WORDBOUNDARY	(1 << 1)
#define TOK_M_PARSELOAD_IARG1	(1 << 2)
#define TOK_M_PARSELOAD_IARG2	(1 << 3)
#define TOK_M_PARSELOAD_TMPVAL	(1 << 4)

#define CTOK_M_COLON_SEEN	(1 << 0)
#define CTOK_M_ATSIGN_SEEN	(1 << 1)
#define CTOK_M_STATUS_PASSED	(1 << 2)

#define TOK_C_UNUSED		0	/**< Value before it gets set			*/
#define TOK_C_FIRSTTOKEN	1	/**< The begining of it all			*/
#define TOK_C_INPUTCHAR		2	/**< An input character was recieved here	*/
#define TOK_C_COPYTOKEN		3	/**< A copy of a previous command token		*/
#define TOK_C_ITERATION_BEGIN	4	/**< Marks the begining of an iteration		*/
#define TOK_C_ITERATION_END	5	/**< Marks the end of an iteration		*/
#define TOK_C_CONDITIONAL_END	6	/**< Marks end of a conditional cmd		*/
#define TOK_C_LABEL_BEGIN	7	/**< Begining of a label tag <tt>!like this!</tt>*/
#define TOK_C_LABEL_END		8	/**< End of a label tag				*/
#define TOK_C_GOTO_BEGIN	9	/**< Begining of an \c Omumble\$ string		*/
#define TOK_C_GOTO_END		10	/**< End of an \c Omumble\$ string		*/
#define TOK_C_FINALTOKEN	11	/**< Like \c FINALSTATE				*/
#define TOK_C_INITIALSTATE	12	/**< Used by \c ^W to find begining of cmds	*/
#define TOK_C_CONDITIONAL_ELSE	13	/**< Marks begining of an ELSE clause		*/

#define STATE_C_INITIALSTATE	0
#define STATE_C_MAINCOMMANDS	1
#define STATE_C_ESCAPESEEN	2
#define STATE_C_ECOMMAND	3
#define STATE_C_ARG1		4
#define STATE_C_ARG2		5
#define STATE_C_EXPRESSION	6
#define STATE_C_OPERATOR	7
#define STATE_C_PLUS		8
#define STATE_C_MINUS		9
#define STATE_C_TIMES		10
#define STATE_C_DIVIDE		11
#define STATE_C_MINUSSEEN	14
#define STATE_C_SUBEXPRESSION	15
#define STATE_C_OPERAND		16
#define STATE_C_NUMBER_SUBSTATE	17
#define STATE_C_QOPERAND	18
#define STATE_C_INSERT		19
#define STATE_C_QUOTED_INSERT	20
#define STATE_C_UMINUS		21
#define STATE_C_LABEL		22
#define STATE_C_UQREGISTER	23
#define STATE_C_WRITEFILE	24
#define STATE_C_STRING		25
#define STATE_C_STRING1		26
#define STATE_C_SEARCH		27
#define STATE_C_FCOMMAND	28
#define STATE_C_FSPART1		29
#define STATE_C_FSPART2		30
#define STATE_C_EDITBUF		31
#define STATE_C_READFILE	32
#define STATE_C_XQREGISTER	33
#define STATE_C_GQREGISTER	34
#define STATE_C_MQREGISTER	35
#define STATE_C_VIEWBUF		36
#define STATE_C_FDCOMMAND	37
#define STATE_C_CONDITIONALS	38
#define STATE_C_GOTO		39
#define STATE_C_FRPART1		40
#define STATE_C_FRPART2		41
#define STATE_C_MESSAGE		42
#define STATE_C_FKCOMMAND	43
#define STATE_C_ECCOMMAND	44
#define STATE_C_SAVECOMMAND	45
#define STATE_C_PERCENT_OPERAND	46
#define STATE_C_ATINSERT	47
#define STATE_C_ATINSERT_PART2	48
#define STATE_C_ONE_EQUALS	49
#define STATE_C_TWO_EQUALS	50
#define STATE_C_SKIP_ELSE	51
#define STATE_C_PUSH_QREGISTER	52
#define STATE_C_POP_QREGISTER	53
#define STATE_C_NSEARCH		54
#define STATE_C_ACCEPT_ARGS	55
#define STATE_C_EQQREGISTER1	56
#define STATE_C_EQQREGISTER2	57
#define STATE_C_RADIX		58
#define STATE_C_HEX_NUMBER	59
#define STATE_C_OCTAL_NUMBER	60
#define STATE_C_HEX_NUMBER_SUBSTATE	61
#define STATE_C_OCTAL_NUMBER_SUBSTATE	62
#define STATE_C_BACKSLASH	63
#define STATE_C_DELAYED_MINUS	64
#define STATE_C_DELAYED_PLUS	65
#define STATE_C_FSPART3		66
#define STATE_C_FTAGS		67


#define STATE_C_RETURN		97
#define STATE_C_FINALSTATE	98
#define STATE_C_ERRORSTATE	99

/*
 * Here we define the execution time states
 */
#define EXEC_C_NULLSTATE	0
#define EXEC_C_DOTARG1		1
#define EXEC_C_ZEEARG1		2
#define EXEC_C_HARGUMENT	3
#define EXEC_C_EXITCOMMAND	4
#define EXEC_C_UQREGISTER	5
#define EXEC_C_JUMP		8
#define EXEC_C_INSERT		9
#define EXEC_C_LINE		10
#define EXEC_C_CHAR		11
#define EXEC_C_RCHAR		12
#define EXEC_C_DELETE		13
#define EXEC_C_HVALUE		14
#define EXEC_C_DOTVALUE		15
#define EXEC_C_ZEEVALUE		16
#define EXEC_C_QVALUE		17
#define EXEC_C_EQUALS		18
#define EXEC_C_REDRAW_SCREEN	19
#define EXEC_C_STOREVAL		20
#define EXEC_C_STORE1		21
#define EXEC_C_STORE2		22
#define EXEC_C_UMINUS		23
#define EXEC_C_PLUS		24
#define EXEC_C_MINUS		25
#define EXEC_C_TIMES		26
#define EXEC_C_DIVIDE		27
#define EXEC_C_KILL		28
#define EXEC_C_WRITEFILE	29
#define EXEC_C_SEARCH		30
#define EXEC_C_SETSEARCH	31
#define EXEC_C_FSREPLACE1	32
#define EXEC_C_ITERATION_BEGIN	33
#define EXEC_C_ITERATION_END	34
#define EXEC_C_READFILE		35
#define EXEC_C_EDITBUF		36
#define EXEC_C_XQREGISTER	37
#define EXEC_C_GQREGISTER	38
#define EXEC_C_SEMICOLON	39
#define EXEC_C_MQREGISTER	40
#define EXEC_C_CLOSEBUF		41
#define EXEC_C_VIEWBUF		42
#define EXEC_C_FDCOMMAND	43
#define EXEC_C_ACOMMAND		44
#define EXEC_C_BACKSLASH	45
#define EXEC_C_BACKSLASHARG	46
#define EXEC_C_COND_GT		47
#define EXEC_C_COND_LT		48
#define EXEC_C_COND_EQ		49
#define EXEC_C_COND_NE		50
#define EXEC_C_COND_DIGIT	51
#define EXEC_C_COND_ALPHA	52
#define EXEC_C_COND_LOWER	53
#define EXEC_C_COND_UPPER	54
#define EXEC_C_COND_SYMBOL	55
#define EXEC_C_GOTO		56
#define EXEC_C_FRREPLACE	57
#define EXEC_C_MESSAGE		58
#define EXEC_C_RESET_MESSAGE	59
#define EXEC_C_OUTPUT_MESSAGE	60
#define EXEC_C_FKCOMMAND	61
#define EXEC_C_REMEMBER_DOT	62
#define EXEC_C_ECCOMMAND	63
#define EXEC_C_SAVECOMMAND	64
#define EXEC_C_SCROLL		65
#define EXEC_C_UPDATE_SCREEN	66
#define EXEC_C_SET_IMMEDIATE_MODE 67
#define EXEC_C_PERCENT_VALUE	68
#define EXEC_C_WORD		69
#define EXEC_C_TWO_EQUALS	70
#define EXEC_C_THREE_EQUALS	71
#define EXEC_C_SKIP_ELSE	72
#define EXEC_C_PUSH_QREGISTER	73
#define EXEC_C_POP_QREGISTER	74
#define	EXEC_C_NSEARCH		75
#define EXEC_C_EQQREGISTER	76
#define EXEC_C_WINDOW_CONTROL	77
#define EXEC_C_NEXT_WINDOW	78
#define EXEC_C_RLINE		79
#define EXEC_C_DELWORD		80
#define EXEC_C_RDELWORD		81
#define EXEC_C_OPENBRACE	82
#define EXEC_C_CLOSEBRACE	83
#define EXEC_C_SKIPLABEL	84
#define EXEC_C_SETOPTIONS	85
#define EXEC_C_FSREPLACE2	86
#define EXEC_C_FSREPLACE3	87
#define EXEC_C_FTAGS		88

/*
 * Define the UNDO symbols
 */
#define UNDO_C_UNUSED		0
#define UNDO_C_CHANGEDOT	1
#define UNDO_C_DELETE		2
#define UNDO_C_INSERT		3
#define UNDO_C_UQREGISTER	4
#define UNDO_C_MEMFREE		5
#define UNDO_C_SHORTEN_STRING	6
#define UNDO_C_SET_SEARCH_STRING 7
#define UNDO_C_CHANGEBUFF	8
#define UNDO_C_MACRO		9
#define UNDO_C_SHORTEN_MESSAGE	10
#define UNDO_C_BULK_INSERT	11
#define UNDO_C_SET_IMMEDIATE_MODE 12
#define UNDO_C_PUSH		13
#define UNDO_C_POP		14
#define UNDO_C_MODIFIED		15
#define UNDO_C_CLOSEBUFF	16
#define UNDO_C_WINDOW_SWITCH	17
#define UNDO_C_WINDOW_SPLIT	18
#define UNDO_C_REOPENBUFF	19
#define UNDO_C_RENAME_BUFFER	20
#define	UNDO_C_PRESERVEARGS	21
#define	UNDO_C_SETOPTIONS	22
#define UNDO_C_SET_SEARCH_GLOBALS 23
#define UNDO_C_LOAD_TAGS	24
#define UNDO_C_SELECT_TAGS	25
#define UNDO_C_SET_EXIT_FLAG	26

int cmd_oscmd(struct cmd_token *ct);
int buff_insert_from_buffer_with_undo( struct cmd_token *,
			struct buff_header *,int,struct buff_header *,int,int);
int buff_delete_with_undo( struct cmd_token *,struct buff_header *,int,int);
int buff_insert_with_undo( struct cmd_token *,
					struct buff_header *,int,char *,int);
int rename_edit_buffer(struct buff_header *,char *,struct cmd_token *);
int cmd_setoptions(int,int,struct undo_token *);
void tag_dump_database(struct tags *tp,struct cmd_token *uct);
int buff_insert_char_with_undo(struct cmd_token *,
					struct buff_header *,int,char);
int set_search_string_with_undo(char *,struct cmd_token *uct);
int cmd_tags(struct cmd_token *uct,int,int,int,char *);
int tecmacro(struct buff_header *,struct cmd_token *,struct cmd_token **);
void parser_cleanup_ctlist(struct cmd_token *);
void free_cmd_token(struct cmd_token *);
int parser_undo(struct undo_token *);
void free_undo_token(struct undo_token *);
void screen_reset_echo(struct cmd_token *);
int parse_special_character(struct cmd_token *,int);
void parse_input_character(struct cmd_token *,struct cmd_token *);
void trace_mode(int, struct cmd_token *, struct cmd_token *);
int execute_a_state(struct cmd_token *, struct cmd_token *);
void tecundo_cleanup(struct undo_token *);
int parse_any_arguments(struct cmd_token *,char *);
int parse_more_than_one_arg(struct cmd_token *,char *);
int parse_check_qname(struct cmd_token *,char);
struct cmd_token *allocate_cmd_token(struct cmd_token *old_token);
struct undo_token *allocate_undo_token(struct cmd_token *ct);
void buff_free_line_buffer(struct buff_line *);