IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)


II - Catalogue et explication des fonctions

Par Nyal





  1. Les fonctions de stockage
    1. hash_add
    2. hash_replace
  2. Les fonctions d'effacement
    1. hash_delete
    2. hash_clean
  3. Les fonctions de contrôle
    1. hash_keys
    2. hash_values
  4. Les fonctions d'affichage
    1. hash_aff_value
    2. hash_print




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.