home *** CD-ROM | disk | FTP | other *** search
-
- #include <dos.h>
- #include <string.h>
- #include <stdio.h>
- #include <conio.h>
- #include <process.h>
- #include <stdlib.h>
- #include "interp.h"
-
- #define F1 9059
- #define F2 9060
- #define F3 9061
- #define F4 9062
- #define F5 9063
- #define F6 9064
- #define F7 9065
- #define F8 9066
- #define F9 9067
- #define F10 9068
-
-
- /* Crtl */
-
- #define SF1 9084
- #define SF2 9085
- #define SF3 9086
- #define SF4 9087
- #define SF5 9088
- #define SF6 9089
- #define SF7 9090
- #define SF8 9091
- #define SF9 9092
- #define SF10 9093
- #define CF1 9094
- #define CF2 9095
- #define CF3 9096
- #define CF4 9097
- #define CF5 9098
- #define CF6 9099
- #define CF7 9100
- #define CF8 9101
- #define CF9 9102
- #define CF10 9103
-
-
- /* ALT */
-
- #define AF1 9104
- #define AF2 9105
- #define AF3 9106
- #define AF4 9107
- #define AF5 9108
- #define AF6 9109
- #define AF7 9110
- #define AF8 9111
- #define AF9 9112
- #define AF10 9113
-
-
- #define ESC 9027
- #define BKSP 9008
- #define ENTER 9013
- #define CENTER 9010
- #define TAB 9009
- #define STAB 9015
- #define INS 9082
- #define DEL 9083
- #define HOME 9071
- #define END 9079
- #define PGUP 9073
- #define PGDN 9081
-
-
- /* Cursortasten */
-
- #define CRUP 9072
- #define CRDN 9080
- #define CRLI 9075
- #define CRRE 9077
-
-
- /* Ctrl Cursor */
-
- #define CCRLI 9115
- #define CCRRE 9116
-
-
- #define PERI 0x11
- #define V_IO 0x10
- #define zeichen9 "1234567890.-"
- #define zeichenD "1234567890"
-
- void cls(void);
- void clrline(int zeile);
- unsigned int scr_adr(void);
- void zeig(unsigned int z,unsigned int s,unsigned char *txt);
- void zeigz(unsigned int z,unsigned int s, char zeichen);
- void set_color(int v,int h);
- void set_attr(int o,int ol,int u,int ur,int v,int h);
- void savescreen(int o,int ol,int u,int ur,unsigned char *tab);
- void restscreen(int o,int ol,int u,int ur,unsigned char *tab);
- void warte(void);
- int box(int o, int ol, int u, int ur,unsigned char *zeichen);
- int charsuch(unsigned char *str, char was);
- int m_lese(int zeile, int spalte,unsigned char *maske,int *abb);
- void setcr(unsigned int zeile,unsigned int spalte);
- int zeile(void);
- int spalte(void);
- int lesech(void);
- 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);
- void lese(int zeile, int spalte, unsigned char *str, unsigned char *pic, int *abb);
- void alltrim(unsigned char *str,unsigned char *neustr);
-
- void pperror(unsigned char *Fehler, unsigned char *prog);
- int iparam(long *var, unsigned char *prog);
- int fparam(double *var, unsigned char *prog);
- int strparam(unsigned char *var, int len, unsigned char *prog);
- int allstrparam(unsigned char *var, int len, unsigned char *prog);
-
-
- int _set_f_v =7;
- int _set_f_h =0;
- unsigned int _cr_zeile =0;
- unsigned int _cr_spalte =0;
- int _lastkey =10;
-
-
- int ParamVar=FALSE;
- unsigned char ParamType=0;
- unsigned char ParamName[NAMLEN];
-
-
- /* Benötigte Globalvariablen */
- extern int Steuer; /* der aufrufenden Routine wird mit- */
- extern char ScanBuffer[ZEILENLAENGE]; /* Ergebnisbuffer des Scanners */
-
-
- /* pperror () Ein Syntaxfehler ist aufgetreten. */
- extern int IntError;
-
- void
- pperror (unsigned char *Fehler, unsigned char *prog)
- {
- printf ("\n Syntaxfehler : %s in Funktion <%s>\n",Fehler,prog);
- IntError = TRUE;
- }
-
-
- int
- iparam(long *var, unsigned char *prog)
-
- {
- VAR *Variable;
- ParamVar=FALSE;
- strcpy(ParamName," ");
- Scan();
-
- switch (Steuer)
- {
- case ALPHA:
- /* wenn es eine Variable gibt, merken! */
- if ((Variable = IsVariable (ScanBuffer)) != NULL)
- {
- switch (Variable->VarType)
- {
- case FIXNUM:
- *(var)=Variable->VarWert.variable.integer;
- ParamVar=OK;
- ParamType=FIXNUM;
- strcpy(ParamName,ScanBuffer);
- break;
- default:
- pperror ("{Variable ist kein Integer-Typ}",prog);
- return(FALSE);
- }
- }
- else
- {
- pperror ("{ungültiger oder kein Var-Name}",prog);
- return(FALSE);
- }
- break;
-
- case ZIFFER:
- *(var)=atol(ScanBuffer);
- break;
- default:
- pperror ("{falscher Parameter}",prog);
- return(FALSE);
-
- }
- return(OK);
-
- }
-
- int
- fparam(double *var, unsigned char *prog)
-
- {
- VAR *Variable;
- ParamVar=FALSE;
- strcpy(ParamName," ");
- Scan();
-
- switch (Steuer)
- {
- case ALPHA:
- /* wenn es eine Variable gibt, merken! */
- if ((Variable = IsVariable (ScanBuffer)) != NULL)
- {
- switch (Variable->VarType)
- {
- case FLONUM:
- *(var)=Variable->VarWert.variable.Flotype;
- ParamVar=OK;
- ParamType=FLONUM;
- strcpy(ParamName,ScanBuffer);
- break;
- default:
- pperror ("{Variable ist kein Dezimal-Typ}",prog);
- return(FALSE);
- }
- }
- else
- {
- pperror ("{ungültiger oder kein Var-Name}",prog);
- return(FALSE);
- }
- break;
-
- case ZIFFER:
- case FLONUM:
- *(var)=atof(ScanBuffer);
- break;
-
- default:
- pperror ("{falscher Parameter}",prog);
- return(FALSE);
-
- }
- return(OK);
-
- }
-
- int
- strparam(unsigned char *var, int len, unsigned char *prog)
-
- {
- VAR *Variable;
- ParamVar=FALSE;
- strcpy(ParamName," ");
-
- Scan();
-
- switch (Steuer)
- {
- case ALPHA:
- /* wenn es eine Variable gibt, merken! */
- if ((Variable = IsVariable (ScanBuffer)) != NULL)
- {
- switch (Variable->VarType)
- {
- case STRING:
- strncpy(var,Variable->VarWert.variable.text,len);
- var[len]='\0';
- ParamVar=OK;
- ParamType=STRING;
- strcpy(ParamName,ScanBuffer);
- break;
- default:
- pperror ("{Variable ist kein String-Typ}",prog);
- return(FALSE);
- }
- }
- else
- {
- pperror ("{ungültiger oder kein Var-Name}",prog);
- return(FALSE);
- }
- break;
-
- case STRING:
- strncpy(var,ScanBuffer,len);
- var[len]='\0';
- break;
- default:
- pperror ("{falscher Parameter}",prog);
- return(FALSE);
-
- }
- return(OK);
-
- }
-
- int
- allstrparam(unsigned char *var, int len, unsigned char *prog)
-
- {
- VAR *Variable;
- ParamVar=FALSE;
- strcpy(ParamName," ");
- Scan();
-
- switch (Steuer)
- {
- case ALPHA:
- /* wenn es eine Variable gibt, merken! */
- if ((Variable = IsVariable (ScanBuffer)) != NULL)
- {
- switch (Variable->VarType)
- {
- case STRING:
- strncpy(var,Variable->VarWert.variable.text,len);
- var[len]='\0';
- ParamVar=OK;
- ParamType=STRING;
- strcpy(ParamName,ScanBuffer);
- break;
-
- case FIXNUM:
- ltoa(Variable->VarWert.variable.integer,var,10);
- var[len]='\0';
- ParamVar=OK;
- ParamType=FIXNUM;
- strcpy(ParamName,ScanBuffer);
- break;
-
- case FLONUM:
- sprintf(var,"%lf",Variable->VarWert.variable.Flotype);
- var[len]='\0';
- ParamVar=OK;
- ParamType=FLONUM;
- strcpy(ParamName,ScanBuffer);
- break;
-
- default:
- pperror ("{Variablen-Typ ist nicht Implementiert}",prog);
- return(FALSE);
- }
- }
- else
- {
- pperror ("{ungültiger oder kein Var-Name}",prog);
- return(FALSE);
- }
- break;
-
- case STRING:
- strncpy(var,ScanBuffer,len);
- var[len]='\0';
- break;
-
- case FLONUM:
- case ZIFFER:
- strncpy(var,ScanBuffer,len);
- var[len]='\0';
- break;
-
- default:
- pperror ("{falscher Parameter}",prog);
- return(FALSE);
-
- }
- return(OK);
-
- }
-
-
-
- /*
- Die möglichen Farben :
-
- 0 schwarz
- 1 blau
- 2 grün
- 3 türkis
- 4 rot
- 5 lila
- 6 braun
- 7 weiss
- Beispiel :
- ----------
-
- main()
- {
- set_color(7,1); weiss auf blau
- cls(); bildschirm löschen
- zeig(0,0,"X"); ein X auf position 0,0
- set_color(7,2); weiss auf grün
- zeig(10,10,"Das ist ein String an Pos 10,10 !"); ein str. auf position 10,10
- zeig(24,79,"X"); ein X auf position 24,79
- set_color(7,0); weiss auf schwarz
- } (standard)
-
- */
-
- /* ****************************************************
- Löscht den Bildschirm. ( Farbe von set_color() )
- */
-
- void cls()
- {
- static unsigned char str[]=" ";
- int i=0;
- for(;i<25;zeig(i,0,str),i++)
- ;
- }
-
- /* ****************************************************
- Löscht eine Bildschirmzeile. ( Farbe von set_color() )
- */
-
- void clrline(int zeile)
- {
- static unsigned char str[]=" ";
-
- zeig(zeile,0,str);
-
- }
-
- /**********************************************************************
- Interne Function
- */
-
- unsigned int scr_adr()
-
- {
- union REGS regs;
- int86(PERI,®s,®s);
- if ((regs.x.ax & 0x30) == 0x30)
- return(0xb000);
- else return(0xb800);
- }
-
- /* ****************************************************
- Setzt den Cursor an die gewünschte Bildschirmposition
- */
-
- void setcr(unsigned int zeile,unsigned int spalte)
- {
- union REGS regs;
-
- regs.h.ah = 2; /* Funktionsnummer 'Cursor setzen' */
- regs.h.dl = (unsigned int) spalte; /* Spalte u. Zeile übergeben */
- regs.h.dh = (unsigned int) zeile;
- regs.h.bh = 0;
- int86(0x10, ®s, ®s); /* Interruptaufruf */
- _cr_zeile =zeile;
- _cr_spalte =spalte;
- }
-
-
- /**********************************************************************/
- /* Die Funktion zeile() gibt Zeilenposition von Cursor zurück. */
- /**********************************************************************/
- /* Übergebene Parameter: */
- /* keiner */
- /*--------------------------------------------------------------------*/
- /* Rückgabewert : Zeilenpositon von Cursor */
- /**********************************************************************/
-
- int zeile()
- {
- return(_cr_zeile);
- }
-
- /**********************************************************************/
- /* Die Funktion spalte() gibt Spaltenposition von Cursor zurück. */
- /**********************************************************************/
- /* Übergebene Parameter: */
- /* keiner */
- /*--------------------------------------------------------------------*/
- /* Rückgabewert : Spaltenpositon von Cursor */
- /**********************************************************************/
-
- int spalte()
- {
- return(_cr_spalte);
- }
-
-
-
- /* ****************************************************
- ZEIG();
-
- Zeigt einen Sting am Bildschirm in der
- Farbe die Sie mit set_color() eingestellt haben.
-
- z = Zeile (0 - 24)
- s = Spalte (0 - 79)
- *txt = Ausgabestring
-
- */
-
- void zeig(unsigned int z,unsigned int s,unsigned char *txt)
- {
- unsigned int z_pos;
- int anzahl,y;
- char _set_farbe;
- unsigned char far *scr_mon=MK_FP(0xB000,0x0000); /* Adresse Mono */
- unsigned char far *scr_col=MK_FP(0xB000,0x8000); /* Adresse Farbe */
- unsigned int i;
- _set_farbe=(_set_f_h*16)+_set_f_v;
- anzahl = strlen(txt); /* Länge des Strings für Farbe */
- z_pos = (z*160)+(s*2)-1; /* Position Zeichen */
-
- /* String schreiben */
-
- if (scr_adr()==0xb800)
- {
- for(y=0,i=z_pos;y<anzahl && *(txt+y)!='\0'; y++)
- {
- *(scr_col+i+2)=_set_farbe;
- i++;
- *(scr_col+i)=*(txt+y);
- i++;
- }
- }
- else
- {
- for(y=0,i=z_pos;y<anzahl && *(txt+y)!='\0'; y++)
- {
- *(scr_mon+i+2)=_set_farbe;
- i++;
- *(scr_mon+i)=*(txt+y);
- i++;
- }
- }
- }
-
- /* ****************************************************
- ZEIGZ();
-
- Zeigt ein Zeichen am Bildschirm in der
- Farbe die Sie mit set_color() eingestellt haben.
-
- z = Zeile (0 - 24)
- s = Spalte (0 - 79)
- zeichen = Ausgabezeichen
-
- */
-
- void zeigz(unsigned int z,unsigned int s, char zeichen)
- {
- unsigned int z_pos;
- char _set_farbe;
- char far *scr_mon=MK_FP(0xB000,0x0000); /* Adresse Mono */
- char far *scr_col=MK_FP(0xB000,0x8000); /* Adresse Farbe */
- _set_farbe=(_set_f_h*16)+_set_f_v;
- z_pos = (z*160)+(s*2); /* Position Zeichen */
-
- /* Zeichen schreiben */
-
- if (scr_adr()==0xb800)
- {
- *(scr_col+z_pos+1)=_set_farbe;
- *(scr_col+z_pos) =zeichen;
- }
- else
- {
- *(scr_mon+z_pos+1)=_set_farbe;
- *(scr_mon+z_pos) =zeichen;
- }
- }
-
- /**********************************************************************
-
- Sellt die Farbe ein, die für zeig(),cls() ect.
- verwendet werden soll.
-
- v = Vordergrundfarbe
- h = Hintergrundfarbe
- */
-
- void set_color(int v,int h)
- {
- _set_f_h = h;
- _set_f_v = v;
- }
-
- /* ****************************************************
- SET_ATTR()
- Parameter o,ol,u,ur Bildschirmkoordinaten
- vom Bildschirmausschmitt,
- in dem die Farbattribute
- geändert werden sollen.
-
- v Vordergrundfarbe.
- h Hintergrundfarbe.
- */
-
- void set_attr(int o,int ol,int u,int ur,int v,int h)
- {
- unsigned int z_pos,y,yy;
- int anzahl,laenge;
- char far *scr_mon=MK_FP(0xB000,0x0000); /* Adresse Mono */
- char far *scr_col=MK_FP(0xB000,0x8000); /* Adresse Farbe */
- unsigned int i,si;
- char farbe;
- farbe = (h*16)+v;
- laenge = ur-ol+1;
- anzahl = u-o+1;
- z_pos = (o*160)+(ol*2)+1; /* Position im Bildschirm-Momory */
-
- i=z_pos;
- si=i;
- if (scr_adr()==0xb800) /* Frage ob Color */
- {
- for(yy=0;yy<anzahl; yy++)
- {
- for(y=0;y<laenge; y++)
- {
- *(scr_col+i)=farbe; /* Farbe setzten */
- i+=2;
- }
- i=si+160;
- si=i;
- }
- }
- else
- {
- for(yy=0;yy<anzahl; yy++)
- {
- for(y=0;y<laenge; y++)
- {
- *(scr_mon+i)=farbe;
- i+=2;
- }
- i=si+160;
- si=i;
- }
- }
-
- }
-
-
-
- /* ************************************************************************
-
- SAVESCREEN() Sichert den Bildschirm an den angegebenen Koordinaten.
- RESTSCREEN() Schreibt die Sicherung wirder auf den Bildschirm.
-
-
- Beispiel :
- ----------
-
-
- static unsigned char s_screen[61];
-
- set_color(2,0);
- cls();
- zeig(10,0,"Orginal :");
- zeig(10,10,"1234567890");
- zeig(11,10,"1234567890");
- zeig(12,10,"1234567890");
-
- savescreen(10,10,12,19,s_screen);
-
- set_color(4,0);
- zeig(15,0,"SaveSTR :");
- zeig(15,10,s_screen);
- zeig(20,0,"Restore :");
-
- restscreen(20,20,22,29,s_screen);
-
- zeig(24,10,"beliebige Taste weiter ...");
- warte();
-
-
- *****************************************************
-
- 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
-
- savescreen(2,9,3,15,string);
-
- */
-
- void savescreen(int o,int ol,int u,int ur,unsigned char *tab)
-
- {
- unsigned int z_pos,y,yy;
- int anzahl,laenge;
- char far *scr_mon=MK_FP(0xB000,0x0000); /* Adresse Mono */
- char far *scr_col=MK_FP(0xB000,0x8000); /* Adresse Farbe */
- unsigned int i,si,tot;
- laenge = 2*(ur-ol+1);
- anzahl = u-o+1;
- z_pos = (o*160)+(ol*2); /* Position im Bildschirm-Merory */
-
- /* String speichern */
- tot=0;
- i=z_pos;
- si=i;
- if (scr_adr()==0xb800) /* Frage ob Color */
- {
- for(yy=0;yy<anzahl; yy++)
- {
- for(y=0;y<laenge; y++)
- {
- *(tab+tot)=*(scr_col+i);
- tot++;
- i++;
- }
- i=si+160;
- si=i;
- }
- }
- else
- {
- for(yy=0;yy<anzahl; yy++)
- {
- for(y=0;y<laenge; y++)
- {
- *(tab+tot)=*(scr_mon+i);
- tot++;
- i++;
- }
- i=si+160;
- si=i;
- }
- }
- *(tab+tot)='\0';
- }
-
- /* ****************************************************
-
- Parameter o,ol,u,ur Bildschirmkoordinaten
- vom Bildschirmausschmitt,
- der geschrieben werden soll.
-
- *tab String, der mit SAVESCREEN
- erstellt wurde.
- */
-
- void restscreen(int o,int ol,int u,int ur,unsigned char *tab)
- {
- unsigned int z_pos,y,yy;
- int anzahl,laenge;
- char far *scr_mon=MK_FP(0xB000,0x0000); /* Adresse Mono */
- char far *scr_col=MK_FP(0xB000,0x8000); /* Adresse Farbe */
- unsigned int i,si,tot;
- laenge = 2*(ur-ol+1);
- anzahl = u-o+1;
- z_pos = (o*160)+(ol*2); /* Position im Bildschirm-Momory */
-
- /* String schreiben */
- tot=0;
- i=z_pos;
- si=i;
- if (scr_adr()==0xb800) /* Frage ob Color */
- {
- for(yy=0;yy<anzahl; yy++)
- {
- for(y=0;y<laenge; y++)
- {
- *(scr_col+i)=*(tab+tot); /* Zeichen für Zeichen schreiben */
- tot++;
- i++;
- }
- i=si+160;
- si=i;
- }
- }
- else
- {
- for(yy=0;yy<anzahl; yy++)
- {
- for(y=0;y<laenge; y++)
- {
- *(scr_mon+i)=*(tab+tot);
- tot++;
- i++;
- }
- i=si+160;
- si=i;
- }
- }
-
- }
-
-
- /* ****************************************************
- Wartet auf einen Tastendruck.
- */
-
- void warte()
- {
- char c=0;
- while (c==0)
- c = getch();
- }
-
- /* *******************************************************
- Zeichnet eine Box auf den Bildschirm.
- Parameter : o,ol,u,ur obere Zeile, Spalte untere Zeile, Spalte
- *zeichen Boxstring "╔═╗║╝═╚║ "
-
- zB. "abcdefgh#" abbbc
- d###h
- gfffe
-
-
- */
-
- int box(int o, int ol, int u, int ur,unsigned char *zeichen)
- {
- int laenge,hoehe,i,y;
- char v[2], h[2];
- static unsigned char oben[81], mitte[81], unten[81];
- laenge = ur - ol;
- hoehe = u - o;
- if(strlen(zeichen) < 8)
- return(0);
- *oben=*zeichen;
- for(i=1;i<laenge;*(oben+ i++)=*(zeichen+1))
- ;
- *(oben+ i++)=*(zeichen+2);
- *(oben+i)='\0';
- zeig(o,ol,oben);
- *unten=*(zeichen+6);
- for(i=1;i<laenge;*(unten+ i++)=*(zeichen+5))
- ;
- *(unten+ i++)=*(zeichen+4);
- *(unten+ i)='\0';
- if (*(zeichen+8) != '\0')
- {
- *mitte=*(zeichen+3);
- for(i=1;i<laenge;*(mitte+ i++)=*(zeichen+8))
- ;
- *(mitte+ i++)=*(zeichen+7);
- *(mitte+ i)='\0';
- for(i=1;i<hoehe;zeig(o+i++,ol,mitte))
- ;
- }
- else
- {
- *v = *(zeichen+3);
- *(v+1) = '\0';
- *h = *(zeichen+7);
- *(h+1) = '\0';
- for(i=1;i<hoehe;zeig(o+i,ur,v),zeig(o+i++,ol,h))
- ;
- }
-
- zeig(u,ol,unten);
- return(1);
- }
-
-
- /* **********************************************************
- Gibt die Position eines Charakters in einem String zurück
- Parameter : *str String der durchsucht wird
- was Charakter der gesucht wird
-
- return Position von Charakter im String
- [a][b][c][d][\0]
- ^
- Position 2
- */
-
- int charsuch(unsigned char *str, char was)
- {
- int i,y;
- y = strlen(str);
- if(was > 96 && was < 123) /* wenn kleinbuchstabe, */
- was = was -32; /* in grosser verwandeln */
- for(i=0;*(str+i) != was && i < y;i++)
- ;
- if (i < y)
- return(i+1);
- else
- return(0);
- }
-
-
-
-
- /* ************************************************************
- Liest ein Zeichen ein.
- Parameter : keine
-
- return Asciiwert vom Zeichen.
- > 9000 = Spezialtaste
- zB.: ENTER, ESC, TAB, INS, DEL, F1 .....
- */
-
- int lesech()
- {
- int z;
- z=getch();
- switch((int)z)
- {
- case 0 :
- z=getch();
- case 8 :
- case 27 :
- case 13 :
- case 10 :
- case 9 :
- _lastkey=9000+(int)z;
- break;
-
- default :
- _lastkey=z;
- }
-
- return(_lastkey);
- }
-
- /* ************************************************************
- String vom Bildschirm einlesen.
-
- Parameter : zeile,spalte Position am Bildschirm.
- *str String der Eingelesen werden soll.
- *pic Maske für Eingabe.
- 9 = alle Zeichen die in zeichen9
- definiert sind. (1234567890)
-
- D = Datum einlesen
-
- X = Zeichen > 31 und < 224
-
- ' ' = An dieser Position im
- String können keine Daten
- eingegeben werden.
-
- *abb Zahlenarray mit den Abbruchtasten.
-
-
- Abbruch : immer mit ENTER und den mitgegebenen Abbruchtasten.
-
- Return : nichts (Es wird der Orginalstring verändert !)
-
-
-
- Beispiel :
-
-
- int abbruch[]={ESC,PGDN};
-
- main()
- }
- static unsigned char str[]=" ";
- static unsigned char datum[]="00.00.0000";
-
- FILE *datei;
-
- cls();
- zeig(6,0,"Dateiname :");
- lese(6,12,str,"XXXXXXXXXX",abbruch);
- if (str[0]==' ' || _lastkey == ESC)
- return;
- datei = fopen(str,"at");
- if (datei == 0)
- {
- datei = fopen(str,"wt");
- if (datei == 0)
- {
- zeig(8,0,"Datei konnte nicht eröffnet werden !");
- return;
- }
- zeig(10,0,"Datum :");
- lese(10,10,datum,"DD.DD.DDDD",abbruch);
- if (_lastkey != ESC)
- fprintf(datei,"Das Datum ist %s\n", datum);
- fclose(datei);
-
- }
-
- */
-
- void lese(int zeile, int spalte, unsigned char *str, unsigned char *pic, int *abb)
- {
- int i = 0;
- int y = 0;
- int len;
- int ab= 0;
- int dezimal=0;
- int loeschen=1;
- char *a;
- y = strlen(pic);
- len = strlen(str)-1;
- if(strchr(pic,'.')!=NULL)
- dezimal=1;
-
- zeig(zeile, spalte, str);
- setcr(zeile,spalte);
- _lastkey = lesech();
- while (_lastkey != ENTER)
- {
-
- if ((int) _lastkey > 9000 || i == y )
-
- switch(_lastkey)
- {
-
- 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--)
- ;
- 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;
-
- default : /* Prüfen ob abbrechen */
- for(ab=0; abb[ab] != '\0' && abb[ab] != _lastkey; ab++)
- ;
- if (abb[ab] != '\0')
- {
- if(charsuch(pic,'9') != 0)
- {
- if(dezimal)
- dezmove(str,pic);
- else
- nummove(str);
- zeig(zeile,spalte,str);
- }
- return;
- }
-
-
- }
- else
- switch(pic[i])
- {
- case 'X' :
- if (_lastkey > 31 && _lastkey < 224)
- {
- zeigz(zeile,spalte+i,_lastkey);
- str[i] = _lastkey;
- i++;
- for(;pic[i] == ' ' && i < y;zeigz(zeile,spalte+i,' '),i++);
- zeig(zeile,spalte,str);
- setcr(zeile,spalte+i);
- }
- else
- putch(7);
- break;
-
- case '9' :
- if(_lastkey == '.' && !dezimal)
- {
- putch(7);
- break;
- }
- a = strchr(zeichen9, _lastkey);
- if (a != NULL)
- {
- if(loeschen)
- {
- loeschen=0;
- for(;len>=0;len--)
- if(str[len]!='.')
- str[len]=' ';
- }
- if(_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++;
- zeig(zeile,spalte,str);
- setcr(zeile, spalte+i);
- }
- else
- {
- zeigz(zeile,spalte+i,_lastkey);
- str[i] = _lastkey;
- i++;
- for(;(pic[i] == ' ' || pic[i] == '.') && i < y;zeigz(zeile,spalte+i,' '),i++)
- ;
- zeig(zeile,spalte,str);
- setcr(zeile, spalte+i);
- }
- }
- else
- putch(7);
- break;
-
- case 'D' :
- a = strchr(zeichenD, _lastkey);
- if (a != NULL)
- {
- zeigz(zeile,spalte+i,_lastkey);
- str[i] = _lastkey;
- i++;
- for(;(pic[i] == ' ' || pic[i] == '.') && i < y;zeigz(zeile,spalte+i,' '),i++)
- ;
- zeig(zeile,spalte,str);
- setcr(zeile, spalte+i);
- }
- else
- putch(7);
- break;
-
- default :
- zeig(1,1,"Falscher Typ in PIC");
- warte();
- zeig(1,1," ");
- return;
-
- }
- _lastkey = lesech();
- }
- if(charsuch(pic,'9') != 0)
- {
- if(dezimal)
- dezmove(str,pic);
- else
- nummove(str);
- zeig(zeile,spalte,str);
- }
- return;
- }
-
-
-
- /* *********************************************************
- Intere Function
- */
-
- void str_del(unsigned char *str, int w, int l, unsigned char *pic)
- {
- int n,ww,ll;
- ww =w;
- while (ww < l)
- {
- for(;(pic[ww] == ' ' || pic[ww] == '.') && ww < l;)
- ww++;
-
- n=ww+1;
- for(;(pic[n] == ' ' || pic[n] == '.') && n < l;)
- n++;
- if (n < l)
- str[ww] = str[n];
- ww=n;
- }
-
- ll=l;
- for(;(pic[ll-1] == ' ' || pic[l-1] == '.') && ll-1 > w;)
- ll--;
- if(ll-1 > w)
- str[ll-1] = ' ';
- }
-
- /* *****************************************************
- Interne Function
- */
-
- void str_ins(unsigned char *str, int w, int l, char c, unsigned char *pic)
- {
- int n;
- if (w >= l)
- return;
- while (l > w)
- {
- for(;(pic[l-1] == ' ' || pic[l-1] == '.') && l > w;)
- l--;
- n=l-1;
- for(;(pic[n-1] == ' ' || pic[n-1] == '.') && n > w;)
- n--;
- str[l-1] = str[n-1];
- l=n;
- }
- str[w] = c;
- }
-
-
- /* ****************************************************** */
- int dezmove(unsigned char *str, unsigned char *pic)
- {
- int r,y,pos,l;
- if( (r=charsuch(pic,'.')) == 0)
- {
- nummove(str);
- return(r);
- }
- r--;
- pos=charsuch(str,'.');
- pos--;
- for(y=r-1,l=pos-1;l>=0;l--,y--)
- {
- str[y]=str[l];
- }
- for(;y>=0;--y)
- str[y]=' ';
-
- str[r]='.';
-
- for(y=r-1;y>=0;--y)
- {
- if(str[y]==' ')
- {
- for(l=y-1;l>=0 && str[l]==' ';)
- --l;
- if(l < 0)
- break;
- str[y]=str[l];
- str[l]=' ';
- }
- }
-
- if(str[r-1]==' ')
- str[r-1]='0';
- for(y=r+1;str[y] !='\0';++y)
- {
- if(str[y]==' ')
- str[y]='0';
- }
-
- return(r);
- }
-
- /* ****************************************************** */
- int dezset(unsigned char *str, unsigned char *pic)
- {
- int r,y,pos,l;
-
- if( (r=charsuch(pic,'.')) == 0)
- {
- l=strlen(pic);
- for(y=0;y<l && str[y]!='.';y++)
- ;
- for(;y<l;y++)
- str_ins(str,0,l,' ',pic);
- str[l]='\0';
- return(1);
- }
- r--;
- if( (pos=charsuch(str,'.')) == 0)
- {
- l=strlen(str);
- str[l]='.';
- str[l+1]='\0';
- pos=l+1;
- }
-
- pos--;
-
- if(r<pos)
- {
- l=strlen(str);
- pic[r]='9';
- for(y=r;y<pos;y++)
- {
- str_del(str,0,l,pic);
- str[l-1]='0';
- }
- pic[r]='.';
- }
- if(r>pos)
- {
- l=strlen(pic);
- pic[r]='9';
- for(y=pos;y<r;y++)
- {
- str_ins(str,0,l,' ',pic);
- }
- pic[r]='.';
- }
- str[r]='.';
-
- l=strlen(pic);
- str[l]='\0';
-
- for(r++;r<l;r++)
- {
- if(str[r]==' ' || str[r] == 0)
- str[r]='0';
- }
-
- return(1);
- }
-
-
- /* ****************************************************** */
- int nummove(unsigned char *str)
- {
- int y,l;
- y=strlen(str)-1;
- for(;y>=0;--y)
- {
- if(str[y]==' ')
- {
- for(l=y-1;l>=0 && str[l]==' ';)
- --l;
- if(l < 0)
- break;
- str[y]=str[l];
- str[l]=' ';
- }
- }
- return(1);
- }
-
- /* ****************************************************** */
-
- void alltrim(unsigned char *str,unsigned char *neustr)
-
- {
- int i,y;
- for(i=0;str[i]==' ';i++)
- ;
- for(y=0;str[i]!='\0';i++,y++)
- neustr[y]=str[i];
- for(y--;neustr[y]==' ';y--)
- ;
- neustr[++y]='\0';
- }
-