Adjust source code to work with giflib 5.1x

From http://giflib.sourceforge.net/gif_lib.html: GIF file openers and
closers - DGifOpenFileName(), DGifOpenFileHandle(), DGifOpen(),
DGifClose(), EGifOpenFileName(), EGifOpenFileHandle(), EGifOpen(), and
EGifClose() - all now take a final integer address argument. If
non-null, this is used to pass back an error code when the function
returns NULL.

Downloaded from
http://commit.cvs.pld.groups.com.ru/332837-packagesevas_fix_building_with_giflib_51_rel_6

Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de>

diff -uNr evas-1.7.10.org/src/modules/loaders/gif/evas_image_load_gif.c evas-1.7.10/src/modules/loaders/gif/evas_image_load_gif.c
--- evas-1.7.10.org/src/modules/loaders/gif/evas_image_load_gif.c	2013-08-01 17:41:35.000000000 +0200
+++ evas-1.7.10/src/modules/loaders/gif/evas_image_load_gif.c	2015-01-26 19:44:20.132955194 +0100
@@ -338,7 +338,7 @@
 
    if (!cmap)
      {
-        DGifCloseFile(gif);
+        DGifCloseFile(gif, NULL);
         for (i = 0; i < scale_h; i++)
           {
              free(rows[i]);
@@ -725,7 +725,7 @@
    if ((w < 1) || (h < 1) || (w > IMG_MAX_SIZE) || (h > IMG_MAX_SIZE) ||
        IMG_TOO_BIG(w, h))
      {
-        DGifCloseFile(gif);
+        DGifCloseFile(gif, NULL);
         if (IMG_TOO_BIG(w, h))
           *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
         else
@@ -740,7 +740,7 @@
         if (DGifGetRecordType(gif, &rec) == GIF_ERROR)
           {
              /* PrintGifError(); */
-             DGifCloseFile(gif);
+             DGifCloseFile(gif, NULL);
              *error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
              return EINA_FALSE;
           }
@@ -754,7 +754,7 @@
              if (DGifGetImageDesc(gif) == GIF_ERROR)
                {
                   /* PrintGifError(); */
-                  DGifCloseFile(gif);
+                  DGifCloseFile(gif, NULL);
                   *error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
                   return EINA_FALSE;
                }
@@ -762,7 +762,7 @@
              if (DGifGetCode(gif, &img_code, &img) == GIF_ERROR)
                {
                   /* PrintGifError(); */
-                  DGifCloseFile(gif);
+                  DGifCloseFile(gif, NULL);
                   *error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
                   return EINA_FALSE;
                }
@@ -818,7 +818,7 @@
         ie->frames = NULL;
      }
 
-   DGifCloseFile(gif);
+   DGifCloseFile(gif, NULL);
    *error = EVAS_LOAD_ERROR_NONE;
    return EINA_TRUE;
 }
@@ -885,7 +885,7 @@
      }
 
    ie->frames = eina_list_append(ie->frames, frame);
-   DGifCloseFile(gif);
+   DGifCloseFile(gif, NULL);
    return EINA_TRUE;
 }
 
@@ -959,7 +959,7 @@
                   *error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
                   return EINA_FALSE;
                }
-             DGifCloseFile(gif);
+             DGifCloseFile(gif, NULL);
              *error = EVAS_LOAD_ERROR_NONE;
              return EINA_TRUE;
           }
@@ -1080,7 +1080,7 @@
          }
      } while (rec != TERMINATE_RECORD_TYPE);
 
-   DGifCloseFile(gif);
+   DGifCloseFile(gif, NULL);
    return duration;
 }
 
