#include enum error_id { ERROR_HEADER, ERROR_OUT_OF_MEMORY, ERROR_CANT_OPEN_FILE, ERROR_FILE_READ, ERROR_INVALID_UTF8, ERROR_ASCII_CONTROL, ERROR_KEY_STARTS_WITH_DOT, ERROR_KEY_ENDS_WITH_DOT, ERROR_KEY_DOT_DOT, ERROR_KEY_INVALID_CHAR, ERROR_INVALID_ESCAPE, ERROR_STRAY_CHARS_AFTER_QUOTED, ERROR_MISMATCHED_SQUARE_BRACKETS, ERROR_INVALID_LINE, ERROR_EMPTY_KEY, ERROR_REDEFINITION, ERROR_NO_CLOSING_QUOTE, ERROR_KEY_NOT_FOUND, ERROR_INVALID_INT, ERROR_INVALID_UINT, ERROR_INVALID_FLOAT, ERROR_INVALID_BOOL, ERROR_COUNT, }; static const char *const error_messages_en[ERROR_COUNT] = { [ERROR_HEADER] = "Error:", [ERROR_OUT_OF_MEMORY] = "Out of memory.", [ERROR_CANT_OPEN_FILE] = "Couldn't open file: %s", [ERROR_FILE_READ] = "Couldn't read file", [ERROR_INVALID_UTF8] = "Invalid UTF-8", [ERROR_ASCII_CONTROL] = "Unexpected ASCII control character %d", [ERROR_KEY_STARTS_WITH_DOT] = "Key %s shouldn't begin with .", [ERROR_KEY_ENDS_WITH_DOT] = "Key %s shouldn't end with .", [ERROR_KEY_DOT_DOT] = "Key %s shouldn't contain ..", [ERROR_KEY_INVALID_CHAR] = "Invalid character in key: '%c' (ASCII %d)", [ERROR_INVALID_ESCAPE] = "Invalid escape sequence: \\%.*s", [ERROR_STRAY_CHARS_AFTER_QUOTED] = "Stray characters after closing %c", [ERROR_MISMATCHED_SQUARE_BRACKETS] = "Line starting with [ must end with ]", [ERROR_INVALID_LINE] = "Line should start with [ or contain =", [ERROR_EMPTY_KEY] = "Expected key name before =", [ERROR_REDEFINITION] = "Re-definition of %s (previously defined on line %" PRIu64 ")", [ERROR_NO_CLOSING_QUOTE] = "Missing closing %c", [ERROR_KEY_NOT_FOUND] = "Key %s not found", [ERROR_INVALID_INT] = "Value '%s' for %s is not a valid integer", [ERROR_INVALID_UINT] = "Value '%s' for %s is not a valid (non-negative) integer", [ERROR_INVALID_FLOAT] = "Value '%s' for %s is not a valid number", [ERROR_INVALID_BOOL] = "Value '%s' for %s is invalid (want on/off/yes/no/true/false)", }; static const char *const error_messages_fr[ERROR_COUNT] = { [ERROR_HEADER] = "Erreur:", [ERROR_OUT_OF_MEMORY] = "Mémoire épuisée.", [ERROR_CANT_OPEN_FILE] = "Ne peut pas ouvrir le fichier : %s", [ERROR_FILE_READ] = "Ne peut pas lire le fichier", [ERROR_INVALID_UTF8] = "UTF-8 invalide", [ERROR_ASCII_CONTROL] = "Caractère de contrôle imprévue (ASCII %d)", [ERROR_KEY_STARTS_WITH_DOT] = "Clé %s ne devrait pas commencer par .", [ERROR_KEY_ENDS_WITH_DOT] = "Clé %s ne devrait pas finir en .", [ERROR_KEY_DOT_DOT] = "Clé %s ne devrait pas contenir ..", [ERROR_KEY_INVALID_CHAR] = "Clé clontient une caractère invalide : '%c' (ASCII %d)", [ERROR_INVALID_ESCAPE] = "Séquence d'échappement invalide : \\%.*s", [ERROR_STRAY_CHARS_AFTER_QUOTED] = "Caractère imprévue suivant %c fermant", [ERROR_MISMATCHED_SQUARE_BRACKETS] = "Ligne commençant par [ devrait finir en ]", [ERROR_INVALID_LINE] = "Ligne devrait commençant par [ ou contenir =", [ERROR_EMPTY_KEY] = "Nom de clé devrait précéder =", [ERROR_REDEFINITION] = "Redéfinition de %s (définition précédente à ligne %" PRIu64 ")", [ERROR_NO_CLOSING_QUOTE] = "Aucun %c fermant", [ERROR_KEY_NOT_FOUND] = "Clé %s n'existe pas", [ERROR_INVALID_INT] = "Valeur '%s' du clé %s n'est pas un nombre entier", [ERROR_INVALID_UINT] = "Valeur '%s' du clé %s n'est pas un nombre entier (positif)", [ERROR_INVALID_FLOAT] = "Valeur '%s' du clé %s n'est pas un nombre valide", [ERROR_INVALID_BOOL] = "Valeur '%s' du clé %s est invalide (veut on/off/yes/no/true/false)", }; static struct { const char *lang; const char *const *messages; } const error_messages[] = { {"en", error_messages_en}, {"fr", error_messages_fr}, };