Cori

Bibliothèque d'entrée utilisateur correcte et facile à utiliser en C

Personnel

Histoire

Cori est une bibliothèque C à fichier unique conçue pour simplifier le processus d’entrée utilisateur en C. Elle fournit un ensemble complet de fonctions qui gèrent les scénarios d’entrée courants et les erreurs potentielles, permettant aux programmeurs de se concentrer davantage sur la logique de leur programme plutôt que sur les subtilités de la gestion des entrées. De plus, Cori vise à servir de remplacement plus sûr et plus convivial à la fonction scanf, qui est souvent mal utilisée par les débutants et peut facilement conduire à un comportement indéfini[1].

Problèmes que Cori résout

  1. Simplifier la gestion des entrées utilisateur : Cori fournit un ensemble de fonctions qui gèrent différents types d’entrées utilisateur, ce qui permet aux programmeurs de collecter et de traiter plus facilement les entrées sans se soucier des complexités sous-jacentes.

  2. Remplacer scanf : la fonction scanf est notoirement difficile à utiliser correctement, en particulier pour les débutants. Cori offre une alternative plus sûre et plus intuitive, réduisant le risque de comportement indéfini et rendant la gestion des entrées plus simple.

Concepts fondamentaux

Types d’entrée

Cori prend en charge une large gamme de types d’entrée, chacun représenté par un type C spécifique :

  • Entiers signés: intmax, longlong, long, int, short

  • Entiers non signés: uintmax, ulonglong, ulong, uint, ushort

  • Décimaux en point flottant: longdouble, double, float

  • Texte: character, until, line, linel

  • Autre: boolean

Système de gestion des erreurs

Cori inclut un système de gestion des erreurs robuste qui permet aux programmeurs de définir des gestionnaires d’erreurs personnalisés. La bibliothèque définit une énumération InputError qui représente toutes les conditions d’erreur possibles, telles qu’une entrée vide, une fin de fichier (EOF), des caractères booléens non valides, plusieurs caractères, un nombre non valide, un nombre hors limites, une mémoire insuffisante et une base numérique non prise en charge.

Familles de fonctions

Pour chaque type d’entrée, Cori fournit une famille de fonctions pour gérer différents scénarios :

  • read_<typename> : lit l’entrée depuis stdin et gère les erreurs à l’aide d’un gestionnaire d’erreurs NO-OP (aucune opération).

  • read_<typename>_or : lit l’entrée depuis stdin et gère les erreurs à l’aide d’un gestionnaire d’erreurs spécifié.

  • read_<typename>_from : lit l’entrée depuis un flux FILE * spécifié et gère les erreurs à l’aide d’un gestionnaire d’erreurs NO-OP.

  • read_<typename>_or_from : lit l’entrée depuis un flux FILE * spécifié et gère les erreurs à l’aide d’un gestionnaire d’erreurs NO-OP.

  • tryRead_<typename> : lit une fois l’entrée de stdin et renvoie un code d’erreur si une erreur se produit.

  • tryRead_<typename>_from : lit une fois l’entrée d’un flux FILE * spécifié et renvoie un code d’erreur si une erreur se produit.

Techniques and patrons utilisés

Bibliothèques STB

Cori est conçue comme une bibliothèque de style STB[2], ce qui signifie qu’elle se compose d’un seul fichier d’en-tête qui contient à la fois l’interface et l’implémentation. Cela la rend facile à manipuler, car les utilisateurs n’ont besoin d’inclure que le fichier d’en-tête dans leurs projets. Cependant, cette approche peut conduire à des fichiers d’en-tête volumineux, elle est donc mieux adaptée aux bibliothèques simples et à usage unique comme Cori.

Utilisation intensive des macros

Cori utilise abondamment les macros pour la métaprogrammation, ce qui permet de générer des modèles de code répétitifs. L’un des modèles les plus utilisés est le modèle X-macro[3], qui permet de définir un ensemble de fonctions et de structures de données liées de manière concise et maintenable. Cette approche réduit la duplication de code et rend la bibliothèque plus flexible et plus facile à étendre.

Example

Cori a été conçu dans un souci de simplicité.

#define CORI_IMPLEMENTATION
#include "stb_cori.h";

int main() {
    int result;
    printf("Entrez un entier : ");
    result = read_int();
    printf("Reçu %d\\n", result);
}
Exemple de programme utilisant Cori pour lire un entier depuis l’entrée standard.

Conclusion

Cori est une bibliothèque puissante et conviviale pour la gestion des entrées de console dans les programmes C. En fournissant un ensemble complet de fonctions et un système de gestion des erreurs robuste, Cori simplifie le processus de gestion des entrées et offre une alternative plus sûre à la fonction scanf. Sa conception en tant que bibliothèque de style STB et l’utilisation de techniques de macro avancées facilitent son intégration et son extension, ce qui en fait un excellent choix pour les programmeurs C débutants et expérimentés, en particulier pour les programmes simples de test.

Pour plus de détails sur l’utilisation de Cori, veuillez vous référer au fichier README.

Références

  1. Felix Palmen — A beginner's guide away from scanf() (anglais)
  2. Sean Barrett — dépôt des bibliothèques STB du domaine public (anglais)
  3. Wikipedia — X macro pattern (anglais) Wikipedia — X macro pattern (anglais)

Technologies