From 8cecf0ae927eae1dfb5ab2eef78f55e8e162a7f9 Mon Sep 17 00:00:00 2001
From: Jose Antonio Ortega Ruiz <jao@gnu.org>
Date: Sat, 7 Jul 2001 23:34:55 +0000
Subject: use of devdir command

---
 mixlib/mix_config.c     | 26 ++++++++++++++++++++++++++
 mixlib/mix_device.c     |  5 +++++
 mixlib/mix_device.h     |  3 +++
 mixlib/mix_vm_command.c | 31 ++++++++++++++++++++++++++++---
 mixlib/mix_vm_command.h |  1 +
 5 files changed, 63 insertions(+), 3 deletions(-)

(limited to 'mixlib')

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;
 
-- 
cgit v1.2.3