summaryrefslogtreecommitdiffhomepage
path: root/mixlib/mix_parser.c
diff options
context:
space:
mode:
authorjaortega <jaortega>2000-11-07 04:32:23 +0000
committerjaortega <jaortega>2000-11-07 04:32:23 +0000
commit19ff8d01066f592e66d4c062eb809c8a98f8145b (patch)
treed4b1796f4817dfe966b886f622b7b720577bcef7 /mixlib/mix_parser.c
parent0b26bdea980ea0d7f5f644679ba1a8ca2abb2986 (diff)
downloadmdk-19ff8d01066f592e66d4c062eb809c8a98f8145b.tar.gz
mdk-19ff8d01066f592e66d4c062eb809c8a98f8145b.tar.bz2
fixed bug with future EQU symbol refs (pking)
Diffstat (limited to 'mixlib/mix_parser.c')
-rw-r--r--mixlib/mix_parser.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/mixlib/mix_parser.c b/mixlib/mix_parser.c
index 74317ac..36d5b3a 100644
--- a/mixlib/mix_parser.c
+++ b/mixlib/mix_parser.c
@@ -192,12 +192,14 @@ undef_warning_ (gpointer symbol, gpointer value, gpointer data)
}
static void
-update_future_refs_ (mix_parser_t *parser, const gchar *name)
+update_future_refs_value_ (mix_parser_t *parser, const gchar *name,
+ mix_short_t value)
{
GSList *list = NULL;
gpointer key;
g_assert (parser != NULL && name != NULL);
+ printf ("Updating future %s\n", name);
if ( g_hash_table_lookup_extended (parser->future_refs, name, &key,
(gpointer *)&list) )
@@ -209,7 +211,7 @@ update_future_refs_ (mix_parser_t *parser, const gchar *name)
node =
(ins_node_ *)g_tree_lookup (parser->ins_table,tmp->data);
g_assert (node);
- mix_word_set_address (node->ins, parser->loc_count);
+ mix_word_set_address (node->ins, value);
g_tree_insert (parser->ins_table, tmp->data, (gpointer)node);
tmp = g_slist_next (tmp);
}
@@ -219,6 +221,9 @@ update_future_refs_ (mix_parser_t *parser, const gchar *name)
}
}
+#define update_future_refs_(parser,name) \
+ update_future_refs_value_(parser, name, (parser)->loc_count);
+
static void
update_ls_ (gpointer symbol, gpointer value, gpointer parser)
{ /* add an instruction on current location and update refs to it */
@@ -392,14 +397,20 @@ mix_parser_err_t
mix_parser_define_symbol_here (mix_parser_t *parser, const gchar *name)
{
mix_word_t value = mix_short_to_word_fast (parser->loc_count);
-
+ return mix_parser_define_symbol_value (parser, name, value);
+}
+
+mix_parser_err_t
+mix_parser_define_symbol_value (mix_parser_t *parser, const gchar *name,
+ mix_word_t value)
+{
g_assert (parser != NULL && name != NULL);
switch (mix_symbol_table_add (parser->symbol_table, name, value))
{
case MIX_SYM_OK:
if ( parser->status == MIX_PERR_NOCOMP )
- update_future_refs_ (parser, name);
+ update_future_refs_value_ (parser, name, value);
return MIX_PERR_OK;
case MIX_SYM_LONG: return MIX_PERR_LONG_SYMBOL;
case MIX_SYM_DUP: return MIX_PERR_DUP_SYMBOL;