home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <conio.h>
- #include <ctype.h>
- #include <string.h>
- #include <malloc.h>
- #include "keydef.h"
- #include "screen.h"
-
- #define DATAFILE "tk.dat"
- #define INDEXFILE "tk.ndx"
- #define MAXDAT 10000 //Max 10000 telefonszam (remelem mindenkinek eleg)
- //tobb is lehetne mondjuk nagyobb memoriamodellben
-
- #define PAGE 22
-
- typedef struct {
- char nev[30];
- char szam[15];
- char cim[30];
- char reserved;
- } DATTYPE;
-
- typedef unsigned short int NDXTYPE;
-
- FILE *datfile;
- FILE *ndxfile;
- NDXTYPE *ndx;
- unsigned int records;
-
- long filelength(FILE *file);
- int insertndx(int recordnum, DATTYPE rekord);
- void deletendx(int x);
- int search(char *nev,int *poz); //kereses rendezett adatbazisban
- void fill(DATTYPE *rek);
-
- void main(void)
- {
- char c, srchstr[30]="";
- int srchstrpos=0,poz=0,oldpoz=-1,exit=0;
- unsigned int seg;
- void init(void);
- void insert();
- void list(int poz);
- void change(int poz);
- void del(int poz);
- void undelete(void);
- void recoverndx(void);
- int kilep(void);
- int checkndx();
- int checkdat();
- int openfile(FILE **file,char *filename);
- void freshsrch(char *c);
-
- clrscr();
- if (openfile(&datfile,DATAFILE) && openfile(&ndxfile,INDEXFILE))
- {
- if (!checkdat()) { printf("Hibas az adatfile, nem tudom kezelni, szia");return ;}
- if ((ndx=(NDXTYPE *)malloc(MAXDAT*sizeof(NDXTYPE)))==0) //ndx erre mutat
- {printf("Nem ferek el a memoriaban");return;}
- if (!checkndx())
- {
- printf("Az indexfile nem oksi. Kijavítom...\n");
- recoverndx();
- // bill();
- }
- fread(ndx,sizeof(NDXTYPE),records,ndxfile); //indexfile be
- fclose(ndxfile); //mar a memoriaban van
-
- init();
-
- do
- {
- if (srchstrpos>0) search(srchstr,&poz);
- if (oldpoz!=poz) list(poz);
- freshsrch(srchstr);
- oldpoz=poz;
- c=getch();
- switch(c)
- {
- case 0: c=getch();
- switch(c)
- {
- case INS : insert(); oldpoz=-1; break;
- case DEL : del(poz);oldpoz=-1; break;
- case DOWN : poz++;if (poz>=records) poz=records-1;srchstr[0]=0;srchstrpos=0;break;
- case UP : poz--;if (poz<0) poz=0;srchstr[0]=0;srchstrpos=0;break;
- case PGUP : poz-=PAGE;if (poz<0) poz=0;srchstr[0]=0;srchstrpos=0;break;
- case PGDN : poz+=PAGE;if (poz>=records) poz=records-1;srchstr[0]=0;srchstrpos=0;break;
- case HOME : poz=0;srchstr[0]=0;srchstrpos=0;break;
- case END : poz=records-1;srchstr[0]=0;srchstrpos=0;break;
- } break;
- case ESC : exit=kilep();break;
- case ENTER : change(poz);oldpoz=-1; break;
- case CTRLBS : undelete();oldpoz=-1;break;
- case BS : if (srchstrpos>0) srchstrpos--;
- srchstr[srchstrpos]=0;
- break;
-
- default: srchstr[srchstrpos]=c;
- if (srchstrpos<29) srchstrpos++;
- break;
- }
- } while(!exit);
-
-
- fclose(datfile);
- //indexfile elmentese
- ndxfile=fopen(INDEXFILE,"wb");
- fwrite(ndx, sizeof(NDXTYPE), records, ndxfile);
- fclose(ndxfile);
- }
- } // main
-
- void freshsrch(char *c)
- {
- gotoxy(50,24);
- textcolor(WHITE);
- textbackground(CYAN);
- cprintf(" ");
- gotoxy(50,24);
- cprintf("%s",c);
- }
-
- int kilep(void)
- {
- if (mnuwin(20,10,40,13,"Kilépsz ?",2,
- "Igen",
- "Nem")==0) return(1);
- return(0);
- }
-
-
- void init(void)
- {
- screeninit();
- screentitle("TelKony V0.0");
- textbackground(CYAN);
- textcolor(BLACK);
- gotoxy(1,2);
- cprintf(" Név Telefonszám Lakcím ");
- screenhelp("Uj szám : Insert Töröl : Del Keresô:[ ]\n\
- Módosít : Enter Kilép : ESC");
- // screenhelp("");
- }
-
- void list(int poz)
- {
- DATTYPE rek;
- char sor[81];
- int i,y;
-
- textbackground(BLUE);
- textcolor(BLACK);
-
- for(i=3;i<24;i++)
- {
- gotoxy(1,i);
- clreol();
- }
-
- y=3;
- i=poz-PAGE/2;
- while(i<poz+PAGE/2-1)
- {
- if (i>=0 && i<records)
- {
- fseek(datfile,(long) ndx[i]*sizeof(DATTYPE),SEEK_SET);
- fread(&rek,sizeof(DATTYPE),1,datfile);
- if (i==poz)
- {
- textbackground(CYAN);
- textcolor(BLACK);
- } else
- {
- textbackground(BLUE);
- textcolor(BLACK);
- }
- memset(sor,' ',80);
- sor[80]=0;
- memcpy(&sor[0],rek.nev,strlen(rek.nev));
- memcpy(&sor[40-strlen(rek.szam)],rek.szam,strlen(rek.szam));
- memcpy(&sor[80-strlen(rek.cim)],rek.cim,strlen(rek.cim));
- gotoxy(1,y);
- cprintf("%s",sor);
- }
- i++;
- y++;
- }
- }
-
- void insert()
- {
- DATTYPE rek;
-
- memset (&rek, 0, sizeof(DATTYPE));
-
- fill(&rek);
- rek.reserved=0;
-
- if ( edtwin(20,10,60,14,"Uj szám",3,
- "Név :",rek.nev,
- "Szám :",rek.szam,
- "Cím :",rek.cim))
- {
-
- fseek(datfile,0,SEEK_END);
- if (insertndx(ftell(datfile)/sizeof(DATTYPE),rek))
- {
- fwrite(&rek, sizeof(DATTYPE), 1, datfile);
- records++;
- } else msgwin("Ilyen név már van!");
- }
- }
-
- void change(int pos)
- {
- DATTYPE rek,rek0;
- int p,recordnum;
-
- fseek(datfile,(long) ndx[pos]*sizeof(DATTYPE),SEEK_SET);
- fread(&rek,sizeof(DATTYPE),1,datfile);
-
- fill(&rek);
- memcpy (&rek0, &rek, sizeof(DATTYPE));
-
- if(edtwin(20,10,60,14,"Módosítás",3,
- "Név :",rek0.nev,
- "Szám :",rek0.szam,
- "Cím :",rek0.cim))
- {
- if (strcmp(rek.nev,rek0.nev)!=0 && search(rek0.nev,&p)) msgwin("Ilyen nev mar van.");
- else
- {
- recordnum=ndx[pos];
- deletendx(pos);
- records--;
- insertndx(recordnum,rek0);
- records++;
- fseek(datfile,(long) recordnum*sizeof(DATTYPE),SEEK_SET);
- fwrite(&rek0, sizeof(DATTYPE), 1, datfile);
- }
- }
- } // modositas
-
- void del(int pos)
- {
- DATTYPE rek;
-
- if (mnuwin(35,10,45,13,"Töröljem?",2,"Igen","Nem")==0)
- {
- fseek(datfile,(long) ndx[pos]*sizeof(DATTYPE),SEEK_SET);
- fread(&rek,sizeof(DATTYPE),1,datfile);
- rek.reserved=1;
- fseek(datfile,(long) ndx[pos]*sizeof(DATTYPE),SEEK_SET);
- fwrite(&rek,sizeof(DATTYPE),1,datfile);
- deletendx(pos);
- records--;
- }
- }
-
- void undelete(void)
- {
- DATTYPE rek,rek2;
- int p,found=0,pos;
-
- memset(&rek2,0,sizeof(rek2));
- fill(&rek2);
-
- if(edtwin(20,10,60,12,"Törles vissza",1,"Név :",rek2.nev))
- {
- fseek(datfile,0,SEEK_SET);
- while (!feof(datfile) && !found)
- {
- if (fread(&rek,sizeof(DATTYPE),1,datfile) && rek.reserved==1 && strcmp(rek.nev,rek2.nev)==0)
- {
- found=1;
- if (search(rek2.nev,&pos)) msgwin("Nem lehet visszaallitani, mar letezik aznos nevu.");
- else
- {
- fseek(datfile,SEEK_CUR,-sizeof(DATTYPE));
- rek.reserved=0;
- insertndx(ftell(datfile)/sizeof(DATTYPE),rek);
- records++;
- fwrite(&rek,sizeof(DATTYPE),1,datfile);
- }
- }
- }
- if (!found) msgwin("Nem talaltam.");
- }
- }
-
- int openfile(FILE **file,char *filename)
- {
- if ((*file=fopen(filename,"r+b"))==NULL)
- {
- printf("A %s file nem letzik, letrehozom...\n",filename);
- // bill();
- if ((*file=fopen(filename,"wb"))==NULL)
- {
- printf("Nem tudom letrehozni a %s file-t (lehet hogy CD-rol inditottal)\n",filename);
- // bill();
- return(0);
- }
- fclose(*file);
- *file=fopen(filename,"r+b");
- }
- return(1);
- }
-
- int checkdat()
- {
- DATTYPE rek;
-
- if (filelength(datfile)%sizeof(DATTYPE)!=0) return(0);
- records=0;
- fseek(datfile,0,SEEK_SET);
- while (!feof(datfile))
- {
- if (fread(&rek,sizeof(DATTYPE),1,datfile) && rek.reserved==0) records++;
- }
- return(1);
- }
-
- int checkndx()
- {
- return((filelength(ndxfile)/sizeof(NDXTYPE))==records);
- }
-
- void recoverndx()
- {
- int r;
- DATTYPE rek;
- FILE *dat2file;
-
- fclose(datfile);
- rename(DATAFILE, "$$.DAT"); //TEMP FILE
- dat2file=fopen("$$.DAT","rb");
- datfile=fopen(DATAFILE,"wb");
- fclose(datfile);
- datfile=fopen(DATAFILE,"r+b");
- fseek(dat2file,0,SEEK_SET);
-
- r=records;
- for(records=0;records<r;)
- {
- fread(&rek,sizeof(DATTYPE),1,dat2file);
- if (rek.reserved==0)
- {
- insertndx(ftell(dat2file)/sizeof(DATTYPE)-1,rek);
- records++;
- }
- fseek(datfile,0,SEEK_END);
- fwrite(&rek,sizeof(DATTYPE),1,datfile);
- }
- records=r;
- fseek(ndxfile,0,SEEK_SET);
- fwrite(ndx, sizeof(NDXTYPE), records, ndxfile);
- fseek(ndxfile,0,SEEK_SET);
-
- remove("$$.DAT");
- }
-
- int insertndx(int recordnum, DATTYPE rekord)
- {
- int poz,i=0;
-
- if (search(rekord.nev,&poz)) return(0);
- for(i=records;i>poz;i--) ndx[i]=ndx[i-1]; //arreb pakoljuk az indexeket
- ndx[poz]=recordnum; //benyomjuk az ujat
- return(1);
- }
-
- int search(char *nev,int *poz) //kereses rendezett adatbazisban
- {
- int i=0,h,hl,ll,found=0;
- long oldpos;
- DATTYPE rek;
-
- if (!records) {*poz=0;return(0);} //ha nincs meg elem
-
- oldpos=ftell(datfile);
- //intervallum vegpontjai
- ll=0;
- hl=records-1;
-
- //benn van e az intervallumban:
- fseek(datfile,(long) ndx[ll]*sizeof(DATTYPE),SEEK_SET);
- fread(&rek,sizeof(DATTYPE),1,datfile);
- if (strcmp(nev,rek.nev)==0) {*poz=0;fseek(datfile,oldpos,SEEK_SET);return(1);}
- if (strcmp(nev,rek.nev)<0) {*poz=0;fseek(datfile,oldpos,SEEK_SET);return(0);}
- if (strcmp(nev,rek.nev)>0)
- {
- fseek(datfile,(long) ndx[hl]*sizeof(DATTYPE),SEEK_SET);
- fread(&rek,sizeof(DATTYPE),1,datfile);
- if (strcmp(nev,rek.nev)>0) {*poz=records;fseek(datfile,oldpos,SEEK_SET);return(0);}
- if (strcmp(nev,rek.nev)==0) {*poz=records-1;fseek(datfile,oldpos,SEEK_SET);return(1);}
- if (strcmp(nev,rek.nev)<0 && records==2) {*poz=1;fseek(datfile,oldpos,SEEK_SET);return(0);}
- }
-
- //tutira benn van az intervallumban, ami legalabb 3 elemu
- while(ll!=hl-1 && !found)
- {
- i=(ll+hl)/2;
- fseek(datfile,(long) ndx[i]*sizeof(DATTYPE),SEEK_SET);
- fread(&rek,sizeof(DATTYPE),1,datfile);
- h=strcmp(nev,rek.nev);
- if (h<0) hl=i;
- if (h>0) ll=i;
- if (h==0) found=1;
- }
- if (!found && h>0) i++;
- *poz=i;
- fseek(datfile,oldpos,SEEK_SET);
- return(found);
- }
-
- void deletendx(int x)
- {
- int i;
- for (i=x;i<records-1;i++)
- ndx[i]=ndx[i+1];
- }
-
- long filelength(FILE *file)
- {
- long oldpos;
- long size;
-
- oldpos=ftell(file);
- fseek(file,0,SEEK_END);
- size=ftell(file);
- fseek(file,oldpos,SEEK_SET);
- return(size);
- }
-
- void fill(DATTYPE *rek)
- {
- int n;
-
- for(n=strlen(rek->nev);n<30-1;rek->nev[n++]=' '); rek->nev[n]=0;
- for(n=strlen(rek->cim);n<30-1;rek->cim[n++]=' '); rek->cim[n]=0;
- for(n=strlen(rek->szam);n<15-1;rek->szam[n++]=' '); rek->szam[n]=0;
- }