
/*-------------------------------------------------------------------------*
 *                                                                         *
 * Prints formatted dump of data and index file.                           *
 * Example of reading data and index files (if you must).                  *
 *                                                                         *
 * Compiles under Manx C 5.0d                                              *
 *   cc -hi allprecomp -pp -wnuq -o dumprmfdata.o dumprmfdata.c            *
 *   ln -o dumprmfdata dumprmfdata.o -lc                                   *
 *                                                                         *
 * Compile/link for Lattice 5.10                                           *
 *     LC -L -Hinclude:allprecomp.q dumprmfdata                            *
 *           (pre-compiled header file)                                    *
 *                                                                         *
 *-------------------------------------------------------------------------*/
 

#include "avl.structs.h"

long getnum( void );
int dump_rmf_data_index( char *datafile, char *indexfile, long s, long e );

main( int argc, char *argv[] )
{
    char *oldi,*oldd;
    long oldnamelen,starting,ending;
    
    if( argc < 2 ) {
        printf("\nSyntax: %s 'filename' [startrecordnum] [endrecordnum]\n", \
                                                                    argv[0]);
        exit( 10 );
    }
        
    oldnamelen = strlen(argv[1]) + 50;
    
    oldi = AllocMem( oldnamelen, MEMF_CLEAR );
    oldd = AllocMem( oldnamelen, MEMF_CLEAR );
    
    strcpy(oldd,argv[1]);
    strcpy(oldi,argv[1]);
    
    strcat(oldi,".rmfindex");
    
    if( argc > 2 )
        starting = atoi(argv[2]);
    else {    
        printf("\n\nEnter Starting Record: ");
        starting = getnum();
    }
        
    if( argc > 3 )    
        ending = atoi(argv[3]);
    else {    
        printf("\n\nEnter Ending Record: ");
        ending = getnum();
    }
    
    if( starting < 1 )
        starting = 1;

    if( !ending )
        ending = 99999999L;
    
    if( ending < starting )
        ending = starting;
    
    dump_rmf_data_index( oldi, oldd, starting, ending );
    
    FreeMem( oldi, oldnamelen);
    FreeMem( oldd, oldnamelen);
    
}

char numbuf[81];
long getnum()
{
  long num;

  gets(&numbuf[0]);
  
  num = atoi(&numbuf[0]);
  
  return(num);
  
}
 
