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