<html><!-- Created using the cpp_pretty_printer from the dlib C++ library.  See http://dlib.net for updates. --><head><title>dlib C++ Library - jerror.c</title></head><body bgcolor='white'><pre>
<font color='#009900'>/*
 * jerror.c
 *
 * Copyright (C) 1991-1998, Thomas G. Lane.
 * This file is part of the Independent JPEG Group's software.
 * For conditions of distribution and use, see the accompanying README file.
 *
 * This file contains simple error-reporting and trace-message routines.
 * These are suitable for Unix-like systems and others where writing to
 * stderr is the right thing to do.  Many applications will want to replace
 * some or all of these routines.
 *
 * If you define USE_WINDOWS_MESSAGEBOX in jconfig.h or in the makefile,
 * you get a Windows-specific hack to display error messages in a dialog box.
 * It ain't much, but it beats dropping error messages into the bit bucket,
 * which is what happens to output to stderr under most Windows C compilers.
 *
 * These routines are used by both the compression and decompression code.
 */</font>

<font color='#009900'>/* this is not a core library module, so it doesn't define JPEG_INTERNALS */</font>
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='jinclude.h.html'>jinclude.h</a>"
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='jpeglib.h.html'>jpeglib.h</a>"
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='jversion.h.html'>jversion.h</a>"
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='jerror.h.html'>jerror.h</a>"

<font color='#0000FF'>#ifdef</font> USE_WINDOWS_MESSAGEBOX
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>windows.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#endif</font>

<font color='#0000FF'>#ifndef</font> EXIT_FAILURE		<font color='#009900'>/* define exit() codes if not provided */</font>
<font color='#0000FF'>#define</font> EXIT_FAILURE  <font color='#979000'>1</font>
<font color='#0000FF'>#endif</font>


<font color='#009900'>/*
 * Create the message string table.
 * We do this from the master message list in jerror.h by re-reading
 * jerror.h with a suitable definition for macro JMESSAGE.
 * The message table is made an external symbol just in case any applications
 * want to refer to it directly.
 */</font>

<font color='#0000FF'>#ifdef</font> NEED_SHORT_EXTERNAL_NAMES
<font color='#0000FF'>#define</font> jpeg_std_message_table	jMsgTable
<font color='#0000FF'>#endif</font>

<font color='#0000FF'>#define</font> JMESSAGE<font face='Lucida Console'>(</font>code,string<font face='Lucida Console'>)</font>	string ,

<font color='#0000FF'>const</font> <font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font> <font color='#0000FF'>const</font> jpeg_std_message_table[] <font color='#5555FF'>=</font> <b>{</b>
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='jerror.h.html'>jerror.h</a>"
  NULL
<b>}</b>;


<font color='#009900'>/*
 * Error exit handler: must not return to caller.
 *
 * Applications may override this if they want to get control back after
 * an error.  Typically one would longjmp somewhere instead of exiting.
 * The setjmp buffer can be made a private field within an expanded error
 * handler object.  Note that the info needed to generate an error message
 * is stored in the error object, so you can generate the message now or
 * later, at your convenience.
 * You should make sure that the JPEG object is cleaned up (with jpeg_abort
 * or jpeg_destroy) at some point.
 */</font>

<b><a name='METHODDEF'></a>METHODDEF</b><font face='Lucida Console'>(</font><font color='#0000FF'><u>void</u></font><font face='Lucida Console'>)</font>
<b><a name='error_exit'></a>error_exit</b> <font face='Lucida Console'>(</font>j_common_ptr cinfo<font face='Lucida Console'>)</font>
<b>{</b>
  <font color='#009900'>/* Always display the message */</font>
  <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>output_message<font face='Lucida Console'>)</font> <font face='Lucida Console'>(</font>cinfo<font face='Lucida Console'>)</font>;

  <font color='#009900'>/* Let the memory manager delete any temp files before we die */</font>
  <font color='#BB00BB'>jpeg_destroy</font><font face='Lucida Console'>(</font>cinfo<font face='Lucida Console'>)</font>;

  <font color='#BB00BB'>exit</font><font face='Lucida Console'>(</font>EXIT_FAILURE<font face='Lucida Console'>)</font>;
