]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.databoard/cpp/DataBoardTest/libantlr3c-3.2/src/antlr3string.c
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.databoard / cpp / DataBoardTest / libantlr3c-3.2 / src / antlr3string.c
index 58e8e108db2da9ed2c9d5c2b1004c945a02c2d21..7e1bd22bc82054a42e0b25b60081326b8afb630d 100644 (file)
-/** \file\r
- * Implementation of the ANTLR3 string and string factory classes\r
- */\r
-\r
-// [The "BSD licence"]\r
-// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC\r
-// http://www.temporal-wave.com\r
-// http://www.linkedin.com/in/jimidle\r
-//\r
-// All rights reserved.\r
-//\r
-// Redistribution and use in source and binary forms, with or without\r
-// modification, are permitted provided that the following conditions\r
-// are met:\r
-// 1. Redistributions of source code must retain the above copyright\r
-//    notice, this list of conditions and the following disclaimer.\r
-// 2. Redistributions in binary form must reproduce the above copyright\r
-//    notice, this list of conditions and the following disclaimer in the\r
-//    documentation and/or other materials provided with the distribution.\r
-// 3. The name of the author may not be used to endorse or promote products\r
-//    derived from this software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\r
-// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\r
-// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\r
-// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\r
-// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\r
-// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
-\r
-#include    <antlr3string.h>\r
-\r
-/* Factory API\r
- */\r
-static    pANTLR3_STRING    newRaw8    (pANTLR3_STRING_FACTORY factory);\r
-static    pANTLR3_STRING    newRaw16   (pANTLR3_STRING_FACTORY factory);\r
-static    pANTLR3_STRING    newSize8   (pANTLR3_STRING_FACTORY factory, ANTLR3_UINT32 size);\r
-static    pANTLR3_STRING    newSize16  (pANTLR3_STRING_FACTORY factory, ANTLR3_UINT32 size);\r
-static    pANTLR3_STRING    newPtr8    (pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 string, ANTLR3_UINT32 size);\r
-static    pANTLR3_STRING    newPtr16_8 (pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 string, ANTLR3_UINT32 size);\r
-static    pANTLR3_STRING    newPtr16_16        (pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 string, ANTLR3_UINT32 size);\r
-static    pANTLR3_STRING    newStr8    (pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 string);\r
-static    pANTLR3_STRING    newStr16_8 (pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 string);\r
-static    pANTLR3_STRING    newStr16_16        (pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 string);\r
-static    void             destroy     (pANTLR3_STRING_FACTORY factory, pANTLR3_STRING string);\r
-static    pANTLR3_STRING    printable8 (pANTLR3_STRING_FACTORY factory, pANTLR3_STRING string);\r
-static    pANTLR3_STRING    printable16        (pANTLR3_STRING_FACTORY factory, pANTLR3_STRING string);\r
-static    void             closeFactory(pANTLR3_STRING_FACTORY factory);\r
-\r
-/* String API\r
- */\r
-static    pANTLR3_UINT8            set8        (pANTLR3_STRING string, const char * chars);\r
-static    pANTLR3_UINT8            set16_8     (pANTLR3_STRING string, const char * chars);\r
-static    pANTLR3_UINT8            set16_16    (pANTLR3_STRING string, const char * chars);\r
-static    pANTLR3_UINT8            append8     (pANTLR3_STRING string, const char * newbit);\r
-static    pANTLR3_UINT8            append16_8  (pANTLR3_STRING string, const char * newbit);\r
-static    pANTLR3_UINT8            append16_16 (pANTLR3_STRING string, const char * newbit);\r
-static   pANTLR3_UINT8     insert8     (pANTLR3_STRING string, ANTLR3_UINT32 point, const char * newbit);\r
-static   pANTLR3_UINT8     insert16_8  (pANTLR3_STRING string, ANTLR3_UINT32 point, const char * newbit);\r
-static   pANTLR3_UINT8     insert16_16 (pANTLR3_STRING string, ANTLR3_UINT32 point, const char * newbit);\r
-\r
-static    pANTLR3_UINT8            setS        (pANTLR3_STRING string, pANTLR3_STRING chars);\r
-static    pANTLR3_UINT8            appendS     (pANTLR3_STRING string, pANTLR3_STRING newbit);\r
-static   pANTLR3_UINT8     insertS     (pANTLR3_STRING string, ANTLR3_UINT32 point, pANTLR3_STRING newbit);\r
-\r
-static    pANTLR3_UINT8            addc8       (pANTLR3_STRING string, ANTLR3_UINT32 c);\r
-static    pANTLR3_UINT8            addc16      (pANTLR3_STRING string, ANTLR3_UINT32 c);\r
-static    pANTLR3_UINT8            addi8       (pANTLR3_STRING string, ANTLR3_INT32 i);\r
-static    pANTLR3_UINT8            addi16      (pANTLR3_STRING string, ANTLR3_INT32 i);\r
-static   pANTLR3_UINT8     inserti8    (pANTLR3_STRING string, ANTLR3_UINT32 point, ANTLR3_INT32 i);\r
-static   pANTLR3_UINT8     inserti16   (pANTLR3_STRING string, ANTLR3_UINT32 point, ANTLR3_INT32 i);\r
-\r
-static    ANTLR3_UINT32     compare8   (pANTLR3_STRING string, const char * compStr);\r
-static    ANTLR3_UINT32     compare16_8        (pANTLR3_STRING string, const char * compStr);\r
-static    ANTLR3_UINT32     compare16_16(pANTLR3_STRING string, const char * compStr);\r
-static    ANTLR3_UINT32     compareS   (pANTLR3_STRING string, pANTLR3_STRING compStr);\r
-static    ANTLR3_UCHAR      charAt8    (pANTLR3_STRING string, ANTLR3_UINT32 offset);\r
-static    ANTLR3_UCHAR      charAt16   (pANTLR3_STRING string, ANTLR3_UINT32 offset);\r
-static    pANTLR3_STRING    subString8 (pANTLR3_STRING string, ANTLR3_UINT32 startIndex, ANTLR3_UINT32 endIndex);\r
-static    pANTLR3_STRING    subString16        (pANTLR3_STRING string, ANTLR3_UINT32 startIndex, ANTLR3_UINT32 endIndex);\r
-static   ANTLR3_INT32      toInt32_8   (pANTLR3_STRING string);\r
-static   ANTLR3_INT32      toInt32_16  (pANTLR3_STRING string);\r
-static   pANTLR3_STRING    to8_8               (pANTLR3_STRING string);\r
-static   pANTLR3_STRING    to8_16              (pANTLR3_STRING string);\r
-static pANTLR3_STRING          toUTF8_8        (pANTLR3_STRING string);\r
-static pANTLR3_STRING          toUTF8_16       (pANTLR3_STRING string);\r
-\r
-/* Local helpers\r
- */\r
-static void                    stringInit8     (pANTLR3_STRING string);\r
-static void                    stringInit16    (pANTLR3_STRING string);\r
-static void    ANTLR3_CDECL    stringFree      (pANTLR3_STRING string);\r
-\r
-ANTLR3_API pANTLR3_STRING_FACTORY \r
-antlr3StringFactoryNew()\r
-{\r
-       pANTLR3_STRING_FACTORY  factory;\r
-\r
-       /* Allocate memory\r
-       */\r
-       factory = (pANTLR3_STRING_FACTORY) ANTLR3_MALLOC(sizeof(ANTLR3_STRING_FACTORY));\r
-\r
-       if      (factory == NULL)\r
-       {\r
-               return  NULL;\r
-       }\r
-\r
-       /* Now we make a new list to track the strings.\r
-       */\r
-       factory->strings        = antlr3VectorNew(0);\r
-       factory->index  = 0;\r
-\r
-       if      (factory->strings == NULL)\r
-       {\r
-               ANTLR3_FREE(factory);\r
-               return  NULL;\r
-       }\r
-\r
-       /* Install the API (8 bit assumed)\r
-       */\r
-       factory->newRaw         =  newRaw8;\r
-       factory->newSize        =  newSize8;\r
-\r
-       factory->newPtr         =  newPtr8;\r
-       factory->newPtr8        =  newPtr8;\r
-       factory->newStr         =  newStr8;\r
-       factory->newStr8        =  newStr8;\r
-       factory->destroy        =  destroy;\r
-       factory->printable      =  printable8;\r
-       factory->destroy        =  destroy;\r
-       factory->close          =  closeFactory;\r
-\r
-       return  factory;\r
-}\r
-\r
-/** Create a string factory that is UCS2 (16 bit) encoding based\r
- */\r
-ANTLR3_API pANTLR3_STRING_FACTORY \r
-antlr3UCS2StringFactoryNew()\r
-{\r
-     pANTLR3_STRING_FACTORY  factory;\r
-\r
-    /* Allocate an 8 bit factory, then override with 16 bit UCS2 functions where we \r
-     * need to.\r
-     */\r
-    factory    = antlr3StringFactoryNew();\r
-\r
-    if (factory == NULL)\r
-    {\r
-               return  NULL;\r
-    }\r
-\r
-    /* Override the 8 bit API with the UCS2 (mostly just 16 bit) API\r
-     */\r
-    factory->newRaw    =  newRaw16;\r
-    factory->newSize   =  newSize16;\r
-\r
-    factory->newPtr    =  newPtr16_16;\r
-    factory->newPtr8   =  newPtr16_8;\r
-    factory->newStr    =  newStr16_16;\r
-    factory->newStr8   =  newStr16_8;\r
-    factory->printable =  printable16;\r
-\r
-    factory->destroy   =  destroy;\r
-    factory->destroy   =  destroy;\r
-    factory->close     =  closeFactory;\r
-\r
-    return  factory;\r
-}\r
-\r
-/**\r
- *\r
- * \param factory \r
- * \return \r
- */\r
-static    pANTLR3_STRING    \r
-newRaw8        (pANTLR3_STRING_FACTORY factory)\r
-{\r
-    pANTLR3_STRING  string;\r
-\r
-    string  = (pANTLR3_STRING) ANTLR3_MALLOC(sizeof(ANTLR3_STRING));\r
-\r
-    if (string == NULL)\r
-    {\r
-               return  NULL;\r
-    }\r
-\r
-    /* Structure is allocated, now fill in the API etc.\r
-     */\r
-    stringInit8(string);\r
-    string->factory = factory;\r
-\r
-    /* Add the string into the allocated list\r
-     */\r
-    factory->strings->set(factory->strings, factory->index, (void *) string, (void (ANTLR3_CDECL *)(void *))(stringFree), ANTLR3_TRUE);\r
-    string->index   = factory->index++;\r
-\r
-    return string;\r
-}\r
-/**\r
- *\r
- * \param factory \r
- * \return \r
- */\r
-static    pANTLR3_STRING    \r
-newRaw16       (pANTLR3_STRING_FACTORY factory)\r
-{\r
-    pANTLR3_STRING  string;\r
-\r
-    string  = (pANTLR3_STRING) ANTLR3_MALLOC(sizeof(ANTLR3_STRING));\r
-\r
-    if (string == NULL)\r
-    {\r
-               return  NULL;\r
-    }\r
-\r
-    /* Structure is allocated, now fill in the API etc.\r
-     */\r
-    stringInit16(string);\r
-    string->factory = factory;\r
-\r
-    /* Add the string into the allocated list\r
-     */\r
-    factory->strings->set(factory->strings, factory->index, (void *) string, (void (ANTLR3_CDECL *)(void *))(stringFree), ANTLR3_TRUE);\r
-    string->index   = factory->index++;\r
-\r
-    return string;\r
-}\r
-static  \r
-void   ANTLR3_CDECL stringFree  (pANTLR3_STRING string)\r
-{\r
-    /* First free the string itself if there was anything in it\r
-     */\r
-    if (string->chars)\r
-    {\r
-       ANTLR3_FREE(string->chars);\r
-    }\r
-\r
-    /* Now free the space for this string\r
-     */\r
-    ANTLR3_FREE(string);\r
-\r
-    return;\r
-}\r
-/**\r
- *\r
- * \param string \r
- * \return \r
- */\r
-static void\r
-stringInit8  (pANTLR3_STRING string)\r
-{\r
-    string->len                        = 0;\r
-    string->size               = 0;\r
-    string->chars              = NULL;\r
-    string->encoding   = ANTLR3_ENCODING_LATIN1;\r
-\r
-    /* API for 8 bit strings*/\r
-\r
-    string->set                = set8;\r
-    string->set8       = set8;\r
-    string->append     = append8;\r
-    string->append8    = append8;\r
-    string->insert     = insert8;\r
-    string->insert8    = insert8;\r
-    string->addi       = addi8;\r
-    string->inserti    = inserti8;\r
-    string->addc       = addc8;\r
-    string->charAt     = charAt8;\r
-    string->compare    = compare8;\r
-    string->compare8   = compare8;\r
-    string->subString  = subString8;\r
-    string->toInt32    = toInt32_8;\r
-    string->to8                = to8_8;\r
-       string->toUTF8  = toUTF8_8;\r
-    string->compareS   = compareS;\r
-    string->setS       = setS;\r
-    string->appendS    = appendS;\r
-    string->insertS    = insertS;\r
-\r
-}\r
-/**\r
- *\r
- * \param string \r
- * \return \r
- */\r
-static void\r
-stringInit16  (pANTLR3_STRING string)\r
-{\r
-    string->len                = 0;\r
-    string->size       = 0;\r
-    string->chars      = NULL;\r
-    string->encoding   = ANTLR3_ENCODING_UCS2;\r
-\r
-    /* API for 16 bit strings */\r
-\r
-    string->set                = set16_16;\r
-    string->set8       = set16_8;\r
-    string->append     = append16_16;\r
-    string->append8    = append16_8;\r
-    string->insert     = insert16_16;\r
-    string->insert8    = insert16_8;\r
-    string->addi       = addi16;\r
-    string->inserti    = inserti16;\r
-    string->addc       = addc16;\r
-    string->charAt     = charAt16;\r
-    string->compare    = compare16_16;\r
-    string->compare8   = compare16_8;\r
-    string->subString  = subString16;\r
-    string->toInt32    = toInt32_16;\r
-    string->to8                = to8_16;\r
-       string->toUTF8  = toUTF8_16;\r
-\r
-    string->compareS   = compareS;\r
-    string->setS       = setS;\r
-    string->appendS    = appendS;\r
-    string->insertS    = insertS;\r
-}\r
-/**\r
- *\r
- * \param string \r
- * \return \r
- * TODO: Implement UTF-8\r
- */\r
-static void\r
-stringInitUTF8  (pANTLR3_STRING string)\r
-{\r
-    string->len            = 0;\r
-    string->size    = 0;\r
-    string->chars   = NULL;\r
-\r
-    /* API */\r
-\r
-}\r
-\r
-// Convert an 8 bit string into a UTF8 representation, which is in fact just the string itself\r
-// a memcpy as we make no assumptions about the 8 bit encoding.\r
-//\r
-static pANTLR3_STRING          \r
-toUTF8_8       (pANTLR3_STRING string)\r
-{\r
-       return string->factory->newPtr(string->factory, (pANTLR3_UINT8)(string->chars), string->len);\r
-}\r
-\r
-// Convert a 16 bit (UCS2) string into a UTF8 representation using the Unicode.org\r
-// supplied C algorithms, which are now contained within the ANTLR3 C runtime\r
-// as permitted by the Unicode license (within the source code antlr3convertutf.c/.h\r
-// UCS2 has the same encoding as UTF16 so we can use UTF16 converter.\r
-//\r
-static pANTLR3_STRING  \r
-toUTF8_16      (pANTLR3_STRING string)\r
-{\r
-       \r
-       UTF8                            * outputEnd;    \r
-       UTF16                           * inputEnd;\r
-       pANTLR3_STRING          utf8String;\r
-\r
-       ConversionResult        cResult;\r
-\r
-       // Allocate the output buffer, which needs to accommodate potentially\r
-       // 3X (in bytes) the input size (in chars).\r
-       //\r
-       utf8String      = string->factory->newStr8(string->factory, (pANTLR3_UINT8)"");\r
-\r
-       if      (utf8String != NULL)\r
-       {\r
-               // Free existing allocation\r
-               //\r
-               ANTLR3_FREE(utf8String->chars);\r
-\r
-               // Reallocate according to maximum expected size\r
-               //\r
-               utf8String->size        = string->len *3;\r
-               utf8String->chars       = (pANTLR3_UINT8)ANTLR3_MALLOC(utf8String->size +1);\r
-\r
-               if      (utf8String->chars != NULL)\r
-               {\r
-                       inputEnd  = (UTF16 *)   (string->chars);\r
-                       outputEnd = (UTF8 *)    (utf8String->chars);\r
-\r
-                       // Call the Unicode converter\r
-                       //\r
-                       cResult =  ConvertUTF16toUTF8\r
-                                                       (\r
-                                                               (const UTF16**)&inputEnd, \r
-                                                               ((const UTF16 *)(string->chars)) + string->len, \r
-                                                               &outputEnd, \r
-                                                               outputEnd + utf8String->size - 1,\r
-                                                               lenientConversion\r
-                                                       );\r
-\r
-                       // We don't really care if things failed or not here, we just converted\r
-                       // everything that was vaguely possible and stopped when it wasn't. It is\r
-                       // up to the grammar programmer to verify that the input is sensible.\r
-                       //\r
-                       utf8String->len = ANTLR3_UINT32_CAST(((pANTLR3_UINT8)outputEnd) - utf8String->chars);\r
-\r
-                       *(outputEnd+1) = '\0';          // Always null terminate\r
-               }\r
-       }\r
-       return utf8String;\r
-}\r
-\r
-/**\r
- * Creates a new string with enough capacity for size 8 bit characters plus a terminator.\r
- *\r
- * \param[in] factory - Pointer to the string factory that owns strings\r
- * \param[in] size - In characters\r
- * \return pointer to the new string.\r
- */\r
-static    pANTLR3_STRING    \r
-newSize8       (pANTLR3_STRING_FACTORY factory, ANTLR3_UINT32 size)\r
-{\r
-    pANTLR3_STRING  string;\r
-\r
-    string  = factory->newRaw(factory);\r
-\r
-    if (string == NULL)\r
-    {\r
-               return  string;\r
-    }\r
-\r
-    /* Always add one more byte for a terminator ;-)\r
-     */\r
-    string->chars              = (pANTLR3_UINT8) ANTLR3_MALLOC((size_t)(sizeof(ANTLR3_UINT8) * (size+1)));\r
-       *(string->chars)        = '\0';\r
-    string->size               = size + 1;\r
-\r
-\r
-    return string;\r
-}\r
-/**\r
- * Creates a new string with enough capacity for size 16 bit characters plus a terminator.\r
- *\r
- * \param[in] factory - POitner to the string factory that owns strings\r
- * \param[in] size - In characters\r
- * \return pointer to the new string.\r
- */\r
-static    pANTLR3_STRING    \r
-newSize16      (pANTLR3_STRING_FACTORY factory, ANTLR3_UINT32 size)\r
-{\r
-    pANTLR3_STRING  string;\r
-\r
-    string  = factory->newRaw(factory);\r
-\r
-    if (string == NULL)\r
-    {\r
-               return  string;\r
-    }\r
-\r
-    /* Always add one more byte for a terminator ;-)\r
-     */        \r
-    string->chars              = (pANTLR3_UINT8) ANTLR3_MALLOC((size_t)(sizeof(ANTLR3_UINT16) * (size+1)));\r
-       *(string->chars)        = '\0';\r
-    string->size               = size+1;       /* Size is always in characters, as is len */\r
-\r
-    return string;\r
-}\r
-\r
-/** Creates a new 8 bit string initialized with the 8 bit characters at the \r
- *  supplied ptr, of pre-determined size.\r
- * \param[in] factory - Pointer to the string factory that owns the strings\r
- * \param[in] ptr - Pointer to 8 bit encoded characters\r
- * \return pointer to the new string\r
- */\r
-static    pANTLR3_STRING    \r
-newPtr8        (pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 ptr, ANTLR3_UINT32 size)\r
-{\r
-       pANTLR3_STRING  string;\r
-\r
-       string  = factory->newSize(factory, size);\r
-\r
-       if      (string == NULL)\r
-       {\r
-               return  NULL;\r
-       }\r
-\r
-       if      (size <= 0)\r
-       {\r
-               return  string;\r
-       }\r
-\r
-       if      (ptr != NULL)\r
-       {\r
-               ANTLR3_MEMMOVE(string->chars, (const void *)ptr, size);\r
-               *(string->chars + size) = '\0';     /* Terminate, these strings are usually used for Token streams and printing etc.    */\r
-               string->len = size;\r
-       }\r
-\r
-       return  string;\r
-}\r
-\r
-/** Creates a new 16 bit string initialized with the 8 bit characters at the \r
- *  supplied 8 bit character ptr, of pre-determined size.\r
- * \param[in] factory - Pointer to the string factory that owns the strings\r
- * \param[in] ptr - Pointer to 8 bit encoded characters\r
- * \return pointer to the new string\r
- */\r
-static    pANTLR3_STRING    \r
-newPtr16_8     (pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 ptr, ANTLR3_UINT32 size)\r
-{\r
-       pANTLR3_STRING  string;\r
-\r
-       /* newSize accepts size in characters, not bytes\r
-       */\r
-       string  = factory->newSize(factory, size);\r
-\r
-       if      (string == NULL)\r
-       {\r
-               return  NULL;\r
-       }\r
-\r
-       if      (size <= 0)\r
-       {\r
-               return  string;\r
-       }\r
-\r
-       if      (ptr != NULL)\r
-       {\r
-               pANTLR3_UINT16  out;\r
-               ANTLR3_INT32    inSize;\r
-\r
-               out = (pANTLR3_UINT16)(string->chars);\r
-               inSize  = size;\r
-\r
-               while   (inSize-- > 0)\r
-               {\r
-                       *out++ = (ANTLR3_UINT16)(*ptr++);\r
-               }\r
-\r
-               /* Terminate, these strings are usually used for Token streams and printing etc.        \r
-               */\r
-               *(((pANTLR3_UINT16)(string->chars)) + size) = '\0';\r
-\r
-               string->len = size;\r
-       }\r
-\r
-       return  string;\r
-}\r
-\r
-/** Creates a new 16 bit string initialized with the 16 bit characters at the \r
- *  supplied ptr, of pre-determined size.\r
- * \param[in] factory - Pointer to the string factory that owns the strings\r
- * \param[in] ptr - Pointer to 16 bit encoded characters\r
- * \return pointer to the new string\r
- */\r
-static    pANTLR3_STRING    \r
-newPtr16_16    (pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 ptr, ANTLR3_UINT32 size)\r
-{\r
-       pANTLR3_STRING  string;\r
-\r
-       string  = factory->newSize(factory, size);\r
-\r
-       if      (string == NULL)\r
-       {\r
-               return  NULL;\r
-       }\r
-\r
-       if      (size <= 0)\r
-       {\r
-               return  string;\r
-       }\r
-\r
-       if      (ptr != NULL)\r
-       {\r
-               ANTLR3_MEMMOVE(string->chars, (const void *)ptr, (size * sizeof(ANTLR3_UINT16)));\r
-\r
-               /* Terminate, these strings are usually used for Token streams and printing etc.        \r
-               */\r
-               *(((pANTLR3_UINT16)(string->chars)) + size) = '\0';         \r
-               string->len = size;\r
-       }\r
-\r
-       return  string;\r
-}\r
-\r
-/** Create a new 8 bit string from the supplied, null terminated, 8 bit string pointer.\r
- * \param[in] factory - Pointer to the string factory that owns strings.\r
- * \param[in] ptr - Pointer to the 8 bit encoded string\r
- * \return Pointer to the newly initialized string\r
- */\r
-static    pANTLR3_STRING    \r
-newStr8        (pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 ptr)\r
-{\r
-    return factory->newPtr8(factory, ptr, (ANTLR3_UINT32)strlen((const char *)ptr));\r
-}\r
-\r
-/** Create a new 16 bit string from the supplied, null terminated, 8 bit string pointer.\r
- * \param[in] factory - Pointer to the string factory that owns strings.\r
- * \param[in] ptr - Pointer to the 8 bit encoded string\r
- * \return POinter to the newly initialized string\r
- */\r
-static    pANTLR3_STRING    \r
-newStr16_8     (pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 ptr)\r
-{\r
-    return factory->newPtr8(factory, ptr, (ANTLR3_UINT32)strlen((const char *)ptr));\r
-}\r
-\r
-/** Create a new 16 bit string from the supplied, null terminated, 16 bit string pointer.\r
- * \param[in] factory - Pointer to the string factory that owns strings.\r
- * \param[in] ptr - Pointer to the 16 bit encoded string\r
- * \return Pointer to the newly initialized string\r
- */\r
-static    pANTLR3_STRING    \r
-newStr16_16    (pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 ptr)\r
-{\r
-    pANTLR3_UINT16  in;\r
-    ANTLR3_UINT32   count;\r
-\r
-    /** First, determine the length of the input string\r
-     */\r
-    in     = (pANTLR3_UINT16)ptr;\r
-    count   = 0;\r
-\r
-    while   (*in++ != '\0')\r
-    {\r
-               count++;\r
-    }\r
-    return factory->newPtr(factory, ptr, count);\r
-}\r
-\r
-static    void             \r
-destroy        (pANTLR3_STRING_FACTORY factory, pANTLR3_STRING string)\r
-{\r
-    // Record which string we are deleting\r
-    //\r
-    ANTLR3_UINT32 strIndex = string->index;\r
-    \r
-    // Ensure that the string was not factory made, or we would try\r
-    // to delete memory that wasn't allocated outside the factory\r
-    // block.\r
-    // Remove the specific indexed string from the vector\r
-    //\r
-    factory->strings->del(factory->strings, strIndex);\r
-\r
-    // One less string in the vector, so decrement the factory index\r
-    // so that the next string allocated is indexed correctly with\r
-    // respect to the vector.\r
-    //\r
-    factory->index--;\r
-\r
-    // Now we have to reindex the strings in the vector that followed\r
-    // the one we just deleted. We only do this if the one we just deleted\r
-    // was not the last one.\r
-    //\r
-    if  (strIndex< factory->index)\r
-    {\r
-        // We must reindex the strings after the one we just deleted.\r
-        // The one that follows the one we just deleted is also out\r
-        // of whack, so we start there.\r
-        //\r
-        ANTLR3_UINT32 i;\r
-\r
-        for (i = strIndex; i < factory->index; i++)\r
-        {\r
-            // Renumber the entry\r
-            //\r
-            ((pANTLR3_STRING)(factory->strings->elements[i].element))->index = i;\r
-        }\r
-    }\r
-\r
-    // The string has been destroyed and the elements of the factory are reindexed.\r
-    //\r
-\r
-}\r
-\r
-static    pANTLR3_STRING    \r
-printable8(pANTLR3_STRING_FACTORY factory, pANTLR3_STRING instr)\r
-{\r
-    pANTLR3_STRING  string;\r
-    \r
-    /* We don't need to be too efficient here, this is mostly for error messages and so on.\r
-     */\r
-    pANTLR3_UINT8   scannedText;\r
-    ANTLR3_UINT32   i;\r
-\r
-    /* Assume we need as much as twice as much space to parse out the control characters\r
-     */\r
-    string  = factory->newSize(factory, instr->len *2 + 1);\r
-\r
-    /* Scan through and replace unprintable (in terms of this routine)\r
-     * characters\r
-     */\r
-    scannedText = string->chars;\r
-\r
-    for        (i = 0; i < instr->len; i++)\r
-    {\r
-               if (*(instr->chars + i) == '\n')\r
-               {\r
-                       *scannedText++ = '\\';\r
-                       *scannedText++ = 'n';\r
-               }\r
-               else if (*(instr->chars + i) == '\r')\r
-               {\r
-                       *scannedText++ = '\\';\r
-                       *scannedText++ = 'r';\r
-               }\r
-               else if (!isprint(*(instr->chars +i)))\r
-               {\r
-                       *scannedText++ = '?';\r
-               }\r
-               else\r
-               {\r
-                       *scannedText++ = *(instr->chars + i);\r
-               }\r
-    }\r
-    *scannedText  = '\0';\r
-\r
-    string->len        = (ANTLR3_UINT32)(scannedText - string->chars);\r
-    \r
-    return  string;\r
-}\r
-\r
-static    pANTLR3_STRING    \r
-printable16(pANTLR3_STRING_FACTORY factory, pANTLR3_STRING instr)\r
-{\r
-    pANTLR3_STRING  string;\r
-    \r
-    /* We don't need to be too efficient here, this is mostly for error messages and so on.\r
-     */\r
-    pANTLR3_UINT16  scannedText;\r
-    pANTLR3_UINT16  inText;\r
-    ANTLR3_UINT32   i;\r
-    ANTLR3_UINT32   outLen;\r
-\r
-    /* Assume we need as much as twice as much space to parse out the control characters\r
-     */\r
-    string  = factory->newSize(factory, instr->len *2 + 1);\r
-\r
-    /* Scan through and replace unprintable (in terms of this routine)\r
-     * characters\r
-     */\r
-    scannedText = (pANTLR3_UINT16)(string->chars);\r
-    inText     = (pANTLR3_UINT16)(instr->chars);\r
-    outLen     = 0;\r
-\r
-    for        (i = 0; i < instr->len; i++)\r
-    {\r
-               if (*(inText + i) == '\n')\r
-               {\r
-                       *scannedText++   = '\\';\r
-                       *scannedText++   = 'n';\r
-                       outLen      += 2;\r
-               }\r
-               else if (*(inText + i) == '\r')\r
-               {\r
-                       *scannedText++   = '\\';\r
-                       *scannedText++   = 'r';\r
-                       outLen      += 2;\r
-               }\r
-               else if (!isprint(*(inText +i)))\r
-               {\r
-                       *scannedText++ = '?';\r
-                       outLen++;\r
-               }\r
-               else\r
-               {\r
-                       *scannedText++ = *(inText + i);\r
-                       outLen++;\r
-               }\r
-    }\r
-    *scannedText  = '\0';\r
-\r
-    string->len        = outLen;\r
-    \r
-    return  string;\r
-}\r
-\r
-/** Fascist Capitalist Pig function created\r
- *  to oppress the workers comrade.\r
- */\r
-static    void             \r
-closeFactory   (pANTLR3_STRING_FACTORY factory)\r
-{\r
-    /* Delete the vector we were tracking the strings with, this will\r
-     * causes all the allocated strings to be deallocated too\r
-     */\r
-    factory->strings->free(factory->strings);\r
-\r
-    /* Delete the space for the factory itself\r
-     */\r
-    ANTLR3_FREE((void *)factory);\r
-}\r
-\r
-static    pANTLR3_UINT8   \r
-append8        (pANTLR3_STRING string, const char * newbit)\r
-{\r
-    ANTLR3_UINT32 len;\r
-\r
-    len        = (ANTLR3_UINT32)strlen(newbit);\r
-\r
-    if (string->size < (string->len + len + 1))\r
-    {\r
-               string->chars   = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(string->len + len + 1));\r
-               string->size    = string->len + len + 1;\r
-    }\r
-\r
-    /* Note we copy one more byte than the strlen in order to get the trailing\r
-     */\r
-    ANTLR3_MEMMOVE((void *)(string->chars + string->len), newbit, (ANTLR3_UINT32)(len+1));\r
-    string->len        += len;\r
-\r
-    return string->chars;\r
-}\r
-\r
-static    pANTLR3_UINT8   \r
-append16_8     (pANTLR3_STRING string, const char * newbit)\r
-{\r
-    ANTLR3_UINT32   len;\r
-    pANTLR3_UINT16  apPoint;\r
-    ANTLR3_UINT32   count;\r
-\r
-    len        = (ANTLR3_UINT32)strlen(newbit);\r
-\r
-    if (string->size < (string->len + len + 1))\r
-    {\r
-               string->chars   = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)((sizeof(ANTLR3_UINT16)*(string->len + len + 1))));\r
-               string->size    = string->len + len + 1;\r
-    }\r
-\r
-    apPoint = ((pANTLR3_UINT16)string->chars) + string->len;\r
-    string->len        += len;\r
-\r
-    for        (count = 0; count < len; count++)\r
-    {\r
-               *apPoint++   = *(newbit + count);\r
-    }\r
-    *apPoint = '\0';\r
-\r
-    return string->chars;\r
-}\r
-\r
-static    pANTLR3_UINT8   \r
-append16_16    (pANTLR3_STRING string, const char * newbit)\r
-{\r
-    ANTLR3_UINT32 len;\r
-    pANTLR3_UINT16  in;\r
-\r
-    /** First, determine the length of the input string\r
-     */\r
-    in     = (pANTLR3_UINT16)newbit;\r
-    len   = 0;\r
-\r
-    while   (*in++ != '\0')\r
-    {\r
-               len++;\r
-    }\r
-\r
-    if (string->size < (string->len + len + 1))\r
-    {\r
-               string->chars   = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)( sizeof(ANTLR3_UINT16) *(string->len + len + 1) ));\r
-               string->size    = string->len + len + 1;\r
-    }\r
-\r
-    /* Note we copy one more byte than the strlen in order to get the trailing delimiter\r
-     */\r
-    ANTLR3_MEMMOVE((void *)(((pANTLR3_UINT16)string->chars) + string->len), newbit, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(len+1)));\r
-    string->len        += len;\r
-\r
-    return string->chars;\r
-}\r
-\r
-static    pANTLR3_UINT8   \r
-set8   (pANTLR3_STRING string, const char * chars)\r
-{\r
-    ANTLR3_UINT32      len;\r
-\r
-    len = (ANTLR3_UINT32)strlen(chars);\r
-    if (string->size < len + 1)\r
-    {\r
-               string->chars   = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(len + 1));\r
-               string->size    = len + 1;\r
-    }\r
-\r
-    /* Note we copy one more byte than the strlen in order to get the trailing '\0'\r
-     */\r
-    ANTLR3_MEMMOVE((void *)(string->chars), chars, (ANTLR3_UINT32)(len+1));\r
-    string->len            = len;\r
-\r
-    return  string->chars;\r
-\r
-}\r
-\r
-static    pANTLR3_UINT8   \r
-set16_8        (pANTLR3_STRING string, const char * chars)\r
-{\r
-    ANTLR3_UINT32      len;\r
-    ANTLR3_UINT32      count;\r
-    pANTLR3_UINT16     apPoint;\r
-\r
-    len = (ANTLR3_UINT32)strlen(chars);\r
-    if (string->size < len + 1)\r
-       {\r
-               string->chars   = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(len + 1)));\r
-               string->size    = len + 1;\r
-    }\r
-    apPoint = ((pANTLR3_UINT16)string->chars);\r
-    string->len        = len;\r
-\r
-    for        (count = 0; count < string->len; count++)\r
-    {\r
-               *apPoint++   = *(chars + count);\r
-    }\r
-    *apPoint = '\0';\r
-\r
-    return  string->chars;\r
-}\r
-\r
-static    pANTLR3_UINT8   \r
-set16_16    (pANTLR3_STRING string, const char * chars)\r
-{\r
-    ANTLR3_UINT32   len;\r
-    pANTLR3_UINT16  in;\r
-\r
-    /** First, determine the length of the input string\r
-     */\r
-    in     = (pANTLR3_UINT16)chars;\r
-    len   = 0;\r
-\r
-    while   (*in++ != '\0')\r
-    {\r
-               len++;\r
-    }\r
-\r
-    if (string->size < len + 1)\r
-    {\r
-               string->chars   = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(len + 1)));\r
-               string->size    = len + 1;\r
-    }\r
-\r
-    /* Note we copy one more byte than the strlen in order to get the trailing '\0'\r
-     */\r
-    ANTLR3_MEMMOVE((void *)(string->chars), chars, (ANTLR3_UINT32)((len+1) * sizeof(ANTLR3_UINT16)));\r
-    string->len            = len;\r
-\r
-    return  string->chars;\r
-\r
-}\r
-\r
-static    pANTLR3_UINT8   \r
-addc8  (pANTLR3_STRING string, ANTLR3_UINT32 c)\r
-{\r
-    if (string->size < string->len + 2)\r
-    {\r
-               string->chars   = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(string->len + 2));\r
-               string->size    = string->len + 2;\r
-    }\r
-    *(string->chars + string->len)     = (ANTLR3_UINT8)c;\r
-    *(string->chars + string->len + 1) = '\0';\r
-    string->len++;\r
-\r
-    return  string->chars;\r
-}\r
-\r
-static    pANTLR3_UINT8   \r
-addc16 (pANTLR3_STRING string, ANTLR3_UINT32 c)\r
-{\r
-    pANTLR3_UINT16  ptr;\r
-\r
-    if (string->size < string->len + 2)\r
-    {\r
-               string->chars   = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16) * (string->len + 2)));\r
-               string->size    = string->len + 2;\r
-    }\r
-    ptr        = (pANTLR3_UINT16)(string->chars);\r
-\r
-    *(ptr + string->len)       = (ANTLR3_UINT16)c;\r
-    *(ptr + string->len + 1)   = '\0';\r
-    string->len++;\r
-\r
-    return  string->chars;\r
-}\r
-\r
-static    pANTLR3_UINT8   \r
-addi8  (pANTLR3_STRING string, ANTLR3_INT32 i)\r
-{\r
-    ANTLR3_UINT8           newbit[32];\r
-\r
-    sprintf((char *)newbit, "%d", i);\r
-\r
-    return  string->append8(string, (const char *)newbit);\r
-}\r
-static    pANTLR3_UINT8   \r
-addi16 (pANTLR3_STRING string, ANTLR3_INT32 i)\r
-{\r
-    ANTLR3_UINT8           newbit[32];\r
-\r
-    sprintf((char *)newbit, "%d", i);\r
-\r
-    return  string->append8(string, (const char *)newbit);\r
-}\r
-\r
-static   pANTLR3_UINT8\r
-inserti8    (pANTLR3_STRING string, ANTLR3_UINT32 point, ANTLR3_INT32 i)\r
-{\r
-    ANTLR3_UINT8           newbit[32];\r
-\r
-    sprintf((char *)newbit, "%d", i);\r
-    return  string->insert8(string, point, (const char *)newbit);\r
-}\r
-static   pANTLR3_UINT8\r
-inserti16    (pANTLR3_STRING string, ANTLR3_UINT32 point, ANTLR3_INT32 i)\r
-{\r
-    ANTLR3_UINT8           newbit[32];\r
-\r
-    sprintf((char *)newbit, "%d", i);\r
-    return  string->insert8(string, point, (const char *)newbit);\r
-}\r
-\r
-static pANTLR3_UINT8\r
-insert8        (pANTLR3_STRING string, ANTLR3_UINT32 point, const char * newbit)\r
-{\r
-    ANTLR3_UINT32      len;\r
-\r
-    if (point >= string->len)\r
-    {\r
-               return  string->append(string, newbit);\r
-    }\r
\r
-    len        = (ANTLR3_UINT32)strlen(newbit);\r
-\r
-    if (len == 0)\r
-    {\r
-               return  string->chars;\r
-    }\r
-\r
-    if (string->size < (string->len + len + 1))\r
-    {\r
-               string->chars   = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(string->len + len + 1));\r
-               string->size    = string->len + len + 1;\r
-    }\r
-\r
-    /* Move the characters we are inserting before, including the delimiter\r
-     */\r
-    ANTLR3_MEMMOVE((void *)(string->chars + point + len), (void *)(string->chars + point), (ANTLR3_UINT32)(string->len - point + 1));\r
-\r
-    /* Note we copy the exact number of bytes\r
-     */\r
-    ANTLR3_MEMMOVE((void *)(string->chars + point), newbit, (ANTLR3_UINT32)(len));\r
-    \r
-    string->len += len;\r
-\r
-    return  string->chars;\r
-}\r
-\r
-static pANTLR3_UINT8\r
-insert16_8     (pANTLR3_STRING string, ANTLR3_UINT32 point, const char * newbit)\r
-{\r
-    ANTLR3_UINT32      len;\r
-    ANTLR3_UINT32      count;\r
-    pANTLR3_UINT16     inPoint;\r
-\r
-    if (point >= string->len)\r
-    {\r
-               return  string->append8(string, newbit);\r
-    }\r
\r
-    len        = (ANTLR3_UINT32)strlen(newbit);\r
-\r
-    if (len == 0)\r
-    {\r
-               return  string->chars;\r
-    }\r
-\r
-    if (string->size < (string->len + len + 1))\r
-    {\r
-       string->chars   = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(string->len + len + 1)));\r
-       string->size    = string->len + len + 1;\r
-    }\r
-\r
-    /* Move the characters we are inserting before, including the delimiter\r
-     */\r
-    ANTLR3_MEMMOVE((void *)(((pANTLR3_UINT16)string->chars) + point + len), (void *)(((pANTLR3_UINT16)string->chars) + point), (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(string->len - point + 1)));\r
-\r
-    string->len += len;\r
-    \r
-    inPoint = ((pANTLR3_UINT16)(string->chars))+point;\r
-    for        (count = 0; count<len; count++)\r
-    {\r
-               *(inPoint + count) = (ANTLR3_UINT16)(*(newbit+count));\r
-    }\r
-\r
-    return  string->chars;\r
-}\r
-\r
-static pANTLR3_UINT8\r
-insert16_16    (pANTLR3_STRING string, ANTLR3_UINT32 point, const char * newbit)\r
-{\r
-    ANTLR3_UINT32      len;\r
-    pANTLR3_UINT16     in;\r
-\r
-    if (point >= string->len)\r
-    {\r
-               return  string->append(string, newbit);\r
-    }\r
\r
-    /** First, determine the length of the input string\r
-     */\r
-    in     = (pANTLR3_UINT16)newbit;\r
-    len            = 0;\r
-\r
-    while   (*in++ != '\0')\r
-    {\r
-               len++;\r
-    }\r
-\r
-    if (len == 0)\r
-    {\r
-               return  string->chars;\r
-    }\r
-\r
-    if (string->size < (string->len + len + 1))\r
-    {\r
-               string->chars   = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(string->len + len + 1)));\r
-               string->size    = string->len + len + 1;\r
-    }\r
-\r
-    /* Move the characters we are inserting before, including the delimiter\r
-     */\r
-    ANTLR3_MEMMOVE((void *)(((pANTLR3_UINT16)string->chars) + point + len), (void *)(((pANTLR3_UINT16)string->chars) + point), (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(string->len - point + 1)));\r
-\r
-\r
-    /* Note we copy the exact number of characters\r
-     */\r
-    ANTLR3_MEMMOVE((void *)(((pANTLR3_UINT16)string->chars) + point), newbit, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(len)));\r
-    \r
-    string->len += len;\r
-\r
-    return  string->chars;\r
-}\r
-\r
-static    pANTLR3_UINT8            setS        (pANTLR3_STRING string, pANTLR3_STRING chars)\r
-{\r
-    return  string->set(string, (const char *)(chars->chars));\r
-}\r
-\r
-static    pANTLR3_UINT8            appendS     (pANTLR3_STRING string, pANTLR3_STRING newbit)\r
-{\r
-    /* We may be passed an empty string, in which case we just return the current pointer\r
-     */\r
-    if (newbit == NULL || newbit->len == 0 || newbit->size == 0 || newbit->chars == NULL)\r
-    {\r
-               return  string->chars;\r
-    }\r
-    else\r
-    {\r
-               return  string->append(string, (const char *)(newbit->chars));\r
-    }\r
-}\r
-\r
-static   pANTLR3_UINT8     insertS     (pANTLR3_STRING string, ANTLR3_UINT32 point, pANTLR3_STRING newbit)\r
-{\r
-    return  string->insert(string, point, (const char *)(newbit->chars));\r
-}\r
-\r
-/* Function that compares the text of a string to the supplied\r
- * 8 bit character string and returns a result a la strcmp()\r
- */\r
-static ANTLR3_UINT32   \r
-compare8       (pANTLR3_STRING string, const char * compStr)\r
-{\r
-    return  strcmp((const char *)(string->chars), compStr);\r
-}\r
-\r
-/* Function that compares the text of a string with the supplied character string\r
- * (which is assumed to be in the same encoding as the string itself) and returns a result\r
- * a la strcmp()\r
- */\r
-static ANTLR3_UINT32   \r
-compare16_8    (pANTLR3_STRING string, const char * compStr)\r
-{\r
-    pANTLR3_UINT16  ourString;\r
-    ANTLR3_UINT32   charDiff;\r
-\r
-    ourString  = (pANTLR3_UINT16)(string->chars);\r
-\r
-    while   (((ANTLR3_UCHAR)(*ourString) != '\0') && ((ANTLR3_UCHAR)(*compStr) != '\0'))\r
-    {\r
-               charDiff = *ourString - *compStr;\r
-               if  (charDiff != 0)\r
-               {\r
-                       return charDiff;\r
-               }\r
-               ourString++;\r
-               compStr++;\r
-    }\r
-\r
-    /* At this point, one of the strings was terminated\r
-     */\r
-    return (ANTLR3_UINT32)((ANTLR3_UCHAR)(*ourString) - (ANTLR3_UCHAR)(*compStr));\r
-\r
-}\r
-\r
-/* Function that compares the text of a string with the supplied character string\r
- * (which is assumed to be in the same encoding as the string itself) and returns a result\r
- * a la strcmp()\r
- */\r
-static ANTLR3_UINT32   \r
-compare16_16   (pANTLR3_STRING string, const char * compStr8)\r
-{\r
-    pANTLR3_UINT16  ourString;\r
-    pANTLR3_UINT16  compStr;\r
-    ANTLR3_UINT32   charDiff;\r
-\r
-    ourString  = (pANTLR3_UINT16)(string->chars);\r
-    compStr    = (pANTLR3_UINT16)(compStr8);\r
-\r
-    while   (((ANTLR3_UCHAR)(*ourString) != '\0') && ((ANTLR3_UCHAR)(*((pANTLR3_UINT16)compStr)) != '\0'))\r
-    {\r
-               charDiff = *ourString - *compStr;\r
-               if  (charDiff != 0)\r
-               {\r
-                       return charDiff;\r
-               }\r
-               ourString++;\r
-               compStr++;\r
-    }\r
-\r
-    /* At this point, one of the strings was terminated\r
-     */\r
-    return (ANTLR3_UINT32)((ANTLR3_UCHAR)(*ourString) - (ANTLR3_UCHAR)(*compStr));\r
-}\r
-\r
-/* Function that compares the text of a string with the supplied string\r
- * (which is assumed to be in the same encoding as the string itself) and returns a result\r
- * a la strcmp()\r
- */\r
-static ANTLR3_UINT32   \r
-compareS    (pANTLR3_STRING string, pANTLR3_STRING compStr)\r
-{\r
-    return  string->compare(string, (const char *)compStr->chars);\r
-}\r
-\r
-\r
-/* Function that returns the character indexed at the supplied\r
- * offset as a 32 bit character.\r
- */\r
-static ANTLR3_UCHAR    \r
-charAt8            (pANTLR3_STRING string, ANTLR3_UINT32 offset)\r
-{\r
-    if (offset > string->len)\r
-    {\r
-               return (ANTLR3_UCHAR)'\0';\r
-    }\r
-    else\r
-    {\r
-               return  (ANTLR3_UCHAR)(*(string->chars + offset));\r
-    }\r
-}\r
-\r
-/* Function that returns the character indexed at the supplied\r
- * offset as a 32 bit character.\r
- */\r
-static ANTLR3_UCHAR    \r
-charAt16    (pANTLR3_STRING string, ANTLR3_UINT32 offset)\r
-{\r
-    if (offset > string->len)\r
-    {\r
-               return (ANTLR3_UCHAR)'\0';\r
-    }\r
-    else\r
-    {\r
-               return  (ANTLR3_UCHAR)(*((pANTLR3_UINT16)(string->chars) + offset));\r
-    }\r
-}\r
-\r
-/* Function that returns a substring of the supplied string a la .subString(s,e)\r
- * in java runtimes.\r
- */\r
-static pANTLR3_STRING\r
-subString8   (pANTLR3_STRING string, ANTLR3_UINT32 startIndex, ANTLR3_UINT32 endIndex)\r
-{\r
-    pANTLR3_STRING newStr;\r
-\r
-    if (endIndex > string->len)\r
-    {\r
-               endIndex = string->len + 1;\r
-    }\r
-    newStr  = string->factory->newPtr(string->factory, string->chars + startIndex, endIndex - startIndex);\r
-\r
-    return newStr;\r
-}\r
-\r
-/* Returns a substring of the supplied string a la .subString(s,e)\r
- * in java runtimes.\r
- */\r
-static pANTLR3_STRING\r
-subString16  (pANTLR3_STRING string, ANTLR3_UINT32 startIndex, ANTLR3_UINT32 endIndex)\r
-{\r
-    pANTLR3_STRING newStr;\r
-\r
-    if (endIndex > string->len)\r
-    {\r
-               endIndex = string->len + 1;\r
-    }\r
-    newStr  = string->factory->newPtr(string->factory, (pANTLR3_UINT8)((pANTLR3_UINT16)(string->chars) + startIndex), endIndex - startIndex);\r
-\r
-    return newStr;\r
-}\r
-\r
-/* Function that can convert the characters in the string to an integer\r
- */\r
-static ANTLR3_INT32\r
-toInt32_8          (struct ANTLR3_STRING_struct * string)\r
-{\r
-    return  atoi((const char *)(string->chars));\r
-}\r
-\r
-/* Function that can convert the characters in the string to an integer\r
- */\r
-static ANTLR3_INT32\r
-toInt32_16       (struct ANTLR3_STRING_struct * string)\r
-{\r
-    pANTLR3_UINT16  input;\r
-    ANTLR3_INT32   value;\r
-    ANTLR3_BOOLEAN  negate;\r
-\r
-    value   = 0;\r
-    input   = (pANTLR3_UINT16)(string->chars);\r
-    negate  = ANTLR3_FALSE;\r
-\r
-    if (*input == (ANTLR3_UCHAR)'-')\r
-    {\r
-               negate = ANTLR3_TRUE;\r
-               input++;\r
-    }\r
-    else if (*input == (ANTLR3_UCHAR)'+')\r
-    {\r
-               input++;\r
-    }\r
-\r
-    while   (*input != '\0' && isdigit(*input))\r
-    {\r
-               value    = value * 10;\r
-               value   += ((ANTLR3_UINT32)(*input) - (ANTLR3_UINT32)'0');\r
-               input++;\r
-    }\r
-\r
-    return negate ? -value : value;\r
-}\r
-\r
-/* Function that returns a pointer to an 8 bit version of the string,\r
- * which in this case is just the string as this is \r
- * 8 bit encodiing anyway.\r
- */\r
-static   pANTLR3_STRING            to8_8       (pANTLR3_STRING string)\r
-{\r
-    return  string;\r
-}\r
-\r
-/* Function that returns an 8 bit version of the string,\r
- * which in this case is returning all the 16 bit characters\r
- * narrowed back into 8 bits, with characters that are too large\r
- * replaced with '_'\r
- */\r
-static   pANTLR3_STRING    to8_16      (pANTLR3_STRING string)\r
-{\r
-       pANTLR3_STRING  newStr;\r
-       ANTLR3_UINT32   i;\r
-\r
-       /* Create a new 8 bit string\r
-       */\r
-       newStr  = newRaw8(string->factory);\r
-\r
-       if      (newStr == NULL)\r
-       {\r
-               return  NULL;\r
-       }\r
-\r
-       /* Always add one more byte for a terminator\r
-       */\r
-       newStr->chars   = (pANTLR3_UINT8) ANTLR3_MALLOC((size_t)(string->len + 1));\r
-       newStr->size    = string->len + 1;\r
-       newStr->len         = string->len;\r
-\r
-       /* Now copy each 16 bit charActer , making it an 8 bit character of \r
-       * some sort.\r
-       */\r
-       for     (i=0; i<string->len; i++)\r
-       {\r
-               ANTLR3_UCHAR    c;\r
-\r
-               c = *(((pANTLR3_UINT16)(string->chars)) + i);\r
-\r
-               *(newStr->chars + i) = (ANTLR3_UINT8)(c > 255 ? '_' : c);\r
-       }\r
-\r
-       /* Terminate\r
-       */\r
-       *(newStr->chars + newStr->len) = '\0';\r
-\r
-       return newStr;\r
-}\r
+/** \file
+ * Implementation of the ANTLR3 string and string factory classes
+ */
+
+// [The "BSD licence"]
+// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
+// http://www.temporal-wave.com
+// http://www.linkedin.com/in/jimidle
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. The name of the author may not be used to endorse or promote products
+//    derived from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include    <antlr3string.h>
+
+/* Factory API
+ */
+static    pANTLR3_STRING    newRaw8    (pANTLR3_STRING_FACTORY factory);
+static    pANTLR3_STRING    newRaw16   (pANTLR3_STRING_FACTORY factory);
+static    pANTLR3_STRING    newSize8   (pANTLR3_STRING_FACTORY factory, ANTLR3_UINT32 size);
+static    pANTLR3_STRING    newSize16  (pANTLR3_STRING_FACTORY factory, ANTLR3_UINT32 size);
+static    pANTLR3_STRING    newPtr8    (pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 string, ANTLR3_UINT32 size);
+static    pANTLR3_STRING    newPtr16_8 (pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 string, ANTLR3_UINT32 size);
+static    pANTLR3_STRING    newPtr16_16        (pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 string, ANTLR3_UINT32 size);
+static    pANTLR3_STRING    newStr8    (pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 string);
+static    pANTLR3_STRING    newStr16_8 (pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 string);
+static    pANTLR3_STRING    newStr16_16        (pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 string);
+static    void             destroy     (pANTLR3_STRING_FACTORY factory, pANTLR3_STRING string);
+static    pANTLR3_STRING    printable8 (pANTLR3_STRING_FACTORY factory, pANTLR3_STRING string);
+static    pANTLR3_STRING    printable16        (pANTLR3_STRING_FACTORY factory, pANTLR3_STRING string);
+static    void             closeFactory(pANTLR3_STRING_FACTORY factory);
+
+/* String API
+ */
+static    pANTLR3_UINT8            set8        (pANTLR3_STRING string, const char * chars);
+static    pANTLR3_UINT8            set16_8     (pANTLR3_STRING string, const char * chars);
+static    pANTLR3_UINT8            set16_16    (pANTLR3_STRING string, const char * chars);
+static    pANTLR3_UINT8            append8     (pANTLR3_STRING string, const char * newbit);
+static    pANTLR3_UINT8            append16_8  (pANTLR3_STRING string, const char * newbit);
+static    pANTLR3_UINT8            append16_16 (pANTLR3_STRING string, const char * newbit);
+static   pANTLR3_UINT8     insert8     (pANTLR3_STRING string, ANTLR3_UINT32 point, const char * newbit);
+static   pANTLR3_UINT8     insert16_8  (pANTLR3_STRING string, ANTLR3_UINT32 point, const char * newbit);
+static   pANTLR3_UINT8     insert16_16 (pANTLR3_STRING string, ANTLR3_UINT32 point, const char * newbit);
+
+static    pANTLR3_UINT8            setS        (pANTLR3_STRING string, pANTLR3_STRING chars);
+static    pANTLR3_UINT8            appendS     (pANTLR3_STRING string, pANTLR3_STRING newbit);
+static   pANTLR3_UINT8     insertS     (pANTLR3_STRING string, ANTLR3_UINT32 point, pANTLR3_STRING newbit);
+
+static    pANTLR3_UINT8            addc8       (pANTLR3_STRING string, ANTLR3_UINT32 c);
+static    pANTLR3_UINT8            addc16      (pANTLR3_STRING string, ANTLR3_UINT32 c);
+static    pANTLR3_UINT8            addi8       (pANTLR3_STRING string, ANTLR3_INT32 i);
+static    pANTLR3_UINT8            addi16      (pANTLR3_STRING string, ANTLR3_INT32 i);
+static   pANTLR3_UINT8     inserti8    (pANTLR3_STRING string, ANTLR3_UINT32 point, ANTLR3_INT32 i);
+static   pANTLR3_UINT8     inserti16   (pANTLR3_STRING string, ANTLR3_UINT32 point, ANTLR3_INT32 i);
+
+static    ANTLR3_UINT32     compare8   (pANTLR3_STRING string, const char * compStr);
+static    ANTLR3_UINT32     compare16_8        (pANTLR3_STRING string, const char * compStr);
+static    ANTLR3_UINT32     compare16_16(pANTLR3_STRING string, const char * compStr);
+static    ANTLR3_UINT32     compareS   (pANTLR3_STRING string, pANTLR3_STRING compStr);
+static    ANTLR3_UCHAR      charAt8    (pANTLR3_STRING string, ANTLR3_UINT32 offset);
+static    ANTLR3_UCHAR      charAt16   (pANTLR3_STRING string, ANTLR3_UINT32 offset);
+static    pANTLR3_STRING    subString8 (pANTLR3_STRING string, ANTLR3_UINT32 startIndex, ANTLR3_UINT32 endIndex);
+static    pANTLR3_STRING    subString16        (pANTLR3_STRING string, ANTLR3_UINT32 startIndex, ANTLR3_UINT32 endIndex);
+static   ANTLR3_INT32      toInt32_8   (pANTLR3_STRING string);
+static   ANTLR3_INT32      toInt32_16  (pANTLR3_STRING string);
+static   pANTLR3_STRING    to8_8               (pANTLR3_STRING string);
+static   pANTLR3_STRING    to8_16              (pANTLR3_STRING string);
+static pANTLR3_STRING          toUTF8_8        (pANTLR3_STRING string);
+static pANTLR3_STRING          toUTF8_16       (pANTLR3_STRING string);
+
+/* Local helpers
+ */
+static void                    stringInit8     (pANTLR3_STRING string);
+static void                    stringInit16    (pANTLR3_STRING string);
+static void    ANTLR3_CDECL    stringFree      (pANTLR3_STRING string);
+
+ANTLR3_API pANTLR3_STRING_FACTORY 
+antlr3StringFactoryNew()
+{
+       pANTLR3_STRING_FACTORY  factory;
+
+       /* Allocate memory
+       */
+       factory = (pANTLR3_STRING_FACTORY) ANTLR3_MALLOC(sizeof(ANTLR3_STRING_FACTORY));
+
+       if      (factory == NULL)
+       {
+               return  NULL;
+       }
+
+       /* Now we make a new list to track the strings.
+       */
+       factory->strings        = antlr3VectorNew(0);
+       factory->index  = 0;
+
+       if      (factory->strings == NULL)
+       {
+               ANTLR3_FREE(factory);
+               return  NULL;
+       }
+
+       /* Install the API (8 bit assumed)
+       */
+       factory->newRaw         =  newRaw8;
+       factory->newSize        =  newSize8;
+
+       factory->newPtr         =  newPtr8;
+       factory->newPtr8        =  newPtr8;
+       factory->newStr         =  newStr8;
+       factory->newStr8        =  newStr8;
+       factory->destroy        =  destroy;
+       factory->printable      =  printable8;
+       factory->destroy        =  destroy;
+       factory->close          =  closeFactory;
+
+       return  factory;
+}
+
+/** Create a string factory that is UCS2 (16 bit) encoding based
+ */
+ANTLR3_API pANTLR3_STRING_FACTORY 
+antlr3UCS2StringFactoryNew()
+{
+     pANTLR3_STRING_FACTORY  factory;
+
+    /* Allocate an 8 bit factory, then override with 16 bit UCS2 functions where we 
+     * need to.
+     */
+    factory    = antlr3StringFactoryNew();
+
+    if (factory == NULL)
+    {
+               return  NULL;
+    }
+
+    /* Override the 8 bit API with the UCS2 (mostly just 16 bit) API
+     */
+    factory->newRaw    =  newRaw16;
+    factory->newSize   =  newSize16;
+
+    factory->newPtr    =  newPtr16_16;
+    factory->newPtr8   =  newPtr16_8;
+    factory->newStr    =  newStr16_16;
+    factory->newStr8   =  newStr16_8;
+    factory->printable =  printable16;
+
+    factory->destroy   =  destroy;
+    factory->destroy   =  destroy;
+    factory->close     =  closeFactory;
+
+    return  factory;
+}
+
+/**
+ *
+ * \param factory 
+ * \return 
+ */
+static    pANTLR3_STRING    
+newRaw8        (pANTLR3_STRING_FACTORY factory)
+{
+    pANTLR3_STRING  string;
+
+    string  = (pANTLR3_STRING) ANTLR3_MALLOC(sizeof(ANTLR3_STRING));
+
+    if (string == NULL)
+    {
+               return  NULL;
+    }
+
+    /* Structure is allocated, now fill in the API etc.
+     */
+    stringInit8(string);
+    string->factory = factory;
+
+    /* Add the string into the allocated list
+     */
+    factory->strings->set(factory->strings, factory->index, (void *) string, (void (ANTLR3_CDECL *)(void *))(stringFree), ANTLR3_TRUE);
+    string->index   = factory->index++;
+
+    return string;
+}
+/**
+ *
+ * \param factory 
+ * \return 
+ */
+static    pANTLR3_STRING    
+newRaw16       (pANTLR3_STRING_FACTORY factory)
+{
+    pANTLR3_STRING  string;
+
+    string  = (pANTLR3_STRING) ANTLR3_MALLOC(sizeof(ANTLR3_STRING));
+
+    if (string == NULL)
+    {
+               return  NULL;
+    }
+
+    /* Structure is allocated, now fill in the API etc.
+     */
+    stringInit16(string);
+    string->factory = factory;
+
+    /* Add the string into the allocated list
+     */
+    factory->strings->set(factory->strings, factory->index, (void *) string, (void (ANTLR3_CDECL *)(void *))(stringFree), ANTLR3_TRUE);
+    string->index   = factory->index++;
+
+    return string;
+}
+static  
+void   ANTLR3_CDECL stringFree  (pANTLR3_STRING string)
+{
+    /* First free the string itself if there was anything in it
+     */
+    if (string->chars)
+    {
+       ANTLR3_FREE(string->chars);
+    }
+
+    /* Now free the space for this string
+     */
+    ANTLR3_FREE(string);
+
+    return;
+}
+/**
+ *
+ * \param string 
+ * \return 
+ */
+static void
+stringInit8  (pANTLR3_STRING string)
+{
+    string->len                        = 0;
+    string->size               = 0;
+    string->chars              = NULL;
+    string->encoding   = ANTLR3_ENCODING_LATIN1;
+
+    /* API for 8 bit strings*/
+
+    string->set                = set8;
+    string->set8       = set8;
+    string->append     = append8;
+    string->append8    = append8;
+    string->insert     = insert8;
+    string->insert8    = insert8;
+    string->addi       = addi8;
+    string->inserti    = inserti8;
+    string->addc       = addc8;
+    string->charAt     = charAt8;
+    string->compare    = compare8;
+    string->compare8   = compare8;
+    string->subString  = subString8;
+    string->toInt32    = toInt32_8;
+    string->to8                = to8_8;
+       string->toUTF8  = toUTF8_8;
+    string->compareS   = compareS;
+    string->setS       = setS;
+    string->appendS    = appendS;
+    string->insertS    = insertS;
+
+}
+/**
+ *
+ * \param string 
+ * \return 
+ */
+static void
+stringInit16  (pANTLR3_STRING string)
+{
+    string->len                = 0;
+    string->size       = 0;
+    string->chars      = NULL;
+    string->encoding   = ANTLR3_ENCODING_UCS2;
+
+    /* API for 16 bit strings */
+
+    string->set                = set16_16;
+    string->set8       = set16_8;
+    string->append     = append16_16;
+    string->append8    = append16_8;
+    string->insert     = insert16_16;
+    string->insert8    = insert16_8;
+    string->addi       = addi16;
+    string->inserti    = inserti16;
+    string->addc       = addc16;
+    string->charAt     = charAt16;
+    string->compare    = compare16_16;
+    string->compare8   = compare16_8;
+    string->subString  = subString16;
+    string->toInt32    = toInt32_16;
+    string->to8                = to8_16;
+       string->toUTF8  = toUTF8_16;
+
+    string->compareS   = compareS;
+    string->setS       = setS;
+    string->appendS    = appendS;
+    string->insertS    = insertS;
+}
+/**
+ *
+ * \param string 
+ * \return 
+ * TODO: Implement UTF-8
+ */
+static void
+stringInitUTF8  (pANTLR3_STRING string)
+{
+    string->len            = 0;
+    string->size    = 0;
+    string->chars   = NULL;
+
+    /* API */
+
+}
+
+// Convert an 8 bit string into a UTF8 representation, which is in fact just the string itself
+// a memcpy as we make no assumptions about the 8 bit encoding.
+//
+static pANTLR3_STRING          
+toUTF8_8       (pANTLR3_STRING string)
+{
+       return string->factory->newPtr(string->factory, (pANTLR3_UINT8)(string->chars), string->len);
+}
+
+// Convert a 16 bit (UCS2) string into a UTF8 representation using the Unicode.org
+// supplied C algorithms, which are now contained within the ANTLR3 C runtime
+// as permitted by the Unicode license (within the source code antlr3convertutf.c/.h
+// UCS2 has the same encoding as UTF16 so we can use UTF16 converter.
+//
+static pANTLR3_STRING  
+toUTF8_16      (pANTLR3_STRING string)
+{
+       
+       UTF8                            * outputEnd;    
+       UTF16                           * inputEnd;
+       pANTLR3_STRING          utf8String;
+
+       ConversionResult        cResult;
+
+       // Allocate the output buffer, which needs to accommodate potentially
+       // 3X (in bytes) the input size (in chars).
+       //
+       utf8String      = string->factory->newStr8(string->factory, (pANTLR3_UINT8)"");
+
+       if      (utf8String != NULL)
+       {
+               // Free existing allocation
+               //
+               ANTLR3_FREE(utf8String->chars);
+
+               // Reallocate according to maximum expected size
+               //
+               utf8String->size        = string->len *3;
+               utf8String->chars       = (pANTLR3_UINT8)ANTLR3_MALLOC(utf8String->size +1);
+
+               if      (utf8String->chars != NULL)
+               {
+                       inputEnd  = (UTF16 *)   (string->chars);
+                       outputEnd = (UTF8 *)    (utf8String->chars);
+
+                       // Call the Unicode converter
+                       //
+                       cResult =  ConvertUTF16toUTF8
+                                                       (
+                                                               (const UTF16**)&inputEnd, 
+                                                               ((const UTF16 *)(string->chars)) + string->len, 
+                                                               &outputEnd, 
+                                                               outputEnd + utf8String->size - 1,
+                                                               lenientConversion
+                                                       );
+
+                       // We don't really care if things failed or not here, we just converted
+                       // everything that was vaguely possible and stopped when it wasn't. It is
+                       // up to the grammar programmer to verify that the input is sensible.
+                       //
+                       utf8String->len = ANTLR3_UINT32_CAST(((pANTLR3_UINT8)outputEnd) - utf8String->chars);
+
+                       *(outputEnd+1) = '\0';          // Always null terminate
+               }
+       }
+       return utf8String;
+}
+
+/**
+ * Creates a new string with enough capacity for size 8 bit characters plus a terminator.
+ *
+ * \param[in] factory - Pointer to the string factory that owns strings
+ * \param[in] size - In characters
+ * \return pointer to the new string.
+ */
+static    pANTLR3_STRING    
+newSize8       (pANTLR3_STRING_FACTORY factory, ANTLR3_UINT32 size)
+{
+    pANTLR3_STRING  string;
+
+    string  = factory->newRaw(factory);
+
+    if (string == NULL)
+    {
+               return  string;
+    }
+
+    /* Always add one more byte for a terminator ;-)
+     */
+    string->chars              = (pANTLR3_UINT8) ANTLR3_MALLOC((size_t)(sizeof(ANTLR3_UINT8) * (size+1)));
+       *(string->chars)        = '\0';
+    string->size               = size + 1;
+
+
+    return string;
+}
+/**
+ * Creates a new string with enough capacity for size 16 bit characters plus a terminator.
+ *
+ * \param[in] factory - POitner to the string factory that owns strings
+ * \param[in] size - In characters
+ * \return pointer to the new string.
+ */
+static    pANTLR3_STRING    
+newSize16      (pANTLR3_STRING_FACTORY factory, ANTLR3_UINT32 size)
+{
+    pANTLR3_STRING  string;
+
+    string  = factory->newRaw(factory);
+
+    if (string == NULL)
+    {
+               return  string;
+    }
+
+    /* Always add one more byte for a terminator ;-)
+     */        
+    string->chars              = (pANTLR3_UINT8) ANTLR3_MALLOC((size_t)(sizeof(ANTLR3_UINT16) * (size+1)));
+       *(string->chars)        = '\0';
+    string->size               = size+1;       /* Size is always in characters, as is len */
+
+    return string;
+}
+
+/** Creates a new 8 bit string initialized with the 8 bit characters at the 
+ *  supplied ptr, of pre-determined size.
+ * \param[in] factory - Pointer to the string factory that owns the strings
+ * \param[in] ptr - Pointer to 8 bit encoded characters
+ * \return pointer to the new string
+ */
+static    pANTLR3_STRING    
+newPtr8        (pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 ptr, ANTLR3_UINT32 size)
+{
+       pANTLR3_STRING  string;
+
+       string  = factory->newSize(factory, size);
+
+       if      (string == NULL)
+       {
+               return  NULL;
+       }
+
+       if      (size <= 0)
+       {
+               return  string;
+       }
+
+       if      (ptr != NULL)
+       {
+               ANTLR3_MEMMOVE(string->chars, (const void *)ptr, size);
+               *(string->chars + size) = '\0';     /* Terminate, these strings are usually used for Token streams and printing etc.    */
+               string->len = size;
+       }
+
+       return  string;
+}
+
+/** Creates a new 16 bit string initialized with the 8 bit characters at the 
+ *  supplied 8 bit character ptr, of pre-determined size.
+ * \param[in] factory - Pointer to the string factory that owns the strings
+ * \param[in] ptr - Pointer to 8 bit encoded characters
+ * \return pointer to the new string
+ */
+static    pANTLR3_STRING    
+newPtr16_8     (pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 ptr, ANTLR3_UINT32 size)
+{
+       pANTLR3_STRING  string;
+
+       /* newSize accepts size in characters, not bytes
+       */
+       string  = factory->newSize(factory, size);
+
+       if      (string == NULL)
+       {
+               return  NULL;
+       }
+
+       if      (size <= 0)
+       {
+               return  string;
+       }
+
+       if      (ptr != NULL)
+       {
+               pANTLR3_UINT16  out;
+               ANTLR3_INT32    inSize;
+
+               out = (pANTLR3_UINT16)(string->chars);
+               inSize  = size;
+
+               while   (inSize-- > 0)
+               {
+                       *out++ = (ANTLR3_UINT16)(*ptr++);
+               }
+
+               /* Terminate, these strings are usually used for Token streams and printing etc.        
+               */
+               *(((pANTLR3_UINT16)(string->chars)) + size) = '\0';
+
+               string->len = size;
+       }
+
+       return  string;
+}
+
+/** Creates a new 16 bit string initialized with the 16 bit characters at the 
+ *  supplied ptr, of pre-determined size.
+ * \param[in] factory - Pointer to the string factory that owns the strings
+ * \param[in] ptr - Pointer to 16 bit encoded characters
+ * \return pointer to the new string
+ */
+static    pANTLR3_STRING    
+newPtr16_16    (pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 ptr, ANTLR3_UINT32 size)
+{
+       pANTLR3_STRING  string;
+
+       string  = factory->newSize(factory, size);
+
+       if      (string == NULL)
+       {
+               return  NULL;
+       }
+
+       if      (size <= 0)
+       {
+               return  string;
+       }
+
+       if      (ptr != NULL)
+       {
+               ANTLR3_MEMMOVE(string->chars, (const void *)ptr, (size * sizeof(ANTLR3_UINT16)));
+
+               /* Terminate, these strings are usually used for Token streams and printing etc.        
+               */
+               *(((pANTLR3_UINT16)(string->chars)) + size) = '\0';         
+               string->len = size;
+       }
+
+       return  string;
+}
+
+/** Create a new 8 bit string from the supplied, null terminated, 8 bit string pointer.
+ * \param[in] factory - Pointer to the string factory that owns strings.
+ * \param[in] ptr - Pointer to the 8 bit encoded string
+ * \return Pointer to the newly initialized string
+ */
+static    pANTLR3_STRING    
+newStr8        (pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 ptr)
+{
+    return factory->newPtr8(factory, ptr, (ANTLR3_UINT32)strlen((const char *)ptr));
+}
+
+/** Create a new 16 bit string from the supplied, null terminated, 8 bit string pointer.
+ * \param[in] factory - Pointer to the string factory that owns strings.
+ * \param[in] ptr - Pointer to the 8 bit encoded string
+ * \return POinter to the newly initialized string
+ */
+static    pANTLR3_STRING    
+newStr16_8     (pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 ptr)
+{
+    return factory->newPtr8(factory, ptr, (ANTLR3_UINT32)strlen((const char *)ptr));
+}
+
+/** Create a new 16 bit string from the supplied, null terminated, 16 bit string pointer.
+ * \param[in] factory - Pointer to the string factory that owns strings.
+ * \param[in] ptr - Pointer to the 16 bit encoded string
+ * \return Pointer to the newly initialized string
+ */
+static    pANTLR3_STRING    
+newStr16_16    (pANTLR3_STRING_FACTORY factory, pANTLR3_UINT8 ptr)
+{
+    pANTLR3_UINT16  in;
+    ANTLR3_UINT32   count;
+
+    /** First, determine the length of the input string
+     */
+    in     = (pANTLR3_UINT16)ptr;
+    count   = 0;
+
+    while   (*in++ != '\0')
+    {
+               count++;
+    }
+    return factory->newPtr(factory, ptr, count);
+}
+
+static    void             
+destroy        (pANTLR3_STRING_FACTORY factory, pANTLR3_STRING string)
+{
+    // Record which string we are deleting
+    //
+    ANTLR3_UINT32 strIndex = string->index;
+    
+    // Ensure that the string was not factory made, or we would try
+    // to delete memory that wasn't allocated outside the factory
+    // block.
+    // Remove the specific indexed string from the vector
+    //
+    factory->strings->del(factory->strings, strIndex);
+
+    // One less string in the vector, so decrement the factory index
+    // so that the next string allocated is indexed correctly with
+    // respect to the vector.
+    //
+    factory->index--;
+
+    // Now we have to reindex the strings in the vector that followed
+    // the one we just deleted. We only do this if the one we just deleted
+    // was not the last one.
+    //
+    if  (strIndex< factory->index)
+    {
+        // We must reindex the strings after the one we just deleted.
+        // The one that follows the one we just deleted is also out
+        // of whack, so we start there.
+        //
+        ANTLR3_UINT32 i;
+
+        for (i = strIndex; i < factory->index; i++)
+        {
+            // Renumber the entry
+            //
+            ((pANTLR3_STRING)(factory->strings->elements[i].element))->index = i;
+        }
+    }
+
+    // The string has been destroyed and the elements of the factory are reindexed.
+    //
+
+}
+
+static    pANTLR3_STRING    
+printable8(pANTLR3_STRING_FACTORY factory, pANTLR3_STRING instr)
+{
+    pANTLR3_STRING  string;
+    
+    /* We don't need to be too efficient here, this is mostly for error messages and so on.
+     */
+    pANTLR3_UINT8   scannedText;
+    ANTLR3_UINT32   i;
+
+    /* Assume we need as much as twice as much space to parse out the control characters
+     */
+    string  = factory->newSize(factory, instr->len *2 + 1);
+
+    /* Scan through and replace unprintable (in terms of this routine)
+     * characters
+     */
+    scannedText = string->chars;
+
+    for        (i = 0; i < instr->len; i++)
+    {
+               if (*(instr->chars + i) == '\n')
+               {
+                       *scannedText++ = '\\';
+                       *scannedText++ = 'n';
+               }
+               else if (*(instr->chars + i) == '\r')
+               {
+                       *scannedText++ = '\\';
+                       *scannedText++ = 'r';
+               }
+               else if (!isprint(*(instr->chars +i)))
+               {
+                       *scannedText++ = '?';
+               }
+               else
+               {
+                       *scannedText++ = *(instr->chars + i);
+               }
+    }
+    *scannedText  = '\0';
+
+    string->len        = (ANTLR3_UINT32)(scannedText - string->chars);
+    
+    return  string;
+}
+
+static    pANTLR3_STRING    
+printable16(pANTLR3_STRING_FACTORY factory, pANTLR3_STRING instr)
+{
+    pANTLR3_STRING  string;
+    
+    /* We don't need to be too efficient here, this is mostly for error messages and so on.
+     */
+    pANTLR3_UINT16  scannedText;
+    pANTLR3_UINT16  inText;
+    ANTLR3_UINT32   i;
+    ANTLR3_UINT32   outLen;
+
+    /* Assume we need as much as twice as much space to parse out the control characters
+     */
+    string  = factory->newSize(factory, instr->len *2 + 1);
+
+    /* Scan through and replace unprintable (in terms of this routine)
+     * characters
+     */
+    scannedText = (pANTLR3_UINT16)(string->chars);
+    inText     = (pANTLR3_UINT16)(instr->chars);
+    outLen     = 0;
+
+    for        (i = 0; i < instr->len; i++)
+    {
+               if (*(inText + i) == '\n')
+               {
+                       *scannedText++   = '\\';
+                       *scannedText++   = 'n';
+                       outLen      += 2;
+               }
+               else if (*(inText + i) == '\r')
+               {
+                       *scannedText++   = '\\';
+                       *scannedText++   = 'r';
+                       outLen      += 2;
+               }
+               else if (!isprint(*(inText +i)))
+               {
+                       *scannedText++ = '?';
+                       outLen++;
+               }
+               else
+               {
+                       *scannedText++ = *(inText + i);
+                       outLen++;
+               }
+    }
+    *scannedText  = '\0';
+
+    string->len        = outLen;
+    
+    return  string;
+}
+
+/** Fascist Capitalist Pig function created
+ *  to oppress the workers comrade.
+ */
+static    void             
+closeFactory   (pANTLR3_STRING_FACTORY factory)
+{
+    /* Delete the vector we were tracking the strings with, this will
+     * causes all the allocated strings to be deallocated too
+     */
+    factory->strings->free(factory->strings);
+
+    /* Delete the space for the factory itself
+     */
+    ANTLR3_FREE((void *)factory);
+}
+
+static    pANTLR3_UINT8   
+append8        (pANTLR3_STRING string, const char * newbit)
+{
+    ANTLR3_UINT32 len;
+
+    len        = (ANTLR3_UINT32)strlen(newbit);
+
+    if (string->size < (string->len + len + 1))
+    {
+               string->chars   = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(string->len + len + 1));
+               string->size    = string->len + len + 1;
+    }
+
+    /* Note we copy one more byte than the strlen in order to get the trailing
+     */
+    ANTLR3_MEMMOVE((void *)(string->chars + string->len), newbit, (ANTLR3_UINT32)(len+1));
+    string->len        += len;
+
+    return string->chars;
+}
+
+static    pANTLR3_UINT8   
+append16_8     (pANTLR3_STRING string, const char * newbit)
+{
+    ANTLR3_UINT32   len;
+    pANTLR3_UINT16  apPoint;
+    ANTLR3_UINT32   count;
+
+    len        = (ANTLR3_UINT32)strlen(newbit);
+
+    if (string->size < (string->len + len + 1))
+    {
+               string->chars   = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)((sizeof(ANTLR3_UINT16)*(string->len + len + 1))));
+               string->size    = string->len + len + 1;
+    }
+
+    apPoint = ((pANTLR3_UINT16)string->chars) + string->len;
+    string->len        += len;
+
+    for        (count = 0; count < len; count++)
+    {
+               *apPoint++   = *(newbit + count);
+    }
+    *apPoint = '\0';
+
+    return string->chars;
+}
+
+static    pANTLR3_UINT8   
+append16_16    (pANTLR3_STRING string, const char * newbit)
+{
+    ANTLR3_UINT32 len;
+    pANTLR3_UINT16  in;
+
+    /** First, determine the length of the input string
+     */
+    in     = (pANTLR3_UINT16)newbit;
+    len   = 0;
+
+    while   (*in++ != '\0')
+    {
+               len++;
+    }
+
+    if (string->size < (string->len + len + 1))
+    {
+               string->chars   = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)( sizeof(ANTLR3_UINT16) *(string->len + len + 1) ));
+               string->size    = string->len + len + 1;
+    }
+
+    /* Note we copy one more byte than the strlen in order to get the trailing delimiter
+     */
+    ANTLR3_MEMMOVE((void *)(((pANTLR3_UINT16)string->chars) + string->len), newbit, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(len+1)));
+    string->len        += len;
+
+    return string->chars;
+}
+
+static    pANTLR3_UINT8   
+set8   (pANTLR3_STRING string, const char * chars)
+{
+    ANTLR3_UINT32      len;
+
+    len = (ANTLR3_UINT32)strlen(chars);
+    if (string->size < len + 1)
+    {
+               string->chars   = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(len + 1));
+               string->size    = len + 1;
+    }
+
+    /* Note we copy one more byte than the strlen in order to get the trailing '\0'
+     */
+    ANTLR3_MEMMOVE((void *)(string->chars), chars, (ANTLR3_UINT32)(len+1));
+    string->len            = len;
+
+    return  string->chars;
+
+}
+
+static    pANTLR3_UINT8   
+set16_8        (pANTLR3_STRING string, const char * chars)
+{
+    ANTLR3_UINT32      len;
+    ANTLR3_UINT32      count;
+    pANTLR3_UINT16     apPoint;
+
+    len = (ANTLR3_UINT32)strlen(chars);
+    if (string->size < len + 1)
+       {
+               string->chars   = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(len + 1)));
+               string->size    = len + 1;
+    }
+    apPoint = ((pANTLR3_UINT16)string->chars);
+    string->len        = len;
+
+    for        (count = 0; count < string->len; count++)
+    {
+               *apPoint++   = *(chars + count);
+    }
+    *apPoint = '\0';
+
+    return  string->chars;
+}
+
+static    pANTLR3_UINT8   
+set16_16    (pANTLR3_STRING string, const char * chars)
+{
+    ANTLR3_UINT32   len;
+    pANTLR3_UINT16  in;
+
+    /** First, determine the length of the input string
+     */
+    in     = (pANTLR3_UINT16)chars;
+    len   = 0;
+
+    while   (*in++ != '\0')
+    {
+               len++;
+    }
+
+    if (string->size < len + 1)
+    {
+               string->chars   = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(len + 1)));
+               string->size    = len + 1;
+    }
+
+    /* Note we copy one more byte than the strlen in order to get the trailing '\0'
+     */
+    ANTLR3_MEMMOVE((void *)(string->chars), chars, (ANTLR3_UINT32)((len+1) * sizeof(ANTLR3_UINT16)));
+    string->len            = len;
+
+    return  string->chars;
+
+}
+
+static    pANTLR3_UINT8   
+addc8  (pANTLR3_STRING string, ANTLR3_UINT32 c)
+{
+    if (string->size < string->len + 2)
+    {
+               string->chars   = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(string->len + 2));
+               string->size    = string->len + 2;
+    }
+    *(string->chars + string->len)     = (ANTLR3_UINT8)c;
+    *(string->chars + string->len + 1) = '\0';
+    string->len++;
+
+    return  string->chars;
+}
+
+static    pANTLR3_UINT8   
+addc16 (pANTLR3_STRING string, ANTLR3_UINT32 c)
+{
+    pANTLR3_UINT16  ptr;
+
+    if (string->size < string->len + 2)
+    {
+               string->chars   = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16) * (string->len + 2)));
+               string->size    = string->len + 2;
+    }
+    ptr        = (pANTLR3_UINT16)(string->chars);
+
+    *(ptr + string->len)       = (ANTLR3_UINT16)c;
+    *(ptr + string->len + 1)   = '\0';
+    string->len++;
+
+    return  string->chars;
+}
+
+static    pANTLR3_UINT8   
+addi8  (pANTLR3_STRING string, ANTLR3_INT32 i)
+{
+    ANTLR3_UINT8           newbit[32];
+
+    sprintf((char *)newbit, "%d", i);
+
+    return  string->append8(string, (const char *)newbit);
+}
+static    pANTLR3_UINT8   
+addi16 (pANTLR3_STRING string, ANTLR3_INT32 i)
+{
+    ANTLR3_UINT8           newbit[32];
+
+    sprintf((char *)newbit, "%d", i);
+
+    return  string->append8(string, (const char *)newbit);
+}
+
+static   pANTLR3_UINT8
+inserti8    (pANTLR3_STRING string, ANTLR3_UINT32 point, ANTLR3_INT32 i)
+{
+    ANTLR3_UINT8           newbit[32];
+
+    sprintf((char *)newbit, "%d", i);
+    return  string->insert8(string, point, (const char *)newbit);
+}
+static   pANTLR3_UINT8
+inserti16    (pANTLR3_STRING string, ANTLR3_UINT32 point, ANTLR3_INT32 i)
+{
+    ANTLR3_UINT8           newbit[32];
+
+    sprintf((char *)newbit, "%d", i);
+    return  string->insert8(string, point, (const char *)newbit);
+}
+
+static pANTLR3_UINT8
+insert8        (pANTLR3_STRING string, ANTLR3_UINT32 point, const char * newbit)
+{
+    ANTLR3_UINT32      len;
+
+    if (point >= string->len)
+    {
+               return  string->append(string, newbit);
+    }
+    len        = (ANTLR3_UINT32)strlen(newbit);
+
+    if (len == 0)
+    {
+               return  string->chars;
+    }
+
+    if (string->size < (string->len + len + 1))
+    {
+               string->chars   = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(string->len + len + 1));
+               string->size    = string->len + len + 1;
+    }
+
+    /* Move the characters we are inserting before, including the delimiter
+     */
+    ANTLR3_MEMMOVE((void *)(string->chars + point + len), (void *)(string->chars + point), (ANTLR3_UINT32)(string->len - point + 1));
+
+    /* Note we copy the exact number of bytes
+     */
+    ANTLR3_MEMMOVE((void *)(string->chars + point), newbit, (ANTLR3_UINT32)(len));
+    
+    string->len += len;
+
+    return  string->chars;
+}
+
+static pANTLR3_UINT8
+insert16_8     (pANTLR3_STRING string, ANTLR3_UINT32 point, const char * newbit)
+{
+    ANTLR3_UINT32      len;
+    ANTLR3_UINT32      count;
+    pANTLR3_UINT16     inPoint;
+
+    if (point >= string->len)
+    {
+               return  string->append8(string, newbit);
+    }
+    len        = (ANTLR3_UINT32)strlen(newbit);
+
+    if (len == 0)
+    {
+               return  string->chars;
+    }
+
+    if (string->size < (string->len + len + 1))
+    {
+       string->chars   = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(string->len + len + 1)));
+       string->size    = string->len + len + 1;
+    }
+
+    /* Move the characters we are inserting before, including the delimiter
+     */
+    ANTLR3_MEMMOVE((void *)(((pANTLR3_UINT16)string->chars) + point + len), (void *)(((pANTLR3_UINT16)string->chars) + point), (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(string->len - point + 1)));
+
+    string->len += len;
+    
+    inPoint = ((pANTLR3_UINT16)(string->chars))+point;
+    for        (count = 0; count<len; count++)
+    {
+               *(inPoint + count) = (ANTLR3_UINT16)(*(newbit+count));
+    }
+
+    return  string->chars;
+}
+
+static pANTLR3_UINT8
+insert16_16    (pANTLR3_STRING string, ANTLR3_UINT32 point, const char * newbit)
+{
+    ANTLR3_UINT32      len;
+    pANTLR3_UINT16     in;
+
+    if (point >= string->len)
+    {
+               return  string->append(string, newbit);
+    }
+    /** First, determine the length of the input string
+     */
+    in     = (pANTLR3_UINT16)newbit;
+    len            = 0;
+
+    while   (*in++ != '\0')
+    {
+               len++;
+    }
+
+    if (len == 0)
+    {
+               return  string->chars;
+    }
+
+    if (string->size < (string->len + len + 1))
+    {
+               string->chars   = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(string->len + len + 1)));
+               string->size    = string->len + len + 1;
+    }
+
+    /* Move the characters we are inserting before, including the delimiter
+     */
+    ANTLR3_MEMMOVE((void *)(((pANTLR3_UINT16)string->chars) + point + len), (void *)(((pANTLR3_UINT16)string->chars) + point), (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(string->len - point + 1)));
+
+
+    /* Note we copy the exact number of characters
+     */
+    ANTLR3_MEMMOVE((void *)(((pANTLR3_UINT16)string->chars) + point), newbit, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(len)));
+    
+    string->len += len;
+
+    return  string->chars;
+}
+
+static    pANTLR3_UINT8            setS        (pANTLR3_STRING string, pANTLR3_STRING chars)
+{
+    return  string->set(string, (const char *)(chars->chars));
+}
+
+static    pANTLR3_UINT8            appendS     (pANTLR3_STRING string, pANTLR3_STRING newbit)
+{
+    /* We may be passed an empty string, in which case we just return the current pointer
+     */
+    if (newbit == NULL || newbit->len == 0 || newbit->size == 0 || newbit->chars == NULL)
+    {
+               return  string->chars;
+    }
+    else
+    {
+               return  string->append(string, (const char *)(newbit->chars));
+    }
+}
+
+static   pANTLR3_UINT8     insertS     (pANTLR3_STRING string, ANTLR3_UINT32 point, pANTLR3_STRING newbit)
+{
+    return  string->insert(string, point, (const char *)(newbit->chars));
+}
+
+/* Function that compares the text of a string to the supplied
+ * 8 bit character string and returns a result a la strcmp()
+ */
+static ANTLR3_UINT32   
+compare8       (pANTLR3_STRING string, const char * compStr)
+{
+    return  strcmp((const char *)(string->chars), compStr);
+}
+
+/* Function that compares the text of a string with the supplied character string
+ * (which is assumed to be in the same encoding as the string itself) and returns a result
+ * a la strcmp()
+ */
+static ANTLR3_UINT32   
+compare16_8    (pANTLR3_STRING string, const char * compStr)
+{
+    pANTLR3_UINT16  ourString;
+    ANTLR3_UINT32   charDiff;
+
+    ourString  = (pANTLR3_UINT16)(string->chars);
+
+    while   (((ANTLR3_UCHAR)(*ourString) != '\0') && ((ANTLR3_UCHAR)(*compStr) != '\0'))
+    {
+               charDiff = *ourString - *compStr;
+               if  (charDiff != 0)
+               {
+                       return charDiff;
+               }
+               ourString++;
+               compStr++;
+    }
+
+    /* At this point, one of the strings was terminated
+     */
+    return (ANTLR3_UINT32)((ANTLR3_UCHAR)(*ourString) - (ANTLR3_UCHAR)(*compStr));
+
+}
+
+/* Function that compares the text of a string with the supplied character string
+ * (which is assumed to be in the same encoding as the string itself) and returns a result
+ * a la strcmp()
+ */
+static ANTLR3_UINT32   
+compare16_16   (pANTLR3_STRING string, const char * compStr8)
+{
+    pANTLR3_UINT16  ourString;
+    pANTLR3_UINT16  compStr;
+    ANTLR3_UINT32   charDiff;
+
+    ourString  = (pANTLR3_UINT16)(string->chars);
+    compStr    = (pANTLR3_UINT16)(compStr8);
+
+    while   (((ANTLR3_UCHAR)(*ourString) != '\0') && ((ANTLR3_UCHAR)(*((pANTLR3_UINT16)compStr)) != '\0'))
+    {
+               charDiff = *ourString - *compStr;
+               if  (charDiff != 0)
+               {
+                       return charDiff;
+               }
+               ourString++;
+               compStr++;
+    }
+
+    /* At this point, one of the strings was terminated
+     */
+    return (ANTLR3_UINT32)((ANTLR3_UCHAR)(*ourString) - (ANTLR3_UCHAR)(*compStr));
+}
+
+/* Function that compares the text of a string with the supplied string
+ * (which is assumed to be in the same encoding as the string itself) and returns a result
+ * a la strcmp()
+ */
+static ANTLR3_UINT32   
+compareS    (pANTLR3_STRING string, pANTLR3_STRING compStr)
+{
+    return  string->compare(string, (const char *)compStr->chars);
+}
+
+
+/* Function that returns the character indexed at the supplied
+ * offset as a 32 bit character.
+ */
+static ANTLR3_UCHAR    
+charAt8            (pANTLR3_STRING string, ANTLR3_UINT32 offset)
+{
+    if (offset > string->len)
+    {
+               return (ANTLR3_UCHAR)'\0';
+    }
+    else
+    {
+               return  (ANTLR3_UCHAR)(*(string->chars + offset));
+    }
+}
+
+/* Function that returns the character indexed at the supplied
+ * offset as a 32 bit character.
+ */
+static ANTLR3_UCHAR    
+charAt16    (pANTLR3_STRING string, ANTLR3_UINT32 offset)
+{
+    if (offset > string->len)
+    {
+               return (ANTLR3_UCHAR)'\0';
+    }
+    else
+    {
+               return  (ANTLR3_UCHAR)(*((pANTLR3_UINT16)(string->chars) + offset));
+    }
+}
+
+/* Function that returns a substring of the supplied string a la .subString(s,e)
+ * in java runtimes.
+ */
+static pANTLR3_STRING
+subString8   (pANTLR3_STRING string, ANTLR3_UINT32 startIndex, ANTLR3_UINT32 endIndex)
+{
+    pANTLR3_STRING newStr;
+
+    if (endIndex > string->len)
+    {
+               endIndex = string->len + 1;
+    }
+    newStr  = string->factory->newPtr(string->factory, string->chars + startIndex, endIndex - startIndex);
+
+    return newStr;
+}
+
+/* Returns a substring of the supplied string a la .subString(s,e)
+ * in java runtimes.
+ */
+static pANTLR3_STRING
+subString16  (pANTLR3_STRING string, ANTLR3_UINT32 startIndex, ANTLR3_UINT32 endIndex)
+{
+    pANTLR3_STRING newStr;
+
+    if (endIndex > string->len)
+    {
+               endIndex = string->len + 1;
+    }
+    newStr  = string->factory->newPtr(string->factory, (pANTLR3_UINT8)((pANTLR3_UINT16)(string->chars) + startIndex), endIndex - startIndex);
+
+    return newStr;
+}
+
+/* Function that can convert the characters in the string to an integer
+ */
+static ANTLR3_INT32
+toInt32_8          (struct ANTLR3_STRING_struct * string)
+{
+    return  atoi((const char *)(string->chars));
+}
+
+/* Function that can convert the characters in the string to an integer
+ */
+static ANTLR3_INT32
+toInt32_16       (struct ANTLR3_STRING_struct * string)
+{
+    pANTLR3_UINT16  input;
+    ANTLR3_INT32   value;
+    ANTLR3_BOOLEAN  negate;
+
+    value   = 0;
+    input   = (pANTLR3_UINT16)(string->chars);
+    negate  = ANTLR3_FALSE;
+
+    if (*input == (ANTLR3_UCHAR)'-')
+    {
+               negate = ANTLR3_TRUE;
+               input++;
+    }
+    else if (*input == (ANTLR3_UCHAR)'+')
+    {
+               input++;
+    }
+
+    while   (*input != '\0' && isdigit(*input))
+    {
+               value    = value * 10;
+               value   += ((ANTLR3_UINT32)(*input) - (ANTLR3_UINT32)'0');
+               input++;
+    }
+
+    return negate ? -value : value;
+}
+
+/* Function that returns a pointer to an 8 bit version of the string,
+ * which in this case is just the string as this is 
+ * 8 bit encodiing anyway.
+ */
+static   pANTLR3_STRING            to8_8       (pANTLR3_STRING string)
+{
+    return  string;
+}
+
+/* Function that returns an 8 bit version of the string,
+ * which in this case is returning all the 16 bit characters
+ * narrowed back into 8 bits, with characters that are too large
+ * replaced with '_'
+ */
+static   pANTLR3_STRING    to8_16      (pANTLR3_STRING string)
+{
+       pANTLR3_STRING  newStr;
+       ANTLR3_UINT32   i;
+
+       /* Create a new 8 bit string
+       */
+       newStr  = newRaw8(string->factory);
+
+       if      (newStr == NULL)
+       {
+               return  NULL;
+       }
+
+       /* Always add one more byte for a terminator
+       */
+       newStr->chars   = (pANTLR3_UINT8) ANTLR3_MALLOC((size_t)(string->len + 1));
+       newStr->size    = string->len + 1;
+       newStr->len         = string->len;
+
+       /* Now copy each 16 bit charActer , making it an 8 bit character of 
+       * some sort.
+       */
+       for     (i=0; i<string->len; i++)
+       {
+               ANTLR3_UCHAR    c;
+
+               c = *(((pANTLR3_UINT16)(string->chars)) + i);
+
+               *(newStr->chars + i) = (ANTLR3_UINT8)(c > 255 ? '_' : c);
+       }
+
+       /* Terminate
+       */
+       *(newStr->chars + newStr->len) = '\0';
+
+       return newStr;
+}