summaryrefslogtreecommitdiffhomepage
path: root/mixlib/mix_vm_dump.c
diff options
context:
space:
mode:
authorjaortega <jaortega>2001-02-26 23:21:17 +0000
committerjaortega <jaortega>2001-02-26 23:21:17 +0000
commitf270b847a817582f60f6371293fade65fe9afb9f (patch)
treefcd080b39e8f811905a7e194949aa1d55cbdffd8 /mixlib/mix_vm_dump.c
parent119a5240f57ded266447b485e5a7c0eec6dd67f8 (diff)
downloadmdk-f270b847a817582f60f6371293fade65fe9afb9f.tar.gz
mdk-f270b847a817582f60f6371293fade65fe9afb9f.tar.bz2
mix vm command dispatch refactoring
Diffstat (limited to 'mixlib/mix_vm_dump.c')
-rw-r--r--mixlib/mix_vm_dump.c77
1 files changed, 16 insertions, 61 deletions
diff --git a/mixlib/mix_vm_dump.c b/mixlib/mix_vm_dump.c
index 2d773fc..91953fd 100644
--- a/mixlib/mix_vm_dump.c
+++ b/mixlib/mix_vm_dump.c
@@ -26,15 +26,12 @@
/* Create/destroy a dump context */
mix_dump_context_t *
-mix_dump_context_new(gint fd, mix_address_t begin, mix_address_t end,
+mix_dump_context_new(FILE *fd, mix_address_t begin, mix_address_t end,
guint32 options)
{
mix_dump_context_t *result = NULL;
- GIOChannel *channel = NULL;
- if ( fd == MIX_DUMP_DEF_CHANNEL ) fd = STDIN_FILENO;
- channel = g_io_channel_unix_new (fd);
- g_return_val_if_fail (channel != NULL, NULL);
+ g_return_val_if_fail (fd != NULL, NULL);
if ( begin > end ) begin = end;
if ( end >= MEM_CELLS_NO_ ) end = MEM_CELLS_NO_;
@@ -43,7 +40,7 @@ mix_dump_context_new(gint fd, mix_address_t begin, mix_address_t end,
result->options = options;
result->begin = begin;
result->end = end;
- result->channel = channel;
+ result->channel = fd;
return result;
}
@@ -52,20 +49,9 @@ void
mix_dump_context_delete (mix_dump_context_t *dc)
{
g_return_if_fail (dc != NULL);
- g_io_channel_close (dc->channel);
g_free (dc);
}
-gboolean /* TRUE if success */
-mix_dump_context_set_channel (mix_dump_context_t *dc, gint fd)
-{
- g_return_val_if_fail (dc != NULL, FALSE);
- g_io_channel_close (dc->channel);
- dc->channel = g_io_channel_unix_new (fd == MIX_DUMP_DEF_CHANNEL?
- STDERR_FILENO : fd);
- return ( dc->channel != NULL );
-}
-
/* Use the dump context */
#define WORD_FMT_ "%s %02d %02d %02d %02d %02d (%010ld)"
#define SHORT_FMT_ "%s %02d %02d (%04d)"
@@ -80,55 +66,33 @@ mix_dump_context_set_channel (mix_dump_context_t *dc, gint fd)
#define SHORT_ARGS_(s) SHORT_SIGN_ (s), SHORT_BYTE_ (s,1), SHORT_BYTE_ (s,2), \
SHORT_ABS_ (s)
-static gboolean
-write_buffer_ (const gchar *buf, guint len, GIOChannel *io)
-{
- guint k, err;
-
- while ( len > 0 ) {
- err = g_io_channel_write (io, (gchar *) buf, len, &k);
- g_return_val_if_fail (err == G_IO_ERROR_NONE ||
- err == G_IO_ERROR_AGAIN, FALSE);
- len -= k;
- }
- return TRUE;
-}
-
-
-
void
mix_vm_dump (const mix_vm_t *vm, const mix_dump_context_t *dc)
{
- static const guint BUF_LEN = 40;
- gchar buf[BUF_LEN];
guint j, i;
+ FILE *f;
g_return_if_fail (vm != NULL);
g_return_if_fail (dc != NULL);
-
+ f = dc->channel;
+
if ( (dc->options & MIX_DUMP_rA) == MIX_DUMP_rA )
{
mix_word_t rA = get_rA_ (vm);
- guint k = g_snprintf (buf, BUF_LEN, "rA: " WORD_FMT_ "\n",
- WORD_ARGS_ (rA));
- g_return_if_fail (write_buffer_ (buf, k, dc->channel));
+ fprintf (f, "rA: " WORD_FMT_ "\n", WORD_ARGS_ (rA));
}
if ( (dc->options & MIX_DUMP_rX) == MIX_DUMP_rX )
{
mix_word_t rX = get_rX_ (vm);
- guint k = g_snprintf (buf, BUF_LEN, "rX: " WORD_FMT_ "\n",
- WORD_ARGS_ (rX));
- g_return_if_fail (write_buffer_ (buf, k, dc->channel));
+ fprintf (f, "rX: " WORD_FMT_ "\n", WORD_ARGS_ (rX));
}
if ( (dc->options & MIX_DUMP_rJ) == MIX_DUMP_rJ )
{
mix_short_t rJ = get_rJ_ (vm);
- guint k = g_snprintf (buf, BUF_LEN, "rJ: " SHORT_FMT_ "\n",
- SHORT_ARGS_ (rJ));
- g_return_if_fail (write_buffer_ (buf, k, dc->channel));
+ fprintf (f, "rJ: " SHORT_FMT_ "\n", SHORT_ARGS_ (rJ));
}
for (j = 0, i = 0; j < IREG_NO_; ++j)
@@ -136,28 +100,21 @@ mix_vm_dump (const mix_vm_t *vm, const mix_dump_context_t *dc)
if ( (dc->options & (MIX_DUMP_rI1<<j)) == (MIX_DUMP_rI1<<j) )
{
mix_short_t rI = mix_word_to_short_fast (get_rI_ (vm, j+1));
- guint k = g_snprintf (buf, BUF_LEN, "rI%d: " SHORT_FMT_ "\t",
- j+1, SHORT_ARGS_ (rI));
- g_return_if_fail (write_buffer_ (buf, k, dc->channel));
+ fprintf (f, "rI%d: " SHORT_FMT_ "\t", j+1, SHORT_ARGS_ (rI));
i++;
}
- if ( i%2 == 0 && i != 0 )
- g_return_if_fail (write_buffer_ ("\n", 1, dc->channel));
+ if ( i%2 == 0 && i != 0 ) fprintf (f, "\n");
}
- if ( i%2 == 1 )
- g_return_if_fail (write_buffer_ ("\n", 1, dc->channel));
+ if ( i%2 == 1 ) fprintf (f, "\n");
if ( (dc->options & MIX_DUMP_OVER) == MIX_DUMP_OVER )
{
- guint k = g_snprintf (buf, BUF_LEN, _("Overflow: %s\n"),
- get_over_ (vm)? "T":"F");
- g_return_if_fail (write_buffer_ (buf, k, dc->channel));
+ fprintf (f, _("Overflow: %s\n"), get_over_ (vm)? "T":"F");
}
if ( (dc->options & MIX_DUMP_CMP) == MIX_DUMP_CMP )
{
- guint k;
const gchar *val = "?";
switch (get_cmp_ (vm))
{
@@ -174,8 +131,7 @@ mix_vm_dump (const mix_vm_t *vm, const mix_dump_context_t *dc)
g_assert_not_reached ();
break;
}
- k = g_snprintf (buf, BUF_LEN, _("Cmp: %s\n"), val);
- g_return_if_fail (write_buffer_ (buf, k, dc->channel));
+ fprintf (f, _("Cmp: %s\n"), val);
}
if ( (dc->options & MIX_DUMP_CELLS) == MIX_DUMP_CELLS )
@@ -183,10 +139,9 @@ mix_vm_dump (const mix_vm_t *vm, const mix_dump_context_t *dc)
for (j = dc->begin; j < dc->end; ++j)
{
mix_word_t cell = get_cell_ (vm,j);
- guint k = g_snprintf (buf, BUF_LEN, "%04d: " WORD_FMT_ "\n", j,
- WORD_ARGS_ (cell));
- g_return_if_fail (write_buffer_ (buf, k, dc->channel));
+ fprintf (f, "%04d: " WORD_FMT_ "\n", j, WORD_ARGS_ (cell));
}
}
+ fflush (f);
}