home *** CD-ROM | disk | FTP | other *** search
- /*--------------------------------------------------------*/
- /* READTEST.C */
- /* */
- /* Testprogramm für die ersten Routinen ("read_voc" und */
- /* "process()") des Vokabel-Lernprogramms des C-ABC's. */
- /* "LC" bedeutet Lattice-C */
- /*--------------------------------------------------------*/
-
- #ifndef NARGS /* Kein function-prototyping für LC */
- # define NARGS
- #endif
-
- #include <stdio.h>
- #ifdef LC
- # include <stdlib.h> /* weitere Deklarationen für LC */
- #endif
-
- /*********************************************/
- /* D E C L A R A T I O N S */
- /*********************************************/
-
- #ifndef LC
- # define void /* */
- extern char *malloc(); /* Bei LC in stdio.h */
- extern int atoi();
- extern char *strcpy();
- extern FILE *fopen();
- extern long lseek();
- extern int close();
- extern int free();
- extern int fclose();
- #endif
-
- extern int open(); /* wird in LC Dateien nicht deklariert */
- void read_voc();
- int process();
- void free_all();
-
- /*********************************************/
- /* D E F I N E S */
- /*********************************************/
-
- #define O_MODE 8192 /* mode für open() */
- #define F_MODE "r" /* mode für fopen() */
- #define AVG_LENGTH 25 /* durchschnitt. Satzlänge*/
- #define TRENN ',' /* Feldtrennzeichen */
- #define MIN 1 /* minimale Anzahl von */
- /* records - brauchen wir */
- /* erst später */
-
- /*********************************************/
- /* S O M E M A C R O S */
- /*********************************************/
-
- #define adress(txt,adr) printf("--> %lxX(%ldD)\t%s\n", \
- (long)adr,(long)adr,txt)
- /* '\' ist das Zeilenfortsetzungszeichen */
-
- #define usage(y) exit(1)
- /* richtige Fehlerbehandlung kommt später, */
- /* hier noch per define */
-
- /*********************************************/
- /* T Y P E D E F S */
- /*********************************************/
-
- typedef struct voc {
- char *fremd;
- char *deutsch;
- char *beispiel;
- } VOC;
-
- /*********************************************/
- /* G L O B A L S */
- /*********************************************/
-
- VOC *voc_pool; /* Zeiger Vokabelzeiger */
- char *voc_end; /* Zeiger nach letzen Eintrag */
- char *str_pool; /* Zeiger Stringpool */
- char *str_end; /* Zeiger nach letzten Eintrag */
- char infile[64]; /* Pfadname Eingabedatei */
- int count; /* Satzzähler */
-
- /*********************************************/
- /* C O D E A R E A */
- /*********************************************/
-
- /* ------------------------ */
- /* main() */
- /* ------------------------ */
-
- void main(argc,argv)
- int argc; /* Anzahl b. Aufruf übergebender Argumente */
- char *argv[]; /* Vektor mit Zeigern auf Argumente */
-
- {
- register int i;
- if(argc < 2) exit(1); /* Wir brauchen 2tes Argument */
- strcpy(infile,argv[1]); /* 2tes Argument ist Datei */
- read_voc(); /* Eingabedatei öffnen */
-
- /* ------------------ ADRESSEN zeigen ---------------- */
- /* im Format fffffffX(ddddddD) f in Hex und d in dezimal */
-
- adress("str_pool",str_pool);
- adress("str_end",str_end);
- adress("voc_pool",voc_pool);
- adress("voc_end",voc_end);
- getchar();
- for(i = 0;i < count;i++) {
- printf("--------- %d ----------\n",i);
- adress(">>voc_pool[i]<<",&voc_pool[i]);
- /* Adresse der Struktur*/
- adress(voc_pool[i].fremd,voc_pool[i].fremd);
- /* Adresse der Strings */
- adress(voc_pool[i].deutsch,voc_pool[i].deutsch);
- adress(voc_pool[i].beispiel,voc_pool[i].beispiel);
- getchar(); }
-
- free_all(); /* Speicher wieder frei geben */
- }
-
- /* ------------------------ */
- /* read_voc() */
- /* ------------------------ */
-
- void read_voc() /* Lesen und aufbereiten */
- /* der Vokabeldatei */
- {
- int fildes;
- long size;
- FILE *fp;
- /* Dateigröße feststellen - portabel */
- if ( (fildes = open(infile,O_MODE)) == -1) usage(err[1]);
- if ( (size = lseek(fildes,0L,2)) == -1)
- {close(fildes); usage(err[2]);}
- close(fildes); /* nun gepuffert mit fopen */
- if(!(fp = fopen(infile,F_MODE)))
- usage(err[1]);
- /* allocate memory */
- if((str_pool = malloc((unsigned)size)) == (char *)0 )
- usage(err[4]);
- str_end = str_pool + size;
- if( (voc_pool =
- (VOC *)malloc((unsigned)(size/AVG_LENGTH*sizeof(VOC))))
- == (VOC *) 0)
- usage(err[4]);
- voc_end = (char *)voc_pool + size/AVG_LENGTH*sizeof(VOC);
-
- if( !(count = process(fp)) )
- {
- free_all();
- usage(err[3]);
- }
- if( count < MIN)
- {
- free_all();
- usage(err[5]);
- }
- fclose(fp);
- }
-
- /* ------------------------ */
- /* process() */
- /* ------------------------ */
-
- int process(fp)
- FILE *fp;
- {
- char *sp_temp;
- register long *vocp;
- register char *sp;
- int wc;
- int c;
- sp_temp = sp = str_pool;
- vocp = (long *)voc_pool;
- /* vocp geht einen Eintrag weiter */
- wc = 0;
- while( (c = fgetc(fp)) != EOF
- && sp < str_end
- && (char *)vocp < voc_end )
- {
- switch(c)
- {
- case '\n':
- case TRENN :
- wc++;
- *sp = '\0';
- *vocp = (long)sp_temp;
- /* Hier wird an der Adresse vocp ein Wert */
- /* geschrieben, der später wieder als */
- /* Zeiger interpretiert wird */
- vocp++;
- sp_temp = ++sp; /* Stringanfang merken */
- break;
- default :
- *sp++ = c;
- }
- }
- return((int)(wc/3));
- }
-
- /* ------------------------ */
- /* free_all() */
- /* ------------------------ */
-
- void free_all()
- {
- free((char *)voc_pool);
- free(str_pool);
- }
-
- /*-- B Y E , B Y E M Y L O V E --*/
-