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);
 }

-- 


Reply via email to