<b>}</b>


<font color='#009900'>/*
 * Actual output of an error or trace message.
 * Applications may override this method to send JPEG messages somewhere
 * other than stderr.
 *
 * On Windows, printing to stderr is generally completely useless,
 * so we provide optional code to produce an error-dialog popup.
 * Most Windows applications will still prefer to override this routine,
 * but if they don't, it'll do something at least marginally useful.
 *
 * NOTE: to use the library in an environment that doesn't support the
 * C stdio library, you may have to delete the call to fprintf() entirely,
 * not just not use this routine.
 */</font>

<b><a name='METHODDEF'></a>METHODDEF</b><font face='Lucida Console'>(</font><font color='#0000FF'><u>void</u></font><font face='Lucida Console'>)</font>
<b><a name='output_message'></a>output_message</b> <font face='Lucida Console'>(</font>j_common_ptr cinfo<font face='Lucida Console'>)</font>
<b>{</b>
  <font color='#0000FF'><u>char</u></font> buffer[JMSG_LENGTH_MAX];

  <font color='#009900'>/* Create the message */</font>
  <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>format_message<font face='Lucida Console'>)</font> <font face='Lucida Console'>(</font>cinfo, buffer<font face='Lucida Console'>)</font>;

<font color='#0000FF'>#ifdef</font> USE_WINDOWS_MESSAGEBOX
  <font color='#009900'>/* Display it in a message dialog box */</font>
  <font color='#BB00BB'>MessageBox</font><font face='Lucida Console'>(</font><font color='#BB00BB'>GetActiveWindow</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>, buffer, "<font color='#CC0000'>JPEG Library Error</font>",
	     MB_OK <font color='#5555FF'>|</font> MB_ICONERROR<font face='Lucida Console'>)</font>;
<font color='#0000FF'>#else</font>
  <font color='#009900'>/* Send it to stderr, adding a newline */</font>
  <font color='#BB00BB'>fprintf</font><font face='Lucida Console'>(</font>stderr, "<font color='#CC0000'>%s\n</font>", buffer<font face='Lucida Console'>)</font>;
<font color='#0000FF'>#endif</font>
<b>}</b>


<font color='#009900'>/*
 * Decide whether to emit a trace or warning message.
 * msg_level is one of:
 *   -1: recoverable corrupt-data warning, may want to abort.
 *    0: important advisory messages (always display to user).
 *    1: first level of tracing detail.
 *    2,3,...: successively more detailed tracing messages.
 * An application might override this method if it wanted to abort on warnings
 * or change the policy about which messages to display.
 */</font>

<b><a name='METHODDEF'></a>METHODDEF</b><font face='Lucida Console'>(</font><font color='#0000FF'><u>void</u></font><font face='Lucida Console'>)</font>
<b><a name='emit_message'></a>emit_message</b> <font face='Lucida Console'>(</font>j_common_ptr cinfo, <font color='#0000FF'><u>int</u></font> msg_level<font face='Lucida Console'>)</font>
<b>{</b>
  <font color='#0000FF'>struct</font> jpeg_error_mgr <font color='#5555FF'>*</font> err <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>err;

  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>msg_level <font color='#5555FF'>&lt;</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b>
    <font color='#009900'>/* It's a warning message.  Since corrupt files may generate many warnings,
     * the policy implemented here is to show only the first warning,
     * unless trace_level &gt;= 3.
     */</font>
    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>num_warnings <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>trace_level <font color='#5555FF'>&gt;</font><font color='#5555FF'>=</font> <font color='#979000'>3</font><font face='Lucida Console'>)</font>
      <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>output_message<font face='Lucida Console'>)</font> <font face='Lucida Console'>(</font>cinfo<font face='Lucida Console'>)</font>;
    <font color='#009900'>/* Always count warnings in num_warnings. */</font>
    err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>num_warnings<font color='#5555FF'>+</font><font color='#5555FF'>+</font>;
  <b>}</b> <font color='#0000FF'>else</font> <b>{</b>
    <font color='#009900'>/* It's a trace message.  Show it if trace_level &gt;= msg_level. */</font>
    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>trace_level <font color='#5555FF'>&gt;</font><font color='#5555FF'>=</font> msg_level<font face='Lucida Console'>)</font>
      <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>output_message<font face='Lucida Console'>)</font> <font face='Lucida Console'>(</font>cinfo<font face='Lucida Console'>)</font>;
  <b>}</b>
