[OpenBIOS] r90 - in fcode-utils: detok toke

svn at openbios.org svn at openbios.org
Sat Oct 14 22:19:23 CEST 2006


Author: stepan
Date: 2006-10-14 22:19:21 +0200 (Sat, 14 Oct 2006)
New Revision: 90

Modified:
   fcode-utils/detok/decode.c
   fcode-utils/detok/detok.c
   fcode-utils/toke/dictionary.c
   fcode-utils/toke/scanner.c
   fcode-utils/toke/strsubvocab.c
   fcode-utils/toke/strsubvocab.h
   fcode-utils/toke/toke.c
   fcode-utils/toke/tokzesc.c
   fcode-utils/toke/tokzesc.h
   fcode-utils/toke/usersymbols.c
   fcode-utils/toke/usersymbols.h
   fcode-utils/toke/vocabfuncts.h
Log:
merge David Paktor's changes for toke 1.0.1


Modified: fcode-utils/detok/decode.c
===================================================================
--- fcode-utils/detok/decode.c	2006-10-14 20:18:07 UTC (rev 89)
+++ fcode-utils/detok/decode.c	2006-10-14 20:19:21 UTC (rev 90)
@@ -206,7 +206,7 @@
 	 *            or
 	 *  b) detok is in verbose mode.
 	 */
-       if ( tname == unnamed )
+       if ( strcmp( tname, unnamed) == 0 )
        {
 		printf("[0x%03x] ", fcode);
        } else {
@@ -355,7 +355,7 @@
 	output_token();
 	token = next_token();
 	printf("0x%03x\n",token);
-	add_token(token, (char *)unnamed);
+	add_token(token, strdup(unnamed));
 }
 
 static void named_token(void)

Modified: fcode-utils/detok/detok.c
===================================================================
--- fcode-utils/detok/detok.c	2006-10-14 20:18:07 UTC (rev 89)
+++ fcode-utils/detok/detok.c	2006-10-14 20:19:21 UTC (rev 90)
@@ -184,6 +184,7 @@
 		close_stream();
 		
 		optind++;
+		reset_dictionary();
 	}
 	
 	printf("\n");

