| /* | |
| Copyright (c) 2009-2016 mingw-w64 project | |
| Contributing authors: Kai Tietz, Jonathan Yong | |
| Permission is hereby granted, free of charge, to any person obtaining a | |
| copy of this software and associated documentation files (the "Software"), | |
| to deal in the Software without restriction, including without limitation | |
| the rights to use, copy, modify, merge, publish, distribute, sublicense, | |
| and/or sell copies of the Software, and to permit persons to whom the | |
| Software is furnished to do so, subject to the following conditions: | |
| The above copyright notice and this permission notice shall be included in | |
| all copies or substantial portions of the Software. | |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |
| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |
| DEALINGS IN THE SOFTWARE. | |
| */ | |
| /*! \def GET_CHAR(CTX) | |
| \brief Get currently marked character from \a CTX. | |
| Get character from at current possition via \a CTX. | |
| */ | |
| /*! \def INC_CHAR(CTX) | |
| \brief Increments \a ctx position. | |
| Move marker to next character if it is currently not the last via \a CTX. | |
| */ | |
| /*! \def DEC_CHAR(CTX) | |
| \brief Decrements \a ctx position. | |
| Move marker to previous character if it is currently not the first via \a CTX. | |
| */ | |
| /*! \def SKIP_CHAR(CTX,LEN) | |
| \brief Increments \a CTX position by LEN | |
| Increments \a CTX marker by LEN characters, points to last character if | |
| marker is moved out of bounds. | |
| */ | |
| #ifndef _M_MS_HXX | |
| #define _M_MS_HXX | |
| #include "m_token.h" | |
| #define ENCODING_TYPE_MS 1 | |
| /** | |
| * z-buffer for decoded names, decoded | |
| * templates args and decoded args. | |
| * @see sMSCtx | |
| * @see get_zbuf_name() | |
| */ | |
| typedef struct sCached { | |
| int count; /**< uMToken pointers in array count. */ | |
| uMToken *arr[10]; /**< Array of pointers to recently decoded tokens. */ | |
| } sCached; | |
| typedef struct sMSCtx { | |
| libmangle_gc_context_t *gc; | |
| const char *name; /**< MSVC export name. */ | |
| const char *end; /**< Last character in the export name. */ | |
| const char *pos; /**< Export name processing position marker. */ | |
| int err; /**< Error codes. Zero indicates success. */ | |
| int fExplicitTemplateParams; /**< Indicates that explicit template parameters are used. */ | |
| int fGetTemplateArgumentList; /**< Indicates that the template argument list should be used. */ | |
| sCached *pZNameList; /**< z-buffer of decoded names. */ | |
| sCached *pTemplateArgList; /**< z-buffer of decoded template arguments. */ | |
| sCached *pArgList; /**< z-buffer if decoded arguments. */ | |
| } sMSCtx; | |
| #define GET_CHAR(CTX) ((CTX)->pos == (CTX)->end ? 0 : (CTX)->pos[0]) | |
| #define INC_CHAR(CTX) do { if ((CTX)->pos != (CTX)->end) (CTX)->pos++; } while (0) | |
| #define DEC_CHAR(CTX) do { if ((CTX)->pos != (CTX)->name) (CTX)->pos--; } while (0) | |
| #define SKIP_CHAR(CTX,LEN) do { (CTX)->pos += (LEN); if ((CTX)->pos > (CTX)->end) (CTX)->pos=(CTX)->end; } while (0) | |
| /** | |
| * Decodes an MSVC export name. | |
| * @param[in] gc sGcCtx pointer for collecting memory allocations. | |
| * @param[in] name MSVC C++ mangled export string. | |
| * @see libmangle_sprint_decl() | |
| * @see libmangle_release_gc() | |
| * @see uMToken | |
| * @return Token containing information about the mangled string, | |
| * use libmangle_release_gc() to free after use. | |
| */ | |
| uMToken *libmangle_decode_ms_name (libmangle_gc_context_t *gc, const char *name); | |
| char *libmangle_encode_ms_name (libmangle_gc_context_t *gc, uMToken *tok); | |
| #endif |