<b>}</b>


<font color='#009900'>/*
 * Format a message string for the most recent JPEG error or message.
 * The message is stored into buffer, which should be at least JMSG_LENGTH_MAX
 * characters.  Note that no '\n' character is added to the string.
 * Few applications should need to override this method.
 */</font>

<b><a name='METHODDEF'></a>METHODDEF</b><font face='Lucida Console'>(</font><font color='#0000FF'><u>void</u></font><font face='Lucida Console'>)</font>
<b><a name='format_message'></a>format_message</b> <font face='Lucida Console'>(</font>j_common_ptr cinfo, <font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font> buffer<font face='Lucida Console'>)</font>
<b>{</b>
  <font color='#0000FF'>struct</font> jpeg_error_mgr <font color='#5555FF'>*</font> err <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>err;
  <font color='#0000FF'><u>int</u></font> msg_code <font color='#5555FF'>=</font> err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>msg_code;
  <font color='#0000FF'>const</font> <font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font> msgtext <font color='#5555FF'>=</font> NULL;
  <font color='#0000FF'>const</font> <font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font> msgptr;
  <font color='#0000FF'><u>char</u></font> ch;
  boolean isstring;

  <font color='#009900'>/* Look up message string in proper table */</font>
  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>msg_code <font color='#5555FF'>&gt;</font> <font color='#979000'>0</font> <font color='#5555FF'>&amp;</font><font color='#5555FF'>&amp;</font> msg_code <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>last_jpeg_message<font face='Lucida Console'>)</font> <b>{</b>
    msgtext <font color='#5555FF'>=</font> err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>jpeg_message_table[msg_code];
  <b>}</b> <font color='#0000FF'>else</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>addon_message_table <font color='#5555FF'>!</font><font color='#5555FF'>=</font> NULL <font color='#5555FF'>&amp;</font><font color='#5555FF'>&amp;</font>
	     msg_code <font color='#5555FF'>&gt;</font><font color='#5555FF'>=</font> err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>first_addon_message <font color='#5555FF'>&amp;</font><font color='#5555FF'>&amp;</font>
	     msg_code <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>last_addon_message<font face='Lucida Console'>)</font> <b>{</b>
    msgtext <font color='#5555FF'>=</font> err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>addon_message_table[msg_code <font color='#5555FF'>-</font> err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>first_addon_message];
  <b>}</b>

  <font color='#009900'>/* Defend against bogus message number */</font>
  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>msgtext <font color='#5555FF'>=</font><font color='#5555FF'>=</font> NULL<font face='Lucida Console'>)</font> <b>{</b>
    err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>msg_parm.i[<font color='#979000'>0</font>] <font color='#5555FF'>=</font> msg_code;
    msgtext <font color='#5555FF'>=</font> err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>jpeg_message_table[<font color='#979000'>0</font>];
  <b>}</b>

  <font color='#009900'>/* Check for string parameter, as indicated by %s in the message text */</font>
  isstring <font color='#5555FF'>=</font> FALSE;
  msgptr <font color='#5555FF'>=</font> msgtext;
  <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>ch <font color='#5555FF'>=</font> <font color='#5555FF'>*</font>msgptr<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <font color='#5555FF'>!</font><font color='#5555FF'>=</font> '<font color='#FF0000'>\0</font>'<font face='Lucida Console'>)</font> <b>{</b>
    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>ch <font color='#5555FF'>=</font><font color='#5555FF'>=</font> '<font color='#FF0000'>%</font>'<font face='Lucida Console'>)</font> <b>{</b>
      <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>msgptr <font color='#5555FF'>=</font><font color='#5555FF'>=</font> '<font color='#FF0000'>s</font>'<font face='Lucida Console'>)</font> isstring <font color='#5555FF'>=</font> TRUE;
      <font color='#0000FF'>break</font>;
    <b>}</b>
  <b>}</b>

  <font color='#009900'>/* Format the message into the passed buffer */</font>
  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>isstring<font face='Lucida Console'>)</font>
    <font color='#BB00BB'>sprintf</font><font face='Lucida Console'>(</font>buffer, msgtext, err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>msg_parm.s<font face='Lucida Console'>)</font>;
  <font color='#0000FF'>else</font>
    <font color='#BB00BB'>sprintf</font><font face='Lucida Console'>(</font>buffer, msgtext,
	    err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>msg_parm.i[<font color='#979000'>0</font>], err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>msg_parm.i[<font color='#979000'>1</font>],
	    err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>msg_parm.i[<font color='#979000'>2</font>], err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>msg_parm.i[<font color='#979000'>3</font>],
	    err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>msg_parm.i[<font color='#979000'>4</font>], err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>msg_parm.i[<font color='#979000'>5</font>],
	    err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>msg_parm.i[<font color='#979000'>6</font>], err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>msg_parm.i[<font color='#979000'>7</font>]<font face='Lucida Console'>)</font>;
