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