Files
sics/doc/programmer/inter.tex
2000-02-07 10:38:55 +00:00

70 lines
4.6 KiB
TeX

\subsection{The SICS Interpreter}
The SicsInterpreter implements a Tcl-look alike command list with each
object having a similar wrapper function to those used in Tcl. But
augmented with a pointer to a Connection structure in order to enable
authorisation checking and providing the I/O context. The object wrapper
function has a prototype looking like this:
{\bf int ObjectWrapper(SConnection *pCon, SicsInterp *pInter, void *pData,
int argc, char *argv); }
pCon is the connection responsible for this call and holds necessary
information for authorisation checking. pInter is the Sics interpreter.
pData is a pointer to an object specific datastructure (the struct holding
the motor data for instance). Argc and argv hold the arguments as in a C
main program. The object wrapper is meant to evaluate the arguments, do the
right thing to the object with them and than pass results back. There are
two ways to do that. The prefered one is to copy results or error messages
into the interpreters result space and associate an output code with the
result space. After returning the interpreter will than copy these results
to the client. However, a scan routine might want to print status
information to the client during a lengthy operation. In this case the
object can write directly to the connnection usinfg the provided connection
pointer. The object wrapper function returns true or false depending on the
success of the operation.
The command list is a doubly linked list holding for each command a record
containing: the commands name, a pointer to the objects object function, a
pointer to the objects data structure (passed as pData) on invocations and a
pointer to a function which is capable to delete the objects data structure.
This function will be called when the object/command is removed. In the end
the SicsInterpreter implements the following datastrucures an
interfaces:\begin{verbatim} typedef struct __Clist {
char *pName;
ObjectFunc OFunc;
KillFunc KFunc;
void *pData;
struct __Clist *pNext;
struct __Clist *pPrevious;
} CommandList;
\end{verbatim}
The structure held in a doubly linked list for each command.\begin{verbatim}
typedef struct __SINTER
{
CommandList *pCList;
char *pErrors;
int iSpace;
OutCode eOut;
}SicsInterp;
\end{verbatim}
The interpreter data structure. Access only through the interface functions given below:\begin{itemize}
\item {\bf SicsInterp *InitInterp(void) } creates a new interpreter. Returns a pointer on success, NULL on failure.
\item {\bf int AddCommand(SicsInterp *pInterp, char *pName, ObjectFunc pFunc, KillFunc pKFunc, void *pData); } adds a new command to the commandlist of the specified interpreter. Returns True or false depending on success.
\item {\bf int RemoveCommand(SicsInterp *pInterp, char *pName) } finds command name and removes it from the list. Returns True on success (command found) and False if it fails.
\item {\bf int InterpExecute(SicsInterp *self,pSConnection pCon, char *pCommand) } executes pcommand in the SICS interpreter. Returns -1 if the command did not exist. If ist exists True or False is returned depending on the success of the command.
\item {\bf int InterpWriteResult(SicsInterp *self,char *text) } used within object wrapper functions to append result text to the interpreter. Allocating sufficient memory is taken care of by this function.
\item {\bf void InterpSetOutCode(SicsInterp *self, OutCode eCode) } does what it says.
\item {\bf OutCode InterpGetOutCode(SicsInterp *self) } return the current output code for the interpreters result.
\item {\bf CommandList *FindCommand(SicsInterp *pInterp, char *name) } return a pointer to a commandlist structure if the object specified by name exists, NULL else. Used in the definition of interpreter and macro functionality.
\item {\bf const char *InterpGetResult(SicsInterp *self) } returns a pointer to the interpreter result space. This space is managed by the interpreter, never ever delete it in client code.
\item {\bf void DeleteInterp(SicsInterp *self) } removes the interpreter, his command list etc. Frees all allocated memory for this interpreter.
\item {\bf WriteSicsStatus(SicsInterp *pSics, char *file)} opens the file
for writing and writes the current status of SICS objects int the file. In
order to do so, the SaveStatus function of each object registered in the
interpreter is called.
\end{itemize}