1 /*
2  * cmd.h - definitions for command parser
3  */
4 
5 /*
6  * Copyright (C) 2004, 2010, 2011, 2013, 2014, 2017, 2021,
7  * the Free Software Foundation, Inc.
8  *
9  * This file is part of GAWK, the GNU implementation of the
10  * AWK Programming Language.
11  *
12  * GAWK is free software; you can redistribute it and/or modify
13  * it under the terms of the GNU General Public License as published by
14  * the Free Software Foundation; either version 3 of the License, or
15  * (at your option) any later version.
16  *
17  * GAWK is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, write to the Free Software
24  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
25  */
26 
27 #ifdef HAVE_LIBREADLINE
28 #include <readline/readline.h>
29 #include <readline/history.h>
30 extern char **command_completion(const char *text, int start, int end);
31 extern void initialize_pager(FILE *fp); /* debug.c */
32 extern NODE *get_function(void);
33 #else
34 #define initialize_pager(x)		/* nothing */
35 #define add_history(x)		/* nothing */
36 #endif
37 
38 extern int gprintf(FILE *fp, const char *format, ...);
39 extern jmp_buf pager_quit_tag;
40 extern int pager_quit_tag_valid;
41 
42 extern bool output_is_tty;
43 extern int input_fd;
44 extern bool input_from_tty;
45 extern FILE *out_fp;
46 extern const char *dbg_prompt;
47 extern const char *commands_prompt;
48 extern const char *eval_prompt;
49 extern const char *dgawk_prompt;
50 
51 enum argtype {
52 	D_illegal,
53 
54 	/* commands */
55 	D_backtrace,
56 	D_break,
57 	D_clear,
58 	D_commands,
59 	D_condition,
60 	D_continue,
61 	D_delete,
62 	D_disable,
63 	D_display,
64 	D_down,
65 	D_dump,
66 	D_enable,
67 	D_end,
68 	D_eval,
69 	D_finish,
70 	D_frame,
71 	D_help,
72 	D_ignore,
73 	D_info,
74 	D_list,
75 	D_next,
76 	D_nexti,
77 	D_option,
78 	D_print,
79 	D_printf,
80 	D_quit,
81 	D_return,
82 	D_run,
83 	D_save,
84 	D_set,
85 	D_silent,
86 	D_source,
87 	D_step,
88 	D_stepi,
89 	D_tbreak,
90 	D_trace,
91 	D_undisplay,
92 	D_until,
93 	D_unwatch,
94 	D_up,
95 	D_watch,
96 
97 	/* arguments */
98 	D_argument,
99 	D_int,
100 	D_string,
101 	D_variable,
102 	D_node,
103 	D_field,
104 	D_array,
105 	D_subscript,
106 	D_func,
107 	D_range
108 };
109 
110 /* non-number arguments to commands */
111 
112 enum nametypeval {
113 	A_NONE = 0,
114 	A_ARGS,
115 	A_BREAK,
116 	A_DEL,
117 	A_DISPLAY,
118 	A_FRAME,
119 	A_FUNCTIONS,
120 	A_LOCALS,
121 	A_ONCE,
122 	A_SOURCE,
123 	A_SOURCES,
124 	A_TRACE_ON,
125 	A_TRACE_OFF,
126 	A_VARIABLES,
127 	A_WATCH
128 };
129 
130 typedef struct cmd_argument {
131 	struct cmd_argument *next;
132 	enum argtype type;
133 	union {
134 		long lval;
135 		char *sval;
136 		NODE *nodeval;
137 	} value;
138 
139 #define a_int       value.lval	/* type = D_int or D_range */
140 #define a_argument  value.lval	/* type = D_argument */
141 #define a_string  value.sval	/* type = D_string, D_array, D_subscript or D_variable */
142 #define a_node    value.nodeval /* type = D_node, D_field or D_func */
143 
144 	int a_count;		/* subscript count for D_subscript and D_array */
145 } CMDARG;
146 
147 typedef int (*Func_cmd)(CMDARG *, int);
148 
149 struct cmdtoken {
150 	const char *name;
151 	const char *abbrvn;	/* abbreviation */
152 	enum argtype type;
153 	int lex_class;
154 	Func_cmd cf_ptr;
155 	const char *help_txt;
156 };
157 
158 /* command.c */
159 extern void free_cmdarg(CMDARG *list);
160 extern Func_cmd get_command(int ctype);
161 extern const char *get_command_name(int ctype);
162 
163 /* debug.c */
164 extern void d_error(const char *mesg, ...);
165 
166 /* command.c */
167 extern int find_option(char *name);
168 extern void option_help(void);
169 extern char *(*read_a_line)(const char *prompt);
170 extern char *read_commands_string(const char *prompt);
171 extern int in_cmd_src(const char *);
172 extern int get_eof_status(void);
173 extern void push_cmd_src(int fd, bool istty, char * (*readfunc)(const char *),
174 		int (*closefunc)(int), int cmd, int eofstatus);
175 extern int pop_cmd_src(void);
176 extern int has_break_or_watch_point(int *pnum, bool any);
177 extern int do_list(CMDARG *arg, int cmd);
178 extern int do_info(CMDARG *arg, int cmd);
179 extern int do_print_var(CMDARG *arg, int cmd);
180 extern int do_backtrace(CMDARG *arg, int cmd);
181 extern int do_breakpoint(CMDARG *arg, int cmd);
182 extern int do_tmp_breakpoint(CMDARG *arg, int cmd);
183 extern int do_delete_breakpoint(CMDARG *arg, int cmd);
184 extern int do_enable_breakpoint(CMDARG *arg, int cmd);
185 extern int do_disable_breakpoint(CMDARG *arg, int cmd) ;
186 extern int do_ignore_breakpoint(CMDARG *arg, int cmd) ;
187 extern int do_run(CMDARG *arg, int cmd);
188 extern int do_quit(CMDARG *arg, int cmd);
189 extern int do_continue(CMDARG *arg, int cmd);
190 extern int do_step(CMDARG *arg, int cmd) ;
191 extern int do_stepi(CMDARG *arg, int cmd) ;
192 extern int do_next(CMDARG *arg, int cmd);
193 extern int do_nexti(CMDARG *arg, int cmd);
194 extern int do_clear(CMDARG *arg, int cmd);
195 extern int do_finish(CMDARG *arg, int cmd) ;
196 extern int do_help(CMDARG *arg, int cmd) ;
197 extern int do_up(CMDARG *arg, int cmd);
198 extern int do_down(CMDARG *arg, int cmd);
199 extern int do_frame(CMDARG *arg, int cmd);
200 extern int do_until(CMDARG *arg, int cmd);
201 extern int do_set_var(CMDARG *arg, int cmd);
202 extern int do_return(CMDARG *arg, int cmd);
203 extern int do_display(CMDARG *arg, int cmd);
204 extern int do_undisplay(CMDARG *arg, int cmd);
205 extern int do_watch(CMDARG *arg, int cmd);
206 extern int do_unwatch(CMDARG *arg, int cmd);
207 extern int do_dump_instructions(CMDARG *arg, int cmd);
208 extern int do_trace_instruction(CMDARG *arg, int cmd);
209 extern int do_option(CMDARG *arg, int cmd);
210 extern int do_commands(CMDARG *arg, int cmd);
211 extern int do_print_f(CMDARG *arg, int cmd);
212 extern int do_source(CMDARG *arg, int cmd);
213 extern int do_save(CMDARG *arg, int cmd);
214 extern int do_eval(CMDARG *arg, int cmd);
215 extern int do_condition(CMDARG *arg, int cmd);
216