diff options
-rw-r--r-- | mixlib/mix_vm_command.c | 66 | ||||
-rw-r--r-- | mixlib/mix_vm_command.h | 12 |
2 files changed, 56 insertions, 22 deletions
diff --git a/mixlib/mix_vm_command.c b/mixlib/mix_vm_command.c index e6f7e79..b3156c2 100644 --- a/mixlib/mix_vm_command.c +++ b/mixlib/mix_vm_command.c @@ -65,6 +65,7 @@ struct mix_vm_cmd_dispatcher_t hook_ post_hooks[MIX_CMD_INVALID]; /* Post-command hooks */ global_hook_ global_pre; /* global pre-command hook */ global_hook_ global_post; /* global post-command hook */ + mix_config_t *config; /* externally provided configuration */ }; /* command handlers */ @@ -94,8 +95,7 @@ DEC_FUN (cbpa_); DEC_FUN (cabp_); DEC_FUN (weval_); DEC_FUN (w2d_); -DEC_FUN (tron_); -DEC_FUN (troff_); +DEC_FUN (trace_); DEC_FUN (edit_); DEC_FUN (compile_); @@ -145,11 +145,16 @@ command_ commands_[] = { { "weval", cmd_weval_, N_("Evaluate a given W-expression"), "weval WEXPR"}, { "w2d", cmd_w2d_, N_("Convert a MIX word to its decimal value"), "w2d WORD"}, - { "tron", cmd_tron_, N_("Turn on instruction tracing."), "tron"}, - { "troff", cmd_troff_, N_("Turn off instruction tracing."), "troff"}, + { "trace", cmd_trace_, N_("Turn on/off instruction tracing."), + "trace on|off"}, { NULL, NULL, NULL, NULL}, }; +/* configuration keys */ +static const gchar *TRACE_KEY_ = "Trace"; +static const gchar *EDITOR_KEY_ = "Editor"; +static const gchar *ASM_KEY_ = "Assembler"; + /* external interface */ @@ -218,9 +223,28 @@ mix_vm_cmd_dispatcher_new (FILE *out_fd, /* output messages file */ result->pre_hooks[k].func = result->post_hooks[k].func = NULL; result->pre_hooks[k].data = result->post_hooks[k].data = NULL; } - + result->config = NULL; + + return result; +} + +mix_vm_cmd_dispatcher_t * +mix_vm_cmd_dispatcher_new_with_config (FILE *out, FILE *err, + mix_config_t *config) +{ + mix_vm_cmd_dispatcher_t *result = mix_vm_cmd_dispatcher_new (out, err); + if (result != NULL && (result->config = config) != NULL) + { + const gchar *val = mix_config_get (result->config, TRACE_KEY_); + if (val) cmd_trace_ (result, val); + val = mix_config_get (result->config, EDITOR_KEY_); + if (val) mix_vm_cmd_dispatcher_set_editor (result, val); + val = mix_config_get (result->config, ASM_KEY_); + if (val) mix_vm_cmd_dispatcher_set_assembler (result, val); + } return result; } + /* delete (does not close the fds in the constructor) */ void @@ -243,6 +267,8 @@ mix_vm_cmd_dispatcher_set_editor (mix_vm_cmd_dispatcher_t *dis, g_return_if_fail (dis != NULL); if (dis->editor) g_free (dis->editor); dis->editor = (edit_tplt) ? g_strdup (edit_tplt) : NULL; + if (dis->config && dis->editor) + mix_config_update (dis->config, EDITOR_KEY_, dis->editor); } void @@ -252,6 +278,8 @@ mix_vm_cmd_dispatcher_set_assembler (mix_vm_cmd_dispatcher_t *dis, g_return_if_fail (dis != NULL); if (dis->assembler) g_free (dis->assembler); dis->assembler = (asm_tplt) ? g_strdup (asm_tplt) : NULL; + if (dis->config && dis->assembler) + mix_config_update (dis->config, ASM_KEY_, dis->assembler); } const gchar * @@ -623,8 +651,6 @@ cmd_compile_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) } } - - static gboolean cmd_run_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { @@ -1269,17 +1295,21 @@ cmd_w2d_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) } static gboolean -cmd_tron_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) -{ - dis->trace = TRUE; - fprintf (dis->out, _("Instruction tracing has been turned ON.\n")); - return TRUE; -} - -static gboolean -cmd_troff_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) +cmd_trace_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { - dis->trace = FALSE; - fprintf (dis->out, _("Instruction tracing has been turned OFF.\n")); + static const gchar *ON = "on"; + static const gchar *OFF = "off"; + if (arg && !strcmp (arg, ON)) + { + dis->trace = TRUE; + if (dis->config) mix_config_update (dis->config, TRACE_KEY_, ON); + } + else if (arg && !strcmp (arg, OFF)) + { + dis->trace = FALSE; + if (dis->config) mix_config_update (dis->config, TRACE_KEY_, OFF); + } + else + cmd_help_ (dis, "trace"); return TRUE; } diff --git a/mixlib/mix_vm_command.h b/mixlib/mix_vm_command.h index 71e5820..b1c6839 100644 --- a/mixlib/mix_vm_command.h +++ b/mixlib/mix_vm_command.h @@ -28,6 +28,7 @@ #include <stdio.h> #include "mix.h" #include "mix_vm.h" +#include "mix_config.h" /* mix_vm_cmd_dispatcher encapsulates a virtual machine and helper objects, providing a command driven interface with output to @@ -61,8 +62,7 @@ typedef enum { MIX_CMD_CABP, /* clear all breakpoints */ MIX_CMD_WEVAL, /* evaluate a w-expression */ MIX_CMD_W2D, /* print word in decimal notation */ - MIX_CMD_TRON, /* enable instruction traces */ - MIX_CMD_TROFF, /* disble instruction traces */ + MIX_CMD_TRACE, /* enable/disable instruction traces */ MIX_CMD_INVALID, /* invalid command identifier */ } mix_vm_command_t; @@ -92,8 +92,12 @@ mix_vm_command_usage (mix_vm_command_t cmd); /* create a new command dispatcher */ extern mix_vm_cmd_dispatcher_t * -mix_vm_cmd_dispatcher_new (FILE *out_fd, /* output messages file */ - FILE *err_fd /* error messages file */); +mix_vm_cmd_dispatcher_new (FILE *out, /* output messages file */ + FILE *err /* error messages file */); + +extern mix_vm_cmd_dispatcher_t * +mix_vm_cmd_dispatcher_new_with_config (FILE *out, FILE *err, + mix_config_t *config); /* delete (does not close the fds in the constructor) */ extern void |