1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \file 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Contains default functions for creating and destroying as well as 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * otherwise handling ANTLR3 standard exception structures. 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// [The "BSD licence"] 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.temporal-wave.com 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.linkedin.com/in/jimidle 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// All rights reserved. 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Redistribution and use in source and binary forms, with or without 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// modification, are permitted provided that the following conditions 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// are met: 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1. Redistributions of source code must retain the above copyright 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// notice, this list of conditions and the following disclaimer. 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 2. Redistributions in binary form must reproduce the above copyright 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// notice, this list of conditions and the following disclaimer in the 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// documentation and/or other materials provided with the distribution. 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3. The name of the author may not be used to endorse or promote products 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// derived from this software without specific prior written permission. 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <antlr3exception.h> 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void antlr3ExceptionPrint(pANTLR3_EXCEPTION ex); 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void antlr3ExceptionFree (pANTLR3_EXCEPTION ex); 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \brief 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Creates a new ANTLR3 exception structure 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] exception 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * One of the ANTLR3_xxx_EXCEPTION indicators such as #ANTLR3_RECOGNITION_EXCEPTION 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] message 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Pointer to message string 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] freeMessage 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Set to ANTLR3_TRUE if the message parameter should be freed by a call to 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ANTLR3_FREE() when the exception is destroyed. 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \returns 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Pointer to newly initialized exception structure, or an ANTLR3_ERR_xx defined value 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * upon failure. 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * An exception is 'thrown' by a recognizer when input is seen that is not predicted by 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the grammar productions or when some other error condition occurs. In C we do not have 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the luxury of try and catch blocks, so exceptions are added in the order they occur to 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * a list in the baserecognizer structure. The last one to be thrown is inserted at the head of 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the list and the one currently installed is pointed to by the newly installed exception. 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \remarks 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * After an exception is created, you may add a pointer to your own structure and a pointer 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * to a function to free this structure when the exception is destroyed. 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \see 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ANTLR3_EXCEPTION 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 71324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpANTLR3_EXCEPTION 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3ExceptionNew(ANTLR3_UINT32 exception, void * name, void * message, ANTLR3_BOOLEAN freeMessage) 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_EXCEPTION ex; 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Allocate memory for the structure 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ex = (pANTLR3_EXCEPTION) ANTLR3_CALLOC(1, sizeof(ANTLR3_EXCEPTION)); 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Check for memory allocation 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (ex == NULL) 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return NULL; 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ex->name = name; /* Install exception name */ 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ex->type = exception; /* Install the exception number */ 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ex->message = message; /* Install message string */ 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Indicate whether the string should be freed if exception is destroyed 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ex->freeMessage = freeMessage; 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Install the API 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ex->print = antlr3ExceptionPrint; 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ex->freeEx = antlr3ExceptionFree; 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ex; 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \brief 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Prints out the message in all the exceptions in the supplied chain. 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] ex 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Pointer to the exception structure to print. 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \remarks 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * You may wish to override this function by installing a pointer to a new function 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * in the base recognizer context structure. 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \see 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ANTLR3_BASE_RECOGNIZER 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3ExceptionPrint(pANTLR3_EXCEPTION ex) 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Ensure valid pointer 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while (ex != NULL) 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Number if no message, else the message 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (ex->message == NULL) 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FPRINTF(stderr, "ANTLR3_EXCEPTION number %d (%08X).\n", ex->type, ex->type); 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FPRINTF(stderr, "ANTLR3_EXCEPTION: %s\n", (char *)(ex->message)); 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Move to next in the chain (if any) 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ex = ex->nextException; 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \brief 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Frees up a chain of ANTLR3 exceptions 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] ex 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Pointer to the first exception in the chain to free. 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \see 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ANTLR3_EXCEPTION 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3ExceptionFree(pANTLR3_EXCEPTION ex) 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_EXCEPTION next; 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Ensure valid pointer 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while (ex != NULL) 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Pick up anythign following now, before we free the 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * current memory block. 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver next = ex->nextException; 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Free the message pointer if advised to 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (ex->freeMessage == ANTLR3_TRUE) 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FREE(ex->message); 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Call the programmer's custom free routine if advised to 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (ex->freeCustom != NULL) 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ex->freeCustom(ex->custom); 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Free the actual structure itself 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FREE(ex); 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ex = next; 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 191