1 /***************************************************************************
\r
2 * Copyright (C) 2005 by Dominic Rath *
\r
3 * Dominic.Rath@gmx.de *
\r
5 * This program is free software; you can redistribute it and/or modify *
\r
6 * it under the terms of the GNU General Public License as published by *
\r
7 * the Free Software Foundation; either version 2 of the License, or *
\r
8 * (at your option) any later version. *
\r
10 * This program is distributed in the hope that it will be useful, *
\r
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
\r
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
\r
13 * GNU General Public License for more details. *
\r
15 * You should have received a copy of the GNU General Public License *
\r
16 * along with this program; if not, write to the *
\r
17 * Free Software Foundation, Inc., *
\r
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
\r
19 ***************************************************************************/
\r
20 #ifdef HAVE_CONFIG_H
\r
24 #include "interpreter.h"
\r
25 #include "configuration.h"
\r
27 #include "binarybuffer.h"
\r
31 var_t *variables = NULL;
\r
33 int handle_var_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
\r
34 int handle_field_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
\r
35 int handle_script_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
\r
37 int interpreter_register_commands(struct command_context_s *cmd_ctx)
\r
39 register_command(cmd_ctx, NULL, "var", handle_var_command,
\r
40 COMMAND_ANY, "allocate, display or delete variable <name> [num_fields|'del'] [size1] ...");
\r
41 register_command(cmd_ctx, NULL, "field", handle_field_command,
\r
42 COMMAND_ANY, "display/modify variable field <var> <field> [value|'flip']");
\r
43 register_command(cmd_ctx, NULL, "script", handle_script_command,
\r
44 COMMAND_ANY, "execute commands from <file>");
\r
49 var_t* get_var_by_num(int num)
\r
52 var_t *var = variables;
\r
69 var_t* get_var_by_name(char *name)
\r
71 var_t *var = variables;
\r
75 if (strcmp(var->name, name) == 0)
\r
80 if (strcmp(var->name, name) == 0)
\r
87 var_t* get_var_by_namenum(char *namenum)
\r
89 if ((namenum[0] >= '0') && (namenum[0] <= '9'))
\r
90 return get_var_by_num(strtol(namenum, NULL, 0));
\r
92 return get_var_by_name(namenum);
\r
96 int field_le_to_host(u8 *buffer, void *priv, struct scan_field_s *dummy)
\r
98 var_field_t *field = priv;
\r
99 field->value = buf_get_u32(buffer, 0, field->num_bits);
\r
104 int handle_var_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
\r
106 var_t **last_var_p = &variables;
\r
111 while (*last_var_p)
\r
113 if (strcmp((*last_var_p)->name, args[0]) == 0)
\r
115 if (strcmp(args[1], "del") == 0)
\r
117 var_t *next = (*last_var_p)->next;
\r
118 free ((*last_var_p)->fields);
\r
119 free (*last_var_p);
\r
120 *last_var_p = next;
\r
121 command_print(cmd_ctx, "variable %s deleted", args[0]);
\r
124 command_print(cmd_ctx, "variable of that name already exists");
\r
127 last_var_p = &((*last_var_p)->next);
\r
130 if ((args[0][0] >= '0') && (args[0][0] <= '9'))
\r
132 command_print(cmd_ctx, "invalid name specified (first character may not be a number)");
\r
136 *last_var_p = malloc(sizeof(var_t));
\r
137 (*last_var_p)->name = strdup(args[0]);
\r
138 (*last_var_p)->num_fields = argc - 1;
\r
139 (*last_var_p)->next = NULL;
\r
141 (*last_var_p)->fields = malloc(sizeof(var_field_t) * (*last_var_p)->num_fields);
\r
142 for (i = 0; i < (*last_var_p)->num_fields; i++)
\r
144 (*last_var_p)->fields[i].num_bits = strtol(args[1+i], NULL, 0);
\r
145 (*last_var_p)->fields[i].value = 0x0;
\r
152 var_t *var = get_var_by_namenum(args[0]);
\r
156 command_print(cmd_ctx, "%s (%i fields):", var->name, var->num_fields);
\r
157 for (i = 0; i < (var->num_fields); i++)
\r
159 command_print(cmd_ctx, "0x%x (/%i)", var->fields[i].value, var->fields[i].num_bits);
\r
164 command_print(cmd_ctx, "variable %s doesn't exist", args[0]);
\r
170 var_t *var = variables;
\r
174 command_print(cmd_ctx, "%i: %s (%i fields)", count, var->name, var->num_fields);
\r
183 int handle_field_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
\r
187 return ERROR_COMMAND_SYNTAX_ERROR;
\r
191 var_t *var = get_var_by_namenum(args[0]);
\r
192 int field_num = strtol(args[1], NULL, 0);
\r
195 command_print(cmd_ctx, "variable %s doesn't exist", args[0]);
\r
198 if (field_num >= var->num_fields)
\r
199 command_print(cmd_ctx, "variable field %i is out of bounds (max. %i)", field_num, var->num_fields - 1);
\r
200 if ((var) && (field_num < var->num_fields))
\r
204 if (strcmp(args[2], "flip") == 0)
\r
205 var->fields[field_num].value = flip_u32(var->fields[field_num].value, var->fields[field_num].num_bits);
\r
207 var->fields[field_num].value = strtoul(args[2], NULL, 0);
\r
210 command_print(cmd_ctx, "%s(%i): 0x%x (/%i)", var->name, field_num, var->fields[field_num].value, var->fields[field_num].num_bits);
\r
217 int handle_script_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
\r
223 return ERROR_COMMAND_SYNTAX_ERROR;
\r
225 script_file = open_file_from_path(cmd_ctx, args[0], "r");
\r
229 command_print(cmd_ctx, "couldn't open script file %s", args[0]);
\r
233 echo = cmd_ctx->echo;
\r
236 command_run_file(cmd_ctx, script_file, cmd_ctx->mode);
\r
238 cmd_ctx->echo = echo;
\r
240 fclose(script_file);
\r