1 /** \file 2 * Contains default functions for creating and destroying as well as 3 * otherwise handling ANTLR3 standard exception structures. 4 */ 5 6 // [The "BSD licence"] 7 // Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC 8 // http://www.temporal-wave.com 9 // http://www.linkedin.com/in/jimidle 10 // 11 // All rights reserved. 12 // 13 // Redistribution and use in source and binary forms, with or without 14 // modification, are permitted provided that the following conditions 15 // are met: 16 // 1. Redistributions of source code must retain the above copyright 17 // notice, this list of conditions and the following disclaimer. 18 // 2. Redistributions in binary form must reproduce the above copyright 19 // notice, this list of conditions and the following disclaimer in the 20 // documentation and/or other materials provided with the distribution. 21 // 3. The name of the author may not be used to endorse or promote products 22 // derived from this software without specific prior written permission. 23 // 24 // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 25 // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 26 // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 27 // IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 28 // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 29 // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 30 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 31 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 32 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 33 // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34 35 #include <antlr3exception.h> 36 37 static void antlr3ExceptionPrint(pANTLR3_EXCEPTION ex); 38 static void antlr3ExceptionFree (pANTLR3_EXCEPTION ex); 39 40 /** 41 * \brief 42 * Creates a new ANTLR3 exception structure 43 * 44 * \param[in] exception 45 * One of the ANTLR3_xxx_EXCEPTION indicators such as #ANTLR3_RECOGNITION_EXCEPTION 46 * 47 * \param[in] message 48 * Pointer to message string 49 * 50 * \param[in] freeMessage 51 * Set to ANTLR3_TRUE if the message parameter should be freed by a call to 52 * ANTLR3_FREE() when the exception is destroyed. 53 * 54 * \returns 55 * Pointer to newly initialized exception structure, or an ANTLR3_ERR_xx defined value 56 * upon failure. 57 * 58 * An exception is 'thrown' by a recognizer when input is seen that is not predicted by 59 * the grammar productions or when some other error condition occurs. In C we do not have 60 * the luxury of try and catch blocks, so exceptions are added in the order they occur to 61 * a list in the baserecognizer structure. The last one to be thrown is inserted at the head of 62 * the list and the one currently installed is pointed to by the newly installed exception. 63 * 64 * \remarks 65 * After an exception is created, you may add a pointer to your own structure and a pointer 66 * to a function to free this structure when the exception is destroyed. 67 * 68 * \see 69 * ANTLR3_EXCEPTION 70 */ 71 pANTLR3_EXCEPTION 72 antlr3ExceptionNew(ANTLR3_UINT32 exception, void * name, void * message, ANTLR3_BOOLEAN freeMessage) 73 { 74 pANTLR3_EXCEPTION ex; 75 76 /* Allocate memory for the structure 77 */ 78 ex = (pANTLR3_EXCEPTION) ANTLR3_CALLOC(1, sizeof(ANTLR3_EXCEPTION)); 79 80 /* Check for memory allocation 81 */ 82 if (ex == NULL) 83 { 84 return NULL; 85 } 86 87 ex->name = name; /* Install exception name */ 88 ex->type = exception; /* Install the exception number */ 89 ex->message = message; /* Install message string */ 90 91 /* Indicate whether the string should be freed if exception is destroyed 92 */ 93 ex->freeMessage = freeMessage; 94 95 /* Install the API 96 */ 97 ex->print = antlr3ExceptionPrint; 98 ex->freeEx = antlr3ExceptionFree; 99 100 return ex; 101 } 102 103 /** 104 * \brief 105 * Prints out the message in all the exceptions in the supplied chain. 106 * 107 * \param[in] ex 108 * Pointer to the exception structure to print. 109 * 110 * \remarks 111 * You may wish to override this function by installing a pointer to a new function 112 * in the base recognizer context structure. 113 * 114 * \see 115 * ANTLR3_BASE_RECOGNIZER 116 */ 117 static void 118 antlr3ExceptionPrint(pANTLR3_EXCEPTION ex) 119 { 120 /* Ensure valid pointer 121 */ 122 while (ex != NULL) 123 { 124 /* Number if no message, else the message 125 */ 126 if (ex->message == NULL) 127 { 128 ANTLR3_FPRINTF(stderr, "ANTLR3_EXCEPTION number %d (%08X).\n", ex->type, ex->type); 129 } 130 else 131 { 132 ANTLR3_FPRINTF(stderr, "ANTLR3_EXCEPTION: %s\n", (char *)(ex->message)); 133 } 134 135 /* Move to next in the chain (if any) 136 */ 137 ex = ex->nextException; 138 } 139 140 return; 141 } 142 143 /** 144 * \brief 145 * Frees up a chain of ANTLR3 exceptions 146 * 147 * \param[in] ex 148 * Pointer to the first exception in the chain to free. 149 * 150 * \see 151 * ANTLR3_EXCEPTION 152 */ 153 static void 154 antlr3ExceptionFree(pANTLR3_EXCEPTION ex) 155 { 156 pANTLR3_EXCEPTION next; 157 158 /* Ensure valid pointer 159 */ 160 while (ex != NULL) 161 { 162 /* Pick up anythign following now, before we free the 163 * current memory block. 164 */ 165 next = ex->nextException; 166 167 /* Free the message pointer if advised to 168 */ 169 if (ex->freeMessage == ANTLR3_TRUE) 170 { 171 ANTLR3_FREE(ex->message); 172 } 173 174 /* Call the programmer's custom free routine if advised to 175 */ 176 if (ex->freeCustom != NULL) 177 { 178 ex->freeCustom(ex->custom); 179 } 180 181 /* Free the actual structure itself 182 */ 183 ANTLR3_FREE(ex); 184 185 ex = next; 186 } 187 188 return; 189 } 190 191