[OpenBIOS] r100 - fcode-utils/toke

svn at openbios.org svn at openbios.org
Mon Oct 30 10:48:34 CET 2006


Author: stepan
Date: 2006-10-30 10:48:28 +0100 (Mon, 30 Oct 2006)
New Revision: 100

Modified:
   fcode-utils/toke/Makefile
   fcode-utils/toke/clflags.c
   fcode-utils/toke/clflags.h
   fcode-utils/toke/devnode.c
   fcode-utils/toke/dictionary.c
   fcode-utils/toke/emit.c
   fcode-utils/toke/emit.h
   fcode-utils/toke/errhandler.c
   fcode-utils/toke/errhandler.h
   fcode-utils/toke/flowcontrol.c
   fcode-utils/toke/macros.c
   fcode-utils/toke/nextfcode.c
   fcode-utils/toke/parselocals.c
   fcode-utils/toke/scanner.c
   fcode-utils/toke/scanner.h
   fcode-utils/toke/stream.c
   fcode-utils/toke/stream.h
   fcode-utils/toke/ticvocab.c
   fcode-utils/toke/ticvocab.h
   fcode-utils/toke/toke.c
   fcode-utils/toke/tokzesc.c
   fcode-utils/toke/tracesyms.c
   fcode-utils/toke/tracesyms.h
   fcode-utils/toke/vocabfuncts.h
Log:
tokenizer v 1.0.2, contribution by David Paktor <dlpaktor at netscape.net>


Modified: fcode-utils/toke/Makefile
===================================================================
--- fcode-utils/toke/Makefile	2006-10-15 20:09:08 UTC (rev 99)
+++ fcode-utils/toke/Makefile	2006-10-30 09:48:28 UTC (rev 100)
@@ -29,7 +29,7 @@
 INCLUDES = -I../shared
 
 # Normal flags
-CFLAGS  = -O2 -Wall -Wno-pointer-sign -fno-strict-aliasing -DSYS_IS_GNU_Linux
+CFLAGS  = -O2 -Wall -Wno-pointer-sign -fno-strict-aliasing 
 LDFLAGS =
 
 # Coverage:

Modified: fcode-utils/toke/clflags.c
===================================================================
--- fcode-utils/toke/clflags.c	2006-10-15 20:09:08 UTC (rev 99)
+++ fcode-utils/toke/clflags.c	2006-10-30 09:48:28 UTC (rev 100)
@@ -104,6 +104,7 @@
 bool obso_fcode_warning = TRUE ;
 bool trace_conditionals = FALSE ;
 bool big_end_pci_image_rev = FALSE ;
+bool allow_ret_stk_interp = TRUE ;
 
 /*  And one to trigger a "help" message  */
 bool clflag_help = FALSE;
@@ -242,7 +243,12 @@
 	    "Save the Vendor's Rev Level field of the PCI Header"
 		" in Big-Endian format" } ,
 
+  { "Ret-Stk-Interp",
+        &allow_ret_stk_interp,
+	"\t\t",
+	    "Allow Return-Stack Operations during Interpretation" } ,
 
+
   /*  Keep the "help" pseudo-flag last in the list  */
   { "help",
         &clflag_help,

Modified: fcode-utils/toke/clflags.h
===================================================================
--- fcode-utils/toke/clflags.h	2006-10-15 20:09:08 UTC (rev 99)
+++ fcode-utils/toke/clflags.h	2006-10-30 09:48:28 UTC (rev 100)
@@ -124,6 +124,7 @@
 
 extern bool force_tokens_case;
 extern bool force_lower_case_tokens;
+extern bool allow_ret_stk_interp;
 
 extern bool clflag_help;
 

Modified: fcode-utils/toke/devnode.c
===================================================================
--- fcode-utils/toke/devnode.c	2006-10-15 20:09:08 UTC (rev 99)
+++ fcode-utils/toke/devnode.c	2006-10-30 09:48:28 UTC (rev 100)
@@ -580,7 +580,7 @@
 	}
 	if ( grandpa != NULL )
 	{
-	    char as_what_buf[32] = "";
+	    char as_what_buf[AS_WHAT_BUF_SIZE] = "";
 	    if ( as_a_what( found->fword_defr, as_what_buf) )
 	    {
 		strcat( as_what_buf, " ");

Modified: fcode-utils/toke/dictionary.c
===================================================================
--- fcode-utils/toke/dictionary.c	2006-10-15 20:09:08 UTC (rev 99)
+++ fcode-utils/toke/dictionary.c	2006-10-30 09:48:28 UTC (rev 100)
@@ -50,6 +50,7 @@
 #include "errhandler.h"
 #include "tokzesc.h"
 #include "conditl.h"
+#include "tracesyms.h"
 
 /* **************************************************************************
  *
@@ -87,10 +88,48 @@
  *          Begin development of implementation of a way to define both (all?)
  *              types of definitions in a single  tic_hdr_t  type vocabulary.
  *
+ *          Wed, 04 Oct 2006 by David L. Paktor
+ *          Issue a message when a name on the trace list is invoked (as well
+ *              as when it is created), but keep a limit on the speed penalty.
+ *              (I.e., don't scan the trace-list for every symbol invoked.)
+ *              We will scan the trace-list for every pre-defined symbol during
+ *              initialization of the built-in vocabularies' lists, but that
+ *              occurs only once...
+ *
  **************************************************************************** */
 
 
+/* **************************************************************************
+ *
+ *          Global Variables Exported
+ *
+ *     scope_is_global      Indication that "global" scope is in effect
+ *
+ *     define_token        Normally TRUE, but if the definition in progress
+ *               occurs inside a control-structure, (which is an Error), we
+ *               make this FALSE.  We will allow the definition to proceed
+ *               (in order to avoid "cascade" errors and so that other errors
+ *               can be recognized normally) but we will use this to suppress
+ *               adding the new definition's token to the vocab.  We also use
+ *               this to suppress the actions of "hide_..." and "reveal..."
+ *               because if the token wasn't added to the vocabulary, there's
+ *               nothing to find that needed to be "hidden"...
+ *
+ **************************************************************************** */
 
+bool scope_is_global = FALSE;
+bool define_token = TRUE;      /*    TRUE = Normal definition process;
+                                *        FALSE when definition is an Error.
+                                *        We enter definition state anyway,
+                                *            but must still suppress:
+                                *        (1) adding an entry for the token
+                                *            to the vocab,
+                                *        (2) "hiding" it at first, and
+                                *        (3) "revealing" it later.
+                                *  
+                                *    Makes for more "normal" error- detection...
+                                */
+
 /* **************************************************************************
  *
  *      We will be creating several different lists of initial built-in
@@ -170,6 +209,8 @@
 
 /* **************************************************************************
  *
+ *          Internal Static Variables
+ *
  *      We'll be initializing the lists later, but will be referencing
  *          the pointers sooner, so we need to declare the pointers here.
  *
@@ -278,20 +319,20 @@
 #define FC_TOKEN_FUNC  emit_fc_token
 
 #define BUILTIN_FCODE( tok, nam)   \
-     VALPARAM_TIC(nam, FC_TOKEN_FUNC, tok , UNSPECIFIED )
+     VALPARAM_TIC(nam, FC_TOKEN_FUNC, tok , UNSPECIFIED, TRUE )
 
 /*  Built-in FCodes with known definers:  */
 #define BI_FCODE_VALUE( tok, nam)   \
-     VALPARAM_TIC(nam, FC_TOKEN_FUNC, tok , VALUE )
+     VALPARAM_TIC(nam, FC_TOKEN_FUNC, tok , VALUE, TRUE )
 
 #define BI_FCODE_VRBLE( tok, nam)   \
-     VALPARAM_TIC(nam, FC_TOKEN_FUNC, tok , VARIABLE )
+     VALPARAM_TIC(nam, FC_TOKEN_FUNC, tok , VARIABLE, TRUE )
 
 #define BI_FCODE_DEFER( tok, nam)   \
-     VALPARAM_TIC(nam, FC_TOKEN_FUNC, tok , DEFER )
+     VALPARAM_TIC(nam, FC_TOKEN_FUNC, tok , DEFER, TRUE )
 
 #define BI_FCODE_CONST( tok, nam)   \
-     VALPARAM_TIC(nam, FC_TOKEN_FUNC, tok , CONST )
+     VALPARAM_TIC(nam, FC_TOKEN_FUNC, tok , CONST, TRUE )
 
 /* **************************************************************************
  *
@@ -322,10 +363,10 @@
 #define OBSO_FC_FUNC  obsolete_fc_token
 
 #define OBSOLETE_FCODE( tok, nam)   \
-     VALPARAM_TIC(nam, OBSO_FC_FUNC, tok , UNSPECIFIED )
+     VALPARAM_TIC(nam, OBSO_FC_FUNC, tok , UNSPECIFIED, TRUE )
 
 #define OBSOLETE_VALUE( tok, nam)   \
-     VALPARAM_TIC(nam, OBSO_FC_FUNC, tok , VALUE )
+     VALPARAM_TIC(nam, OBSO_FC_FUNC, tok , VALUE, TRUE )
 
 
 /* **************************************************************************
@@ -457,10 +498,7 @@
  **************************************************************************** */
 
 static tic_hdr_t **save_device_definitions;
-/* Export the indication that "global" scope is in effect  */
-bool scope_is_global = FALSE;
 
-
 void enter_global_scope( void )
 {
     if ( scope_is_global )
@@ -626,20 +664,24 @@
  *             name                      The name of the new entry
  *             fc_token                  The new entry's assigned FCode-number
  *             fw_definer                The new entry's definer
- *             define_token              If FALSE, suppress adding the entry,
- *                                           but preserve the side-effect of
- *                                           setting  save_current 
  *         Global Variables:
  *             current_definitions       Pointer to pointer to "tail" of the
  *                                           Vocabulary currently in effect;
  *                                           either Device-node or Global.
+ *             define_token              TRUE = Normal definition process;
+ *                                           FALSE if def'n is an Error.
+ *                                           Suppress adding entry to vocab;
+ *                                           Display "failure" Trace-note
+ *                                           and Duplicate-Name Warning.
  *
  *      Outputs:
  *         Returned Value:               NONE
  *         Global Variables:
  *             *current_definitions    Updated with the new entry
  *         Local Static Variables:
- *             save_current            Pointer to previous entry
+ *             save_current            Saved state of  current_definitions
+ *                                         before the new entry is added,
+ *                                         to permit "hide" and "reveal".
  *         Memory Allocated
  *             For the new entry's copy of the name.
  *         When Freed?
@@ -653,34 +695,38 @@
  *          All user-defined words have the same action, i.e., emitting
  *              the assigned FCode-number.  The new entry's "parameter
  *              field" size is, of course, zero; the "ignore-function"
- *              is NULL.
+ *              is NULL, and the entry has a single-token FCode number.
  *
  *      Extraneous Remarks:
- *          The  define_token  parameter is a late addition, necessitated
- *              by the decision to continue processing after an erroneous
+ *          The  define_token  input is a late addition, necessitated by
+ *              the decision to continue processing after an erroneous
  *              attempt to create a definition inside a control-structure,
  *              in order to catch other errors. 
  *            
- *
  **************************************************************************** */
 
 void add_to_current( char *name,
                            TIC_P_DEFLT_TYPE fc_token,
-			       fwtoken definer,
-			           bool define_token)
+			       fwtoken definer)
 {
-    save_current = *current_definitions;
     if ( define_token )
 {
 	char *nu_name = strdup( name);
+
+	save_current = *current_definitions;
 	add_tic_entry( nu_name, FC_TOKEN_FUNC, fc_token,
-			   definer, 0 , NULL, current_definitions );
+			   definer, 0 , TRUE , NULL, current_definitions );
+    }else{
+	trace_create_failure( name, NULL, fc_token);
+	warn_if_duplicate( name);
     }
 }
 
 
 void hide_last_colon ( void )
 {
+    if ( define_token )
+    {
     tic_hdr_t *temp_vocab;
 
     /*  The  add_to_current()  function will have been called before this
@@ -692,16 +738,20 @@
     temp_vocab = save_current ;
     save_current = *current_definitions;
     *current_definitions = temp_vocab;
+    }
 
 }
 
 void reveal_last_colon ( void )
 {
+    if ( define_token )
+    {
     /*  We call this function either when the colon-definition is
      *      completed, or when "recursive"-ness is intentional.
      */
     *current_definitions = save_current ;
 }
+}
 
 
 /* **************************************************************************
@@ -724,6 +774,15 @@
  *             current_definitions        Device-node vocabulary currently
  *                                            in effect.
  *             scope_is_global            TRUE if "global" scope is in effect
+ *             split_alias_message        Message-type for announcement that
+ *                                            the "new" name was created in
+ *                                            a different vocabulary than where
+ *                                            the "old" name was found, if so
+ *                                            be.  (See "Rule 3", below).  An
+ *                                            Advisory, normally, but if either
+ *                                            of the names is being Traced, the
+ *                                            create_split_alias() routine will
+ *                                            change it to a Trace-Note.
  *         Local Static Variables:
  *             global_voc_dict_ptr        "Tail" of Global Vocabulary
  *
@@ -766,35 +825,52 @@
  *
  *          And one other thing:
  *              We will always make the alias's  pfld_size  zero.  See the
- *              prolog for  create_tic_alias()  in  ticvocab.c  for details...
+ *              prolog for  create_split_alias()  in  ticvocab.c  for details...
  *
  *      Extraneous Remarks:
- *          I will stretch the rules of well-structured code here, too.
+ *          I tried stretching the rules of well-structured code, but
+ *              I'm finding that there is a _good_reason_ for them...
  *
  **************************************************************************** */
 
 bool create_current_alias( char *new_name, char *old_name )
 {
     bool retval = FALSE;
+    bool split_alias = FALSE;
 
+    /*  Rules 1 & 2 are implemented in the same code.  */
     if ( create_tic_alias( new_name, old_name, current_definitions) )
     {
-	 return ( TRUE );
-    }
-    
+	 retval = TRUE;
+    }else{
     if ( INVERSE(scope_is_global) )
     {
-	tic_hdr_t *found = lookup_core_word( old_name );
-	if ( found != NULL )
-	{
-	    add_tic_entry( new_name, found->funct,
-			       found->pfield.deflt_elem,
-				   found->fword_defr,
-				       0, found->ign_func,
+	    /*  Rule 3.
+	     *  Because the vocab into which the new definition will go is
+	     *      not the same as the one in which the old name was found,
+	     *      we cannot call  create_tic_alias  but must replicate it.
+	     */
+	    /*  Hmmmmmm.....
+	     *  We could get around that by refactoring:  add a parameter,
+	     *      make the vocab to search separate from the one in which to
+	     *      create.  Also, by making it a separate routine, we won't
+	     *      have to disturb the other callers of  create_tic_alias()
+	     *  Yes!  Excellent!  Make it so!
+	     */
+	    split_alias = TRUE;
+	    split_alias_message = INFO;
+	    retval = create_split_alias(
+			 new_name, old_name,
+			     &global_voc_dict_ptr,
 					   current_definitions );
-	    retval = TRUE;
+	}
+    }
+    
+    if ( retval )
 	    {
-		tokenization_error( INFO,
+	if ( split_alias )
+	{
+	    tokenization_error( split_alias_message,
 		   "%s is a Global definition, but its alias, %s, "
 		       "will only be defined %s",
 			   strupr( old_name), new_name,
@@ -802,7 +878,6 @@
 		show_node_start();
 	    }
 	}
-    }
 
     return ( retval );
 }
@@ -1347,19 +1422,30 @@
  *
  *      Process Explanation:
  *          We cannot rely on the "definer" field to indicate whether
- *              it is a single-token entry; instead, we will look at
- *              the associated function.
- *          Keep this routine here to avoid needing to export the names
- *              of the permitted functions or their synonymous macros.
- *              If we ever need to change it, we can do so at a single
- *              point of maintenance.
- *          Because the entry might have been found in the initial list
- *              of entries to the "FCode-Tokens" list, we need to check
- *              whether the associated function is either the general
- *              single-token emitting function,  FC_TOKEN_FUNC , or the
- *              function  OBSO_FC_FUNC , which presents a message before
- *              emitting, but is still a valid single-token function.
+ *              it is a single-token entry, and there too many possible
+ *              associated functions to be practical; instead we will
+ *              look at the  is_token  flag of the data structure.
  *
+ *      Revision History:
+ *          Updated Mon, 25 Sep 2006 by David L. Paktor
+ *              Previously operated by examining the function associated
+ *                  with the entry, accepting the general single-token
+ *                  emitting function,  FC_TOKEN_FUNC , and later adding
+ *                  the function  OBSO_FC_FUNC , which presents a message
+ *                  before emitting.  Now the functions that present a
+ *                  message before emitting might be about to proliferate,
+ *                  rendering this implementation strategy impractical (i.e.,
+ *                  ugly to code and too attention-demanding to maintain)
+ *                  Instead, I will introduce a flag into the TIC-entry 
+ *                  data-structure and rely on it.
+ *          Updated Wed, 11 Oct 2006 by David L. Paktor
+ *              Discarded plan to have functions that present a "Trace-Note"
+ *                  message prior to performing their other duties (just too
+ *                  unwieldly all around) in favor of adding a "tracing" flag
+ *                  to the TIC_HDR data-structure.  Could have gone back to
+ *                  doing this the other way, but this is so much neater a
+ *                  solution that I'm keeping it.
+ *
  **************************************************************************** */
 
 bool entry_is_token( tic_hdr_t *test_entry )
@@ -1367,11 +1453,7 @@
     bool retval = FALSE;
     if ( test_entry != NULL )
     {
-	if ( ( test_entry->funct == FC_TOKEN_FUNC )  ||
-	     ( test_entry->funct ==  OBSO_FC_FUNC )  )
-	{
-	    retval = TRUE;
-	}
+	retval = test_entry->is_token;
     }
     return ( retval );
 }
@@ -1836,9 +1918,10 @@
  *      Inputs:
  *         Parameters:                NONE
  *         Global Variables:
+ *             current_device_node        Vocab struct of current dev-node
+ *         Local Static Variables:
  *             global_voc_reset_ptr       Position to which to reset
  *                                            the "Global" Vocabulary
- *             current_device_node        Vocab struct of current dev-node
  *
  *      Outputs:
  *         Returned Value:            NONE

Modified: fcode-utils/toke/emit.c
===================================================================
--- fcode-utils/toke/emit.c	2006-10-15 20:09:08 UTC (rev 99)
+++ fcode-utils/toke/emit.c	2006-10-30 09:48:28 UTC (rev 100)
@@ -30,6 +30,19 @@
  *      Modifications Author:  David L. Paktor    dlpaktor at us.ibm.com
  **************************************************************************** */
 
+/* **************************************************************************
+ *
+ *      Still to be done:
+ *          Re-arrange routine and variable locations to clarify the
+ *              functions of this file and its companion, stream.c 
+ *          This file should be concerned primarily with management
+ *              of the Outputs; stream.c should be primarily concerned
+ *              with management of the Inputs.
+ *          Hard to justify, pragmatically, but will make for easier
+ *              maintainability down the proverbial road...
+ *
+ **************************************************************************** */
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -58,6 +71,20 @@
 
 /* **************************************************************************
  *
+ *      Global Variables Exported:
+ *          opc                       Output Buffer Position Counter
+ *          pci_hdr_end_ob_off        Offsets into Output Buffer of end
+ *                                        of last PCI Header Block structure
+ *            (To help match up the offset printed in Tokenization_error()
+ *              with the offsets shown by the DeTokenizer)
+ *
+ **************************************************************************** */
+
+unsigned int opc                = 0;
+unsigned int pci_hdr_end_ob_off = 0;   /*  0 means "Not initialized"  */
+
+/* **************************************************************************
+ *
  *      Macro to zero-fill a field of the size of the given structure
  *          into the Output Buffer using the  emit_byte()  routine.
  *
@@ -113,8 +140,8 @@
 /* **************************************************************************
  *
  *      Function name:  init_emit
- *      Synopsis:       Initialize Local Static Variables before starting
- *                          Output.
+ *      Synopsis:       Initialize Output-related Local Static and Global
+ *                          Variables before starting Output.
  *                      Exposure as Limited as possible.
  *
  **************************************************************************** */
@@ -126,6 +153,8 @@
     fcode_body_ob_off   = -1;
     pci_hdr_ob_off      = -1;
     pci_data_blk_ob_off = -1;
+    opc                 =  0;
+    pci_hdr_end_ob_off  =  0;
     fcode_written       = FALSE;
     haveend             = FALSE;   /*  Get this one too...  */
 }
@@ -462,13 +491,19 @@
  *      Inputs:
  *         Parameters:                   NONE
  *         Global Variables:        
+ *             opc                       Output Buffer Position Counter      
  *             fcode_start_ob_off        Initted if FCode output has begun
  *             noerrors                  The "Ignore Errors" flag
  *
  *      Outputs:
  *         Returned Value:               NONE
  *         Global Variables:    
- *         FCode Output buffer:
+ *            pci_hdr_end_ob_off         Set to the Output Buffer Position
+ *                                           Counter after the PCI Header
+ *         FCode Output buffer      
+ *            :The beginning of the PCI Header will be entered, waiting for
+ *                 the fields that could not be determined until the end
+ *                 to be filled in.
  *
  *      Error Detection:
  *          An attempt to write a PCI Header after FCode output -- either an
@@ -496,6 +531,8 @@
 	emit_pci_rom_hdr();
 
 	emit_pci_data_block();
+
+	pci_hdr_end_ob_off = opc;
 }
 
 /* **************************************************************************
@@ -561,8 +598,18 @@
 	
 	pci_hdr_ob_off      = -1;
 	pci_data_blk_ob_off = -1;
+	pci_hdr_end_ob_off  =  0;
 }
 
+
+/* **************************************************************************
+ *
+ *      Function name:  finish_headers
+ *      Synopsis:       Fill-in the fields of the FCode- and PCI- Headers
+ *                      that could not be determined until the end.
+ *
+ *************************************************************************** */
+
 void finish_headers(void)
 {
 	if (fcode_hdr_ob_off != -1) finish_fcodehdr();

Modified: fcode-utils/toke/emit.h
===================================================================
--- fcode-utils/toke/emit.h	2006-10-15 20:09:08 UTC (rev 99)
+++ fcode-utils/toke/emit.h	2006-10-30 09:48:28 UTC (rev 100)
@@ -96,6 +96,15 @@
 
 /* ************************************************************************** *
  *
+ *      Global Variables Exported
+ *
+ **************************************************************************** */
+
+extern unsigned int opc;
+extern unsigned int pci_hdr_end_ob_off;
+
+/* ************************************************************************** *
+ *
  *      Function Prototypes / Functions Exported:
  *
  **************************************************************************** */

Modified: fcode-utils/toke/errhandler.c
===================================================================
--- fcode-utils/toke/errhandler.c	2006-10-15 20:09:08 UTC (rev 99)
+++ fcode-utils/toke/errhandler.c	2006-10-30 09:48:28 UTC (rev 100)
@@ -59,7 +59,15 @@
  *
  **************************************************************************** */
 
+/* **************************************************************************
+ *
+ *      Revision History:
+ *          Updated Fri, 13 Oct 2006 by David L. Paktor
+ *          Added "(Output Position ..." to standard message format.
+ *
+ **************************************************************************** */
 
+
 /* **************************************************************************
  *
  *          We will define a set of bit-valued error-types and a
@@ -89,13 +97,18 @@
  *                                  It's a deprecated feature, or one
  *                                  that might be incompatible with
  *                                  other standard tokenizers.
+ *
+ *          Other types of Messages fall into these broad categories:
  *              INFO            Nothing is changed in processing, but
- *                                  an advisory is still in order.
+ *                                  an advisory is still in order.  Omitted
+ *                                  if "verbose" is not specified.
  *              MESSAGE         Message generated by the user.  (Complete;
  *                                  new-line will be added by display routine.)
  *              P_MESSAGE       Partial Message -- Instigated by user, but
  *                                  pre-formatted and not complete.  New-line
  *                                  will be added by follow-up routine.
+ *              TRACER          Message related to the trace-symbols option;
+ *                                  either a creation or an invocation message.
  *
  **************************************************************************** */
 
@@ -108,6 +121,7 @@
 #include "types.h"
 #include "toke.h"
 #include "stream.h"
+#include "emit.h"
 #include "errhandler.h"
 #include "scanner.h"
 
@@ -118,6 +132,9 @@
  *              lineno          Current line-number being processed
  *              noerrors        "Ignore Errors" flag, set by "-i" switch
  *              opc             FCode Output Buffer Position Counter
+ *              pci_hdr_end_ob_off
+ *                              Position in FCode Output Buffer of
+ *                                   end of last PCI Header Block structure
  *              verbose         If true, enable Advisory Messages
  *
  **************************************************************************** */
@@ -139,6 +156,7 @@
  *          warn_count              Count of Warning Messages
  *          info_count              Count of "Advisory" Messages
  *          user_msg_count          Count of User-generated Messages
+ *          trace_msg_count         Count of Trace-Note Messages
  *          fatal_err_exit          Exit code to be used for "Fatal" error.
  *                                       This is a special accommodation
  *                                       for the  safe_malloc  routine.
@@ -147,12 +165,13 @@
 
 static bool  print_msg ;
 static int errs_to_print = ( FATAL | TKERROR | WARNING | 
-                             MESSAGE | P_MESSAGE | FORCE_MSG ) ;
+                             MESSAGE | P_MESSAGE | TRACER | FORCE_MSG ) ;
 static int err_types_found =  0 ;
 static int err_count       =  0 ;
 static int warn_count      =  0 ;
 static int info_count      =  0 ;
 static int user_msg_count  =  0 ;
