commentaire expiatoire du jour
Par gblanc le lundi, janvier 25 2010, 17:48 - informatique - Lien permanent
Il ne faudrait pas que cela devienne une habitude, mais comment m'empêcher, chers lecteurs, de vous faire partager ce commentaire d'excuse d'une mauvaise foi évidente ? (trouvé là)GHashTable *gaim_dbus_iter_hash_table(DBusMessageIter *iter, DBusError *error) {
GHashTable *hash;
/* we do not need to destroy strings because they are part of the message */
hash = g_hash_table_new(g_str_hash, g_str_equal);
do {
char *key, *value;
DBusMessageIter subiter;
if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_DICT_ENTRY)
goto error; /* With all due respect to Dijkstra,
this goto is for exception
handling, and it is ok because it
avoids duplication of the code
responsible for destroying the hash
table. Exceptional instructions
for exceptional situations. */
dbus_message_iter_recurse(iter, &subiter);
if (!gaim_dbus_message_iter_get_args(&subiter, error,
DBUS_TYPE_STRING, &key,
DBUS_TYPE_STRING, &value,
DBUS_TYPE_INVALID))
goto error; /* same here */
g_hash_table_insert(hash, key, value);
} while (dbus_message_iter_next(iter));
return hash;
error:
g_hash_table_destroy(hash);
return NULL;
}
add: Et juste en dessous, le scandale :
#include "dbus-bindings.c"
void *gaim_dbus_get_handle(void) {
static int handle;
return &handle;
}
Commentaires
Quoique l'exemple ci-dessus soit suffisamment simple pour que son auteur ait pu se passer du goto, c'est justement dans ce genre de situations (la seule d'ailleurs) que je me permets l'utilisation de goto.
On en trouve de nombreux exemples dans le code du noyau Linux.
Une discussion intéressante à ce sujet ici :
http://kerneltrap.org/node/553
Aurais-je loupé autre chose?
Cordialement,
Damien
Le noyau Linux est un noyau, et dans tout noyau, la loi est claire :
C'est ainsi.