1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Contains the default implementation of the common token used within 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * java. Custom tokens should create this structure and then append to it using the 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * custom pointer to install their own structure and API. 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// [The "BSD licence"] 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.temporal-wave.com 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.linkedin.com/in/jimidle 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// All rights reserved. 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Redistribution and use in source and binary forms, with or without 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// modification, are permitted provided that the following conditions 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// are met: 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1. Redistributions of source code must retain the above copyright 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// notice, this list of conditions and the following disclaimer. 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 2. Redistributions in binary form must reproduce the above copyright 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// notice, this list of conditions and the following disclaimer in the 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// documentation and/or other materials provided with the distribution. 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3. The name of the author may not be used to endorse or promote products 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// derived from this software without specific prior written permission. 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <antlr3.h> 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Token API 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_STRING getText (pANTLR3_COMMON_TOKEN token); 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setText (pANTLR3_COMMON_TOKEN token, pANTLR3_STRING text); 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setText8 (pANTLR3_COMMON_TOKEN token, pANTLR3_UINT8 text); 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32 getType (pANTLR3_COMMON_TOKEN token); 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setType (pANTLR3_COMMON_TOKEN token, ANTLR3_UINT32 type); 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32 getLine (pANTLR3_COMMON_TOKEN token); 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setLine (pANTLR3_COMMON_TOKEN token, ANTLR3_UINT32 line); 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_INT32 getCharPositionInLine (pANTLR3_COMMON_TOKEN token); 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setCharPositionInLine (pANTLR3_COMMON_TOKEN token, ANTLR3_INT32 pos); 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32 getChannel (pANTLR3_COMMON_TOKEN token); 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setChannel (pANTLR3_COMMON_TOKEN token, ANTLR3_UINT32 channel); 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_MARKER getTokenIndex (pANTLR3_COMMON_TOKEN token); 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setTokenIndex (pANTLR3_COMMON_TOKEN token, ANTLR3_MARKER); 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_MARKER getStartIndex (pANTLR3_COMMON_TOKEN token); 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setStartIndex (pANTLR3_COMMON_TOKEN token, ANTLR3_MARKER index); 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_MARKER getStopIndex (pANTLR3_COMMON_TOKEN token); 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setStopIndex (pANTLR3_COMMON_TOKEN token, ANTLR3_MARKER index); 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_STRING toString (pANTLR3_COMMON_TOKEN token); 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Factory API 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void factoryClose (pANTLR3_TOKEN_FACTORY factory); 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_COMMON_TOKEN newToken (void); 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setInputStream (pANTLR3_TOKEN_FACTORY factory, pANTLR3_INPUT_STREAM input); 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void factoryReset (pANTLR3_TOKEN_FACTORY factory); 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Internal management functions 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void newPool (pANTLR3_TOKEN_FACTORY factory); 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_COMMON_TOKEN newPoolToken (pANTLR3_TOKEN_FACTORY factory); 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 72324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API pANTLR3_COMMON_TOKEN 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3CommonTokenNew(ANTLR3_UINT32 ttype) 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_COMMON_TOKEN token; 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Create a raw token with the interface installed 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token = newToken(); 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (token != NULL) 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->setType(token, ttype); 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // All good 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return token; 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 91324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API pANTLR3_TOKEN_FACTORY 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3TokenFactoryNew(pANTLR3_INPUT_STREAM input) 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_TOKEN_FACTORY factory; 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* allocate memory 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory = (pANTLR3_TOKEN_FACTORY) ANTLR3_MALLOC((size_t)sizeof(ANTLR3_TOKEN_FACTORY)); 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (factory == NULL) 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return NULL; 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Install factory API 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->newToken = newPoolToken; 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->close = factoryClose; 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->setInputStream = setInputStream; 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->reset = factoryReset; 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Allocate the initial pool 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->thisPool = -1; 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->pools = NULL; 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->maxPool = -1; 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newPool(factory); 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Factory space is good, we now want to initialize our cheating token 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * which one it is initialized is the model for all tokens we manufacture 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver antlr3SetTokenAPI(&factory->unTruc); 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Set some initial variables for future copying 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->unTruc.factoryMade = ANTLR3_TRUE; 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Input stream 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setInputStream(factory, input); 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return factory; 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 137324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetInputStream (pANTLR3_TOKEN_FACTORY factory, pANTLR3_INPUT_STREAM input) 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->input = input; 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->unTruc.input = input; 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (input != NULL) 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->unTruc.strFactory = input->strFactory; 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->unTruc.strFactory = NULL; 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 152324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernewPool(pANTLR3_TOKEN_FACTORY factory) 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Increment factory count 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->thisPool++; 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // If we were reusing this token factory then we may already have a pool 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // allocated. If we exceeded the max avaible then we must allocate a new 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // one. 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (factory->thisPool > factory->maxPool) 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Ensure we have enough pointers allocated 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->pools = (pANTLR3_COMMON_TOKEN *) 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_REALLOC( (void *)factory->pools, /* Current pools pointer (starts at NULL) */ 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (ANTLR3_UINT32)((factory->thisPool + 1) * sizeof(pANTLR3_COMMON_TOKEN *)) /* Memory for new pool pointers */ 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ); 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Allocate a new pool for the factory 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->pools[factory->thisPool] = 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (pANTLR3_COMMON_TOKEN) 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_CALLOC(1, (size_t)(sizeof(ANTLR3_COMMON_TOKEN) * ANTLR3_FACTORY_POOL_SIZE)); 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // We now have a new pool and can track it as the maximum we have created so far 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->maxPool = factory->thisPool; 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Reset the counters 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->nextToken = 0; 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Done 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_COMMON_TOKEN 191324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernewPoolToken(pANTLR3_TOKEN_FACTORY factory) 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_COMMON_TOKEN token; 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* See if we need a new token pool before allocating a new 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * one 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (factory->nextToken >= ANTLR3_FACTORY_POOL_SIZE) 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* We ran out of tokens in the current pool, so we need a new pool 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newPool(factory); 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Assuming everything went well (we are trying for performance here so doing minimal 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * error checking. Then we can work out what the pointer is to the next token. 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token = factory->pools[factory->thisPool] + factory->nextToken; 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->nextToken++; 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* We have our token pointer now, so we can initialize it to the predefined model. 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * We only need do this though if the token is not already initialized, we just check 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * an api function pointer for this as they are allocated via calloc. 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (token->setStartIndex == NULL) 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver antlr3SetTokenAPI(token); 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // It is factory made, and we need to copy the string factory pointer 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->factoryMade = ANTLR3_TRUE; 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->strFactory = factory->input == NULL ? NULL : factory->input->strFactory; 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->input = factory->input; 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* And we are done 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return token; 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 232324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfactoryReset (pANTLR3_TOKEN_FACTORY factory) 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Just start again with pool #0 when we are 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // called. 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->thisPool = -1; 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newPool(factory); 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 242324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfactoryClose (pANTLR3_TOKEN_FACTORY factory) 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_COMMON_TOKEN pool; 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_INT32 poolCount; 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 limit; 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 token; 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_COMMON_TOKEN check; 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* We iterate the token pools one at a time 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (poolCount = 0; poolCount <= factory->thisPool; poolCount++) 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Pointer to current pool 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pool = factory->pools[poolCount]; 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Work out how many tokens we need to check in this pool. 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver limit = (poolCount == factory->thisPool ? factory->nextToken : ANTLR3_FACTORY_POOL_SIZE); 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Marginal condition, we might be at the start of a brand new pool 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * where the nextToken is 0 and nothing has been allocated. 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (limit > 0) 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* We have some tokens allocated from this pool 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (token = 0; token < limit; token++) 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Next one in the chain 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver check = pool + token; 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* If the programmer made this a custom token, then 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * see if we need to call their free routine. 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (check->custom != NULL && check->freeCustom != NULL) 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver check->freeCustom(check->custom); 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver check->custom = NULL; 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* We can now free this pool allocation 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FREE(factory->pools[poolCount]); 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->pools[poolCount] = NULL; 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* All the pools are deallocated we can free the pointers to the pools 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * now. 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FREE(factory->pools); 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Finally, we can free the space for the factory itself 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FREE(factory); 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_COMMON_TOKEN 304324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernewToken(void) 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_COMMON_TOKEN token; 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Allocate memory for this 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token = (pANTLR3_COMMON_TOKEN) ANTLR3_CALLOC(1, (size_t)(sizeof(ANTLR3_COMMON_TOKEN))); 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (token == NULL) 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return NULL; 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Install the API 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver antlr3SetTokenAPI(token); 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->factoryMade = ANTLR3_FALSE; 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return token; 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 325324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API void 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3SetTokenAPI(pANTLR3_COMMON_TOKEN token) 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->getText = getText; 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->setText = setText; 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->setText8 = setText8; 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->getType = getType; 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->setType = setType; 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->getLine = getLine; 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->setLine = setLine; 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->setLine = setLine; 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->getCharPositionInLine = getCharPositionInLine; 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->setCharPositionInLine = setCharPositionInLine; 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->getChannel = getChannel; 339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->setChannel = setChannel; 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->getTokenIndex = getTokenIndex; 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->setTokenIndex = setTokenIndex; 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->getStartIndex = getStartIndex; 343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->setStartIndex = setStartIndex; 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->getStopIndex = getStopIndex; 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->setStopIndex = setStopIndex; 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->toString = toString; 347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_STRING getText (pANTLR3_COMMON_TOKEN token) 352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver switch (token->textState) 354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case ANTLR3_TEXT_STRING: 356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Someone already created a string for this token, so we just 358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // use it. 359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return token->tokText.text; 361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case ANTLR3_TEXT_CHARP: 364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // We had a straight text pointer installed, now we 366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // must convert it to a string. Note we have to do this here 367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // or otherwise setText8() will just install the same char* 368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (token->strFactory != NULL) 370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->tokText.text = token->strFactory->newStr8(token->strFactory, (pANTLR3_UINT8)token->tokText.chars); 372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->textState = ANTLR3_TEXT_STRING; 373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return token->tokText.text; 374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // We cannot do anything here 378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return NULL; 380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default: 384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // EOF is a special case 386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (token->type == ANTLR3_TOKEN_EOF) 388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->tokText.text = token->strFactory->newStr8(token->strFactory, (pANTLR3_UINT8)"<EOF>"); 390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->textState = ANTLR3_TEXT_STRING; 391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->tokText.text->factory = token->strFactory; 392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return token->tokText.text; 393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // We had nothing installed in the token, create a new string 397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // from the input stream 398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (token->input != NULL) 401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return token->input->substr( token->input, 404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->getStartIndex(token), 405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->getStopIndex(token) 406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ); 407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Nothing to return, there is no input stream 410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return NULL; 412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setText8 (pANTLR3_COMMON_TOKEN token, pANTLR3_UINT8 text) 416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // No text to set, so ignore 418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (text == NULL) return; 420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver switch (token->textState) 422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case ANTLR3_TEXT_NONE: 424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case ANTLR3_TEXT_CHARP: // Caller must free before setting again, if it needs to be freed 425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Nothing in there yet, or just a char *, so just set the 427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // text as a pointer 428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->textState = ANTLR3_TEXT_CHARP; 430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->tokText.chars = (pANTLR3_UCHAR)text; 431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default: 434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // It was already a pANTLR3_STRING, so just override it 436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->tokText.text->set8(token->tokText.text, (const char *)text); 438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // We are done 442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Install the supplied text string as teh text for the token. 447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The method assumes that the existing text (if any) was created by a factory 448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * and so does not attempt to release any memory it is using.Text not created 449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * by a string fctory (not advised) should be released prior to this call. 450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setText (pANTLR3_COMMON_TOKEN token, pANTLR3_STRING text) 452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Merely replaces and existing pre-defined text with the supplied 454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // string 455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->textState = ANTLR3_TEXT_STRING; 457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->tokText.text = text; 458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* We are done 460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32 getType (pANTLR3_COMMON_TOKEN token) 465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return token->type; 467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setType (pANTLR3_COMMON_TOKEN token, ANTLR3_UINT32 type) 470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->type = type; 472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32 getLine (pANTLR3_COMMON_TOKEN token) 475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return token->line; 477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setLine (pANTLR3_COMMON_TOKEN token, ANTLR3_UINT32 line) 480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->line = line; 482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_INT32 getCharPositionInLine (pANTLR3_COMMON_TOKEN token) 485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return token->charPosition; 487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setCharPositionInLine (pANTLR3_COMMON_TOKEN token, ANTLR3_INT32 pos) 490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->charPosition = pos; 492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32 getChannel (pANTLR3_COMMON_TOKEN token) 495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return token->channel; 497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setChannel (pANTLR3_COMMON_TOKEN token, ANTLR3_UINT32 channel) 500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->channel = channel; 502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_MARKER getTokenIndex (pANTLR3_COMMON_TOKEN token) 505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return token->index; 507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setTokenIndex (pANTLR3_COMMON_TOKEN token, ANTLR3_MARKER index) 510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->index = index; 512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_MARKER getStartIndex (pANTLR3_COMMON_TOKEN token) 515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return token->start == -1 ? (ANTLR3_MARKER)(token->input->data) : token->start; 517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setStartIndex (pANTLR3_COMMON_TOKEN token, ANTLR3_MARKER start) 520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->start = start; 522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_MARKER getStopIndex (pANTLR3_COMMON_TOKEN token) 525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return token->stop; 527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setStopIndex (pANTLR3_COMMON_TOKEN token, ANTLR3_MARKER stop) 530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->stop = stop; 532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_STRING toString (pANTLR3_COMMON_TOKEN token) 535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_STRING text; 537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_STRING outtext; 538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver text = token->getText(token); 540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (text == NULL) 542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return NULL; 544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (text->factory == NULL) 547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return text; // This usally means it is the EOF token 549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* A new empty string to assemble all the stuff in 552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outtext = text->factory->newRaw(text->factory); 554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Now we use our handy dandy string utility to assemble the 556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the reporting string 557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * return "[@"+getTokenIndex()+","+start+":"+stop+"='"+txt+"',<"+type+">"+channelStr+","+line+":"+getCharPositionInLine()+"]"; 558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outtext->append8(outtext, "[Index: "); 560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outtext->addi (outtext, (ANTLR3_INT32)token->getTokenIndex(token)); 561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outtext->append8(outtext, " (Start: "); 562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outtext->addi (outtext, (ANTLR3_INT32)token->getStartIndex(token)); 563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outtext->append8(outtext, "-Stop: "); 564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outtext->addi (outtext, (ANTLR3_INT32)token->getStopIndex(token)); 565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outtext->append8(outtext, ") ='"); 566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outtext->appendS(outtext, text); 567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outtext->append8(outtext, "', type<"); 568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outtext->addi (outtext, token->type); 569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outtext->append8(outtext, "> "); 570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (token->getChannel(token) > ANTLR3_TOKEN_DEFAULT_CHANNEL) 572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outtext->append8(outtext, "(channel = "); 574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outtext->addi (outtext, (ANTLR3_INT32)token->getChannel(token)); 575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outtext->append8(outtext, ") "); 576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outtext->append8(outtext, "Line: "); 579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outtext->addi (outtext, (ANTLR3_INT32)token->getLine(token)); 580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outtext->append8(outtext, " LinePos:"); 581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outtext->addi (outtext, token->getCharPositionInLine(token)); 582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outtext->addc (outtext, ']'); 583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return outtext; 585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 587