1 /******************************************************************************
2 * This file is part of TinTin++ *
3 * *
4 * Copyright 2004-2020 Igor van den Hoven *
5 * *
6 * TinTin++ is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 3 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with TinTin++. If not, see https://www.gnu.org/licenses. *
18 ******************************************************************************/
19
20 /******************************************************************************
21 * T I N T I N + + *
22 * *
23 * coded by Igor van den Hoven 2004 *
24 ******************************************************************************/
25
26 #include "tintin.h"
27
28 struct command_type command_table[];
29
DO_COMMAND(do_commands)30 DO_COMMAND(do_commands)
31 {
32 int cmd;
33
34 arg = sub_arg_in_braces(ses, arg, arg1, GET_ALL, SUB_VAR|SUB_FUN);
35
36 tintin_header(ses, 0, " %s ", "COMMANDS");
37
38 for (cmd = 0 ; *command_table[cmd].name != 0 ; cmd++)
39 {
40 if (*arg1 && !is_abbrev(arg1, command_table[cmd].name))
41 {
42 continue;
43 }
44
45 if (strip_vt102_strlen(ses, arg2) + 20 > get_scroll_cols(ses))
46 {
47 tintin_puts2(ses, arg2);
48 *arg2 = 0;
49 }
50
51 if (command_table[cmd].type == TOKEN_TYPE_COMMAND)
52 {
53 cat_sprintf(arg2, "%s%20s", COLOR_COMMAND, command_table[cmd].name);
54 }
55 else
56 {
57 cat_sprintf(arg2, "%s%20s", COLOR_STATEMENT, command_table[cmd].name);
58 }
59 }
60
61 if (*arg2)
62 {
63 tintin_puts2(ses, arg2);
64 }
65
66 tintin_header(ses, 0, "");
67
68 return ses;
69 }
70
71
init_commands()72 void init_commands()
73 {
74 int index, ref;
75
76 for (index = 1 ; *command_table[index].name ; index++)
77 {
78 if (strcmp(command_table[index - 1].name, command_table[index].name) > 0)
79 {
80 print_stdout(0, 0, "\e[1;31minit_tintin() unsorted command table %s vs %s.", command_table[index - 1].name, command_table[index].name);
81 exit(1);
82 }
83 }
84
85 for (ref = 0 ; ref < 32 ; ref++)
86 {
87 for (index = 0 ; *command_table[index].name ; index++)
88 {
89 if (*command_table[index].name % 32 == ref)
90 {
91 break;
92 }
93 }
94 gtd->command_ref[ref] = index;
95 }
96 }
97
98 // unused
99
execute(struct session * ses,char * format,...)100 struct session *execute(struct session *ses, char *format, ...)
101 {
102 char *buffer;
103 va_list args;
104
105 push_call("execute(%p,%p,...)",ses,format);
106
107 va_start(args, format);
108
109 if (vasprintf(&buffer, format, args) == -1)
110 {
111 syserr_printf(ses, "execute: vasprintf:");
112 }
113
114 va_end(args);
115
116 if (*buffer)
117 {
118 if (*buffer != gtd->tintin_char)
119 {
120 *buffer = gtd->tintin_char;
121 }
122 get_arg_all(ses, buffer, buffer, FALSE);
123 }
124
125 ses = script_driver(ses, LIST_COMMAND, buffer);
126
127 free(buffer);
128
129 pop_call();
130 return ses;
131 }
132
command(struct session * ses,COMMAND * cmd,char * format,...)133 struct session *command(struct session *ses, COMMAND *cmd, char *format, ...)
134 {
135 char *arg1, *arg2, *arg3, *arg4, *buffer;
136 va_list args;
137
138 push_call("command(%p,%p,%p,...)",ses,cmd,format);
139
140 va_start(args, format);
141
142 if (vasprintf(&buffer, format, args) == -1)
143 {
144 syserr_printf(ses, "command: vasprintf:");
145 }
146
147 va_end(args);
148
149 arg1 = str_alloc_stack(0);
150 arg2 = str_alloc_stack(0);
151 arg3 = str_alloc_stack(0);
152 arg4 = "";
153
154 ses = cmd(ses, buffer, arg1, arg2, arg3, arg4);
155
156 free(buffer);
157
158 pop_call();
159 return ses;
160 }
161
162 extern DO_COMMAND(do_action);
163 extern DO_COMMAND(do_alias);
164 extern DO_COMMAND(do_all);
165 extern DO_COMMAND(do_bell);
166 extern DO_COMMAND(do_button);
167 extern DO_COMMAND(do_cat);
168 extern DO_COMMAND(do_class);
169 extern DO_COMMAND(do_commands);
170 extern DO_COMMAND(do_cr);
171 extern DO_COMMAND(do_debug);
172 extern DO_COMMAND(do_echo);
173 extern DO_COMMAND(do_event);
174 extern DO_COMMAND(do_format);
175 extern DO_COMMAND(do_function);
176 extern DO_COMMAND(do_gag);
177 extern DO_COMMAND(do_highlight);
178 extern DO_COMMAND(do_ignore);
179 extern DO_COMMAND(do_info);
180 extern DO_COMMAND(do_killall);
181 extern DO_COMMAND(do_log);
182 extern DO_COMMAND(do_local);
183 extern DO_COMMAND(do_list);
184 extern DO_COMMAND(do_macro);
185 extern DO_COMMAND(do_math);
186 extern DO_COMMAND(do_message);
187 extern DO_COMMAND(do_path);
188 extern DO_COMMAND(do_port);
189 extern DO_COMMAND(do_prompt);
190 extern DO_COMMAND(do_replace);
191 extern DO_COMMAND(do_run);
192 extern DO_COMMAND(do_scan);
193 extern DO_COMMAND(do_script);
194 extern DO_COMMAND(do_send);
195 extern DO_COMMAND(do_showme);
196 extern DO_COMMAND(do_ssl);
197 extern DO_COMMAND(do_substitute);
198 extern DO_COMMAND(do_system);
199 extern DO_COMMAND(do_tab);
200 extern DO_COMMAND(do_textin);
201 extern DO_COMMAND(do_tick);
202 extern DO_COMMAND(do_unaction);
203 extern DO_COMMAND(do_unalias);
204 extern DO_COMMAND(do_unbutton);
205 extern DO_COMMAND(do_undelay);
206 extern DO_COMMAND(do_unevent);
207 extern DO_COMMAND(do_unfunction);
208 extern DO_COMMAND(do_ungag);
209 extern DO_COMMAND(do_unhighlight);
210 extern DO_COMMAND(do_unlocal);
211 extern DO_COMMAND(do_unmacro);
212 extern DO_COMMAND(do_unpathdir);
213 extern DO_COMMAND(do_unprompt);
214 extern DO_COMMAND(do_unsubstitute);
215 extern DO_COMMAND(do_untab);
216 extern DO_COMMAND(do_untick);
217 extern DO_COMMAND(do_unvariable);
218 extern DO_COMMAND(do_variable);
219
220 struct command_type command_table[] =
221 {
222 { "action", do_action, 3, TOKEN_TYPE_COMMAND },
223 { "alias", do_alias, 3, TOKEN_TYPE_COMMAND },
224 { "all", do_all, 1, TOKEN_TYPE_COMMAND },
225 { "banner", do_banner, 1, TOKEN_TYPE_COMMAND },
226 { "bell", do_bell, 2, TOKEN_TYPE_COMMAND },
227 { "break", do_nop, 0, TOKEN_TYPE_BREAK },
228 { "buffer", do_buffer, 2, TOKEN_TYPE_COMMAND },
229 { "button", do_button, 3, TOKEN_TYPE_COMMAND },
230 { "case", do_nop, 0, TOKEN_TYPE_CASE },
231 { "cat", do_cat, 1, TOKEN_TYPE_COMMAND },
232 { "chat", do_chat, 2, TOKEN_TYPE_COMMAND },
233 { "class", do_class, 3, TOKEN_TYPE_COMMAND },
234 { "commands", do_commands, 2, TOKEN_TYPE_COMMAND },
235 { "config", do_configure, 2, TOKEN_TYPE_COMMAND },
236 { "continue", do_nop, 0, TOKEN_TYPE_CONTINUE},
237 { "cr", do_cr, 0, TOKEN_TYPE_COMMAND },
238 { "cursor", do_cursor, 2, TOKEN_TYPE_COMMAND },
239 { "daemon", do_daemon, 2, TOKEN_TYPE_COMMAND },
240 { "debug", do_debug, 2, TOKEN_TYPE_COMMAND },
241 { "default", do_nop, 0, TOKEN_TYPE_DEFAULT },
242 { "delay", do_delay, 3, TOKEN_TYPE_COMMAND },
243 { "dictionary", do_dictionary, 3, TOKEN_TYPE_COMMAND },
244 { "draw", do_draw, 3, TOKEN_TYPE_COMMAND },
245 { "echo", do_echo, 3, TOKEN_TYPE_COMMAND },
246 { "edit", do_edit, 2, TOKEN_TYPE_COMMAND },
247 { "else", do_nop, 0, TOKEN_TYPE_ELSE },
248 { "elseif", do_nop, 0, TOKEN_TYPE_ELSEIF },
249 { "end", do_end, 1, TOKEN_TYPE_COMMAND },
250 { "event", do_event, 2, TOKEN_TYPE_COMMAND },
251 { "foreach", do_nop, 3, TOKEN_TYPE_FOREACH },
252 { "format", do_format, 3, TOKEN_TYPE_COMMAND },
253 { "function", do_function, 2, TOKEN_TYPE_COMMAND },
254 { "gag", do_gag, 1, TOKEN_TYPE_COMMAND },
255 { "grep", do_grep, 2, TOKEN_TYPE_COMMAND },
256 { "help", do_help, 1, TOKEN_TYPE_COMMAND },
257 { "highlight", do_highlight, 3, TOKEN_TYPE_COMMAND },
258 { "history", do_history, 3, TOKEN_TYPE_COMMAND },
259 { "if", do_nop, 0, TOKEN_TYPE_IF },
260 { "ignore", do_ignore, 2, TOKEN_TYPE_COMMAND },
261 { "info", do_info, 2, TOKEN_TYPE_COMMAND },
262 { "kill", do_kill, 2, TOKEN_TYPE_COMMAND },
263 { "killall", do_killall, 2, TOKEN_TYPE_COMMAND },
264 { "line", do_line, 3, TOKEN_TYPE_COMMAND },
265 { "list", do_list, 3, TOKEN_TYPE_COMMAND },
266 { "local", do_local, 1, TOKEN_TYPE_COMMAND },
267 { "log", do_log, 2, TOKEN_TYPE_COMMAND },
268 { "loop", do_nop, 3, TOKEN_TYPE_LOOP },
269 { "macro", do_macro, 3, TOKEN_TYPE_COMMAND },
270 { "map", do_map, 2, TOKEN_TYPE_COMMAND },
271 { "math", do_math, 2, TOKEN_TYPE_COMMAND },
272 { "message", do_message, 2, TOKEN_TYPE_COMMAND },
273 { "nop", do_nop, 0, TOKEN_TYPE_COMMAND },
274 { "parse", do_nop, 3, TOKEN_TYPE_PARSE },
275 { "path", do_path, 1, TOKEN_TYPE_COMMAND },
276 { "pathdir", do_pathdir, 3, TOKEN_TYPE_COMMAND },
277 { "port", do_port, 2, TOKEN_TYPE_COMMAND },
278 { "prompt", do_prompt, 2, TOKEN_TYPE_COMMAND },
279 { "read", do_read, 1, TOKEN_TYPE_COMMAND },
280 { "regexp", do_regexp, 3, TOKEN_TYPE_REGEX },
281 { "replace", do_replace, 3, TOKEN_TYPE_COMMAND },
282 { "return", do_nop, 0, TOKEN_TYPE_RETURN },
283 { "run", do_run, 3, TOKEN_TYPE_COMMAND },
284 { "scan", do_scan, 2, TOKEN_TYPE_COMMAND },
285 { "screen", do_screen, 2, TOKEN_TYPE_COMMAND },
286 { "script", do_script, 2, TOKEN_TYPE_COMMAND },
287 { "send", do_send, 1, TOKEN_TYPE_COMMAND },
288 { "session", do_session, 1, TOKEN_TYPE_COMMAND },
289 { "showme", do_showme, 3, TOKEN_TYPE_COMMAND },
290 { "snoop", do_snoop, 2, TOKEN_TYPE_COMMAND },
291 { "split", do_split, 2, TOKEN_TYPE_COMMAND },
292 { "ssl", do_ssl, 3, TOKEN_TYPE_COMMAND },
293 { "substitute", do_substitute, 3, TOKEN_TYPE_COMMAND },
294 { "switch", do_nop, 0, TOKEN_TYPE_SWITCH },
295 { "system", do_system, 1, TOKEN_TYPE_COMMAND },
296 { "tab", do_tab, 1, TOKEN_TYPE_COMMAND },
297 { "test", do_test, 3, TOKEN_TYPE_COMMAND },
298 { "textin", do_textin, 2, TOKEN_TYPE_COMMAND },
299 { "ticker", do_tick, 3, TOKEN_TYPE_COMMAND },
300 { "unaction", do_unaction, 0, TOKEN_TYPE_COMMAND },
301 { "unalias", do_unalias, 0, TOKEN_TYPE_COMMAND },
302 { "unbutton", do_unbutton, 0, TOKEN_TYPE_COMMAND },
303 { "undelay", do_undelay, 1, TOKEN_TYPE_COMMAND },
304 { "unevent", do_unevent, 0, TOKEN_TYPE_COMMAND },
305 { "unfunction", do_unfunction, 0, TOKEN_TYPE_COMMAND },
306 { "ungag", do_ungag, 0, TOKEN_TYPE_COMMAND },
307 { "unhighlight", do_unhighlight, 0, TOKEN_TYPE_COMMAND },
308 { "unlocal", do_unlocal, 1, TOKEN_TYPE_COMMAND },
309 { "unmacro", do_unmacro, 0, TOKEN_TYPE_COMMAND },
310 { "unpathdir", do_unpathdir, 1, TOKEN_TYPE_COMMAND },
311 { "unprompt", do_unprompt, 0, TOKEN_TYPE_COMMAND },
312 { "unsplit", do_unsplit, 0, TOKEN_TYPE_COMMAND },
313 { "unsubstitute", do_unsubstitute, 0, TOKEN_TYPE_COMMAND },
314 { "untab", do_untab, 0, TOKEN_TYPE_COMMAND },
315 { "unticker", do_untick, 0, TOKEN_TYPE_COMMAND },
316 { "unvariable", do_unvariable, 1, TOKEN_TYPE_COMMAND },
317 { "variable", do_variable, 1, TOKEN_TYPE_COMMAND },
318 { "while", do_nop, 0, TOKEN_TYPE_WHILE },
319 { "write", do_write, 2, TOKEN_TYPE_COMMAND },
320 { "zap", do_zap, 1, TOKEN_TYPE_COMMAND },
321 { "", NULL, 0, TOKEN_TYPE_COMMAND }
322 };
323