home *** CD-ROM | disk | FTP | other *** search
/ Fish 'n' More 2 / fishmore-publicdomainlibraryvol.ii1991xetec.iso / fish / misc_utils / utils / cookie / pointers.c < prev    next >
C/C++ Source or Header  |  1990-12-16  |  2KB  |  87 lines

  1. /********************************************************************
  2.    pointers - generate pointers file for cookie prog.
  3.      input : s:cookie.dat - cookie file
  4.      output : s:cookie.ptr - pointers file
  5.  
  6.    © S.E.Mitchell 5/6/90
  7. *********************************************************************/
  8.  
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <exec/types.h>
  12. #include <exec/memory.h>
  13. #include <libraries/dos.h>
  14. #include <libraries/dosextens.h>
  15. #include <proto/dos.h>
  16. #include <proto/exec.h>
  17.  
  18. #define BUF_SIZE    256     /* size of read buffer */
  19. #define SEPERATOR   0x0c    /* char that seperates fortunes */
  20.  
  21. void _main()
  22. {
  23.   int c=1,i,t,count,len,*p,*base;
  24.   BPTR in,out;
  25.   char buffer[BUF_SIZE];
  26.  
  27.   if((in=Open("s:cookie.dat",MODE_OLDFILE))==NULL) {
  28.     Write(Output(),"Cannot open in file\n",20);
  29.     Exit(1);
  30.   }
  31.   if((out=Open("s:cookie.ptr",MODE_NEWFILE))==NULL) {
  32.     Write(Output(),"Cannot open out file\n",21);
  33.     Close(in);
  34.     Exit(1);
  35.   }
  36.  
  37.   /* find number of fortunes */
  38.  
  39.   while((count=Read(in,buffer,BUF_SIZE))>0) {
  40.     for(i=0;i<count;i++)
  41.       if(buffer[i]==SEPERATOR)
  42.     c++;
  43.   };
  44.  
  45.   /* first longword contains number cookies ... */
  46.  
  47.   Write(out,(UBYTE *)&c,4);
  48.  
  49.   /* and back to the beginning */
  50.  
  51.   Seek(in,0,OFFSET_BEGINNING);
  52.  
  53.   /* allocate sufficient memory to hold pointers to all cookies */
  54.  
  55.   len=c<<2;
  56.   base=(int *)AllocMem(len,MEMF_PUBLIC);
  57.   if(base==NULL) {
  58.     Write(Output(),"Out of memory\n",14);
  59.     Close(in);
  60.     Close(out);
  61.     Exit(1);
  62.   };
  63.  
  64.   p=base;
  65.   *p++=0;        /* first cookie at 0 ... no ^L here ... */
  66.  
  67.   /* run through cookies again, this time noting down pointers */
  68.  
  69.   i=1;
  70.   while((count=Read(in,buffer,BUF_SIZE))>0) {
  71.     for(t=0;t<count;t++,i++)
  72.       if(buffer[t]==SEPERATOR)
  73.     *p++=i;
  74.   };
  75.  
  76.   /* blam it out to file */
  77.  
  78.   Write(out,(UBYTE *)base,len);
  79.  
  80.   /* close up and exit */
  81.  
  82.   Close(in);
  83.   Close(out);
  84.   FreeMem(base,len);
  85.   Exit(0);
  86. }
  87.