diff -urpN imlib-1.9.15.orig/config.h.in imlib-1.9.15/config.h.in --- imlib-1.9.15.orig/config.h.in 2004-09-22 18:16:06.000000000 -0700 +++ imlib-1.9.15/config.h.in 2014-05-31 04:34:30.905578587 -0700 @@ -29,6 +29,9 @@ #undef HAVE_LIBGIF /* */ +#undef HAVE_GIF_ERROR_STRING + +/* */ #undef HAVE_LIBJPEG /* */ diff -urpN imlib-1.9.15.orig/configure.in imlib-1.9.15/configure.in --- imlib-1.9.15.orig/configure.in 2004-09-22 18:13:45.000000000 -0700 +++ imlib-1.9.15/configure.in 2014-05-31 04:34:30.905578587 -0700 @@ -252,10 +252,15 @@ AC_CHECK_LIB(tiff, TIFFReadScanline, AC_CHECK_HEADER(gif_lib.h, [AC_CHECK_LIB(ungif, DGifOpenFileName, [GIFLIBS="-lungif" - SUPPORT_LIBS="$SUPPORT_LIBS -lungif"; AC_DEFINE(HAVE_LIBGIF, 1, [ ])], + SUPPORT_LIBS="$SUPPORT_LIBS -lungif" + AC_CHECK_LIB(ungif, GifErrorString, + [AC_DEFINE(HAVE_GIF_ERROR_STRING, 1, [ ])]) + AC_DEFINE(HAVE_LIBGIF, 1, [ ])], [AC_CHECK_LIB(gif, DGifOpenFileName, [GIFLIBS="-lgif" SUPPORT_LIBS="$SUPPORT_LIBS -lgif" + AC_CHECK_LIB(gif, GifErrorString, + [AC_DEFINE(HAVE_GIF_ERROR_STRING, 1, [ ])]) AC_DEFINE(HAVE_LIBGIF, 1, [ ])], [AC_MSG_ERROR(*** GIF library file not found ***)], $GX_LIBS)], diff -urpN imlib-1.9.15.orig/gdk_imlib/io-gif.c imlib-1.9.15/gdk_imlib/io-gif.c --- imlib-1.9.15.orig/gdk_imlib/io-gif.c 2002-03-04 09:06:29.000000000 -0800 +++ imlib-1.9.15/gdk_imlib/io-gif.c 2014-05-31 04:36:21.528433675 -0700 @@ -10,6 +10,33 @@ unsigned char loader_gif (FILE *f, int * #else #include +// NB: relevant giflib error interfaces come in three flavors. +// We might call them: +// +// ancient (upstream code is fine) +// old -- giflib-4.2..giflib-5 +// new -- giflib 5+ +// +// This ugly macro should smooth the ugly details out for all +// three flavors. +#ifdef HAVE_LIBGIF + #ifdef HAVE_GIF_ERROR_STRING + #if (GIFLIB_MAJOR >= 5) + #define GifError() (gif ? gif->Error : 0) + #define GifErrorString() GifErrorString(GifError()) + #endif + #define myPrintGifError() \ + do { \ + const char* errorString = GifErrorString(); \ + if (errorString != NULL) \ + fprintf(stderr, "giflib: error: %s\n", errorString); \ + else \ + fprintf(stderr, "giflib: error (undefined): %d\n", GifError()); \ + } while (0) + #else + #define myPrintGifError() PrintGifError() + #endif + unsigned char * loader_gif(FILE *f, int *w, int *h, int *t) { @@ -43,14 +70,14 @@ loader_gif(FILE *f, int *w, int *h, int { if (DGifGetRecordType(gif, &rec) == GIF_ERROR) { - PrintGifError(); + myPrintGifError(); rec = TERMINATE_RECORD_TYPE; } if ((rec == IMAGE_DESC_RECORD_TYPE) && (!done)) { if (DGifGetImageDesc(gif) == GIF_ERROR) { - PrintGifError(); + myPrintGifError(); rec = TERMINATE_RECORD_TYPE; } *w = gif->Image.Width; diff -urpN imlib-1.9.15.orig/Imlib/load.c imlib-1.9.15/Imlib/load.c --- imlib-1.9.15.orig/Imlib/load.c 2004-09-20 17:23:20.000000000 -0700 +++ imlib-1.9.15/Imlib/load.c 2014-05-31 04:34:55.012329138 -0700 @@ -419,7 +419,37 @@ _LoadTIFF(ImlibData * id, FILE *f, char #endif /* HAVE_LIBTIFF */ +// NB: relevant giflib error interfaces come in three flavors. +// We might call them: +// +// ancient (upstream code is fine) +// old -- giflib-4.2..giflib-5 +// new -- giflib 5+ +// +// This ugly macro should smooth the ugly details out for all +// three flavors. #ifdef HAVE_LIBGIF + #ifdef HAVE_GIF_ERROR_STRING + #if (GIFLIB_MAJOR >= 5) + // new flavor: GifError{,String} are gone + #define GifError() (gif ? gif->Error : 0) + #define GifErrorString() GifErrorString(GifError()) + #endif + // myPrintGifError here services the old and new + #define myPrintGifError() \ + do { \ + const char* errorString = GifErrorString(); \ + if (errorString != NULL) \ + fprintf(stderr, "giflib: error: %s\n", errorString); \ + else \ + fprintf(stderr, "giflib: error (undefined): %d\n", GifError()); \ + } while (0) + #else + // in the ancient giflib interface PrintGifError does everything required, so + // so just make myPrintGifError a macro-alias for that. + #define myPrintGifError() PrintGifError() + #endif + unsigned char * _LoadGIF(ImlibData * id, FILE *f, int *w, int *h, int *t) { @@ -451,14 +481,14 @@ _LoadGIF(ImlibData * id, FILE *f, int *w { if (DGifGetRecordType(gif, &rec) == GIF_ERROR) { - PrintGifError(); + myPrintGifError(); rec = TERMINATE_RECORD_TYPE; } if ((rec == IMAGE_DESC_RECORD_TYPE) && (!done)) { if (DGifGetImageDesc(gif) == GIF_ERROR) { - PrintGifError(); + myPrintGifError(); rec = TERMINATE_RECORD_TYPE; } *w = gif->Image.Width;