blob: 5ab7cca4e9e5e22d005dff2afc439569f0cd91d2 [file] [log] [blame]
Guy Schalnat6d764711995-12-19 03:22:19 -06001
2/* pngerror.c - stub functions for i/o and memory allocation
Glenn Randers-Pehrsonb6ce43d1998-01-01 07:13:13 -06003 *
Glenn Randers-Pehrson299d7352002-05-01 16:55:46 -05004 * libpng 1.2.3rc3 - May 1, 2002
Glenn Randers-Pehrsonb6ce43d1998-01-01 07:13:13 -06005 * For conditions of distribution and use, see copyright notice in png.h
Glenn Randers-Pehrsonc6de22d2002-02-23 18:55:25 -06006 * Copyright (c) 1998-2002 Glenn Randers-Pehrson
Glenn Randers-Pehrsond4366722000-06-04 14:29:29 -05007 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
8 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
Glenn Randers-Pehrsonb6ce43d1998-01-01 07:13:13 -06009 *
Glenn Randers-Pehrson8686fff1998-05-21 09:27:50 -050010 * This file provides a location for all error handling. Users who
Glenn Randers-Pehrsonb6ce43d1998-01-01 07:13:13 -060011 * need special error handling are expected to write replacement functions
12 * and use png_set_error_fn() to use those functions. See the instructions
13 * at each function.
14 */
Guy Schalnat6d764711995-12-19 03:22:19 -060015
16#define PNG_INTERNAL
17#include "png.h"
18
Glenn Randers-Pehrson75294572000-05-06 14:09:57 -050019static void /* PRIVATE */
20png_default_error PNGARG((png_structp png_ptr,
Guy Schalnate5a37791996-06-05 15:50:50 -050021 png_const_charp message));
Glenn Randers-Pehrson75294572000-05-06 14:09:57 -050022static void /* PRIVATE */
23png_default_warning PNGARG((png_structp png_ptr,
Guy Schalnate5a37791996-06-05 15:50:50 -050024 png_const_charp message));
25
Guy Schalnat69b14481996-01-10 02:56:49 -060026/* This function is called whenever there is a fatal error. This function
Glenn Randers-Pehrsonb6ce43d1998-01-01 07:13:13 -060027 * should not be changed. If there is a need to handle errors differently,
28 * you should supply a replacement error function and use png_set_error_fn()
29 * to replace the error function at run-time.
30 */
Glenn Randers-Pehrson75294572000-05-06 14:09:57 -050031void PNGAPI
Guy Schalnat6d764711995-12-19 03:22:19 -060032png_error(png_structp png_ptr, png_const_charp message)
33{
Glenn Randers-Pehrsone68f5a32001-05-14 09:20:53 -050034#ifdef PNG_ERROR_NUMBERS_SUPPORTED
35 char msg[16];
36 if (png_ptr->flags&(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT))
37 {
38 int offset = 0;
39 if (*message == '#')
40 {
41 for (offset=1; offset<15; offset++)
42 if (*(message+offset) == ' ')
43 break;
44 if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT)
45 {
46 int i;
47 for (i=0; i<offset-1; i++)
48 msg[i]=message[i+1];
49 msg[i]='\0';
50 message=msg;
51 }
52 else
53 message+=offset;
54 }
55 else
56 {
57 if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT)
58 {
59 msg[0]='0';
60 msg[1]='\0';
61 message=msg;
62 }
63 }
64 }
65#endif
Andreas Dilger47a0c421997-05-16 02:46:07 -050066 if (png_ptr->error_fn != NULL)
Guy Schalnatb2e01bd1996-01-26 01:38:47 -060067 (*(png_ptr->error_fn))(png_ptr, message);
Guy Schalnat6d764711995-12-19 03:22:19 -060068
Guy Schalnatb2e01bd1996-01-26 01:38:47 -060069 /* if the following returns or doesn't exist, use the default function,
70 which will not return */
71 png_default_error(png_ptr, message);
Guy Schalnat6d764711995-12-19 03:22:19 -060072}
73
Guy Schalnat69b14481996-01-10 02:56:49 -060074/* This function is called whenever there is a non-fatal error. This function
Glenn Randers-Pehrsonb6ce43d1998-01-01 07:13:13 -060075 * should not be changed. If there is a need to handle warnings differently,
76 * you should supply a replacement warning function and use
77 * png_set_error_fn() to replace the warning function at run-time.
78 */
Glenn Randers-Pehrson75294572000-05-06 14:09:57 -050079void PNGAPI
Guy Schalnat6d764711995-12-19 03:22:19 -060080png_warning(png_structp png_ptr, png_const_charp message)
81{
Glenn Randers-Pehrsone68f5a32001-05-14 09:20:53 -050082 int offset = 0;
83#ifdef PNG_ERROR_NUMBERS_SUPPORTED
84 if (png_ptr->flags&(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT))
85#endif
86 {
87 if (*message == '#')
88 {
89 for (offset=1; offset<15; offset++)
90 if (*(message+offset) == ' ')
91 break;
92 }
93 }
Andreas Dilger47a0c421997-05-16 02:46:07 -050094 if (png_ptr->warning_fn != NULL)
Glenn Randers-Pehrsone68f5a32001-05-14 09:20:53 -050095 (*(png_ptr->warning_fn))(png_ptr, (png_const_charp)(message+offset));
Guy Schalnatb2e01bd1996-01-26 01:38:47 -060096 else
Glenn Randers-Pehrsone68f5a32001-05-14 09:20:53 -050097 png_default_warning(png_ptr, (png_const_charp)(message+offset));
Guy Schalnat6d764711995-12-19 03:22:19 -060098}
99
Glenn Randers-Pehrson8686fff1998-05-21 09:27:50 -0500100/* These utilities are used internally to build an error message that relates
Glenn Randers-Pehrson70e3f541998-01-03 22:40:55 -0600101 * to the current chunk. The chunk name comes from png_ptr->chunk_name,
102 * this is used to prefix the message. The message is limited in length
103 * to 63 bytes, the name characters are output as hex digits wrapped in []
104 * if the character is invalid.
105 */
106#define isnonalpha(c) ((c) < 41 || (c) > 122 || ((c) > 90 && (c) < 97))
Glenn Randers-Pehrson7cd899c1998-03-07 16:17:42 -0600107static PNG_CONST char png_digit[16] = {
Glenn Randers-Pehrson82ae3832001-04-20 10:32:10 -0500108 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
109 'F' };
Glenn Randers-Pehrson70e3f541998-01-03 22:40:55 -0600110
Glenn Randers-Pehrson75294572000-05-06 14:09:57 -0500111static void /* PRIVATE */
Glenn Randers-Pehrson82ae3832001-04-20 10:32:10 -0500112png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp
113 message)
Glenn Randers-Pehrson70e3f541998-01-03 22:40:55 -0600114{
115 int iout = 0, iin = 0;
116
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600117 while (iin < 4)
118 {
Glenn Randers-Pehrson70e3f541998-01-03 22:40:55 -0600119 int c = png_ptr->chunk_name[iin++];
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600120 if (isnonalpha(c))
121 {
Glenn Randers-Pehrson70e3f541998-01-03 22:40:55 -0600122 buffer[iout++] = '[';
123 buffer[iout++] = png_digit[(c & 0xf0) >> 4];
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600124 buffer[iout++] = png_digit[c & 0x0f];
Glenn Randers-Pehrson70e3f541998-01-03 22:40:55 -0600125 buffer[iout++] = ']';
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600126 }
127 else
128 {
Glenn Randers-Pehrson860ab2b1999-10-14 07:43:10 -0500129 buffer[iout++] = (png_byte)c;
Glenn Randers-Pehrson70e3f541998-01-03 22:40:55 -0600130 }
131 }
132
133 if (message == NULL)
Glenn Randers-Pehrson0f881d61998-02-07 10:20:57 -0600134 buffer[iout] = 0;
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600135 else
136 {
Glenn Randers-Pehrson70e3f541998-01-03 22:40:55 -0600137 buffer[iout++] = ':';
138 buffer[iout++] = ' ';
Glenn Randers-Pehrson2687fcc1998-01-07 20:54:20 -0600139 png_memcpy(buffer+iout, message, 64);
Glenn Randers-Pehrson70e3f541998-01-03 22:40:55 -0600140 buffer[iout+63] = 0;
141 }
142}
143
Glenn Randers-Pehrson75294572000-05-06 14:09:57 -0500144void PNGAPI
Glenn Randers-Pehrson70e3f541998-01-03 22:40:55 -0600145png_chunk_error(png_structp png_ptr, png_const_charp message)
146{
Glenn Randers-Pehrsonf6b4f452000-12-01 09:23:06 -0600147 char msg[18+64];
Glenn Randers-Pehrson70e3f541998-01-03 22:40:55 -0600148 png_format_buffer(png_ptr, msg, message);
149 png_error(png_ptr, msg);
150}
151
Glenn Randers-Pehrson75294572000-05-06 14:09:57 -0500152void PNGAPI
Glenn Randers-Pehrson70e3f541998-01-03 22:40:55 -0600153png_chunk_warning(png_structp png_ptr, png_const_charp message)
154{
Glenn Randers-Pehrson3097f612001-05-07 14:52:45 -0500155 char msg[18+64];
Glenn Randers-Pehrson70e3f541998-01-03 22:40:55 -0600156 png_format_buffer(png_ptr, msg, message);
157 png_warning(png_ptr, msg);
158}
159
Guy Schalnat4ee97b01996-01-16 01:51:56 -0600160/* This is the default error handling function. Note that replacements for
Glenn Randers-Pehrsonb6ce43d1998-01-01 07:13:13 -0600161 * this function MUST NOT RETURN, or the program will likely crash. This
162 * function is used by default, or if the program supplies NULL for the
163 * error function pointer in png_set_error_fn().
164 */
Glenn Randers-Pehrson75294572000-05-06 14:09:57 -0500165static void /* PRIVATE */
Guy Schalnat6d764711995-12-19 03:22:19 -0600166png_default_error(png_structp png_ptr, png_const_charp message)
167{
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -0600168#ifndef PNG_NO_CONSOLE_IO
Glenn Randers-Pehrsone68f5a32001-05-14 09:20:53 -0500169#ifdef PNG_ERROR_NUMBERS_SUPPORTED
170 if (*message == '#')
171 {
172 int offset;
173 char error_number[16];
174 for (offset=0; offset<15; offset++)
175 {
176 error_number[offset] = *(message+offset+1);
177 if (*(message+offset) == ' ')
178 break;
179 }
180 if((offset > 1) && (offset < 15))
181 {
182 error_number[offset-1]='\0';
183 fprintf(stderr, "libpng error no. %s: %s\n", error_number, message+offset);
184 }
185 else
186 fprintf(stderr, "libpng error: %s, offset=%d\n", message,offset);
187 }
188 else
189#endif
Guy Schalnatb2e01bd1996-01-26 01:38:47 -0600190 fprintf(stderr, "libpng error: %s\n", message);
Glenn Randers-Pehrson104622b2000-05-29 08:58:03 -0500191#else
192 if (message)
193 /* make compiler happy */ ;
Guy Schalnat6d764711995-12-19 03:22:19 -0600194#endif
195
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600196#ifdef PNG_SETJMP_SUPPORTED
197# ifdef USE_FAR_KEYWORD
Guy Schalnatb2e01bd1996-01-26 01:38:47 -0600198 {
199 jmp_buf jmpbuf;
200 png_memcpy(jmpbuf,png_ptr->jmpbuf,sizeof(jmp_buf));
201 longjmp(jmpbuf, 1);
202 }
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600203# else
Guy Schalnatb2e01bd1996-01-26 01:38:47 -0600204 longjmp(png_ptr->jmpbuf, 1);
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600205# endif
206#else
Glenn Randers-Pehrson104622b2000-05-29 08:58:03 -0500207 if (png_ptr)
Glenn Randers-Pehrsona77ef622000-02-18 13:48:52 -0600208 /* make compiler happy */ ;
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600209 PNG_ABORT();
Guy Schalnat6d764711995-12-19 03:22:19 -0600210#endif
211}
212
Guy Schalnat69b14481996-01-10 02:56:49 -0600213/* This function is called when there is a warning, but the library thinks
Glenn Randers-Pehrsonb6ce43d1998-01-01 07:13:13 -0600214 * it can continue anyway. Replacement functions don't have to do anything
Glenn Randers-Pehrson345bc271998-06-14 14:43:31 -0500215 * here if you don't want them to. In the default configuration, png_ptr is
Glenn Randers-Pehrsonb6ce43d1998-01-01 07:13:13 -0600216 * not used, but it is passed in case it may be useful.
217 */
Glenn Randers-Pehrson75294572000-05-06 14:09:57 -0500218static void /* PRIVATE */
Guy Schalnat6d764711995-12-19 03:22:19 -0600219png_default_warning(png_structp png_ptr, png_const_charp message)
220{
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -0600221#ifndef PNG_NO_CONSOLE_IO
Glenn Randers-Pehrsone68f5a32001-05-14 09:20:53 -0500222# ifdef PNG_ERROR_NUMBERS_SUPPORTED
223 if (*message == '#')
224 {
225 int offset;
226 char warning_number[16];
227 for (offset=0; offset<15; offset++)
228 {
229 warning_number[offset]=*(message+offset+1);
230 if (*(message+offset) == ' ')
231 break;
232 }
233 if((offset > 1) && (offset < 15))
234 {
235 warning_number[offset-1]='\0';
236 fprintf(stderr, "libpng warning no. %s: %s\n", warning_number,
237 message+offset);
238 }
239 else
240 fprintf(stderr, "libpng warning: %s\n", message);
241 }
242 else
243# endif
244 fprintf(stderr, "libpng warning: %s\n", message);
Glenn Randers-Pehrson104622b2000-05-29 08:58:03 -0500245#else
246 if (message)
247 /* appease compiler */ ;
Guy Schalnat6d764711995-12-19 03:22:19 -0600248#endif
Glenn Randers-Pehrson104622b2000-05-29 08:58:03 -0500249 if (png_ptr)
Glenn Randers-Pehrsonc9442291999-01-06 21:50:16 -0600250 return;
Guy Schalnat6d764711995-12-19 03:22:19 -0600251}
252
Guy Schalnat69b14481996-01-10 02:56:49 -0600253/* This function is called when the application wants to use another method
Glenn Randers-Pehrsonb6ce43d1998-01-01 07:13:13 -0600254 * of handling errors and warnings. Note that the error function MUST NOT
255 * return to the calling routine or serious problems will occur. The return
256 * method used in the default routine calls longjmp(png_ptr->jmpbuf, 1)
257 */
Glenn Randers-Pehrson75294572000-05-06 14:09:57 -0500258void PNGAPI
Guy Schalnate5a37791996-06-05 15:50:50 -0500259png_set_error_fn(png_structp png_ptr, png_voidp error_ptr,
260 png_error_ptr error_fn, png_error_ptr warning_fn)
Guy Schalnat6d764711995-12-19 03:22:19 -0600261{
Guy Schalnate5a37791996-06-05 15:50:50 -0500262 png_ptr->error_ptr = error_ptr;
Guy Schalnatb2e01bd1996-01-26 01:38:47 -0600263 png_ptr->error_fn = error_fn;
264 png_ptr->warning_fn = warning_fn;
Guy Schalnat6d764711995-12-19 03:22:19 -0600265}
266
267
Guy Schalnate5a37791996-06-05 15:50:50 -0500268/* This function returns a pointer to the error_ptr associated with the user
Glenn Randers-Pehrsonb6ce43d1998-01-01 07:13:13 -0600269 * functions. The application should free any memory associated with this
270 * pointer before png_write_destroy and png_read_destroy are called.
271 */
Glenn Randers-Pehrson75294572000-05-06 14:09:57 -0500272png_voidp PNGAPI
Guy Schalnate5a37791996-06-05 15:50:50 -0500273png_get_error_ptr(png_structp png_ptr)
Guy Schalnat6d764711995-12-19 03:22:19 -0600274{
Glenn Randers-Pehrsonb2120021998-01-31 20:07:59 -0600275 return ((png_voidp)png_ptr->error_ptr);
Guy Schalnat6d764711995-12-19 03:22:19 -0600276}
277
278
Glenn Randers-Pehrsone68f5a32001-05-14 09:20:53 -0500279#ifdef PNG_ERROR_NUMBERS_SUPPORTED
Glenn Randers-Pehrson73d57cb2002-03-25 18:49:08 -0600280void PNGAPI
Glenn Randers-Pehrsone68f5a32001-05-14 09:20:53 -0500281png_set_strip_error_numbers(png_structp png_ptr, png_uint_32 strip_mode)
282{
283 if(png_ptr != NULL)
284 {
285 png_ptr->flags &=
286 ((~(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT))&strip_mode);
287 }
288}
289#endif