1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \file
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Simple string interface allows indiscriminate allocation of strings
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * such that they can be allocated all over the place and released in
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * one chunk via a string factory - saves lots of hassle in remembering what
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * strings were allocated where.
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifndef	_ANTLR3_STRING_H
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	_ANTLR3_STRING_H
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// [The "BSD licence"]
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.temporal-wave.com
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.linkedin.com/in/jimidle
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// All rights reserved.
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Redistribution and use in source and binary forms, with or without
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// modification, are permitted provided that the following conditions
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// are met:
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1. Redistributions of source code must retain the above copyright
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    notice, this list of conditions and the following disclaimer.
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 2. Redistributions in binary form must reproduce the above copyright
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    notice, this list of conditions and the following disclaimer in the
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    documentation and/or other materials provided with the distribution.
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3. The name of the author may not be used to endorse or promote products
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    derived from this software without specific prior written permission.
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include    <antlr3defs.h>
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include    <antlr3collections.h>
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef __cplusplus
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverextern "C" {
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Base string class tracks the allocations and provides simple string
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  tracking functions. Mostly you can work directly on the string for things
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  that don't reallocate it, like strchr() etc. Perhaps someone will want to provide implementations for UTF8
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  and so on.
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertypedef	struct ANTLR3_STRING_struct
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** The factory that created this string
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_STRING_FACTORY	factory;
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to the current string value (starts at NULL unless
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  the string allocator is told to create it with a pre known size.
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT8		chars;
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Current length of the string up to and not including, the trailing '\0'
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  Note that the actual allocation (->size)
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  is always at least one byte more than this to accommodate trailing '\0'
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32		len;
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Current size of the string in bytes including the trailing '\0'
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32		size;
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Index of string (allocation number) in case someone wants
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  to explicitly release it.
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32		index;
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Occasionally it is useful to know what the encoding of the string
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  actually is, hence it is stored here as one the ANTLR3_ENCODING_ values
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT8		encoding;
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function that sets the string value to a specific string in the default encoding
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  for this string. For instance, if this is 8 bit, then this function is the same as set8
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  but if the encoding is UTF16, then the pointer is assumed to point to UTF16 characters, not
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  8 bit.
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT8   (*set)	(struct ANTLR3_STRING_struct * string, const char * chars);
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function that sets the string value to a specific 8 bit string in the default encoding
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  for this string. For instance, if this is an 8 bit string, then this function is the same as set8
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  but if the encoding is UTF16, then the pointer is assumed to point to 8 bit characters that must
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  be converted to UTF16 characters on the fly.
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT8   (*set8)	(struct ANTLR3_STRING_struct * string, const char * chars);
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function adds a raw char * type pointer in the default encoding
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  for this string. For instance, if this is 8 bit, then this function is the same as append8
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  but if the encoding is UTF16, then the pointer is assumed to point to UTF16 characters not
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  8 bit.
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT8   (*append)	(struct ANTLR3_STRING_struct * string, const char * newbit);
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function adds a raw char * type pointer in the default encoding
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  for this string. For instance, if this is a UTF16 string, then this function assumes the pointer
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  points to 8 bit characters that must be converted on the fly.
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT8   (*append8)	(struct ANTLR3_STRING_struct * string, const char * newbit);
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function that inserts the supplied string at the specified
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  offset in the current string in the default encoding for this string. For instance, if this is an 8
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  bit string, then this is the same as insert8, but if this is a UTF16 string, then the pointer
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  must point to UTF16 characters.
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT8   (*insert)	(struct ANTLR3_STRING_struct * string, ANTLR3_UINT32 point, const char * newbit);
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function that inserts the supplied string at the specified
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  offset in the current string in the default encoding for this string. For instance, if this is a UTF16 string
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  then the pointer is assumed to point at 8 bit characteres that must be converted on the fly.
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT8   (*insert8)	(struct ANTLR3_STRING_struct * string, ANTLR3_UINT32 point, const char * newbit);
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function that sets the string value to a copy of the supplied string (strings must be in the
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  same encoding.
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT8   (*setS)	(struct ANTLR3_STRING_struct * string, struct ANTLR3_STRING_struct * chars);
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function appends a copy of the characters contained in another string. Strings must be in the
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  same encoding.
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT8   (*appendS)	(struct ANTLR3_STRING_struct * string, struct ANTLR3_STRING_struct * newbit);
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function that inserts a copy of the characters in the supplied string at the specified
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  offset in the current string. strings must be in the same encoding.
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT8   (*insertS)	(struct ANTLR3_STRING_struct * string, ANTLR3_UINT32 point, struct ANTLR3_STRING_struct * newbit);
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function that inserts the supplied integer in string form at the specified
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  offset in the current string.
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT8   (*inserti)	(struct ANTLR3_STRING_struct * string, ANTLR3_UINT32 point, ANTLR3_INT32 i);
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function that adds a single character to the end of the string, in the encoding of the
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  string - 8 bit, UTF16, utf-8 etc. Input is a single UTF32 (32 bits wide integer) character.
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT8   (*addc)	(struct ANTLR3_STRING_struct * string, ANTLR3_UINT32 c);
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function that adds the stringified representation of an integer
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  to the string.
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_UINT8   (*addi)	(struct ANTLR3_STRING_struct * string, ANTLR3_INT32 i);
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function that compares the text of a string to the supplied
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  8 bit character string and returns a result a la strcmp()
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32   (*compare8)	(struct ANTLR3_STRING_struct * string, const char * compStr);
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to a function that compares the text of a string with the supplied character string
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  (which is assumed to be in the same encoding as the string itself) and returns a result
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  a la strcmp()
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32   (*compare)	(struct ANTLR3_STRING_struct * string, const char * compStr);
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to a function that compares the text of a string with the supplied string
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  (which is assumed to be in the same encoding as the string itself) and returns a result
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  a la strcmp()
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32   (*compareS)	(struct ANTLR3_STRING_struct * string, struct ANTLR3_STRING_struct * compStr);
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to a function that returns the character indexed at the supplied
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  offset as a 32 bit character.
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UCHAR    (*charAt)	(struct ANTLR3_STRING_struct * string, ANTLR3_UINT32 offset);
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to a function that returns a substring of the supplied string a la .subString(s,e)
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  in the Java language.
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    struct ANTLR3_STRING_struct *
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					(*subString)    (struct ANTLR3_STRING_struct * string, ANTLR3_UINT32 startIndex, ANTLR3_UINT32 endIndex);
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to a function that returns the integer representation of any numeric characters
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  at the beginning of the string
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_INT32	(*toInt32)	    (struct ANTLR3_STRING_struct * string);
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to a function that yields an 8 bit string regardless of the encoding of the supplied
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  string. This is useful when you want to use the text of a token in some way that requires an 8 bit
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  value, such as the key for a hashtable. The function is required to produce a usable string even
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  if the text given as input has characters that do not fit in 8 bit space, it will replace them
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  with some arbitrary character such as '?'
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    struct ANTLR3_STRING_struct *
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					(*to8)	    (struct ANTLR3_STRING_struct * string);
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// Pointer to a function that yields a UT8 encoded string of the current string,
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// regardless of the current encoding of the string. Because there is currently no UTF8
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// handling in the string class, it creates therefore, a string that is useful only for read only
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// applications as it will not contain methods that deal with UTF8 at the moment.
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	///
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	struct ANTLR3_STRING_struct *
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					(*toUTF8)	(struct ANTLR3_STRING_struct * string);
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_STRING;
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Definition of the string factory interface, which creates and tracks
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  strings for you of various shapes and sizes.
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertypedef struct	ANTLR3_STRING_FACTORY_struct
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** List of all the strings that have been allocated by the factory
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_VECTOR    strings;
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Index of next string that we allocate
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32   index;
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function that manufactures an empty string
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_STRING  (*newRaw)	(struct ANTLR3_STRING_FACTORY_struct * factory);
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function that manufactures a raw string with no text in it but space for size
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  characters.
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_STRING  (*newSize)	(struct ANTLR3_STRING_FACTORY_struct * factory, ANTLR3_UINT32 size);
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function that manufactures a string from a given pointer and length. The pointer is assumed
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  to point to characters in the same encoding as the string type, hence if this is a UTF16 string the
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  pointer should point to UTF16 characters.
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_STRING  (*newPtr)	(struct ANTLR3_STRING_FACTORY_struct * factory, pANTLR3_UINT8 string, ANTLR3_UINT32 size);
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function that manufactures a string from a given pointer and length. The pointer is assumed to
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  point at 8 bit characters which must be converted on the fly to the encoding of the actual string.
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_STRING  (*newPtr8)	(struct ANTLR3_STRING_FACTORY_struct * factory, pANTLR3_UINT8 string, ANTLR3_UINT32 size);
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function that manufactures a string from a given pointer and works out the length. The pointer is
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  assumed to point to characters in the same encoding as the string itself, i.e. UTF16 if a UTF16
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  string and so on.
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_STRING  (*newStr)	(struct ANTLR3_STRING_FACTORY_struct * factory, pANTLR3_UINT8 string);
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function that manufactures a string from a given pointer and length. The pointer should
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  point to 8 bit characters regardless of the actual encoding of the string. The 8 bit characters
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  will be converted to the actual string encoding on the fly.
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_STRING  (*newStr8)	(struct ANTLR3_STRING_FACTORY_struct * factory, pANTLR3_UINT8 string);
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function that deletes the string altogether
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void	    (*destroy)	(struct ANTLR3_STRING_FACTORY_struct * factory, pANTLR3_STRING string);
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function that returns a copy of the string in printable form without any control
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  characters in it.
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_STRING  (*printable)(struct ANTLR3_STRING_FACTORY_struct * factory, pANTLR3_STRING string);
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Pointer to function that closes the factory
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void	    (*close)	(struct ANTLR3_STRING_FACTORY_struct * factory);
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_STRING_FACTORY;
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef __cplusplus
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
273