home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1991
/
04
/
txl
/
3_preis
/
fast
/
interp.c
< prev
next >
Wrap
Text File
|
1990-11-17
|
10KB
|
315 lines
/**********************************************************/
/* 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"
#include "neuutil.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 */
extern TOKBEF TokBefDesc[]; /* NEU für Befehlsfindung */
/* lokale Funktionen und deren Prototypen dieses Files */
static int TestBefehl (int *Befehl);
void
InterAct ()
{
PRGZEILE NewLine; /* interaktiv eingegebene Zeile */
PRGZEILE *EditZeile; /* NEU Editierzeile */
int Error; /* Fehlermeldungen zwischensp. */
int abbruch[3]; /* NEU intarray für Abbruchtasten von LESE() */
int i; /* NEU Zähler */
int loesch=1; /* NEU Switch für ReadBuffer-Löschung */
register int reg; /* NEU für Befehlsfindung */
int farbe_v,farbe_h; /* NEU für Farbsicherung */
char ReadBuffer[ZEILENLAENGE]; /* Buffer für eine Eingabezeile*/
abbruch[0]=ESC; /* NEU ESC-Abbruch für LESE() */
abbruch[1]=F1; /* NEU F1-Abbruch für LESE() */
abbruch[2]='\0';
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 */
setcr(24,0);
putchar (0x0d);putchar(0x0a); /* <cr>-<lf> ausgeben */
putchar ('>'); /* Prompt ausgeben */
/* NEUE VERSION */
_lastkey=ESC;
if(loesch) /* ReadBuffer Löschen */
for(i=0;i<=ZEILENLAENGE-1;i++)
ReadBuffer[i]=' ';
else /* ReadBuffer auf orginallänge setzen */
for(i=strlen(ReadBuffer); i<=(ZEILENLAENGE-1) ;i++)
ReadBuffer[i]=' ';
ReadBuffer[ZEILENLAENGE-1]='\0'; /* Stringende setzen */
loesch=1; /* Lösch-Switch Initialisieren */
while(_lastkey == ESC || _lastkey == F1) /* While letzte Taste ESC oder F1 */
{
putchar ('>'); /* Prompt ausgeben */
farbe_v=_set_f_v;
farbe_h=_set_f_h;
set_color(7,0);
/* ReadBuffer einlesen auf Zeile 24 Spalte 1 */
lese(24,1,ReadBuffer,"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",abbruch);
if (_lastkey==F1) /* Hilfe ausgeben */
{
LinePos = ReadBuffer;
SkipChar ();
chilfe();
setcr(24,0);
}
set_color(farbe_v,farbe_h);
}
/* ReadBuffer auf Eingabelänge kürzen */
for(i=strlen(ReadBuffer)-1;ReadBuffer[i] == ' ' && i >= 0;i--)
;
ReadBuffer[++i] = '\0';
/* ENDE NEU */
/* 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
/* NEUE VERSION */
{
Scan();
if(strlen(ScanBuffer)==1 && Steuer == ALPHA) /* 1 Alphazeichen */
{
switch ((int)ScanBuffer[0])
{
case 'D': /* Zeile löschen */
case 'd':
/* Wenn Zeilennummer vorhanden , Zeile löschen */
if (FindInsPos(ActLine->LineNumber,&EditZeile))
{
printf ("\n Zeile [%d] ist gelöscht !",NewLine.LineNumber);
DelLine (NewLine.LineNumber);
}
else
/* Sonst Fehlermeldung */
printf("\n Zeile [%d] nicht gefunden !",NewLine.LineNumber);
break;
case 'E': /* Zeile editieren */
case 'e':
/* Wenn Zeilennummer vorhanden , Zeile aufbereiten */
if (FindInsPos(ActLine->LineNumber,&EditZeile))
/* Kopiere den alten Inhalt in die Eingabe Zeile */
{
itoa(EditZeile->LineNumber,ReadBuffer,10);
strcat(ReadBuffer," ");
reg = 0xff & *(EditZeile->Zeile);
strncat(ReadBuffer,TokBefDesc[reg-TOKMIN].Befehl,10);
strcat(ReadBuffer," ");
strcat(ReadBuffer,(EditZeile->Zeile+1));
loesch=0;
}
else
/* Sonst Fehlermeldung */
printf("\n Zeile [%d] nicht gefunden !",NewLine.LineNumber);
break;
default:
/* Falsches Argument */
loesch=0;
printf("\n Zeile [%d] ist fehlerhaft !",
NewLine.LineNumber);
}
}
else
/* Kein Argument oder ungültiger Befehl */
{
printf("\n Zeile [%d] ist fehlerhaft !",NewLine.LineNumber);
loesch=0;
}
}
/* ENDE NEUE VERSION */
}
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 ("<InterpLine> 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 *****************/