Modified: fcode-utils/toke/dictionary.c
===================================================================
--- fcode-utils/toke/dictionary.c	2006-10-14 20:18:07 UTC (rev 89)
+++ fcode-utils/toke/dictionary.c	2006-10-14 20:19:21 UTC (rev 90)
@@ -212,61 +212,6 @@
 
 /* **************************************************************************
  *
- *      Function name:  exists_in_core
- *      Synopsis:       Confirm whether the given name exists in the
- *                      Global (aka "core") Vocabulary.  Search the
- *                      Global Vocabulary exclusively.
- *
- *      Inputs:
- *         Parameters:
- *             name                      The name for which to look
- *         Local Static Variables:
- *             global_voc_dict_ptr       "Tail" of Global Vocabulary
- *
- *      Outputs:
- *         Returned Value:               TRUE if name is found.
- *
- **************************************************************************** */
-
-bool exists_in_core( char *name)
-{
-    return exists_in_tic_vocab( name, global_voc_dict_ptr );
-}
-
-/* **************************************************************************
- *
- *      Function name:  handle_core_word
- *      Synopsis:       Perform a function in the "Global" Vocabulary and
- *                      indicate whether the name is valid.
- *
- *      Inputs:
- *         Parameters:
- *             tname                     The name to handle
- *         Local Static Variables:
- *             global_voc_dict_ptr       "Tail" of Global Vocabulary
- *
- *      Outputs:
- *         Returned Value:   TRUE if the given name is valid in Global Vocab
- *
- *      Error Detection:
- *          If the name is not in the "Global" Vocabulary, let the calling
- *              routine determine whether to print an error message or to
- *              try it out as a number.
- *
- **************************************************************************** */
-
-bool handle_core_word( char *tname )
-{
-    bool retval;
-
-    retval = handle_tic_vocab( tname, global_voc_dict_ptr );
-
-    return ( retval ) ;
-}
-
-
-/* **************************************************************************
- *
  *      Function name:  create_core_alias
  *      Synopsis:       Create, in the "Global" ("core") Vocabulary, an entry
  *                          for NEW_NAME that behaves the same as the latest
@@ -618,43 +563,8 @@
     return( retval);
 	}
 
-
 /* **************************************************************************
  *
- *      Function name:  handle_current
- *      Synopsis:       Perform a function in the current device-node vocab,
- *                      if one is in effect, or in the "Global" Vocabulary.
- *                      Indicate whether the name is valid.
- *
- *      Inputs:
- *         Parameters:
- *             tname                      The name to handle
- *         Global Variables:
- *             current_definitions        Device-Node (or Global) Vocabulary
- *                                            currently in effect.
- *             scope_is_global            TRUE if "global" scope is in effect
- *         Local Static Variables:
- *
- *      Outputs:
- *         Returned Value:                TRUE if the given name is valid
- *
- **************************************************************************** */
-
-bool handle_current( char *tname )
-{
-    bool retval = handle_tic_vocab( tname, *current_definitions );
-
-    if ( INVERSE(retval) && INVERSE(scope_is_global) )
-    {
-	retval = handle_core_word( tname );
-    }
-    return ( retval );
-
-}
-
-
-/* **************************************************************************
- *
  *      Function name:  lookup_in_dev_node
  *      Synopsis:       Return a pointer to the data-structure of the
  *                          named word in the Current device node, if
@@ -1778,41 +1688,6 @@
 
 /* **************************************************************************
  *
- *      Function name:  handle_shared_word
- *      Synopsis:       Perform the function associated with the given name
- *                      only if it is a "Shared Word".  Indicate if it was.
- *
- *      Inputs:
- *         Parameters:
- *             tname                The "target" name for which to look
- *
- *      Outputs:
- *         Returned Value:          TRUE if the name is a valid "Shared Word"
- *
- *      Extraneous Remarks:
- *          This is very similar to a call to  handle_tic_vocab() except
- *              for the additional filtering for a "Shared Word" definer.
- *
- **************************************************************************** */
-
-bool handle_shared_word( char *tname )
-{
-    tic_hdr_t *found ;
-    bool retval = FALSE;
-    
-    found = lookup_shared_word( tname );
-    if ( found != NULL )
-    {
-        found->funct(found->pfield);
-	retval = TRUE;
-    }
-
-    return ( retval ) ;
-}
-
-
-/* **************************************************************************
- *
  *      Function name:  lookup_shared_f_exec_word
  *      Synopsis:       Return a pointer to the data-structure of the named
  *                      word, only if it is a "Shared F-Exec Word"

Modified: fcode-utils/toke/scanner.c
===================================================================
--- fcode-utils/toke/scanner.c	2006-10-14 20:18:07 UTC (rev 89)
+++ fcode-utils/toke/scanner.c	2006-10-14 20:19:21 UTC (rev 90)
@@ -3243,7 +3243,7 @@
     bool retval = FALSE;
     char *defn_type_name;
 
-    /*  If already inside a colon, ERROR and discontinueprocessing    */
+    /*  If already inside a colon, ERROR and discontinue processing    */
     /*  If an alias to a definer is used, show the name of the alias  */
     if ( test_in_colon(statbuf, FALSE, TKERROR, NULL) ) 
     {
@@ -5011,9 +5011,9 @@
 	
 	case VERSION1:
 	case FCODE_V1:
+		fcode_starter( "version1", 1, FALSE) ;
 		tokenization_error( INFO, "Using version1 header "
 		    "(8-bit offsets).\n");
-		fcode_starter( "version1", 1, FALSE) ;
 		break;
 	
 	case START1:

Modified: fcode-utils/toke/strsubvocab.c
===================================================================
--- fcode-utils/toke/strsubvocab.c	2006-10-14 20:18:07 UTC (rev 89)
+++ fcode-utils/toke/strsubvocab.c	2006-10-14 20:19:21 UTC (rev 90)
@@ -45,14 +45,11 @@
 /* **************************************************************************
  *
  *      Functions Exported:
- *          init_str_sub_vocab     Initialize a String-Substitution vocab
  *          add_str_sub_entry      Add an entry to a Str-Subst vocab
- *          lookup_str_sub         Look for a name in a String-Substitution
- *                                     vocab, return the substitution string.
+ *          lookup_str_sub         Look for a name in a String-Subst'n vocab;
+ *                                     return a pointer to the structure.
  *          exists_in_str_sub      Confirm whether a given name exists in a
  *                                     String-Substitution vocabulary
- *          create_str_sub_alias   Duplicate the behavior of one name with
- *                                     another name.  Return a "success" flag.
  *          reset_str_sub_vocab    Reset a given Str-Subst vocab to its initial
  *                                    "Built-In" position.
  *
@@ -72,34 +69,6 @@
 
 /* **************************************************************************
  *
- *      Function name:  init_str_sub_vocab
- *      Synopsis:       Dynamically initialize the link-pointers
- *                          of the.given String-Substitution vocabulary
- *      
- *      Inputs:
- *         Parameters:
- *             str_sub_vocab_tbl   Pointer to the initial Str-Subst vocab array
- *             max_indx            Maximum Index of the initial array.
- *
- *      Outputs:
- *         Returned Value:          None
- *         Global Variables:
- *              The link-fields of the initial Str-Subs vocab array entries
- *                  will be filled in.
- *
- **************************************************************************** */
-
-void init_str_sub_vocab( str_sub_vocab_t *str_sub_vocab_tbl, int max_indx)
-{
-    int indx;
-    for ( indx = 1 ; indx < max_indx ; indx++ )
-    {
-        str_sub_vocab_tbl[indx].next = &str_sub_vocab_tbl[indx-1];
-    }
-}
-
-/* **************************************************************************
- *
  *      Function name:  add_str_sub_entry
  *      Synopsis:       Add an entry to the given Str-Subst vocab
  *      
@@ -155,7 +124,8 @@
 /* **************************************************************************
  *
  *      Function name:  lookup_str_sub
- *      Synopsis:       Look for a name in the given Str-Subst vocabulary
+ *      Synopsis:       Look for a name in the given Str-Subst vocabulary.
+ *                      Return a pointer to the structure if name was valid
  *      
  *      Inputs:
  *         Parameters:
@@ -163,22 +133,21 @@
  *             str_sub_vocab        The Str-Subst vocab-list
  *
  *      Outputs:
- *         Returned Value:          Pointer to the substitution string, or
- *                                      NULL pointer if name not found.
- *                                  May be NULL if subst'n string is NULL.
+ *         Returned Value:          Pointer to the substitution-string entry
+ *                                      data-structure.  NULL if not found.
  *
  **************************************************************************** */
 
-char *lookup_str_sub( char *tname, str_sub_vocab_t *str_sub_vocab )
+str_sub_vocab_t *lookup_str_sub( char *tname, str_sub_vocab_t *str_sub_vocab )
 {
     str_sub_vocab_t *curr;
-    char *retval = NULL;
+    str_sub_vocab_t *retval = NULL;
 
     for (curr = str_sub_vocab ; curr != NULL ; curr=curr->next)
     {
         if ( strcasecmp(tname, curr->name) == 0 )
 	{
-	    retval = curr->alias;
+	    retval = curr;
 	    break;
 	}
     }
@@ -197,141 +166,21 @@
  *             str_sub_vocab        Pointer to the Str-Subst vocab-list
  *
  *      Outputs:
- *         Returned Value:     TRUE if the name is found
+ *         Returned Value:          TRUE if the name is found
  *
- *      Extraneous Remarks:
- *          Because the Returned Value of lookup_str_sub() may be NULL for 
- *              other reasons than that the name was not found, we cannot
- *              rely on that routine, and must replicate the outer-shell
- *              of its structure.
- *
  **************************************************************************** */
 
 bool exists_in_str_sub( char *tname, str_sub_vocab_t *str_sub_vocab )
 {
-    str_sub_vocab_t *curr;
     bool retval = FALSE;
+    str_sub_vocab_t *found = NULL;
 
-    for (curr = str_sub_vocab ; curr != NULL ; curr=curr->next)
+    found = lookup_str_sub( tname, str_sub_vocab );
+    if ( found != NULL )
     {
-        if ( strcasecmp(tname, curr->name) == 0 )
-	{
-	    retval = TRUE;
-	    break;
-	}
+        retval = TRUE;
     }
     return ( retval );
 
 }
 
-/* **************************************************************************
- *
- *      Function name:  create_str_sub_alias
- *      Synopsis:       Create an Alias in a String-Substitution vocabulary
- *                          Return a "success" flag.
- *
- *      Associated FORTH word:                 ALIAS
- *
- *      Inputs:
- *         Parameters:
- *             old_name             Name of existing entry
- *             new_name             New name for which to create an entry
- *             *str_sub_vocab       Pointer to "tail" of Str-Subst vocab-list
- *
- *      Outputs:
- *         Returned Value:          TRUE if  old_name  found in str_sub_vocab
- *         Supplied Pointers:
- *             *str_sub_vocab       Will be updated to point to the new entry
- *         Memory Allocated:
- *             A copy of the "old" name's substitution string.
- *         When Freed?
- *             When reset_str_sub_vocab() is applied to the same vocab-list.
- *                 In some instances, the new entry will be freed when the
- *                 device-node in which it was created is "finish"ed; in
- *                 others, only on termination of the program.
- *
- *      Process Explanation:
- *          The "new" name is presumed to point to a stable memory-space.
- *          If the given "old" name exists in the given Str-Subst vocab-list,
- *              duplicate the substitution string into newly-allocated memory
- *              and pass the duplicated string and the "new" name along to
- *              the  add_str_sub_entry()  routine and return TRUE.
- *          If the given "old" name does not exist in the given vocab-list,
- *              return FALSE.
- *
- *      Extraneous Remarks:
- *          This neatly bypasses the question of re-aliasing...  ;-)
- *
- *          We can rely on testing for a returned NULL from lookup_str_sub()
- *              because we won't be applying this routine to any vocabulary
- *              that permits a NULL in its substitution string.
- *
- **************************************************************************** */
-
-bool create_str_sub_alias(char *new_name,
-                              char *old_name,
-			          str_sub_vocab_t **str_sub_vocab )
-{
-    bool retval = FALSE;
-    char *old_subst_str = lookup_str_sub( old_name, *str_sub_vocab );
-    if ( old_subst_str != NULL )
-    {
-        char *new_subst_str = strdup(old_subst_str );
-	add_str_sub_entry(new_name, new_subst_str, str_sub_vocab );
-	retval = TRUE ;
-    }
-
-    return ( retval );
-}
-
-
-/* **************************************************************************
- *
- *      Function name:  reset_str_sub_vocab
- *      Synopsis:       Reset a given Str-Subst vocab to its initial
- *                         "Built-In" position.
- *      
- *      Inputs:
- *         Parameters:
- *            *str_sub_vocab         Pointer to the Str-Subst vocab-list 
- *             reset_position        Position to which to reset the list
- *
- *      Outputs:
- *         Returned Value:          NONE
- *         Supplied Pointers:
- *             *str_sub_vocab       Reset to given "Built-In" position.
- *         Memory Freed
- *             All memory allocated by user-definitions will be freed
- *
- *      Process Explanation:
- *          The "stable memory-spaces" to which the name and substitution
- *              string pointers point are presumed to have been acquired
- *              by allocation of memory, which is reasonable for entries
- *              created by the user as opposed to the built-in entries,
- *              which we are, in any case, not releasing.
- *          The substitution-string pointer may be null; watch out when
- *              we free() it; not all C implementations forgive that.
- *
- **************************************************************************** */
-
-void reset_str_sub_vocab(
-            str_sub_vocab_t **str_sub_vocab ,
-	             str_sub_vocab_t *reset_position )
-{
-    str_sub_vocab_t *next_t;
-
-    next_t = *str_sub_vocab;
-    while ( next_t != reset_position  )
-    {
-	next_t = (*str_sub_vocab)->next ;
-
-	free( (*str_sub_vocab)->name );
-	if ( !(*str_sub_vocab)->alias )
-	{
-	    free( (*str_sub_vocab)->alias );
-	}
-	free( *str_sub_vocab );
-	*str_sub_vocab = next_t ;
-    }
-}
-

Modified: fcode-utils/toke/strsubvocab.h
===================================================================
--- fcode-utils/toke/strsubvocab.h	2006-10-14 20:18:07 UTC (rev 89)
+++ fcode-utils/toke/strsubvocab.h	2006-10-14 20:19:21 UTC (rev 90)
@@ -55,31 +55,12 @@
 	struct str_sub_vocab *next;
 } str_sub_vocab_t;
 
-#if  0     /*  On the way out   */
-/*
- *          BUILTIN_STR_SUB        Add an entry to the initial Str-Sub vocab.
- *
- *      Arguments:  (Both are strings)
- *          princ         Principal name by which the string is known
- *          subst         Substitution-string that replaces the Principal.
- */
-#define BUILTIN_STR_SUB(princ, subst)    \
-     { princ , subst , (str_sub_vocab_t *)NULL  }
-#endif     /*  On the way out   */
 
-
-void init_str_sub_vocab( str_sub_vocab_t *str_sub_vocab_tbl,
-			            int max_indx);
 void add_str_sub_entry( char *ename,
                         	    char *subst_str,
 			        	str_sub_vocab_t **str_sub_vocab );
-char *lookup_str_sub( char *tname, str_sub_vocab_t *str_sub_vocab );
-bool create_str_sub_alias(char *new_name,
-                        	     char *old_name,
-			        	 str_sub_vocab_t **str_sub_vocab );
+str_sub_vocab_t *lookup_str_sub( char *tname, str_sub_vocab_t *str_sub_vocab );
 bool exists_in_str_sub( char *tname, str_sub_vocab_t *str_sub_vocab );
-void reset_str_sub_vocab( str_sub_vocab_t **str_sub_vocab ,
-	        		     str_sub_vocab_t *reset_position );
 
 
 #endif   /*  _TOKE_STRSUBVOCAB_H    */

Modified: fcode-utils/toke/toke.c
===================================================================
--- fcode-utils/toke/toke.c	2006-10-14 20:18:07 UTC (rev 89)
+++ fcode-utils/toke/toke.c	2006-10-14 20:19:21 UTC (rev 90)
@@ -46,7 +46,7 @@
 #include "stack.h"
 #include "emit.h"
 
-#define TOKE_VERSION "1.0.0"
+#define TOKE_VERSION "1.0.1"
 
 #include "vocabfuncts.h"
 #include "scanner.h"

Modified: fcode-utils/toke/tokzesc.c
===================================================================
--- fcode-utils/toke/tokzesc.c	2006-10-14 20:18:07 UTC (rev 89)
+++ fcode-utils/toke/tokzesc.c	2006-10-14 20:19:21 UTC (rev 90)
@@ -36,10 +36,6 @@
  *      Functions Exported:
  *          init_tokz_esc_vocab      Initialize the relevant vocabulary.
  *          enter_tokz_esc           Enter "Tokenizer Escape" mode
- *          handle_tokz_esc          Perform a function in the
- *                                       "Tokenizer Escape" Vocabulary
- *          exists_in_tokz_esc       Confirm whether a given name exists in 
- *                                       the "Tokz_Esc_Vocabulary"
  *          create_tokz_esc_alias    Add an alias to "Tokenizer Escape" space
  *          reset_tokz_esc           Reset the "Tokenizer Escape" Vocabulary
  *                                      to its "Built-In" position.
@@ -605,37 +601,6 @@
 
 /* **************************************************************************
  *
- *      Function name:  handle_tokz_esc
- *      Synopsis:       Perform a function in the "Tokenizer Escape" Vocabulary
- *                      Indicate whether the name is valid in this vocabulary.
- *                      Handle "Tokenizer Escape" aliases implicitly.
- *
- *      Inputs:
- *         Parameters:
- *             tname                The name to handle
- *         Global Variables:  
- *             tokz_esc_vocab       Pointer to "Tokenizer Escape" Vocabulary 
- *
- *      Outputs:
- *         Returned Value:   TRUE if the given name is valid in tokz_esc
- *
- *      Process Explanation:
- *          Find the name and execute its associated function.
- *          If the name is not in the "Tokenizer Escape" Vocabulary,
- *              let the calling routine determine whether to try it
- *              out as a number or to print an error message.
- *
- **************************************************************************** */
-
-bool handle_tokz_esc( char *tname )
-{
-    bool retval = handle_tic_vocab( tname, tokz_esc_vocab );
-    return ( retval ) ;
-}
-
-
-/* **************************************************************************
- *
  *      Function name:  lookup_tokz_esc
  *      Synopsis:       Return a pointer to the data-structure of the named
  *                      word in the"Tokenizer Escape" Vocabulary
@@ -660,30 +625,6 @@
 
 /* **************************************************************************
  *
- *      Function name:  exists_in_tokz_esc
- *      Synopsis:       Confirm whether a given name exists in the
- *                          "Tokenizer Escape" Vocabulary
- *
- *      Inputs:
- *         Parameters:
- *             name                 The given name to confirm
- *         Global Variables:  
- *             tokz_esc_vocab       Pointer to "Tokenizer Escape" Vocabulary  
- *
- *      Outputs:
- *         Returned Value:     TRUE if name is found,
- *
- **************************************************************************** */
-
-bool exists_in_tokz_esc(char *name)
-{
-    bool retval = exists_in_tic_vocab( name, tokz_esc_vocab );
-    return ( retval );
-}
-
-
-/* **************************************************************************
- *
  *      Function name:  create_tokz_esc_alias
  *      Synopsis:       Create an alias in the "Tokenizer Escape" Vocabulary
  *

Modified: fcode-utils/toke/tokzesc.h
===================================================================
--- fcode-utils/toke/tokzesc.h	2006-10-14 20:18:07 UTC (rev 89)
+++ fcode-utils/toke/tokzesc.h	2006-10-14 20:19:21 UTC (rev 90)
@@ -41,9 +41,7 @@
 void init_tokz_esc_vocab( void );
 bool create_tokz_esc_alias(char *new_name, char *old_name);
 void enter_tokz_esc( void );
-bool handle_tokz_esc( char *tname );
 tic_hdr_t *lookup_tokz_esc(char *name);
-bool exists_in_tokz_esc(char *name);
 void reset_tokz_esc( void );
 void pop_next_fcode( void);
 

Modified: fcode-utils/toke/usersymbols.c
===================================================================
--- fcode-utils/toke/usersymbols.c	2006-10-14 20:18:07 UTC (rev 89)
+++ fcode-utils/toke/usersymbols.c	2006-10-14 20:19:21 UTC (rev 90)
@@ -37,7 +37,7 @@
  *      The syntax for user-defined command-line compilation-control symbols
  *          is <NAME>[=<VALUE>]
  *
- *      The name is always required; the equal-sign and value is optional.
+ *      The name is always required; the equal-sign and value are optional.
  *          If you wish the "value" to contain spaces or quotes, you can
  *          accomplish that using the shell escape conventions.
  *
@@ -65,11 +65,9 @@
  *
  *      Functions Exported:
  *          add_user_symbol            Add a user-defined symbol to the list
- *          lookup_user_symbol         Look for a user-defined symbol, return
- *                                         the assigned value.
  *          exists_as_user_symbol      Confirm whether a given name exists
  *                                         as a user-defined symbol.
- *          eval_user_symbol           Tokenize the value assigned to a user
+ *          eval_user_symbol           Evaluate the value assigned to a user
  *                                         symbol.
  *          list_user_symbols          Print the list of user-defined symbols
  *                                         for the Logfile.
@@ -90,7 +88,7 @@
  *              were created on the command-line; if we ever allow symbols
  *              to be defined in the Source file, they should be as volatile
  *              as anything else that comes from a source file...
- *           Putting source-file-derived user-defined symbols into the Global
+ *           Appending source-file-derived user-defined symbols to the Global
  *              Vocabulary could be a quasi-simple way to accomplish this.)
  *
  *          Enable the definition of user-symbols from the Source file, using
@@ -150,7 +148,7 @@
  *         Memory Allocated:
  *             for the string(s) and the new entry
  *         When Freed?
- *             Never.  Well, only on termination of the program.  User-defined
+ *             Never.  Well, upon termination of the program.  User-defined
  *                 symbols endure for the entire batch of tokenizations.
  *
  *      Process Explanation:
@@ -183,33 +181,6 @@
 
 /* **************************************************************************
  *
- *      Function name:  lookup_user_symbol
- *      Synopsis:       Look for the given name as user-defined symbol, return
- *                          the assigned value.
- *
- *      Inputs:
- *         Parameters:
- *             symb_nam             The name for which to look.
- *         Local Static Variables:
- *             user_symbol_list     Pointer to the list of user-defined symbols.
- *
- *      Outputs:
- *         Returned Value:          Pointer to the "value" string, or NULL
- *                                      pointer if the name was not found.
- *                                  May also be NULL if "value" is NULL.
- *
- **************************************************************************** */
- 
-char *lookup_user_symbol(char *symb_nam)
-{
-    char *symb_valu;
-
-    symb_valu = lookup_str_sub(symb_nam, user_symbol_list );
-    return (symb_valu);
-}
-
-/* **************************************************************************
- *
  *      Function name:  exists_as_user_symbol
  *      Synopsis:       Confirm whether a given name exists
  *                      as a user-defined symbol.
@@ -236,7 +207,7 @@
 /* **************************************************************************
  *
  *      Function name:  eval_user_symbol
- *      Synopsis:       Tokenize the value assigned to a user-symbol.
+ *      Synopsis:       Evaluate the value assigned to a user-symbol.
  *
  *      Associated Tokenizer directive (synonyms):      [DEFINED]
  *                                                      #DEFINED
@@ -251,7 +222,7 @@
  *
  *      Inputs:
  *         Parameters:       
- *             symbol               The User-Defined-Symbol to evaluate
+ *             symb_nam             Name of the User-Defined-Symbol to evaluate
  *         Local Static Variables:
  *             user_symbol_list     Pointer to the list of user-defined symbols.
  *
@@ -262,13 +233,15 @@
  *      Error Detection:
  *          Calling routine is responsible for verifying that the user-symbol
  *              is on the same line as the directive.
- *          WARNING if the symbol is not found or has no assigned value. 
+ *          ERROR if the symbol is not found
+ *          WARNING if the symbol has no assigned value. 
  *
  *      Process Explanation:
- *          Look up the parameter in the User Symbol List, and retrieve
- *              its associated value.
- *          If it is not found, or if it has no associated value, issue
- *              a WARNING and do nothing further.  Otherwise...
+ *          Look up the parameter in the User Symbol List,
+ *          If it is not found, issue an ERROR and do nothing further.
+ *          If it is found, attempt to retrieve its associated value
+ *          If it has no associated value, issue a WARNING and
+ *              do nothing further.  Otherwise...
  *          Interpret the associated value as though it were source.
  *
  *      Still to be done:
@@ -277,16 +250,26 @@
  *
  **************************************************************************** */
 
-void eval_user_symbol(char *symbol )
+void eval_user_symbol( char *symb_nam)
 {
-    char *symb_valu;
-    symb_valu = lookup_user_symbol(symbol );
-    if ( symb_valu == NULL )
+    str_sub_vocab_t *found = NULL;
+
+
+    found = lookup_str_sub( symb_nam, user_symbol_list );
+    if ( found == NULL )
     {
-        tokenization_error ( WARNING,
-	    "No value assigned to command-line symbol %s\n", symbol );
+        tokenization_error ( TKERROR,
+	    "Command-line symbol %s is not defined.\n", symb_nam); 
     }else{
-	eval_string( symb_valu );
+	char *symb_valu = found->alias;
+
+	if ( symb_valu == NULL )
+	{
+            tokenization_error ( WARNING,
+		"No value assigned to command-line symbol %s\n", symb_nam );
+	}else{
+	    eval_string( symb_valu );
+	}
     }
 
 }
@@ -311,13 +294,30 @@
  *          We will:
  *              Allocate a temporary array of pointers.
  *              Step backwards through the linked-list of symbols, and
- *                  enter their pointers into the array.
+ *                  enter their pointers into the array.  The array order
+ *                  reflects the backward-linked order of the linked-list
+ *                  of symbols is kept and searched,
  *              Collect the maximum length of the symbol names.
- *              Step through the array in the reverse order, printing
- *                  as we go.
- *                  Use the max name length to space the equal-signs evenly 
+ *              Step through the array in the reverse order, to follow the
+ *                  order in which the symbols were defined.
+ *                  Check for a duplicate of the current symbol name:
+ *                      Look backwards through the array, at the names we
+ *                          have not yet printed, which were defined later.
+ *                          Since the later-defined value will prevail, the
+ *                          notation should be on the earlier one.
+ *                  Print the current name
+ *                  Use the maximum name-length to space the equal-signs or
+ *                      duplicate-name notation, as required, evenly.
  *              Free the temporary array.
  *
+ *      Revision History:
+ *          Updated Thu, 07 Sep 2006 by David L. Paktor
+ *              Report duplicated symbol names.
+ *
+ *      Still to be done:
+ *          Space the duplicate-name notation evenly; line it up past
+ *               the longest name-with-value.
+ *
  **************************************************************************** */
 
 void list_user_symbols(void )
@@ -346,16 +346,46 @@
 	printf("\nUser-Defined Symbols:\n");
 	while ( indx > 0 )
 	{
+	    bool is_dup;
+	    int dup_srch_indx;
 	    indx--;
 	    curr = symb_ptr[indx];
+
+	    /*  Detect duplicate names.  */
+	    dup_srch_indx = indx;
+	    is_dup = FALSE;
+	    while ( dup_srch_indx > 0 )
+	    {
+		str_sub_vocab_t *dup_cand;
+		dup_srch_indx--;
+		dup_cand = symb_ptr[dup_srch_indx];
+		if ( strcmp( curr->name, dup_cand->name) == 0 )
+		{
+		    is_dup = TRUE;
+		    break;
+		}
+	    }
+
 	    printf("\t%s",curr->name);
-	    if ( curr->alias != NULL )
+
+	    if ( ( curr->alias != NULL ) || is_dup )
 	    {
 	        int strindx;
 		for ( strindx = strlen(curr->name) ;
-		      strindx < maxlen ; strindx++ ) printf(" ");
+		      strindx < maxlen ;
+		      strindx++ )
+		{
+		    printf(" ");
+		}
+	    }
+	    if ( curr->alias != NULL )
+	    {
 		printf(" = %s",curr->alias);
 	    }
+	    if ( is_dup )
+	    {
+		printf(" *** Over-ridden" );
+	    }
 	    printf("\n");
 	}
 	free(symb_ptr);

