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


#ifndef _DILIB_STR_SEARCH_H
#define _DILIB_STR_SEARCH_H

/* les types de base */

struct StrSearchDatumStruct
{
   char *key;
   char *value;
};
typedef struct StrSearchDatumStruct StrSearchDatum;
 
struct StrSearchTableStruct
   {
      StrSearchDatum *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 StrSearchTableStruct StrSearchTable;

/* les fonctions de base */

void             StrSearchTableReset();
StrSearchTable  *StrSearchTableCreate();
char            *StrSearch();
void		 StrSearchAdd();
void             StrSearchPut();
StrSearchTable  *StrSearchGetTableC();
StrSearchTable  *StrSearchGetTable();
StrSearchTable  *StrSearchAddTable();
void             StrSearchTableFree();
char *StrSearchKeyLessEqual();
StrSearchTable *StrSearchGetTableFromFile();
void StrSearchTableFreeStr();
void StrSearchTableFreeKey();
void StrSearchTableFreeValue();
int StrSearchTableToFile();

extern char *StrSearchLastKey;

/* iterateur do */

#define StrSearchDo(t,k,v,b)                         \
{                                                    \
   int _DILIB_STR_SEARCH_i;                          \
   StrSearch(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               StrSearchIteratorInit();
void               StrSearchIteratorReset();
void               StrSearchIteratorReverseReset();
char              *StrSearchNext();
char              *StrSearchPrevious();

#define StrSearchKey(curT)   (curT->table[curT->currentPos].key)
#define StrSearchValue(curT) (curT->table[curT->currentPos].value)
#define StrSearchOutOfRange -2
int StrSearchIndicNext();
int StrSearchIndicReset();
#define StrSearchIndicKey(t,i)    ((t)->table[i].key)
#define StrSearchIndicValue(t,i)  ((t)->table[i].value)
/* external iterator */

struct StrSearchTableIter_struct
{
  StrSearchTable *ssTab;
  int             currentPos;
};

typedef struct StrSearchTableIter_struct StrSearchTableIter;
StrSearchTableIter *StrSearchTableIterCreate();
void StrSearchTableIterFree();
char *StrSearchTableIterNext();
#define StrSearchTableIterKey(i)   (i->ssTab->table[i->currentPos].key)
#define StrSearchTableIterValue(i) (i->ssTab->table[i->currentPos].value)

#endif /* _DILIB_STR_SEARCH_H */
