home *** CD-ROM | disk | FTP | other *** search
- /*****************************************************************/
- /***** ARRAYS für TXL : Als Elemente STRINGS und Zahlen möglich **/
- /***** (c) Februar 1991 Elmar Warken *****************************/
- /*****************************************************************/
-
- #include <mem.h>
- #include <alloc.h>
- #include <string.h>
- #include "interp.h"
-
- extern VAR *FirstVar; /* Zeiger auf die erste Variable */
- extern char ScanBuffer[ZEILENLAENGE]; /* Ergebnisbuffer des Scanners */
-
- /***** Arraydefinition ******/
- /***** Syntax : DefArray <name> : d1 [,d2] [,d3] *****/
- int cDefArray(void)
- {
- char *n,name[50];
- long d1,d2,d3;
- int dim;
- VAR *Variable;
- d1=d2=d3=dim=1;
-
- /*** Parameter einlesen ***/
-
- if ( GetVarNameParam(&n) && strcpy(name,n) &&
- GetSonderZeichen(':') &&
- GetIntegerParam(&d1) )
- {
- if (GetSonderZeichen(',') && GetIntegerParam(&d2))
- {
- dim=2;
- if (GetSonderZeichen(',') && GetIntegerParam(&d3))
- dim=3;
- }
- } else
- {
- serror(" Syntaxfehler bei DefArray! ");
- return(FALSE);
- }
-
- /*** eigentliche Definition ***/
-
- if ((Variable = IsVariable (name)) != NULL) {
- if (Variable->VarType==ARRAY)
- free(Variable->VarWert.variable.feld);
- else {
- serror(" Falscher Typ bei Arrayredefinition ");
- return(FALSE);
- }
- }
- else
- {
- if ((Variable = malloc(sizeof (VAR))) == NULL) {
- serror ("\n Kein Speicherplatz mehr für die Variable! ");
- return(FALSE);
- }
- Variable->NextVar = FirstVar;
- FirstVar = Variable;
- }
-
- if ((Variable->VarWert.variable.feld
- =malloc(sizeof(ARRAYVAR *)*d1*d2*d3))==NULL)
- {
- serror ("\n Kein Speicherplatz mehr für das Array! ");
- return(FALSE);
- }
-
- setmem(Variable->VarWert.variable.feld,sizeof(ARRAYVAR *)*d1*d2*d3,0) ;
-
- strcpy (Variable->VarName,name);
- Variable->VarType = ARRAY;
- Variable->VarWert.dim1 = dim;
-
- Variable->VarWert.dimdef[0]=d1;
- Variable->VarWert.dimdef[1]=d2;
- Variable->VarWert.dimdef[2]=d3;
-
- return(OK);
- }
-
- /** Hilfsprozedur ohne Fehlerabfrage **/
- ARRAYVAR **GetElem(VAR *Variable,int d1,int d2,int d3)
- {
- ARRAYVAR **av;
-
- av=(ARRAYVAR **)Variable->VarWert.variable.feld;
-
- if ( (d1>Variable->VarWert.dimdef[0]) ||
- (d2>Variable->VarWert.dimdef[1]) ||
- (d2>Variable->VarWert.dimdef[2]) )
- { d1=0; d2=0; d3=0;
- serror(" Versuch, Arraygrenzen zu überschreiten! ");
- } /** bei Grenzüberschreitung : Feld (0,0,0) **/
- else return( av+d1+
- d2*Variable->VarWert.dimdef[0]+
- d3*Variable->VarWert.dimdef[0]*Variable->VarWert.dimdef[1]
- );
- }
-
- /***** Arrayelement setzen ******/
- /***** Syntax : SetArrayElem <name> (d1 [,d2] [,d3]) = <VAR> *****/
- int cSetArrayElem(void)
- {
- char *n1,*name2,name1[50];
- long d1,d2,d3;
- int dim;
- VAR *Variable1, *Variable2;
- ARRAYVAR **AV;
-
- d1=d2=d3=0; dim=1;
- if ( GetVarNameParam(&n1) && strcpy(name1,n1) &&
- GetSonderZeichen('(') &&
- GetIntegerParam(&d1) )
- {
- if (GetSonderZeichen(',') && GetIntegerParam(&d2))
- {
- dim=2;
- if (GetSonderZeichen(',') && GetIntegerParam(&d3))
- dim=3;
- }
- } else
- {
- serror(" Syntaxfehler bei SetArrayElem! ");
- return(FALSE);
- }
-
- if ( ( *ScanBuffer == ')' || GetSonderZeichen(')') ) &&
- GetSonderZeichen('=') &&
- GetVarNameParam(&name2) &&
- ( (Variable1 = IsVariable (name1)) != NULL) &&
- ( (Variable2 = IsVariable (name2)) != NULL) &&
- (Variable1->VarType==ARRAY) )
- {
- if (*(AV=GetElem(Variable1,d1,d2,d3))==NULL)
- {
- if ( (*AV=malloc(sizeof (ARRAYVAR))) == NULL)
- {
- serror(" SetArrayElem : Kein Speicherplatz mehr für Arrayelement. ");
- return(FALSE);
- }
- (*AV)->VarType=FIXNUM;
- } /*** Setzen des Arrayelementes : ***/
- switch (Variable2->VarType)
- {
- case ARRAY : serror(" SetArrayElem : Arrays nicht als Arrayelement möglich! ");
- return(FALSE);
- case STRING : if ( (*AV)->VarType==STRING )
- free( (*AV)->VarWert.variable.text );
- if (((*AV)->VarWert.variable.text
- =malloc(Variable2->VarWert.dim1+1))==NULL) {
- serror ("\n Kein Speicherplatz mehr für den String! ");
- return(FALSE);
- }
- strcpy((*AV)->VarWert.variable.text,
- Variable2->VarWert.variable.text);
- (*AV)->VarWert.dim1=Variable2->VarWert.dim1;
- (*AV)->VarType=STRING;
- break;
- default : (*AV)->VarType=Variable2->VarType;
- (*AV)->VarWert=Variable2->VarWert;
- }
- return(OK);
- }
- serror(" Syntaxfehler oder undefinierte Variable bei SetArrayElem ");
- return(FALSE);
- }
-
- /***** Arrayelement lesen ******/
- /***** Syntax : GetArrayElem <name> (d1 [,d2] [,d3]) -> <VAR> *****/
- int cGetArrayElem(void)
- {
- char *n1,*name2,name1[50];
- long d1,d2,d3;
- int dim;
- VAR *Variable1, *Variable2;
- ARRAYVAR **AV;
-
- d1=d2=d3=0; dim=1;
- if ( GetVarNameParam(&n1) && strcpy(name1,n1) &&
- GetSonderZeichen('(') &&
- GetIntegerParam(&d1) )
- {
- if (GetSonderZeichen(',') && GetIntegerParam(&d2))
- {
- dim=2;
- if (GetSonderZeichen(',') && GetIntegerParam(&d3))
- dim=3;
- }
- } else
- {
- serror(" Syntaxfehler bei GetArrayElem! ");
- return(FALSE);
- }
-
- if ( ( *ScanBuffer == ')' || GetSonderZeichen(')') ) &&
- GetSonderZeichen('-') &&
- GetSonderZeichen('>') &&
- GetVarNameParam(&name2) &&
- ( (Variable1 = IsVariable (name1)) != NULL) &&
- (Variable1->VarType==ARRAY) )
- {
- if (*(AV=GetElem(Variable1,d1,d2,d3))==NULL)
- {
- serror(" Arrayelement undefiniert (GetArrayElem)! ");
- return(FALSE);
- } /*** Setzen des Arrayelementes : ***/
-
- if ((Variable2 = IsVariable (name2)) == NULL)
- {
- if ( (Variable2=malloc(sizeof(VAR))) == NULL)
- {
- serror(" GetArrayElem : Kein Speicherplatz mehr für Variable. ");
- return(FALSE);
- } else
- { /*** Neue Variable anlegen ***/
- strcpy(Variable2->VarName,name2);
- Variable2->NextVar=FirstVar;
- FirstVar=Variable2;
- }
- }
-
- Variable2->VarType=(*AV)->VarType;
- Variable2->VarWert=(*AV)->VarWert;
- return(OK);
- }
- serror(" Syntaxfehler oder undefinierte Variable bei GetArrayElem ");
- return(FALSE);
- }