diff options
-rw-r--r-- | mixlib/mix_config.c | 26 | ||||
-rw-r--r-- | mixlib/mix_device.c | 5 | ||||
-rw-r--r-- | mixlib/mix_device.h | 3 | ||||
-rw-r--r-- | mixlib/mix_vm_command.c | 31 | ||||
-rw-r--r-- | mixlib/mix_vm_command.h | 1 | ||||
-rw-r--r-- | mixutils/mixvm.c | 21 | ||||
-rw-r--r-- | mixutils/mixvm_command.c | 30 | ||||
-rw-r--r-- | mixutils/mixvm_command.h | 4 | ||||
-rw-r--r-- | mixutils/mixvm_loop.c | 32 |
9 files changed, 106 insertions, 47 deletions
diff --git a/mixlib/mix_config.c b/mixlib/mix_config.c index d03e949..871af91 100644 --- a/mixlib/mix_config.c +++ b/mixlib/mix_config.c @@ -34,6 +34,7 @@ static const gchar *DEF_DIR_ = ".mdk"; static const gchar *AUTOSAVE_KEY_ = "Autosave"; static const gchar *AUTOSAVE_YES_ = "True"; static const gchar *AUTOSAVE_NO_ = "False"; +static const gchar *DEVICES_KEY_ = "DevicesDir"; /* the config type */ struct mix_config_t @@ -106,6 +107,14 @@ mix_config_delete (mix_config_t *config) g_free (config); } +/* get the config filename */ +const gchar * +mix_config_get_filename (const mix_config_t *config) +{ + g_return_val_if_fail (config != NULL, NULL); + return config->filename; +} + /* get a config item's value from its key */ const gchar * mix_config_get (const mix_config_t *config, const gchar *key) @@ -183,3 +192,20 @@ mix_config_is_autosave (const mix_config_t *config) return config->autosave; } +/* devices dir*/ +void +mix_config_set_devices_dir (mix_config_t *config, const gchar *dirname) +{ + g_return_if_fail (config != NULL); + g_return_if_fail (dirname != NULL); + if (mix_stat_dir (dirname, "devices")) + mix_config_update (config, DEVICES_KEY_, dirname); +} + +extern const gchar * +mix_config_get_devices_dir (const mix_config_t *config) +{ + g_return_val_if_fail (config != NULL, NULL); + return mix_config_get (config, DEVICES_KEY_); +} + diff --git a/mixlib/mix_device.c b/mixlib/mix_device.c index d40ea98..e50896d 100644 --- a/mixlib/mix_device.c +++ b/mixlib/mix_device.c @@ -39,6 +39,11 @@ mix_device_set_dir (const gchar *dirname) return FALSE; } +const gchar * +mix_device_get_dir (void) +{ + return DEV_DIR_; +} mix_device_t * mix_device_new (mix_device_type_t type) diff --git a/mixlib/mix_device.h b/mixlib/mix_device.h index 9f37092..d8b604b 100644 --- a/mixlib/mix_device.h +++ b/mixlib/mix_device.h @@ -76,6 +76,9 @@ typedef enum { extern gboolean mix_device_set_dir (const gchar *dirname); +extern const gchar * +mix_device_get_dir (void); + /* Create a new device with default name and given type. */ diff --git a/mixlib/mix_vm_command.c b/mixlib/mix_vm_command.c index 6eab3a2..afabc55 100644 --- a/mixlib/mix_vm_command.c +++ b/mixlib/mix_vm_command.c @@ -27,10 +27,11 @@ #include <ctype.h> #include <errno.h> -#include "mix_vm_command.h" +#include "mix_device.h" #include "mix_vm.h" #include "mix_vm_dump.h" #include "mix_eval.h" +#include "mix_vm_command.h" /* hooks */ typedef struct @@ -103,6 +104,7 @@ DEC_FUN (pedit_); DEC_FUN (sedit_); DEC_FUN (pasm_); DEC_FUN (sasm_); +DEC_FUN (devdir_); /* internal command info struct */ typedef struct { @@ -160,6 +162,8 @@ command_ commands_[] = { "tracing [on|off]"}, { "timing", cmd_timing_, N_("Turn on/off timing statistics"), "timing [on|off]"}, + { "devdir", cmd_devdir_, N_("Print/set devices directory"), + "devdir [NEWDIR]"}, { NULL, NULL, NULL, NULL}, }; @@ -257,6 +261,15 @@ mix_vm_cmd_dispatcher_new_with_config (FILE *out, FILE *err, if (val) mix_vm_cmd_dispatcher_set_assembler (result, val); val = mix_config_get (result->config, TIMING_KEY_); if (val) cmd_timing_ (result, val); + val = mix_config_get_devices_dir (result->config); + if (!val) + { + gchar *dirname = g_dirname (mix_config_get_filename (config)); + cmd_devdir_ (result, dirname); + g_free (dirname); + } + else + cmd_devdir_ (result, val); } return result; } @@ -1359,8 +1372,7 @@ cmd_timing_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) } else if (arg && !strlen (arg)) { - fprintf (dis->out, "Instruction timing is currently set %s\n", - dis->printtime ? "ON" : "OFF"); + print_time_ (dis); } else cmd_help_ (dis, "timing"); @@ -1405,3 +1417,16 @@ cmd_sasm_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) mix_vm_cmd_dispatcher_set_assembler (dis, arg); return TRUE; } + +static gboolean +cmd_devdir_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) +{ + if (!arg || !strlen (arg)) + fprintf (dis->out, "Device directory: %s\n", mix_device_get_dir ()); + else if (mix_device_set_dir (arg) && dis->config) + mix_config_set_devices_dir (dis->config, arg); + return TRUE; +} + + + diff --git a/mixlib/mix_vm_command.h b/mixlib/mix_vm_command.h index 40bb7e8..45e2c8c 100644 --- a/mixlib/mix_vm_command.h +++ b/mixlib/mix_vm_command.h @@ -68,6 +68,7 @@ typedef enum { MIX_CMD_W2D, /* print word in decimal notation */ MIX_CMD_TRACING, /* enable/disable instruction traces */ MIX_CMD_TIMING, /* enable/disable timing statistics */ + MIX_CMD_DEVDIR, /* print/set device directory */ MIX_CMD_INVALID, /* invalid command identifier */ } mix_vm_command_t; diff --git a/mixutils/mixvm.c b/mixutils/mixvm.c index d2d64c3..81b1fa2 100644 --- a/mixutils/mixvm.c +++ b/mixutils/mixvm.c @@ -37,7 +37,7 @@ extern void mix_vmloop (const gchar *code_file, gboolean use_emacs); -static void +extern void mix_vmrun (const gchar *code_file, gboolean dump); enum { @@ -137,24 +137,5 @@ main (int argc, char **argv) } -static void -mix_vmrun (const gchar *code_file, gboolean dump) -{ - mix_vm_t *vm = mix_vm_new (); - if (!mix_vm_load_file (vm, code_file)) { - fprintf (stderr, _("Error loading %s file\n"), code_file); - return; - } - mix_vm_run (vm); - printf (_("** Execution time: %ld\n"), mix_vm_get_uptime (vm)); - if (dump) { - mix_dump_context_t *dc = mix_dump_context_new (MIX_DUMP_DEF_CHANNEL, - 0, 0, - MIX_DUMP_ALL_NOMEM); - mix_vm_dump (vm, dc); - mix_dump_context_delete (dc); - } - mix_vm_delete (vm); -} diff --git a/mixutils/mixvm_command.c b/mixutils/mixvm_command.c index 8030eed..b8bef53 100644 --- a/mixutils/mixvm_command.c +++ b/mixutils/mixvm_command.c @@ -173,33 +173,23 @@ cmd_help_ (char *arg) int i; int printed = 0; - for (i = 0; commands[i].name; i++) + for (i = 1; commands[i].name; i++) { - if (!*arg || (strcmp (arg, commands[i].name) == 0)) + if (!arg || !*arg) { - printf (_("%s\t\t%s. Usage: %s\n"), commands[i].name, - _(commands[i].doc), commands[i].usage); + printf (_("%s\t\t%s.\n"), commands[i].name, _(commands[i].doc)); printed++; } - } - - if (printed > 1) printf ("\n"); - - for (i = LOCAL_COMANDS_NO_ + 1 /* skip help cmd */; mix_commands_[i]; i++) - { - if (!*arg || (strcmp (arg, mix_commands_[i]) == 0)) + else if (strcmp (arg, commands[i].name) == 0) { - printf (_("%s\t\t%s. Usage: %s\n"), mix_commands_[i], - mix_vm_command_help (i - LOCAL_COMANDS_NO_), - mix_vm_command_usage (i - LOCAL_COMANDS_NO_)); + printf (_("%s\t\t%s.\nUsage:\t\t%s\n"), commands[i].name, + _(commands[i].doc), commands[i].usage); printed++; } } - - if (!printed) printf ("Command \'%s\' not found\n", arg); - + if (!printed ||!arg || !*arg) + mix_vm_cmd_dispatcher_dispatch (dis_, MIX_CMD_HELP, arg); return TRUE; - } static int @@ -246,7 +236,7 @@ init_dis_ (mix_vm_cmd_dispatcher_t *dis) } void -mixvm_cmd_init (char *arg, gboolean use_emacs) +mixvm_cmd_init (mix_config_t *config, char *arg, gboolean use_emacs) { int k; /* get local command names */ @@ -263,7 +253,7 @@ mixvm_cmd_init (char *arg, gboolean use_emacs) #endif /* HAVE_LIBREADLINE */ /* initialise the dispatcher */ - dis_ = mix_vm_cmd_dispatcher_new (stdout, stderr); + dis_ = mix_vm_cmd_dispatcher_new_with_config (stdout, stderr, config); if ( dis_ == NULL) g_error (_("Failed initialisation (no memory resources)")); diff --git a/mixutils/mixvm_command.h b/mixutils/mixvm_command.h index 9741164..f4fdea8 100644 --- a/mixutils/mixvm_command.h +++ b/mixutils/mixvm_command.h @@ -23,10 +23,10 @@ #ifndef MIXVM_COMMAND_H #define MIXVM_COMMAND_H -#include <glib.h> +#include <mixlib/mix_config.h> extern void -mixvm_cmd_init (char *arg, gboolean use_emacs); +mixvm_cmd_init (mix_config_t *config, char *arg, gboolean use_emacs); extern gboolean mixvm_cmd_exec (char *line); diff --git a/mixutils/mixvm_loop.c b/mixutils/mixvm_loop.c index 89a3953..ad49829 100644 --- a/mixutils/mixvm_loop.c +++ b/mixutils/mixvm_loop.c @@ -23,6 +23,10 @@ #include <stdio.h> #include <mixlib/mix.h> +#include <mixlib/mix_config.h> +#include <mixlib/mix_vm.h> +#include <mixlib/mix_device.h> +#include <mixlib/mix_vm_dump.h> #include "mixvm_command.h" #ifdef HAVE_LIBHISTORY @@ -46,7 +50,9 @@ readline (char *prompt) /* A static variable for holding the line. */ static char *line_read = (char *)NULL; + static const char *PROMPT = N_("MIX > "); +static const char *CONFIG_FILE_ = "mixvm.config"; /* Read a string, and return a pointer to it. Returns NULL on EOF. */ static char * @@ -75,9 +81,31 @@ rl_gets () void mix_vmloop (const gchar *file, gboolean use_emacs) { - mixvm_cmd_init ((char *)file, use_emacs); + mix_config_t *config = mix_config_new (NULL, CONFIG_FILE_); + mix_config_set_autosave (config, TRUE); + mixvm_cmd_init (config, (char *)file, use_emacs); while ( mixvm_cmd_exec (rl_gets ()) ) ; + if (config) mix_config_delete (config); } - +/* run a program and exit */ +void +mix_vmrun (const gchar *code_file, gboolean dump) +{ + mix_vm_t *vm = mix_vm_new (); + if (!mix_vm_load_file (vm, code_file)) { + fprintf (stderr, _("Error loading %s file\n"), code_file); + return; + } + mix_vm_run (vm); + printf (_("** Execution time: %ld\n"), mix_vm_get_uptime (vm)); + if (dump) { + mix_dump_context_t *dc = mix_dump_context_new (MIX_DUMP_DEF_CHANNEL, + 0, 0, + MIX_DUMP_ALL_NOMEM); + mix_vm_dump (vm, dc); + mix_dump_context_delete (dc); + } + mix_vm_delete (vm); +} |