diff options
| author | jaortega <jaortega> | 2000-11-07 04:32:23 +0000 | 
|---|---|---|
| committer | jaortega <jaortega> | 2000-11-07 04:32:23 +0000 | 
| commit | 19ff8d01066f592e66d4c062eb809c8a98f8145b (patch) | |
| tree | d4b1796f4817dfe966b886f622b7b720577bcef7 /mixlib | |
| parent | 0b26bdea980ea0d7f5f644679ba1a8ca2abb2986 (diff) | |
| download | mdk-19ff8d01066f592e66d4c062eb809c8a98f8145b.tar.gz mdk-19ff8d01066f592e66d4c062eb809c8a98f8145b.tar.bz2 | |
fixed bug with future EQU symbol refs (pking)
Diffstat (limited to 'mixlib')
| -rw-r--r-- | mixlib/mix_parser.c | 19 | ||||
| -rw-r--r-- | mixlib/mix_scanner.l | 4 | ||||
| -rw-r--r-- | mixlib/xmix_parser.h | 6 | 
3 files changed, 23 insertions, 6 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; diff --git a/mixlib/mix_scanner.l b/mixlib/mix_scanner.l index f740d10..b1d4a13 100644 --- a/mixlib/mix_scanner.l +++ b/mixlib/mix_scanner.l @@ -176,7 +176,7 @@ wexpr   {expr}({fpart})?(,{expr}({fpart})?)*      BEGIN (OP);    }    {flocsymbol}|{blocsymbol} RETURN_ERROR (MIX_PERR_UNEX_LOC, yytext); -  {symbol}/{ws}+EQU { /* store symbol name for future definition */ +  {symbol}/({ws}+EQU) { /* store symbol name for future definition */      symbol = g_strdup (yytext);      if ( symbol == NULL ) {        mix_parser_log_error (parser, MIX_PERR_INTERNAL, lineno, NULL, FALSE); @@ -263,7 +263,7 @@ wexpr   {expr}({fpart})?(,{expr}({fpart})?)*      gint def;      if ( symbol == NULL ) RETURN_ERROR (MIX_PERR_MIS_SYM, NULL);      value = mix_word_new (atol (yytext)); -    def = mix_symbol_table_add (parser->symbol_table, symbol, value); +    def = mix_parser_define_symbol_value (parser, symbol, value);      if ( def == MIX_SYM_DUP )  RETURN_ERROR (MIX_PERR_DUP_SYMBOL, symbol);      if ( def == MIX_SYM_LONG )  RETURN_ERROR (MIX_PERR_LONG_SYMBOL, symbol);      ++lineno; diff --git a/mixlib/xmix_parser.h b/mixlib/xmix_parser.h index fee385c..bbcd108 100644 --- a/mixlib/xmix_parser.h +++ b/mixlib/xmix_parser.h @@ -57,6 +57,12 @@ typedef struct ins_node_  /* functions to manipulate mix_parser_t during compilation */  /* symbol table */ +/* Define a new symbol with given value  + * and update previously set refs to this symbol  + */ +extern mix_parser_err_t +mix_parser_define_symbol_value (mix_parser_t *parser, const gchar *name, +				mix_word_t value);  /* Define a new symbol with value equal to the current loc_count    * and update previously set refs to this symbol  | 