+static int trace_msg_count =  0 ;
 static int fatal_err_exit  = -1 ;
 static FILE *message_dest;     /*  Would like to init to  ERRMSG_DESTINATION
 				*      here, but the compiler complains...
@@ -186,15 +205,14 @@
     { WARNING,    "Warning"   , "", "s",    &warn_count     , FALSE },
     { INFO,       "Advisor"   , "y", "ies", &info_count     , FALSE },
     { MESSAGE ,   "Message"   , "", "s",    &user_msg_count , TRUE  },
-    { P_MESSAGE , "Message"   , "", "s",    &user_msg_count , FALSE }
+    { P_MESSAGE , "Message"   , "", "s",    &user_msg_count  , FALSE },
+    { TRACER , "Trace-Note"   , "", "s",    &trace_msg_count , FALSE }
 };
 
 static const int num_categories =
     ( sizeof(error_categories) / sizeof(err_category) );
 
 
-#ifdef NEEDS_STRUPR
-
 /* **************************************************************************
  *
  *      Function name:  toup
@@ -328,8 +346,6 @@
 }
 
 
-#endif  /*   NEEDS_STRUPR   */
- 
 /* **************************************************************************
  *
  *      Function name:  init_error_handler
@@ -359,6 +375,7 @@
  *             warn_count              Count of Warning Messages
  *             info_count              Count of "Advisory" Messages
  *             user_msg_count          Count of User-generated Messages
+ *             trace_msg_count         Count of Trace-Note Messages
  *         Other Exotic Effects:
  *             Flush stdout if Error message destination is not stdout, to
  *                 avoid collisions with stderr once Error Messaging begins.
@@ -371,13 +388,18 @@
 
 void init_error_handler( void)
 {
+    int indx ;
+
     message_dest  =  ERRMSG_DESTINATION;
     if ( verbose )  errs_to_print |= INFO ;
     err_types_found = 0 ;
-    err_count = 0 ;
-    warn_count = 0 ;
-    info_count = 0 ;
-    user_msg_count = 0 ;
+
+    /*  Start at indx = 1 to skip resetting FATALs   */
+    for ( indx = 1; indx < num_categories ; indx ++ )
+    {
+	*(error_categories[indx].counter) = 0 ;
+    }
+
     FFLUSH_STDOUT
 }
 
@@ -397,6 +419,11 @@
  *             iname                Name of file currently being processed
  *             lineno               Current line-number being processed
  *             fatal_err_exit       Exit code for "Fatal" error, if applicable.
+ *             opc                  FCode Output Buffer Position Counter
+ *             pci_hdr_end_ob_off
+ *                                  Position in FCode Output Buffer of end
+ *                                       of last PCI Header Block structure
+
  *         Macro:
  *             ERRMSG_DESTINATION        Error message destination;
  *                                           (Development-time switch)
@@ -444,6 +471,11 @@
  *                  Error-Category string also identifies the applicable
  *                  Category Counter; increment it.
  *          Of course, there's no return from a FATAL error; it exits.
