1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if !defined(_FX_JPEG_TURBO_)
2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/*
3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * jerror.c
4e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *
5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Copyright (C) 1991-1998, Thomas G. Lane.
6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * This file is part of the Independent JPEG Group's software.
7e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * For conditions of distribution and use, see the accompanying README file.
8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *
9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * This file contains simple error-reporting and trace-message routines.
10e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * These are suitable for Unix-like systems and others where writing to
11e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * stderr is the right thing to do.  Many applications will want to replace
12e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * some or all of these routines.
13e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *
14e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * These routines are used by both the compression and decompression code.
15e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */
16e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
17e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* this is not a core library module, so it doesn't define JPEG_INTERNALS */
18e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "jinclude.h"
19e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "jpeglib.h"
20e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "jversion.h"
21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "jerror.h"
22e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifndef EXIT_FAILURE		/* define exit() codes if not provided */
24e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define EXIT_FAILURE  1
25e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
27e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
28e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/*
29e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Create the message string table.
30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * We do this from the master message list in jerror.h by re-reading
31e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * jerror.h with a suitable definition for macro JMESSAGE.
32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * The message table is made an external symbol just in case any applications
33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * want to refer to it directly.
34e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */
35e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
36e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef NEED_SHORT_EXTERNAL_NAMES
37e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define jpeg_std_message_table	jMsgTable
38e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
40e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define JMESSAGE(code,string)	string ,
41e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
42e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovconst char * const jpeg_std_message_table[] = {
43e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "jerror.h"
44e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  NULL
45e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
46e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
47e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
48e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/*
49e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Error exit handler: must not return to caller.
50e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *
51e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Applications may override this if they want to get control back after
52e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * an error.  Typically one would longjmp somewhere instead of exiting.
53e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * The setjmp buffer can be made a private field within an expanded error
54e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * handler object.  Note that the info needed to generate an error message
55e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * is stored in the error object, so you can generate the message now or
56e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * later, at your convenience.
57e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * You should make sure that the JPEG object is cleaned up (with jpeg_abort
58e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * or jpeg_destroy) at some point.
59e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */
60e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
61e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovMETHODDEF(void)
62e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganoverror_exit (j_common_ptr cinfo)
63e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
64e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  /* Always display the message */
65e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  (*cinfo->err->output_message) (cinfo);
66e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
67e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  /* Let the memory manager delete any temp files before we die */
68e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  jpeg_destroy(cinfo);
69e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
70e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov//  exit(EXIT_FAILURE);
71e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
72e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
73e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
74e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/*
75e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Actual output of an error or trace message.
76e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Applications may override this method to send JPEG messages somewhere
77e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * other than stderr.
78e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *
79e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * On Windows, printing to stderr is generally completely useless,
80e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * so we provide optional code to produce an error-dialog popup.
81e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Most Windows applications will still prefer to override this routine,
82e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * but if they don't, it'll do something at least marginally useful.
83e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *
84e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * NOTE: to use the library in an environment that doesn't support the
85e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * C stdio library, you may have to delete the call to fprintf() entirely,
86e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * not just not use this routine.
87e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */
88e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
89e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovMETHODDEF(void)
90e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovoutput_message (j_common_ptr cinfo)
91e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
92e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  char buffer[JMSG_LENGTH_MAX];
93e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
94e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  /* Create the message */
95e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  (*cinfo->err->format_message) (cinfo, buffer);
96e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
97e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  /* Send it to stderr, adding a newline */
98e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  FXSYS_fprintf(stderr, "%s\n", buffer);
99e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
100e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
101e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
102e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/*
103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Decide whether to emit a trace or warning message.
104e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * msg_level is one of:
105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *   -1: recoverable corrupt-data warning, may want to abort.
106e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *    0: important advisory messages (always display to user).
107e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *    1: first level of tracing detail.
108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *    2,3,...: successively more detailed tracing messages.
109e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * An application might override this method if it wanted to abort on warnings
110e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * or change the policy about which messages to display.
111e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */
112e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
113e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovMETHODDEF(void)
114e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovemit_message (j_common_ptr cinfo, int msg_level)
115e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
116e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  struct jpeg_error_mgr * err = cinfo->err;
117e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
118e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  if (msg_level < 0) {
119e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    /* It's a warning message.  Since corrupt files may generate many warnings,
120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov     * the policy implemented here is to show only the first warning,
121e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov     * unless trace_level >= 3.
122e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov     */
123e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (err->num_warnings == 0 || err->trace_level >= 3)
124e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      (*err->output_message) (cinfo);
125e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    /* Always count warnings in num_warnings. */
126e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    err->num_warnings++;
127e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  } else {
128e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    /* It's a trace message.  Show it if trace_level >= msg_level. */
129e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (err->trace_level >= msg_level)
130e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      (*err->output_message) (cinfo);
131e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  }
132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
133e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
134e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
135e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/*
136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Format a message string for the most recent JPEG error or message.
137e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * The message is stored into buffer, which should be at least JMSG_LENGTH_MAX
138e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * characters.  Note that no '\n' character is added to the string.
139e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Few applications should need to override this method.
140e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */
141e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovMETHODDEF(void)
143e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovformat_message (j_common_ptr cinfo, char * buffer)
144e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
145e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if 0	/* XYQ */
146e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  struct jpeg_error_mgr * err = cinfo->err;
147e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  int msg_code = err->msg_code;
148e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  const char * msgtext = NULL;
149e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  const char * msgptr;
150e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  char ch;
151e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  boolean isstring;
152e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
153e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  /* Look up message string in proper table */
154e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  if (msg_code > 0 && msg_code <= err->last_jpeg_message) {
155e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    msgtext = err->jpeg_message_table[msg_code];
156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  } else if (err->addon_message_table != NULL &&
157e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	     msg_code >= err->first_addon_message &&
158e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	     msg_code <= err->last_addon_message) {
159e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    msgtext = err->addon_message_table[msg_code - err->first_addon_message];
160e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  }
161e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  /* Defend against bogus message number */
163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  if (msgtext == NULL) {
164e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    err->msg_parm.i[0] = msg_code;
165e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    msgtext = err->jpeg_message_table[0];
166e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  }
167e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  /* Check for string parameter, as indicated by %s in the message text */
169e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  isstring = FALSE;
170e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  msgptr = msgtext;
171e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  while ((ch = *msgptr++) != '\0') {
172e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (ch == '%') {
173e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      if (*msgptr == 's') isstring = TRUE;
174e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      break;
175e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
176e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  }
177e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
178e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  /* Format the message into the passed buffer */
179e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  if (isstring)
180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    sprintf(buffer, msgtext, err->msg_parm.s);
181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  else
182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    sprintf(buffer, msgtext,
183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	    err->msg_parm.i[0], err->msg_parm.i[1],
184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	    err->msg_parm.i[2], err->msg_parm.i[3],
185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	    err->msg_parm.i[4], err->msg_parm.i[5],
186e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	    err->msg_parm.i[6], err->msg_parm.i[7]);
187e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
189e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
191e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/*
192e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Reset error state variables at start of a new image.
193e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * This is called during compression startup to reset trace/error
194e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * processing to default state, without losing any application-specific
195e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * method pointers.  An application might possibly want to override
196e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * this method if it has additional error processing state.
197e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */
198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
199e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovMETHODDEF(void)
200e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovreset_error_mgr (j_common_ptr cinfo)
201e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  cinfo->err->num_warnings = 0;
203e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  /* trace_level is not reset since it is an application-supplied parameter */
204e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  cinfo->err->msg_code = 0;	/* may be useful as a flag for "no error" */
205e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
206e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
207e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
208e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/*
209e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Fill in the standard error-handling methods in a jpeg_error_mgr object.
210e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Typical call is:
211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *	struct jpeg_compress_struct cinfo;
212e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *	struct jpeg_error_mgr err;
213e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *
214e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *	cinfo.err = jpeg_std_error(&err);
215e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * after which the application may override some of the methods.
216e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */
217e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovGLOBAL(struct jpeg_error_mgr *)
219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovjpeg_std_error (struct jpeg_error_mgr * err)
220e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  err->error_exit = error_exit;
222e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  err->emit_message = emit_message;
223e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  err->output_message = output_message;
224e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  err->format_message = format_message;
225e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  err->reset_error_mgr = reset_error_mgr;
226e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
227e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  err->trace_level = 0;		/* default = no tracing */
228e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  err->num_warnings = 0;	/* no warnings emitted yet */
229e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  err->msg_code = 0;		/* may be useful as a flag for "no error" */
230e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
231e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  /* Initialize message table pointers */
232e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  err->jpeg_message_table = jpeg_std_message_table;
233e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  err->last_jpeg_message = (int) JMSG_LASTMSGCODE - 1;
234e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
235e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  err->addon_message_table = NULL;
236e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  err->first_addon_message = 0;	/* for safety */
237e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  err->last_addon_message = 0;
238e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
239e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  return err;
240e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
241e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
242e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif //_FX_JPEG_TURBO_
243