/***********************************************************************

                      CSDB Library, Free Evaluation Version 2.0.5 
                                       Release: January 22th 1997 

       Header file of the TBASE class.
       Database class for records with a fixed length.

                                           Copyright(c) 1994-1997 
                                                          ComBits 
                                                  The Netherlands 
***********************************************************************/

#ifndef __CSTBASE_H
#define __CSTBASE_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cspage.h"


class TBASE: public PAGE
{

protected:

   U16  lenrec;
   U16  recpage;
   U16  rec_foot;
   U16  len_rec_plus_foot;
   S32  NUMREC;
   S32  lrco;
   S32  wrco;
   S32  rrco;
   S32  cur_rec;


protected:

   void check_rec(S32  l);

   S32  r2p(S32  rec)    { return (1+(rec-1)/recpage); }
   U16  oinp(S32  rec)   { return (((U16 )((rec-1)%recpage))*len_rec_plus_foot); }

   virtual int check_id(U32 id);
   virtual void set_id(void);

   void init_defaults(void);
   void init_vars(void);
   void vars2head(void);
   void head2vars(void);


public:

//////////////////////// Compatibility function ////////////////////////
   void speed_option_121(void)   { smallest_page(); }



////////////////////////////////////////////////////////////////////////////////
////////////////////////                            ////////////////////////////
////////////////////////     P U B L I C            ////////////////////////////
////////////////////////                            ////////////////////////////
////////////////////////////////////////////////////////////////////////////////


public:

   TBASE(void);
   virtual
  ~TBASE(void);


//////////////////////// Definition //////////////////////////////////////////
/* Inherited
   void page_size(U16 length);
   U16  page_size(void) ;
*/
   void smallest_page(void)      { recpage=1; }
   int  define(csCHAR *name,U16  reclen);

//////////////////////// Open & Close ////////////////////////////////////////
   int  open(csCHAR *name,S16 kb=32);
   int  open(void)                 { return already_open(); }
   int  close(void);
   int  save(void);

//////////////////////// Locate, Read & Writes records  ///////////////////////
   csCHAR *locate_rec(S32  rec)    { lrco++; return load_page(r2p(rec))+oinp(rec); }
   csCHAR *locate_rec_d(S32  rec)  { lrco++; return load_page_d(r2p(rec))+oinp(rec); }
   csCHAR *locate_rec_l(S32  rec)  { lrco++; return load_page_l(r2p(rec))+oinp(rec); }
   csCHAR *locate_rec_ld(S32  rec) { lrco++; return load_page_ld(r2p(rec))+oinp(rec); }
   void locate_double(S32  rec1,void *&d1,S32  rec2,void *&d2);
   void locate_double_d(S32  rec1,void *&d1,S32  rec2,void *&d2);

   void read_rec(  S32  rec, void *d);
   void write_rec( S32  rec, void *d);

//////////////////////// Add Records /////////////////////////////////////////
   S32  append_rec(void *data);
   S32  append_rec(void);

////////////////////////// Deleting ////////////////////////////////////////////
   void set_delet(S32  r,int tf);
   void undelet(void *d)  { *((csCHAR *)d+lengthrec())=0; }
   void delet(void *d)    { *((csCHAR *)d+lengthrec())=1; }
   int  is_delet(void *d) { return *((csCHAR *)d+lengthrec()); }

   int  is_delet(S32  l)  { return is_delet(locate_rec(l)); }
   void delet(S32  r)     { set_delet(r,TRUE); }
   void undelet(S32  r )  { set_delet(r,FALSE); }

//////////////////////// Number of Records ///////////////////////////////////
   S32  numrec(void)      { return NUMREC; }
   void set_numrec(S32  n){ NUMREC=n; set_num_page(r2p(n)); }
   void dec_numrec(void ) { NUMREC--; }

////////////////////////// Record Length ///////////////////////////////////////
   U16  lengthrec(void)   { return lenrec; }

//////////////////////// Report Writing //////////////////////////////////////
   int  report(csCHAR *name,int sub=1);
   void report(FILE *fipo,int sub);

////////////////////////// Current /////////////////////////////////////////////

   S32  set_current(S32  rec);
   S32  current(void)    { return cur_rec; }
   S32  skip(S32  delta) { S32  l=current(); return (set_current(l+delta)-l); }
   S32  next(S32  delta) { return skip(delta); }
   S32  prev(S32  delta) { return -skip(-delta); }


////////////////////////// Miscellaneous ///////////////////////////////////////
/* Inherited
   int  background(void)
*/
   int pack(void);
// int zap(void);
   void info(void);
   int empty(void);
   virtual int class_ID(void)  { return CS_CLID_TBASE; }



};

#endif
