home *** CD-ROM | disk | FTP | other *** search
- /***
- Funktionen zur Parameterbearbeitung
- und in TXL verwendbar :
- Unterprogramme und Zufallszahlen
-
- (c) 1991 Elmar Warken
- ***/
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <alloc.h>
- #include <time.h>
- #include "interp.h"
-
- /* Benötigte Globalvariablen */
- extern PRGZEILE *FirstLine; /* erste Interpreterzeile */
- extern PRGZEILE *ActLine; /* aktuelle interpretierte Zeile */
- extern char *LinePos; /* Zeilenposition der aktuellen Zeile*/
- extern int Steuer; /* der aufrufenden Routine wird mit- */
- extern VAR *FirstVar; /* Zeiger auf die erste Variable */
- /* geteilt, um was es sich handelt. */
- extern char ScanBuffer[ZEILENLAENGE]; /* Ergebnisbuffer des Scanners */
- extern int IntError;
- extern int GetNextLine;
- int ebene=0;
-
- /**** wie DoProgram mit zusätzlicher Abbruchbedingung
- ( "blockend" erreicht )
- ****/
-
- int cbegin(void)
- {
- register int error=TRUE;
- int ausstieg=ebene;
- ebene++;
- ActLine=ActLine->NextZeile;
- do {
- LinePos = ActLine->Zeile;
- GetNextLine=TRUE;
- error = InterpLine();
- if (GetNextLine)
- ActLine = ActLine->NextZeile;
- if (IntError) break;
- }
- while ((ebene>ausstieg) && ActLine && error && (!IntError));
-
- return(OK);
- }
-
- int cend(void)
- {
- ebene--;
-
- return(OK);
- }
-
- /*** wie goto, springt aber nach Ausführung eines Befehls
- wieder zurück, dieser Befehl kann aber ein
- ganzer Block sein. Kann nicht nur aus TXL,
- sondern auch aus anderen Funktionen aufgerufen werden. ***/
-
- int dogosub(int LineNumber)
- {
- PRGZEILE *RETURN;
-
- Scan ();
-
- RETURN=ActLine;
- if (FindInsPos (LineNumber,&ActLine)) {
- LinePos=ActLine->Zeile;
- InterpLine();
- ActLine = RETURN; /*** GetNextLine=TRUE ***/
- return (OK);
- }
- else {
- printf ("\n Sprungziel nicht gefunden! ");
- return (FALSE);
- }
- }
-
- int cgosub(void)
- {
- long LineNumber;
- PRGZEILE *RETURN;
- int error;
-
- if (GetIntegerParam(&LineNumber) && FirstLine)
- error=dogosub(LineNumber);
- else
- printf ("\n Fehler bei GOSUB : kein Programm oder Parameterfehler! ");
-
- return (error);
- }
-
- int crandom(void)
- {
- char *VarName;
- long num;
-
- if (GetIntegerParam(&num) && GetVarNameParam(&VarName))
- {
- SetVarInt(VarName,random(num));
- return(OK);
- }
- serror(" in 'random'.");
- return(FALSE);
- }
-
- int crandomize(void)
- {
- randomize();
- return(OK);
- }
-
- void SetVarInt(char *name,long wert)
- {
- VAR *Variable;
-
- if ((Variable = IsVariable (name)) == NULL)
- {
- DefVarInt(name,wert);
- Variable = IsVariable (name);
- }
- else
- {
- if (Variable->VarType==FIXNUM)
- Variable->VarWert.variable.integer=wert;
- else
- serror("Variable hat falschen Typ! ");
- }
- }
-
- int DefVarInt (char *name, long val)
- {
- VAR *Variable;
-
- if ((Variable = IsVariable (name)) == NULL) {
- if ((Variable = malloc(sizeof (VAR))) == NULL) {
- printf ("\n Kein Speicherplatz mehr für die Variable! ");
- return(FALSE);
- }
-
- strcpy (Variable->VarName,name);
- Variable->VarType = FIXNUM;
- Variable->NextVar = FirstVar;
- Variable->VarWert.variable.integer=val;
- FirstVar = Variable;
- return(OK);
- }
- return(FALSE);
- }
-
- /* Nächster Parameter - Variable oder Konstante wird in "wert" zurückgegeben */
- /* Funktionsergebnis : OK oder FALSE */
- int GetIntegerParam(long *wert)
- {
- VAR *Variable;
-
- if (Scan()!=SCANOK) return(FALSE);
-
- if (Steuer==ZIFFER)
- {
- *wert=atol(ScanBuffer);
- return(OK);
- }
- if ((Variable = IsVariable (ScanBuffer)) != NULL)
- {
- if (Variable->VarType==FIXNUM)
- *wert=Variable->VarWert.variable.integer;
- else
- return(FALSE);
- return(OK);
- }
- return(FALSE);
- }
-
- /* Nächster Parameter - Variable oder Konstante wird in "wert" zurückgegeben */
- /* Funktionsergebnis : OK oder FALSE */
- int GetStringParam(char **wert)
- {
- VAR *Variable;
-
- if (Scan()!=SCANOK) return(FALSE);
-
- if (Steuer==STRING)
- {
- *wert=ScanBuffer;
- return(OK);
- }
- if ((Variable = IsVariable (ScanBuffer)) != NULL)
- {
- if (Variable->VarType==STRING)
- *wert=Variable->VarWert.variable.text;
- else
- return(FALSE);
- return(OK);
- }
- return(FALSE);
- }
-
- /* Nächster Parameter - Zahlenvariable */
- /* Funktionsergebnis : OK oder FALSE */
- /* keine Fehlermeldung, wenn nicht OK, */
- /* da es sich um einen optionalen */
- /* Parameter handeln könnte */
-
- int GetNumbVarParam(long **wert)
- {
- VAR *Variable;
-
- if (Scan()!=SCANOK) return(FALSE);
-
- if (Steuer==ALPHA)
- {
- if ((Variable = IsVariable (ScanBuffer)) == NULL)
- { DefVarInt (ScanBuffer,0);
- Variable = IsVariable (ScanBuffer); }
- if (Variable->VarType==FIXNUM)
- *wert=&Variable->VarWert.variable.integer;
- else
- return(FALSE);
- return(OK);
- }
- return(FALSE);
- }
-
- /* Nächster Parameter - Stringvariable */
- /* Funktionsergebnis : OK oder FALSE */
-
- int GetStrVarParam(char **wert)
- {
- VAR *Variable;
-
- if (Scan()!=SCANOK) return(FALSE);
-
- if (Steuer==ALPHA)
- {
- if ((Variable = IsVariable (ScanBuffer)) == NULL)
- {
- DefVarStr(ScanBuffer,100);
- Variable = IsVariable (ScanBuffer);
- }
- if (Variable->VarType==STRING)
- *wert=Variable->VarWert.variable.text;
- else
- return(FALSE);
- return(OK);
- }
- return(FALSE);
- }
-
-
- /* Nächster Parameter - Variablenname */
- /* Funktionsergebnis : OK oder FALSE */
-
- int GetVarNameParam(char **name)
- {
- VAR *Variable;
-
- if (Scan()!=SCANOK) return(FALSE);
-
- if (Steuer==ALPHA)
- {
- *name=ScanBuffer;
- return(OK);
- }
- return(FALSE);
- }
-
- int GetSonderZeichen(char c)
- {
- if (Scan () != SCANOK) return(FALSE);
-
- if ((Steuer == SONDER) && (*ScanBuffer == c))
- return(OK);
- else return(FALSE);
- }