123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <errno.h>
- #ifdef DEBUG
- #include <error.h>
- #endif
-
- #include "cms_err.h"
-
-
- 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);
- }
- }
|