"Fossies" - the Fresh Open Source Software Archive 
Member "libextractor-1.11/src/plugins/gif_extractor.c" (30 Jan 2021, 4024 Bytes) of package /linux/privat/libextractor-1.11.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "gif_extractor.c" see the
Fossies "Dox" file reference documentation and the latest
Fossies "Diffs" side-by-side code changes report:
1.10_vs_1.11.
1 /*
2 This file is part of libextractor.
3 Copyright (C) 2012 Vidyut Samanta and Christian Grothoff
4
5 libextractor is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 libextractor is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with libextractor; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19 */
20 /**
21 * @file plugins/gif_extractor.c
22 * @brief plugin to support GIF files
23 * @author Christian Grothoff
24 */
25 #include "platform.h"
26 #include "extractor.h"
27 #include <gif_lib.h>
28
29
30 /**
31 * Callback invoked by libgif to read data.
32 *
33 * @param ft the file handle, including our extract context
34 * @param bt where to write the data
35 * @param arg number of bytes to read
36 * @return -1 on error, otherwise number of bytes read
37 */
38 static int
39 gif_READ_func (GifFileType *ft,
40 GifByteType *bt,
41 int arg)
42 {
43 struct EXTRACTOR_ExtractContext *ec = ft->UserData;
44 void *data;
45 ssize_t ret;
46
47 ret = ec->read (ec->cls,
48 &data,
49 arg);
50 if (-1 == ret)
51 return -1;
52 memcpy (bt, data, ret);
53 return ret;
54 }
55
56
57 /**
58 * Main entry method for the 'image/gif' extraction plugin.
59 *
60 * @param ec extraction context provided to the plugin
61 */
62 void
63 EXTRACTOR_gif_extract_method (struct EXTRACTOR_ExtractContext *ec)
64 {
65 GifFileType *gif_file;
66 GifRecordType gif_type;
67 GifByteType *ext;
68 int et;
69 char dims[128];
70 #if defined (GIF_LIB_VERSION) || GIFLIB_MAJOR <= 4
71 if (NULL == (gif_file = DGifOpen (ec, &gif_READ_func)))
72 return; /* not a GIF */
73 #else
74 int gif_error;
75
76 gif_error = 0;
77 gif_file = DGifOpen (ec, &gif_READ_func, &gif_error);
78 if ((gif_file == NULL) || (gif_error != 0))
79 {
80 if (gif_file != NULL)
81 #if GIFLIB_MAJOR < 5 || GIFLIB_MINOR < 1
82 EGifCloseFile (gif_file);
83 #else
84 EGifCloseFile (gif_file, NULL);
85 #endif
86 return; /* not a GIF */
87 }
88 #endif
89 if (0 !=
90 ec->proc (ec->cls,
91 "gif",
92 EXTRACTOR_METATYPE_MIMETYPE,
93 EXTRACTOR_METAFORMAT_UTF8,
94 "text/plain",
95 "image/gif",
96 strlen ("image/gif") + 1))
97 return;
98 snprintf (dims,
99 sizeof (dims),
100 "%dx%d",
101 gif_file->SHeight,
102 gif_file->SWidth);
103 if (0 !=
104 ec->proc (ec->cls,
105 "gif",
106 EXTRACTOR_METATYPE_IMAGE_DIMENSIONS,
107 EXTRACTOR_METAFORMAT_UTF8,
108 "text/plain",
109 dims,
110 strlen (dims) + 1))
111 return;
112 while (1)
113 {
114 if (GIF_OK !=
115 DGifGetRecordType (gif_file,
116 &gif_type))
117 break;
118 if (UNDEFINED_RECORD_TYPE == gif_type)
119 break;
120 if (EXTENSION_RECORD_TYPE != gif_type)
121 continue;
122 if (GIF_OK !=
123 DGifGetExtension (gif_file, &et, &ext))
124 continue;
125 if (NULL == ext)
126 continue;
127 if (COMMENT_EXT_FUNC_CODE == et)
128 {
129 ec->proc (ec->cls,
130 "gif",
131 EXTRACTOR_METATYPE_COMMENT,
132 EXTRACTOR_METAFORMAT_C_STRING,
133 "text/plain",
134 (char*) &ext[1],
135 (uint8_t) ext[0]);
136 break;
137 }
138 while ( (GIF_ERROR !=
139 DGifGetExtensionNext (gif_file, &ext)) &&
140 (NULL != ext) )
141 ; /* keep going */
142 }
143 #if defined (GIF_LIB_VERSION) || GIFLIB_MAJOR < 5 || GIFLIB_MINOR < 1
144 DGifCloseFile (gif_file);
145 #else
146 DGifCloseFile (gif_file, NULL);
147 #endif
148 }
149
150
151 /* end of gif_extractor.c */