/******************************************************************************
*
*               Projet   : DilibPro
*               Module   : StrDict
*               Fichier  : StrDict.h
*               Auteur   : J. DUCLOY
*               Date     : Aout 93
*               modifications
*                        : 20 Octobre 93
*                            StrDictFree
*                            StrDictDo
*                        : 16 Octobre 95 (L. Mirtain)
*                            ajout declarations type void
*
******************************************************************************/


#ifndef _DILIB_STR_DICT_H
#define _DILIB_STR_DICT_H

/* les types de base */

struct StrDictDatumStruct
{
   char *key;
   char *value;
};
typedef struct StrDictDatumStruct StrDictDatum;
 
struct StrDictStruct
   {
      StrDictDatum *table;
      int             etat;        
                       /* 0 vide , 
                          1 en constitution triee,
                          2 en constitution non triee,
                          3 en utilisation (recherche)
                       */
     int             size;
     int             incr;
     char           *greatest;
     int             numberOfElements;
     int             currentPos;
  };
 
typedef struct StrDictStruct StrDict;

/* les fonctions de base */

void             StrDictReset();
StrDict         *StrDictCreate();

char            *StrDictGet();
void		 StrDictAdd();
void             StrDictPut();

StrDict         *StrDictGetTableC();
StrDictTable    *StrDictGetTable();
StrDictTable    *StrDictAddTable();
void             StrDictTableFree();
char *StrDictKeyLessEqual();
StrDictTable *StrDictGetTableFromFile();
void StrDictTableFreeStr();
void StrDictTableFreeKey();
void StrDictTableFreeValue();
int StrDictTableToFile();

/* iterateur do */

#define StrDictDo(t,k,v,b)                         \
{                                                    \
   int _DILIB_STR_SEARCH_i;                          \
   StrDict(t,t->table[0].key); /* force qsort */   \
   _DILIB_STR_SEARCH_i=0;                            \
   while(_DILIB_STR_SEARCH_i++<t->numberOfElements)  \
     {                                               \
       k=t->table[_DILIB_STR_SEARCH_i-1].key;        \
       v=t->table[_DILIB_STR_SEARCH_i-1].value;      \
       b;                                            \
     }                                               \
}

/* iterateur next */

void               StrDictIteratorInit();
void               StrDictIteratorReset();
void               StrDictIteratorReverseReset();
char              *StrDictNext();
char              *StrDictPrevious();

#define StrDictKey(curT)   (curT->table[curT->currentPos].key)
#define StrDictValue(curT) (curT->table[curT->currentPos].value)
#define StrDictOutOfRange -2
int StrDictIndicNext();
int StrDictIndicReset();
#define StrDictIndicKey(t,i)    ((t)->table[i].key)
#define StrDictIndicValue(t,i)  ((t)->table[i].value)
/* external iterator */

struct StrDictTableIter_struct
{
  StrDictTable *ssTab;
  int             currentPos;
};

typedef struct StrDictTableIter_struct StrDictTableIter;
StrDictTableIter *StrDictTableIterCreate();
void StrDictTableIterFree();
char *StrDictTableIterNext();
#define StrDictTableIterKey(i)   (i->ssTab->table[i->currentPos].key)
#define StrDictTableIterValue(i) (i->ssTab->table[i->currentPos].value)


