From 19ff8d01066f592e66d4c062eb809c8a98f8145b Mon Sep 17 00:00:00 2001 From: jaortega Date: Tue, 7 Nov 2000 04:32:23 +0000 Subject: fixed bug with future EQU symbol refs (pking) --- mixlib/mix_parser.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'mixlib/mix_parser.c') 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; -- cgit v1.2.3