<b>}</b>


<font color='#009900'>/*
 * Reset error state variables at start of a new image.
 * This is called during compression startup to reset trace/error
 * processing to default state, without losing any application-specific
 * method pointers.  An application might possibly want to override
 * this method if it has additional error processing state.
 */</font>

<b><a name='METHODDEF'></a>METHODDEF</b><font face='Lucida Console'>(</font><font color='#0000FF'><u>void</u></font><font face='Lucida Console'>)</font>
<b><a name='reset_error_mgr'></a>reset_error_mgr</b> <font face='Lucida Console'>(</font>j_common_ptr cinfo<font face='Lucida Console'>)</font>
<b>{</b>
  cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>num_warnings <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
  <font color='#009900'>/* trace_level is not reset since it is an application-supplied parameter */</font>
  cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>msg_code <font color='#5555FF'>=</font> <font color='#979000'>0</font>;	<font color='#009900'>/* may be useful as a flag for "no error" */</font>
<b>}</b>


<font color='#009900'>/*
 * Fill in the standard error-handling methods in a jpeg_error_mgr object.
 * Typical call is:
 *	struct jpeg_compress_struct cinfo;
 *	struct jpeg_error_mgr err;
 *
 *	cinfo.err = jpeg_std_error(&amp;err);
 * after which the application may override some of the methods.
 */</font>

<b><a name='GLOBAL'></a>GLOBAL</b><font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> jpeg_error_mgr <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>
<b><a name='jpeg_std_error'></a>jpeg_std_error</b> <font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> jpeg_error_mgr <font color='#5555FF'>*</font> err<font face='Lucida Console'>)</font>
<b>{</b>
  err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>error_exit <font color='#5555FF'>=</font> error_exit;
  err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>emit_message <font color='#5555FF'>=</font> emit_message;
  err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>output_message <font color='#5555FF'>=</font> output_message;
  err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>format_message <font color='#5555FF'>=</font> format_message;
  err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>reset_error_mgr <font color='#5555FF'>=</font> reset_error_mgr;

  err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>trace_level <font color='#5555FF'>=</font> <font color='#979000'>0</font>;		<font color='#009900'>/* default = no tracing */</font>
  err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>num_warnings <font color='#5555FF'>=</font> <font color='#979000'>0</font>;	<font color='#009900'>/* no warnings emitted yet */</font>
  err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>msg_code <font color='#5555FF'>=</font> <font color='#979000'>0</font>;		<font color='#009900'>/* may be useful as a flag for "no error" */</font>

  <font color='#009900'>/* Initialize message table pointers */</font>
  err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>jpeg_message_table <font color='#5555FF'>=</font> jpeg_std_message_table;
  err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>last_jpeg_message <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font> JMSG_LASTMSGCODE <font color='#5555FF'>-</font> <font color='#979000'>1</font>;

  err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>addon_message_table <font color='#5555FF'>=</font> NULL;
  err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>first_addon_message <font color='#5555FF'>=</font> <font color='#979000'>0</font>;	<font color='#009900'>/* for safety */</font>
  err<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>last_addon_message <font color='#5555FF'>=</font> <font color='#979000'>0</font>;

  <font color='#0000FF'>return</font> err;
<b>}</b>

</pre></body></html>