summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mixlib/mix_config.c26
-rw-r--r--mixlib/mix_device.c5
-rw-r--r--mixlib/mix_device.h3
-rw-r--r--mixlib/mix_vm_command.c31
-rw-r--r--mixlib/mix_vm_command.h1
-rw-r--r--mixutils/mixvm.c21
-rw-r--r--mixutils/mixvm_command.c30
-rw-r--r--mixutils/mixvm_command.h4
-rw-r--r--mixutils/mixvm_loop.c32
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);
+}