# GLib

GLib est une bibliothèque libre pour le langage C et spécifiquement l'interface de programmation GTK. Sans se substituer à la bibliothèque standard du C, elle en réécrit certains aspects, comme les fonctions de traitement de chaînes alphanumériques et de fichiers, ou la gestion des erreurs d'appel ; mais implémente aussi des structures de données élaborées : arbres, table de hachage et listes. Cette bibliothèque offre les principales fonctions de gestion de la boucle d'événements (clics souris, frappe clavier, signaux en général) de GTK : pile d'exécution, tas mémoire, callbacks.
De par son caractère très général et sa licence libre, cette bibliothèque est utilisable pour programmer toutes sortes d'applications, en évitant certaines difficultés de la bibliothèque standard de C.

## Développement

C'était à l'origine un sous-ensemble de fonctions destinées à faciliter le portage du code GTK sur différentes plates-formes, en donnant aux types (booléens, entiers longs, pointeurs) le même format et la même taille en octets ; le codage des entiers, notamment, pose un problème de compatibilité particulier : le « boutisme ». Au moment de la conception de GTK 2 (appelé alors GTK+ 2), les développeurs décidèrent de sortir de l'interface GTK toutes les fonctions non-graphiques pour en faire une bibliothèque généraliste : GLib. Elle s'est désormais étendue pour offrir des fonctionnalités supplémentaires (sécurité sur l'adressage des chaînes de caractères, formats date/heure, gestion de l'espace-disque, appels système, etc.).
GLib fait partie du paquet GTK du projet GNU. Elle est distribuée selon les termes de la licence GNU LGPL.

## Nécessité de GLib

Outre la portabilité des données, GLib a été conçu pour donner à GTK une structure de langage objet, qui n'existe pas en langage C. Il s'agit de créer une arborescence de types abstraits :
Une fenêtre graphique de GTK (GtkWIndow) est en effet un objet élaboré dont les paramètres d'état (position, taille, palette de couleurs, fontes, possibilités d'interaction, visibilité et activité) sont organisés en strates hiérarchiques. Schématiquement,
* GtkObject ordonne la scrutation de la fenêtre à l'intérieur d'une boucle d'événements,
* GtkWidget décrit les types d'interaction possibles de la fenêtre en la classant comme un composant graphique particulier (bouton à cliquer, fenêtre graphique, curseur, message pop-up),
* GtkContainer permet de hiérarchiser des fenêtres ou composants graphiques à l'intérieur d'une fenêtre, par un système géométrique de cadrage,
* GtkBin enregistre les composants graphiques subordonnés à une fenêtre,
* la fenêtre elle-même est, par héritage d'état, le produit des quatre superstructures qui précédent, et qui décrivent chacune une partie de ses propriétés.
Lorsque l'on modifie une fenêtre, il faut donc gérer la communication entre ces couches logiques pour que l'actualisation graphique se fasse correctement.
GLib apporte les outils qui permettent cette communication entre couches superposées :
* des structures de données hiérarchisées et de taille variable,
* des aiguillages de routine dépendant du contexte, par le mécanisme des fonctions de rappel.
Ces outils sont rassemblés dans une partie essentielle de GLib, GObject.

## Contenu
### Fonctions sécurisées pour les chaînes et tableaux

* allocation mémoire (g_try_malloc, g_free, etc.) : par rapport à la fonction standard malloc, GLib se charge de la gestion des erreurs et arrête le programme si l'allocation se passe mal. Il est possible d'allouer un tableau et de l'initialiser simultanément, et de préciser si la zone allouée se termine (ou non) par une valeur 0 conventionnelle.
* vérification des limites de représentation pour les types de base ;
* chaîne de caractères (g_string_new, g_string_insert, etc.) : on a pu écrire qu'« en langage C, il n'existe pas type chaîne, mais plutôt une convention pour les représenter ». D'ailleurs certaines fonctions, comme gets (supprimée dans norme C11) ou strcpy sont délicates à manipuler ; GLib associe systématiquement aux chaînes de type GString leur longueur, ce qui évite les débordements.
* les conversions de types : les fonctions de conversion de chaîne en nombre de GLib sont systématiquement dotées d'un indicateur d'erreur. En particulier, la fonction de conversion de type d'une chaîne "0" en entier retourne un code d'erreur qui n'est jamais codé par un 0, ce qui supprime une ambiguïté.

### Structures de donnée évoluées

GLib permet de créer et de manipuler des structures de données évoluées, avec leurs macros associées (par ex. g_array_index ) :
* listes chaînées et files. Bien que les primitives de ces fonctions ne soient pas très difficiles à programmer en langage C$^,$, GLib les fournit.
* arbres équilibrés : l'apport de GLib est de doter les arbres d'une relation d'ordre entre branches, ce qui permet d'accélérer les recherches d'un nœud.
* tables de hachage : GLib fournit cette structure pour les données de type entier, caractère ou pointeur, en les dotant d'une relation d'équivalence, et même d'un algorithme de parcours.

### Interaction avec l'utilisateur

* interprétation de la ligne de commande : le langage C permet de compter et de décoder les paramètres passés en option après le nom du programme exécutable, en ligne de commande. La bibliothèque standard propose une fonction sommaire, getopt, qui permet le décodage ; toutefois, celle-ci suppose encore une syntaxe assez stricte. GLib offre, avec les fonctions G_option_context_parse etc. une syntaxe complète qui permet par exemple de grouper les options.

### Analyse de fichiers structurés courants

GLib fournit des fonctions d'analyse de certaines données structurées (sous-ensemble du XML, fichiers de configuration), ou de décodage des expressions régulières. Les expressions régulières fournissent un moyen précieux pour tester la présence d'un motif dans une chaîne de caractère, ou pour extraire une partie d'une chaîne. GLib offre des fonctions de comparaison, de tri et d'extraction utilisant la syntaxe d'expression régulière de la norme POSIX.