Dilib, module StrDict, type StrDict

De Wicri Outils
LogoDilib.gif
Panneau travaux.png
Bibliothèque Dilib (ressources numériques)
Module StrDict

Le type StrDict implémente un tableau associatif.

 

Constructeurs

StrDictCreate

#include "StrDict.h"
StrDict *StrDictCreate(int number, int incr);

Les paramètres number et incr optimisent les allocations mémoires. number est une approximation du nombre d'éléments de la table.

Le paramètre incr donne le nombre d'entrées à allouer à chaque fois qu'une demande d'ajout provoque une extension de la table. S'il est nul, la table est augmentée de 25 % à chaque dépassement.

StrDictFromFile

Cette fonction crée une table de type StrDict en lisant le fichier dont le nom est donné en paramètre.

#include "StrDict.h"
StrDict *StrDictFromFile(char *stream);
Exemple
#include "StrDict.h"
StrDict *myTable;

   ...

    int getopt();
    extern char *optarg;

main(int argc, char **argv)
{
  int cOption;
  while((cOption=getopt(argc,argv,"t:"))!=EOF)
    {switch (cOption)
        {
	case 't' :
	  myTable=StrDictFromFile(optarg);
	  break;
	}
    }
  ...
}

NewStrDict

#include "StrDict.h"
StrDict *NewStrDict();

Destructeurs

Le type StrDict possède 3 destructeurs.

SrtDictFree

Le destructeur SrtDictFree() libère l'espace de la table (et seulement de la table). Les clés et valeurs ne sont pas effacées.

#include "StrDict.h"
void StrDictFree(StrDict* dictToFree);

SrtDictFreeKey

Le destructeur SrtDictFreeKey() libère l'espace de la table et des clés associées à chaque élément.

StrDictFreeStr

Le destructeur SrtDictFreeStr() libère l'espace de la table, celui des clés associées à chaque élément, et celui des valeurs.

Accès et itérateurs

Les éléments d'un dictionnaire peuvent être accédés par clé, ou de façon séquentielle, par un itérateur.

Plus précisément une position courante est gérée par la table.

StrDictSearch

char *StrDictSearch(StrDict *dict, char *key);

Cette fonction cherche dans le tableau la valeur associées à la clé demandée et la renvoie. Elle renvoie un pointeur NULL si la clé est absente du tableau. La clé trouvée devient la nouvelle position courante.

Exemple
   ....

char *populationFrance;
StrDict *tablePopulationMonde;

  ...

populationFrance=StrDictSearch(tablePopulationMonde, "France");

StrDictKey

Cette fonction retourne la clé courante associée à la position cournate du dictionnaire dict.

StrDictFirst

Cette fonction retourne la clé la plus basse de la table. Le premier élément devient la position courante.

char *StrDictFirst(StrDict *dict);

StrDictKeyLessEqual

Cette fonction retourne la clé de l'enregistrement dont la clé est égale au paramètre key, ou qui lui est immédiatement inférieure en cas d'échec. Elle retourne NULL en cas d'échec.

La valeur associée à la clé peut être obtenue par StrDictValue.

char *StrDictKeyLessEqual(StrDict *dict, char*key);

StrDictIteratorReset

Cette fonction réinitialise l'itérateur (avant le premier enregistrement).

void StrDictIteratorReset(StrDict *dict);

StrDictNext

Cette fonction fait progresser l'itérateur d'un élément. Celui ci devient l'élément courant et la fonction en retourne la clé.

char* StrDictNext(StrDict *dict);
Exemple

Impresssion de l'ensemble du contenu d'un tableau.

StrDictIteratorReset(myTable);
while ((key=StrDictNext(myTable)))
  {
     printf("La valeur associé à %s est %s", key, StrDictValue(myTable));
  }

StrDictPrevious

Cette fonction fait reculer d'un élément l'élément courant et en retourne la clé.

void StrDictNext(StrDict *dict);

StrDictValue

Cette fonction retourne la valeur de l'élément courant. Attention, elle ne donne un résultat que dans un conteste itératif.

void StrDictValue(StrDict *dict);

Ajout d'éléments

A partir de la version V06.36, plusieurs types de valeurs sont prises en compte.

Valeurs de type chaîne

StrDictAddNewDatum

Cette fonction est à utiliser pour ajouter un nouveau couple (clé, valeur) à la table.

Synopsis
char *StrDictAddNewDatum(StrDict *t, char *k1, char *v1);

Les chaînes clé et valeur sont manipulées par des pointeurs et ne sont pas recopiées. La gestion de leurs allocations relève du programme appelant.

Le couple « k1 v1 » est ajouté à la table sans vérifier la présence de la clé dans la table.

Cette fonction est une translittération de StrSearchAdd.

StrDictSet

Cette fonction ajoute un nouveau couple (clé, valeur) à la table ou modifie la valeur associée à la clé si elle est présente dans la table.

Synopsis
char *StrDictSet(StrDict *t, char *k1, char *v1);

Cette fonction est une translittération de StrSearchPut.

Attention

Comme pour la fonction StrDictAddNewDatum cette fonction ne manipule que des pointeurs sur la clé (k1) et la valeur (v1).

Dans le cas d'une boucle sur des données volatiles (flot de données par exemple) il faut utiliser des mécanismes comme strdup, exemple :

StrDict *table;
  ...
while()
  {
     char *key;
            ...
     if ((clé=SxmlLeafText( ... )))
        {
               StrDictSet (table, strdup(key), ...);
        }
 }

Valeurs de type caractère

StrDictAddNewDatumChar

Cette fonction est à utiliser pour ranger un datum contenant une valeur de type caractère.

char *StrDictAddNewDatumChar(StrDict *t, char *k1, char c1);

StrDictSetChar

Cette fonction est à utiliser pour ranger une valeur de type caractère.

char *StrDictSetChar(StrDict *t, char *k1, char c1);

Manipulations globales

StrDictAddFromFile

StrDict *StrDictAddFromFile (StrDict *table, char*stream);

Exemple d'emploi :

  if (!persWikiDict) persWikiDict=StrDictFromFile(optarg);
  else StrDictAddFromFile(persWikiDict, optarg);