antlr3filestream.c revision 324c4644fee44b9898524c09511bd33c3f12e2df
1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \file
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \brief The ANTLR3 C filestream is used when the source character stream
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * is a filesystem based input set and all the characters in the filestream
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * can be loaded at once into memory and away the lexer goes.
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * A number of initializers are provided in order that various character
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * sets can be supported from input files. The ANTLR3 C runtime expects
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * to deal with UTF32 characters only (the reasons for this are to
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * do with the simplification of C code when using this form of Unicode
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * encoding, though this is not a panacea. More information can be
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * found on this by consulting:
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *   - http://www.unicode.org/versions/Unicode4.0.0/ch02.pdf#G11178
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Where a well grounded discussion of the encoding formats available
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * may be found.
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// [The "BSD licence"]
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.temporal-wave.com
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.linkedin.com/in/jimidle
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// All rights reserved.
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Redistribution and use in source and binary forms, with or without
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// modification, are permitted provided that the following conditions
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// are met:
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1. Redistributions of source code must retain the above copyright
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    notice, this list of conditions and the following disclaimer.
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 2. Redistributions in binary form must reproduce the above copyright
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    notice, this list of conditions and the following disclaimer in the
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    documentation and/or other materials provided with the distribution.
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3. The name of the author may not be used to endorse or promote products
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    derived from this software without specific prior written permission.
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include    <antlr3.h>
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic  void                    setupInputStream            (pANTLR3_INPUT_STREAM input);
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic  pANTLR3_INPUT_STREAM    antlr3CreateFileStream      (pANTLR3_UINT8 fileName);
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic  pANTLR3_INPUT_STREAM    antlr3CreateStringStream    (pANTLR3_UINT8 data);
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
53324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API pANTLR3_INPUT_STREAM
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3FileStreamNew(pANTLR3_UINT8 fileName, ANTLR3_UINT32 encoding)
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_INPUT_STREAM input;
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // First order of business is to read the file into some buffer space
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // as just straight 8 bit bytes. Then we will work out the encoding and
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // byte order and adjust the API functions that are installed for the
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // default 8Bit stream accordingly.
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    input   = antlr3CreateFileStream(fileName);
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if  (input == NULL)
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return NULL;
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // We have the data in memory now so we can deal with it according to
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // the encoding scheme we were given by the user.
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    input->encoding = encoding;
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Now we need to work out the endian type and install any
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // API functions that differ from 8Bit
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    setupInputStream(input);
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Now we can set up the file name
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    input->istream->streamName	= input->strFactory->newStr8(input->strFactory, fileName);
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    input->fileName		= input->istream->streamName;
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return input;
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
88324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API pANTLR3_INPUT_STREAM
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3StringStreamNew(pANTLR3_UINT8 data, ANTLR3_UINT32 encoding, ANTLR3_UINT32 size, pANTLR3_UINT8 name)
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_INPUT_STREAM    input;
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // First order of business is to set up the stream and install the data pointer.
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Then we will work out the encoding and byte order and adjust the API functions that are installed for the
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // default 8Bit stream accordingly.
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    input   = antlr3CreateStringStream(data);
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if  (input == NULL)
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return NULL;
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Size (in bytes) of the given 'string'
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    input->sizeBuf		= size;
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // We have the data in memory now so we can deal with it according to
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // the encoding scheme we were given by the user.
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    input->encoding = encoding;
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Now we need to work out the endian type and install any
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // API functions that differ from 8Bit
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    setupInputStream(input);
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Now we can set up the file name
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    input->istream->streamName	= input->strFactory->newStr8(input->strFactory, name);
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    input->fileName		= input->istream->streamName;
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return input;
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Determine endianess of the input stream and install the
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// API required for the encoding in that format.
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void
130324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetupInputStream(pANTLR3_INPUT_STREAM input)
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_BOOLEAN  isBigEndian;
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Used to determine the endianness of the machine we are currently
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // running on.
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT16 bomTest = 0xFEFF;
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // What endianess is the machine we are running on? If the incoming
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // encoding endianess is the same as this machine's natural byte order
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // then we can use more efficient API calls.
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if  (*((pANTLR3_UINT8)(&bomTest)) == 0xFE)
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        isBigEndian = ANTLR3_TRUE;
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        isBigEndian = ANTLR3_FALSE;
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // What encoding did the user tell us {s}he thought it was? I am going
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // to get sick of the questions on antlr-interest, I know I am.
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    switch  (input->encoding)
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        case    ANTLR3_ENC_UTF8:
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // See if there is a BOM at the start of this UTF-8 sequence
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // and just eat it if there is. Windows .TXT files have this for instance
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // as it identifies UTF-8 even though it is of no consequence for byte order
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // as UTF-8 does not have a byte order.
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            //
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if  (       (ANTLR3_UINT8)(*((pANTLR3_UINT8)input->nextChar))      == 0xEF
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    &&  (ANTLR3_UINT8)(*((pANTLR3_UINT8)input->nextChar+1))    == 0xBB
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    &&  (ANTLR3_UINT8)(*((pANTLR3_UINT8)input->nextChar+2))    == 0xBF
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                )
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                // The UTF8 BOM is present so skip it
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                input->nextChar = (void *)((pANTLR3_UINT8)input->nextChar + 3);
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // Install the UTF8 input routines
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            //
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            antlr3UTF8SetupStream(input);
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            break;
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        case    ANTLR3_ENC_UTF16:
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // See if there is a BOM at the start of the input. If not then
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // we assume that the byte order is the natural order of this
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // machine (or it is really UCS2). If there is a BOM we determine if the encoding
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // is the same as the natural order of this machine.
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            //
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if  (       (ANTLR3_UINT8)(*((pANTLR3_UINT8)input->nextChar))      == 0xFE
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    &&  (ANTLR3_UINT8)(*((pANTLR3_UINT8)input->nextChar+1))    == 0xFF
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                )
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                // BOM Present, indicates Big Endian
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                input->nextChar = (void *)((pANTLR3_UINT8)input->nextChar + 2);
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                antlr3UTF16SetupStream(input, isBigEndian, ANTLR3_TRUE);
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if  (      (ANTLR3_UINT8)(*((pANTLR3_UINT8)input->nextChar))      == 0xFF
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        &&  (ANTLR3_UINT8)(*((pANTLR3_UINT8)input->nextChar+1))    == 0xFE
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                )
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                // BOM present, indicates Little Endian
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                input->nextChar = (void *)((pANTLR3_UINT8)input->nextChar + 2);
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                antlr3UTF16SetupStream(input, isBigEndian, ANTLR3_FALSE);
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                // No BOM present, assume local computer byte order
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                antlr3UTF16SetupStream(input, isBigEndian, isBigEndian);
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            break;
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        case    ANTLR3_ENC_UTF32:
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // See if there is a BOM at the start of the input. If not then
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // we assume that the byte order is the natural order of this
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // machine. If there is we determine if the encoding
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // is the same as the natural order of this machine.
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            //
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if  (       (ANTLR3_UINT8)(*((pANTLR3_UINT8)input->nextChar))      == 0x00
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    &&  (ANTLR3_UINT8)(*((pANTLR3_UINT8)input->nextChar+1))    == 0x00
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    &&  (ANTLR3_UINT8)(*((pANTLR3_UINT8)input->nextChar+2))    == 0xFE
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    &&  (ANTLR3_UINT8)(*((pANTLR3_UINT8)input->nextChar+3))    == 0xFF
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                )
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                // BOM Present, indicates Big Endian
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                input->nextChar = (void *)((pANTLR3_UINT8)input->nextChar + 4);
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                antlr3UTF32SetupStream(input, isBigEndian, ANTLR3_TRUE);
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else if  (      (ANTLR3_UINT8)(*((pANTLR3_UINT8)input->nextChar))      == 0xFF
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        &&  (ANTLR3_UINT8)(*((pANTLR3_UINT8)input->nextChar+1))    == 0xFE
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        &&  (ANTLR3_UINT8)(*((pANTLR3_UINT8)input->nextChar+1))    == 0x00
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        &&  (ANTLR3_UINT8)(*((pANTLR3_UINT8)input->nextChar+1))    == 0x00
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                )
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                // BOM present, indicates Little Endian
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                input->nextChar = (void *)((pANTLR3_UINT8)input->nextChar + 4);
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                antlr3UTF32SetupStream(input, isBigEndian, ANTLR3_FALSE);
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                // No BOM present, assume local computer byte order
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                //
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                antlr3UTF32SetupStream(input, isBigEndian, isBigEndian);
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            break;
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        case    ANTLR3_ENC_UTF16BE:
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // Encoding is definately Big Endian with no BOM
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            //
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            antlr3UTF16SetupStream(input, isBigEndian, ANTLR3_TRUE);
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            break;
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        case    ANTLR3_ENC_UTF16LE:
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // Encoding is definately Little Endian with no BOM
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            //
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            antlr3UTF16SetupStream(input, isBigEndian, ANTLR3_FALSE);
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            break;
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        case    ANTLR3_ENC_UTF32BE:
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // Encoding is definately Big Endian with no BOM
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            //
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            antlr3UTF32SetupStream(input, isBigEndian, ANTLR3_TRUE);
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            break;
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        case    ANTLR3_ENC_UTF32LE:
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // Encoding is definately Little Endian with no BOM
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            //
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            antlr3UTF32SetupStream(input, isBigEndian, ANTLR3_FALSE);
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            break;
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        case    ANTLR3_ENC_EBCDIC:
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // EBCDIC is basically the same as ASCII but with an on the
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // fly translation to ASCII
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            //
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            antlr3EBCDICSetupStream(input);
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            break;
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        case    ANTLR3_ENC_8BIT:
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        default:
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // Standard 8bit/ASCII
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            //
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            antlr38BitSetupStream(input);
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            break;
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Use the contents of an operating system file as the input
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *         for an input stream.
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param fileName Name of operating system file to read.
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \return
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *	- Pointer to new input stream context upon success
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *	- One of the ANTLR3_ERR_ defines on error.
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_INPUT_STREAM
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3CreateFileStream(pANTLR3_UINT8 fileName)
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Pointer to the input stream we are going to create
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_INPUT_STREAM    input;
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_UINT32	    status;
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(fileName == NULL)
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return NULL;
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Allocate memory for the input stream structure
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	input   = (pANTLR3_INPUT_STREAM)
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ANTLR3_CALLOC(1, sizeof(ANTLR3_INPUT_STREAM));
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(input == NULL)
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	NULL;
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Structure was allocated correctly, now we can read the file.
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	status  = antlr3read8Bit(input, fileName);
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Call the common 8 bit input stream handler
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// initialization.
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	antlr3GenericSetupStream(input);
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // However if the file was not there or something then we
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // need to close. Have to wait until here as we cannot call
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // close until the API is installed of course.
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        //
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(status != ANTLR3_SUCCESS)
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		input->close(input);
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	NULL;
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return  input;
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
352324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API ANTLR3_UINT32
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3read8Bit(pANTLR3_INPUT_STREAM    input, pANTLR3_UINT8 fileName)
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_FDSC	    infile;
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_UINT32	    fSize;
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* Open the OS file in read binary mode
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	*/
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	infile  = antlr3Fopen(fileName, "rb");
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* Check that it was there
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	*/
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(infile == NULL)
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	(ANTLR3_UINT32)ANTLR3_ERR_NOFILE;
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* It was there, so we can read the bytes now
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	*/
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	fSize   = antlr3Fsize(fileName);	/* Size of input file	*/
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* Allocate buffer for this input set
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	*/
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	input->data	    = ANTLR3_MALLOC((size_t)fSize);
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	input->sizeBuf  = fSize;
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(input->data == NULL)
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	(ANTLR3_UINT32)ANTLR3_ERR_NOMEM;
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	input->isAllocated	= ANTLR3_TRUE;
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* Now we read the file. Characters are not converted to
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	* the internal ANTLR encoding until they are read from the buffer
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	*/
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	antlr3Fread(infile, fSize, input->data);
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* And close the file handle
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	*/
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	antlr3Fclose(infile);
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return  ANTLR3_SUCCESS;
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Open an operating system file and return the descriptor
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * We just use the common open() and related functions here.
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Later we might find better ways on systems
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * such as Windows and OpenVMS for instance. But the idea is to read the
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * while file at once anyway, so it may be irrelevant.
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
403324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API ANTLR3_FDSC
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3Fopen(pANTLR3_UINT8 filename, const char * mode)
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  (ANTLR3_FDSC)fopen((const char *)filename, mode);
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Close an operating system file and free any handles
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  etc.
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
412324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API void
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3Fclose(ANTLR3_FDSC fd)
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    fclose(fd);
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
417324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API ANTLR3_UINT32
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3Fsize(pANTLR3_UINT8 fileName)
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    struct _stat	statbuf;
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    _stat((const char *)fileName, &statbuf);
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return (ANTLR3_UINT32)statbuf.st_size;
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
427324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API ANTLR3_UINT32
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3Fread(ANTLR3_FDSC fdsc, ANTLR3_UINT32 count,  void * data)
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  (ANTLR3_UINT32)fread(data, (size_t)count, 1, fdsc);
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Use the supplied 'string' as input to the stream
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param data Pointer to the input data
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \return
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *	- Pointer to new input stream context upon success
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *	- NULL defines on error.
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_INPUT_STREAM
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3CreateStringStream(pANTLR3_UINT8 data)
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Pointer to the input stream we are going to create
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_INPUT_STREAM    input;
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(data == NULL)
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return NULL;
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Allocate memory for the input stream structure
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	input   = (pANTLR3_INPUT_STREAM)
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ANTLR3_CALLOC(1, sizeof(ANTLR3_INPUT_STREAM));
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(input == NULL)
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	NULL;
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Structure was allocated correctly, now we can install the pointer
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        input->data             = data;
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        input->isAllocated	= ANTLR3_FALSE;
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Call the common 8 bit input stream handler
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// initialization.
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	antlr3GenericSetupStream(input);
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return  input;
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}