+ *          The Message will show:
+ *              The Error-Category (always)
+ *              The Input File-name and Line Number (if input file was opened)
+ *              The Output Buffer Position (if output has begun)
+ *              The PCI-Block Position (if different from Output Buffer Pos'n)
  *
  **************************************************************************** */
 
@@ -490,15 +522,25 @@
     {
         va_list argp;
 
+	fprintf(ERRMSG_DESTINATION, "%s%s:  ",
+             catgy_name, catgy_suffx);
         if ( iname != NULL )
 	{
-	    fprintf(ERRMSG_DESTINATION, "%s%s:  File %s, Line %d.  ",
-        	 catgy_name, catgy_suffx, iname, lineno);
-	}else{
 	    /*  Don't print iname or lineno if no file opened.  */
-	    fprintf(ERRMSG_DESTINATION, "%s%s:  ",
-        	 catgy_name, catgy_suffx);
+	    fprintf(ERRMSG_DESTINATION, "File %s, Line %d.  ",
+        	 iname, lineno);
 	}
+        if ( opc > 0 )
+	{
+	    /*  Don't print Output Position if no output started.  */
+	    fprintf(ERRMSG_DESTINATION, "(Output Position = %d).  ", opc);
+	}
+        if ( pci_hdr_end_ob_off > 0 )
+	{
+	    /*  Don't print PCI-Block Position if no PCI-Block in effect.  */
+	    fprintf(ERRMSG_DESTINATION, "(PCI-Block Position = %d).  ",
+	        opc - pci_hdr_end_ob_off );
+	}
 
         va_start(argp, msg);
         vfprintf(ERRMSG_DESTINATION, msg, argp);
@@ -618,7 +660,7 @@
 
 	if ( may_show_incolon )
 	{
-	    in_last_colon();
+	    in_last_colon( TRUE );
 	}else{
 	    fprintf(message_dest, "\n");
 	}
@@ -765,7 +807,10 @@
  *                      Can be used to finish the line in either case.
  *
  *      Inputs:
- *         Parameters:                   NONE
+ *         Parameters:
+ *             say_in                    If TRUE, lead phrase with " in ".
+ *                                           If FALSE, print even if not
+ *                                            inside a Colon-def'n.
  *         Global Variables:
  *             incolon                   TRUE if Colon-definition is in progress
  *             last_colon_defname        Name of last colon-definition
@@ -787,17 +832,17 @@
  *          Because this routine does some of its own printing, it needs
  *              to check the residual state of  print_msg  first.
  *          The calling routine does not need to test   incolon ; it can
- *              call this to end the line in either case.
+ *              call this (with TRUE) to end the line in either case.
  *
  **************************************************************************** */
 
-void in_last_colon( void )
+void in_last_colon( bool say_in )
 {
     if ( print_msg )
     {
-	if ( incolon )
+	if ( incolon || ( ! say_in ) )
 	{
-	    fprintf( message_dest, " in definition of  %s ",
+	    fprintf( message_dest, "%s definition of  %s ", say_in ? " in" : "",
 		strupr( last_colon_defname) );
 	    print_where_started( TRUE, FALSE,
 		last_colon_filename, last_colon_lineno, FALSE);

Modified: fcode-utils/toke/errhandler.h
===================================================================
--- fcode-utils/toke/errhandler.h	2006-10-15 20:09:08 UTC (rev 99)
+++ fcode-utils/toke/errhandler.h	2006-10-30 09:48:28 UTC (rev 100)
@@ -44,6 +44,7 @@
 #define  TKERROR     0x04000000
 #define  WARNING     0x00200000
 #define  INFO        0x00010000
+#define  TRACER      0x00008000
 #define  MESSAGE     0x00000800
 #define  P_MESSAGE   0x00000040
 #define  FORCE_MSG   0x00000001
@@ -55,7 +56,7 @@
 void just_started_at( char * saved_ifile, unsigned int saved_lineno);
 void where_started( char * saved_ifile, unsigned int saved_lineno);
 void just_where_started( char * saved_ifile, unsigned int saved_lineno);
-void in_last_colon( void );
+void in_last_colon( bool say_in );
 _PTR safe_malloc( size_t size, char *phrase);
 bool error_summary( void );   /*  Return TRUE if OK to produce output. */
 
@@ -88,17 +89,7 @@
 #define FFLUSH_STDOUT  /*  Don't need to do anything here  */
 #endif     /*  Switchable error-message destination  */
 
-/*  Some systems don't seem to have  strupr   */
-#ifdef SYS_IS_GNU_Linux
-#define NEEDS_STRUPR
-#endif  /*   SYS_IS_GNU_Linux   */
-#ifdef SYS_IS_AIX
-#define NEEDS_STRUPR
-#endif  /*   SYS_IS_AIX   */
-/*  ???  Should this instead be tuned to Proc'r is PPC ???  Why? */
 
-#ifdef NEEDS_STRUPR
-
 /* **************************************************************************
  *
  *     A necessary hack for systems that don't seem
@@ -114,6 +105,4 @@
 #define strlwr strlower
 
 
-#endif  /*   NEEDS_STRUPR   */
-
 #endif  /*   _TOKE_ERRHANDLER_H   */

Modified: fcode-utils/toke/flowcontrol.c
===================================================================
--- fcode-utils/toke/flowcontrol.c	2006-10-15 20:09:08 UTC (rev 99)
+++ fcode-utils/toke/flowcontrol.c	2006-10-30 09:48:28 UTC (rev 100)
@@ -479,7 +479,7 @@
 	retval = FALSE;
 	tokenization_error ( TKERROR,
 		"Control-Stack underflow at %s", strupr(statbuf) );
-	in_last_colon();
+	in_last_colon( TRUE);
 
 	not_cs_underflow = FALSE;   /*  See expl'n early on in this file  */
     }

Modified: fcode-utils/toke/macros.c
===================================================================
--- fcode-utils/toke/macros.c	2006-10-15 20:09:08 UTC (rev 99)
+++ fcode-utils/toke/macros.c	2006-10-30 09:48:28 UTC (rev 100)
@@ -57,13 +57,13 @@
 #include <string.h>
 #include <errno.h>
 
+#include "macros.h"
 #include "errhandler.h"
 #include "ticvocab.h"
 #include "stream.h"
 #include "scanner.h"
 #include "dictionary.h"
 #include "devnode.h"
-#include "macros.h"
 
 /* **************************************************************************
  *
@@ -297,7 +297,15 @@
 	BUILTIN_MACRO( "blank", 	"bl fill") ,
 	BUILTIN_MACRO( "carret",	"h# d") ,
 	BUILTIN_MACRO( ".d",		"base @ swap h# a base ! . base !") ,
-	BUILTIN_MACRO( "decode-bytes",  ">r over r@ + swap r@ - rot r>") ,
+
+	/*  Note:  The Standard gives:  ">r over r@ + swap r@ - rot r>"
+	 *      as its example of the macro for  decode-bytes
+	 *      But here's one that does the same thing without
+	 *      using return-stack operations.  And it's one step
+	 *      shorter, into the bargain!
+	 */
+	BUILTIN_MACRO( "decode-bytes",  "tuck - -rot 2dup + swap 2swap rot") ,
+
 	BUILTIN_MACRO( "3drop", 	"drop 2drop") ,
 	BUILTIN_MACRO( "3dup",		"2 pick 2 pick 2 pick") ,
 	BUILTIN_MACRO( "erase", 	"0 fill") ,
@@ -473,9 +481,6 @@
 	    tic_hdr_t **target_vocab = current_definitions;
 	    if ( in_tokz_esc ) target_vocab = &tokz_esc_vocab ;
 
-            warn_if_duplicate( macroname);
-	    trace_creation( MACRO_DEF, macroname);
-
 	    /*  Tack on a new-line, so that a remark will appear
 	     *      to be properly terminated.   This might trigger
 	     *      an undeserved multi-line warning if the Macro
@@ -489,7 +494,7 @@
 
 	    add_tic_entry( macroname, EVAL_MAC_FUNC,
 	                       (TIC_P_DEFLT_TYPE)macrobody,
-			           MACRO_DEF, mac_body_len,
+			           MACRO_DEF, mac_body_len, FALSE,
 				       EVAL_MAC_FUNC, target_vocab );
 	    failure = FALSE;
 	}

Modified: fcode-utils/toke/nextfcode.c
===================================================================
--- fcode-utils/toke/nextfcode.c	2006-10-15 20:09:08 UTC (rev 99)
+++ fcode-utils/toke/nextfcode.c	2006-10-30 09:48:28 UTC (rev 100)
@@ -556,8 +556,6 @@
  *      Inputs:
  *         Parameters:
  *             test_fcode                 FCode to be tested
- *         Global Variables:
- *             
  *         Local Static Variables:
  *             ranges_exist               If not TRUE, no need to test
  *             first_fc_range             Start of Ranges to test
@@ -610,7 +608,7 @@
  *         Parameters:
  *             
  *         Global Variables:
- *             nextfcode
+ *             nextfcode            The FCode-number to be assigned
  *         Local Static Variables:
  *             ranges_exist         TRUE if FCode Ranges have been created
  *             first_fc_range       First entry in linked list of Ranges.
@@ -618,7 +616,6 @@
  *
  *      Outputs:
  *         Returned Value:                  NONE
- *         Global Variables:
  *         Local Static Variables:
  *             changes_listed               Reset to FALSE
  *                    One of these two will be set to  nextfcode 

Modified: fcode-utils/toke/parselocals.c
===================================================================
--- fcode-utils/toke/parselocals.c	2006-10-15 20:09:08 UTC (rev 99)
+++ fcode-utils/toke/parselocals.c	2006-10-30 09:48:28 UTC (rev 100)
@@ -78,15 +78,18 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+
+#include "parselocals.h"
 #include "ticvocab.h"
 #include "dictionary.h"
 #include "scanner.h"
-#include "parselocals.h"
 #include "errhandler.h"
 #include "clflags.h"
 #include "stream.h"
+#include "emit.h"
 #include "devnode.h"
 #include "flowcontrol.h"
+#include "tracesyms.h"
 
 /* **************************************************************************
  *
@@ -335,8 +338,8 @@
 
     lnamecopy = strdup( lname);
     add_tic_entry( lnamecopy, invoke_local, lnum,
-		       LOCAL_VAL, 0, NULL, &local_names );
-    trace_creation( LOCAL_VAL, lname);
+		       LOCAL_VAL, 0, FALSE,  NULL,
+			       &local_names );
 }
 
 
@@ -423,7 +426,7 @@
 		    tokenization_error ( TKERROR,
 		        "Excess separator -- %s -- found "
 			    "in Local-Values declaration", statbuf);
-		    in_last_colon();
+		    in_last_colon( TRUE);
 		    continue;
 		}
 	    }
@@ -570,7 +573,7 @@
 	if ( last_local_colon == lastcolon )
 	{
 	    tokenization_error ( TKERROR, "Excess Locals Declaration");
-	    in_last_colon();
+	    in_last_colon( TRUE);
 	    retval = TRUE;
 	}else{
             last_local_colon = lastcolon;

Modified: fcode-utils/toke/scanner.c
===================================================================
--- fcode-utils/toke/scanner.c	2006-10-15 20:09:08 UTC (rev 99)
+++ fcode-utils/toke/scanner.c	2006-10-30 09:48:28 UTC (rev 100)
@@ -82,6 +82,9 @@
 bool haveend      = FALSE;   /*  TRUE if the "end" code was read.     */
 int do_loop_depth = 0;       /*  How deep we are inside DO ... LOOP variants  */
 
+/*  State of headered-ness for name-creation  */
+headeredness hdr_flag = FLAG_HEADERLESS ;  /*  Init'l default state  */
+
 /*  Used for error-checking of IBM-style Locals  */
 int lastcolon;   /*  Location in output stream of latest colon-definition. */
 
@@ -92,6 +95,10 @@
 bool report_multiline = TRUE;      /*  False to suspend multiline warning   */
 unsigned int last_colon_abs_token_no;
 
+           /*  Shared phrases                                               */
+char *in_tkz_esc_mode = "in Tokenizer-Escape mode.\n";
+char *wh_defined      = ", which is defined as a ";
+
 /* **************************************************************************
  *  Local variables
  **************************************************************************** */
@@ -103,13 +110,6 @@
 
 static unsigned int last_colon_do_depth = 0;
 
-/*  State of headered-ness for name-creation  */
-typedef enum headeredness_t {
-       FLAG_HEADERLESS ,
-       FLAG_EXTERNAL ,
-       FLAG_HEADERS }  headeredness ;
-static headeredness hdr_flag = FLAG_HEADERLESS ;  /*  Init'l default state  */
-
 /*  Local variables having to do with:                                      */
 /*       ...  the state of the tokenization                                 */
 static bool is_instance = FALSE;        /*  Is "instance" is in effect?     */
@@ -133,10 +133,7 @@
            /*  Has a gap developed between "instance" and its application?  */
 static bool instance_definer_gap = FALSE;
 
-           /*  Shared phrases                                               */
-static char *in_tkz_esc_mode = "in Tokenizer-Escape mode.\n";
 
-
 /* **************************************************************************
  *
  *      Function name:  skip_ws
@@ -821,7 +818,7 @@
 	unterm_is_colon = FALSE;
     }else{
 	tokenization_error( severity, "Unterminated %s", something);
-	in_last_colon();
+	in_last_colon( TRUE);
     }
     lineno = tmp;
 }
@@ -1349,7 +1346,8 @@
 	 *      -delimiting whitespace character.  Regard any sub-
 	 *      sequent whitespace characters as part of the string
 	 */
-	if (*pc++=='\n') lineno++;
+	if ( *pc == '\n' ) lineno++;
+	pc++;
 
 	got_until_eof = TRUE ;
 
@@ -1564,7 +1562,8 @@
 	{
 	    if ( *pc != '\n') pc++;
 	}else{
-		if (*pc++=='\n') lineno++;
+	    if ( *pc == '\n' ) lineno++;
+	    pc++;
 	    multiline_start = lineno;
 	    check_multiline = TRUE;
 	}
@@ -1914,7 +1913,7 @@
  *
  *      Outputs:
  *         Returned Value:               None
- *         Local Static Variables:
+ *         Global Variables:
  *             hdr_flag                  Adjusted to new setting
  *
  *      Process Explanation:
@@ -2161,7 +2160,7 @@
 
 	tokenization_error( TKERROR,
 	    "%s outside of  %s  structure", strupr(statbuf), deep_do);
-	in_last_colon();
+	in_last_colon( TRUE);
     }
 
 }
@@ -2288,7 +2287,7 @@
 
 	tokenization_error( WARNING,
 	    "Possible Return-Stack %s before %s", what_flow, what_phr);
-	in_last_colon();
+	in_last_colon( TRUE);
 
 	if ( clear_it )
 	{
@@ -2335,7 +2334,7 @@
 	    "Possible Return-Stack access attempt by %s "
 		"without value having been placed there",
 		strupr(statbuf) );
-	in_last_colon();
+	in_last_colon( TRUE);
     }
 }
 
@@ -2462,7 +2461,7 @@
  *
  **************************************************************************** */
 
-static bool definer_name(fwtoken definer, char **reslt_ptr)
+bool definer_name(fwtoken definer, char **reslt_ptr)
 {
     bool retval = TRUE;
     switch (definer)
@@ -2533,6 +2532,11 @@
  *              are needed, they, too, are the responsibility of the
  *              calling routine.  The return value gives a helpful clue.
  *
+ *      Extraneous Remarks:
+ *          We define a Macro -- kept in scanner.h --that will give the
+ *             recommended length for the buffer passed to this routine.
+ *             It will be called  AS_WHAT_BUF_SIZE 
+ *
  **************************************************************************** */
 
 bool as_a_what( fwtoken definer, char *as_what)
@@ -2639,7 +2643,7 @@
  *
  **************************************************************************** */
 
-static char lookup_where_pt1_buf[32];
+static char lookup_where_pt1_buf[AS_WHAT_BUF_SIZE];
 
 tic_hdr_t *lookup_word( char *stat_name, char **where_pt1, char **where_pt2 )
 {
@@ -2883,7 +2887,10 @@
  *
  *      Outputs:
  *         Returned Value:              NONE
- *         Printout:          Error message.  Possible Advisory about
+ *         Printout:
+ *             Error message.
+ *             Possible Advisory about where the word might be found.
+ *             Trace-Note, if the word was on the Trace-List
  *
  *      Error Detection:
  *          Error was detected by the calling routine...
@@ -2911,6 +2918,8 @@
     bool sav_in_tokz_esc = in_tokz_esc;
     in_tokz_esc = INVERSE(sav_in_tokz_esc);
 
+    traced_name_error( stat_name);
+
     found_somewhere = word_exists( stat_name, &where_pt1, &where_pt2);
     if ( found_somewhere )
     {
@@ -3073,88 +3082,6 @@
 
 /* **************************************************************************
  *
- *      Function name:  trace_creation
- *      Synopsis:       If the word being created is on the Trace List,
- *                          display the appropriate message
- *
- *      Inputs:
- *         Parameters:
- *             definer                 Internal token for the defining-word
- *             nu_name                 The word being created
- *         Global Variables:
- *             verbose                 No point in doing all this if we're
- *                                         not showing the message anyway...
- *             in_tokz_esc             TRUE if we are in Tokenizer-Escape mode
- *             scope_is_global         TRUE if "global" scope is in effect
- *             current_device_node     Current dev-node data-struct
- *
- *      Outputs:
- *         Returned Value:             NONE
- *         Printout:
- *             Advisory Message, if the word is on the Trace List.
- *
- *      Process Explanation:
- *          The order of scope-checking is important:
- *              A Local has no scope beyond the definition in which it occurs.
- *              Tokenizer-Escape mode supercedes "Normal" mode, and renders
- *                  moot the differences between Global and Device scope.
- *              Global scope is mutually exclusive with Device scope.
- *              Device scope needs to identify where the Current device-node
- *                  began.
- *
- **************************************************************************** */
-
-void trace_creation( fwtoken definer, char *nu_name)
-{
-    if ( verbose )
-    {
-	if ( is_on_trace_list( nu_name) )
-	{
-            char  as_what[96] = "";
-	    bool show_last_colon = BOOLVAL( definer == LOCAL_VAL);
-
-	    as_a_what( definer, as_what);  /*  No need to check return value. */
-
-	    /*  Scope-checking starts here, unless  show_last_colon  is TRUE.
-	     *  Come out of this with  as_what[]  filled up and
-	     *      terminated with a new-line, if appropriate,
-	     */
-	    while ( ! show_last_colon )
-	    {
-		strcat( as_what, " ");
-
-		if ( in_tokz_esc )
-		{
-		    strcat( as_what, in_tkz_esc_mode);
-		    break;
-		}
-
-		if ( scope_is_global )
-		{
-		    strcat( as_what, "with Global scope.\n");
-		}else{
-		    /*  In Device scope.  Show the Current node.   */
-		    strcat( as_what, in_what_node( current_device_node));
-		}
-		break;
-
-	    }   /*  Destination of BREAKs ...   */
-
-	    tokenization_error(INFO, "Creating %s %s", nu_name, as_what);
-
-	    if ( show_last_colon )
-	    {
-		in_last_colon();
-	    }else{
-		show_node_start();
-	    }
-
-	}
-    }
-}
-
-/* **************************************************************************
- *
  *      Function name:  create_word
  *      Synopsis:       
  *
@@ -3180,6 +3107,15 @@
  *             nextfcode           Incremented  (by bump_fcode() )
  *             statbuf             Advanced to next symbol; must be re-read
  *             pc                  Advanced, then restored to previous value
+ *             define_token        Normally TRUE.  Made FALSE if the definition
+ *                                     occurs inside a control-structure, (which
+ *                                     is an Error); we allow the definition to
+ *                                     proceed (so as to avoid "cascade" errors
+ *                                     and catch other errors normally) but we
+ *                                     suppress adding its token to the vocab,
+ *                                     "hiding" it and "revealing" it (because
+ *                                     there's nothing to hide).
+ *             NOTE:  Make this a Global.  Use it in the routines it controls...
  *         Memory Allocated
  *             Copy of the name being defined, by support routine.
  *             Copy of input-source file name, for error-reporting
@@ -3249,8 +3185,9 @@
     {
 	char defn_type_buffr[32] = "";
 	unsigned int old_lineno = lineno;    /*  For error message  */
-	bool define_token = TRUE;
 
+	define_token = TRUE;
+
 	{   /*  Set up definition-type text for error-message */
 
 	    /*  No need to check the return value  */
@@ -3280,20 +3217,17 @@
 	}else{
 	    bool emit_token_name = TRUE;
 
-	    /*  Handle Tracing of new definitions  */
-	    trace_creation( definer, statbuf);
-
 	    /*  Other Error or Warnings as applicable  */
 	    validate_instance( definer);
-	    warn_if_duplicate( statbuf);
-	    check_name_length( wlen);
 
 	    /*  Bump FCode; error-check as applicable  */
 	    assigning_fcode();
 
 	    /*  Define the new token, unless disallowed  */
-	    add_to_current( statbuf, nextfcode, definer, define_token);
+	    add_to_current( statbuf, nextfcode, definer);
 
+	    check_name_length( wlen);
+
 	    /*  Emit appropriate FCodes:  Type of def'n,   */
 	    switch ( hdr_flag )
 	    {
@@ -3375,7 +3309,7 @@
 static void cannot_apply( char *func_nam, char *targ_nam, fwtoken defr)
 {
     char *defr_name = "" ;
-    const char *defr_phrase = ", which is defined as a " ;
+    char *defr_phrase = wh_defined ;
 
     if ( ! definer_name(defr, &defr_name) )
     {
@@ -3797,24 +3731,29 @@
  *      Outputs:
  *         Returned Value:            TRUE if successful (i.e., no error)
  *         Supplied Pointers:
- *             *tok_entry             The token entry, if no error
+ *             *tok_entry             The token entry, if no error.
+ *                                        Unchanged if error.
  *         Global Variables:
  *             statbuf                The next word in the input stream
  *             pc                     Restored to previous value if error
+ *         Other Effects:
+ *             Display Invocation Message if entry found and is being Traced
  *
  *      Error Detection:
  *          The next word in the input stream is expected to be on the
  *              same line as the directive.  The  get_word_in_line()
  *              routine will check for that.
- *          If the next word in the input stream is not a symbol
- *              for which a single-token FCode number is assigned,
- *              report an ERROR and restore PC to its previous value.
+ *          If the next word in the input stream is a known symbol, but
+ *              not one for which a single-token FCode number is assigned,
+ *              report an ERROR and restore PC to its previous value.  The
+ *              supplied pointer  tok_entry  will remain unaltered.
  *
  **************************************************************************** */
 
 static bool get_token(tic_hdr_t **tok_entry)
 {
     bool retval = FALSE;
+    tic_hdr_t *found;
     u8 *save_pc;
 
     /*  Copy of command being processed, for error message  */
@@ -3837,8 +3776,8 @@
 	 *      need to search again, specifically within the list
 	 *      of FCode Tokens.
 	 */
-	*tok_entry = lookup_with_definer( statbuf, &defr);
-	if ( *tok_entry != NULL )
+	found = lookup_with_definer( statbuf, &defr);
+	if ( found != NULL )
 	{
 	    /*  Built-in FWords can be uniquely identified by their
 	     *      definer,  BI_FWRD_DEFN .  The definer for "shared"
@@ -3848,15 +3787,19 @@
 	     */
 	    if ( defr == BI_FWRD_DEFN )
 	    {
-	        *tok_entry = lookup_token( statbuf);
-		retval = BOOLVAL( *tok_entry != NULL );
+	        found = lookup_token( statbuf);
+		retval = BOOLVAL( found != NULL );
 	    }else{
-		retval = entry_is_token( *tok_entry);
+		retval = entry_is_token( found);
 	    }
 	}
 
-	if ( INVERSE( retval) )
+	handle_invocation( found);
+
+	if ( retval)
 	{
+	    *tok_entry = found;
+	}else{
 	    cannot_apply( cmnd_cpy, strupr(statbuf), defr );
 	    pc = save_pc;
 	}
@@ -4180,9 +4123,7 @@
  *             Two words will be read.
  *
  *      Outputs:
- *         Returned Value:            TRUE if succeeded.
- *         Global Variables:    
- *             statbuf                New name will be copied back into here.
+ *         Returned Value:            NONE
  *         Memory Allocated
  *             The two words will be copied into freshly-allocated memory 
  *                 that will be passed to the create_..._alias()  routine.
@@ -4195,16 +4136,15 @@
  *          If the ALIAS command was given during colon-definition, that
  *              can be handled by this tokenizer, but it is not supported
  *              by IEEE 1275-1994.  Issue a WARNING.
- *          If the new name is a copy of an existing word-name, issue a warning.
  *          If the word to which an alias is to be created does not exist
  *              in the appropriate mode -- relative to "Tokenizer-Escape" --
  *              that is an ERROR.
  *          If "instance" is in effect, the ALIAS command is an ERROR.
+ *          Duplicate-name Warning is handled by support-routine.
  *
  *      Process Explanation:
  *          Get two words -- the new name and the "old" word -- from the
  *              same line of input as the ALIAS command.
- *          Copy the new name back into statbuf for use in trace_creation.
  *          Determine whether or not we are in "Tokenizer-Escape" mode.
  *              Subsequent searches will take place in that same mode.
  *          If the "new" name already exists, issue a warning.
@@ -4234,10 +4174,15 @@
  *      Revision History:
  *          Updated Tue, 10 Jan 2006 by David L. Paktor
  *              Convert to  tic_hdr_t  type vocabularies.
+ *          Updated Fri, 22 Sep 2006 by David L. Paktor
+ *              Move the  warn_if_duplicate()  call to the calling routine.
+ *          Updated Wed, 11 Oct 2006 by David L. Paktor
+ *              Move the Tracing and Duplicate-Warning message functions
+ *                  into support routine.
  *
  **************************************************************************** */
 
-static bool create_alias( void )
+static void create_alias( void )
 {
     char *new_alias ;
 
@@ -4257,30 +4202,6 @@
 {
 	    char *old_name = strdup((char *)statbuf) ;
 
-	    /*  Copy the "new" alias name back into statbuf.
-	     *      This is a HACK ^H^H^H^H awkward way to retrofit
-	     *      support for the  trace_creation()  function.
-	     */
-	    strcpy( statbuf, new_alias);
-
-	    /*  We don't call  trace_creation()  here because we don't
-	     *      know if the creation succeeded.  However, we want
-	     *      to issue a "Duplicate" warning based on the attempt,
-	     *      even if it doesn't succeed.
-	     *  We would prefer to have the "Trace" message precede the 
-	     *      "Duplicate" warning, but we don't think it's worth
-	     *      the effort.  When it becomes worthwhile, the way to
-	     *      do it would be to factor out the block that handles
-	     *      normal-tokenization versus "Tokenizer-Escape" mode;
-	     *      condition the "Trace" message on its success-return, 
-	     *      show the "Duplicate" warning in any case, then show
-	     *      the error-message and do the cleanup conditioned on
-	     *      a failure-return.
-	     *  That will also obviate the need for a return value from
-	     *      this routine and for the copy-back into statbuf.
-	     */
-	    warn_if_duplicate(new_alias);
-
 	    /*
 	     *  Here is where we begin trying the  create_..._alias() 
 	     *      routines for the vocabularies.
@@ -4293,7 +4214,7 @@
 	    if ( in_tokz_esc )
 	    {
 		if ( create_tokz_esc_alias( new_alias, old_name) )
-		    return(TRUE);
+		    return;
 	
 		/*
 		 *  Handle the classes of operatives that are common between
@@ -4306,7 +4227,7 @@
 		    if ( found != NULL )
 		    {
 			if ( create_core_alias( new_alias, old_name) )
-			    return(TRUE);
+			    return;
 		    }
 	}
 	    }else{
@@ -4314,7 +4235,7 @@
 	
 		/*  Can create aliases for "Locals", why not?  */
 		if ( create_local_alias( new_alias, old_name) )
-		    return(TRUE);
+		    return;
 
 		/*
 		 *  All other classes of operatives -- non-fcode forth
@@ -4325,19 +4246,19 @@
 		 */
 
 		if ( create_current_alias( new_alias, old_name) )
-		    return(TRUE);
+		    return;
 	
 	    }    /*  End of separate handling for normal-tokenization mode
         	  *      versus  "Tokenizer-Escape" mode
 		  */
 
 	    /*  It's not a word, a macro or any of that other stuff.  */
+	    trace_create_failure( new_alias, old_name, 0);
 	    tokenized_word_error(old_name);
 	    free(old_name);
 	}
 	free (new_alias);
     }
-    return(FALSE);
 }
 
 	
@@ -4443,6 +4364,9 @@
 	unsigned int sav_lineno = lineno;    /*  For error message  */
 
 	bool handy_toggle = TRUE ;   /*  Various uses...   */
+	bool handy_toggle_too = TRUE ;   /*  Various other uses...   */
+	char *handy_string = "";
+	int handy_int = 0;
 	
 #ifdef DEBUG_SCANNER
 	printf("%s:%d: debug: tokenizing control word '%s'\n",
@@ -4594,10 +4518,7 @@
 		break;
 
 	case ALIAS:
-		if ( create_alias() )
-		{
-		    trace_creation( ALIAS, statbuf);
-		}
+		create_alias();
 		break;
 
 	case CONTROL:
@@ -4916,19 +4837,21 @@
 		break;
 
 	case FUNC_NAME:
-		if ( test_in_colon( statbuf, TRUE, TKERROR, NULL) )
-		{
 		    if ( in_tokz_esc )
 		    {
+		    if ( incolon )
+		    {
 			tokenization_error( P_MESSAGE, "Currently" );
-			in_last_colon();
 		    }else{
+			tokenization_error( P_MESSAGE, "After" );
+		    }
+		    in_last_colon( incolon);
+		    }else{
 		emit_token("b(\")");
 			emit_string( last_colon_defname,
 		            strlen( last_colon_defname) );
 			/*  if ( hdr_flag == FLAG_HEADERLESS ) { WARNING } */
 		    }
-		}
 		break;
 
 	case IFILE_NAME:
@@ -5066,19 +4989,56 @@
 		break;
 
 	case RET_STK_FETCH:
-		ret_stk_access_rpt();
-		emit_token( "r@");
-		break;
-
+		/*  handy_toggle controls reloading other "handy_"s
+		 *  handy_toggle_too controls calling ret_stk_access_rpt()
+		 *  handy_int, if non-zero, passed to bump_ret_stk_depth()
+		 */
+		/*  First in series doesn't need to check handy_toggle  */
+		handy_string = "r@";
+		    /*  Will call ret_stk_access_rpt()       */
+		    /*  handy_toggle_too  is already TRUE    */
+		    /*  Will not call bump_ret_stk_depth()   */
+		    /*  handy_int  is already zero    */
+		handy_toggle = FALSE;
 	case RET_STK_FROM:
-		ret_stk_access_rpt();
-		bump_ret_stk_depth( -1);
-		emit_token( "r>");
-		break;
-
+		if ( handy_toggle )
+		{
+		    handy_string = "r>";
+		    /*  Will call ret_stk_access_rpt()  */
+		    /*  handy_toggle_too  is already TRUE    */
+		    /*  Will call bump_ret_stk_depth( -1)    */
+		    handy_int = -1;
+		    handy_toggle = FALSE;
+		}
 	case RET_STK_TO:
-		bump_ret_stk_depth( 1);
-		emit_token( ">r");
+		if ( handy_toggle )
+		{
+		    handy_string = ">r";
+		    /*  Will not call ret_stk_access_rpt()   */
+		    handy_toggle_too  = FALSE;
+		    /*  Will call bump_ret_stk_depth( 1)     */
+		    handy_int =  1;
+		    /*  Last in series doesn't need to reset handy_toggle  */
+		}
+
+		/*  handy_toggle  is now free for other use  */
+		handy_toggle = allow_ret_stk_interp;
+		if ( ! handy_toggle )
+		{
+		    handy_toggle = test_in_colon(statbuf, TRUE, TKERROR, NULL );
+		}
+		if ( handy_toggle || noerrors )
+		{
+		    if ( handy_toggle_too )
+		    {
+			ret_stk_access_rpt();
+		    }
+		    if ( handy_int != 0 )
+		    {
+			bump_ret_stk_depth( handy_int);
+		    }
+		    emit_token( handy_string);
+		}
 		break;
 
 	case PCIHDR:
@@ -5490,6 +5450,10 @@
     if ( found != NULL )
     {
 	tic_found = found;
+	if ( found->tracing)
+	{
+	    invoking_traced_name( found);
+	}
 	found->funct( found->pfield);
 	return ;
     }

Modified: fcode-utils/toke/scanner.h
===================================================================
--- fcode-utils/toke/scanner.h	2006-10-15 20:09:08 UTC (rev 99)
+++ fcode-utils/toke/scanner.h	2006-10-30 09:48:28 UTC (rev 100)
@@ -61,6 +61,13 @@
 extern bool haveend;	     /*  TRUE if the "end" code was read.     */
 extern int do_loop_depth;    /*  How deep we are inside DO ... LOOP variants */
 
+/*  State of headered-ness for name-creation  */
+typedef enum headeredness_t {
+       FLAG_HEADERLESS ,
+       FLAG_EXTERNAL ,
+       FLAG_HEADERS }  headeredness ;
+extern headeredness hdr_flag;
+
 /*  For special-case error detection or reporting */
 extern int lastcolon;	/*  Loc'n in output stream of latest colon-def'n.  */
 			/*  Used for error-checking of IBM-style Locals    */
@@ -70,6 +77,10 @@
 extern bool report_multiline;          /*  False to suspend multiline warning */
 extern unsigned int last_colon_abs_token_no;
 
+           /*  Shared phrases   */
+extern char *in_tkz_esc_mode;
+extern char *wh_defined; 
+
 /* ************************************************************************** *
  *
  *      Function Prototypes / Functions Exported:
@@ -101,23 +112,27 @@
 tic_hdr_t *lookup_word( char *stat_name, char **where_pt1, char **where_pt2 );
 bool word_exists( char *stat_name, char **where_pt1, char **where_pt2 );
 void warn_if_duplicate ( char *stat_name);
-void trace_creation( fwtoken definer, char *nu_name);
 void tokenize_one_word( signed long wlen );
 void check_name_length( signed long wlen );
+bool definer_name(fwtoken definer, char **reslt_ptr);
 
 void	tokenize( void );
 
 /* **************************************************************************
  *
- *          Macro Name:   FUNC_CPY_BUF_SIZE
- *                        Size of a temporary buffer to retain a copy of
- *                        a function name taken from statbuf, when statbuf
- *                        will be used to return a value, but the function
- *                        name might still be needed for an error message.
+ *          Macros:
+ *    FUNC_CPY_BUF_SIZE   Recommended size of a temporary buffer to retain
+ *                        a copy of a function name taken from statbuf,
+ *                        when  statbuf  will be used to return a value,
+ *                        but the function name might still be needed for
+ *                        an error message.
+ *    AS_WHAT_BUF_SIZE    Recommended size of the buffer passed to the
+ *                        as_a_what() routine.
  *
  **************************************************************************** */
 
 #define FUNC_CPY_BUF_SIZE  40
 
+#define AS_WHAT_BUF_SIZE   32
 
 #endif   /*  _TOKE_SCANNER_H    */

Modified: fcode-utils/toke/stream.c
===================================================================
--- fcode-utils/toke/stream.c	2006-10-15 20:09:08 UTC (rev 99)
+++ fcode-utils/toke/stream.c	2006-10-30 09:48:28 UTC (rev 100)
@@ -55,8 +55,23 @@
  *
  **************************************************************************** */
 
+
 /* **************************************************************************
  *
+ *      Still to be done:
+ *          Re-arrange routine and variable locations to clarify the
+ *              functions of this file and its companion, emit.c 
+ *          This file should be concerned primarily with management
+ *              of the Inputs; emit.c should be primarily concerned
+ *              with management of the Outputs.
+ *          Hard to justify, pragmatically, but will make for easier
+ *              maintainability down the proverbial road...
+ *
+ **************************************************************************** */
+
+
+/* **************************************************************************
+ *
  *          Global Variables Exported
  *              start                 Start of input-source buffer
  *              end                   End of input-source buffer
@@ -64,7 +79,6 @@
  *              iname                 Current Input File name
  *              lineno                Current Line Number in Input File
  *              ostart                Start of Output Buffer
- *              opc                   FCode Output Buffer Position Counter
  *              oname                 Output File name
  *
  **************************************************************************** */
@@ -86,8 +100,8 @@
 /* output pointers */
 u8 *ostart;
 char *oname = NULL;
-unsigned int opc;           /*  Output Position Counter  */
 
+
 /* We want to limit exposure of this v'ble, so don't put it in  .h  file  */
 unsigned int olen;          /*  Length of Output Buffer  */
 /* We want to limit exposure of this Imported Function, likewise.  */
@@ -1373,7 +1387,6 @@
 	olen = OUTPUT_SIZE;
 	ostart=safe_malloc(olen, "initting output buffer");
 
-	opc = 0;
 	init_emit();  /* Init'l'zns needed by our companion file, emit.c  */
 
 	printf("Binary output to %s ", oname);
@@ -1494,7 +1507,10 @@
 	unsigned int rea_len;
 	olen = olen * 2;
 	rea_len = olen;
-	if ( rea_len == 0 )   rea_len = (unsigned int)-1;
+	if ( rea_len == 0 )
+	{
+	    rea_len = (unsigned int)-1;
+	}
 	tokenization_error( INFO,
 	    "Output Buffer overflow.  "
 		"Relocating and increasing to %d bytes.\n", rea_len);

Modified: fcode-utils/toke/stream.h
===================================================================
--- fcode-utils/toke/stream.h	2006-10-15 20:09:08 UTC (rev 99)
+++ fcode-utils/toke/stream.h	2006-10-30 09:48:28 UTC (rev 100)
@@ -52,7 +52,6 @@
 /* output pointers */
 extern char *oname;         /* output file name  */
 
-extern unsigned int opc;    /* output buffer position counter  */
 
 /* **************************************************************************
  *

Modified: fcode-utils/toke/ticvocab.c
===================================================================
--- fcode-utils/toke/ticvocab.c	2006-10-15 20:09:08 UTC (rev 99)
+++ fcode-utils/toke/ticvocab.c	2006-10-30 09:48:28 UTC (rev 100)
@@ -102,8 +102,13 @@
 
 #include <stdlib.h>
 #include <string.h>
+
 #include "ticvocab.h"
 #include "errhandler.h"
+#include "tracesyms.h"
+#include "scanner.h"
+#include "devnode.h"
+#include "vocabfuncts.h"
 
 tic_hdr_t *tic_found;
 
@@ -133,8 +138,10 @@
  *              precede this one in the voacbulary) gets entered into
  *              the link-pointer field of the first element of the array.
  *          For this reason, it is important that all TIC_HDR vocabulary
- *              pointers that will be pased to this routine have their
+ *              pointers that will be passed to this routine have their
  *              initial values explicitly declared NULL. 
+ *          If the user has asked to Trace any built-in name, the support
+ *              routine will set its  tracing  field and dispay a message.
  *
  **************************************************************************** */
 
@@ -147,14 +154,16 @@
     {
         tic_vocab_tbl[indx].next = *tic_vocab_ptr;
 	*tic_vocab_ptr = &tic_vocab_tbl[indx];
+	trace_builtin( &tic_vocab_tbl[indx]);
     }
 }
 
 
 /* **************************************************************************
  *
- *      Function name:  add_tic_entry
- *      Synopsis:       Add an entry to the given TIC_HDR -type vocabulary
+ *      Function name:  make_tic_entry
+ *      Synopsis:       Construct a new entry to a TIC_HDR -type vocab-list
+ *                          but do not add it to a vocabulary
  *
  *      Inputs:
  *         Parameters:
@@ -163,13 +172,15 @@
  *             tparam        The "parameter field" value (may be a pointer)
  *             fw_defr       FWord Token of the entry's Definer
  *             pfldsiz       Size of "param field" (if a pointer to alloc'd mem)
+ *             is_single     TRUE if entry is a single-token FCode
  *             ign_fnc       Pointer to "ignoring" routine for new entry
- *             tic_vocab     Pointer to ptr to "tail" of T.I.C.-type vocab-list 
+ *             trace_this    TRUE if new entry is to be "Traced"
+ *             tic_vocab     Address of the variable that holds the latest
+ *                               pointer to the "tail" of the T.I.C.-type
+ *                               vocab-list to which we are adding.
  *
  *      Outputs:
- *         Returned Value:          NONE
- *         Supplied Pointers:
- *             *tic_vocab           Will point to new entry
+ *         Returned Value:   Pointer to the new entry
  *         Memory Allocated:
  *             For the new entry.
  *         When Freed?
@@ -183,18 +194,27 @@
  *              newly-allocated memory-space.  If the parameter field is
  *              actually a pointer, it, too, is presumed to already have
  *              been allocated.
- *          Memory will be allocated for the entry itself; its pointers
- *              will be entered and the given pointer-to-the-tail-of-the-
- *              -vocabulary will be updated to point to the new entry.
+ *          Memory will be allocated for the entry itself and the given
+ *              data will be placed into its fields.
  *
+ *      Extraneous Remarks:
+ *          This is a retro-fit; it's a factor of the add_tic_entry()
+ *              routine, whose functionality has been expanded to include
+ *              issuing the Trace-Note and Duplication Warning messages.
+ *              Having it separate allows it to be called (internally) by
+ *              create_split_alias(), which has special requirements for
+ *              its call to trace_creation() 
+ *
  **************************************************************************** */
 
-void add_tic_entry( char *tname,
+static tic_hdr_t *make_tic_entry( char *tname,
                         void (*tfunct)(),
                              TIC_P_DEFLT_TYPE tparam,
                                  fwtoken fw_defr,
 				     int pfldsiz,
+                                         bool is_single,
                                          void (*ign_fnc)(),
+                                               bool trace_this,
                                              tic_hdr_t **tic_vocab )
 {
     tic_hdr_t *new_entry;
@@ -205,9 +225,89 @@
     new_entry->funct             =  tfunct;
     new_entry->pfield.deflt_elem =  tparam;
     new_entry->fword_defr        =  fw_defr;
+    new_entry->is_token          =  is_single;
     new_entry->ign_func          =  ign_fnc;
     new_entry->pfld_size         =  pfldsiz;
+    new_entry->tracing           =  trace_this;
 
+    return( new_entry);
+}
+
+
+/* **************************************************************************
+ *
+ *      Function name:  add_tic_entry
+ *      Synopsis:       Add an entry to the given TIC_HDR -type vocabulary;
+ *                          issue the Creation Tracing and Duplicate-Name
+ *                          messages as applicable.
+ *
+ *      Inputs:
+ *         Parameters:
+ *             tname             Pointer to space containing entry's new name
+ *             tfunct            Pointer to the routine the new entry will call
+ *             tparam            The "parameter field" value (may be a pointer)
+ *             fw_defr           FWord Token of the entry's Definer
+ *             pfldsiz           Size of "param field" (if a ptr to alloc'd mem)
+ *             is_single         TRUE if entry is a single-token FCode
+ *             ign_fnc           Pointer to "ignoring" routine for new entry
+ *          NOTE:  No  trace_this  param here; it's only in make_tic_entry()
+ *             tic_vocab         Address of the variable that holds the latest
+ *                                   pointer to the "tail" of the T.I.C.-type
+ *                                   vocab-list to which we are adding.
+ *         Global Variables:
+ *             scope_is_global   TRUE if "global" scope is in effect
+ *                                  (passed to "Trace-Creation" message)
+ *
+ *      Outputs:
+ *         Returned Value:       NONE
+ *         Supplied Pointers:
+ *             *tic_vocab        Will point to new entry
+ *         Printout:
+ *             "Trace-Creation" message
+ *
+ *      Error Detection:
+ *          Warning on duplicate name (subject to command-line control)
+ *
+ *      Process Explanation:
+ *          The entry itself will be created by the  make_tic_entry()  routine.
+ *          This routine will test whether the new name is to be Traced,
+ *              and will pass that datum to the  make_tic_entry()  routine.
+ *          If the new name is to be Traced, issue a Creation Tracing message.
+ *              (We want it to appear first).  Use the new entry.
+ *          Because this routine will not be called for creating aliases, the
+ *              second param to  trace_creation()  is NULL.
+ *          Do the duplicate-name check _before_ linking the new entry in to
+ *              the given vocabulary.  We don't want the duplicate-name test
+ *              to find the name in the new entry, only in pre-existing ones...
+ *          Now we're ready to update the given pointer-to-the-tail-of-the-
+ *              -vocabulary to point to the new entry.
+ *
+ **************************************************************************** */
+
+void add_tic_entry( char *tname,
+                        void (*tfunct)(),
+                             TIC_P_DEFLT_TYPE tparam,
+                                 fwtoken fw_defr,
+				     int pfldsiz,
+                                         bool is_single,
+					   void (*ign_fnc)(),
+					       tic_hdr_t **tic_vocab )
+{
+    bool trace_this = is_on_trace_list( tname);
+    tic_hdr_t *new_entry = make_tic_entry( tname,
+			       tfunct,
+			           tparam,
+				       fw_defr, pfldsiz,
+				           is_single,
+					       ign_fnc,
+						   trace_this,
+						       tic_vocab );
+
+    if ( trace_this )
+    {
+	trace_creation( new_entry, NULL, scope_is_global);
+    }
+    warn_if_duplicate( tname);
     *tic_vocab = new_entry;
 
 }
@@ -221,6 +321,7 @@
  *         Parameters:
  *             tname                The "target" name for which to look
  *             tic_vocab            Pointer to the T. I. C. -type vocabulary
+ *                                      in which to search
  *
  *      Outputs:
  *         Returned Value:          Pointer to the relevant entry, or
@@ -229,8 +330,8 @@
  *      Extraneous Remarks:
  *          We don't set the global  tic_found  here because this routine
  *              is not always called when the found function is going to
- *              be executed; sometimes it is called for error-detection,
- *              for instance...
+ *              be executed; sometimes it is called for error-detection;
+ *              for instance, duplicate-name checking...
  *
  **************************************************************************** */
  
@@ -282,9 +383,11 @@
 
 /* **************************************************************************
  *
- *      Function name:  create_tic_alias
- *      Synopsis:       Create an Alias in a TIC_HDR -type vocabulary
+ *      Function name:  create_split_alias
+ *      Synopsis:       Create an Alias in one TIC_HDR -type vocabulary
+ *                          for a word in (optionally) another vocabulary.
  *                          Return a "success" flag.
+ *                          This is the work-horse for  create_tic_alias()
  *
  *      Associated FORTH word:                 ALIAS
  *
@@ -292,18 +395,25 @@
  *         Parameters:
  *             old_name             Name of existing entry
  *             new_name             New name for which to create an entry
- *             *tic_vocab           Pointer to the "tail" of the
- *                                      T. I. C. -type vocab-list 
+ *             *src_vocab           Pointer to the "tail" of the "Source"
+ *                                      TIC_HDR -type vocab-list 
+ *             *dest_vocab          Pointer to the "tail" of the "Destination"
+ *                                      TIC_HDR -type vocab-list 
  *
  *      Outputs:
- *         Returned Value:          TRUE if  old_name  found in given vocab
+ *         Returned Value:          TRUE if  old_name  found in "Source" vocab
  *         Supplied Pointers:
- *             *tic_vocab           Will be updated to point to the new entry
+ *             *dest_vocab          Will be updated to point to the new entry
  *         Memory Allocated:
  *             For the new entry, by the support routine.
  *         When Freed?
- *             When reset_tic_vocab() is applied to the same vocab-list.
+ *             When reset_tic_vocab() is applied to "Destination" vocab-list.
+ *         Printout:
+ *             "Trace-Creation" message
  *
+ *      Error Detection:
+ *          Warning on duplicate name (subject to command-line control)
+ *
  *      Process Explanation:
  *          Both the "old" and "new" names are presumed to already point to
  *              stable, freshly allocated memory-spaces.
@@ -314,28 +424,92 @@
  *              the reference to the old space will work, and the old
  *              entry's param-field memory space will not be freed with
  *              the alias-entry but only with the "old" entry.
+ *          We will do both the "Creation-Tracing" announcement and the
+ *              Duplicate Name Warning here.  "Tracing" happens either if
+ *              the entry for the old name has its  tracing  flag set, or
+ *              if the new name is on the trace-list.  The "source" vocab
+ *              and the "dest" vocab can only be different when the "old"
+ *              name has defined Global scope.  We will pass that along
+ *              to the  trace_creation()  routine.
+ *          We're doing the "Tracing" and Duplicate-Name functions because
+ *              we're applying the "Tracing" message to the "old" name's
+ *              entry.  Because of this, we must call  make_tic_entry()  to
+ *              bypass  add_tic_entry(), which now does its own "Tracing"
+ *              and Duplicate-Name functions on the new entry.
  *
  **************************************************************************** */
 
-bool create_tic_alias( char *new_name, char *old_name, tic_hdr_t **tic_vocab )
+bool create_split_alias( char *new_name, char *old_name,
+                              tic_hdr_t **src_vocab, tic_hdr_t **dest_vocab )
 {
     tic_hdr_t *found ;
     bool retval = FALSE;
 
-    found = lookup_tic_entry( old_name, *tic_vocab );
+    found = lookup_tic_entry( old_name, *src_vocab );
     if ( found != NULL )
     {
-	add_tic_entry( new_name, found->funct,
+	bool trace_it = found->tracing;
+	if ( ! trace_it )
+	{
+	    trace_it = is_on_trace_list( new_name);
+	}
+	if ( trace_it )
+	{
+	    bool old_is_global = BOOLVAL( src_vocab != dest_vocab );
+	    trace_creation( found, new_name, old_is_global);
+	}
+	warn_if_duplicate( new_name);
+
+	*dest_vocab = make_tic_entry( new_name,
+			   found->funct,
 			   found->pfield.deflt_elem,
-			       found->fword_defr,
-			           0, found->ign_func, tic_vocab );
+				   found->fword_defr, 0,
+			               found->is_token,
+					   found->ign_func,
+					       trace_it,
+						   dest_vocab );
 	retval = TRUE;
     }
 
     return ( retval );
 }
 
+/* **************************************************************************
+ *
+ *      Function name:  create_tic_alias
+ *      Synopsis:       Create an Alias in a TIC_HDR -type 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
+ *             *tic_vocab           Pointer to the "tail" of the
+ *                                      T. I. C. -type vocab-list 
+ *
+ *      Outputs:
+ *         Returned Value:          TRUE if  old_name  found in given vocab
+ *         Supplied Pointers:
+ *             *tic_vocab           Will be updated to point to the new entry
+ *         Memory Allocated:
+ *             For the new entry, by the support routine.
+ *         When Freed?
+ *             When reset_tic_vocab() is applied to the same vocab-list.
+ *
+ *      Process Explanation:
+ *          The given vocabulary is both the "Source" and the "Destination".
+ *              Pass them both to  create_split_alias.
 
+ **************************************************************************** */
+
+bool create_tic_alias( char *new_name, char *old_name, tic_hdr_t **tic_vocab )
+{
+    return ( create_split_alias( new_name, old_name, tic_vocab, tic_vocab ) );
+}
+
+
 /* **************************************************************************
  *
  *      Function name:  handle_tic_vocab

Modified: fcode-utils/toke/ticvocab.h
===================================================================
--- fcode-utils/toke/ticvocab.h	2006-10-15 20:09:08 UTC (rev 99)
+++ fcode-utils/toke/ticvocab.h	2006-10-30 09:48:28 UTC (rev 100)
@@ -52,18 +52,24 @@
  *               The function may re-cast it as needed.
  *          (5)  The "Definer" of the entry; a member of the subset of FWord-
  *               -tokens that may be Definers.
- *          (6)  A Pointer to a routine to be run when the word is encountered
+ *          (6)  A flag indicating whether the item is one for which a
+ *                      single-token FCode number is assigned. 
+ *          (7)  A Pointer to a routine to be run when the word is encountered
  *               in a Conditional Compilation section that is being ignored.
  *               Certain functions still need to be recognized in that state,
  *               and will require special behaviors; those that can be simply
  *               ignored will have a NULL pointer in this field.  The function
  *               in this field, also, takes the "parameter field" item as its
  *               argument and has no return-value.
- *          (7)  The size of the data pointed to by the "parameter field" item,
+ *          (8)  The size of the data pointed to by the "parameter field" item,
  *               if it is a pointer to allocated data; used to allocate space
  *               for a copy of the p.f. when making an alias, and to indicate
  *               whether the space needs to be freed.  Automatic procedures
  *               are too often fooled, so we don't leave things to chance...
+ *          (9)  A flag, set TRUE if the word is on the Trace List, to indicate
+ *               that an Invocation Message should be displayed when the word
+ *               is invoked.
+ *
  *      To accommodate C's insistence on strong-typing, we might need
  *          to define different "parameter field" structure-types; see
  *          description of "Parameter Field as a union", below.
@@ -176,8 +182,10 @@
 	void            (*funct)();      /*  Function for active processing  */
 	tic_param_t       pfield;
 	fwtoken           fword_defr;    /*  FWord Token of entry's Definer  */
+	bool              is_token;      /*  Is entry a single-token FCode?  */
 	void            (*ign_func)();   /*  Function in "Ignored" segment   */
 	int               pfld_size;
+	bool              tracing;       /*  TRUE if Invoc'n Msg required    */
     }  tic_hdr_t ;
 
 /* **************************************************************************
@@ -203,8 +211,10 @@
 	void              (*funct)();    /*  Function for active processing  */
 	tic_fwt_param_t     pfield;
 	fwtoken             fword_defr;  /*  FWord Token of entry's Definer  */
+	bool                is_token;    /*  Is entry a single-token FCode?  */
 	void              (*ign_func)(); /*  Function in "Ignored" segment   */
 	int                 pfld_size;
+	bool                tracing;     /*  TRUE if Invoc'n Msg required    */
     }  tic_fwt_hdr_t ;
 
 
@@ -237,8 +247,10 @@
 	void              (*funct)();
 	tic_mac_param_t     pfield;
 	fwtoken             fword_defr;
+	bool                is_token;    /*  Is entry a single-token FCode?  */
 	void              (*ign_func)();
 	int                 pfld_size;
+	bool                tracing;     /*  TRUE if Invoc'n Msg required    */
     }  tic_mac_hdr_t ;
 
 /* **************************************************************************
@@ -265,8 +277,10 @@
 	void               (*funct)();
 	tic_bool_param_t     pfield;
 	fwtoken              fword_defr;
+	bool                is_token;    /*  Is entry a single-token FCode?  */
 	void               (*ign_func)();
 	int                  pfld_size;
+	bool                 tracing;    /*  TRUE if Invoc'n Msg required    */
     }  tic_bool_hdr_t ;
 
 
@@ -292,10 +306,12 @@
  *   Arguments:
  *       nam      (string)         Name of the entry as seen in the source
  *       func     (routine-name)   Name of internal function to call
+ *       The item is not one for which single-token FCode number is assigned.
  *
  **************************************************************************** */
 #define NO_PARAM_TIC(nam, func )  \
-  { nam , (tic_hdr_t *)NULL , func , { 0 }, UNSPECIFIED , NULL , 0 }
+  { nam , (tic_hdr_t *)NULL , func ,   \
+        { 0 }, UNSPECIFIED , FALSE , NULL , 0 , FALSE }
 
 
 /* **************************************************************************
@@ -307,11 +323,12 @@
  *   Arguments:
  *       nam      (string)         Name of the entry as seen in the source
  *       func     (routine-name)   Name of internal function to call for both
+ *       The item is not one for which single-token FCode number is assigned.
  *
- *
  **************************************************************************** */
 #define NO_PARAM_IGN(nam, func )  \
-  { nam , (tic_hdr_t *)NULL , func , { 0 }, UNSPECIFIED , func , 0 }
+  { nam , (tic_hdr_t *)NULL , func ,   \
+        { 0 }, UNSPECIFIED , FALSE , func , 0 , FALSE }
 
 
 /* **************************************************************************
@@ -331,14 +348,15 @@
  *       func     (routine-name)   Name of internal function to call
  *       pval     (integer)        The "param field" item
  *       definr   (fword_token)    "Definer" of the entry
+ *       is_tok   (bool)           Is the "param" item a single-token FCode?
  *
  *      The "param field" item will be recast to the required default type.
  *
  **************************************************************************** */
 
-#define VALPARAM_TIC(nam, func, pval, definr )  \
+#define VALPARAM_TIC(nam, func, pval, definr, is_tok )  \
     { nam , (tic_hdr_t *)NULL , func ,  \
-        { (TIC_P_DEFLT_TYPE)(pval) }, definr , NULL , 0 }
+        { (TIC_P_DEFLT_TYPE)(pval) }, definr , is_tok , NULL , 0 , FALSE }
 
 
 /* **************************************************************************
@@ -357,16 +375,17 @@
  *       definr   (fword_token)    "Definer" of the entry
  *
  *      The "param field" item will be recast to the required default type.
+ *      The item is not one for which single-token FCode number is assigned.
  *
  **************************************************************************** */
 #define DUALFUNC_TIC(nam, afunc, pval, ifunc, definr )  \
     { nam , (tic_hdr_t *)NULL , afunc ,  \
-        { (TIC_P_DEFLT_TYPE)(pval) }, definr , ifunc , 0 }
+        { (TIC_P_DEFLT_TYPE)(pval) }, definr , FALSE , ifunc , 0 , FALSE }
 
 /*  Similar but a  tic_fwt_hdr_t  type structure  */
 #define DUFNC_FWT_PARM(nam, afunc, pval, ifunc, definr )  \
     { nam , (tic_fwt_hdr_t *)NULL , afunc ,  \
-        { (TIC_FWT_P_DEFLT_TYPE)(pval) }, definr , ifunc , 0 }
+        { (TIC_FWT_P_DEFLT_TYPE)(pval) }, definr , FALSE , ifunc , 0 , FALSE }
 
 
 /* **************************************************************************
@@ -381,11 +400,13 @@
  *       definr      (fword_token)    "Definer" of the entry
  *
  *      The "param field" item should not need be recast.
+ *      The item is not one for which single-token FCode number is assigned.
  *
  **************************************************************************** */
 
 #define FWORD_TKN_TIC(nam, func, fw_tokval, definr )    \
-    { nam , (tic_fwt_hdr_t *)NULL , func , { fw_tokval }, definr , NULL , 0 }
+    { nam , (tic_fwt_hdr_t *)NULL , func , { fw_tokval },  \
+      definr , FALSE , NULL , 0 , FALSE }
 
 /* **************************************************************************
  *          Macro Name:   DUALFUNC_FWT_TIC
@@ -401,10 +422,12 @@
  *       definr      (fword_token)    "Definer" of the entry
  *
  *      The "param field" item should not need be recast.
+ *      The item is not one for which single-token FCode number is assigned.
  *
  **************************************************************************** */
 #define DUALFUNC_FWT_TIC(nam, afunc, fw_tokval, ifunc, definr )    \
-    { nam , (tic_fwt_hdr_t *)NULL , afunc , { fw_tokval }, definr , ifunc , 0 }
+    { nam , (tic_fwt_hdr_t *)NULL , afunc , { fw_tokval }, \
+      definr , FALSE , ifunc , 0 , FALSE }
 
 /* **************************************************************************
  *          Macro Name:   BUILTIN_MAC_TIC
@@ -420,11 +443,13 @@
  *      The "definer" will be MACRO_DEF
  *      Builtin Macros do not need to be expanded while Ignoring, so
  *          the ign_func will be NULL
+ *      The item is not one for which single-token FCode number is assigned.
  *
  **************************************************************************** */
 
 #define BUILTIN_MAC_TIC(nam, func, alias )    \
-    { nam , (tic_mac_hdr_t *)NULL , func , { alias }, MACRO_DEF , NULL , 0 }
+    { nam , (tic_mac_hdr_t *)NULL , func , { alias }, \
+      MACRO_DEF , FALSE , NULL , 0 , FALSE }
 
 
 /* **************************************************************************
@@ -441,12 +466,13 @@
  *      For all of the Condtionals, the "Ignoring" function is the same
  *          as the "Active" function.
  *      The "definer" will be COMMON_FWORD
+ *      The item is not one for which single-token FCode number is assigned.
  *
  **************************************************************************** */
 
 #define BUILTIN_BOOL_TIC(nam, func, bool_vbl )    \
     { nam , (tic_bool_hdr_t *)NULL , func , { &bool_vbl },   \
-        COMMON_FWORD , func , 0 }
+        COMMON_FWORD , FALSE , func , 0 , FALSE }
 
 
 /* **************************************************************************
@@ -465,14 +491,15 @@
                              TIC_P_DEFLT_TYPE tparam,
                                  fwtoken fw_defr,
 				     int pfldsiz,
+                                         bool is_single,
                                          void (*ign_fnc)(),
                                              tic_hdr_t **tic_vocab );
 tic_hdr_t *lookup_tic_entry( char *tname, tic_hdr_t *tic_vocab );
 bool exists_in_tic_vocab( char *tname, tic_hdr_t *tic_vocab );
 bool handle_tic_vocab( char *tname, tic_hdr_t *tic_vocab );
-bool create_tic_alias( char *new_name,
-                                  char *old_name,
-				      tic_hdr_t **tic_vocab );
+bool create_split_alias( char *new_name, char *old_name,
+                              tic_hdr_t **src_vocab, tic_hdr_t **dest_vocab );
+bool create_tic_alias( char *new_name, char *old_name, tic_hdr_t **tic_vocab );
 void reset_tic_vocab( tic_hdr_t **tic_vocab, tic_hdr_t *reset_position );
 
 #endif   /*  _TOKE_TICVOCAB_H    */