int dump_rmf_data_index( char *indexfile, char *datafile, long start, long end )
{


   struct IndexFile      *ix;
   struct DiskIndex      *dtnode; 
   struct DataFileHeader *dfh;
   struct RecordHeader   *rh;
   char                  *keybuf,*indxbuf;
   char                  *datablock,*datapointer; 
   ULONG                 blocklen;
   ULONG                 recaddr,recnum;
   ULONG                 ifd,dfd;
   long                  err,total_keylen,keyindex;
   long                  blen,dlen,fieldnum;
   int                   ok,i,j;

   
   ifd = Open(indexfile,MODE_OLDFILE);
   if( !ifd ) {
       printf(" COULD NOT OPEN INDEX file %s\n",indexfile);
       return( FALSE );
   }
   
   dfd = Open(datafile,MODE_OLDFILE);
   if( !ifd ) {
       printf(" COULD NOT OPEN DATA file %s\n",datafile);
       Close( ifd );
       return( FALSE );
   }
   
   ix      = AllocMem( sizeof(struct IndexFile), MEMF_CLEAR );
   dtnode  = AllocMem( sizeof(struct DiskIndex), MEMF_CLEAR );
   dfh     = AllocMem( sizeof(struct DataFileHeader), MEMF_CLEAR );
   rh      = AllocMem( sizeof(struct RecordHeader), MEMF_CLEAR );
   keybuf  = AllocMem( (MAXKEYLEN) + 1, MEMF_CLEAR );
   indxbuf = AllocMem( 5 * ((MAXKEYLEN) + 1), MEMF_CLEAR );
   if( !keybuf || !rh || !ix || !dtnode || !dfh || !indxbuf ) {
       printf("\nUnable to allocate memory\n\n");
       if( ix )
           FreeMem( ix, sizeof(struct IndexFile) );
       if( dtnode ) 
           FreeMem( dtnode, sizeof(struct DiskIndex) );
       if( dfh ) 
           FreeMem( dfh, sizeof(struct DataFileHeader) );
       if( rh ) 
           FreeMem( rh, sizeof(struct RecordHeader) );
       if( keybuf ) 
           FreeMem( keybuf, (MAXKEYLEN)+1 );
       if( indxbuf ) 
           FreeMem( indxbuf, (5 * ((MAXKEYLEN)+1)) );
       Close( dfd );
       Close( ifd );
       return( FALSE );    
   }
   
   ok = Read(ifd,ix,sizeof(struct IndexFile));
   
   ok = Read(dfd,dfh,sizeof(struct DataFileHeader));

   recnum = 0;
   ok = TRUE;
   printf("\n\n");
   while( ok ) {
   
      datablock = NULL;
      
      /* fixed portion */
      err = Read(ifd,dtnode,sizeof(struct DI_Info));
      if( err <= 0 ) 
           break;
      
      total_keylen = 0;
      for( i=0; i < MAXINDICES; i++ )
           total_keylen = total_keylen + dtnode->di_info.keylen[i]; 
           
      /* read variable key portion */
      err = Read(ifd,&dtnode->keydata[0],total_keylen);
      
      if( err <= 0 )
          break;

      switch( dtnode->di_info.recstatus ) 
        {
          case 'D': /* dont care, plus has no record length, dont know
                       how much to read in !
                    */
                   break;
                   
          case 'A':
                   recaddr = dtnode->di_info.recaddr;
      
                   Seek(dfd,recaddr,OFFSET_BEGINNING);
                   err = Read( dfd, rh, sizeof(struct RecordHeader));
                   if( err <= 0 ) {
                       printf("READ ERROR occured at block %d\n",recaddr);
                       ok = FALSE;
                       break;
                   }
          
                   blocklen  = rh->blocklength;
                   datablock = AllocMem( blocklen, MEMF_CLEAR );    
                   if( !datablock ) {
                       printf(" Could not allocate mem for datablock\n");
                       printf("   blocklength was %-d\n",blocklen);
                       ok = FALSE;
                       break;
                   }

                   err = Read( dfd, datablock, (blocklen));
                   if( err <= 0 ) {
                       printf("READ ERROR occured at block %d\n",recaddr);
                       ok = FALSE;
                       break;
                   }
                   
                   
                   
                   ++recnum;
                   if( recnum >= start && recnum <= end ) {    
                   
                       printf(" RECORD  #%-5d ",recnum);
                       
                       printf(" AT LOCATION %-5d ",recaddr);
                       
                       printf(" LENGTH %-5d ",rh->blocklength);
                       
                       printf(" FIELDS %-4d\n",rh->numberoffields);
                       
                       /* prime key as it is in index */
                       printf(" INDXKEY- ");
                       
                       keyindex = 0;
                       
                       for( i = 0; i <= MAXINDEXNUM; i++ ) {
                       
                            for( j = 0; j < 10; j++ )
                                 *(keybuf+j) = ' ';
                            *(keybuf+j) = NULL;
                            
                            for(j = 0; j < dtnode->di_info.keylen[i]; j++) {
                                 if( j < 9 )
                                     *(keybuf+j) = dtnode->keydata[keyindex];
                                 ++keyindex;
                            }
                                 
                            if( i == 1 ) 
                                printf("\n ALTKEYS- ");
                                
                            printf("%-d:%s",i,keybuf);
                            
                       }

                       printf("\n");
                   
                   

                       /* prime key is first in block */
                       /* prime key as it is in datafile  */
                       printf(" DATAKEY- %-10s\n ",datablock); 

                       /* skip over key values */
                       blen = rh->dataoffset; /* strlen(datapointer); */
                       datapointer = datablock + blen;

                       fieldnum = 0;
                       while( blen < rh->recordlength ) {
                   
                              dlen = strlen(datapointer);
                              if( !dlen )  /* means field is null length */
                                  break;   /* EOR trailer                */

                              ++fieldnum;
                              
                              if( fieldnum == 1 )
                                  printf("FIELDS - %03d:%-9.8s",fieldnum,datapointer);
                              else
                                  printf("%03d:%-9.8s",fieldnum,datapointer);
                              if( !(fieldnum % 5) )
                                  printf("\n          ");

                              blen = blen + dlen + 1;
                    
                              datapointer = (UBYTE *)((ULONG)datapointer + dlen + 1); 
                       }
                       printf("\n\n\n");
                       
                       if( datablock ) 
                           FreeMem( datablock,blocklen);

                       break;
                   }
        }

   }   
   
   
   Close( dfd );
   Close( ifd );
   
   FreeMem( ix, sizeof(struct IndexFile) );
   FreeMem( dtnode, sizeof(struct DiskIndex) );
   FreeMem( dfh, sizeof(struct DataFileHeader) );
   FreeMem( rh, sizeof(struct RecordHeader) );
   FreeMem( keybuf, ((MAXKEYLEN) + 1) );
   FreeMem( indxbuf, (5 * ((MAXKEYLEN)+1)) );
   
   return( !err );
   
}

