#include "mat.h"

typedef unsigned char      bool;
typedef unsigned char      byte;
typedef          short int int2;
typedef          long  int int4;
typedef unsigned short int uint2;
typedef unsigned long  int uint4;

#define  reg register

#define TRUE	(1)
#define FALSE	(0)
#define CANCEL	(-1)
#define OK	(0)
#define ERR	(-1)
#define odd(x)          (x&1)
#define abs(x)          ((x)<0?-(x):(x))
#define max(x,y)        ((x)>(y)?(x):(y))
#define min(x,y)        ((x)<(y)?(x):(y))
#define toflag(n)       ((int4)1<<(n))
#define cp_bit(u,m,v,n)	(u = (u&~m)|(v&n?m:0))

#define MAX_WORD_LEN	40

/* --- any header structure --- */
#define HEADER_SIZE	128
typedef struct 
  { char name[64];	/* title of file 		*/
    int2 magic;		/* magic number for this file	*/
    byte version;	/* version of file structure	*/
    byte checksum;	/* check sum for name		*/
    int2 language;	/* language identification	*/
    int2 reser;		/* reserved			*/
  } any_header;

/* spell constants */
#define SPL_PATT	0x03ff
#define SPL_MOST	0x0400
#define SPL_NEGA	0x0800
#define SPL_1BIG	0x1000
#define SPL_IMPF	0x2000
#define SPL_NUMB	0x4000

/* thesaurus constants */
#define THS_GRP_SIZE	16
#define THS_ITEM1	3
#define THS_ITEM2	2
#define THS_ITEM3	1
#define THS_ITEM4	0

#define THS_STY_FLAGS	" dehkoszr?"
#define THS_FLG_MASK	0x0F	/* mask for group flags		*/
#define THS_ASKED	0x10	/* this word was asked by user	*/
#define THS_GROUP	0x20	/* this word is first in group	*/
#define THS_ANTON	0x40	/* this word is antonym		*/
#define THS_ENTRY	0x80	/* this word is entry		*/

/* spell and ths header */
typedef struct {          /* 128 byte */
    any_header H;
    byte  alg_type;       /* type of speller algorithm          */
    byte  max_code;       /* maximum code in dictionary         */
    uint2 reser2;
    uint2 endings_len;    /* lenght of engings block            */
    uint2 suffixs_len;    /* lenght of suffixs block            */
    uint2 pattern_num;    /* number of patterns                 */
    uint2 gramset_num;    /* number of grammar sets             */
    uint2 patt_vals_len;
    uint2 suff_vals_len;
    uint2 gset_vals_len;
    uint2 morf_vals_len;
    uint4 stem_begin;     /* offset to stem dictionary          */
    uint4 stem_size;      /* number of stem trie                */
    char  most_text[6];   /* string for 3rd degree              */
    char  nega_text[6];   /* string for negation                */
    byte  most_gset[6];   /* grammar set numbers for nej-       */
    uint2 thes_word_num;  /* number of words in ths dictionary	*/
    uint4 thes_buff_len;  /* length of thesaurus buffer		*/
    char  reser4[4];
} spell_header;

typedef struct {
    byte stm;
    byte suf;
    byte end;
    int2 inf;
    int2 mor;
} spell_result;
