home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1988 / 04 / c_abc / readtest.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-01-27  |  6.4 KB  |  215 lines

  1. /*--------------------------------------------------------*/
  2. /*                      READTEST.C                        */
  3. /*                                                        */
  4. /*  Testprogramm für die ersten Routinen ("read_voc" und  */
  5. /*  "process()") des Vokabel-Lernprogramms des C-ABC's.   */
  6. /*               "LC" bedeutet Lattice-C                  */
  7. /*--------------------------------------------------------*/
  8.  
  9. #ifndef NARGS   /* Kein function-prototyping  für LC */
  10. #  define NARGS
  11. #endif
  12.  
  13. #include <stdio.h>
  14. #ifdef LC
  15. #  include <stdlib.h>   /* weitere Deklarationen für LC  */
  16. #endif
  17.                 
  18. /*********************************************/
  19. /*        D E C L A R A T I O N S            */
  20. /*********************************************/
  21.  
  22. #ifndef LC
  23. #  define void /* */
  24.    extern char *malloc();   /* Bei LC in stdio.h */
  25.    extern int  atoi();
  26.    extern char *strcpy();
  27.    extern FILE *fopen();
  28.    extern long lseek();
  29.    extern int  close();
  30.    extern int free();
  31.    extern int fclose();
  32. #endif
  33.  
  34. extern int open(); /* wird in LC Dateien nicht deklariert */
  35. void read_voc();
  36. int process();
  37. void free_all();
  38.  
  39. /*********************************************/
  40. /*              D E F I N E S                */
  41. /*********************************************/
  42.  
  43. #define O_MODE 8192             /* mode für open()        */
  44. #define F_MODE "r"              /* mode für fopen()       */
  45. #define AVG_LENGTH 25           /* durchschnitt. Satzlänge*/
  46. #define TRENN ','               /* Feldtrennzeichen       */
  47. #define MIN 1                   /* minimale Anzahl von    */
  48.                                 /* records - brauchen wir */
  49.                                 /* erst später            */
  50.  
  51. /*********************************************/
  52. /*           S O M E  M A C R O S            */
  53. /*********************************************/
  54.  
  55. #define adress(txt,adr) printf("--> %lxX(%ldD)\t%s\n", \
  56.                                (long)adr,(long)adr,txt)
  57.           /* '\' ist das Zeilenfortsetzungszeichen */
  58.  
  59. #define usage(y) exit(1)  
  60.   /* richtige Fehlerbehandlung kommt später, */
  61.   /* hier noch per define                    */
  62.  
  63. /*********************************************/
  64. /*             T Y P E D E F S               */
  65. /*********************************************/
  66.  
  67. typedef struct voc {
  68.                     char *fremd;
  69.                     char *deutsch;
  70.                     char *beispiel;
  71.                    } VOC;
  72.                   
  73. /*********************************************/
  74. /*              G L O B A L S                */
  75. /*********************************************/
  76.  
  77. VOC *voc_pool;           /* Zeiger Vokabelzeiger        */
  78. char *voc_end;           /* Zeiger nach letzen Eintrag  */
  79. char *str_pool;          /* Zeiger Stringpool           */
  80. char *str_end;           /* Zeiger nach letzten Eintrag */             
  81. char infile[64];         /* Pfadname Eingabedatei       */
  82. int count;               /* Satzzähler                  */
  83.  
  84. /*********************************************/
  85. /*             C O D E   A R E A             */
  86. /*********************************************/
  87.  
  88. /* ------------------------ */
  89. /*     main()               */
  90. /* ------------------------ */
  91.  
  92. void main(argc,argv)
  93. int argc;     /* Anzahl b. Aufruf übergebender Argumente */
  94. char *argv[]; /* Vektor mit Zeigern auf Argumente */
  95.  
  96. {
  97. register int i;
  98.   if(argc < 2) exit(1);    /* Wir brauchen 2tes Argument */
  99.   strcpy(infile,argv[1]);  /* 2tes Argument ist Datei    */
  100.   read_voc();              /* Eingabedatei öffnen        */
  101.   
  102. /* ------------------  ADRESSEN zeigen  ---------------- */ 
  103. /* im Format fffffffX(ddddddD) f in Hex und d in dezimal */
  104.  
  105.   adress("str_pool",str_pool);
  106.   adress("str_end",str_end);
  107.   adress("voc_pool",voc_pool);
  108.   adress("voc_end",voc_end);
  109.   getchar();
  110.   for(i = 0;i < count;i++) {
  111.     printf("---------  %d  ----------\n",i);
  112.     adress(">>voc_pool[i]<<",&voc_pool[i]);      
  113.     /* Adresse der Struktur*/ 
  114.     adress(voc_pool[i].fremd,voc_pool[i].fremd); 
  115.     /* Adresse der Strings */
  116.     adress(voc_pool[i].deutsch,voc_pool[i].deutsch);
  117.     adress(voc_pool[i].beispiel,voc_pool[i].beispiel);
  118.     getchar(); }
  119.  
  120.   free_all();     /* Speicher wieder frei geben */
  121. }
  122.  
  123. /* ------------------------ */
  124. /*      read_voc()          */
  125. /* ------------------------ */
  126.  
  127. void read_voc()    /*  Lesen  und aufbereiten */
  128.                    /*  der Vokabeldatei       */
  129. {
  130. int fildes;
  131. long size;
  132. FILE *fp;
  133.   /* Dateigröße feststellen - portabel */
  134.   if ( (fildes = open(infile,O_MODE)) == -1) usage(err[1]);
  135.   if ( (size = lseek(fildes,0L,2)) == -1) 
  136.                           {close(fildes); usage(err[2]);}
  137.   close(fildes);  /*  nun gepuffert mit fopen */
  138.   if(!(fp = fopen(infile,F_MODE)))
  139.     usage(err[1]);               
  140.   /* allocate memory */
  141.   if((str_pool = malloc((unsigned)size)) == (char *)0 )
  142.     usage(err[4]);
  143.   str_end = str_pool + size;
  144.   if( (voc_pool = 
  145.     (VOC *)malloc((unsigned)(size/AVG_LENGTH*sizeof(VOC))))
  146.     == (VOC *) 0)
  147.     usage(err[4]);
  148.   voc_end = (char *)voc_pool + size/AVG_LENGTH*sizeof(VOC);
  149.   
  150.   if( !(count = process(fp)) )
  151.     {
  152.       free_all();
  153.       usage(err[3]);
  154.     }
  155.   if( count < MIN)
  156.     {
  157.       free_all();
  158.       usage(err[5]);
  159.     }
  160.   fclose(fp);
  161. }
  162.  
  163. /* ------------------------ */
  164. /*      process()           */
  165. /* ------------------------ */
  166.  
  167. int process(fp)
  168. FILE *fp;
  169. {
  170. char *sp_temp;
  171. register long *vocp;
  172. register char *sp;
  173. int wc;
  174. int c;
  175.   sp_temp = sp = str_pool;
  176.   vocp = (long *)voc_pool;
  177.   /* vocp geht einen Eintrag weiter  */
  178.   wc = 0;
  179.   while( (c = fgetc(fp)) != EOF 
  180.          && sp < str_end 
  181.          && (char *)vocp < voc_end )
  182.     {
  183.       switch(c)
  184.         {
  185.           case   '\n':
  186.           case TRENN :
  187.             wc++;
  188.             *sp = '\0';
  189.             *vocp = (long)sp_temp; 
  190.             /* Hier wird an der Adresse vocp ein Wert */
  191.             /* geschrieben, der später wieder als     */
  192.             /* Zeiger interpretiert wird              */
  193.             vocp++;
  194.             sp_temp = ++sp;    /* Stringanfang merken */
  195.             break;
  196.           default    :
  197.             *sp++ = c; 
  198.         }   
  199.     }
  200.   return((int)(wc/3));
  201. }
  202.  
  203. /* ------------------------ */
  204. /*      free_all()          */
  205. /* ------------------------ */
  206.  
  207. void free_all()
  208. {
  209.   free((char *)voc_pool);
  210.   free(str_pool);
  211. }
  212.  
  213. /*--      B Y E ,  B Y E  M Y  L O V E     --*/
  214.  
  215.