home *** CD-ROM | disk | FTP | other *** search
- /* ibefehle.c
- In diesem File befinden sich die Befehle des
- Interpreters.
- (c) 1990 Michael Beising & TOOLBOX
- */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.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- */
- /* geteilt, um was es sich handelt. */
- extern char ScanBuffer[ZEILENLAENGE]; /* Ergebnisbuffer des Scanners */
- extern int traceFlag; /* Trace ja/nein*/
- extern TOKBEF TokBefDesc[];
-
- /* cset() Zuweisen eines Wertes einer Variablen */
- int
- cset(void)
- {
- VAR Variable;
-
- Scan (); /* Name der Variablen lesen */
- if (Steuer == ALPHA) {
- strcpy (Variable.VarName,ScanBuffer); /* Variablennamen setzen */
- Scan ();
- if ((Steuer == SONDER) && (*ScanBuffer == '=')) {
- SetVar (&Variable);
-
- }
- else
- serror ("Zuweisung erwartet! ");
- }
- else
- serror ("Variablenname erwartet! ");
-
- return (OK);
- }
-
- /* cdruck () Ausgabe von Werten auf dem Bildschirm
-
- dies können in der neuen Version auch Ausdrücke sein,
- diese werden dann zuerst berechnet, und das Ergebnis gedruckt
-
- */
- int
- cdruck(void)
- {
- VAR Wert;
-
- if ( CalcExpression( &Wert ) == OK ){
- switch ( Wert.VarType ) {
- case STRING:
- printf ( "%s",Wert.VarWert.variable.text );
- break;
- case ZIFFER:
- printf ( "%d",Wert.VarWert.variable.integer );
- break;
- case FLONUM :
- printf( "%f",Wert.VarWert.variable.Flotype );
- break;
- default :
- fatal_error("zu druckender Typ ist unbekannt\n" );
- break;
- }
- }
- else
- if ( Steuer == EOLCHAR ) printf("\n");
- else serror( "ungültiger Ausdruck" );
-
- return (OK);
- }
-
- /* cgoto () Fortführen des Programms an einer anderen Stelle */
- extern int GetNextLine; /* Nächste Zeile ausführen */
-
-
- int ccommands()
- {
- int i=0, x;
- printf("\n\nNachfolgende Befehle sind unter dem TXL-Interpreter verfügbar :\n");
- printf("---------------------------------------------------------------\n");
- while( (char *)TokBefDesc[i].Befehl != NULL )
- {
- x++;
- if (x >4)
- {
- printf("\n");
- x=0;
- }
- printf("%s\t",(char *)TokBefDesc[i++].Befehl);
- }
- printf("\n\n");
- return(OK);
- }
-
-
- int
- cgoto(void)
- {
- register int error,LineNumber;
-
- Scan ();
- /* Ist es eine Ziffer und gibt es ein Programm dazu? */
- if ((Steuer == ZIFFER) && FirstLine) {
- LineNumber = atoi (ScanBuffer); /* Calculate Jump Line */
- if (FindInsPos (LineNumber,&ActLine)) {
- ActLine = ActLine->PrevZeile;
- GetNextLine = FALSE; /* Zeile ist aktuelle Zeile */
- return (OK);
- }
- else {
- printf ("\n Sprungziel nicht gefunden! ");
- return (FALSE); /* Sprungziel nicht gefunden */
- }
- }
- else
- printf ("\n Kein Programm im Speicher! ");
-
- return (OK);
- }
-
-
- /* cif () bedingte Ausführung von Befehlen */
- int
- cif()
- {
- int result = OK;
-
- /* Wenn Bedingung nicht erfüllt, dann übernächste Zeile */
- if (CmpVar ()) {
- ActLine = ActLine->NextZeile; /* Dann-Zeile auswählen */
- LinePos = ActLine->Zeile; /* Zeilenanfang */
- result = InterpLine (); /* Dann-Zweig ausführen */
- ActLine = ActLine->NextZeile;
- }
- else
- if (ActLine->NextZeile)
- ActLine = ActLine->NextZeile; /* Sonst-Zweig ausführen */
- else
- serror (" Kein Sonst-Zweig vorhanden! ");
-
- return (result);
- }
-
-
- int
- crun ()
- {
-
- if (FirstLine) {
- ActLine = FirstLine;
- /* alle Zeilen bis zur letzten oder bis Ende-Befehl ausführen */
- DoProgram ();
- }
- else
- printf ("\n Kein Programm im Speicher! \n");
-
- return (OK);
- }
-
- /* cende () ende des Interpreterprogramms */
- extern PRGZEILE *FirstLine;
-
- int
- cende ()
- {
-
- printf ("\n Normales Programmende... \n");
-
- return (FALSE);
- }
-
-
- /* cexit: Ende des Interpreters */
-
- int
- cexit ()
- {
- printf ("\n Interpreter verlassen... \n");
- exit (0);
-
- return (OK);
- }
-
- int
- cmerke ()
- {
-
- return (OK);
- }
-
- /* clist: Auflisten des aktuellen Programms
- */
-
- int
- clist ()
- {
- PRGZEILE *FindZeile;
- char *Line;
-
-
- /* Wenn es eine erste Zeile gibt, setze Zeiger darauf */
- if ((FindZeile = FirstLine) != NULL) {
- printf ("\n ### Aktuelles Programm auflisten: ###\n");
- while ( FindZeile) {
- ShowLine (FindZeile);
- FindZeile = FindZeile->NextZeile;
- }
- printf ("\n ### Ende des aktuellen Programms! ###\n");
- }
-
- return (TRUE);
- }
-
- /* cload
- Laden eines Interpreterprogramms in den Hauptspeicher.
- */
-
- int
- cload ()
- {
-
- Scan(); /* Filename einlesen */
- if (Steuer == STRING) {
- SetFileName (ScanBuffer); /* Filename setzen */
- ReadProg (); /* Programm einlesen */
- }
- else
- serror ("Kein Filename angegeben! ");
-
- return (OK);
- }
-
- /* csave
- Speichern eines Interpreterprogramms in den Hauptspeicher.
- */
-
- int
- csave ()
- {
-
- Scan(); /* Filename einlesen */
- if (Steuer == STRING) {
- SetFileName (ScanBuffer); /* Filename setzen */
- WriteProg (); /* Programm einlesen */
- }
- else
- serror ("Kein Filename angegeben! ");
- return (OK);
- }
-
- /* cneu
- Aktuelles Programm aus dem Speicher löschen.
- */
-
- int
- cneu ()
- {
- ClearProg (); /* Programm löschen */
-
- return (OK);
- }
-
- /* ctrcon Trace einschalten, d.h. Einzelschrittmodus */
-
- int ctrcon()
- {
- printf( "\nWachhund liegt auf der Lauer ( Hilfe mit <H> )\n" );
- traceFlag = TRUE;
- return ( OK );
- }
-
- /* ctrcoff Trace ausschalten */
-
- int ctrcoff()
- {
- traceFlag = FALSE;
- return ( OK );
- }
-
- /* cwdog : den Tracer für EINE Kontrolle aufrufen
- es wird nicht in den Einzelschrittmodus geschaltet
- */
-
- int cwdog()
- {
- printf( "wuff wuff\n" );
- printf( "<H> bringt Hilfe\n" );
- Trace();
- return( OK );
- }
-
- /* creadvar : lies einen Wert ein, und weist ihn einer Variablen zu
- es können auch usdrücke angegeben werden, die dann
- zuerst berechnet werden
- Strings müssen in " eingeschlossen sein
- */
-
- int creadvar()
- {
- VAR NewVar;
- char wert[ZEILENLAENGE];
-
- Scan();
- if ( Steuer != ALPHA ){
- serror( "<lese> erwartet einen Variablenbezeichner" );
- return( FALSE );
- }
-
- strcpy(NewVar.VarName,ScanBuffer );
- putchar( '?' ); gets( wert );
- if (!strchr(wert,';')) strcat (wert,";"); /*wenn kein ; dann anf.*/
- LinePos = wert; SkipChar();
- SetVar( &NewVar );
-
- return( OK );
- }
-
- /* ccopy :
- Syntax : kopiere Stringausdruck "," Stringvariable "," num. Ausdruck
-
- kopiert Stringausdruck ab der durch den numerischen Ausdruck
- bestimmten Position in die Stringvariable
-
- Bsp. kopiere "hey",s,2
- kopiert "hey" ab Position 2 in s
- */
-
- int ccopy()
- {
- VAR src, /* zu kopierender Teil */
- *dst; /* Original, hier wird einkopiert */
- size_t dlen,newlen;
- char *s,*d; /* Hilfzeiger zum kopieren */
- long abda; /* ab da einkopieren */
-
- src.VarWert.variable.text = NULL;
- CalcExpression( &src );
- if ( src.VarType != STRING ){
- serror( "String erwartet als 1.P." ); return( FALSE );
- }
- if ( !TestComma()) return ( FALSE );
-
- if ( !GetStringVar( &dst )) return ( FALSE );
- Scan(); /* Komma lesen */
- if ( !TestComma()) return ( FALSE );
- if ( ! GetLong ( &abda )) return ( FALSE );
-
- dlen = strlen( dst->VarWert.variable.text ); /* Länge des Orignals */
- newlen = abda + strlen(src.VarWert.variable.text );
- if ( newlen > dlen )
- /* mehr Speicher anfordern, wenn String durch kopieren länger */
- dst->VarWert.variable.text = realloc( dst->VarWert.variable.text,newlen );
-
- s = src.VarWert.variable.text; /* dies hier ... */
- d = dst->VarWert.variable.text + abda; /* ... nach da ... */
-
- while ( *s != '\0' ) *d++ = *s++; /* ... kopieren */
- if ( dlen < newlen ) *d ='\0'; /* wenn neuer String länger,
- '\0' anhängen */
- return( OK );
- }
-
- /* cins :
- Syntax : einfuegen Stringausdruck "," Stringvariable "," num. Ausdruck
-
- fügt Stringausdruck ab der durch den numerischen Ausdruck
- bestimmten Position in die Stringvariable ein
-
- Bsp. einfuegen "hallo",s,3
- fügt "hallo" an Position 3 in s ein
- */
-
- int cins()
- {
- VAR src, /* einzufügender Teil */
- *dst; /* Original */
- size_t slen,dlen;
- char *s,*d,*ins; /* Hilfszeiger zum Platz schaffen u. kopieren */
- long abda; /* ab hier einfügen */
-
- src.VarWert.variable.text = NULL;
- CalcExpression( &src );
- if ( src.VarType != STRING ){
- serror( "String erwartet als 1.P." ); return( FALSE );
- }
- if ( !TestComma()){ printf(" nach P1\n" ); return( FALSE ); }
- if ( !GetStringVar ( &dst )) return ( FALSE );
- Scan(); /* Komma lesen */
- if ( !TestComma()){ printf( "nach P2\n" ); return ( FALSE ); }
- if ( ! GetLong( &abda )) return ( FALSE );
-
- dlen = strlen( dst->VarWert.variable.text );
- slen = strlen(src.VarWert.variable.text );
-
- /* der String wird länger => mehr Speicher */
- dst->VarWert.variable.text = realloc( dst->VarWert.variable.text,slen+dlen );
-
- s = dst->VarWert.variable.text + ( dlen - 1 );
- d = dst->VarWert.variable.text + ( dlen + slen );
- *d = '\0'; d--;
-
- /* bis hier Platz schaffen */
- ins = dst->VarWert.variable.text + abda;
-
- while ( s >= ins ) *d-- = *s--; /* nach rechts schieben */
-
- s = src.VarWert.variable.text; /* das hier einsetzen */
- while ( *s != '\0' ) *ins++ = *s++; /* und endlich einsetzen */
-
- return( OK );
- }
-
- /* cdel :
- Syntax : loesche Stringvariable "," 1. num. Ausdruck "," 2. num. Ausdruck
-
- löscht die durch den 1. num. Ausdruck bestimmte Anzahl von
- Zeichen ab der durch den 2. Ausdruck bestimmten Position in
- der Stringvariablen
-
- Bsp. loesche s,laenge(s)-1,1
- löscht alle Zeichen ab dem ersten
- */
-
- int cdel()
- {
- VAR *str; /* in diesem String wird gelöscht */
- long abda, /* ab da wird gelöscht */
- schieb; /* löschen durch linksschieben der Zeichen,
- die hinter dem zu löschenden Teil stehen */
- char *s,*d; /* Hilfszeiger */
- size_t len; /* ursprüngliche Länge */
-
- if ( !GetStringVar ( &str )) return ( FALSE );
- len = strlen( str->VarWert.variable.text );
- Scan(); /* Komma lesen */
- if ( !TestComma()) return ( FALSE );
- if ( !GetLong( &schieb )) return ( FALSE ); /* 2.P. */
- if ( !TestComma()) return ( FALSE );
- if ( !GetLong( &abda )) return ( FALSE ); /* 3.P. */
-
- if ( abda >= len ) return(OK); /* abda hinter Stringende */
- schieb += abda; /* von hier an schieben */
- if ( schieb > len ) schieb = len; /* aber nicht mehr als da sind */
-
- d = str->VarWert.variable.text;
- s = d + schieb; d += abda;
- while (( *d++ = *s++ ) != '\0' ); /* schieb schieb hurra */
- *s = '\0'; /* neues Ende */
-
- return( OK );
- }/* cdel */
-
- /* Ende des Files IBEFEHLE.C */
-