summaryrefslogtreecommitdiff
blob: 0e7903a8dcf0a38349749d5cb3bca0f85611eb97 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
--- kit.orig/image/gif.c	2000-03-07 07:59:56.000000000 +0100
+++ kit/image/gif.c	2016-01-12 17:35:49.792443794 +0100
@@ -18,6 +18,18 @@
 #include "image.h"
 #include <gif_lib.h>
 
+static void stderrGifError(GifFileType *gifp, int e) {
+#if defined(GIFLIB_MAJOR) /* added in 4.2.0 along with GifError{,String}() */
+# if GIFLIB_MAJOR >= 5
+	fprintf(stderr, "\nGIF-LIB error: %s.\n", GifErrorString(gifp ? gifp->Error : e));
+# else
+	fprintf(stderr, "\nGIF-LIB error: %s.\n", GifErrorString());
+# endif
+#else
+	PrintGifError();
+#endif
+}
+
 static void
 tellAboutImage(name, gifp)
 	char *name;
@@ -49,10 +61,17 @@
 	GifFileType *GifFile;
 	ColorMapObject *ColorMap;
 	GifColorType *ColorMapEntry;
+	int gerr = 0;
 
+#if defined(GIFLIB_MAJOR) && GIFLIB_MAJOR >= 5
+	GifFile = DGifOpenFileName(fullname, &gerr);
+#else
 	GifFile = DGifOpenFileName(fullname);
-	if (GifFile == NULL)
+#endif
+	if (GifFile == NULL) {
+		stderrGifError(GifFile, gerr);
 		return NULL;
+	}
 
 	if ((ScreenBuffer = (GifRowType *)
 	    malloc(GifFile->SHeight * sizeof(GifRowType *))) == NULL) {
@@ -87,13 +106,13 @@
 	/* Scan the content of the GIF file and load the image(s) in: */
 	do {
 		if (DGifGetRecordType(GifFile, &RecordType) == GIF_ERROR) {
-			PrintGifError();
+			stderrGifError(GifFile, 0);
 			exit(-1);
 		}
 		switch (RecordType) {
 		case IMAGE_DESC_RECORD_TYPE:
 			if (DGifGetImageDesc(GifFile) == GIF_ERROR) {
-				PrintGifError();
+				stderrGifError(GifFile, 0);
 				exit(-1);
 			}
 			Row = GifFile->Image.Top; /* Image Position relative to Screen. */
@@ -113,7 +132,7 @@
 							     j += InterlacedJumps[i]) {
 					if (DGifGetLine(GifFile, &ScreenBuffer[j][Col],
 					    Width) == GIF_ERROR) {
-					    PrintGifError();
+					    stderrGifError(GifFile, 0);
 					    exit(-1);
 					}
 				}
@@ -122,7 +141,7 @@
 				for (i = 0; i < Height; i++) {
 					if (DGifGetLine(GifFile, &ScreenBuffer[Row++][Col],
 					    Width) == GIF_ERROR) {
-						PrintGifError();
+						stderrGifError(GifFile, 0);
 						exit(-1);
 					}
 				}
@@ -131,7 +150,7 @@
 		case EXTENSION_RECORD_TYPE:
 			/* Skip any extension blocks in file: */
 			if (DGifGetExtension(GifFile, &ExtCode, &Extension) == GIF_ERROR) {
-				PrintGifError();
+				stderrGifError(GifFile, 0);
 				exit(-1);
 			}
 			/* very adhoc transparency support */
@@ -141,7 +160,7 @@
 			}
 			while (Extension != NULL) {
 				if (DGifGetExtensionNext(GifFile, &Extension) == GIF_ERROR) {
-					PrintGifError();
+					stderrGifError(GifFile, 0);
 					exit(-1);
 				}
 			}
@@ -179,8 +198,21 @@
 			pixline[x] = GifRow[x];
 	}
 
+#if defined(GIFLIB_MAJOR) && (GIFLIB_MAJOR > 5 || (GIFLIB_MAJOR == 5 && GIFLIB_MINOR >= 1))
+	if (DGifCloseFile(GifFile, &gerr) == GIF_ERROR) {
+		stderrGifError(NULL, gerr);
+#else
 	if (DGifCloseFile(GifFile) == GIF_ERROR) {
-		PrintGifError();
+# if defined(GIFLIB_MAJOR)
+#  if GIFLIB_MAJOR >= 5
+		stderrGifError(GifFile, 0);
+#  else
+		stderrGifError(NULL, GifError());
+#  endif
+# else
+		stderrGifError(NULL, 0);
+# endif
+#endif
 		exit(-1);
 	}
 
@@ -195,12 +227,22 @@
 {
 	GifFileType *gifp;
 	int ret;
+	int gerr = 0;
 
+#if defined(GIFLIB_MAJOR) && GIFLIB_MAJOR >= 5
+	gifp = DGifOpenFileName(fullname, &gerr);
+#else
 	gifp = DGifOpenFileName(fullname);
-	if (gifp == NULL)
+#endif
+	if (gifp == NULL) {
+		stderrGifError(gifp, gerr);
 		ret = 0;
-	else {
+	} else {
+#if defined(GIFLIB_MAJOR) && (GIFLIB_MAJOR > 5 || (GIFLIB_MAJOR == 5 && GIFLIB_MINOR >= 1))
+		DGifCloseFile(gifp, &gerr);
+#else
 		DGifCloseFile(gifp);
+#endif
 		tellAboutImage(name);
 		ret = 1;
 	}