/*
 *  MXBT.H
 *
 *  Written by Paul Edwards and released to the public domain.
 *
 *  See MXBT.C for more details.
 */

#ifndef __MXBT_H__
#define __MXBT_H__

struct mxbt_ctlrec
{
    /*
     *  I have commented out the below, and read it in separately, so
     *  as to minimize alignment problems.  The definition of this
     *  file format is now "The control record consists of two parts, a
     *  short integer followed by the following structure, stored in
     *  native format.  The index and leaf records remain in native
     *  format".
     */

    /* unsigned short recsize; */
    long indexStart;
    long rootStart;
    long lastBlock;
    long firstLeaf;
    long lastLeaf;
    long freeList;
    unsigned short levels;
    unsigned short xor;
};

struct mxbt_leafrec
{
    long recType;
    long prev;
    long next;
    short keyCount;
    unsigned short keyStart;
    struct
    {
        unsigned short offset;
        unsigned short len;
        long value;
    }
    keys[1];
};

struct mxbt_indexrec
{
    long recType;
    long prev;
    long next;
    short keyCount;
    unsigned short keyStart;
    struct
    {
        unsigned short offset;
        unsigned short len;
        long value;
        long lower;
    }
    keys[1];
};

typedef struct
{
    int error;
    FILE *fp;
    long value;
    int (*compareF) (void *testKey, void *searchKey, int len);
    void *searchK;
    union
    {
        char intbuf[512];
        long x;
    }
    myunion;
    char *buf;
    struct mxbt_ctlrec control;
    struct mxbt_indexrec *index;
    struct mxbt_leafrec *leaf;
    unsigned short recSize;
    long recordNum;
}
MXBT;

long mxbtOneSearch(MXBT * mxbt, char *indexFile, void *searchKey, int (*compare) (void *testKey, void *searchKey, int len));

#endif
