--- /dev/null
+/** \file\r
+ * Contains default functions for creating and destroying as well as\r
+ * otherwise handling ANTLR3 standard exception structures.\r
+ */\r
+\r
+// [The "BSD licence"]\r
+// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC\r
+// http://www.temporal-wave.com\r
+// http://www.linkedin.com/in/jimidle\r
+//\r
+// All rights reserved.\r
+//\r
+// Redistribution and use in source and binary forms, with or without\r
+// modification, are permitted provided that the following conditions\r
+// are met:\r
+// 1. Redistributions of source code must retain the above copyright\r
+// notice, this list of conditions and the following disclaimer.\r
+// 2. Redistributions in binary form must reproduce the above copyright\r
+// notice, this list of conditions and the following disclaimer in the\r
+// documentation and/or other materials provided with the distribution.\r
+// 3. The name of the author may not be used to endorse or promote products\r
+// derived from this software without specific prior written permission.\r
+//\r
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\r
+// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\r
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
+// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\r
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\r
+// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\r
+// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+\r
+#include <antlr3exception.h>\r
+\r
+static void antlr3ExceptionPrint(pANTLR3_EXCEPTION ex);\r
+static void antlr3ExceptionFree (pANTLR3_EXCEPTION ex);\r
+\r
+/**\r
+ * \brief\r
+ * Creates a new ANTLR3 exception structure\r
+ * \r
+ * \param[in] exception\r
+ * One of the ANTLR3_xxx_EXCEPTION indicators such as #ANTLR3_RECOGNITION_EXCEPTION\r
+ * \r
+ * \param[in] message\r
+ * Pointer to message string \r
+ * \r
+ * \param[in] freeMessage\r
+ * Set to ANTLR3_TRUE if the message parameter should be freed by a call to \r
+ * ANTLR3_FREE() when the exception is destroyed.\r
+ * \r
+ * \returns\r
+ * Pointer to newly initialized exception structure, or an ANTLR3_ERR_xx defined value\r
+ * upon failure.\r
+ * \r
+ * An exception is 'thrown' by a recognizer when input is seen that is not predicted by\r
+ * the grammar productions or when some other error condition occurs. In C we do not have\r
+ * the luxury of try and catch blocks, so exceptions are added in the order they occur to \r
+ * a list in the baserecognizer structure. The last one to be thrown is inserted at the head of\r
+ * the list and the one currently installed is pointed to by the newly installed exception.\r
+ * \r
+ * \remarks\r
+ * After an exception is created, you may add a pointer to your own structure and a pointer\r
+ * to a function to free this structure when the exception is destroyed.\r
+ * \r
+ * \see\r
+ * ANTLR3_EXCEPTION\r
+ */\r
+pANTLR3_EXCEPTION\r
+antlr3ExceptionNew(ANTLR3_UINT32 exception, void * name, void * message, ANTLR3_BOOLEAN freeMessage)\r
+{\r
+ pANTLR3_EXCEPTION ex;\r
+\r
+ /* Allocate memory for the structure\r
+ */\r
+ ex = (pANTLR3_EXCEPTION) ANTLR3_CALLOC(1, sizeof(ANTLR3_EXCEPTION));\r
+\r
+ /* Check for memory allocation\r
+ */\r
+ if (ex == NULL)\r
+ {\r
+ return NULL;\r
+ }\r
+\r
+ ex->name = name; /* Install exception name */\r
+ ex->type = exception; /* Install the exception number */\r
+ ex->message = message; /* Install message string */\r
+\r
+ /* Indicate whether the string should be freed if exception is destroyed \r
+ */\r
+ ex->freeMessage = freeMessage;\r
+\r
+ /* Install the API\r
+ */\r
+ ex->print = antlr3ExceptionPrint;\r
+ ex->freeEx = antlr3ExceptionFree;\r
+\r
+ return ex;\r
+}\r
+\r
+/**\r
+ * \brief\r
+ * Prints out the message in all the exceptions in the supplied chain.\r
+ * \r
+ * \param[in] ex\r
+ * Pointer to the exception structure to print.\r
+ * \r
+ * \remarks\r
+ * You may wish to override this function by installing a pointer to a new function\r
+ * in the base recognizer context structure.\r
+ * \r
+ * \see\r
+ * ANTLR3_BASE_RECOGNIZER\r
+ */\r
+static void\r
+antlr3ExceptionPrint(pANTLR3_EXCEPTION ex)\r
+{\r
+ /* Ensure valid pointer\r
+ */\r
+ while (ex != NULL)\r
+ {\r
+ /* Number if no message, else the message\r
+ */\r
+ if (ex->message == NULL)\r
+ {\r
+ ANTLR3_FPRINTF(stderr, "ANTLR3_EXCEPTION number %d (%08X).\n", ex->type, ex->type);\r
+ }\r
+ else\r
+ {\r
+ ANTLR3_FPRINTF(stderr, "ANTLR3_EXCEPTION: %s\n", (char *)(ex->message));\r
+ }\r
+\r
+ /* Move to next in the chain (if any)\r
+ */\r
+ ex = ex->nextException;\r
+ }\r
+\r
+ return;\r
+}\r
+\r
+/**\r
+ * \brief\r
+ * Frees up a chain of ANTLR3 exceptions\r
+ * \r
+ * \param[in] ex\r
+ * Pointer to the first exception in the chain to free.\r
+ * \r
+ * \see\r
+ * ANTLR3_EXCEPTION\r
+ */\r
+static void\r
+antlr3ExceptionFree(pANTLR3_EXCEPTION ex)\r
+{\r
+ pANTLR3_EXCEPTION next;\r
+\r
+ /* Ensure valid pointer\r
+ */\r
+ while (ex != NULL)\r
+ {\r
+ /* Pick up anythign following now, before we free the\r
+ * current memory block.\r
+ */\r
+ next = ex->nextException;\r
+\r
+ /* Free the message pointer if advised to\r
+ */\r
+ if (ex->freeMessage == ANTLR3_TRUE)\r
+ {\r
+ ANTLR3_FREE(ex->message);\r
+ }\r
+\r
+ /* Call the programmer's custom free routine if advised to\r
+ */\r
+ if (ex->freeCustom != NULL)\r
+ {\r
+ ex->freeCustom(ex->custom);\r
+ }\r
+\r
+ /* Free the actual structure itself\r
+ */\r
+ ANTLR3_FREE(ex);\r
+\r
+ ex = next;\r
+ }\r
+\r
+ return;\r
+}\r
+\r