home *** CD-ROM | disk | FTP | other *** search
- /**********************************************************/
- /* INTERP.C */
- /* Hier werden Interpreterbefehle erkannt und dann die */
- /* notwendigen ausführenden Routinen gestartet. */
- /* */
- /* (c) 1990 Michael Beising & TOOLBOX */
- /**********************************************************/
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "interp.h"
-
- /* Benoetigte Globalvariablen */
- extern PRGZEILE *FirstLine; /* erste Interpreterzeile */
- extern PRGZEILE *ActLine; /* aktuelle interp. Zeile */
- extern char *LinePos; /* Zeilenpos. der Akt. Zeile*/
- extern int Steuer; /* der aufrufenden Routine wird
- mitgeteilt, um was es sich handelt.*/
- /* Ergebnisbuffer des Scanners */
- extern char ScanBuffer[ZEILENLAENGE];
- extern VAR *FirstVar; /* Zeiger auf die erste Variable */
-
- /* lokale Funktionen und deren Prototypen dieses Files */
-
- static int TestBefehl (int *Befehl);
-
- void
- InterAct ()
- {
- PRGZEILE NewLine; /* interaktiv eingegebene Zeile */
- int Error; /* Fehlermeldungen zwischensp. */
- char ReadBuffer[255]; /* Buffer für eine Eingabezeile*/
-
- FirstLine = NULL; /* kein Interpretertext vorhanden */
- ActLine = NULL;
- FirstVar = NULL; /* keine Variablen vorhanden */
- SetFileName ("work.mbl"); /* Defaultfilename setzen */
-
- while (TRUE) {
- ResetError (); /* Fehlermeldungsflag zurücksetzen */
- *NewLine.Zeile = '\0'; /* Zwischenspeicher rücksetzen */
-
- putchar (0x0d);putchar(0x0a); /* <cr>-<lf> ausgeben */
- putchar ('>'); /* Prompt ausgeben */
- gets (ReadBuffer); /* Benutzerzeile einlesen */
-
- /* beginnt die Zeile mit einer Ziffernfolge */
- LinePos = ReadBuffer;
- SkipChar ();
- Scan (); /* Zeile untersuchen */
- /* Überprüfe Zeilenanfang auf Ziffer */
- if (Steuer == ZIFFER) { /* Zeilennummer vorhanden */
- NewLine.LineNumber = atoi (ScanBuffer);
- ActLine = 
 /* setze aktuelle,
- zu bearbeitende Zeile */
- if (MakeToken () == OK) /* erzeuge eine Tokenzeile */
- InsIntLine (); /* Prog.zeile in Prg.text einfügen */
- else {
- printf ("\n Zeile [%d] ist gelöscht!",
- NewLine.LineNumber);
- DelLine (NewLine.LineNumber);
- }
- }
- else { /* ansonsten interpretiere Zeile */
- ActLine = 

- SkipChar (); /* Mit neuem Zeichen starten */
- LinePos = ReadBuffer; /* Zeilenzeiger zurücksetzen */
- if (MakeToken () == OK) { /* Tokenzeile erzeugen */
- LinePos = ActLine->Zeile;
- InterpLine (); /* Zeile ausführen lassen */
- }
- else {
- sprintf (ReadBuffer,"Befehl <%s> unbekannt",
- ScanBuffer);
- serror (ReadBuffer);
- }
- }
- }
- }
-
- /* InterpLine
- Die Zeile, auf welche ActLine zeigt, wird interpretiert
- */
-
- extern TOKBEF TokBefDesc[];
-
- int
- InterpLine ()
- {
- register int i,error;
-
- i = 0xff & *LinePos; /* make unsigned */
- if ((i >= TOKMIN) && (i <= TOKMAX)) {
- LinePos++; /* aktuellen Befehl überlesen */
- SkipChar ();
- /* Befehl ausführen */
- error = TokBefDesc[i-TOKMIN].function ();
- }
- else {
- serror ("Unbekannter Befehl! ");
- error = FALSE;
- }
- return (error);
- }
-
- /* DoProgram
- arbeitet ein Interpreterprogramm zeilenweise so lange
- ab, bis entweder das Programmtextende erreicht wird, ein
- Fehler auftritt oder die Endeanweisung gefunden wurde.
- */
- extern int IntError;
- int GetNextLine;
-
- int
- DoProgram ()
- {
- register int error = TRUE;
-
- while (ActLine && error) { /* Solange, bis Programmende
- erreicht */
- LinePos = ActLine->Zeile;
- GetNextLine = TRUE;
- error = InterpLine (); /* Aktuelle Zeile ausführen */
- if (GetNextLine) /* nächste Programmzeile ausführen */
- ActLine = ActLine->NextZeile;
- /* Fehler aufgetreten => Abbruch */
- if (IntError) break;
- }
-
- return (error);
- }
-
- /* MakeToken
- Es wird versucht, einen Quelltext, auf den LinePos zeigt,
- in Token zu verwandeln.
- */
-
- extern TOKBEF TokBefDesc[];
-
- int
- MakeToken ()
- {
- int i,j;
- int LineSym;
- char *TokLine;
- /* Tokenpointer auf Zielzeile */
- TokLine = ActLine->Zeile;
- if (Scan () == UNEOL) /* Lies nächstes Symbol ein */
- return (ERROR);
-
- /* suche nach einem gültigen Interpreter-Befehl */
- if (TestBefehl(&i) == 0) { /* Befehl gefunden */
- /* Token in Zielzeile speichern */
- *TokLine++ = i + TOKMIN;
- *TokLine = '\0';
- if (TokBefDesc[i].CopyRest) {
- /* kopiere den Rest der Zeile */
- strcat (TokLine,LinePos);
- return (OK); /* das war's. Zeile fertig */
- }
- else /* anderenfalls alle Einzelsymbole holen */
- for (LineSym = TokBefDesc[i].ParaCount;
- LineSym ; LineSym--) {
- /* nächste Zeichenkette einlesen */
- if (Scan () == SCANOK)
- if (TestBefehl(&i) == 0) {
- /* Token in Zielzeile speichern */
- *TokLine++ = i + TOKMIN;
- *TokLine = '\0';
- }
- else {
- strcat (TokLine,ScanBuffer);
- /* Zeiger ans Zeilenende */
- TokLine = strchr (TokLine,'\0');
- }
- else
- return (ERROR);
- }
- }
- else
- return (ERROR);
- return (OK);
- }
-
- /* TestBefehl
- suche nach einem gültigen Interpreter-Befehl
- */
-
- int
- TestBefehl (Befehl)
- int *Befehl;
- {
- register int i,j;
-
- for (i = 0;
- (TokBefDesc[i].function != NULL) &&
- ((j = strcmp(TokBefDesc[i].Befehl,ScanBuffer)) != 0)
- ; i++) {
- }
- *Befehl = i;
- return (j);
- }
-
- /**************** Ende des Files INTERP.C *****************/
-