home *** CD-ROM | disk | FTP | other *** search
- /* DATABASE.C
- Datenbanken für TXL-Interpreter
- (c) 1991 Elmar Warken */
-
- #include <stdlib.h>
- #include <fcntl.h>
- #include <mem.h>
- #include <stdio.h>
- #include <string.h>
- #include <conio.h>
- #include <alloc.h>
- #include "interp.h"
- #include "db.h"
-
- #define STRFELD 0
- #define INTFELD 1
- #define MAXFELDER 20
- #define MAXBANKEN 3
-
- extern int Steuer;
- extern char ScanBuffer[ZEILENLAENGE];
-
- typedef struct feld
- {
- int typ, /*** Typ (INTFELD oder STRFELD ***/
- strlen, /*** für Strings : Länge ***/
- offset; /*** Offset innerhalb eines Satzes ***/
- } Feld;
-
- typedef struct key /*** Binärer Baum von Strings ***/
- {
- char *str;
- long filepos;
- struct key *R,*L; /** rechter und linker Ast **/
- } Key;
-
- typedef struct dfile
- {
- Feld Felder[MAXFELDER];
- int felder,satzlaenge;
- FILE *f;
- char *satz; /* aktueller Datensatz */
- long satzpos; /* Position des Datensatzes */
- int initialized;
- char dateiname[50];
- Key *wurzel;
- int keyfeld; /* Welches Feld ist im Baum sortiert ? */
- } DFile;
-
- /***** Globale Variablen für DATABASE.C *****/
-
- DFile defs[MAXBANKEN];
- int WEITER; /** Flag für Durchsuchfunktion (nicht bei DurchsucheTree) **/
- int AktFeld,AktDef; /** intern benötigt **/
-
- void AddDefinition(int defnr, int typ, int len)
- {
- DFile *d;
- Feld *f;
-
- d=&defs[defnr];
- if (d->felder<MAXFELDER)
- {
- f=&d->Felder[d->felder];
- f->typ=typ;
- f->strlen=len;
- f->offset=d->satzlaenge;
- if (typ==STRFELD)
- d->satzlaenge+=len;
- else d->satzlaenge+=sizeof(int);
- d->felder++;
- }
- }
-
- int OpenFile(int defnr, char *name)
- {
- DFile *d;
- Feld NewFeld,*f;
- char vollname[60];
- FILE *F;
-
- d=&defs[defnr];
- d->felder=0;
- d->satzlaenge=1; /* Statusbyte : Satz zum Löschen markiert ? */
- strcpy(vollname,name);
- strcat(vollname,".DEF");
- if ((F=fopen(vollname,"rb"))==NULL) return(FALSE);
- while (fread(&NewFeld,sizeof(Feld),1,F) > 0)
- {
- f=&d->Felder[d->felder];
- *f=NewFeld;
- d->felder++;
- if (f->typ==STRFELD)
- d->satzlaenge+=f->strlen;
- else d->satzlaenge+=sizeof(int);
- }
- fclose(F);
-
- strcpy(d->dateiname,name);
- d->satz=malloc(defs[defnr].satzlaenge);
- strcpy(vollname,name);
- strcat(vollname,".DAT");
- if ((d->f=fopen(vollname,"r+b"))==NULL)
- return(FALSE);
- d->initialized=1;
- *((char *)(d->satz+d->satzlaenge-1))=0;
- return(OK);
- }
-
- int CreateFile(int defnr, char *name)
- {
- DFile *d;
- int i;
- char vollname[60],help[3];
- FILE *f;
-
- strcpy(vollname,name);
- strcat(vollname,".DEF");
- d=&defs[defnr];
- if ((f=fopen(vollname, "wb"))==NULL)
- return(FALSE);
-
- errno=0;
- for (i=0; i<d->felder &&
- (fwrite(&d->Felder[i],sizeof(Feld),1,f) != 0); i++);
- if (errno) return(FALSE);
- fclose(f);
-
- strcpy(d->dateiname,name);
- d->satzlaenge+=1; /* Gelöscht-Bit */
- d->satz=malloc(defs[defnr].satzlaenge);
-
- strcpy(vollname,name);
- strcat(vollname,".DAT");
- if ((d->f=fopen(vollname, "w+b"))==NULL)
- return(FALSE);
-
- d->initialized=1;
- *((char *)(d->satz+d->satzlaenge-1))=0;
- return(OK);
- }
-
- void BeschreibeSatz(int defnr, int feldnr, char *str, int wert)
- {
- DFile *d;
- Feld *f;
-
- d=&defs[defnr];
- if (d->felder>=feldnr)
- {
- f=&d->Felder[feldnr-1];
- if (f->typ==STRFELD)
- strcpy((char *)(d->satz+f->offset),str);
- else *(int *)(d->satz+f->offset)=wert;
- }
- *((char *)(d->satz+d->satzlaenge-1))=0;
- }
-
- void LeseSatz(int defnr, int feldnr, char *str, int *wert)
- {
- DFile *d;
- Feld *f;
-
- d=&defs[defnr];
- if (d->felder>=feldnr)
- {
- f=&d->Felder[feldnr-1];
- if (f->typ==STRFELD)
- strcpy(str,(char *)(d->satz+f->offset));
- else *wert=*(int *)(d->satz+f->offset);
- }
- }
-
- void WriteToFile(int defnr)
- {
- DFile *d;
-
- d=&defs[defnr];
- if (d->f)
- {
- fseek(d->f,d->satzpos,SEEK_SET);
- fwrite(d->satz,d->satzlaenge,1,d->f);
- }
- d->satzpos=ftell(d->f);
- }
-
- void GotoFileEnd(int defnr)
- {
- DFile *d;
- int i;
-
- d=&defs[defnr];
- if (d->f)
- {
- fseek(d->f,0L,SEEK_END);
- d->satzpos=ftell(d->f);
- }
- *(char *)(d->satz+d->satzlaenge-1)=0;
- }
-
- void GotoFileBegin(int defnr)
- {
- DFile *d;
- int i;
-
- d=&defs[defnr];
- if (d->f)
- {
- fseek(d->f,0L,SEEK_SET);
- d->satzpos=ftell(d->f);
- fread(d->satz,d->satzlaenge,1,d->f);
- }
- }
-
- void GoForward(int defnr)
- {
- DFile *d;
- int i;
-
- d=&defs[defnr];
- if (d->f)
- {
- d->satzpos+=d->satzlaenge;
- fseek(d->f,d->satzpos,SEEK_SET);
- d->satzpos=ftell(d->f);
- fread(d->satz,d->satzlaenge,1,d->f);
- }
- }
-
- void GoBackward(int defnr)
- {
- DFile *d;
- int i;
-
- d=&defs[defnr];
- if (d->f && d->satzpos) /** wenn Position bereits 0, dann Abbrechen **/
- {
- d->satzpos-=d->satzlaenge;
- fseek(d->f,d->satzpos,SEEK_SET);
- d->satzpos=ftell(d->f);
- fread(d->satz,d->satzlaenge,1,d->f);
- }
- }
-
- void GoTo(int defnr, long satzpos)
- {
- DFile *d;
- int i;
-
- d=&defs[defnr];
- if (d->f)
- {
- d->satzpos=satzpos;
- fseek(d->f,d->satzpos,SEEK_SET);
- d->satzpos=ftell(d->f);
- fread(d->satz,d->satzlaenge,1,d->f);
- }
- }
-
- void GoToNr(int defnr, int satznr)
- {
- GoTo(defnr, defs[defnr].satzlaenge*satznr);
- }
-
- void MarkCurrent(int defnr, int Mark_On)
- {
- DFile *d;
- int i;
-
- d=&defs[defnr];
- if (d->f)
- *(char *)(d->satz+d->satzlaenge-1)=Mark_On;
- WriteToFile(defnr);
- }
-
- void CloseFile(int defnr)
- {
- DFile *d;
- int i;
-
- d=&defs[defnr];
-
- if (d->f)
- fclose(d->f);
- d->f=NULL;
- free(d->satz);
- }
-
- int T_ImmerWahr() { return(1==1); }
-
- void A_AddTree()
- {
- char str[30];
- int i;
-
- LeseSatz(AktDef,AktFeld,str,&i);
- AddTree(AktDef,defs[AktDef].satzpos,str);
- }
-
- void DurchSuche(int defnr, TestFunktion t, AusgabeFunktion a)
- {
- DFile *d;
- Feld *f;
- long p;
-
- WEITER=1;
- d=&defs[defnr];
- if (d->f)
- {
- rewind(d->f);
- d->satzpos=ftell(d->f);
- while (fread(d->satz,d->satzlaenge,1,d->f) && WEITER)
- if (!*(char *)(d->satz+d->satzlaenge-1))
- {
- p=ftell(d->f);
- if (t()) a();
- d->satzpos=p;
- fseek(d->f,p,SEEK_SET);
- }
- }
- }
-
- void UnMarkAll(int defnr)
- {
- DFile *d;
- Feld *f;
- long p;
-
- d=&defs[defnr];
- if (d->f)
- {
- rewind(d->f);
- d->satzpos=ftell(d->f);
- while (fread(d->satz,d->satzlaenge,1,d->f))
- if (*(char *)(d->satz+d->satzlaenge-1))
- {
- *((char *)(d->satz+d->satzlaenge-1))=0;
- p=ftell(d->f);
- WriteToFile(defnr);
- d->satzpos=p;
- fseek(d->f,p,SEEK_SET);
- }
- }
- }
-
- void DelMarked(int defnr)
- {
- FILE *new;
- DFile *d;
- Feld *f;
- char newname[60],oldname[60];
-
- d=&defs[defnr];
- fclose(d->f);
- strcpy(newname,d->dateiname);
- strcat(newname,".ALT");
- strcpy(oldname,d->dateiname);
- strcat(oldname,".DAT");
-
- if (rename(oldname,newname)==-1) return;
- if ((d->f=fopen(oldname,"wb"))==NULL)
- { remove(newname); return; }
- if ((new=fopen(newname,"rb"))==NULL)
- { remove(newname); return; }
-
- while (fread(d->satz,d->satzlaenge,1,new))
- if (!*(char *)(d->satz+d->satzlaenge-1))
- fwrite(d->satz,d->satzlaenge,1,d->f);
-
- fclose(new);
- remove(newname);
- }
-
-
- /*****************************************************************/
- /********** Funktionen für die Sortierung in Bäumen *************/
- /*****************************************************************/
-
- void MakeTree(int defnr, int feldnr)
- {
- AktDef=defnr;
- AktFeld=feldnr;
- if (CreateTree(defnr,feldnr))
- DurchSuche(defnr,T_ImmerWahr,A_AddTree);
- }
-
- void _del(Key *k)
- {
- if (k)
- {
- _del(k->L);
- _del(k->R);
- free(k->str);
- free(k);
- }
- }
-
- void DelTree(int defnr)
- {
- DFile *d;
- d=&defs[defnr];
- _del(d->wurzel);
- d->wurzel=NULL;
- d->keyfeld=0;
- }
-
- void _list(Key *k)
- {
- if (k)
- {
- _list(k->L);
- puts(k->str);
- _list(k->R);
- }
- }
-
- void ListTree(int defnr)
- {
- if (defs[defnr].keyfeld)
- _list(defs[defnr].wurzel);
- }
-
- void _durch(int defnr, Key *k, TestFunktion t, AusgabeFunktion a)
- {
- if (k)
- {
- _durch(defnr,k->L,t,a);
- GoTo(defnr, k->filepos);
- if (t()) a();
- _durch(defnr,k->R,t,a);
- }
- }
-
- void DurchsucheTree(int defnr, TestFunktion t, AusgabeFunktion a)
- {
- if (defs[defnr].keyfeld)
- _durch(defnr,defs[defnr].wurzel,t,a);
- }
-
- int CreateTree(int defnr, int feldnr)
- {
- DFile *d;
- Feld *f;
-
- d=&defs[defnr];
- if (d->keyfeld!=0) DelTree(defnr);
- if (feldnr<=d->felder)
- {
- f=&d->Felder[d->felder];
- if (f->typ==STRFELD)
- {
- d->keyfeld=feldnr;
- return(OK);
- }
- }
- return(FALSE);
- }
-
- int _add(Key **k, long filepos, char *str)
- {
- if (!*k)
- {
- if ((*k=malloc(sizeof(Key)))==NULL) return(FALSE);
- if (((*k)->str=malloc(strlen(str)+1))==NULL) return(FALSE);
- strcpy((*k)->str,str);
- (*k)->filepos=filepos;
- (*k)->R=NULL; (*k)->L=NULL;
- } else
- {
- if (strcmp(str,(*k)->str) > 0)
- return(_add(&(*k)->R,filepos,str));
- else return(_add(&(*k)->L,filepos,str));
- }
- return(OK);
- }
-
- int AddTree(int defnr, long filepos, char *str)
- {
- if (defs[defnr].keyfeld)
- return(_add(&defs[defnr].wurzel,filepos,str));
- return(FALSE);
- }
-
- int _search(Key *k, long *filepos, char *str)
- {
- int compare;
-
- if (!k) return(FALSE);
- compare=strcmp(k->str,str);
- if (compare==0)
- {
- *filepos=k->filepos;
- return(OK);
- } else
- if (compare<0)
- return(_search(k->R, filepos, str));
- else return(_search(k->L, filepos, str));
- }
-
- int SearchTree(int defnr, long *filepos, char *str)
- {
- if (defs[defnr].keyfeld)
- if (_search(defs[defnr].wurzel, filepos, str))
- {
- GoTo(0,*filepos);
- return(OK);
- }
- return(FALSE);
- }
-
- int cReadDBFormat(void)
- {
- long dbnr,feldnr;
- int zahl,i,max;
- char str[300],*p;
- char VarName1[50];
-
-
- if ( GetIntegerParam(&dbnr) &&
- GetIntegerParam(&feldnr) )
- {
- Scan();
- if (Steuer == ALPHA) {
- strcpy (VarName1,ScanBuffer);
-
- LeseSatz(dbnr,feldnr,str,&zahl);
-
- if (defs[dbnr].Felder[feldnr-1].typ==STRFELD)
- max=defs[dbnr].Felder[feldnr-1].strlen;
- else {
- max=6;
- itoa(zahl,str,10);
- }
-
- p=str; i=0;
- while (*p++) i++;
- p--; i--;
- while (i++ < max) *p++=' ';
- *p=0;
-
- SetVarStr(VarName1,str);
- }
- else
- {
- serror ("Variablenname erwartet! ");
- return(FALSE);
- }
- }
- else
- {
- serror(" Parameterfehler bei 'ReadDBForm'! ");
- return(FALSE);
- }
-
- return(OK);
- }
-