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}