1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \file
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Implementation of the ANTLR3 string and string factory classes
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// [The "BSD licence"]
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.temporal-wave.com
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.linkedin.com/in/jimidle
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// All rights reserved.
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Redistribution and use in source and binary forms, with or without
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// modification, are permitted provided that the following conditions
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// are met:
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1. Redistributions of source code must retain the above copyright
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    notice, this list of conditions and the following disclaimer.
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 2. Redistributions in binary form must reproduce the above copyright
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    notice, this list of conditions and the following disclaimer in the
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    documentation and/or other materials provided with the distribution.
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3. The name of the author may not be used to endorse or promote products
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    derived from this software without specific prior written permission.
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include    <antlr3string.h>
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Factory API
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_STRING    newRaw8	(pANTLR3_STRING_FACTORY factory);
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_STRING    newRawUTF16	(pANTLR3_STRING_FACTORY factory);
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_STRING    newSize8	(pANTLR3_STRING_FACTORY factory, ANTLR3_UINT32 size);
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_STRING    newSizeUTF16	(pANTLR3_STRING_FACTORY factory, ANTLR3_UINT32 size);
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_STRING    newPtr8	(pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 string, ANTLR3_UINT32 size);
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_STRING    newPtrUTF16_8	(pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 string, ANTLR3_UINT32 size);
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_STRING    newPtrUTF16_UTF16	(pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 string, ANTLR3_UINT32 size);
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_STRING    newStr8	(pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 string);
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_STRING    newStrUTF16_8	(pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 string);
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_STRING    newStrUTF16_UTF16	(pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 string);
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    void		    destroy	(pANTLR3_STRING_FACTORY factory, pANTLR3_STRING string);
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_STRING    printable8	(pANTLR3_STRING_FACTORY factory, pANTLR3_STRING string);
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_STRING    printableUTF16	(pANTLR3_STRING_FACTORY factory, pANTLR3_STRING string);
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    void		    closeFactory(pANTLR3_STRING_FACTORY factory);
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* String API
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_UINT8	    set8	(pANTLR3_STRING string, const char * chars);
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_UINT8	    setUTF16_8	(pANTLR3_STRING string, const char * chars);
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_UINT8	    setUTF16_UTF16	(pANTLR3_STRING string, const char * chars);
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_UINT8	    append8	(pANTLR3_STRING string, const char * newbit);
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_UINT8	    appendUTF16_8	(pANTLR3_STRING string, const char * newbit);
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_UINT8	    appendUTF16_UTF16	(pANTLR3_STRING string, const char * newbit);
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	  pANTLR3_UINT8	    insert8	(pANTLR3_STRING string, ANTLR3_UINT32 point, const char * newbit);
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	  pANTLR3_UINT8	    insertUTF16_8	(pANTLR3_STRING string, ANTLR3_UINT32 point, const char * newbit);
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	  pANTLR3_UINT8	    insertUTF16_UTF16	(pANTLR3_STRING string, ANTLR3_UINT32 point, const char * newbit);
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_UINT8	    setS	(pANTLR3_STRING string, pANTLR3_STRING chars);
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_UINT8	    appendS	(pANTLR3_STRING string, pANTLR3_STRING newbit);
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	  pANTLR3_UINT8	    insertS	(pANTLR3_STRING string, ANTLR3_UINT32 point, pANTLR3_STRING newbit);
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_UINT8	    addc8	(pANTLR3_STRING string, ANTLR3_UINT32 c);
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_UINT8	    addcUTF16	(pANTLR3_STRING string, ANTLR3_UINT32 c);
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_UINT8	    addi8	(pANTLR3_STRING string, ANTLR3_INT32 i);
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_UINT8	    addiUTF16	(pANTLR3_STRING string, ANTLR3_INT32 i);
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	  pANTLR3_UINT8	    inserti8	(pANTLR3_STRING string, ANTLR3_UINT32 point, ANTLR3_INT32 i);
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	  pANTLR3_UINT8	    insertiUTF16	(pANTLR3_STRING string, ANTLR3_UINT32 point, ANTLR3_INT32 i);
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    ANTLR3_UINT32     compare8	(pANTLR3_STRING string, const char * compStr);
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    ANTLR3_UINT32     compareUTF16_8	(pANTLR3_STRING string, const char * compStr);
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    ANTLR3_UINT32     compareUTF16_UTF16(pANTLR3_STRING string, const char * compStr);
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    ANTLR3_UINT32     compareS	(pANTLR3_STRING string, pANTLR3_STRING compStr);
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    ANTLR3_UCHAR      charAt8	(pANTLR3_STRING string, ANTLR3_UINT32 offset);
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    ANTLR3_UCHAR      charAtUTF16	(pANTLR3_STRING string, ANTLR3_UINT32 offset);
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_STRING    subString8	(pANTLR3_STRING string, ANTLR3_UINT32 startIndex, ANTLR3_UINT32 endIndex);
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_STRING    subStringUTF16	(pANTLR3_STRING string, ANTLR3_UINT32 startIndex, ANTLR3_UINT32 endIndex);
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	  ANTLR3_INT32	    toInt32_8	(pANTLR3_STRING string);
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	  ANTLR3_INT32	    toInt32_UTF16  (pANTLR3_STRING string);
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	  pANTLR3_STRING    to8_8		(pANTLR3_STRING string);
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	  pANTLR3_STRING    to8_UTF16		(pANTLR3_STRING string);
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_STRING		toUTF8_8	(pANTLR3_STRING string);
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_STRING		toUTF8_UTF16	(pANTLR3_STRING string);
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Local helpers
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void			stringInit8	(pANTLR3_STRING string);
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void			stringInitUTF16	(pANTLR3_STRING string);
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void	ANTLR3_CDECL	stringFree	(pANTLR3_STRING string);
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
97324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API pANTLR3_STRING_FACTORY
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3StringFactoryNew(ANTLR3_UINT32 encoding)
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_STRING_FACTORY  factory;
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* Allocate memory
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	*/
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	factory	= (pANTLR3_STRING_FACTORY) ANTLR3_CALLOC(1, sizeof(ANTLR3_STRING_FACTORY));
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(factory == NULL)
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	NULL;
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* Now we make a new list to track the strings.
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	*/
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	factory->strings	= antlr3VectorNew(0);
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	factory->index	= 0;
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(factory->strings == NULL)
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ANTLR3_FREE(factory);
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	NULL;
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Install the API
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // TODO: These encodings need equivalent functions to
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // UTF16 and 8Bit if I am going to support those encodings in the STRING stuff.
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// The STRING stuff was intended as a quick and dirty hack for people that did not
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// want to worry about memory and performance very much, but nobody ever reads the
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// notes or comments or uses the email list search. I want to discourage using these
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// interfaces as it is much more efficient to use the pointers within the tokens
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// directly, so I am not implementing the string stuff for the newer encodings.
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // We install the standard 8 and 16 bit functions for the UTF 8 and 16 but they
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// will not be useful beyond returning the text.
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    switch(encoding)
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		case    ANTLR3_ENC_UTF32:
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			break;
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		case    ANTLR3_ENC_UTF32BE:
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			break;
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		case    ANTLR3_ENC_UTF32LE:
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			break;
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		case    ANTLR3_ENC_UTF16BE:
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		case    ANTLR3_ENC_UTF16LE:
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		case    ANTLR3_ENC_UTF16:
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			factory->newRaw	    =  newRawUTF16;
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			factory->newSize	=  newSizeUTF16;
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			factory->newPtr	    =  newPtrUTF16_UTF16;
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			factory->newPtr8	=  newPtrUTF16_8;
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			factory->newStr	    =  newStrUTF16_UTF16;
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			factory->newStr8	=  newStrUTF16_8;
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			factory->printable	=  printableUTF16;
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			factory->destroy	=  destroy;
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			factory->close	    =  closeFactory;
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			break;
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		case    ANTLR3_ENC_UTF8:
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		case    ANTLR3_ENC_EBCDIC:
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		case    ANTLR3_ENC_8BIT:
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		default:
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			factory->newRaw	    =  newRaw8;
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			factory->newSize	=  newSize8;
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			factory->newPtr	    =  newPtr8;
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			factory->newPtr8	=  newPtr8;
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			factory->newStr	    =  newStr8;
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			factory->newStr8	=  newStr8;
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			factory->printable	=  printable8;
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			factory->destroy	=  destroy;
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			factory->close	    =  closeFactory;
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			break;
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return  factory;
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/**
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param factory
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \return
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_STRING
186324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernewRaw8	(pANTLR3_STRING_FACTORY factory)
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_STRING  string;
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string  = (pANTLR3_STRING) ANTLR3_MALLOC(sizeof(ANTLR3_STRING));
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(string == NULL)
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	NULL;
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Structure is allocated, now fill in the API etc.
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    stringInit8(string);
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->factory = factory;
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Add the string into the allocated list
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    factory->strings->set(factory->strings, factory->index, (void *) string, (void (ANTLR3_CDECL *)(void *))(stringFree), ANTLR3_TRUE);
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->index   = factory->index++;
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return string;
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/**
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param factory
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \return
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_STRING
215324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernewRawUTF16	(pANTLR3_STRING_FACTORY factory)
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_STRING  string;
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string  = (pANTLR3_STRING) ANTLR3_MALLOC(sizeof(ANTLR3_STRING));
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(string == NULL)
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	NULL;
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Structure is allocated, now fill in the API etc.
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    stringInitUTF16(string);
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->factory = factory;
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Add the string into the allocated list
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    factory->strings->set(factory->strings, factory->index, (void *) string, (void (ANTLR3_CDECL *)(void *))(stringFree), ANTLR3_TRUE);
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->index   = factory->index++;
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return string;
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervoid	ANTLR3_CDECL stringFree  (pANTLR3_STRING string)
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* First free the string itself if there was anything in it
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(string->chars)
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_FREE(string->chars);
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Now free the space for this string
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_FREE(string);
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return;
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/**
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param string
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \return
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
260324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverstringInit8  (pANTLR3_STRING string)
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->len			= 0;
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->size		= 0;
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->chars		= NULL;
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->encoding	= ANTLR3_ENC_8BIT ;
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* API for 8 bit strings*/
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->set		= set8;
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->set8	= set8;
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->append	= append8;
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->append8	= append8;
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->insert	= insert8;
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->insert8	= insert8;
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->addi	= addi8;
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->inserti	= inserti8;
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->addc	= addc8;
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->charAt	= charAt8;
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->compare	= compare8;
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->compare8	= compare8;
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->subString	= subString8;
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->toInt32	= toInt32_8;
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->to8		= to8_8;
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->toUTF8	= toUTF8_8;
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->compareS	= compareS;
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->setS	= setS;
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->appendS	= appendS;
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->insertS	= insertS;
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/**
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param string
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \return
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
297324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverstringInitUTF16  (pANTLR3_STRING string)
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->len		= 0;
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->size	= 0;
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->chars	= NULL;
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->encoding	= ANTLR3_ENC_8BIT;
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* API for UTF16 strings */
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->set		= setUTF16_UTF16;
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->set8	= setUTF16_8;
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->append	= appendUTF16_UTF16;
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->append8	= appendUTF16_8;
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->insert	= insertUTF16_UTF16;
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->insert8	= insertUTF16_8;
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->addi	= addiUTF16;
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->inserti	= insertiUTF16;
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->addc	= addcUTF16;
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->charAt	= charAtUTF16;
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->compare	= compareUTF16_UTF16;
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->compare8	= compareUTF16_8;
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->subString	= subStringUTF16;
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->toInt32	= toInt32_UTF16;
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->to8		= to8_UTF16;
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->toUTF8	= toUTF8_UTF16;
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->compareS	= compareS;
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->setS	= setS;
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->appendS	= appendS;
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->insertS	= insertS;
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/**
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param string
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \return
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * TODO: Implement UTF-8
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
335324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverstringInitUTF8  (pANTLR3_STRING string)
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->len	    = 0;
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->size    = 0;
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->chars   = NULL;
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* API */
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Convert an 8 bit string into a UTF8 representation, which is in fact just the string itself
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// a memcpy as we make no assumptions about the 8 bit encoding.
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_STRING
349324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertoUTF8_8	(pANTLR3_STRING string)
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return string->factory->newPtr(string->factory, (pANTLR3_UINT8)(string->chars), string->len);
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Convert a UTF16 string into a UTF8 representation using the Unicode.org
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// supplied C algorithms, which are now contained within the ANTLR3 C runtime
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// as permitted by the Unicode license (within the source code antlr3convertutf.c/.h
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// UCS2 has the same encoding as UTF16 so we can use UTF16 converter.
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_STRING
360324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertoUTF8_UTF16	(pANTLR3_STRING string)
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    UTF8	      * outputEnd;
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    UTF16	      * inputEnd;
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_STRING	utf8String;
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ConversionResult	cResult;
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Allocate the output buffer, which needs to accommodate potentially
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // 3X (in bytes) the input size (in chars).
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    utf8String	= string->factory->newStr8(string->factory, (pANTLR3_UINT8)"");
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(utf8String != NULL)
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // Free existing allocation
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        //
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ANTLR3_FREE(utf8String->chars);
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // Reallocate according to maximum expected size
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        //
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        utf8String->size	= string->len *3;
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        utf8String->chars	= (pANTLR3_UINT8)ANTLR3_MALLOC(utf8String->size +1);
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if	(utf8String->chars != NULL)
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            inputEnd  = (UTF16 *)	(string->chars);
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            outputEnd = (UTF8 *)	(utf8String->chars);
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // Call the Unicode converter
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            //
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            cResult =  ConvertUTF16toUTF8
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                (
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                (const UTF16**)&inputEnd,
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ((const UTF16 *)(string->chars)) + string->len,
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                &outputEnd,
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                outputEnd + utf8String->size - 1,
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                lenientConversion
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                );
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // We don't really care if things failed or not here, we just converted
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // everything that was vaguely possible and stopped when it wasn't. It is
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // up to the grammar programmer to verify that the input is sensible.
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            //
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            utf8String->len = ANTLR3_UINT32_CAST(((pANTLR3_UINT8)outputEnd) - utf8String->chars);
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            *(outputEnd+1) = '\0';		// Always null terminate
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return utf8String;
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/**
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Creates a new string with enough capacity for size 8 bit characters plus a terminator.
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] factory - Pointer to the string factory that owns strings
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] size - In characters
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \return pointer to the new string.
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_STRING
421324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernewSize8	(pANTLR3_STRING_FACTORY factory, ANTLR3_UINT32 size)
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_STRING  string;
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string  = factory->newRaw(factory);
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(string == NULL)
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return	string;
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Always add one more byte for a terminator ;-)
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    */
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->chars	= (pANTLR3_UINT8) ANTLR3_MALLOC((size_t)(sizeof(ANTLR3_UINT8) * (size+1)));
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *(string->chars)	= '\0';
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->size	= size + 1;
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return string;
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/**
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Creates a new string with enough capacity for size UTF16 characters plus a terminator.
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] factory - Pointer to the string factory that owns strings
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] size - In characters (count double for surrogate pairs!!!)
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \return pointer to the new string.
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_STRING
449324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernewSizeUTF16	(pANTLR3_STRING_FACTORY factory, ANTLR3_UINT32 size)
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_STRING  string;
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string  = factory->newRaw(factory);
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(string == NULL)
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return	string;
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Always add one more byte for a terminator ;-)
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    */
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->chars	= (pANTLR3_UINT8) ANTLR3_MALLOC((size_t)(sizeof(ANTLR3_UINT16) * (size+1)));
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *(string->chars)	= '\0';
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->size	= size+1;	/* Size is always in characters, as is len */
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return string;
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Creates a new 8 bit string initialized with the 8 bit characters at the
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  supplied ptr, of pre-determined size.
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] factory - Pointer to the string factory that owns the strings
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] ptr - Pointer to 8 bit encoded characters
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \return pointer to the new string
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_STRING
476324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernewPtr8	(pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 ptr, ANTLR3_UINT32 size)
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_STRING  string;
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	string  = factory->newSize(factory, size);
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(string == NULL)
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	NULL;
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(size <= 0)
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	string;
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(ptr != NULL)
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ANTLR3_MEMMOVE(string->chars, (const void *)ptr, size);
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		*(string->chars + size) = '\0';	    /* Terminate, these strings are usually used for Token streams and printing etc.	*/
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		string->len = size;
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return  string;
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Creates a new UTF16 string initialized with the 8 bit characters at the
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  supplied 8 bit character ptr, of pre-determined size.
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] factory - Pointer to the string factory that owns the strings
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] ptr - Pointer to 8 bit encoded characters
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \return pointer to the new string
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_STRING
509324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernewPtrUTF16_8	(pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 ptr, ANTLR3_UINT32 size)
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_STRING  string;
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* newSize accepts size in characters, not bytes
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	*/
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	string  = factory->newSize(factory, size);
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(string == NULL)
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	NULL;
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(size <= 0)
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	string;
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(ptr != NULL)
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		pANTLR3_UINT16	out;
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ANTLR3_INT32    inSize;
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		out = (pANTLR3_UINT16)(string->chars);
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		inSize	= size;
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		while	(inSize-- > 0)
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			*out++ = (ANTLR3_UINT16)(*ptr++);
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/* Terminate, these strings are usually used for Token streams and printing etc.
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		*/
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		*(((pANTLR3_UINT16)(string->chars)) + size) = '\0';
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		string->len = size;
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return  string;
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Creates a new UTF16 string initialized with the UTF16 characters at the
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  supplied ptr, of pre-determined size.
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] factory - Pointer to the string factory that owns the strings
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] ptr - Pointer to UTF16 encoded characters
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \return pointer to the new string
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_STRING
557324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernewPtrUTF16_UTF16	(pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 ptr, ANTLR3_UINT32 size)
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_STRING  string;
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	string  = factory->newSize(factory, size);
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(string == NULL)
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	NULL;
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(size <= 0)
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	string;
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(ptr != NULL)
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ANTLR3_MEMMOVE(string->chars, (const void *)ptr, (size * sizeof(ANTLR3_UINT16)));
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/* Terminate, these strings are usually used for Token streams and printing etc.
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		*/
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		*(((pANTLR3_UINT16)(string->chars)) + size) = '\0';
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		string->len = size;
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return  string;
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Create a new 8 bit string from the supplied, null terminated, 8 bit string pointer.
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] factory - Pointer to the string factory that owns strings.
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] ptr - Pointer to the 8 bit encoded string
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \return Pointer to the newly initialized string
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_STRING
592324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernewStr8	(pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 ptr)
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return factory->newPtr8(factory, ptr, (ANTLR3_UINT32)strlen((const char *)ptr));
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Create a new UTF16 string from the supplied, null terminated, 8 bit string pointer.
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] factory - Pointer to the string factory that owns strings.
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] ptr - Pointer to the 8 bit encoded string
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \return POinter to the newly initialized string
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_STRING
603324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernewStrUTF16_8	(pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 ptr)
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return factory->newPtr8(factory, ptr, (ANTLR3_UINT32)strlen((const char *)ptr));
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Create a new UTF16 string from the supplied, null terminated, UTF16 string pointer.
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] factory - Pointer to the string factory that owns strings.
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] ptr - Pointer to the UTF16 encoded string
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \return Pointer to the newly initialized string
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_STRING
614324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernewStrUTF16_UTF16	(pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 ptr)
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT16  in;
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32   count;
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** First, determine the length of the input string
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    in	    = (pANTLR3_UINT16)ptr;
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    count   = 0;
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    while   (*in++ != '\0')
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		count++;
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return factory->newPtr(factory, ptr, count);
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    void
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdestroy	(pANTLR3_STRING_FACTORY factory, pANTLR3_STRING string)
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Record which string we are deleting
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32 strIndex = string->index;
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Ensure that the string was not factory made, or we would try
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // to delete memory that wasn't allocated outside the factory
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // block.
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Remove the specific indexed string from the vector
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    factory->strings->del(factory->strings, strIndex);
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // One less string in the vector, so decrement the factory index
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // so that the next string allocated is indexed correctly with
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // respect to the vector.
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    factory->index--;
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Now we have to reindex the strings in the vector that followed
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // the one we just deleted. We only do this if the one we just deleted
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // was not the last one.
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if  (strIndex< factory->index)
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // We must reindex the strings after the one we just deleted.
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // The one that follows the one we just deleted is also out
659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // of whack, so we start there.
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        //
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ANTLR3_UINT32 i;
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for (i = strIndex; i < factory->index; i++)
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // Renumber the entry
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            //
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ((pANTLR3_STRING)(factory->strings->elements[i].element))->index = i;
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // The string has been destroyed and the elements of the factory are reindexed.
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_STRING
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprintable8(pANTLR3_STRING_FACTORY factory, pANTLR3_STRING instr)
678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_STRING  string;
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* We don't need to be too efficient here, this is mostly for error messages and so on.
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT8   scannedText;
684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32   i;
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Assume we need as much as twice as much space to parse out the control characters
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string  = factory->newSize(factory, instr->len *2 + 1);
689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Scan through and replace unprintable (in terms of this routine)
691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * characters
692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    scannedText = string->chars;
694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for	(i = 0; i < instr->len; i++)
696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if (*(instr->chars + i) == '\n')
698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			*scannedText++ = '\\';
700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			*scannedText++ = 'n';
701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		else if (*(instr->chars + i) == '\r')
703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			*scannedText++ = '\\';
705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			*scannedText++ = 'r';
706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		else if	(!isprint(*(instr->chars +i)))
708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			*scannedText++ = '?';
710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		else
712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			*scannedText++ = *(instr->chars + i);
714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *scannedText  = '\0';
717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->len	= (ANTLR3_UINT32)(scannedText - string->chars);
719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  string;
721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_STRING
724324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverprintableUTF16(pANTLR3_STRING_FACTORY factory, pANTLR3_STRING instr)
725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_STRING  string;
727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* We don't need to be too efficient here, this is mostly for error messages and so on.
729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT16  scannedText;
731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT16  inText;
732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32   i;
733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32   outLen;
734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Assume we need as much as twice as much space to parse out the control characters
736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string  = factory->newSize(factory, instr->len *2 + 1);
738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Scan through and replace unprintable (in terms of this routine)
740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * characters
741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    scannedText = (pANTLR3_UINT16)(string->chars);
743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    inText	= (pANTLR3_UINT16)(instr->chars);
744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    outLen	= 0;
745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for	(i = 0; i < instr->len; i++)
747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if (*(inText + i) == '\n')
749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			*scannedText++   = '\\';
751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			*scannedText++   = 'n';
752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			outLen	    += 2;
753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		else if (*(inText + i) == '\r')
755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			*scannedText++   = '\\';
757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			*scannedText++   = 'r';
758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			outLen	    += 2;
759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		else if	(!isprint(*(inText +i)))
761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			*scannedText++ = '?';
763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			outLen++;
764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		else
766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			*scannedText++ = *(inText + i);
768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			outLen++;
769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *scannedText  = '\0';
772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->len	= outLen;
774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  string;
776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Fascist Capitalist Pig function created
779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  to oppress the workers comrade.
780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    void
782324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercloseFactory	(pANTLR3_STRING_FACTORY factory)
783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Delete the vector we were tracking the strings with, this will
785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * causes all the allocated strings to be deallocated too
786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    factory->strings->free(factory->strings);
788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Delete the space for the factory itself
790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_FREE((void *)factory);
792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_UINT8
795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverappend8	(pANTLR3_STRING string, const char * newbit)
796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32 len;
798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    len	= (ANTLR3_UINT32)strlen(newbit);
800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(string->size < (string->len + len + 1))
802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		string->chars	= (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(string->len + len + 1));
804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		string->size	= string->len + len + 1;
805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Note we copy one more byte than the strlen in order to get the trailing
808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_MEMMOVE((void *)(string->chars + string->len), newbit, (ANTLR3_UINT32)(len+1));
810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->len	+= len;
811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return string->chars;
813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_UINT8
816324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverappendUTF16_8	(pANTLR3_STRING string, const char * newbit)
817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32   len;
819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT16  apPoint;
820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32   count;
821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    len	= (ANTLR3_UINT32)strlen(newbit);
823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(string->size < (string->len + len + 1))
825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		string->chars	= (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)((sizeof(ANTLR3_UINT16)*(string->len + len + 1))));
827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		string->size	= string->len + len + 1;
828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    apPoint = ((pANTLR3_UINT16)string->chars) + string->len;
831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->len	+= len;
832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for	(count = 0; count < len; count++)
834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		*apPoint++   = *(newbit + count);
836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *apPoint = '\0';
838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return string->chars;
840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_UINT8
843324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverappendUTF16_UTF16	(pANTLR3_STRING string, const char * newbit)
844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32 len;
846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT16  in;
847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** First, determine the length of the input string
849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    in	    = (pANTLR3_UINT16)newbit;
851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    len   = 0;
852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    while   (*in++ != '\0')
854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		len++;
856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(string->size < (string->len + len + 1))
859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		string->chars	= (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)( sizeof(ANTLR3_UINT16) *(string->len + len + 1) ));
861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		string->size	= string->len + len + 1;
862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Note we copy one more byte than the strlen in order to get the trailing delimiter
865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_MEMMOVE((void *)(((pANTLR3_UINT16)string->chars) + string->len), newbit, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(len+1)));
867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->len	+= len;
868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return string->chars;
870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_UINT8
873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverset8	(pANTLR3_STRING string, const char * chars)
874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32	len;
876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    len = (ANTLR3_UINT32)strlen(chars);
878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(string->size < len + 1)
879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		string->chars	= (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(len + 1));
881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		string->size	= len + 1;
882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Note we copy one more byte than the strlen in order to get the trailing '\0'
885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_MEMMOVE((void *)(string->chars), chars, (ANTLR3_UINT32)(len+1));
887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->len	    = len;
888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  string->chars;
890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_UINT8
894324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetUTF16_8	(pANTLR3_STRING string, const char * chars)
895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32	len;
897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32	count;
898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT16	apPoint;
899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    len = (ANTLR3_UINT32)strlen(chars);
901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(string->size < len + 1)
902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		string->chars	= (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(len + 1)));
904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		string->size	= len + 1;
905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    apPoint = ((pANTLR3_UINT16)string->chars);
907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->len	= len;
908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for	(count = 0; count < string->len; count++)
910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		*apPoint++   = *(chars + count);
912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *apPoint = '\0';
914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  string->chars;
916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_UINT8
919324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetUTF16_UTF16    (pANTLR3_STRING string, const char * chars)
920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32   len;
922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT16  in;
923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** First, determine the length of the input string
925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    in	    = (pANTLR3_UINT16)chars;
927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    len   = 0;
928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    while   (*in++ != '\0')
930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		len++;
932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(string->size < len + 1)
935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		string->chars	= (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(len + 1)));
937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		string->size	= len + 1;
938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Note we copy one more byte than the strlen in order to get the trailing '\0'
941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_MEMMOVE((void *)(string->chars), chars, (ANTLR3_UINT32)((len+1) * sizeof(ANTLR3_UINT16)));
943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->len	    = len;
944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  string->chars;
946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_UINT8
950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveraddc8	(pANTLR3_STRING string, ANTLR3_UINT32 c)
951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(string->size < string->len + 2)
953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		string->chars	= (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(string->len + 2));
955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		string->size	= string->len + 2;
956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *(string->chars + string->len)	= (ANTLR3_UINT8)c;
958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *(string->chars + string->len + 1)	= '\0';
959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->len++;
960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  string->chars;
962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_UINT8
965324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveraddcUTF16	(pANTLR3_STRING string, ANTLR3_UINT32 c)
966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT16  ptr;
968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(string->size < string->len + 2)
970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		string->chars	= (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16) * (string->len + 2)));
972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		string->size	= string->len + 2;
973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ptr	= (pANTLR3_UINT16)(string->chars);
975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *(ptr + string->len)	= (ANTLR3_UINT16)c;
977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *(ptr + string->len + 1)	= '\0';
978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->len++;
979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  string->chars;
981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_UINT8
984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveraddi8	(pANTLR3_STRING string, ANTLR3_INT32 i)
985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT8	    newbit[32];
987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    sprintf((char *)newbit, "%d", i);
989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  string->append8(string, (const char *)newbit);
991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_UINT8
993324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveraddiUTF16	(pANTLR3_STRING string, ANTLR3_INT32 i)
994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT8	    newbit[32];
996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    sprintf((char *)newbit, "%d", i);
998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  string->append8(string, (const char *)newbit);
1000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	  pANTLR3_UINT8
1003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverinserti8    (pANTLR3_STRING string, ANTLR3_UINT32 point, ANTLR3_INT32 i)
1004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT8	    newbit[32];
1006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    sprintf((char *)newbit, "%d", i);
1008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  string->insert8(string, point, (const char *)newbit);
1009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	  pANTLR3_UINT8
1011324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverinsertiUTF16    (pANTLR3_STRING string, ANTLR3_UINT32 point, ANTLR3_INT32 i)
1012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT8	    newbit[32];
1014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    sprintf((char *)newbit, "%d", i);
1016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  string->insert8(string, point, (const char *)newbit);
1017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_UINT8
1020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverinsert8	(pANTLR3_STRING string, ANTLR3_UINT32 point, const char * newbit)
1021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32	len;
1023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(point >= string->len)
1025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	string->append(string, newbit);
1027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    len	= (ANTLR3_UINT32)strlen(newbit);
1030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(len == 0)
1032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	string->chars;
1034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(string->size < (string->len + len + 1))
1037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		string->chars	= (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(string->len + len + 1));
1039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		string->size	= string->len + len + 1;
1040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Move the characters we are inserting before, including the delimiter
1043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_MEMMOVE((void *)(string->chars + point + len), (void *)(string->chars + point), (ANTLR3_UINT32)(string->len - point + 1));
1045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Note we copy the exact number of bytes
1047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_MEMMOVE((void *)(string->chars + point), newbit, (ANTLR3_UINT32)(len));
1049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->len += len;
1051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  string->chars;
1053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_UINT8
1056324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverinsertUTF16_8	(pANTLR3_STRING string, ANTLR3_UINT32 point, const char * newbit)
1057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32	len;
1059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32	count;
1060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT16	inPoint;
1061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(point >= string->len)
1063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	string->append8(string, newbit);
1065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    len	= (ANTLR3_UINT32)strlen(newbit);
1068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(len == 0)
1070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	string->chars;
1072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(string->size < (string->len + len + 1))
1075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	string->chars	= (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(string->len + len + 1)));
1077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	string->size	= string->len + len + 1;
1078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Move the characters we are inserting before, including the delimiter
1081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_MEMMOVE((void *)(((pANTLR3_UINT16)string->chars) + point + len), (void *)(((pANTLR3_UINT16)string->chars) + point), (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(string->len - point + 1)));
1083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->len += len;
1085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    inPoint = ((pANTLR3_UINT16)(string->chars))+point;
1087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for	(count = 0; count<len; count++)
1088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		*(inPoint + count) = (ANTLR3_UINT16)(*(newbit+count));
1090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  string->chars;
1093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_UINT8
1096324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverinsertUTF16_UTF16	(pANTLR3_STRING string, ANTLR3_UINT32 point, const char * newbit)
1097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32	len;
1099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT16	in;
1100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(point >= string->len)
1102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	string->append(string, newbit);
1104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** First, determine the length of the input string
1107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    in	    = (pANTLR3_UINT16)newbit;
1109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    len	    = 0;
1110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    while   (*in++ != '\0')
1112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		len++;
1114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(len == 0)
1117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	string->chars;
1119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(string->size < (string->len + len + 1))
1122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		string->chars	= (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(string->len + len + 1)));
1124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		string->size	= string->len + len + 1;
1125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Move the characters we are inserting before, including the delimiter
1128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_MEMMOVE((void *)(((pANTLR3_UINT16)string->chars) + point + len), (void *)(((pANTLR3_UINT16)string->chars) + point), (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(string->len - point + 1)));
1130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Note we copy the exact number of characters
1133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_MEMMOVE((void *)(((pANTLR3_UINT16)string->chars) + point), newbit, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(len)));
1135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string->len += len;
1137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  string->chars;
1139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_UINT8	    setS	(pANTLR3_STRING string, pANTLR3_STRING chars)
1142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  string->set(string, (const char *)(chars->chars));
1144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic    pANTLR3_UINT8	    appendS	(pANTLR3_STRING string, pANTLR3_STRING newbit)
1147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* We may be passed an empty string, in which case we just return the current pointer
1149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(newbit == NULL || newbit->len == 0 || newbit->size == 0 || newbit->chars == NULL)
1151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	string->chars;
1153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
1155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return  string->append(string, (const char *)(newbit->chars));
1157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	  pANTLR3_UINT8	    insertS	(pANTLR3_STRING string, ANTLR3_UINT32 point, pANTLR3_STRING newbit)
1161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  string->insert(string, point, (const char *)(newbit->chars));
1163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Function that compares the text of a string to the supplied
1166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 8 bit character string and returns a result a la strcmp()
1167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32
1169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercompare8	(pANTLR3_STRING string, const char * compStr)
1170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  strcmp((const char *)(string->chars), compStr);
1172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Function that compares the text of a string with the supplied character string
1175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * (which is assumed to be in the same encoding as the string itself) and returns a result
1176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * a la strcmp()
1177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32
1179324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercompareUTF16_8	(pANTLR3_STRING string, const char * compStr)
1180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT16  ourString;
1182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32   charDiff;
1183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ourString	= (pANTLR3_UINT16)(string->chars);
1185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    while   (((ANTLR3_UCHAR)(*ourString) != '\0') && ((ANTLR3_UCHAR)(*compStr) != '\0'))
1187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		charDiff = *ourString - *compStr;
1189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if  (charDiff != 0)
1190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
1191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			return charDiff;
1192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
1193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ourString++;
1194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		compStr++;
1195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* At this point, one of the strings was terminated
1198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return (ANTLR3_UINT32)((ANTLR3_UCHAR)(*ourString) - (ANTLR3_UCHAR)(*compStr));
1200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Function that compares the text of a string with the supplied character string
1204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * (which is assumed to be in the same encoding as the string itself) and returns a result
1205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * a la strcmp()
1206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32
1208324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercompareUTF16_UTF16	(pANTLR3_STRING string, const char * compStr8)
1209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT16  ourString;
1211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT16  compStr;
1212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32   charDiff;
1213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ourString	= (pANTLR3_UINT16)(string->chars);
1215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compStr	= (pANTLR3_UINT16)(compStr8);
1216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    while   (((ANTLR3_UCHAR)(*ourString) != '\0') && ((ANTLR3_UCHAR)(*((pANTLR3_UINT16)compStr)) != '\0'))
1218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		charDiff = *ourString - *compStr;
1220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if  (charDiff != 0)
1221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
1222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			return charDiff;
1223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
1224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ourString++;
1225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		compStr++;
1226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* At this point, one of the strings was terminated
1229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return (ANTLR3_UINT32)((ANTLR3_UCHAR)(*ourString) - (ANTLR3_UCHAR)(*compStr));
1231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Function that compares the text of a string with the supplied string
1234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * (which is assumed to be in the same encoding as the string itself) and returns a result
1235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * a la strcmp()
1236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32
1238324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercompareS    (pANTLR3_STRING string, pANTLR3_STRING compStr)
1239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  string->compare(string, (const char *)compStr->chars);
1241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Function that returns the character indexed at the supplied
1245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * offset as a 32 bit character.
1246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UCHAR
1248324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercharAt8	    (pANTLR3_STRING string, ANTLR3_UINT32 offset)
1249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(offset > string->len)
1251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return (ANTLR3_UCHAR)'\0';
1253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
1255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return  (ANTLR3_UCHAR)(*(string->chars + offset));
1257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Function that returns the character indexed at the supplied
1261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * offset as a 32 bit character.
1262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UCHAR
1264324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercharAtUTF16    (pANTLR3_STRING string, ANTLR3_UINT32 offset)
1265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(offset > string->len)
1267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return (ANTLR3_UCHAR)'\0';
1269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
1271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return  (ANTLR3_UCHAR)(*((pANTLR3_UINT16)(string->chars) + offset));
1273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Function that returns a substring of the supplied string a la .subString(s,e)
1277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * in java runtimes.
1278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_STRING
1280324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversubString8   (pANTLR3_STRING string, ANTLR3_UINT32 startIndex, ANTLR3_UINT32 endIndex)
1281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_STRING newStr;
1283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(endIndex > string->len)
1285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		endIndex = string->len + 1;
1287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    newStr  = string->factory->newPtr(string->factory, string->chars + startIndex, endIndex - startIndex);
1289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return newStr;
1291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Returns a substring of the supplied string a la .subString(s,e)
1294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * in java runtimes.
1295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_STRING
1297324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversubStringUTF16  (pANTLR3_STRING string, ANTLR3_UINT32 startIndex, ANTLR3_UINT32 endIndex)
1298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_STRING newStr;
1300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(endIndex > string->len)
1302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		endIndex = string->len + 1;
1304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    newStr  = string->factory->newPtr(string->factory, (pANTLR3_UINT8)((pANTLR3_UINT16)(string->chars) + startIndex), endIndex - startIndex);
1306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return newStr;
1308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Function that can convert the characters in the string to an integer
1311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_INT32
1313324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertoInt32_8	    (struct ANTLR3_STRING_struct * string)
1314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  atoi((const char *)(string->chars));
1316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Function that can convert the characters in the string to an integer
1319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_INT32
1321324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertoInt32_UTF16       (struct ANTLR3_STRING_struct * string)
1322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT16  input;
1324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_INT32   value;
1325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_BOOLEAN  negate;
1326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    value   = 0;
1328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    input   = (pANTLR3_UINT16)(string->chars);
1329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    negate  = ANTLR3_FALSE;
1330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(*input == (ANTLR3_UCHAR)'-')
1332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		negate = ANTLR3_TRUE;
1334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		input++;
1335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else if (*input == (ANTLR3_UCHAR)'+')
1337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		input++;
1339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    while   (*input != '\0' && isdigit(*input))
1342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		value	 = value * 10;
1344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		value	+= ((ANTLR3_UINT32)(*input) - (ANTLR3_UINT32)'0');
1345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		input++;
1346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return negate ? -value : value;
1349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Function that returns a pointer to an 8 bit version of the string,
1352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * which in this case is just the string as this is
1353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 8 bit encodiing anyway.
1354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	  pANTLR3_STRING	    to8_8	(pANTLR3_STRING string)
1356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  string;
1358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Function that returns an 8 bit version of the string,
1361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * which in this case is returning all the UTF16 characters
1362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * narrowed back into 8 bits, with characters that are too large
1363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * replaced with '_'
1364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	  pANTLR3_STRING    to8_UTF16	(pANTLR3_STRING string)
1366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_STRING  newStr;
1368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_UINT32   i;
1369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* Create a new 8 bit string
1371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	*/
1372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	newStr  = newRaw8(string->factory);
1373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(newStr == NULL)
1375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
1376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	NULL;
1377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* Always add one more byte for a terminator
1380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	*/
1381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	newStr->chars   = (pANTLR3_UINT8) ANTLR3_MALLOC((size_t)(string->len + 1));
1382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	newStr->size    = string->len + 1;
1383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	newStr->len	    = string->len;
1384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* Now copy each UTF16 charActer , making it an 8 bit character of
1386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	* some sort.
1387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	*/
1388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	for	(i=0; i<string->len; i++)
1389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
1390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ANTLR3_UCHAR	c;
1391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		c = *(((pANTLR3_UINT16)(string->chars)) + i);
1393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		*(newStr->chars + i) = (ANTLR3_UINT8)(c > 255 ? '_' : c);
1395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* Terminate
1398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	*/
1399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	*(newStr->chars + newStr->len) = '\0';
1400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return newStr;
1402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1403