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 *, int, int, int, char *);
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 *);
|