# Python bindings for Yasm: Pyrex input file for errwarn.h # # Copyright (C) 2006 Peter Johnson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS'' # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. class YasmError(Exception): pass cdef int __error_check() except 1: cdef yasm_error_class errclass cdef unsigned long xrefline cdef char *errstr, *xrefstr # short path for the common case if not yasm_error_occurred(): return 0 # look up our preferred python error, fall back to YasmError # Order matters here. Go from most to least specific within a class if yasm_error_matches(YASM_ERROR_ZERO_DIVISION): exception = ZeroDivisionError # Enable these once there are tests that need them. #elif yasm_error_matches(YASM_ERROR_OVERFLOW): # exception = OverflowError #elif yasm_error_matches(YASM_ERROR_FLOATING_POINT): # exception = FloatingPointError #elif yasm_error_matches(YASM_ERROR_ARITHMETIC): # exception = ArithmeticError #elif yasm_error_matches(YASM_ERROR_ASSERTION): # exception = AssertionError #elif yasm_error_matches(YASM_ERROR_VALUE): # exception = ValueError # include notabs, notconst, toocomplex #elif yasm_error_matches(YASM_ERROR_IO): # exception = IOError #elif yasm_error_matches(YASM_ERROR_NOT_IMPLEMENTED): # exception = NotImplementedError #elif yasm_error_matches(YASM_ERROR_TYPE): # exception = TypeError #elif yasm_error_matches(YASM_ERROR_SYNTAX): # exception = SyntaxError #include parse else: exception = YasmError # retrieve info (clears error) yasm_error_fetch(&errclass, &errstr, &xrefline, &xrefstr) if xrefline and xrefstr: PyErr_Format(exception, "%s: %d: %s", errstr, xrefline, xrefstr) else: PyErr_SetString(exception, errstr) if xrefstr: free(xrefstr) free(errstr) return 1