Les fonctions de stockage
|
|
hash_add
|
Cette fonction permet d'ajouter une valeur dans la table de hashage.
|
# Argument 1 : nom de la table de hashage
# Argument 2 : cle
# Argument 3 : Valeur
hash_add()
{
if [ "$#" -lt "3" ] ; then
echo '(hash_add) Usage: hash_add name_hash key value' 1>&2
return 1
fi
name_hash=$1
key_hash=$2
value_hash=$3
tmp=`eval echo "$\`eval echo ${name_hash}_Keys\` \'$key_hash\'"`
eval ${name_hash}_Keys=\$tmp
eval ${name_hash}_${key_hash}=\$value_hash
return 0
}
|
hash_add vérifie le bon nombre d'arguments dans un premier temps. Une récuperation de variable est faite.
Ensuite, la nouvelle clé est ajoutée par concaténation à la variable stockant toutes les clés. Enfin, la valeur est associée à la clé.
|
hash_replace
|
Cette fonction permet de remplacer une valeur d'une table de hashage de façon propre.
C'est à dire : en nettoyant la variable contenant toutes les clés.
C'est pour simplifier ce nettoyage que les clés sont entourées par des quotes.
|
# Argument 1 : nom de la table de hashage
# Argument 2 : cle existante
# Argument 3 : Nouvelle valeur
hash_replace()
{
if [ "$#" -lt "3" ] ; then
echo '(hash_replace) Usage: hash_replace name_hash key new_value' 1>&2
return 1
fi
name_hash=$1
key_hash=$2
value_hash=$3
if [ -z "`eval echo $\`eval echo ${name_hash}_${key_hash}\``" ] ; then
echo "(hash_replace) Warning: Value uninitialized with key '${key_hash}'" 1>&2
fi
eval ${name_hash}_${key_hash}=\$value_hash
return 0
}
|
hash_replace vérifie le bon nombre d'arguments, puis si la clé existe (ne sort pas de la fonction mais cela est très dangereux du fait
que la variable contenant toutes les clés ne sera pas mise a jour).
Ensuite, elle récupère les arguments, puis associe la nouvelle valeur à la clé.
|
|
Les fonctions d'effacement
|
|
hash_delete
|
Cette fonction permet d'effacer un élément d'une table de hashage.
|
# Argument 1 : Nom de la table de hashage
# Argument 2 : La cle a effacer
hash_delete()
{
name_hash=$1
key_hash_erase=$2
if [ -z "`eval echo $\`eval echo ${name_hash}_${key_hash_erase}\``" ] ; then
echo "(hash_delete) No value associated with key $key_hash_erase" 1>&2
return 1
fi
tmp=`eval echo "$\`eval echo ${name_hash}_Keys\`" | sed "s/'$key_hash_erase'//"`
eval ${name_hash}_Keys=\$tmp
eval unset ${name_hash}_${key_hash_erase}
return 0
}
|
La fonction récupère les arguments et ensuite verifie si la clé qu'il faut effacer existe bien. Si ce n'est pas le cas, la fonction est stoppée avec un message d'erreur sur la sortie d'erreur.
Ensuite, la clé est retirée de la variable contenant toutes les clés, et la valeur associée à la clé est effacée aussi.
|
hash_clean
|
Cette fonction permet d'effacer une table de hashage entièrement.
|
# Argument 1 : Le nom de la table de hashage
hash_clean()
{
name_hash=$1
for key in `hash_keys $name_hash` ; do
eval unset ${name_hash}_${key}
done
eval unset ${name_hash}_Keys
return 0
}
|
On récupère toutes les clés les unes après les autres grâce à hash_keys (cf la prochaine section) et la boucle de contrôle for.
for correspond au foreach du langage perl plutôt qu'au for du langage C. Ensuite la variable contenant toutes les clés est effacée.
|
|
Les fonctions de contrôle
|
|
hash_keys
|
Cette fonction permet d'afficher toutes les clés d'une table de hashage.
|
# Argument 1 : Nom de la table de hashage
hash_keys()
{
name_hash=$1
if [ "$#" -lt "1" ] ; then
echo '(hash_keys) Usage: hash_keys name_hash' 1>&2
return 1
fi
if [ -z "`eval echo $\`eval echo ${name_hash}_Keys\``" ] ; then
echo "(hash_keys) uninitialized hash table '${name_hash}'" 1>&2
return 1
fi
eval echo $`eval echo ${name_hash}_Keys` | sed "s/'\([a-zA-Z0-9_]*\)'/\\1/g"
return 0
}
|
hash_keys vérifie le bon nombre d'arguments, si la table de hashage existe, puis affiche toutes les clés de la table de hashage, en enlevant préalablement
les quotes entourant chaque clé.
Elle affiche les clés dans l'ordre où les valeurs ont été stockées.
Pour changer cet ordre, il est possible d'utiliser hash_sort_keys, qui offre différentes options de tri.
|
hash_values
|
Cette fonction affiche toutes les valeurs d'une table de hashage.
|
# Argument 1 : Nom de la table de hashage
hash_values()
{
name_hash=$1
for key in `hash_keys $name_hash` ; do
hash_aff_value $name_hash $key
done
return 0
}
|
hash_values est identique à hash_keys sauf qu'au lieu d'afficher la clé,
elle affiche la valeur associée à la clé en utilisant conjointement
hash_keys et hash_aff_value (explication dans la prochaine section).
|
|
Les fonctions d'affichage
|
|
hash_aff_value
|
Cette fonction affiche une valeur associée à une clé.
|
# Argument 1 : Nom de la table de hashage
# Argument 2 : Cle
hash_aff_value()
{
name_hash=$1
key_hash=$2
if [ -z "`eval echo $\`eval echo ${name_hash}_${key_hash}\``" ] ; then
echo "(hash_aff_value) Value uninitialized with key '${key_hash}'" 1>&2
return 1
fi
eval echo "$`eval echo ${name_hash}_${key_hash}`"
return 0
}
|
La fonction vérifie si la clé possède une valeur associée. Si oui, l'affichage de la valeur est effectuée.
|
hash_print
|
Cette fonction affiche les couples clé/valeurs d'une table de hashage avec un formatage.
|
# Argument 1 : Nom de la table de hashage
hash_print()
{
name_hash=$1
for key in `hash_sort_keys $name_hash` ; do
echo $key "=>" `hash_aff_value $name_hash $key`
done
}
|
Cette fonction affiche les couples clé/valeurs par ordre ASCII (et non par ordre alphabétique).
Elle récupère les clés en utilisant la fonction hash_sort_keys, et les valeurs
via hash_aff_value.
|
|