kwo pushed a commit to branch master. http://git.enlightenment.org/legacy/imlib2.git/commit/?id=093e4bf8ad126ab5bc9e5e342cbd3feb90248643
commit 093e4bf8ad126ab5bc9e5e342cbd3feb90248643 Author: Kim Woelders <k...@woelders.dk> Date: Fri Mar 18 12:04:08 2022 +0100 Error code rework: Use errnos/new imlib2 error codes internally Working on deprerecating the Imlib_Load_Error codes in favor of regular errnos (positive) + imlib2 ones (IMLIB_ERR_..., negative). --- src/lib/Imlib2.h.in | 6 +++ src/lib/api.c | 47 ++++++++++++++++++++++- src/lib/image.c | 108 ++++++++++++++++++---------------------------------- 3 files changed, 87 insertions(+), 74 deletions(-) diff --git a/src/lib/Imlib2.h.in b/src/lib/Imlib2.h.in index b359832..ffc1b0b 100644 --- a/src/lib/Imlib2.h.in +++ b/src/lib/Imlib2.h.in @@ -95,6 +95,12 @@ typedef enum { IMLIB_LOAD_ERROR_IMAGE_FRAME } Imlib_Load_Error; +#define IMLIB_ERR_INTERNAL -1 /* Internal error (should not happen) */ +#define IMLIB_ERR_NO_LOADER -2 /* No loader for file format */ +#define IMLIB_ERR_NO_SAVER -3 /* No saver for file format */ +#define IMLIB_ERR_BAD_IMAGE -4 /* Invalid image file */ +#define IMLIB_ERR_BAD_FRAME -5 /* Requested frame not in image */ + typedef struct { int left, right, top, bottom; } Imlib_Border; diff --git a/src/lib/api.c b/src/lib/api.c index d38a063..7d5176b 100644 --- a/src/lib/api.c +++ b/src/lib/api.c @@ -2,6 +2,7 @@ #include <Imlib2.h> #include "common.h" +#include <errno.h> #include <math.h> #include <stdarg.h> #include <stdio.h> @@ -141,6 +142,47 @@ imlib_version(void) return IMLIB2_VERSION; } +static Imlib_Load_Error +__imlib_ErrorFromErrno(int err, int save) +{ + switch (err) + { + default: + return IMLIB_LOAD_ERROR_UNKNOWN; + case 0: + return IMLIB_LOAD_ERROR_NONE; + case IMLIB_ERR_NO_LOADER: + case IMLIB_ERR_NO_SAVER: + return IMLIB_LOAD_ERROR_NO_LOADER_FOR_FILE_FORMAT; + case IMLIB_ERR_BAD_IMAGE: + return IMLIB_LOAD_ERROR_IMAGE_READ; + case IMLIB_ERR_BAD_FRAME: + return IMLIB_LOAD_ERROR_IMAGE_FRAME; + case ENOENT: + return IMLIB_LOAD_ERROR_FILE_DOES_NOT_EXIST; + case EISDIR: + return IMLIB_LOAD_ERROR_FILE_IS_DIRECTORY; + case EACCES: + case EROFS: + return (save) ? IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_WRITE : + IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_READ; + case ENAMETOOLONG: + return IMLIB_LOAD_ERROR_PATH_TOO_LONG; + case ENOTDIR: + return IMLIB_LOAD_ERROR_PATH_COMPONENT_NOT_DIRECTORY; + case EFAULT: + return IMLIB_LOAD_ERROR_PATH_POINTS_OUTSIDE_ADDRESS_SPACE; + case ELOOP: + return IMLIB_LOAD_ERROR_TOO_MANY_SYMBOLIC_LINKS; + case ENOMEM: + return IMLIB_LOAD_ERROR_OUT_OF_MEMORY; + case EMFILE: + return IMLIB_LOAD_ERROR_OUT_OF_FILE_DESCRIPTORS; + case ENOSPC: + return IMLIB_LOAD_ERROR_OUT_OF_DISK_SPACE; + } +} + /* frees the given context including all its members */ static void __imlib_free_context(ImlibContext * context) @@ -796,7 +838,7 @@ imlib_load_image_with_error_return(const char *file, im = _imlib_load_image_immediately(file, &err); if (error_return) - *error_return = (Imlib_Load_Error) err; + *error_return = __imlib_ErrorFromErrno(err, 0); return im; } @@ -2816,7 +2858,8 @@ imlib_save_image_with_error_return(const char *file, _imlib_save_image(file, &err); - *error_return = err; + if (error_return) + *error_return = __imlib_ErrorFromErrno(err, 1); } EAPI Imlib_Image diff --git a/src/lib/image.c b/src/lib/image.c index 9a54b4e..45946b5 100644 --- a/src/lib/image.c +++ b/src/lib/image.c @@ -264,43 +264,6 @@ __imlib_GetCacheSize(void) return cache_size; } -static int -__imlib_ErrorFromErrno(int err, int save) -{ - switch (err) - { - default: - return IMLIB_LOAD_ERROR_UNKNOWN; - /* standrad fopen() type errors translated */ - case 0: - return IMLIB_LOAD_ERROR_NONE; - case EEXIST: - return IMLIB_LOAD_ERROR_FILE_DOES_NOT_EXIST; - case EISDIR: - return IMLIB_LOAD_ERROR_FILE_IS_DIRECTORY; - case EACCES: - case EROFS: - return (save) ? IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_WRITE : - IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_READ; - case ENAMETOOLONG: - return IMLIB_LOAD_ERROR_PATH_TOO_LONG; - case ENOENT: - return IMLIB_LOAD_ERROR_PATH_COMPONENT_NON_EXISTANT; - case ENOTDIR: - return IMLIB_LOAD_ERROR_PATH_COMPONENT_NOT_DIRECTORY; - case EFAULT: - return IMLIB_LOAD_ERROR_PATH_POINTS_OUTSIDE_ADDRESS_SPACE; - case ELOOP: - return IMLIB_LOAD_ERROR_TOO_MANY_SYMBOLIC_LINKS; - case ENOMEM: - return IMLIB_LOAD_ERROR_OUT_OF_MEMORY; - case EMFILE: - return IMLIB_LOAD_ERROR_OUT_OF_FILE_DESCRIPTORS; - case ENOSPC: - return IMLIB_LOAD_ERROR_OUT_OF_DISK_SPACE; - } -} - /* create a new image struct from data passed that is wize w x h then return */ /* a pointer to that image sturct */ ImlibImage * @@ -436,6 +399,28 @@ __imlib_LoadEmbedded(ImlibLoader * l, ImlibImage * im, const char *file, return rc; } +static int +__imlib_LoadErrorToErrno(int loader_ret, int save) +{ + switch (loader_ret) + { + default: /* We should not go here */ + return IMLIB_ERR_INTERNAL; + case LOAD_SUCCESS: + return 0; + case LOAD_FAIL: + return (save) ? IMLIB_ERR_NO_SAVER : IMLIB_ERR_NO_LOADER; + case LOAD_OOM: + return ENOMEM; + case LOAD_BADFILE: + return errno; + case LOAD_BADIMAGE: + return IMLIB_ERR_BAD_IMAGE; + case LOAD_BADFRAME: + return IMLIB_ERR_BAD_FRAME; + } +} + ImlibImage * __imlib_LoadImage(const char *file, ImlibLoadArgs * ila) { @@ -505,11 +490,11 @@ __imlib_LoadImage(const char *file, ImlibLoadArgs * ila) } if (err) - err = IMLIB_LOAD_ERROR_FILE_DOES_NOT_EXIST; + err = errno; else if (__imlib_StatIsDir(&st)) - err = IMLIB_LOAD_ERROR_FILE_IS_DIRECTORY; + err = EISDIR; else if (st.st_size == 0) - err = IMLIB_LOAD_ERROR_IMAGE_READ; + err = IMLIB_ERR_BAD_IMAGE; if (err) { @@ -535,7 +520,7 @@ __imlib_LoadImage(const char *file, ImlibLoadArgs * ila) if (!im->fp) { - ila->err = __imlib_ErrorFromErrno(errno, 0); + ila->err = errno; __imlib_ConsumeImage(im); return NULL; } @@ -603,7 +588,7 @@ __imlib_LoadImage(const char *file, ImlibLoadArgs * ila) case LOAD_OOM: /* Could not allocate memory */ case LOAD_BADFILE: /* File could not be accessed */ /* Unlikely that another loader will succeed */ - case LOAD_BADIMAGE: /* Image is corrupt */ + case LOAD_BADIMAGE: /* Image is invalid */ case LOAD_BADFRAME: /* Requested frame not found */ /* Signature was good but file was somehow not */ break; @@ -619,27 +604,7 @@ __imlib_LoadImage(const char *file, ImlibLoadArgs * ila) { /* Image loading failed. * Free the skeleton image struct we had and return NULL */ - switch (loader_ret) - { - default: /* We should not go here */ - ila->err = IMLIB_LOAD_ERROR_UNKNOWN; - break; - case LOAD_FAIL: - ila->err = IMLIB_LOAD_ERROR_NO_LOADER_FOR_FILE_FORMAT; - break; - case LOAD_OOM: - ila->err = IMLIB_LOAD_ERROR_OUT_OF_MEMORY; - break; - case LOAD_BADFILE: - ila->err = IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_READ; - break; - case LOAD_BADIMAGE: - ila->err = IMLIB_LOAD_ERROR_IMAGE_READ; - break; - case LOAD_BADFRAME: - ila->err = IMLIB_LOAD_ERROR_IMAGE_FRAME; - break; - } + ila->err = __imlib_LoadErrorToErrno(loader_ret, 0); __imlib_ConsumeImage(im); return NULL; } @@ -667,13 +632,11 @@ __imlib_LoadImageData(ImlibImage * im) /* Just checking - it should be impossible that loader is not set */ if (!im->loader) - return IMLIB_LOAD_ERROR_UNKNOWN; + return IMLIB_ERR_INTERNAL; err = __imlib_LoadImageWrapper(im->loader, im, 1); - if (err <= LOAD_FAIL) - return 1; /* Load failed */ - return 0; /* Ok */ + return __imlib_LoadErrorToErrno(err, 0); } __EXPORT__ void @@ -774,12 +737,13 @@ void __imlib_SaveImage(ImlibImage * im, const char *file, ImlibLoadArgs * ila) { ImlibLoader *l; - char e, *pfile; + char *pfile; ImlibLdCtx ilc; + int loader_ret; if (!file) { - ila->err = IMLIB_LOAD_ERROR_FILE_DOES_NOT_EXIST; + ila->err = ENOENT; return; } @@ -788,7 +752,7 @@ __imlib_SaveImage(ImlibImage * im, const char *file, ImlibLoadArgs * ila) /* no loader - abort */ if (!l) { - ila->err = IMLIB_LOAD_ERROR_NO_LOADER_FOR_FILE_FORMAT; + ila->err = IMLIB_ERR_NO_SAVER; return; } @@ -800,7 +764,7 @@ __imlib_SaveImage(ImlibImage * im, const char *file, ImlibLoadArgs * ila) im->real_file = strdup(file); /* call the saver */ - e = l->save(im, ila->pfunc, ila->pgran); + loader_ret = l->save(im, ila->pfunc, ila->pgran); /* set the filename back to the laoder image filename */ free(im->real_file); @@ -808,5 +772,5 @@ __imlib_SaveImage(ImlibImage * im, const char *file, ImlibLoadArgs * ila) im->lc = NULL; - ila->err = __imlib_ErrorFromErrno(e > 0 ? 0 : errno, 1); + ila->err = __imlib_LoadErrorToErrno(loader_ret, 1); } --