| /** |
| * \file libyasm/linemap.h |
| * \brief YASM virtual line mapping interface. |
| * |
| * \license |
| * Copyright (C) 2002-2007 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. |
| * \endlicense |
| */ |
| #ifndef YASM_LINEMAP_H |
| #define YASM_LINEMAP_H |
| |
| #ifndef YASM_LIB_DECL |
| #define YASM_LIB_DECL |
| #endif |
| |
| /** Create a new line mapping repository. |
| * \return New repository. |
| */ |
| YASM_LIB_DECL |
| yasm_linemap *yasm_linemap_create(void); |
| |
| /** Clean up any memory allocated for a repository. |
| * \param linemap line mapping repository |
| */ |
| YASM_LIB_DECL |
| void yasm_linemap_destroy(yasm_linemap *linemap); |
| |
| /** Get the current line position in a repository. |
| * \param linemap line mapping repository |
| * \return Current virtual line. |
| */ |
| YASM_LIB_DECL |
| unsigned long yasm_linemap_get_current(yasm_linemap *linemap); |
| |
| /** Get bytecode and source line information, if any, for a virtual line. |
| * \param linemap line mapping repository |
| * \param line virtual line |
| * \param bcp pointer to return bytecode into |
| * \param sourcep pointer to return source code line pointer into |
| * \return Zero if source line information available for line, nonzero if not. |
| * \note If source line information is not available, bcp and sourcep targets |
| * are set to NULL. |
| */ |
| YASM_LIB_DECL |
| int yasm_linemap_get_source(yasm_linemap *linemap, unsigned long line, |
| /*@null@*/ yasm_bytecode **bcp, |
| const char **sourcep); |
| |
| /** Add bytecode and source line information to the current virtual line. |
| * \attention Deletes any existing bytecode and source line information for |
| * the current virtual line. |
| * \param linemap line mapping repository |
| * \param bc bytecode (if any) |
| * \param source source code line |
| * \note The source code line pointer is NOT kept, it is strdup'ed. |
| */ |
| YASM_LIB_DECL |
| void yasm_linemap_add_source(yasm_linemap *linemap, |
| /*@null@*/ yasm_bytecode *bc, |
| const char *source); |
| |
| /** Go to the next line (increments the current virtual line). |
| * \param linemap line mapping repository |
| * \return The current (new) virtual line. |
| */ |
| YASM_LIB_DECL |
| unsigned long yasm_linemap_goto_next(yasm_linemap *linemap); |
| |
| /** Set a new file/line physical association starting point at the specified |
| * virtual line. line_inc indicates how much the "real" line is incremented |
| * by for each virtual line increment (0 is perfectly legal). |
| * \param linemap line mapping repository |
| * \param filename physical file name (if NULL, not changed) |
| * \param virtual_line virtual line number (if 0, linemap->current is used) |
| * \param file_line physical line number |
| * \param line_inc line increment |
| */ |
| YASM_LIB_DECL |
| void yasm_linemap_set(yasm_linemap *linemap, /*@null@*/ const char *filename, |
| unsigned long virtual_line, unsigned long file_line, |
| unsigned long line_inc); |
| |
| /** Poke a single file/line association, restoring the original physical |
| * association starting point. Caution: increments the current virtual line |
| * twice. |
| * \param linemap line mapping repository |
| * \param filename physical file name (if NULL, not changed) |
| * \param file_line physical line number |
| * \return The virtual line number of the poked association. |
| */ |
| YASM_LIB_DECL |
| unsigned long yasm_linemap_poke(yasm_linemap *linemap, |
| /*@null@*/ const char *filename, |
| unsigned long file_line); |
| |
| /** Look up the associated physical file and line for a virtual line. |
| * \param linemap line mapping repository |
| * \param line virtual line |
| * \param filename physical file name (output) |
| * \param file_line physical line number (output) |
| */ |
| YASM_LIB_DECL |
| void yasm_linemap_lookup(yasm_linemap *linemap, unsigned long line, |
| /*@out@*/ const char **filename, |
| /*@out@*/ unsigned long *file_line); |
| |
| /** Traverses all filenames used in a linemap, calling a function on each |
| * filename. |
| * \param linemap line mapping repository |
| * \param d data pointer passed to func on each call |
| * \param func function |
| * \return Stops early (and returns func's return value) if func returns a |
| * nonzero value; otherwise 0. |
| */ |
| YASM_LIB_DECL |
| int yasm_linemap_traverse_filenames |
| (yasm_linemap *linemap, /*@null@*/ void *d, |
| int (*func) (const char *filename, void *d)); |
| |
| #endif |