\subsection{The Macro Interpreter}
This module is responsible for splicing the Tcl macro interpreter into 
the SICS framework. In order to achieve this several problems have to be
adressed:
\begin{itemize}
\item How to make Tcl commands available from within SICS.
\item How to call SICS with the correct execution context from Tcl macros.
\end{itemize}
The first problem is solved by overloading Tcl's unknown mechanism. The Tcl
interpreter automatically invokes a procedure {\bf unknown} when it cannot
find a command. The usual procedure in this case searches for Tcl procedures
in libraries and then tries to invoke the command as a shell command. For
SICS the last part has been cut off and replaced by a call to SICSUnknown
which tries to find an appropriate SICS command.

The second problem is solved by maintaing a stack of connection objects.
Before a Tcl command is invoked from SICS the current connection object is
pushed on the stack. If in due course SICSUnknown needs to find a connection
object in order to invoke a SICS object the last object from the stack will
be used. If Tcl finishes, the connection object is popped from the stack.
This is nicely shown in the TclAction code.
All this is implemented in macro.c. 

 The macro module presents the following interface to the outside world:\begin{itemize}
\item {\bf Tcl\_Interp *MacroInit(SicsInterp *pInter,SConnection *pCon) } initialises a Tcl interpreter with a SICS unknown mechanism. Furthermore deletes some Tcl standard commands which can be harmful in SICS. Returns  a pointer to an interpreter on success, NULL else.
\item {\bf void MacroDelete(Tcl\_Interp *pInter) } deletes an  interpreter.
\item {\bf int MacroFileEval(SConnection *pCon, SicsInterp *pInter,  void *pData, int argc, char *argv) }, the SICS object wrapper function for script processing.
\item {\bf int InternalFileEval(SConnection *pCon, SicsInterp *pInter,
 void *pData, int argc, char *argv) }, the SICS object wrapper
 function for script processing. This version suppresses output to the
 client however. All output goes into the command log only. 
\item {\bf int ClientPut(SConnection *pCon, SicsInterp *pInter,  void *pData, int argc, char *argv) }, 
the SICS object wrapper function for writing datato a client from
within a Tcl--script.  
\item {\bf int MacroWhere(SConnection *pCon, SicsInterp *pInter,
 void *pData, int argc, char *argv) }, the SICS object wrapper
 function implementing the filewhere command. 
\item {\bf int TclPublish(SConnection *pCon, SicsInterp *pSics, void *pData,
int argc, char *argv[])} is the implmentation of the Publish command for the
interpreter which installs a Tcl command into the system.
\item {\bf int TransactAction (SConnection *pCon, SicsInterp *pInter,
 void *pData, int argc, char *argv) } This Function implements the
 transact command which executes an command and sends a string
 ``TRANSACTIONFINISHED'' when the command finished executing. 
\item {\bf MacroPush} pushes a connection onto the Tcl connection
 stack.
\item {\bf MacroPop} removes a connection for the Tcl connection
stack. 
\end{itemize}
