summaryrefslogtreecommitdiffhomepage
path: root/mixlib
diff options
context:
space:
mode:
Diffstat (limited to 'mixlib')
-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
5 files changed, 63 insertions, 3 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;