#include "cms_err.h" #include #include #include #include #ifdef DEBUG #include #endif static char* get_error_message(cms_err* err) { switch (err->code) { case CMS_ERR_NONE: return ""; case CMS_ERR_UNKNOWN: return "Unknown error."; case CMS_ERR_ALLOC: return "Memory allocation failed."; case CMS_ERR_PARSE: return "Parse error."; case CMS_ERR_NOENT: return "No such file or directory."; case CMS_ERR_NOTFILE: return "Not a file."; case CMS_ERR_NOTDIR: return "Not a directory."; case CMS_ERR_FILEEXISTS: return "File exists."; case CMS_ERR_FILEREAD: return "Failed to read file."; case CMS_ERR_DIREXISTS: return "Directory exists."; case CMS_ERR_PERM: return "Permission denied."; case CMS_ERR_INITED: return "Already initiated."; case CMS_ERR_NOTINITED: return "Not initiated."; } } cms_err* _cms_err_create(cms_err_code code, char* msg, const char* file, int line) { //We want to just return NULL if there is no error if (code == CMS_ERR_NONE) return NULL; cms_err* err = malloc(sizeof(cms_err)); if (err == NULL) { fprintf(stderr, "Failed to allocate memory.\n"); exit(1); } err->code = code; if (msg == NULL) { err->msg = NULL; } else { size_t msglen = strlen(msg) + 1; err->msg = malloc(msglen * sizeof(char)); if (err->msg == NULL) { fprintf(stderr, "Failed to allocate memory.\n"); exit(1); } memcpy(err->msg, msg, msglen * sizeof(char)); } err->file = file; err->line = line; return err; } void cms_err_free(cms_err* err) { //The error can be null, in which case, we don't want to do anything if (err == NULL) return; free(err->msg); free(err); } void cms_err_panic(cms_err* err) { if (!err) return; #ifdef DEBUG fprintf(stderr, "File %s, line %i:\n\t", err->file, err->line); #endif if (err->msg == NULL) fprintf(stderr, "Error: %s\n", get_error_message(err)); else fprintf(stderr, "Error: %s: %s\n", err->msg, get_error_message(err)); exit(1); } cms_err* _cms_err_from_std_err(int err, const char* file, int line) { switch (err) { case EACCES: return _cms_err_create(CMS_ERR_PERM, NULL, file, line); case EEXIST: return _cms_err_create(CMS_ERR_FILEEXISTS, NULL, file, line); case EFAULT: return _cms_err_create(CMS_ERR_PERM, NULL, file, line); case EISDIR: return _cms_err_create(CMS_ERR_NOTFILE, NULL, file, line); case ENOENT: return _cms_err_create(CMS_ERR_NOENT, NULL, file, line); case ENOMEM: return _cms_err_create(CMS_ERR_ALLOC, NULL, file, line); case ENOTDIR: return _cms_err_create(CMS_ERR_NOTDIR, NULL, file, line); case EROFS: return _cms_err_create(CMS_ERR_PERM, NULL, file, line); default: return _cms_err_create(CMS_ERR_UNKNOWN, NULL, file, line); } }