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); +} | 
