home *** CD-ROM | disk | FTP | other *** search
- /* neubef.c
- In diesem File befinden sich die NEUEN Befehle des
- Interpreters.
- (c) 1990 Markus Merle & TOOLBOX
- */
-
- #include <dos.h>
- #include <alloc.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <conio.h>
- #include "interp.h"
- #include "neuutil.h"
-
- void str_ins(unsigned char *str, int w, int l, char c,unsigned char *pic);
- void str_del(unsigned char *str, int w, int l,unsigned char *pic);
- int dezmove(unsigned char *str, unsigned char *pic);
- int nummove(unsigned char *str);
- int dezset(unsigned char *str, unsigned char *pic);
- int datum_pruef(char *str);
-
-
- /* 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- */
- int c_lastkey=10; /* geteilt, um was es sich handelt. */
- extern char ScanBuffer[ZEILENLAENGE]; /* Ergebnisbuffer des Scanners */
-
-
- /* chilfe
- Hilfebildschirm anzeigen.
- */
-
- extern TOKBEF TokBefDesc[];
-
- int
- chilfe()
- {
- static unsigned char seite[4], zeile[85], s_screen[4003], s_buffer[30];
- unsigned char *z, such[21],pic[21];
- int laenge, anzahl, taste, weiter=1, loop, pos=0;
- int i,alles=1,ii,jj,kk,out[8];
- long dpos[100];
- FILE *hilfe; /* Hilfedatei */
-
-
- if((hilfe = fopen("hilfe.txl", "rb")) == NULL)
- {
- printf("\n<hilfe> Fehler beim Eröffnen der Hilfedatei < HILFE.TXL >\n");
- cls();
- return(OK);
- }
-
-
- Scan();
- if(Steuer == ZIFFER)
- Scan();
-
- if ((Steuer == STRING || Steuer == ALPHA) && strcmp(ScanBuffer,"hilfe") != 0)
- {
- for (i=0;(TokBefDesc[i].function != NULL) &&
- ((alles=strcmp(TokBefDesc[i].Befehl,ScanBuffer)) != 0);i++)
- ;
- }
- savescreen(0,0,24,79,s_screen);
- out[0]=ESC;
- out[1]=PGUP;
- out[2]=PGDN;
- out[3]=CRUP;
- out[4]=CRDN;
- out[5]=F1;
- out[6]='\0';
- strcpy(pic,"XXXXXXXXXXXXXXXXXXXX");
- pos = 0;
- dpos[pos] = 0L;
- anzahl = 0;
- loop = 1;
- laenge = 0;
-
- if(!alles)
- {
-
- s_buffer[0]='<';
- s_buffer[1]='\0';
- strcat(s_buffer,ScanBuffer);
- ii=strlen(s_buffer);
- s_buffer[ii++]='>';
- s_buffer[ii]='\0';
-
-
- fseek(hilfe,0L,0);
- while(!feof(hilfe) && loop)
- {
- fgets(zeile,185,hilfe); /* Zeile lesen */
- if (!feof(hilfe))
- {
- laenge+=strlen(zeile);
- for(ii=0; zeile[ii] != '\0'; ++ii)
- {
- for(jj=ii, kk=0; s_buffer[kk] != '\0'
- && zeile[jj] == s_buffer[kk]; ++jj, ++kk)
- ;
- if(s_buffer[kk] == '\0')
- {
- laenge-=strlen(zeile);
- loop=0;
- break;
- }
- }
- }
- else
- {
- printf("\n<hilfe> Keine Hilfe zum Befehl gefunden !\n");
- warte();
- laenge=0;
- break;
- }
- }
- }
-
- dpos[pos]=(long) laenge;
-
- while(weiter) /* Solange nicht ESC */
- {
- fseek(hilfe,(long)dpos[pos],0);
- anzahl = 1;
- laenge = 0;
- loop = 1;
- itoa(pos+1,seite,10);
- cls();
- zeig(0,2,"**** TXL-Hilfe Seite : ****");
- zeig(0,29,seite);
- while( anzahl <= 23 && loop)
- {
- anzahl++;
- if (!feof(hilfe) && loop)
- {
- fgets(zeile,185,hilfe); /* Zeile lesen */
- if (!feof(hilfe))
- {
- laenge+=strlen(zeile);
- if ( (z=strchr(zeile,13)) != NULL )
- *z='\0';
- if( strchr(zeile,'|') == NULL )
- zeig(anzahl,0,zeile);
- else
- loop=0;
- }
- }
- }
-
- if(pos < 100)
- pos=pos+1;
- dpos[pos]= dpos[pos - 1] + (long)laenge;
-
- loop=1;
- while(loop)
- {
- loop = 0;
- zeig(24,0,"Suche < > <ESC> Ende <F1> Hilfe");
- strcpy(such," ");
- lese(24,8,such,pic,out);
- switch((int)_lastkey)
- {
- case ENTER :
- alltrim(such,such);
- if(strlen(such) <=1)
- {
- pos-=1;
- break;
- }
- for (i=0;(TokBefDesc[i].function != NULL) &&
- ((alles=strcmp(TokBefDesc[i].Befehl,such)) != 0);i++)
- ;
- if(!alles)
- {
-
- s_buffer[0]='<';
- s_buffer[1]='\0';
- strcat(s_buffer,such);
- ii=strlen(s_buffer);
- s_buffer[ii++]='>';
- s_buffer[ii]='\0';
-
-
- fseek(hilfe,0L,0);
- loop=1;
- laenge=0;
- while(!feof(hilfe) && loop)
- {
- fgets(zeile,185,hilfe); /* Zeile lesen */
- if (!feof(hilfe))
- {
- laenge+=strlen(zeile);
- for(ii=0; zeile[ii] != '\0'; ++ii)
- {
- for(jj=ii, kk=0; s_buffer[kk] != '\0'
- && zeile[jj] == s_buffer[kk]; ++jj, ++kk)
- ;
- if(s_buffer[kk] == '\0')
- {
- laenge-=strlen(zeile);
- loop=0;
- break;
- }
- }
- }
- else
- {
- loop=0;
- printf("\n<hilfe> Keine Hilfe zum Befehl gefunden ! Taste drücken für weiter \n");
- warte();
- dpos[0]=0L;
- pos=0;
- laenge=0;
- break;
- }
- }
- pos=0;
- dpos[0]= (long) laenge;
- }
- else
- {
- dpos[0]=0L;
- pos=0;
- }
-
- break;
-
- case PGDN :
- case CRDN :
- if(!feof(hilfe))
- {
- if(pos==0)
- pos=1;
- loop=0;
- break;
- }
- loop=1;
- break;
-
- case PGUP :
- case CRUP :
- if (pos > 1)
- {
- pos=pos-2;
- loop=0;
- break;
- }
- loop=1;
- break;
-
- case HOME :
- dpos[0]=0L;
- pos=0;
- break;
-
- case ESC :
- weiter=0;
- loop=0;
- break;
-
- case F1 :
- cls();
- zeig(0,2, "╔═════════════════════════════════════════╗");
- zeig(1,2, "║ Hilfe zur TXL-Hilfe ║");
- zeig(2,2, "╟─────────────────────────────────────────╢");
- zeig(3,2, "║ ║");
- zeig(4,2, "║ Pfeiltaste rauf : eine Seite zurück ║");
- zeig(5,2, "║ runter : eine Seite weiter ║");
- zeig(6,2, "║ ║");
- zeig(7,2, "║ ESC : Hilfe verlassen ║");
- zeig(8,2, "║ ║");
- zeig(9,2, "║ ║");
- zeig(10,2,"║ Suche : ║");
- zeig(11,2,"║ Geben Sie den Befehl ein, ║");
- zeig(12,2,"║ von welchem die Hilfe ║");
- zeig(13,2,"║ erscheinen soll. ║");
- zeig(14,2,"║ ║");
- zeig(15,2,"╚═════════════════════════════════════════╝");
- zeig(18,5,"Taste drücken für weiter");
- warte();
- pos-=1;
- break;
-
- default :
- loop=1;
- }
- }
- }
-
- fclose(hilfe); /* Hilfedatei schließen */
- cls();
- restscreen(0,0,24,79,s_screen);
- return (OK);
- }
-
-
- /* ****************************************************
- CZEIG();
-
- Zeigt einen Sting am Bildschirm in der
- Farbe die Sie mit set_farbe() eingestellt haben.
-
- zeig n1 n2 str
-
- n1 = Zeile (0 - 24)
- n2 = Spalte (0 - 79)
- str = Ausgabetext/Variable
-
- */
-
- int
- czeig()
-
- {
- VAR *Variable;
- long z,s;
- unsigned char str[81], pic[81];
- int i,y,len,weiter=FALSE;
-
-
- if (!iparam(&z,"Zeig"))
- return(FALSE);
-
- if(z < 0 || z > 24)
- {
- pperror ("Zeile 0-24","Zeig");
- return(FALSE);
- }
-
- if (!iparam(&s,"Zeig"))
- return(FALSE);
-
- if(s<0 || s>79)
- {
- pperror ("Spalte 0-79","Zeig");
- return(FALSE);
- }
-
- if (!allstrparam(str,(80-s),"Zeig"))
- return(FALSE);
-
- if (ParamVar)
- {
- Scan();
- switch (Steuer)
- {
- case ALPHA:
- if(strcmp(ParamName,ScanBuffer)!=0)
- {
- pperror ("{ungültige Ausgabemaske}","Zeig");
- return(FALSE);
- }
- break;
-
- case STRING:
- strncpy(pic,ScanBuffer,(80-s));
- pic[80-s]='\0';
- weiter=OK;
- break;
-
- case EOLCHAR:
- break;
-
- default:
- pperror("{ungültige Ausgabemaske}","Zeig");
- return(FALSE);
- }
-
- if (weiter)
- {
- if (ParamType == FLONUM)
- dezset(str,pic);
-
- y = strlen(pic);
- len = strlen(str);
-
- if (len < y)
- {
- if (ParamType == STRING)
- {
- pic[len]='\0';
- y=len;
- }
- else
- {
- for(i=len;i<y;i++)
- str_ins(str,0,y,' ',pic);
- str[y]='\0';
- }
- }
-
- if ((len=strlen(str)) > y)
- {
- if(ParamType != STRING)
- {
- for(i=y-1,len--;i>=0;i--,len--)
- str[i]=str[len];
- }
- str[y]='\0';
- }
- }
- }
-
- zeig(z,s,str);
- return(OK);
-
- }
-
-
- /* *******************************************************
- Zeichnet eine Box auf den Bildschirm.
- Parameter : o,ol,u,ur obere Zeile, Spalte untere Zeile, Spalte
- *tab Boxstring "╔═╗║╝═╚║ "
-
- zB. "abcdefgh#" abbbc
- d###h
- gfffe
-
-
- */
-
- int
- cbox(void)
-
- {
- long o,ol,u,ur;
- unsigned char tab[10];
-
- if (!iparam(&o,"Box"))
- return(FALSE);
-
- if(o < 0 || o > 24)
- {
- pperror ("Obere Zeile 0-24","Box");
- return(FALSE);
- }
-
- if (!iparam(&ol,"Box"))
- return(FALSE);
-
- if(ol < 0 || ol > 79)
- {
- pperror ("Obere Spalte 0-79","Box");
- return(FALSE);
- }
-
- if (!iparam(&u,"Box"))
- return(FALSE);
-
- if(u < o || u > 24)
- {
- pperror ("Untere Zeile 0-24","Box");
- return(FALSE);
- }
-
- if (!iparam(&ur,"Box"))
- return(FALSE);
-
- if(ur < ol || ur > 79)
- {
- pperror ("Untere Spalte 0-79","Box");
- return(FALSE);
- }
-
- if (!strparam(tab,9,"Box"))
- return(FALSE);
-
- if (box(o,ol,u,ur,tab))
- return(OK);
-
- pperror("Ungültige Parameter","Box");
- return(FALSE);
- }
-
- /**********************************************************************
-
- Sellt die Farbe ein, die für zeig(),cls(), menu(), box() ect.
- verwendet werden soll.
-
- setfarbe n1 n2
-
- n1 = Vordergrundfarbe
- n2 = Hintergrundfarbe
-
-
- Die möglichen Farben :
-
- 0 schwarz
- 1 rot
- 2 grün
- 3 gelb
- 4 blau
- 5 magenta
- 6 cyan
- 7 weiss
-
- */
-
- int
- csetfarbe()
-
- {
- long v,h;
-
- if (!iparam(&v,"SetFarbe"))
- return(FALSE);
-
- if(v < 0 || v > 7)
- {
- pperror ("Vordergrund 0-7","SetFarbe");
- return(FALSE);
- }
-
- if (!iparam(&h,"SetFarbe"))
- return(FALSE);
-
- if(h < 0 || h > 7)
- {
- pperror ("Hintergrund 0-7","SetFarbe");
- return(FALSE);
- }
-
- set_color(v,h);
- return(OK);
- }
-
-
- /* ****************************************************
- ATTRIBUT
- Parameter o,ol,u,ur Bildschirmkoordinaten
- vom Bildschirmausschmitt,
- in dem die Farbattribute
- geändert werden sollen.
-
- v Vordergrundfarbe.
- h Hintergrundfarbe.
- */
-
- int
- cattribut(void)
-
- {
- long o,ol,u,ur,v,h;
-
-
- if (!iparam(&o,"Attribut"))
- return(FALSE);
-
- if(o < 0 || o > 24)
- {
- pperror ("Obere Zeile 0-24","Attribut");
- return(FALSE);
- }
-
- if (!iparam(&ol,"Attribut"))
- return(FALSE);
-
- if(ol < 0 || ol > 79)
- {
- pperror ("Obere Spalte 0-79","Attribut");
- return(FALSE);
- }
-
- if (!iparam(&u,"Attribut"))
- return(FALSE);
-
- if(u < o || u > 24)
- {
- pperror ("Untere Zeile 0-24","Attribut");
- return(FALSE);
- }
-
- if (!iparam(&ur,"Attribut"))
- return(FALSE);
-
- if(ur < ol || ur > 79)
- {
- pperror ("Untere Spalte 0-79","Attribut");
- return(FALSE);
- }
-
- if (!iparam(&v,"Attribut"))
- return(FALSE);
-
- if(v < 0 || v > 7)
- {
- pperror ("Vordergrund 0-7","Attribut");
- return(FALSE);
- }
-
- if (!iparam(&h,"Attribut"))
- return(FALSE);
-
- if(h < 0 || h > 7)
- {
- pperror ("Hintergrund 0-7","Attribut");
- return(FALSE);
- }
-
- set_attr(o,ol,u,ur,v,h);
- return(OK);
-
- }
-
-
- /* ****************************************************
- Löscht den Bildschirm. ( Farbe von setfarbe )
- lösch
- */
-
- int
- cloesch()
-
- {
- unsigned char str[81];
- long i,o,ol,u,ur,laenge;
- VAR *Variable;
-
- Scan();
- switch (Steuer)
- {
- case ALPHA:
- if(strcmp(ScanBuffer,"loesch")==0)
- {
- cls();
- return(OK);
- }
-
- /* wenn es eine Variable gibt, merken! */
- if ((Variable = IsVariable (ScanBuffer)) != NULL)
- {
- if(Variable->VarType == ZIFFER)
- o=Variable->VarWert.variable.integer;
- else
- {
- pperror ("{falscher Interger-Typ}","Loesch");
- return(FALSE);
- }
- }
- else
- {
- pperror ("{ungültiger oder kein Var-Name}","Loesch");
- return(FALSE);
- }
- break;
-
- case EOLCHAR:
- cls();
- return(OK);
-
- case ZIFFER:
- o=atol(ScanBuffer);
- break;
-
- default :
- pperror ("{ungültiger Parameter}","Loesch");
- return(FALSE);
- }
-
- if(o < 0 || o > 24)
- {
- pperror ("Obere Zeile 0-24","Loesch");
- return(FALSE);
- }
-
- if (!iparam(&ol,"Loesch"))
- return(FALSE);
-
- if(ol < 0 || ol > 79)
- {
- pperror ("Obere Spalte 0-79","Loesch");
- return(FALSE);
- }
-
- if (!iparam(&u,"Loesch"))
- return(FALSE);
-
- if(u < o || u > 24)
- {
- pperror ("Untere Zeile 0-24","Loesch");
- return(FALSE);
- }
-
- if (!iparam(&ur,"Loesch"))
- return(FALSE);
-
- if(ur < ol || ur > 79)
- {
- pperror ("Untere Spalte 0-79","Loesch");
- return(FALSE);
- }
-
- laenge=ur-ol;
- if(laenge>79)
- laenge=79;
-
- if(ol==0 && ur==79)
- {
- if(o==0 && u==24)
- cls();
- else
- for(i=o;i<=u;i++)
- clrline(i);
- return(OK);
- }
-
- for(i=0;i<=laenge;i++)
- str[i]=' ';
- str[i]='\0';
-
- for(i=o;i<=u;i++)
- zeig(i,ol,str);
-
- return(OK);
- }
-
- /* ****************************************************
- Erzeugt einen Piepton
- */
- int cpiep()
- {
- int i;
- for (i=100; i<=900; i+=2)
- {
- sound(i);
- delay(2);
- nosound();
- }
- return(OK);
- }
-
- /* cinfo: Versionsnummer des TXL-Interpreters */
-
- int
- cinfo ()
- {
- printf ("\n ╔══════════════════════════════════════════════════════════════════════════╗\n");
- printf (" ║ %s %s ║\n",COPYRIGHT,VERSION);
- printf (" ║ An dem Interpreter sowie den Spracherweiterungen waren bisher beteiligt: ║\n");
- printf (" ║ Michael Beising, Markus Merle, Kurt Bauer, Ralf Morgenstern, ║\n");
- printf (" ║ Elmar Warken und Ulrich Schmitz. ║\n");
- printf (" ╚══════════════════════════════════════════════════════════════════════════╝\n");
- return (OK);
- }
-
-
- /* ****************************************************
- Erzeugt einen Gruß an Gerald, den Daddelking
- */
- int cgerald()
- {
- printf("\nEinen Gruß an das größte Spielkalb der Galaxis\n");
- (void)cpiep();
- (void)cpiep();
- (void)cpiep();
- return(OK);
- }
-
- /*****************************************************
- Gibt alle verfügbaren Kommandos aus
- */
- int
- ccommands()
- {
- int i=0;
- printf("\n\nFolgende Befehle sind unter dem TXL-Interpreter verfügbar :\n");
- printf("-----------------------------------------------------------\n");
- while( (char *)TokBefDesc[i].Befehl != NULL )
- {
- printf("%s\t",(char *)TokBefDesc[i++].Befehl);
- }
- printf("\n\n");
- return(OK);
- }
-
- /*****************************************************
- Wartet auf einen Tastendruck
- */
-
- int
- cpause()
-
- {
- c_lastkey=lesech();
- return(OK);
- }
-
- /* ****************************************************
- Führt Dosbefehl aus
- */
-
- int
- cdos()
-
- {
- VAR *Variable;
- Scan();
- switch (Steuer)
- {
- case ALPHA:
- if(strcmp(ScanBuffer,"dos")==0)
- {
- strcpy(ScanBuffer,"Command.com");
- break;
- }
-
- /* wenn es eine Variable gibt, merken! */
- if ((Variable = IsVariable (ScanBuffer)) != NULL)
- {
- if(Variable->VarType == STRING)
- strcpy(ScanBuffer,Variable->VarWert.variable.text);
- else
- {
- serror (" Syntax-Fehler ! < dos {falscher Var-Typ} >");
- return(FALSE);
- }
- }
- else
- {
- serror (" Syntax-Fehler ! < dos {ungültiger Var-Name} >");
- return(FALSE);
- }
- break;
-
- case EOLCHAR:
- strcpy(ScanBuffer,"Command.com");
- break;
-
- case STRING:
- break;
-
- default :
- serror (" Syntax-Fehler! < dos > oder < dos Str-Variable > oder < dos 'Befehle' >");
- return(FALSE);
- }
-
-
-
-
- system(ScanBuffer);
- return(OK);
- }
-
- /*****************************************************
- Sichert den Bildschirm in eine Variable.
-
- Parameter o,ol,u,ur Bildschirmkoordinaten
- vom Bildschirmausschmitt,
- der gesichert werden soll.
-
- *tab String in den der Bildschirm
- gesichert werden soll.
- Die Länge des Sting's errechnet sich
- durch folgende Formel :
-
- ( (ur-ol+1) * (u-o+1) ) * 2 + 1
- oder
- (Anzahl Sicherungszeichen) * 2 + 1
-
-
- zB. 012345678901234567890.....
- 1
- 2 abcdefg
- 3 ABCDEFG
- .
- .
-
- Stringlänge = ( (15-9+1) * (3-2+1) ) * 2 + 1
- oder 14 * 2 + 1
-
- sbild 2 9 3 15 buffer
-
- */
-
- int
- csbild()
-
- {
- long laenge,o,ol,u,ur;
- unsigned char *tab;
- VAR *Variable;
-
-
- if (!iparam(&o,"sBild"))
- return(FALSE);
-
- if(o < 0 || o > 24)
- {
- pperror ("Obere Zeile 0-24","sBild");
- return(FALSE);
- }
-
- if (!iparam(&ol,"sBild"))
- return(FALSE);
-
- if(ol < 0 || ol > 79)
- {
- pperror ("Obere Spalte 0-79","sBild");
- return(FALSE);
- }
-
- if (!iparam(&u,"sBild"))
- return(FALSE);
-
- if(u < o || u > 24)
- {
- pperror ("Untere Zeile 0-24","sBild");
- return(FALSE);
- }
-
- if (!iparam(&ur,"sBild"))
- return(FALSE);
-
- if(ur < ol || ur > 79)
- {
- pperror ("Untere Spalte 0-79","sBild");
- return(FALSE);
- }
-
- Scan();
- switch (Steuer)
- {
- case ALPHA:
- /* wenn es eine Variable gibt, merken! */
- if ((Variable = IsVariable (ScanBuffer)) != NULL)
- {
- switch (Variable->VarType)
- {
- case STRING:
- tab=Variable->VarWert.variable.text;
- break;
- default:
- pperror ("{falscher String-Typ}","sBild");
- return(FALSE);
- }
- }
- else
- {
- pperror ("{ungültiger oder keine Var-Name}","sBild");
- return(FALSE);
- }
- break;
-
- default :
- pperror ("{ungültiger Parameter}","sBild");
- return(FALSE);
- }
-
-
- laenge = 2 * (ur-ol+1) * (u-o+1) + 5;
- if( Variable->VarWert.dim1 < laenge )
- {
- if( (Variable->VarWert.variable.text = realloc(Variable->VarWert.variable.text,laenge)) == NULL )
- {
- printf("\n <sbild> Nicht genügend Speicherplatz !");
- return(FALSE);
- }
- Variable->VarWert.dim1 = laenge;
- tab=Variable->VarWert.variable.text;
- }
-
- savescreen(o,ol,u,ur,tab);
- return(OK);
- }
-
- /*****************************************************
- Stellt den Bildschirm aus eine Variable wieder her.
-
- Parameter o,ol,u,ur Bildschirmkoordinaten
- vom Bildschirmausschmitt,
- der gesichert werden soll.
-
- *tab String in den der Bildschirm
- gesichert wurede.
-
- zB. 012345678901234567890.....
- 1
- 2 abcdefg
- 3 ABCDEFG
- .
- .
-
-
- rbild 2 9 3 15 buffer
-
- */
-
- int
- crbild(void)
-
- {
- long o,ol,u,ur;
- char *tab;
- VAR *Variable;
-
- if (!iparam(&o,"rBild"))
- return(FALSE);
-
- if(o < 0 || o > 24)
- {
- pperror ("Obere Zeile 0-24","rBild");
- return(FALSE);
- }
-
- if (!iparam(&ol,"rBild"))
- return(FALSE);
-
- if(ol < 0 || ol > 79)
- {
- pperror ("Obere Spalte 0-79","rBild");
- return(FALSE);
- }
-
- if (!iparam(&u,"rBild"))
- return(FALSE);
-
- if(u < o || u > 24)
- {
- pperror ("Untere Zeile 0-24","rBild");
- return(FALSE);
- }
-
- if (!iparam(&ur,"rBild"))
- return(FALSE);
-
- if(ur < ol || ur > 79)
- {
- pperror ("Untere Spalte 0-79","rBild");
- return(FALSE);
- }
-
-
- Scan();
- switch (Steuer)
- {
- case ALPHA:
- /* wenn es eine Variable gibt, merken! */
- if ((Variable = IsVariable (ScanBuffer)) != NULL)
- {
- switch (Variable->VarType)
- {
- case STRING:
- tab=Variable->VarWert.variable.text;
- break;
- default:
- pperror ("{falscher String-Typ}","rBild");
- return(FALSE);
- }
- }
- else
- {
- pperror ("{ungültiger oder keine Var-Name}","rBild");
- return(FALSE);
- }
- break;
-
- default :
- pperror ("{ungültiger Parameter}","rBild");
- return(FALSE);
- }
-
-
- restscreen(o,ol,u,ur,tab);
- return(OK);
-
- }
-
-
- /* ************************************************************
- String vom Bildschirm einlesen.
-
- Parameter : zeile,spalte Position am Bildschirm.
- *str String der Eingelesen werden soll.
- *pic Maske für Eingabe.
-
- Jedes Maskenzeichen ergibt eine
- Eingabestelle.
-
- 9 = alle Zeichen die in zeichen9
- definiert sind. (1234567890.-)
-
- D = Datum einlesen
- "DD.DD.DD" = TT.MM.JJ
- "DD.DD.DDD" = TT.MM.JJJJ
-
- X = Zeichen > 31 und < 224
-
- ' ' = An dieser Position im
- '.' String können keine Daten
- eingegeben werden.
-
- Sezial :
-
- @X = Maske wird automatisch
- auf Stringlänge erstellt.
-
- @D = Maske wird automatisch
- auf TT.MM.JJJJ erstellt.
-
- Abbruch : immer mit ENTER , ESC , Pfeiltasten und Funktionstasten.
- ( Abbruch kann mit IFTASTE erfragt werden ! )
-
- Return : OK , FALSE
- (Es wird der Orginalstring verändert !)
-
-
-
- */
-
- int
- clese(void)
-
- {
- int i = 0;
- int y = 0;
- int len=0,Ende=0,ret=OK;
- int loeschen=0;
- char *a;
- VAR *Variable;
- long z,s;
- int zeile, spalte,fixnum=0,flonum=0,string=0,datum=0;
- unsigned char str[102], pic[102], org[102], var[NAMLEN];
-
-
- if (!iparam(&z,"Lese"))
- return(FALSE);
-
- if(z < 0 || z > 24)
- {
- pperror ("Zeile 0-24","Lese");
- return(FALSE);
- }
-
- if (!iparam(&s,"Lese"))
- return(FALSE);
-
- if(s < 0 || s > 79)
- {
- pperror ("Spalte 0-79","Lese");
- return(FALSE);
- }
-
- zeile =(int)z;
- spalte=(int)s;
-
- Scan();
- switch (Steuer)
- {
- case ALPHA:
- /* wenn es eine Variable gibt, merken! */
- if ((Variable = IsVariable (ScanBuffer)) != NULL)
- {
- switch (Variable->VarType)
- {
- case STRING:
- string=1;
- strcpy(var,ScanBuffer);
- strncpy(str,Variable->VarWert.variable.text,(80-spalte));
- str[80-spalte]='\0';
- len=Variable->VarWert.dim1;
- break;
- case FIXNUM:
- fixnum=1;
- loeschen=1;
- strcpy(var,ScanBuffer);
- ltoa(Variable->VarWert.variable.integer,str,10);
- break;
- case FLONUM:
- flonum=1;
- loeschen=1;
- strcpy(var,ScanBuffer);
- sprintf(str,"%lf",Variable->VarWert.variable.Flotype);
- break;
- default:
- pperror ("{Var-Typ nicht Implementiert}","Lese");
- return(FALSE);
- }
- }
- else
- {
- pperror ("{ungültiger oder kein Var-Name}","Lese");
- return(FALSE);
- }
- break;
-
-
- default :
- pperror ("{keine Variable angegeben","Lese");
- return(FALSE);
- }
-
- if (!strparam(pic,(80-spalte),"Lese"))
- return(FALSE);
-
- if (pic[0]=='@') /* Eingabemaske wird automatisch erstellt */
- {
- if(!string)
- {
- pperror("Masken-Fehler ! { @X oder @D nur gültig bei Str-Var}","Lese");
- return(FALSE);
- }
-
- switch (pic[1])
- {
- case 'X':
- len=strlen(str);
- if(len>(80-spalte))
- len=(80-spalte);
- for(i=0;i<len;i++)
- pic[i]='X';
- pic[len]='\0';
- break;
-
- case 'D':
- if(len > 9)
- {
- for(i=0;i<10;i++)
- {
- if(i==2 || i==5)
- pic[i]='.';
- else
- pic[i]='D';
- }
- pic[10]='\0';
- }
- else
- {
- pperror("Masken-Fehler @D ! { Str-Var ist zu klein }","Lese");
- return(FALSE);
- }
- break;
-
- default:
- pperror("Masken-Fehler ! { @X oder @D }","Lese");
- return(FALSE);
- }
- }
-
-
- if(charsuch(pic,'D') != 0)
- datum=1;
-
- if (flonum)
- dezset(str,pic);
-
- y = strlen(pic);
- len = strlen(str);
-
- if (fixnum && (i=charsuch(pic,'.')) != 0)
- pic[i-1]='9';
-
- if (len < y)
- {
- if (string)
- {
- pic[len]='\0';
- y=len;
- }
- else
- {
- for(i=len;i<y;i++)
- str_ins(str,0,y,' ',pic);
- str[y]='\0';
- }
- }
-
- if ((len=strlen(str)) > y)
- {
- if(!string)
- {
- for(i=y-1,len--;i>=0;i--,len--)
- str[i]=str[len];
- }
- str[y]='\0';
- }
-
- strcpy(org,str);
- len=y-1;
- i=0;
-
- if(pic[0]==' ' || pic[0]=='.')
- for(;i < y && (pic[0]==' ' || pic[0]=='.');i++)
- ;
- if(i==y)
- {
- pperror("Keine oder falsche Eingabemaske !","Lese");
- return(FALSE);
- }
-
- zeig(zeile,spalte,str);
- setcr(zeile,spalte+i);
-
- while (!Ende)
- {
- c_lastkey=lesech();
-
- if ((int) c_lastkey > 9000 || i == y )
-
- switch(c_lastkey)
- {
- case ENTER :
-
- ret=OK;
- if(datum)
- if(!datum_pruef(str))
- {
- putch(7);
- break;
- }
- if(flonum)
- dezmove(str,pic);
- if(fixnum)
- nummove(str);
-
- if ((Variable = IsVariable (var)) != NULL)
- {
- switch (Variable->VarType)
- {
- case STRING:
- strcpy(Variable->VarWert.variable.text,str);
- break;
- case FIXNUM:
- Variable->VarWert.variable.integer=atol(str);
- break;
- case FLONUM:
- Variable->VarWert.variable.Flotype=atof(str);
- break;
- default:
- pperror ("{Var-Typ ist nicht Implementiert}","Lese");
- ret=FALSE;
- }
- }
- else
- {
- pperror ("{Var-Name nicht gefunden !}","Lese");
- ret=FALSE;
- }
-
- Ende=1;
- break;
-
- case CRLI : /* linker Cursor */
- if (i > 0)
- i--;
- for(;(pic[i] == ' ' || pic[i] == '.') && i > 0;i--)
- ;
- zeig(zeile,spalte,str);
- setcr(zeile, spalte+i);
- break;
-
- case CRRE : /* rechter Cursor */
- if (i < y-1)
- i++;
- for(;(pic[i] == ' ' || pic[i]=='.') && i < y-1;i++)
- ;
- zeig(zeile,spalte,str);
- setcr(zeile, spalte+i);
- break;
-
- case END : /* End */
- i = y-1;
- for(;str[i] == ' ' && i > 0;i--);
- i++;
- for(;(pic[i] == ' ' || pic[i] == '.') && i > 0;i--)
- ;
- if(i>=y)
- i=y-1;
- zeig(zeile,spalte,str);
- setcr(zeile,spalte+i);
- break;
-
- case HOME : /* Home */
- i = 0;
- for(;(pic[i] == ' ' || pic[i] == '.') && i < y-1;i++)
- ;
- zeig(zeile,spalte,str);
- setcr(zeile,spalte+i);
- break;
-
- case DEL : /* Del */
- str_del(str,i,y,pic);
- zeig(zeile, spalte, str);
- setcr(zeile,spalte+i);
- break;
-
- case BKSP : /* Backspace */
- if (i > 0)
- {
- i--;
- for(;(pic[i] == ' ' || pic[i] == '.') && i > 0;i--)
- ;
- str_del(str,i,y,pic);
- zeig(zeile, spalte, str);
- setcr(zeile,spalte+i);
- }
- break;
-
- case INS : /* Ins */
- str_ins(str,i,y,' ',pic);
- zeig(zeile, spalte, str);
- setcr(zeile,spalte+i);
- break;
-
- case ESC : /* ESC = Orginalzustand herstellen */
- strcpy(str,org);
- Ende=1;
- ret=OK;
- break;
-
- default :
- if (c_lastkey >= F1 && c_lastkey <= AF10)
- {
- ret=OK;
- if(flonum)
- dezmove(str,pic);
- if(fixnum)
- nummove(str);
- if(datum)
- if(!datum_pruef(str))
- {
- putch(7);
- break;
- }
- if ((Variable = IsVariable (var)) != NULL)
- {
- switch (Variable->VarType)
- {
- case STRING:
- strcpy(Variable->VarWert.variable.text,str);
- break;
- case FIXNUM:
- Variable->VarWert.variable.integer=atol(str);
- break;
- case FLONUM:
- Variable->VarWert.variable.Flotype=atof(str);
- break;
- default:
- pperror ("{Var-Typ ist nicht Implementiert}","Lese");
- ret=FALSE;
- }
- }
- else
- {
- pperror ("Var-Name nicht gefunden !","Lese");
- ret=FALSE;
- }
- Ende=1;
- break;
- }
- else
- break;
- }
- else
- switch(pic[i])
- {
- case 'X' :
-
- if(!string)
- {
- putch(7);
- break;
- }
-
- if (c_lastkey > 31 && c_lastkey < 224)
- {
- zeigz(zeile,spalte+i,c_lastkey);
- str[i] = c_lastkey;
- i++;
- for(;pic[i] == ' ' && i < y;i++)
- ;
- if(i>=y)
- i=y-1;
- zeig(zeile,spalte,str);
- setcr(zeile,spalte+i);
- }
- else
- putch(7);
- break;
-
- case '9' :
- if(c_lastkey == '.' && !flonum)
- {
- putch(7);
- break;
- }
- a = strchr(zeichen9, c_lastkey);
- if (a != NULL)
- {
- if(loeschen)
- {
- loeschen=0;
- for(;len>=0;len--)
- if(str[len]!='.')
- str[len]=' ';
- }
- if(c_lastkey == '.')
- {
- if( (charsuch(pic,'.')-1) < i)
- {
- putch(7);
- break;
- }
- str[i]='.';
- if( (i=dezmove(str,pic)) == 0)
- {
- putch(7);
- break;
- }
- i=0;
- for(;pic[i] != '.' && i < y;i++)
- ;
- i++;
- if(i>=y)
- i=y-1;
- zeig(zeile,spalte,str);
- setcr(zeile, spalte+i);
- }
- else
- {
- zeigz(zeile,spalte+i,c_lastkey);
- str[i] = c_lastkey;
- i++;
- for(;(pic[i] == ' ' || pic[i] == '.') && i < y;i++)
- ;
- if(i>=y)
- i=y-1;
- zeig(zeile,spalte,str);
- setcr(zeile, spalte+i);
- }
- }
- else
- putch(7);
- break;
-
- case 'D' :
- a = strchr(zeichenD, c_lastkey);
- if (a != NULL)
- {
- zeigz(zeile,spalte+i,c_lastkey);
- str[i] = c_lastkey;
- i++;
- for(;(pic[i] == ' ' || pic[i] == '.') && i < y;i++)
- ;
- if(i>=y)
- i=y-1;
- zeig(zeile,spalte,str);
- setcr(zeile, spalte+i);
- }
- else
- putch(7);
- break;
-
- case ' ':
- case '.':
- for(;(pic[i] == ' ' || pic[i] == '.') && i < y;i++)
- ;
- if(i>=y)
- i=y-1;
- putch(7);
- setcr(zeile, spalte+i);
- break;
-
- default :
- setcr(24,0);
- pperror("Falsches Zeichen in der Eingabemaske !","Lese");
- return(FALSE);
-
- }
- }
-
- zeig(zeile,spalte,str);
- setcr(24,0);
- return(ret);
-
- }
-
- /******************************************************************************
- Interne Function für clese()
-
- Tag je Monat bei normalem und bei Schaltjahr
- */
-
- static int tage_monat[2][13] = {
- {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, /* normales Jahr */
- {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}}; /* Schaltjahr */
-
-
- /* Funktion Feld Prüfung für Datumsfeld der Form TT.MM.JJJJ oder TT.MM.JJ
- Parameter: Datums-String
- Ergebnis: OK oder FALSE
- */
-
- int datum_pruef(char *str)
-
- {
- char *p_buff = str; /* Editierbuffer holen */
- int ergebnis = FALSE; /* Funktionsergebnis */
- int schaltjahr; /* Flag Schaltjahr */
- int tag; /* Tag */
- int monat; /* Monat */
- int jahr; /* Jahr */
- char buffer[5]; /* Hilfsbuffer */
-
- buffer[2] = '\0'; /* Hilfsbuffer abschließen */
- memcpy(buffer, p_buff, 2); /* Tag in Buffer kopieren */
- tag = atoi(buffer); /* und wandeln */
- memcpy(buffer, p_buff + 3, 2); /* Monat in Buffer kopieren */
- monat = atoi(buffer); /* und wandeln */
- if (strlen(str) > 8)
- {
- strcpy(buffer," "); /* Hilfsbuffer abschließen */
- memcpy(buffer, p_buff + 6, 4); /* Jahr in Buffer kopieren */
- jahr=0;
- }
- else
- {
- strcpy(buffer," "); /* Hilfsbuffer abschließen */
- memcpy(buffer, p_buff + 6, 4); /* Jahr in Buffer kopieren */
- jahr=1900; /* !!! Bei Jahrhunderwechsel ANPASSEN !!! */
- }
- jahr += atoi(buffer); /* und wandeln */
- schaltjahr = jahr % 4 == 0 && jahr % 100 != 0 || jahr % 400 == 0; /* Schaltjahr */
- if((0 < tag ) && (tag <= tage_monat[schaltjahr][monat])) /* Tag im Monat erlaubt */
- if((0 < monat) && (monat <= 12)) /* und Monat 1 bis 12 */
- ergebnis = OK; /* Feld ok */
- return(ergebnis); /* Ergebnis zurückgeben */
- }
-
-
-
- /* ************************************************************
- Abbruchtaste von clese() und cpause() abfragen.
- Tastenwert ist aus INTERP.H zu entnehmen !
- */
- int
- ciftaste()
-
- {
- int taste =0;
- long result=0;
-
- if (!iparam(&result,"IfTaste"))
- return(FALSE);
-
- if((int)result==c_lastkey)
- taste=1;
-
- /* Wenn Bedingung nicht erfüllt, dann übernächste Zeile */
-
- if (taste) {
- 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 ("<iftaste> Kein Sonst-Zweig vorhanden! ");
-
- return (OK);
-
- }
-