/* ************************************* */
/*   MDawg.h                             */
/*   Copyright 2001 Martin L"auter       */
/*   laeuter@mathematik.uni-leipzig.de   */
/* ************************************* */

#ifndef M_DAWG
#  define M_DAWG

#include <stdio.h>

#define DAWG_MAGIC  0x01234567

#define V_END_OF_WORD   1
#define M_END_OF_WORD   (1L << V_END_OF_WORD)
#define V_END_OF_NODE   0
#define M_END_OF_NODE   (1L << V_END_OF_NODE)

#define V_POINTER       2
#define V_LETTER        24
#define M_LETTER        0xFF
#define M_NODE_POINTER  0xFFFFFCL
#define MAX_CHARS       256

typedef unsigned int NODE;

#define PTR(node) ((node)&M_NODE_POINTER)
#define IDX(node) (PTR(node)>>V_POINTER)
#define LTR(node) (((node)>>V_LETTER)&M_LETTER)

typedef struct {
  int len,flag;
  NODE *(nodes[256]);
} DWGMark;

class MDawg
{
  public:
    void LoadFrom(FILE *fin);
    MDawg(const char *file);
    MDawg();
    ~MDawg();
    int Find(unsigned char *str);
    int Longest(unsigned char *str);
    DWGMark *SetMark(unsigned char *);
    DWGMark *NextMark(DWGMark *);
    void SaveTo(FILE *fin);
    void GetMarkString(DWGMark *, unsigned char *);
    void StartWord();
    int Letter(unsigned char c);
    int GetState();
    void SetState(int state);
    unsigned char GetNthLetter(int n);
//  private:
    NODE *dawg,*firstnode,*curnode;
    int NrOfWords,NrOfBytes;
};

class MCDawg : public MDawg
{
  public:
    MCDawg(const char *file);
    MCDawg();
    int GetNr(unsigned char *str);
    int GetNth(int n,unsigned char *str, int m=80);
    int FindLEQ(unsigned char *str);
    int GetCINrs(unsigned char *str,int *res);
};

class MMDawg
{
  public:
    MMDawg(int n);
    MMDawg(const char *file);
    ~MMDawg();
    void AddFile(const char *file);
    int Find(unsigned char *str);
    int Longest(unsigned char *str);
    void StartWord();
    int Letter(unsigned char c);
    int GetState();
    void SetState(int state);
    unsigned char GetNthLetter(int n);
//  private:
    int nmax,nfilled,curdwgnr;
    NODE **dawgp,**firstnodep,*curnode;
    int NrOfWords,NrOfBytes;
};

class MMCDawg : public MMDawg
{
  public:
    MMCDawg(int n);
    MMCDawg(const char *file);
//    ~MMCDawg();
    int GetNr(unsigned char *str);
    int GetNth(int n,unsigned char *str, int m=80);
};

class MRDawg : public MDawg
{
  public:
    MRDawg(const char *file);
    ~MRDawg();
    int Find(unsigned char *wort);
};

#endif

