Initial revision
This commit is contained in:
49
doc/programmer/macro.tex
Normal file
49
doc/programmer/macro.tex
Normal file
@@ -0,0 +1,49 @@
|
||||
\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}
|
||||
Reference in New Issue
Block a user