home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1991
/
04
/
txl
/
3_preis
/
fast
/
neuutil.c
< prev
next >
Wrap
Text File
|
1990-11-21
|
30KB
|
1,398 lines
#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"
#define MK_FP(seg,ofs) ((void far *) (((unsigned long)(seg) << 16) | (unsigned)(ofs)))
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';
}