Move libmangle from experimental to trunk for real this time, hopefully without breaking everything again.
git-svn-id: svn+ssh://svn.code.sf.net/p/mingw-w64/code/trunk@1462 4407c894-4637-0410-b4f5-ada5f102cad1
diff --git a/mingw-w64-libraries/libmangle/src/m_token.h b/mingw-w64-libraries/libmangle/src/m_token.h
new file mode 100644
index 0000000..19a949c
--- /dev/null
+++ b/mingw-w64-libraries/libmangle/src/m_token.h
@@ -0,0 +1,351 @@
+/*
+ Copyright (c) 2009 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.
+*/
+#ifndef _M_TOKEN_HXX
+#define _M_TOKEN_HXX
+
+/**
+ * Garbage collector elements.
+ * Tracks allocated memory and points to the next element from the same context.
+ * @see sGcCtx
+ */
+typedef struct sGcElem {
+ struct sGcElem *chain; /**< Next element in chain. */
+ size_t length; /**< Size of allocated memory (excluding sGcElem and sGcCtx). */
+ char dta[1]; /**< Starting adress marker of requested memory. */
+} sGcElem;
+
+/**
+ * Garbage collector context.
+ * Tracks first and last of elements in gc context.
+ * @see generate_gc()
+ * @see release_gc()
+ */
+typedef struct sGcCtx {
+ sGcElem *head; /**< Pointer to first gc element in context.*/
+ sGcElem *tail; /**< Pointer to last gc element in context. */
+} sGcCtx;
+
+/**
+ * Token "Kind" enumeration list.
+ * @see gen_tok()
+ * @see eMSToken
+ * @see sMToken_base
+ */
+typedef enum eMToken {
+ eMToken_none = 0, /**< Token type: None. */
+ eMToken_value = 1, /**< Token type: Value. */
+ eMToken_name = 2, /**< Token type: Name. */
+ eMToken_dim = 3, /**< Token type: Dim. */
+ eMToken_unary = 4, /**< Token type: Unary */
+ eMToken_binary = 5, /**< Token type: Binary */
+ eMToken_MAX /**< Unused sentinel. */
+} eMToken;
+
+/**
+ * Token "Subkind" enumeration list.
+ * Also used by internal function sprint_decl1() for printing.
+ * @see gen_tok()
+ * @see eMToken
+ * @see sMToken_base
+ */
+typedef enum eMSToken {
+ eMST_unmangled = 0, /**< Name is unmagled. */
+ eMST_nttp = 1, /**< Template name. */
+ eMST_name = 2, /**< Decoded function name. */
+ eMST_colon = 3, /**< Class member accessibility. */
+ eMST_rtti = 4, /**< Runtime Type information name. */
+ eMST_cv = 5, /**< Function call convention / data qualifiers / pointer. */
+ eMST_vftable = 6, /**< Virtual Function Table. */
+ eMST_vbtable = 7, /**< Virtual Base Table. */
+ eMST_vcall = 8, /**< Virtual Function Call. */
+ eMST_opname = 9, /**< Overloaded operator. */
+ eMST_templargname = 10, /**< Explicit template arg name. */
+ eMST_type = 11, /**< Function return type. */
+ eMST_dim, /**< Print array-like expression. @see eMToken_dim */
+ eMST_val, /**< Print value expression. @see sMToken_val */
+ eMST_gcarray, /* __gc[,,,,] */ /**< MSVC extenstion: "__gc" Managed C++ reference. */
+ eMST_slashed, /**< MTOKEN_UNARY appended and prepended with "/". */
+ eMST_array, /**< MTOKEN_UNARY enclosed by square brackets. */
+ eMST_element, /**< MTOKEN_UNARY in an argument list. */
+ eMST_template_argument_list, /**< MTOKEN_UNARY in an argument list. */
+ eMST_ltgt, /**< MTOKEN_UNARY enclosed by angular brackets. */
+ eMST_frame, /**< MTOKEN_UNARY enclosed by curly brackets. */
+ eMST_throw, /**< MTOKEN_UNARY prepended by "throw ". */
+ eMST_rframe, /**< MTOKEN_UNARY enclosed by parentheses. */
+ eMST_destructor, /**< MTOKEN_UNARY prepended with "~". */
+ eMST_oper, /**< indicates that token an operand, prints from MTOKEN_UNARY. */
+ eMST_colonarray, /* ::[] */ /**< Unused, to be removed. */
+ eMST_lexical_frame, /**< MTOKEN_UNARY enclosed by single quotes "'". */
+ eMST_scope, /**< MTOKEN_UNARY, unenclosed. */
+ eMST_udt_returning, /**< User defined types (RTTI). */
+ eMST_coloncolon, /**< "::" between MTOKEN_BINARY_LEFT and MTOKEN_BINARY_RIGHT. */
+ eMST_assign, /**< "=" between MTOKEN_BINARY_LEFT and MTOKEN_BINARY_RIGHT and appended with "}". */
+ eMST_templateparam, /**< Explicit template. */
+ eMST_nonetypetemplateparam, /**< Non-explicit template. */
+ eMST_exp, /**< dim 'e' (exponent) dim */
+ eMST_combine, /**< Unary grouping. */
+ eMST_ecsu, /**< Is an Enum/Class/Struct/Union */
+ eMST_based /**< MSVC extension: "__based" Based addressing */
+} eMSToken;
+
+/**
+ * Token base descriptor header.
+ * Descibes the type of token being processed.
+ */
+typedef struct sMToken_base {
+ enum eMToken kind; /**< Token kind. */
+ enum eMSToken subkind; /**< Token Subkind. */
+ union uMToken *chain; /**< Pointer to next token. NULL terminated. */
+ int flags; /**< Token flags. */
+} sMToken_base;
+
+/**Sets the token kind, @a PT pointer to a base uMToken. */
+#define MTOKEN_KIND(PT) ((PT)->base.kind)
+
+/**Sets the token subkind, @a PT pointer to a base uMToken. */
+#define MTOKEN_SUBKIND(PT) ((PT)->base.subkind)
+
+/**Sets the pointer to the next token in the chain. */
+#define MTOKEN_CHAIN(PT) ((PT)->base.chain)
+
+/**Sets flags in base descriptor. */
+#define MTOKEN_FLAGS(PT) ((PT)->base.flags)
+
+#define MTOKEN_FLAGS_UDC 0x1 /**< Indicates a following "name" token for named struct/union/class. */
+#define MTOKEN_FLAGS_NOTE 0x2 /**< Contains "note" name token.*/
+#define MTOKEN_FLAGS_PTRREF 0x4 /**< Decoded fragment is a referrence. */
+#define MTOKEN_FLAGS_ARRAY 0x8 /**< Decoded fragment has an array-like expression.*/
+
+/**
+ * "value" token.
+ * Contains numerical expressions for decoded names.
+ * @see sMToken_dim
+ */
+typedef struct sMToken_value {
+ sMToken_base base; /**< Base descriptor header. */
+ uint64_t value; /**< Integer value. */
+ uint64_t size : 5; /**< Byte width of value. */
+ uint64_t is_signed : 1; /**< Value signed bit */
+} sMToken_value;
+
+/**Sets the token value. @a PT pointer to a value uMToken.*/
+#define MTOKEN_VALUE(PT) ((PT)->value.value)
+
+/**Sets the signed bit on value token. @a PT pointer to a value uMToken.*/
+#define MTOKEN_VALUE_SIGNED(PT) ((PT)->value.is_signed)
+
+/**Sets the byte width of value in value token. @a PT pointer to a value uMToken.*/
+#define MTOKEN_VALUE_SIZE(PT) ((PT)->value.size)
+
+/**
+ * "name" token.
+ * Contains text string expressions of the decoded fragment.
+ */
+typedef struct sMToken_name {
+ sMToken_base base; /**< Base descriptor header. */
+ char name[1]; /**< Pointer to text string.*/
+} sMToken_name;
+
+/** Retrieve or set the name string, @a PT pointer to a name uMToken */
+#define MTOKEN_NAME(PT) ((PT)->name.name)
+
+/**
+ * "dim" token.
+ * Contains array-like expressions in decoded names.
+ */
+typedef struct sMToken_dim {
+ sMToken_base base; /**< Base descriptor header. */
+ union uMToken *value; /**< Pointer to value token. */
+ union uMToken *non_tt_param; /**< Pointer to C++ template name token. */
+ int beNegate; /**< 1 for negative "values". */
+} sMToken_dim;
+
+/** Retrieve or set the value of a token, @a PT pointer to a value uMToken */
+#define MTOKEN_DIM_VALUE(PT) ((PT)->dim.value)
+
+/** Retrieve or set the template of a token, @a PT pointer to a name uMToken */
+#define MTOKEN_DIM_NTTP(PT) ((PT)->dim.non_tt_param)
+
+/** Retrieve or set negative bit on value token, @a PT pointer to an generic uMToken */
+#define MTOKEN_DIM_NEGATE(PT) ((PT)->dim.beNegate)
+
+/**
+ * Unary node token.
+ * Contains a pointer to a single generic leaf element.
+ */
+typedef struct sMToken_Unary
+{
+ sMToken_base base; /**< Base descriptor header. */
+ union uMToken *unary; /**< Pointer to leaf element. */
+} sMToken_Unary;
+
+/**Sets the leaf element on a unary token, @a PT pointer to a unary uMToken. */
+#define MTOKEN_UNARY(PT) ((PT)->unary.unary)
+
+/**
+ * Binary node token.
+ * Contains pointers to any 2 generic token instances as child node elements.
+ * May act as a connector for decoded C++ names.
+ */
+typedef struct sMToken_binary {
+ sMToken_base base; /**< Base descriptor header. */
+ union uMToken *left; /**< Left node element. */
+ union uMToken *right; /**< Right node element. */
+} sMToken_binary;
+
+/**Sets the left node on binary token, @a PT pointer to a binary uMToken. */
+#define MTOKEN_BINARY_LEFT(PT) ((PT)->binary.left)
+
+/**Sets the right node on binary token, @a PT pointer to a binary uMToken. */
+#define MTOKEN_BINARY_RIGHT(PT) ((PT)->binary.right)
+
+/**
+ * Generic token instances.
+ * Type of token determined by base descriptor in members.
+ * Base descriptor header available in all members through type punning.
+ * @see gen_tok()
+ */
+typedef union uMToken {
+ sMToken_base base; /**< Base descriptor header. */
+ sMToken_value value; /**< "value" token. */
+ sMToken_name name; /**< "name" token. */
+ sMToken_dim dim; /**< "dim" token */
+ sMToken_Unary unary; /**< Unary node token. */
+ sMToken_binary binary; /**< Binary node token. */
+} uMToken;
+
+/**
+ * gen_tok constructs uMToken instances
+ * Instances are destroyed with release_gc().
+ * @param[in] gc Pointer to garbage collection context.
+ * @param[in] kind Kind of token to construct
+ * @param[in] subkind Subkind of token to construct
+ * @param[in] addend Additional byte padding at the end.
+ * @see release_gc()
+ */
+uMToken *gen_tok (sGcCtx *gc, enum eMToken kind, enum eMSToken subkind, size_t addend);
+
+/**
+ * Releases memory tracked by context.
+ * @param[in] gc Garbage collection context to work on.
+ * @see generate_gc()
+ */
+void release_gc (sGcCtx *gc);
+
+/**
+ * Constructs a garbage collection context token.
+ * @return Pointer to context.
+ * @see release_gc()
+ */
+sGcCtx *generate_gc (void);
+
+/**
+ * Chains uMTokens together.
+ * @param[in] l uMtoken chain to link up with.
+ * @param[in] add uMtoken to add to chain.
+ * @return @a l unchanged
+ */
+uMToken *chain_tok (uMToken *l, uMToken *add);
+
+/**
+ * Dumps uMToken to a file descriptor for debugging.
+ * @param[in] fp File descriptor to print the token to.
+ * @param[in] p uMToken chain to print.
+ */
+void dump_tok (FILE *fp, uMToken *p);
+
+/**
+ * Prints C++ name to file descriptor.
+ * @param[in] fp Output file descriptor.
+ * @param[in] p Token containing information about the C++ name.
+ * @see decode_ms_name()
+ */
+void print_decl (FILE *fp, uMToken *p);
+
+/**
+ * Get pointer to decoded C++ name string.
+ * Use free() to release returned string.
+ * @param[in] r C++ name token.
+ * @return pointer to decoded C++ name string.
+ * @see decode_ms_name()
+ */
+char *sprint_decl (uMToken *r);
+
+/**
+ * Constructs a "value" kind token.
+ * @param[in] gc Pointer to garbage collection context.
+ * @param[in] skind Token subkind.
+ * @param[in] val Sets the value on token,
+ * @param[in] is_signed Signed bit of \a val.
+ * @param[in] size Width of \a val.
+ * @return Pointer to value token.
+ * @see sMToken_value
+ */
+uMToken *gen_value (sGcCtx *gc, enum eMSToken skind, uint64_t val, int is_signed, int size);
+
+/**
+ * Constructs a "name" kind token.
+ * @param[in] gc Pointer to garbage collection context.
+ * @param[in] skind Token subkind.
+ * @param[in] name Pointer to name string.
+ * @return Pointer to name token.
+ * @see sMToken_name
+ */
+uMToken *gen_name (sGcCtx *gc, enum eMSToken skind, const char *name);
+
+/**
+ * Constructs a "dim" kind token.
+ * @param[in] gc Pointer to garbage collection context.
+ * @param[in] skind Token subkind.
+ * @param[in] val Token numerical value.
+ * @param[in] non_tt_param pointer to decoded C++ template name.
+ * @param[in] fSigned Signedness of the numerical value.
+ * @param[in] fNegate 1 for "val" is negative digit.
+ * @return Pointer to dim token.
+ * @see sMToken_dim
+ */
+uMToken *gen_dim (sGcCtx *gc, enum eMSToken skind, uint64_t val, const char *non_tt_param, int fSigned, int fNegate);
+
+/**
+ * Constructs a "unary" kind token.
+ * @param[in] gc Pointer to garbage collection context.
+ * @param[in] skind Token subkind.
+ * @param[in] un Pointer to leaf element.
+ * @return Pointer to a unary token.
+ * @see sMToken_unary
+ */
+uMToken *gen_unary (sGcCtx *gc, enum eMSToken skind, uMToken *un);
+
+/**
+ * Generates a binary node token.
+ * @param[in] gc Pointer to garbage collection context.
+ * @param[in] skind Token subKind.
+ * @param[in] l Left node element.
+ * @param[in] r Right node element.
+ * @return Pointer to binary token.
+ * @see sMToken_binary
+ */
+uMToken *gen_binary (sGcCtx *gc, enum eMSToken skind, uMToken *l, uMToken *r);
+
+#endif