Modified: fcode-utils/toke/toke.c
===================================================================
--- fcode-utils/toke/toke.c	2006-10-15 20:09:08 UTC (rev 99)
+++ fcode-utils/toke/toke.c	2006-10-30 09:48:28 UTC (rev 100)
@@ -46,7 +46,8 @@
 #include "stack.h"
 #include "emit.h"
 
-#define TOKE_VERSION "1.0.1"
+#define TOKE_VERSION "1.0.2"
+#define TOKE_COPYRIGHT_DATE "2001-2006"
 
 #include "vocabfuncts.h"
 #include "scanner.h"
@@ -102,8 +103,8 @@
 	printf( "Welcome to toke - OpenBIOS tokenizer v" TOKE_VERSION "\n"
 		CORE_COPYR "\n" IBM_COPYR "\n"
 		"This program is free software; you may redistribute it "
-		"under the terms of\nthe GNU General Public License v2. This "
-		"program has absolutely no warranty.\n\n");
+		"under the terms of\nthe GNU General Public License v2. "
+		"This program has absolutely no warranty.\n\n");
 #ifdef DEVEL
         /*  Temporary hack during development... */
 	printf( "\tTokenizer Compiled " DATE_STAMP "\n" );
@@ -352,6 +353,7 @@
 	    list_cl_flag_settings();
 	    display_include_list();
 	}