Modified: fcode-utils/toke/usersymbols.h
===================================================================
--- fcode-utils/toke/usersymbols.h	2006-10-14 20:18:07 UTC (rev 89)
+++ fcode-utils/toke/usersymbols.h	2006-10-14 20:19:21 UTC (rev 90)
@@ -38,7 +38,6 @@
  **************************************************************************** */
 
 void add_user_symbol(char *raw_symb);
-char *lookup_user_symbol(char *symb_nam);
 bool exists_as_user_symbol(char *symb_nam);
 void eval_user_symbol(char *symbol );
 void list_user_symbols(void );

Modified: fcode-utils/toke/vocabfuncts.h
===================================================================
--- fcode-utils/toke/vocabfuncts.h	2006-10-14 20:18:07 UTC (rev 89)
+++ fcode-utils/toke/vocabfuncts.h	2006-10-14 20:19:21 UTC (rev 90)
@@ -56,8 +56,6 @@
 
 
 tic_hdr_t *lookup_core_word( char *tname);
-bool exists_in_core( char *name);
-bool handle_core_word( char *tname );
 bool create_core_alias( char *new_name, char *old_name);
 
 void enter_global_scope( void );
@@ -65,7 +63,6 @@
 
 tic_hdr_t *lookup_current( char *name);
 bool exists_in_current( char *tname);
-bool handle_current( char *tname );
 tic_hdr_t *lookup_in_dev_node( char *tname);
 void add_to_current( char *name,
                            TIC_P_DEFLT_TYPE fc_token,
@@ -81,7 +78,6 @@
 void token_entry_warning( tic_hdr_t *t_entry);
 
 tic_hdr_t *lookup_shared_word( char *tname);
-bool handle_shared_word( char *tname );
 tic_hdr_t *lookup_shared_f_exec_word( char *tname);
 
 void init_dictionary( void );




More information about the OpenBIOS mailing list