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