summaryrefslogtreecommitdiffhomepage
path: root/mixlib/mix_vm.c
diff options
context:
space:
mode:
authorjaortega <jaortega>2001-03-10 02:30:09 +0000
committerjaortega <jaortega>2001-03-10 02:30:09 +0000
commit59cc212ebe00245200e5a2d9f2393fbd1ddb4e94 (patch)
tree74287c30c2e0dd630d98c4bc934fbacaf36f0679 /mixlib/mix_vm.c
parentc532202e4d9c4707cc8708b50607f246f359aac3 (diff)
downloadmdk-59cc212ebe00245200e5a2d9f2393fbd1ddb4e94.tar.gz
mdk-59cc212ebe00245200e5a2d9f2393fbd1ddb4e94.tar.bz2
format fixings
Diffstat (limited to 'mixlib/mix_vm.c')
-rw-r--r--mixlib/mix_vm.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/mixlib/mix_vm.c b/mixlib/mix_vm.c
index 6da21e2..0a885d8 100644
--- a/mixlib/mix_vm.c
+++ b/mixlib/mix_vm.c
@@ -343,6 +343,39 @@ mix_vm_get_address_lineno (const mix_vm_t *vm, mix_address_t addr)
return lineno;
}
+/* Get the address for a given source line number */
+typedef struct
+{
+ guint lineno;
+ mix_address_t result;
+} addr_traverse_t;
+
+static gint
+get_address_ (gpointer key, gpointer value, gpointer data)
+{
+ addr_traverse_t *tr = (addr_traverse_t *)data;
+ if (GPOINTER_TO_UINT (key) == tr->lineno)
+ {
+ tr->result = mix_short_new (GPOINTER_TO_UINT (value));
+ return TRUE;
+ }
+ return (GPOINTER_TO_UINT (key) < tr->lineno)? FALSE:TRUE;
+}
+
+mix_address_t
+mix_vm_get_lineno_address (const mix_vm_t *vm, guint lineno)
+{
+ addr_traverse_t tr;
+
+ g_return_val_if_fail (vm != NULL, MIX_VM_CELL_NO);
+ if (!vm->line_table) return MIX_VM_CELL_NO;
+ tr.lineno = lineno;
+ tr.result = MIX_VM_CELL_NO;
+ g_tree_traverse (vm->line_table, get_address_, G_IN_ORDER, (gpointer)&tr);
+ return tr.result;
+}
+
+
/* Reposition program counter and reset state so that a loaded
program can be restarted.
*/