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