#include #include #include static const b_error_definition error_defs[] = { B_ERROR_DEFINITION(IVY_OK, "OK", "Success"), B_ERROR_DEFINITION(IVY_ERR_EOF, "EOF", "Unexpected end of file"), B_ERROR_DEFINITION(IVY_ERR_IO_FAILURE, "IO_FAILURE", "I/O failure"), B_ERROR_DEFINITION(IVY_ERR_BAD_SYNTAX, "BAD_SYNTAX", "Invalid syntax"), B_ERROR_DEFINITION(IVY_ERR_NO_MEMORY, "NO_MEMORY", "Out of memory"), B_ERROR_DEFINITION( IVY_ERR_NOT_SUPPORTED, "NOT_SUPPORTED", "Operation not supported"), B_ERROR_DEFINITION( IVY_ERR_INTERNAL_FAILURE, "INTERNAL_FAILURE", "Internal failure"), B_ERROR_DEFINITION(IVY_ERR_BAD_STATE, "BAD_STATE", "Bad state"), B_ERROR_DEFINITION( IVY_ERR_INVALID_VALUE, "INVALID_VALUE", "Invalid value"), B_ERROR_DEFINITION(IVY_ERR_NO_ENTRY, "NO_ENTRY", "Name does not exist"), B_ERROR_DEFINITION( IVY_ERR_NAME_EXISTS, "NAME_EXISTS", "Name already exists"), B_ERROR_DEFINITION(IVY_ERR_BAD_FORMAT, "BAD_FORMAT", "Bad format"), B_ERROR_DEFINITION( IVY_ERR_PARSE_FAILURE, "PARSE_FAILURE", "Parse failure"), B_ERROR_DEFINITION( IVY_ERR_CODEGEN_FAILURE, "CODEGEN_FAILURE", "Code generation failure"), }; static const b_error_vendor error_vendor = { .v_name = "Ivy", .v_error_definitions = error_defs, .v_error_definitions_length = sizeof error_defs, }; const char *ivy_status_to_string(enum ivy_status status) { return error_defs[status].err_message; } const struct b_error_vendor *ivy_error_vendor(void) { return &error_vendor; } #define ENUM_CONVERT(from, to) \ case (from): \ return (to) enum ivy_status ivy_status_from_b_status(enum b_status status) { switch (status) { ENUM_CONVERT(B_SUCCESS, IVY_OK); ENUM_CONVERT(B_ERR_NAME_EXISTS, IVY_ERR_NAME_EXISTS); ENUM_CONVERT(B_ERR_NO_MEMORY, IVY_ERR_NO_MEMORY); default: return IVY_ERR_INTERNAL_FAILURE; } } enum ivy_status ivy_status_from_errno(int err) { switch (err) { ENUM_CONVERT(0, IVY_OK); ENUM_CONVERT(ENOENT, IVY_ERR_NO_ENTRY); ENUM_CONVERT(ENOMEM, IVY_ERR_NO_MEMORY); default: return IVY_ERR_INTERNAL_FAILURE; } }