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