1f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* 2f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)******************************************************************************* 3f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* 4f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* Copyright (C) 1998-2008, International Business Machines 5f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* Corporation and others. All Rights Reserved. 6f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* 7f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)******************************************************************************* 8f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* 9f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* File ucbuf.c 10f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* 11f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* Modification History: 12f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* 13f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* Date Name Description 14f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* 05/10/01 Ram Creation. 15f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)******************************************************************************* 16f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*/ 17f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 18f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/utypes.h" 19f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/putil.h" 20f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/ucnv.h" 21f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/ucnv_err.h" 22f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "filestrm.h" 23f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "cstring.h" 24f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "cmemory.h" 25f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "ustrfmt.h" 26f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/ustring.h" 27f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/uchar.h" 28f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "ucbuf.h" 29f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include <stdio.h> 30f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 31f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#if !UCONFIG_NO_CONVERSION 32f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 33f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 34f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define MAX_IN_BUF 1000 35f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define MAX_U_BUF 1500 36f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define CONTEXT_LEN 20 37f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 38f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)struct UCHARBUF { 39f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UChar* buffer; 40f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UChar* currentPos; 41f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UChar* bufLimit; 42f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t bufCapacity; 43f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t remaining; 44f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t signatureLength; 45f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) FileStream* in; 46f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UConverter* conv; 47f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UBool showWarning; /* makes this API not produce any errors */ 48f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UBool isBuffered; 49f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}; 50f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 51f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_CAPI UBool U_EXPORT2 52f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)ucbuf_autodetect_fs(FileStream* in, const char** cp, UConverter** conv, int32_t* signatureLength, UErrorCode* error){ 53f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) char start[8]; 54f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t numRead; 55f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 56f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UChar target[1]={ 0 }; 57f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UChar* pTarget; 58f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) const char* pStart; 59f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 60f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* read a few bytes */ 61f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) numRead=T_FileStream_read(in, start, sizeof(start)); 62f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 63f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *cp = ucnv_detectUnicodeSignature(start, numRead, signatureLength, error); 64f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 65f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* unread the bytes beyond what was consumed for U+FEFF */ 66f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) T_FileStream_rewind(in); 67f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (*signatureLength > 0) { 68f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) numRead = T_FileStream_read(in, start, *signatureLength); 69f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 70f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 71f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(*cp==NULL){ 72f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *conv =NULL; 73f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return FALSE; 74f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 75f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 76f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* open the converter for the detected Unicode charset */ 77f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *conv = ucnv_open(*cp,error); 78f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 79f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* convert and ignore initial U+FEFF, and the buffer overflow */ 80f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) pTarget = target; 81f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) pStart = start; 82f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucnv_toUnicode(*conv, &pTarget, target+1, &pStart, start+*signatureLength, NULL, FALSE, error); 83f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *signatureLength = (int32_t)(pStart - start); 84f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(*error==U_BUFFER_OVERFLOW_ERROR) { 85f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *error=U_ZERO_ERROR; 86f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 87f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 88f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* verify that we successfully read exactly U+FEFF */ 89f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(U_SUCCESS(*error) && (pTarget!=(target+1) || target[0]!=0xfeff)) { 90f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *error=U_INTERNAL_PROGRAM_ERROR; 91f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 92f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 93f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 94f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return TRUE; 95f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 96f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static UBool ucbuf_isCPKnown(const char* cp){ 97f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(ucnv_compareNames("UTF-8",cp)==0){ 98f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return TRUE; 99f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 100f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(ucnv_compareNames("UTF-16BE",cp)==0){ 101f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return TRUE; 102f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 103f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(ucnv_compareNames("UTF-16LE",cp)==0){ 104f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return TRUE; 105f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 106f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(ucnv_compareNames("UTF-16",cp)==0){ 107f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return TRUE; 108f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 109f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(ucnv_compareNames("UTF-32",cp)==0){ 110f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return TRUE; 111f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 112f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(ucnv_compareNames("UTF-32BE",cp)==0){ 113f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return TRUE; 114f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 115f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(ucnv_compareNames("UTF-32LE",cp)==0){ 116f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return TRUE; 117f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 118f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(ucnv_compareNames("SCSU",cp)==0){ 119f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return TRUE; 120f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 121f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(ucnv_compareNames("BOCU-1",cp)==0){ 122f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return TRUE; 123f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 124f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(ucnv_compareNames("UTF-7",cp)==0){ 125f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return TRUE; 126f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 127f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return FALSE; 128f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 129f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 130f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_CAPI FileStream * U_EXPORT2 131f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)ucbuf_autodetect(const char* fileName, const char** cp,UConverter** conv, int32_t* signatureLength,UErrorCode* error){ 132f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) FileStream* in=NULL; 133f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(error==NULL || U_FAILURE(*error)){ 134f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL; 135f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 136f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(conv==NULL || cp==NULL || fileName==NULL){ 137f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *error = U_ILLEGAL_ARGUMENT_ERROR; 138f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL; 139f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 140f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* open the file */ 141f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) in= T_FileStream_open(fileName,"rb"); 142f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 143f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(in == NULL){ 144f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *error=U_FILE_ACCESS_ERROR; 145f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL; 146f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 147f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 148f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(ucbuf_autodetect_fs(in,cp,conv,signatureLength,error)) { 149f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return in; 150f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else { 151f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucnv_close(*conv); 152f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *conv=NULL; 153f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) T_FileStream_close(in); 154f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL; 155f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 156f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 157f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 158f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* fill the uchar buffer */ 159f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static UCHARBUF* 160f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)ucbuf_fillucbuf( UCHARBUF* buf,UErrorCode* error){ 161f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UChar* pTarget=NULL; 162f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UChar* target=NULL; 163f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) const char* source=NULL; 164f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) char carr[MAX_IN_BUF] = {'\0'}; 165f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) char* cbuf = carr; 166f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t inputRead=0; 167f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t outputWritten=0; 168f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t offset=0; 169f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) const char* sourceLimit =NULL; 170f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t cbufSize=0; 171f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) pTarget = buf->buffer; 172f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* check if we arrived here without exhausting the buffer*/ 173f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(buf->currentPos<buf->bufLimit){ 174f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) offset = (int32_t)(buf->bufLimit-buf->currentPos); 175f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) memmove(buf->buffer,buf->currentPos,offset* sizeof(UChar)); 176f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 177f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 178f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#if DEBUG 179f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) memset(pTarget+offset,0xff,sizeof(UChar)*(MAX_IN_BUF-offset)); 180f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif 181f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(buf->isBuffered){ 182f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) cbufSize = MAX_IN_BUF; 183f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* read the file */ 184f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) inputRead=T_FileStream_read(buf->in,cbuf,cbufSize-offset); 185f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->remaining-=inputRead; 186f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 187f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) }else{ 188f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) cbufSize = T_FileStream_size(buf->in); 189f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) cbuf = (char*)uprv_malloc(cbufSize); 190f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (cbuf == NULL) { 191f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *error = U_MEMORY_ALLOCATION_ERROR; 192f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL; 193f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 194f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) inputRead= T_FileStream_read(buf->in,cbuf,cbufSize); 195f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->remaining-=inputRead; 196f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 197f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 198f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* just to be sure...*/ 199f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if ( 0 == inputRead ) 200f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->remaining = 0; 201f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 202f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) target=pTarget; 203f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* convert the bytes */ 204f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(buf->conv){ 205f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* set the callback to stop */ 206f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UConverterToUCallback toUOldAction ; 207f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) void* toUOldContext; 208f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) void* toUNewContext=NULL; 209f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucnv_setToUCallBack(buf->conv, 210f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UCNV_TO_U_CALLBACK_STOP, 211f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) toUNewContext, 212f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) &toUOldAction, 213f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) (const void**)&toUOldContext, 214f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) error); 215f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* since state is saved in the converter we add offset to source*/ 216f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) target = pTarget+offset; 217f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) source = cbuf; 218f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) sourceLimit = source + inputRead; 219f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucnv_toUnicode(buf->conv,&target,target+(buf->bufCapacity-offset), 220f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) &source,sourceLimit,NULL, 221f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) (UBool)(buf->remaining==0),error); 222f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 223f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(U_FAILURE(*error)){ 224f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) char context[CONTEXT_LEN+1]; 225f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) char preContext[CONTEXT_LEN+1]; 226f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) char postContext[CONTEXT_LEN+1]; 227f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int8_t len = CONTEXT_LEN; 228f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t start=0; 229f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t stop =0; 230f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t pos =0; 231f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* use erro1 to preserve the error code */ 232f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UErrorCode error1 =U_ZERO_ERROR; 233f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 234f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if( buf->showWarning==TRUE){ 235f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fprintf(stderr,"\n###WARNING: Encountered abnormal bytes while" 236f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) " converting input stream to target encoding: %s\n", 237f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) u_errorName(*error)); 238f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 239f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 240f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 241f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* now get the context chars */ 242f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucnv_getInvalidChars(buf->conv,context,&len,&error1); 243f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) context[len]= 0 ; /* null terminate the buffer */ 244f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 245f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) pos = (int32_t)(source - cbuf - len); 246f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 247f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* for pre-context */ 248f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) start = (pos <=CONTEXT_LEN)? 0 : (pos - (CONTEXT_LEN-1)); 249f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) stop = pos-len; 250f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 251f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) memcpy(preContext,cbuf+start,stop-start); 252f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* null terminate the buffer */ 253f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) preContext[stop-start] = 0; 254f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 255f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* for post-context */ 256f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) start = pos+len; 257f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) stop = (int32_t)(((pos+CONTEXT_LEN)<= (sourceLimit-cbuf) )? (pos+(CONTEXT_LEN-1)) : (sourceLimit-cbuf)); 258f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 259f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) memcpy(postContext,source,stop-start); 260f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* null terminate the buffer */ 261f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) postContext[stop-start] = 0; 262f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 263f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(buf->showWarning ==TRUE){ 264f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* print out the context */ 265f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fprintf(stderr,"\tPre-context: %s\n",preContext); 266f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fprintf(stderr,"\tContext: %s\n",context); 267f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fprintf(stderr,"\tPost-context: %s\n", postContext); 268f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 269f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 270f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* reset the converter */ 271f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucnv_reset(buf->conv); 272f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 273f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* set the call back to substitute 274f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * and restart conversion 275f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */ 276f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucnv_setToUCallBack(buf->conv, 277f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UCNV_TO_U_CALLBACK_SUBSTITUTE, 278f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) toUNewContext, 279f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) &toUOldAction, 280f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) (const void**)&toUOldContext, 281f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) &error1); 282f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 283f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* reset source and target start positions */ 284f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) target = pTarget+offset; 285f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) source = cbuf; 286f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 287f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* re convert */ 288f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucnv_toUnicode(buf->conv,&target,target+(buf->bufCapacity-offset), 289f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) &source,sourceLimit,NULL, 290f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) (UBool)(buf->remaining==0),&error1); 291f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 292f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 293f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) outputWritten = (int32_t)(target - pTarget); 294f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 295f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 296f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#if DEBUG 297f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) { 298f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int i; 299f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) target = pTarget; 300f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) for(i=0;i<numRead;i++){ 301f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* printf("%c", (char)(*target++));*/ 302f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 303f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 304f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif 305f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 306f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) }else{ 307f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) u_charsToUChars(cbuf,target+offset,inputRead); 308f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) outputWritten=((buf->remaining>cbufSize)? cbufSize:inputRead+offset); 309f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 310f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->currentPos = pTarget; 311f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->bufLimit=pTarget+outputWritten; 312f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *buf->bufLimit=0; /*NUL terminate*/ 313f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(cbuf!=carr){ 314f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) uprv_free(cbuf); 315f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 316f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return buf; 317f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 318f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 319f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 320f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 321f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* get a UChar from the stream*/ 322f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_CAPI int32_t U_EXPORT2 323f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)ucbuf_getc(UCHARBUF* buf,UErrorCode* error){ 324f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(error==NULL || U_FAILURE(*error)){ 325f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return FALSE; 326f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 327f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(buf->currentPos>=buf->bufLimit){ 328f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(buf->remaining==0){ 329f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return U_EOF; 330f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 331f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf=ucbuf_fillucbuf(buf,error); 332f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(U_FAILURE(*error)){ 333f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return U_EOF; 334f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 335f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 336f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 337f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return *(buf->currentPos++); 338f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 339f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 340f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* get a UChar32 from the stream*/ 341f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_CAPI int32_t U_EXPORT2 342f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)ucbuf_getc32(UCHARBUF* buf,UErrorCode* error){ 343f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t retVal = (int32_t)U_EOF; 344f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(error==NULL || U_FAILURE(*error)){ 345f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return FALSE; 346f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 347f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(buf->currentPos+1>=buf->bufLimit){ 348f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(buf->remaining==0){ 349f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return U_EOF; 350f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 351f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf=ucbuf_fillucbuf(buf,error); 352f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(U_FAILURE(*error)){ 353f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return U_EOF; 354f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 355f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 356f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(UTF_IS_LEAD(*(buf->currentPos))){ 357f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) retVal=UTF16_GET_PAIR_VALUE(buf->currentPos[0],buf->currentPos[1]); 358f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->currentPos+=2; 359f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) }else{ 360f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) retVal = *(buf->currentPos++); 361f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 362f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return retVal; 363f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 364f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 365f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* u_unescapeAt() callback to return a UChar*/ 366f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static UChar U_CALLCONV 367f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)_charAt(int32_t offset, void *context) { 368f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return ((UCHARBUF*) context)->currentPos[offset]; 369f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 370f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 371f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* getc and escape it */ 372f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_CAPI int32_t U_EXPORT2 373f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)ucbuf_getcx32(UCHARBUF* buf,UErrorCode* error) { 374f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t length; 375f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t offset; 376f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UChar32 c32,c1,c2; 377f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(error==NULL || U_FAILURE(*error)){ 378f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return FALSE; 379f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 380f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* Fill the buffer if it is empty */ 381f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (buf->currentPos >=buf->bufLimit-2) { 382f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucbuf_fillucbuf(buf,error); 383f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 384f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 385f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* Get the next character in the buffer */ 386f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (buf->currentPos < buf->bufLimit) { 387f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) c1 = *(buf->currentPos)++; 388f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else { 389f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) c1 = U_EOF; 390f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 391f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 392f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) c2 = *(buf->currentPos); 393f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 394f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* If it isn't a backslash, return it */ 395f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (c1 != 0x005C) { 396f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return c1; 397f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 398f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 399f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* Determine the amount of data in the buffer */ 400f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) length = (int32_t)(buf->bufLimit - buf->currentPos); 401f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 402f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* The longest escape sequence is \Uhhhhhhhh; make sure 403f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) we have at least that many characters */ 404f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (length < 10) { 405f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 406f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* fill the buffer */ 407f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucbuf_fillucbuf(buf,error); 408f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) length = (int32_t)(buf->bufLimit - buf->buffer); 409f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 410f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 411f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* Process the escape */ 412f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) offset = 0; 413f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) c32 = u_unescapeAt(_charAt, &offset, length, (void*)buf); 414f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 415f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* check if u_unescapeAt unescaped and converted 416f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * to c32 or not 417f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */ 418f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(c32==0xFFFFFFFF){ 419f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(buf->showWarning) { 420f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) char context[CONTEXT_LEN+1]; 421f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t len = CONTEXT_LEN; 422f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(length < len) { 423f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) len = length; 424f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 425f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) context[len]= 0 ; /* null terminate the buffer */ 426f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) u_UCharsToChars( buf->currentPos, context, len); 427f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fprintf(stderr,"Bad escape: [%c%s]...\n", (int)c1, context); 428f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 429f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *error= U_ILLEGAL_ESCAPE_SEQUENCE; 430f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return c1; 431f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) }else if(c32!=c2 || (c32==0x0075 && c2==0x0075 && c1==0x005C) /* for \u0075 c2=0x0075 and c32==0x0075*/){ 432f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* Update the current buffer position */ 433f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->currentPos += offset; 434f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) }else{ 435f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* unescaping failed so we just return 436f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * c1 and not consume the buffer 437f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * this is useful for rules with escapes 438f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * in resouce bundles 439f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * eg: \' \\ \" 440f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */ 441f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return c1; 442f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 443f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 444f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return c32; 445f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 446f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 447f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_CAPI UCHARBUF* U_EXPORT2 448f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)ucbuf_open(const char* fileName,const char** cp,UBool showWarning, UBool buffered, UErrorCode* error){ 449f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 450f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) FileStream* in = NULL; 451f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t fileSize=0; 452f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) const char* knownCp; 453f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(error==NULL || U_FAILURE(*error)){ 454f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL; 455f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 456f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(cp==NULL || fileName==NULL){ 457f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *error = U_ILLEGAL_ARGUMENT_ERROR; 458f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return FALSE; 459f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 460f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (!uprv_strcmp(fileName, "-")) { 461f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) in = T_FileStream_stdin(); 462f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) }else{ 463f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) in = T_FileStream_open(fileName, "rb"); 464f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 465f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 466f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(in!=NULL){ 467f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UCHARBUF* buf =(UCHARBUF*) uprv_malloc(sizeof(UCHARBUF)); 468f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fileSize = T_FileStream_size(in); 469f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(buf == NULL){ 470f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *error = U_MEMORY_ALLOCATION_ERROR; 471f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) T_FileStream_close(in); 472f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL; 473f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 474f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->in=in; 475f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->conv=NULL; 476f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->showWarning = showWarning; 477f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->isBuffered = buffered; 478f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->signatureLength=0; 479f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(*cp==NULL || **cp=='\0'){ 480f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* don't have code page name... try to autodetect */ 481f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucbuf_autodetect_fs(in,cp,&buf->conv,&buf->signatureLength,error); 482f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) }else if(ucbuf_isCPKnown(*cp)){ 483f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* discard BOM */ 484f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucbuf_autodetect_fs(in,&knownCp,&buf->conv,&buf->signatureLength,error); 485f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 486f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(U_SUCCESS(*error) && buf->conv==NULL) { 487f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->conv=ucnv_open(*cp,error); 488f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 489f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(U_FAILURE(*error)){ 490f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucnv_close(buf->conv); 491f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) uprv_free(buf); 492f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) T_FileStream_close(in); 493f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL; 494f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 495f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 496f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if((buf->conv==NULL) && (buf->showWarning==TRUE)){ 497f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fprintf(stderr,"###WARNING: No converter defined. Using codepage of system.\n"); 498f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 499f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->remaining=fileSize-buf->signatureLength; 500f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(buf->isBuffered){ 501f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->bufCapacity=MAX_U_BUF; 502f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) }else{ 503f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->bufCapacity=buf->remaining+buf->signatureLength+1/*for terminating nul*/; 504f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 505f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->buffer=(UChar*) uprv_malloc(U_SIZEOF_UCHAR * buf->bufCapacity ); 506f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (buf->buffer == NULL) { 507f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *error = U_MEMORY_ALLOCATION_ERROR; 508f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucbuf_close(buf); 509f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL; 510f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 511f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->currentPos=buf->buffer; 512f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->bufLimit=buf->buffer; 513f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(U_FAILURE(*error)){ 514f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fprintf(stderr, "Could not open codepage [%s]: %s\n", *cp, u_errorName(*error)); 515f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucbuf_close(buf); 516f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL; 517f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 518f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucbuf_fillucbuf(buf,error); 519f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(U_FAILURE(*error)){ 520f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucbuf_close(buf); 521f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL; 522f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 523f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return buf; 524f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 525f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *error =U_FILE_ACCESS_ERROR; 526f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL; 527f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 528f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 529f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 530f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 531f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* TODO: this method will fail if at the 532f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * begining of buffer and the uchar to unget 533f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * is from the previous buffer. Need to implement 534f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * system to take care of that situation. 535f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */ 536f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_CAPI void U_EXPORT2 537f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)ucbuf_ungetc(int32_t c,UCHARBUF* buf){ 538f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* decrement currentPos pointer 539f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * if not at the begining of buffer 540f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */ 541f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(buf->currentPos!=buf->buffer){ 542f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(*(buf->currentPos-1)==c){ 543f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->currentPos--; 544f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else { 545f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* ungetc failed - did not match. */ 546f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 547f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else { 548f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* ungetc failed - beginning of buffer. */ 549f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 550f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 551f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 552f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* frees the resources of UChar* buffer */ 553f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static void 554f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)ucbuf_closebuf(UCHARBUF* buf){ 555f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) uprv_free(buf->buffer); 556f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->buffer = NULL; 557f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 558f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 559f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* close the buf and release resources*/ 560f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_CAPI void U_EXPORT2 561f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)ucbuf_close(UCHARBUF* buf){ 562f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(buf!=NULL){ 563f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(buf->conv){ 564f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucnv_close(buf->conv); 565f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 566f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) T_FileStream_close(buf->in); 567f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucbuf_closebuf(buf); 568f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) uprv_free(buf); 569f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 570f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 571f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 572f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* rewind the buf and file stream */ 573f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_CAPI void U_EXPORT2 574f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)ucbuf_rewind(UCHARBUF* buf,UErrorCode* error){ 575f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(error==NULL || U_FAILURE(*error)){ 576f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 577f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 578f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(buf){ 579f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->currentPos=buf->buffer; 580f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->bufLimit=buf->buffer; 581f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) T_FileStream_rewind(buf->in); 582f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->remaining=T_FileStream_size(buf->in)-buf->signatureLength; 583f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 584f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucnv_resetToUnicode(buf->conv); 585f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(buf->signatureLength>0) { 586f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UChar target[1]={ 0 }; 587f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UChar* pTarget; 588f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) char start[8]; 589f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) const char* pStart; 590f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t numRead; 591f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 592f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* read the signature bytes */ 593f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) numRead=T_FileStream_read(buf->in, start, buf->signatureLength); 594f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 595f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* convert and ignore initial U+FEFF, and the buffer overflow */ 596f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) pTarget = target; 597f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) pStart = start; 598f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucnv_toUnicode(buf->conv, &pTarget, target+1, &pStart, start+numRead, NULL, FALSE, error); 599f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(*error==U_BUFFER_OVERFLOW_ERROR) { 600f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *error=U_ZERO_ERROR; 601f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 602f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 603f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* verify that we successfully read exactly U+FEFF */ 604f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(U_SUCCESS(*error) && (numRead!=buf->signatureLength || pTarget!=(target+1) || target[0]!=0xfeff)) { 605f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *error=U_INTERNAL_PROGRAM_ERROR; 606f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 607f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 608f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 609f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 610f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 611f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 612f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_CAPI int32_t U_EXPORT2 613f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)ucbuf_size(UCHARBUF* buf){ 614f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(buf){ 615f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(buf->isBuffered){ 616f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return (T_FileStream_size(buf->in)-buf->signatureLength)/ucnv_getMinCharSize(buf->conv); 617f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) }else{ 618f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return (int32_t)(buf->bufLimit - buf->buffer); 619f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 620f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 621f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return 0; 622f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 623f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 624f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_CAPI const UChar* U_EXPORT2 625f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)ucbuf_getBuffer(UCHARBUF* buf,int32_t* len,UErrorCode* error){ 626f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(error==NULL || U_FAILURE(*error)){ 627f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL; 628f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 629f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(buf==NULL || len==NULL){ 630f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *error = U_ILLEGAL_ARGUMENT_ERROR; 631f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL; 632f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 633f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *len = (int32_t)(buf->bufLimit - buf->buffer); 634f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return buf->buffer; 635f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 636f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 637f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_CAPI const char* U_EXPORT2 638f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)ucbuf_resolveFileName(const char* inputDir, const char* fileName, char* target, int32_t* len, UErrorCode* status){ 639f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t requiredLen = 0; 640f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t dirlen = 0; 641f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t filelen = 0; 642f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(status==NULL || U_FAILURE(*status)){ 643f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL; 644f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 645f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 646f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(inputDir == NULL || fileName == NULL || len==NULL || (target==NULL && *len>0)){ 647f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *status = U_ILLEGAL_ARGUMENT_ERROR; 648f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL; 649f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 650f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 651f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 652f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) dirlen = (int32_t)uprv_strlen(inputDir); 653f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) filelen = (int32_t)uprv_strlen(fileName); 654f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(inputDir[dirlen-1] != U_FILE_SEP_CHAR) { 655f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) requiredLen = dirlen + filelen + 2; 656f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if((*len < requiredLen) || target==NULL){ 657f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *len = requiredLen; 658f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *status = U_BUFFER_OVERFLOW_ERROR; 659f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL; 660f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 661f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 662f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) target[0] = '\0'; 663f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* 664f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * append the input dir to openFileName if the first char in 665f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * filename is not file seperation char and the last char input directory is not '.'. 666f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * This is to support : 667f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * genrb -s. /home/icu/data 668f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * genrb -s. icu/data 669f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * The user cannot mix notations like 670f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * genrb -s. /icu/data --- the absolute path specified. -s redundant 671f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * user should use 672f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * genrb -s. icu/data --- start from CWD and look in icu/data dir 673f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */ 674f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if( (fileName[0] != U_FILE_SEP_CHAR) && (inputDir[dirlen-1] !='.')){ 675f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) uprv_strcpy(target, inputDir); 676f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) target[dirlen] = U_FILE_SEP_CHAR; 677f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 678f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) target[dirlen + 1] = '\0'; 679f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else { 680f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) requiredLen = dirlen + filelen + 1; 681f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if((*len < requiredLen) || target==NULL){ 682f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *len = requiredLen; 683f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *status = U_BUFFER_OVERFLOW_ERROR; 684f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL; 685f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 686f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 687f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) uprv_strcpy(target, inputDir); 688f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 689f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 690f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) uprv_strcat(target, fileName); 691f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return target; 692f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 693f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* 694f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Unicode TR 13 says any of the below chars is 695f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * a new line char in a readline function in addition 696f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * to CR+LF combination which needs to be 697f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * handled seperately 698f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */ 699f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static UBool ucbuf_isCharNewLine(UChar c){ 700f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) switch(c){ 701f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) case 0x000A: /* LF */ 702f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) case 0x000D: /* CR */ 703f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) case 0x000C: /* FF */ 704f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) case 0x0085: /* NEL */ 705f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) case 0x2028: /* LS */ 706f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) case 0x2029: /* PS */ 707f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return TRUE; 708f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) default: 709f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return FALSE; 710f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 711f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 712f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 713f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_CAPI const UChar* U_EXPORT2 714f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)ucbuf_readline(UCHARBUF* buf,int32_t* len,UErrorCode* err){ 715f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UChar* temp = buf->currentPos; 716f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UChar* savePos =NULL; 717f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UChar c=0x0000; 718f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(buf->isBuffered){ 719f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* The input is buffered we have to do more 720f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * for returning a pointer U_TRUNCATED_CHAR_FOUND 721f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */ 722f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) for(;;){ 723f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) c = *temp++; 724f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(buf->remaining==0){ 725f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL; /* end of file is reached return NULL */ 726f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 727f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(temp>=buf->bufLimit && buf->currentPos == buf->buffer){ 728f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *err= U_TRUNCATED_CHAR_FOUND; 729f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL; 730f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) }else{ 731f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucbuf_fillucbuf(buf,err); 732f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(U_FAILURE(*err)){ 733f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL; 734f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 735f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 736f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* 737f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Accoding to TR 13 readLine functions must interpret 738f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * CR, CR+LF, LF, NEL, PS, LS or FF as line seperators 739f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */ 740f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* Windows CR LF */ 741f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(c ==0x0d && temp+1<=buf->bufLimit && *(temp+1) == 0x0a ){ 742f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *len = (int32_t)(temp++ - buf->currentPos); 743f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) savePos = buf->currentPos; 744f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->currentPos = temp; 745f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return savePos; 746f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 747f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* else */ 748f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 749f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (temp>=buf->bufLimit|| ucbuf_isCharNewLine(c)){ /* Unipad inserts 2028 line separators! */ 750f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *len = (int32_t)(temp - buf->currentPos); 751f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) savePos = buf->currentPos; 752f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->currentPos = temp; 753f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return savePos; 754f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 755f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 756f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) }else{ 757f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* we know that all input is read into the internal 758f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * buffer so we can safely return pointers 759f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */ 760f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) for(;;){ 761f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) c = *temp++; 762f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 763f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(buf->currentPos==buf->bufLimit){ 764f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL; /* end of file is reached return NULL */ 765f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 766f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* Windows CR LF */ 767f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(c ==0x0d && temp+1<=buf->bufLimit && *(temp+1) == 0x0a ){ 768f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *len = (int32_t)(temp++ - buf->currentPos); 769f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) savePos = buf->currentPos; 770f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->currentPos = temp; 771f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return savePos; 772f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 773f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* else */ 774f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (temp>=buf->bufLimit|| ucbuf_isCharNewLine(c)) { /* Unipad inserts 2028 line separators! */ 775f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *len = (int32_t)(temp - buf->currentPos); 776f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) savePos = buf->currentPos; 777f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf->currentPos = temp; 778f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return savePos; 779f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 780f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 781f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 782f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* not reached */ 783f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* A compiler warning will appear if all paths don't contain a return statement. */ 784f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* return NULL;*/ 785f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 786f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif 787