+	show_trace_list();
 	save_cl_flags();
 }
 
@@ -378,6 +380,8 @@
 	print_copyright();
 	get_args( argc, argv );
 
+	init_error_handler();
+
 	init_stack();
 	init_dictionary();
 

Modified: fcode-utils/toke/tokzesc.c
===================================================================
--- fcode-utils/toke/tokzesc.c	2006-10-15 20:09:08 UTC (rev 99)
+++ fcode-utils/toke/tokzesc.c	2006-10-30 09:48:28 UTC (rev 100)
@@ -45,8 +45,9 @@
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
+
+#include "tokzesc.h"
 #include "ticvocab.h"
-#include "tokzesc.h"
 #include "stack.h"
 #include "emit.h"
 #include "stream.h"
@@ -54,6 +55,7 @@
 #include "errhandler.h"
 #include "strsubvocab.h"
 #include "nextfcode.h"
+#include "tracesyms.h"
 
 #undef TOKZTEST     /*  Define for testing only; else undef   */
 #ifdef TOKZTEST         /*  For testing only   */
@@ -215,7 +217,8 @@
  *      Inputs:
  *         Parameters:
  *             the_num           Pointer to where to put the number
- *             the_action        Phrase to be used in ERROR message
+ *             setting_fc        TRUE if number is to be set as next fcode,
+ *                                   FALSE if the number is to be emitted
  *         Data-Stack Items:
  *             Top:              Value to be retrieved
  *
