145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/**
245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \file libyasm/errwarn.h
345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \brief YASM error and warning reporting interface.
445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org *
545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \license
645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org *  Copyright (C) 2001-2007  Peter Johnson
745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org *
845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * Redistribution and use in source and binary forms, with or without
945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * modification, are permitted provided that the following conditions
1045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * are met:
1145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org *  - Redistributions of source code must retain the above copyright
1245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org *    notice, this list of conditions and the following disclaimer.
1345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org *  - Redistributions in binary form must reproduce the above copyright
1445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org *    notice, this list of conditions and the following disclaimer in the
1545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org *    documentation and/or other materials provided with the distribution.
1645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org *
1745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS''
1845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE
2145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * POSSIBILITY OF SUCH DAMAGE.
2845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \endlicense
2945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
3045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org#ifndef YASM_ERRWARN_H
3145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org#define YASM_ERRWARN_H
3245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
3345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org#ifndef YASM_LIB_DECL
3445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org#define YASM_LIB_DECL
3545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org#endif
3645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
3745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Warning classes (that may be enabled/disabled). */
3845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgtypedef enum yasm_warn_class {
3945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    YASM_WARN_NONE = 0,     /**< No warning */
4045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    YASM_WARN_GENERAL,      /**< Non-specific warnings */
4145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    YASM_WARN_UNREC_CHAR,   /**< Unrecognized characters (while tokenizing) */
4245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    YASM_WARN_PREPROC,      /**< Preprocessor warnings */
4345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    YASM_WARN_ORPHAN_LABEL, /**< Label alone on a line without a colon */
4445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    YASM_WARN_UNINIT_CONTENTS, /**< Uninitialized space in code/data section */
4545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    YASM_WARN_SIZE_OVERRIDE,/**< Double size override */
4645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    YASM_WARN_IMPLICIT_SIZE_OVERRIDE /**< Implicit size override */
4745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org} yasm_warn_class;
4845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
4945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Error classes.  Bitmask-based to support limited subclassing. */
5045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgtypedef enum yasm_error_class {
5145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    YASM_ERROR_NONE             = 0x0000, /**< No error */
5245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    YASM_ERROR_GENERAL          = 0xFFFF, /**< Non-specific */
5345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    YASM_ERROR_ARITHMETIC       = 0x0001, /**< Arithmetic error (general) */
5445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    YASM_ERROR_OVERFLOW         = 0x8001, /**< Arithmetic overflow */
5545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    YASM_ERROR_FLOATING_POINT   = 0x4001, /**< Floating point error */
5645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    YASM_ERROR_ZERO_DIVISION    = 0x2001, /**< Divide-by-zero */
5745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    YASM_ERROR_ASSERTION        = 0x0002, /**< Assertion error */
5845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    YASM_ERROR_VALUE            = 0x0004, /**< Value inappropriate
5945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org                                           *   (e.g. not in range) */
6045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    YASM_ERROR_NOT_ABSOLUTE     = 0x8004, /**< Absolute expression required */
6145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    YASM_ERROR_TOO_COMPLEX      = 0x4004, /**< Expression too complex */
6245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    YASM_ERROR_NOT_CONSTANT     = 0x2004, /**< Constant expression required */
6345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    YASM_ERROR_IO               = 0x0008, /**< I/O error */
6445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    YASM_ERROR_NOT_IMPLEMENTED  = 0x0010, /**< Not implemented error */
6545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    YASM_ERROR_TYPE             = 0x0020, /**< Type error */
6645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    YASM_ERROR_SYNTAX           = 0x0040, /**< Syntax error */
6745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    YASM_ERROR_PARSE            = 0x8040  /**< Parser error */
6845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org} yasm_error_class;
6945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
7045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Initialize any internal data structures. */
7145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
7245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgvoid yasm_errwarn_initialize(void);
7345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
7445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Clean up any memory allocated by yasm_errwarn_initialize() or other
7545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * functions.
7645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
7745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
7845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgvoid yasm_errwarn_cleanup(void);
7945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
8045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Reporting point of internal errors.  These are usually due to sanity
8145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * check failures in the code.
8245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \warning This function must NOT return to calling code; exit or longjmp
8345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org *          instead.
8445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param file      source file (ala __FILE__)
8545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param line      source line (ala __LINE__)
8645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param message   internal error message
8745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
8845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
8945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgextern /*@exits@*/ void (*yasm_internal_error_)
9045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    (const char *file, unsigned int line, const char *message);
9145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
9245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Easily-callable version of yasm_internal_error_().  Automatically uses
9345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * __FILE__ and __LINE__ as the file and line.
9445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param message   internal error message
9545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
9645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org#define yasm_internal_error(message) \
9745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    yasm_internal_error_(__FILE__, __LINE__, message)
9845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
9945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Reporting point of fatal errors.
10045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \warning This function must NOT return to calling code; exit or longjmp
10145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org *          instead.
10245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param message   fatal error message
10345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param va        va_list argument list for message
10445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
10545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
10645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgextern /*@exits@*/ void (*yasm_fatal) (const char *message, va_list va);
10745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
10845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Reporting point of fatal errors, with variable arguments (internal only).
10945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \warning This function calls #yasm_fatal, and thus does not return to the
11045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org *          calling code.
11145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param message   fatal error message
11245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param ...       argument list for message
11345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
11445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
11545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/*@exits@*/ void yasm__fatal(const char *message, ...);
11645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
11745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Unconditionally clear the error indicator, freeing any associated data.
11845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * Has no effect if the error indicator is not set.
11945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
12045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
12145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgvoid yasm_error_clear(void);
12245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
12345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Get the error indicator.  YASM_ERROR_NONE is returned if no error has
12445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * been set.  Note that as YASM_ERROR_NONE is 0, the return value can also
12545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * be treated as a boolean value.
12645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \return Current error indicator.
12745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
12845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgyasm_error_class yasm_error_occurred(void);
12945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
13045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Check the error indicator against an error class.  To check if any error
13145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * has been set, check against the YASM_ERROR_GENERAL class.  This function
13245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * properly checks error subclasses.
13345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param eclass    base error class to check against
13445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \return Nonzero if error indicator is set and a subclass of eclass, 0
13545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org *         otherwise.
13645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
13745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
13845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgint yasm_error_matches(yasm_error_class eclass);
13945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
14045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org#ifndef YASM_DOXYGEN
14145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
14245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgextern yasm_error_class yasm_eclass;
14345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org#define yasm_error_occurred()       yasm_eclass
14445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org#endif
14545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
14645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Set the error indicator (va_list version).  Has no effect if the error
14745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * indicator is already set.
14845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param eclass    error class
14945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param format    printf format string
15045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param va        argument list for format
15145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
15245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
15345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgvoid yasm_error_set_va(yasm_error_class eclass, const char *format, va_list va);
15445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
15545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Set the error indicator.  Has no effect if the error indicator is already
15645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * set.
15745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param eclass    error class
15845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param format    printf format string
15945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param ...       argument list for format
16045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
16145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
16245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgvoid yasm_error_set(yasm_error_class eclass, const char *format, ...)
16345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    /*@printflike@*/;
16445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
16545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Set a cross-reference for a new error (va_list version).  Has no effect
16645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * if the error indicator is already set (e.g. with yasm_error_set()).  This
16745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * function must be called prior to its corresponding yasm_error_set() call.
16845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param xrefline  virtual line to cross-reference to (should not be 0)
16945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param format    printf format string
17045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param va        argument list for format
17145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
17245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
17345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgvoid yasm_error_set_xref_va(unsigned long xrefline, const char *format,
17445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org                            va_list va);
17545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
17645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Set a cross-reference for a new error.  Has no effect if the error
17745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * indicator is already set (e.g. with yasm_error_set()).  This function
17845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * must be called prior to its corresponding yasm_error_set() call.
17945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param xrefline  virtual line to cross-reference to (should not be 0)
18045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param format    printf format string
18145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param ...       argument list for format
18245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
18345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
18445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgvoid yasm_error_set_xref(unsigned long xrefline, const char *format, ...)
18545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    /*@printflike@*/;
18645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
18745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Fetch the error indicator and all associated data.  If the error
18845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * indicator is set, the output pointers are set to the current error
18945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * indicator values, and the error indicator is cleared.
19045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * The code using this function is then responsible for yasm_xfree()'ing
19145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * str and xrefstr (if non-NULL).  If the error indicator is not set,
19245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * all output values are set to 0 (including eclass, which is set to
19345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * YASM_ERROR_NONE).
19445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param eclass    error class (output)
19545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param str       error message
19645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param xrefline  virtual line used for cross-referencing (0 if no xref)
19745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param xrefstr   cross-reference error message (NULL if no xref)
19845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
19945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
20045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgvoid yasm_error_fetch(/*@out@*/ yasm_error_class *eclass,
20145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org                      /*@out@*/ /*@only@*/ /*@null@*/ char **str,
20245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org                      /*@out@*/ unsigned long *xrefline,
20345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org                      /*@out@*/ /*@only@*/ /*@null@*/ char **xrefstr);
20445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
20545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Unconditionally clear all warning indicators, freeing any associated data.
20645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * Has no effect if no warning indicators have been set.
20745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
20845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
20945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgvoid yasm_warn_clear(void);
21045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
21145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Get the first warning indicator.  YASM_WARN_NONE is returned if no warning
21245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * has been set.  Note that as YASM_WARN_NONE is 0, the return value can also
21345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * be treated as a boolean value.
21445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \return First warning indicator.
21545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
21645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
21745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgyasm_warn_class yasm_warn_occurred(void);
21845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
21945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Add a warning indicator (va_list version).
22045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param wclass    warning class
22145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param format    printf format string
22245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param va        argument list for format
22345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
22445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
22545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgvoid yasm_warn_set_va(yasm_warn_class wclass, const char *format, va_list va);
22645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
22745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Add a warning indicator.
22845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param wclass    warning class
22945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param format    printf format string
23045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param ...       argument list for format
23145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
23245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
23345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgvoid yasm_warn_set(yasm_warn_class wclass, const char *format, ...)
23445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    /*@printflike@*/;
23545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
23645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Fetch the first warning indicator and all associated data.  If there
23745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * is at least one warning indicator, the output pointers are set to the
23845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * first warning indicator values, and first warning indicator is removed.
23945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * The code using this function is then responsible for yasm_xfree()'ing
24045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * str and xrefstr (if non-NULL).  If there is no warning indicator set,
24145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * all output values are set to 0 (including wclass, which is set to
24245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * YASM_WARN_NONE).
24345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param wclass    warning class (output)
24445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param str       warning message
24545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
24645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
24745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgvoid yasm_warn_fetch(/*@out@*/ yasm_warn_class *wclass,
24845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org                     /*@out@*/ /*@only@*/ char **str);
24945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
25045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Enable a class of warnings.
25145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param wclass    warning class
25245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
25345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
25445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgvoid yasm_warn_enable(yasm_warn_class wclass);
25545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
25645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Disable a class of warnings.
25745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param wclass    warning class
25845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
25945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
26045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgvoid yasm_warn_disable(yasm_warn_class wclass);
26145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
26245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Disable all classes of warnings. */
26345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
26445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgvoid yasm_warn_disable_all(void);
26545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
26645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Create an error/warning set for collection of multiple error/warnings.
26745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \return Newly allocated set.
26845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
26945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
27045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/*@only@*/ yasm_errwarns *yasm_errwarns_create(void);
27145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
27245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Destroy an error/warning set.
27345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param errwarns  error/warning set
27445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
27545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
27645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgvoid yasm_errwarns_destroy(/*@only@*/ yasm_errwarns *errwarns);
27745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
27845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Propagate error indicator and warning indicator(s) to an error/warning set.
27945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * Has no effect if the error indicator and warning indicator are not set.
28045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * Does not print immediately; yasm_errwarn_output_all() outputs
28145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * accumulated errors and warnings.
28245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * Generally multiple errors on the same line will be reported, but errors
28345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * of class YASM_ERROR_PARSE will get overwritten by any other class on the
28445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * same line.
28545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param errwarns  error/warning set
28645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param line      virtual line
28745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
28845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
28945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgvoid yasm_errwarn_propagate(yasm_errwarns *errwarns, unsigned long line);
29045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
29145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Get total number of errors logged.
29245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param errwarns          error/warning set
29345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param warning_as_error  if nonzero, warnings are treated as errors.
29445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \return Number of errors.
29545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
29645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
29745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgunsigned int yasm_errwarns_num_errors(yasm_errwarns *errwarns,
29845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org                                      int warning_as_error);
29945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
30045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Print out an error.
30145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param fn            filename of source file
30245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param line          line number
30345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param msg           error message
30445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param xref_fn       cross-referenced source filename
30545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param xref_line     cross-referenced line number
30645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param xref_msg      cross-referenced error message
30745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
30845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgtypedef void (*yasm_print_error_func)
30945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    (const char *fn, unsigned long line, const char *msg,
31045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org     /*@null@*/ const char *xref_fn, unsigned long xref_line,
31145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org     /*@null@*/ const char *xref_msg);
31245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
31345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Print out a warning.
31445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param fn    filename of source file
31545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param line  line number
31645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param msg   warning message
31745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
31845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgtypedef void (*yasm_print_warning_func)
31945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    (const char *fn, unsigned long line, const char *msg);
32045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
32145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Outputs error/warning set in sorted order (sorted by virtual line number).
32245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param errwarns          error/warning set
32345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param lm    line map (to convert virtual lines into filename/line pairs)
32445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param warning_as_error  if nonzero, treat warnings as errors.
32545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param print_error       function called to print out errors
32645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param print_warning     function called to print out warnings
32745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
32845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
32945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgvoid yasm_errwarns_output_all
33045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org    (yasm_errwarns *errwarns, yasm_linemap *lm, int warning_as_error,
33145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org     yasm_print_error_func print_error, yasm_print_warning_func print_warning);
33245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
33345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Convert a possibly unprintable character into a printable string.
33445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \internal
33545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param ch    possibly unprintable character
33645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \return Printable string representation (static buffer).
33745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
33845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
33945afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgchar *yasm__conv_unprint(int ch);
34045afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
34145afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org/** Hook for library users to map to gettext() if GNU gettext is being used.
34245afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \param msgid     message catalog identifier
34345afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org * \return Translated message.
34445afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org */
34545afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgYASM_LIB_DECL
34645afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.orgextern const char * (*yasm_gettext_hook) (const char *msgid);
34745afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org
34845afe016bed87b9c6946184709058b39ede3f77ajwong@chromium.org#endif
349