@@ -224,21 +227,44 @@
  *         Supplied Pointers:
  *             *the_num          Value retrieved from the data-stack
  *
+ *      Process Explanation:
+ *          From the value of   setting_fc  we will deduce both the legal
+ *              minimum and the phrase to be used in the ERROR message.
+ *              If the number is to be emitted, it can be any legal FCode
+ *              token number down to  0x10 but if it is to be set, the
+ *              legal minimum is 0x0800.
+ *          In either case, 0x0fff is the legal maximum.
+ *
  *      Error Detection:
  *          If the number on the stack is larger than 16 bits, truncate
  *              it, with a WARNING message.
- *          If the (possibly truncated) number from the stack is larger
- *              than the legal maximum for an FCode (0x0fff), or
- *              less than the legal minimum (0x0800), issue an ERROR,
+ *          If the (possibly truncated) number taken from the stack is
+ *              larger than the legal maximum for an FCode, or if it is
+ *              less than the legal minimum, issue an ERROR message,
  *              leave the_num unchanged and return FALSE.
  *
+ *      Extraneous Remarks:
+ *          If this function is ever used in more than the two ways allowed
+ *              by the  setting_fc  parameter, then the Right Thing would
+ *              be to define a local ENUM type for the possible uses, and
+ *              use a SWITCH statement to set the internal variables.  (But
+ *              I really don't see any way that could become necessary...)
+ *
  **************************************************************************** */
 
-static bool get_fcode_from_stack( u16 *the_num, char *the_action)
+static bool get_fcode_from_stack( u16 *the_num, bool setting_fc)
 {
     bool retval = FALSE;
+    char *the_action = "emit FCode value of";
+    u16 legal_minimum = 0x10;
     long num_on_stk = dpop();
     u16 test_fcode = (u16)num_on_stk;
+
+    if ( setting_fc )
+    {
+        the_action = "set next fcode to";
+	legal_minimum = 0x800;
+    }
     if ( test_fcode != num_on_stk )
     {
         tokenization_error( WARNING,
@@ -246,7 +272,7 @@
 		"Truncating to 0x%03x.\n",
 		     strupr(statbuf), num_on_stk, test_fcode);
     }
-    if ( ( test_fcode >= 0x800 ) && ( test_fcode <= 0xfff ) )
+    if ( ( test_fcode >= legal_minimum ) && ( test_fcode <= 0xfff ) )
     {
 	retval = TRUE;
 	*the_num = test_fcode;
@@ -279,7 +305,7 @@
 {
     u16 test_fcode;
 
-    if ( get_fcode_from_stack( &test_fcode, "set next fcode to") )
+    if ( get_fcode_from_stack( &test_fcode, TRUE) )
     {
 	if ( test_fcode == nextfcode )
 	{
@@ -318,7 +344,7 @@
 {
     u16 test_fcode;
 
-    if ( get_fcode_from_stack( &test_fcode, "Emit FCode value of") )
+    if ( get_fcode_from_stack( &test_fcode, FALSE) )
     {
 	tokenization_error( INFO,
 	    "Emitting FCode value of 0x%x\n", test_fcode);
@@ -462,8 +488,8 @@
  *      Error Detection:
  *          Failure to allocate memory is a Fatal Error.
  *          Warning on excessively long name
- *          Warning on duplicate name
  *          Name to be defined not in same file, ERROR
+ *              Warning on duplicate name handled by support routine
  *
  *      Process Explanation:
  *          Get the next word, STRDUP it (which implicitly allocates memory). 
@@ -493,11 +519,6 @@
      *      the lines from here to the end of the
      *      routine should be re-factored...
      */
-    trace_creation( CONST, statbuf);
-
-    warn_if_duplicate( statbuf );
-    check_name_length( wlen );
-
     c_name_space = strdup( statbuf );
 
     add_tic_entry(
@@ -505,9 +526,11 @@
 	     do_constant,
 		  (TIC_P_DEFLT_TYPE)valu,
 		       CONST ,
-			   0 , NULL,
+			  0 , FALSE , NULL,
 		               &tokz_esc_vocab );
 
+    check_name_length( wlen );
+
 }
 
 /* **************************************************************************
@@ -538,7 +561,7 @@
  **************************************************************************** */
 
 #define TKZESC_CONST(nam, pval)   \
-                        VALPARAM_TIC(nam, do_constant, pval, CONST )
+                        VALPARAM_TIC(nam, do_constant, pval, CONST, FALSE )
 #define TKZ_ESC_FUNC(nam, afunc, pval, ifunc)   \
                         DUALFUNC_TIC(nam, afunc, pval, ifunc, UNSPECIFIED)
 
@@ -586,6 +609,11 @@
  *      Synopsis:       Initialize the "Tokenizer Escape" Vocabulary
  *                          link-pointers dynamically.
  *
+ *      Process Explanation:
+ *          While this is going on, set  in_tokz_esc  to TRUE; clear it
+ *              when done.  This will be used by the  trace_builtin
+ *              routine...
+ *
  **************************************************************************** */
 
 void init_tokz_esc_vocab ( void )
@@ -593,10 +621,12 @@
     static const int tokz_esc_vocab_max_indx =
 	 sizeof(tokz_esc_vocab_tbl)/sizeof(tic_hdr_t) ;
 
+    in_tokz_esc = TRUE;
     tokz_esc_vocab = NULL ;   /*  Belt-and-suspenders...  */
     init_tic_vocab(tokz_esc_vocab_tbl,
                        tokz_esc_vocab_max_indx,
 		           &tokz_esc_vocab );
+    in_tokz_esc = FALSE;
 }
 
 /* **************************************************************************

Modified: fcode-utils/toke/tracesyms.c
===================================================================
--- fcode-utils/toke/tracesyms.c	2006-10-15 20:09:08 UTC (rev 99)
+++ fcode-utils/toke/tracesyms.c	2006-10-30 09:48:28 UTC (rev 100)
@@ -33,31 +33,96 @@
 
 /* **************************************************************************
  *
+ *      Revision History:
+ *          Wed, 04 Oct 2006 by David L. Paktor
+ *          Issue a message when a name on the trace list is invoked (as well
+ *              as when it is created), but keep a limit on the speed penalty.
+ *              (I.e., don't scan the trace-list for every symbol invoked.)
+ *              Instead, we are going to install a function that prints the
+ *              message; this requires scanning only once at creation time,
+ *              which is already a necessity.  There are too many permutations
+ *              of "action" functions to define a separate set that combine
+ *              with the invocation-message, so we will have a separate field
+ *              for the invocation-message function, which will be NULL if
+ *              the entry is not being traced.  (If, however, it is faster
+ *              to execute a null function than to first test for a NULL,
+ *              then we can define a null function and put _that_ into the
+ *              invocation-message-function field...
+ *          Wed, 11 Oct 2006 by David L. Paktor
+ *          We have reduced the Invocation Message Function to a single common
+ *              routine; we will add a field that is a simple flag indicating
+ *              if the entry is being traced.  At the common point where the
+ *              entry's function is called, we will test the flag to decide
+ *              whether call the Invocation Message routine.
+ *
+ **************************************************************************** */
+
+/* **************************************************************************
+ *
  *      Functions Exported:
  *          add_to_trace_list         Add the given name to the Trace List
- *          show_initial_traces       Show pre-defined names the user
- *                                        asked to Trace (if any)
  *          is_on_trace_list          Indicate whether the given name is
  *                                        on the Trace List
+ *          tracing_fcode             Show a token's assigned FCode-token
+ *                                        in a consistent format.
+ *          trace_creation            Display a Trace-Note when a word known
+ *                                        to be on the Trace List is created.
+ *          trace_create_failure      Display a Trace-Note indicating a failed
+ *                                        attempt to create a word, if it is
+ *                                        on the Trace List.
+ *          traced_name_error         Display a Trace-Note indicating a failed
+ *                                        attempt to invoke an undefined word,
+ *                                        if it is on the Trace List.
+ *          invoking_traced_name      Display a Trace-Note when a word known
+ *                                        to be on the Trace List is invoked.
+ *          handle_invocation         Test whether a word is on the Trace List;
+ *                                        if so, display a Trace-Note.
+ *          show_trace_list           Display the trace-list (if any) at
+ *                                        the start of the run
+ *          trace_builtin             Test whether a pre-defined name is on
+ *                                        the Trace List; issue a Trace-Note
+ *                                        and set the entry's  tracing  flag.
  *
  **************************************************************************** */
 
+/* **************************************************************************
+ *
+ *          Global Variables Exported
+ *              split_alias_message     Back-channel way to permit a certain
+ *                                          message about an alias to a Global
+ *                                          definition only having local scope
+ *                                          to become a Trace-Note instead of
+ *                                          an Advisory when one of the names
+ *                                          is being Traced.
+ *
+ **************************************************************************** */
+
+
 #include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
 
 #include "tracesyms.h"
 #include "errhandler.h"
+#include "scanner.h"
+#include "vocabfuncts.h"
+#include "devnode.h"
+#include "toke.h"
 
+int split_alias_message = INFO;
 
 /* **************************************************************************
  *
  *          Internal Static Variables
- *     trace_list     Pointer to last entry in the Trace List linked-list
- *                        data structure
- *              
- *              
+ *     trace_list             Pointer to the first entry in the Trace List
+ *                                linked-list data structure
+ *     trace_list_last        Pointer to the last entry in the Trace List;
+ *                                the list will be forward-linked
+ *     tracing_symbols        TRUE if "Trace-Symbols" is in effect.
  *
  **************************************************************************** */
 
+
 /* **************************************************************************
  *
  *      Internal (Static) Structures:
@@ -65,35 +130,38 @@
  *
  *   Fields:
  *       tracee              Name of the symbol to be traced
- *       prev                Pointer to previous entry in the linked-list
+ *       next                Pointer to next entry in the forward-linked-list
  *
  **************************************************************************** */
 
 typedef struct trace_entry {
       char *tracee;
-      struct trace_entry *prev;
+      struct trace_entry *next;
 } trace_entry_t;
 
 static trace_entry_t *trace_list = NULL;
+static trace_entry_t *trace_list_last = NULL;
 
+static bool tracing_symbols = FALSE;
 
-
 /* **************************************************************************
  *
  *      Function name:  add_to_trace_list
  *      Synopsis:       Add the given name to the Trace List
  *                      
- *
  *      Inputs:
  *         Parameters:
  *             trace_symb            Name of the symbol to be added
  *         Local Static Variables:
  *             trace_list           Pointer to the Trace List
+ *             trace_list_last      Pointer to last entry in the Trace List
  *
  *      Outputs:
  *         Returned Value:          NONE
  *         Local Static Variables:
- *             trace_list           Points to new entry in Trace List
+ *             trace_list           Points to first entry in Trace List
+ *             trace_list_last      Pointer to new entry in the Trace List
+ *             tracing_symbols      Set to TRUE
  *         Memory Allocated
  *             For Trace List entry
  *             For copy of Symbol Name
@@ -101,6 +169,12 @@
  *             Never.  Well, only on termination of the program.  Trace-list
  *                 endures for the entire batch of tokenizations.
  *
+ *      Process Explanation:
+ *          The list will be forward-linked so that the display of the list
+ *              can be in the same order as specified by the User.  It will
+ *              take a little extra effort, but having it come out that way
+ *              satisfies the "Rule of Least Astonishment"...
+ *
  *      Error Detection:
  *          Memory allocation failure is a FATAL error.
  *
@@ -111,9 +185,16 @@
     trace_entry_t *new_t_l_entry = safe_malloc( sizeof( trace_entry_t),
         "adding to trace-list");
     new_t_l_entry->tracee = strdup( trace_symb);
-    new_t_l_entry->prev = trace_list;
+    new_t_l_entry->next = NULL;
 
+    if ( trace_list != NULL )
+    {
+	trace_list_last->next = new_t_l_entry;
+    }else{
     trace_list = new_t_l_entry;
+	tracing_symbols = TRUE;
+    }
+    trace_list_last = new_t_l_entry;
 }
 
 
@@ -126,6 +207,7 @@
  *         Parameters:
  *             symb_name            Symbol-name to test
  *         Local Static Variables:
+ *             tracing_symbols      Skip the search if FALSE
  *             trace_list           Pointer to the Trace List
  *
  *      Outputs:
@@ -136,6 +218,8 @@
 bool is_on_trace_list( char *symb_name)
 {
     bool retval = FALSE;
+    if ( tracing_symbols )
+    {
     trace_entry_t *test_entry = trace_list;
     while ( test_entry != NULL )
     {
@@ -144,7 +228,8 @@
 	    retval = TRUE;
 	    break;
 	}
-	test_entry = test_entry->prev;
+	    test_entry = test_entry->next;
+	}
     }
     return ( retval );
 }
@@ -152,21 +237,504 @@
 
 /* **************************************************************************
  *
- *      Still to be done:
- *          Implement a function -- name it  show_initial_traces  --
- *              that will show any pre-defined names the user asked
- *              to Trace.  That is, if any of the names the user asked
- *              to Trace belongs to a pre-defined function, macro or
- *              directive, then, at the beginning of the output, issue 
- *              Advisory Messages identifying the scope of those names.
+ *      Function name:  tracing_fcode
+ *      Synopsis:       Fill the given buffer with the string showing the
+ *                          assigned FCode-token given.  Produce a consistent
+ *                          format for all messages that include this phrase.
+ *
+ *      Inputs:
+ *         Parameters:
+ *             fc_phrase_buff          Pointer to buffer for the phrase
+ *             fc_token_num            Assigned FCode-token number.
+ *
+ *      Outputs:
+ *         Returned Value:             NONE
+ *         Supplied Pointers:
+ *             fc_phrase_buff          Filled with the phrase.
+ *
+ *      Process Explanation:
+ *          It is the responsibility of the calling routine to make sure
+ *              that the buffer passed as the  fc_phrase_buff  parameter
+ *              is sufficiently large for the phrase.
+ *          This routine will test  fc_token_num  and leave the buffer
+ *              unchanged if it is not greater than zero, relieving the
+ *              calling routine of that chore.
+ *
+ *      Extraneous Remarks:
+ *          We will export, in  tracesyms.h , a Macro that will give the
+ *             recommended length for the buffer passed to this routine.
+ *             It will be called  TRACING_FCODE_LENGTH 
+ *
+ **************************************************************************** */
+
+void tracing_fcode( char *fc_phrase_buff, u16 fc_token_num)
+{
+    if ( fc_token_num > 0 )
+    {
+	sprintf( fc_phrase_buff,
+		    " (FCode token = 0x%03x)", fc_token_num);
+    }
+}
+
+/* **************************************************************************
+ *
+ *      Function name:  trace_creation
+ *      Synopsis:       Display the appropriate message when a word, known
+ *                          to be on the Trace List, is created.
+ *
+ *      Inputs:
+ *         Parameters:
+ *             trace_entry             The TIC entry of the name
+ *             nu_name                 If creating an Alias, the "new" name,
+ *                                         otherwise NULL.
+ *             is_global               TRUE if trace_entry has Global scope.
+ *         Global Variables:
+ *             in_tokz_esc             TRUE if we are in Tokenizer-Escape mode
+ *             current_device_node     Where the new definition's scope is,
+ *                                         if it's not Global or Tokzr-Escape.
+ *             hdr_flag                State of name-creation headered-ness
+ *             in_tkz_esc_mode         String for announcing Tokz-Esc mode
+ *             wh_defined              String, = ", which is defined as a "
+ *
+ *      Outputs:
+ *         Returned Value:             NONE
+ *         Global Variables:
+ *             split_alias_message     Set to TRACER if creating an Alias.
+ *         Printout:
+ *             Trace-Note Message.
+ *             If not an ALIAS, takes the form:
+ *                 Creating <name> <(if is_single:FCode Token = xxx)>
+ *                     as a{n External,Headered,Headerless} <Type>
+ *                     <with scope>
+ *             If it is an ALIAS, takes the form:
+ *                 Creating <new-name> as a{n External,Headered,Headerless} 
+ *                     ALIAS to <old-name> <(if is_single:FCode Token = xxx)>,
+ *                    which is defined [ as a <Type>] <with scope>
+ *             Headered-ness, of course, only applies to words with a
+ *                      single-token FCode.
+ *             The <with scope> phrase is:
+ *                 If we are in Tokz-Esc mode, "in Tokenizer-Escape mode".
+ *                 If the TIC entry is a Local, the current colon-definition.
+ *                 If the TIC entry is Global in scope, "with Global scope"
+ *                 Otherwise, the identification of the current device-node.
+ *
+ *      Process Explanation:
+ *          The calling routine will already have verified that the
+ *              name is on the trace-list.
+ *          The name will already have been entered into a TIC_HDR vocab;
+ *              
+ *          The order of scope-checking is important:
+ *              A Local has no scope beyond the definition in which it occurs.
+ *              Tokenizer-Escape mode supercedes "Normal" mode, and renders
+ *                  moot the differences between Global and Device scope.
+ *              Global scope is mutually exclusive with Device scope.
+ *              Device scope needs to identify where the Current device-node
+ *                  began.
+ *
+ **************************************************************************** */
+
+void trace_creation( tic_hdr_t *trace_entry,
+                         char *nu_name,
+			     bool is_global)
+{
+    char  fc_token_display[TRACING_FCODE_LENGTH] = "";
+    char *head_ness = "";
+    char *defr_name = "" ;
+    char *defr_phrase = "" ;
+    char *with_scope = "" ;
+    bool def_is_local = BOOLVAL( trace_entry->fword_defr == LOCAL_VAL);
+    bool creating_alias = BOOLVAL( nu_name != NULL );
+
+    if ( creating_alias )
+    {
+	head_ness = "n";
+	split_alias_message = TRACER;
+    }
+
+    if ( in_tokz_esc )
+    {
+	with_scope = in_tkz_esc_mode;
+    }else{
+	if ( ! def_is_local )
+	{
+	    if ( is_global )
+	    {
+		with_scope = "with Global scope.\n";
+	    }else{
+		with_scope = in_what_node( current_device_node);
+	    }
+	}
+
+	if ( trace_entry->is_token )
+	{
+	    tracing_fcode( fc_token_display,
+		               (u16)trace_entry->pfield.deflt_elem );
+	    /*   Headered-ness only applies to FCode definitions  */
+	    /*   But not to aliases to FCode definitions          */
+	    if ( ! creating_alias )
+	    {
+		switch ( hdr_flag )
+		{
+		    case FLAG_HEADERS:
+			head_ness = " Headered";
+			break;
+
+		    case FLAG_EXTERNAL:
+			head_ness = "n External";
+			break;
+
+		    default:  /*   FLAG_HEADERLESS   */
+			head_ness = " Headerless";
+		}
+	    }
+	}
+
+    }
+
+
+    if ( definer_name(trace_entry->fword_defr, &defr_name) )
+    {
+	defr_phrase = wh_defined;
+    }else{
+	/*  Even if we don't have a Type for the "old" word
+	 *      we still have its scope.  If the "new" word's
+	 *      scope is different, the "split-alias message"
+	 *      will take care of it.
+	 */
+	if ( creating_alias )
+	{
+	    defr_phrase = ", which is defined" ;
+	}
+    }
+
+    if ( creating_alias )
+    {
+	/*
+	 *         Creating <new-name> as a{n External,Headered,Headerless} 
+	 *             ALIAS to <old-name> <(if is_single:FCode Token = xxx)>,
+	 *             [which is defined as a <Type> <with scope>]
+	 */
+	tokenization_error(TRACER,
+	    "Creating %s"            /*  nu_name                       */
+	    " as a%s ALIAS to %s"    /*  head_ness  trace_entry->name  */
+	    "%s"                     /*  fc_token_display              */
+	    "%s%s "                  /*  defr_phrase defr_name         */
+	    "%s",                    /*  with_scope  */
+	    nu_name, head_ness, trace_entry->name,
+	    fc_token_display, defr_phrase, defr_name, with_scope );
+    }else{
+	/*
+	 *         Creating <name> <(if is_single:FCode Token = xxx)>
+	 *             as a{n External,Headered,Headerless} <Type>
+	 *             [ <with scope> ]
+	 */
+	tokenization_error(TRACER,
+	    "Creating %s"       /*  trace_entry->name     */
+	    "%s"                /*  fc_token_display      */
+	    " as a%s %s "       /*  head_ness  defr_name  */
+	    "%s",               /*  with_scope         */
+	    trace_entry->name,
+	    fc_token_display, head_ness, defr_name, with_scope );
+    }
+	/*
+	 *     The <with scope> phrase is:
+	 *         If we are in Tokz-Esc mode, "in Tokenizer-Escape mode".
+	 *                  (Already handled.  No more to do here)
+	 *         If the TIC entry is a Local, the current colon-definition.
+	 *         If the TIC entry is Global in scope, "with Global scope"
+	 *              (identified by NULL in_vocab).
+	 *         Otherwise, the identification of the current device-node.
+	 */
+
+
+    if ( ! in_tokz_esc )
+    {
+	if ( def_is_local )
+	{
+	    in_last_colon( TRUE);
+	}else{
+	    show_node_start();
+	}
+    }
+
+}
+
+
+/* **************************************************************************
+ *
+ *      Function name:  trace_create_failure
+ *      Synopsis:       Display a Trace-Note indicating a failed attempt
+ *                          to create a word, if it is on the Trace List.
  * 
- *          E.g, if the user had  -T 3DUP  -T SWAP   the function would
- *              issue Messages like:
- *          3DUP is pre-defined as a Macro with Global scope
- *          SWAP is pre-defined with Global scope
- *          SWAP is pre-defined in Tokenizer-Escape mode
- * 
- *          The names would, of course, remain on the Trace List and
- *              any re-definitions of them would be reported.
+ *      Inputs:
+ *         Parameters:
+ *             new_name             The name of the word you failed to create
+ *             old_name             If attempted to create an Alias, the
+ *                                       "old" name, otherwise NULL.
+ *             fc_tokn              FCode-Token that might have been assigned
+ *                                       to the "new" name.  Zero if none.
  *
+ *      Outputs:
+ *         Returned Value:          NONE
+ *         Printout:
+ *             Failed to create <new_name> [FCode Token = <xxx>]
+ *             [ as an ALIAS to <old_name>]\n"
+ *
  **************************************************************************** */
+
+void trace_create_failure( char *new_name, char *old_name, u16 fc_tokn)
+{
+    bool not_alias   = BOOLVAL( old_name == NULL );
+    bool do_it       = is_on_trace_list( new_name);
+
+    if ( ( ! do_it ) && ( ! not_alias ) )
+    {
+        do_it       = is_on_trace_list( old_name);
+    }
+
+    if ( do_it )
+    {
+	char  fc_token_display[TRACING_FCODE_LENGTH] = "";
+	char *as_alias   = not_alias ? "" : " as an ALIAS to ";
+	char *alias_name = not_alias ? "" : old_name;
+
+	if ( fc_tokn > 0 )
+	{
+	   tracing_fcode( fc_token_display, fc_tokn);
+	}
+	tokenization_error(TRACER, 
+		"Failed to create %s"          /*  new_name          */
+		"%s"                           /*  fc_token_display  */
+		"%s"                           /*  as_alias          */
+		"%s\n",                        /*  alias_name        */
+		new_name, fc_token_display,
+		    as_alias, alias_name);
+    }
+}
+
+
+/* **************************************************************************
+ *
+ *      Function name:  traced_name_error
+ *      Synopsis:       Display a Trace-Note indicating a failed attempt
+ *                          to invoke an undefined word, if it is on the
+ *                          Trace List.
+ *
+ *      Inputs:
+ *         Parameters:
+ *             trace_name              The name being invoked
+ *
+ *      Outputs:
+ *         Returned Value:             NONE
+ *         Printout:
+ *             A Trace-Note message indicating a attempt to "invoke" the name
+ *
+ *      Error Detection:
+ *          Error was detected by calling routine
+ *
+ *      Process Explanation:
+ *          Test if the name is on the trace-list, first.
+ *
+ **************************************************************************** */
+
+void traced_name_error( char *trace_name)
+{
+    if ( is_on_trace_list( trace_name ) )
+    {
+	tokenization_error(TRACER, "Attempt to invoke (undefined) %s.\n",
+	     trace_name);
+    }
+}
+
+/* **************************************************************************
+ *
+ *      Function name:  invoking_traced_name
+ *      Synopsis:       Print a message indicating that the given name,
+ *                          (which is on the trace-list) is being invoked.
+ *                          If available, show the name's assigned FCode-
+ *                          -token, definition-type, and scope.
+ *
+ *      Inputs:
+ *         Parameters:
+ *             trace_entry             The TIC entry of the name
+ *
+ *      Outputs:
+ *         Returned Value:             NONE
+ *         Printout:
+ *             A Trace-Note message:
+ *                  Invoking <name> [FCode Token = <xxx>] [defined as a <Type>]
+ *
+ *      Process Explanation:
+ *          Although we could test the entry here to see whether it is
+ *              being traced, we do not want to incur the speed penalty
+ *              of the overhead of unconditionally calling a routine that,
+ *              in most cases, will not do anything, every time a token
+ *              is processed.  We believe it is faster for the calling
+ *              routine to conduct that test.
+ *          Therefore, this routine will pre-suppose that the "tracing"
+ *              field of the entry is TRUE.
+ *
+ **************************************************************************** */
+
+void invoking_traced_name( tic_hdr_t *trace_entry)
+{
+
+    char  fc_token_display[TRACING_FCODE_LENGTH] = "";
+    char *defr_name   = "" ;
+    char *defr_phrase = "" ;
+    char *defr_space  = "" ;
+
+    if ( trace_entry->is_token )
+    {
+	tracing_fcode( fc_token_display,
+		           (u16)trace_entry->pfield.deflt_elem );
+    }
+
+    if ( definer_name(trace_entry->fword_defr, &defr_name) )
+    {
+	defr_phrase = " defined as a";
+	defr_space  = " " ;
+
+    }
+
+    tokenization_error(TRACER,
+	"Invoking %s"                  /*  <name>                      */
+	"%s"                           /*  fc_token_display            */
+	"%s%s"                         /*  defr_phrase  defr_space     */
+	"%s.\n",                       /*  defr_name                   */
+	trace_entry->name,
+	fc_token_display,
+	defr_phrase, defr_space,
+	defr_name);
+
+}
+
+/* **************************************************************************
+ *
+ *      Function name:  handle_invocation
+ *      Synopsis:       Test whether the entry is being traced;
+ *                          if so, print the Trace-Note message.
+ *
+ *      Inputs:
+ *         Parameters:
+ *             trace_entry             The TIC entry to be tested.
+ *                                         No harm if NULL
+ *
+ *      Outputs:
+ *         Returned Value:             NONE
+ *         Printout:
+ *             A Trace-Note message, by invoking_traced_name() if
+ *                 the entry's tracing field is set.
+ *
+ *      Extraneous Remarks:
+ *          In cases that do not occur every time a token is processed,
+ *              we can trade-off a small price in speed for convenience
+ *              of coding.  Call this routine judiciously...
+ *
+ **************************************************************************** */
+
+void handle_invocation( tic_hdr_t *trace_entry)
+{
+    if ( trace_entry != NULL )
+    {
+	if ( trace_entry->tracing)
+	{
+	    invoking_traced_name( trace_entry);
+	}
+    }
+}
+
+
+/* **************************************************************************
+ *
+ *      Function name:  show_trace_list
+ *      Synopsis:       Display the trace-list (if any) at the start of the run
+ *
+ *      Inputs:
+ *         Parameters:                 NONE
+ *         Local Static Variables:
+ *             tracing_symbols         Skip the display if FALSE
+ *             trace_list              Pointer to the Trace List
+ *
+ *      Outputs:
+ *         Returned Value:             NONE
+ *         Printout:
+ *             List of symbols being traced; nothing if not tracing.
+ *
+ *      Error Detection:
+ *          Memory allocation failure is a FATAL error.
+ *
+ **************************************************************************** */
+
+void show_trace_list( void)
+{
+    if ( tracing_symbols )
+    {
+	trace_entry_t *test_entry;
+	printf("\nTracing these symbols:");
+	for ( test_entry = trace_list;
+	      test_entry != NULL;
+	      test_entry = test_entry->next )
+	{
+            printf("   %s", test_entry->tracee);
+	    
+	}	
+	printf("\n");
+    }
+
+}
+
+/* **************************************************************************
+ *
+ *      Function name:  trace_builtin
+ *      Synopsis:       If the given built-in token, function, macro or
+ *                          directive is one the user asked to have Traced,
+ *                          issue a Trace-Note describing it, and set the
+ *                          TIC_HDR entry's  tracing  field to TRUE.
+ *                      Called while initializing vocab-lists.
+ *
+ *      Inputs:
+ *         Parameters:
+ *             trace_entry             The TIC entry of the built-in name
+ *         Global Variables:
+ *             in_tokz_esc             TRUE if initializing the vocab-list
+ *                                         for Tokenizer-Escape mode.
+ *             in_tkz_esc_mode         String for announcing Tokz-Esc mode
+ *         Local Static Variables:
+ *
+ *      Outputs:
+ *         Returned Value:             NONE
+ *         Supplied Pointers:
+ *             trace_entry->tracing    Set TRUE, if the entry's name is on
+ *                                         the Trace List.
+ *         Printout:
+ *             Trace-Note:  <name> <(if is_single:FCode Token = xxx)>
+ *                          is a built-in {word|<Type>} [in Tokz-Esc mode]
+ *
+ **************************************************************************** */
+ 
+void trace_builtin( tic_hdr_t *trace_entry)
+{
+    if (is_on_trace_list( trace_entry->name ) )
+    {
+	char  fc_token_display[TRACING_FCODE_LENGTH] = "";
+	char *defr_name = "word";
+	char *ws_space = in_tokz_esc ? " " : "";
+	char *with_scope = in_tokz_esc ? in_tkz_esc_mode  : ".\n";
+	if ( trace_entry->is_token )
+	{
+	    tracing_fcode( fc_token_display,
+		           (u16)trace_entry->pfield.deflt_elem );
+	}
+	definer_name(trace_entry->fword_defr, &defr_name);
+	trace_entry->tracing = TRUE;
+	tokenization_error(TRACER,
+	    "%s"                             /*  <name>                 */
+	    "%s "                            /*  fc_token_display       */
+	    "is a built-in %s"               /*  defr_name              */
+	    "%s%s",                          /*  ws_space with_scope    */
+	    trace_entry->name,
+	    fc_token_display, defr_name, ws_space, with_scope );
+    }
+}
+ 

Modified: fcode-utils/toke/tracesyms.h
===================================================================
--- fcode-utils/toke/tracesyms.h	2006-10-15 20:09:08 UTC (rev 99)
+++ fcode-utils/toke/tracesyms.h	2006-10-30 09:48:28 UTC (rev 100)
@@ -35,14 +35,44 @@
  **************************************************************************** */
 
 #include "types.h"
+#include "ticvocab.h"
+#include "devnode.h"
 
 /* ************************************************************************** *
  *
+ *      Global Variables Exported
+ *
+ **************************************************************************** */
+
+extern int split_alias_message;
+
+/* ************************************************************************** *
+ *
  *      Function Prototypes / Functions Exported:
  *
  **************************************************************************** */
 
 void add_to_trace_list( char *trace_symb);
 bool is_on_trace_list( char *symb_name);
+void tracing_fcode( char *fc_phrase_buff, u16 fc_token_num);
+void trace_creation( tic_hdr_t *trace_entry,
+                         char *nu_name,
+			     bool is_global);
+void trace_create_failure( char *new_name, char *old_name, u16 fc_tokn);
+void traced_name_error( char *trace_name);
+void invoking_traced_name( tic_hdr_t *trace_entry);
+void handle_invocation( tic_hdr_t *trace_entry);
+void show_trace_list( void);
+void trace_builtin( tic_hdr_t *trace_entry);
 
+/* ************************************************************************** *
+ *
+ *      Macro:
+ *          TRACING_FCODE_LENGTH
+ *                Adequate length for the buffer passed to  tracing_fcode()
+ *
+ **************************************************************************** */
+
+#define  TRACING_FCODE_LENGTH   32
+
 #endif   /*  _TOKE_TRACESYMS_H    */

Modified: fcode-utils/toke/vocabfuncts.h
===================================================================
--- fcode-utils/toke/vocabfuncts.h	2006-10-15 20:09:08 UTC (rev 99)
+++ fcode-utils/toke/vocabfuncts.h	2006-10-30 09:48:28 UTC (rev 100)
@@ -47,7 +47,9 @@
  **************************************************************************** */
 
 extern bool scope_is_global;
+extern bool define_token;
 
+
 /* ************************************************************************** *
  *
  *      Function Prototypes / Functions Exported:
@@ -66,8 +68,7 @@
 tic_hdr_t *lookup_in_dev_node( char *tname);
 void add_to_current( char *name,
                            TIC_P_DEFLT_TYPE fc_token,
-			       fwtoken definer,
-			           bool define_token);
+			       fwtoken definer);
 void hide_last_colon ( void );
 void reveal_last_colon ( void );
 bool create_current_alias( char *new_name, char *old_name );




More information about the OpenBIOS mailing list