1f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* 2f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*************************************************************************** 3f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* Copyright (C) 1999-2010 International Business Machines Corporation * 4f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* and others. All rights reserved. * 5f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*************************************************************************** 6f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*/ 7f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 8f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/utypes.h" 9f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 10f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#if !UCONFIG_NO_BREAK_ITERATION 11f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 12f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/utypes.h" 13f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "rbbidata.h" 14f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "rbbirb.h" 15f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "utrie.h" 16f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "udatamem.h" 17f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "cmemory.h" 18f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "cstring.h" 19f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "umutex.h" 20f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 21f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "uassert.h" 22f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 23f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 24f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//----------------------------------------------------------------------------------- 25f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 26f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// Trie access folding function. Copied as-is from properties code in uchar.c 27f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 28f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//----------------------------------------------------------------------------------- 29f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_CDECL_BEGIN 30f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static int32_t U_CALLCONV 31f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)getFoldingOffset(uint32_t data) { 32f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* if bit 15 is set, then the folding offset is in bits 14..0 of the 16-bit trie result */ 33f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(data&0x8000) { 34f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return (int32_t)(data&0x7fff); 35f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else { 36f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return 0; 37f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 38f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 39f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_CDECL_END 40f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 41f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_NAMESPACE_BEGIN 42f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 43f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//----------------------------------------------------------------------------- 44f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 45f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// Constructors. 46f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 47f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//----------------------------------------------------------------------------- 48f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)RBBIDataWrapper::RBBIDataWrapper(const RBBIDataHeader *data, UErrorCode &status) { 49f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) init(data, status); 50f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 51f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 52f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)RBBIDataWrapper::RBBIDataWrapper(const RBBIDataHeader *data, enum EDontAdopt, UErrorCode &status) { 53f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) init(data, status); 54f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fDontFreeData = TRUE; 55f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 56f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 57f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)RBBIDataWrapper::RBBIDataWrapper(UDataMemory* udm, UErrorCode &status) { 58f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) const RBBIDataHeader *d = (const RBBIDataHeader *) 59f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // ((char *)&(udm->pHeader->info) + udm->pHeader->info.size); 60f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // taking into consideration the padding added in by udata_write 61f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ((char *)(udm->pHeader) + udm->pHeader->dataHeader.headerSize); 62f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) init(d, status); 63f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fUDataMem = udm; 64f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 65f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 66f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//----------------------------------------------------------------------------- 67f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 68f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// init(). Does most of the work of construction, shared between the 69f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// constructors. 70f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 71f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//----------------------------------------------------------------------------- 72f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)void RBBIDataWrapper::init(const RBBIDataHeader *data, UErrorCode &status) { 73f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)) { 74f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 75f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 76f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fHeader = data; 77f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (fHeader->fMagic != 0xb1a0 || fHeader->fFormatVersion[0] != 3) 78f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) { 79f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) status = U_INVALID_FORMAT_ERROR; 80f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 81f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 82f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Note: in ICU version 3.2 and earlier, there was a formatVersion 1 83f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // that is no longer supported. At that time fFormatVersion was 84f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // an int32_t field, rather than an array of 4 bytes. 85f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 86f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fDontFreeData = FALSE; 87f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fUDataMem = NULL; 88f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fReverseTable = NULL; 89f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fSafeFwdTable = NULL; 90f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fSafeRevTable = NULL; 91f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (data->fFTableLen != 0) { 92f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fForwardTable = (RBBIStateTable *)((char *)data + fHeader->fFTable); 93f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 94f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (data->fRTableLen != 0) { 95f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fReverseTable = (RBBIStateTable *)((char *)data + fHeader->fRTable); 96f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 97f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (data->fSFTableLen != 0) { 98f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fSafeFwdTable = (RBBIStateTable *)((char *)data + fHeader->fSFTable); 99f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 100f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (data->fSRTableLen != 0) { 101f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fSafeRevTable = (RBBIStateTable *)((char *)data + fHeader->fSRTable); 102f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 103f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 104f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 105f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) utrie_unserialize(&fTrie, 106f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) (uint8_t *)data + fHeader->fTrie, 107f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fHeader->fTrieLen, 108f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) &status); 109f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)) { 110f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 111f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 112f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fTrie.getFoldingOffset=getFoldingOffset; 113f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 114f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 115f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fRuleSource = (UChar *)((char *)data + fHeader->fRuleSource); 116f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fRuleString.setTo(TRUE, fRuleSource, -1); 117f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) U_ASSERT(data->fRuleSourceLen > 0); 118f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 119f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fRuleStatusTable = (int32_t *)((char *)data + fHeader->fStatusTable); 120f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fStatusMaxIdx = data->fStatusTableLen / sizeof(int32_t); 121f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 122f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fRefCount = 1; 123f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 124f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#ifdef RBBI_DEBUG 125f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) char *debugEnv = getenv("U_RBBIDEBUG"); 126f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (debugEnv && uprv_strstr(debugEnv, "data")) {this->printData();} 127f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif 128f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 129f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 130f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 131f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//----------------------------------------------------------------------------- 132f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 133f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// Destructor. Don't call this - use removeReference() instead. 134f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 135f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//----------------------------------------------------------------------------- 136f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)RBBIDataWrapper::~RBBIDataWrapper() { 137f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) U_ASSERT(fRefCount == 0); 138f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (fUDataMem) { 139f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) udata_close(fUDataMem); 140f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else if (!fDontFreeData) { 141f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) uprv_free((void *)fHeader); 142f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 143f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 144f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 145f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 146f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 147f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//----------------------------------------------------------------------------- 148f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 149f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// Operator == Consider two RBBIDataWrappers to be equal if they 150f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// refer to the same underlying data. Although 151f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// the data wrappers are normally shared between 152f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// iterator instances, it's possible to independently 153f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// open the same data twice, and get two instances, which 154f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// should still be ==. 155f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 156f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//----------------------------------------------------------------------------- 157f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)UBool RBBIDataWrapper::operator ==(const RBBIDataWrapper &other) const { 158f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (fHeader == other.fHeader) { 159f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return TRUE; 160f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 161f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (fHeader->fLength != other.fHeader->fLength) { 162f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return FALSE; 163f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 164f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (uprv_memcmp(fHeader, other.fHeader, fHeader->fLength) == 0) { 165f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return TRUE; 166f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 167f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return FALSE; 168f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 169f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 170f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)int32_t RBBIDataWrapper::hashCode() { 171f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return fHeader->fFTableLen; 172f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 173f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 174f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 175f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 176f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//----------------------------------------------------------------------------- 177f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 178f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// Reference Counting. A single RBBIDataWrapper object is shared among 179f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// however many RulesBasedBreakIterator instances are 180f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// referencing the same data. 181f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 182f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//----------------------------------------------------------------------------- 183f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)void RBBIDataWrapper::removeReference() { 184f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (umtx_atomic_dec(&fRefCount) == 0) { 185f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) delete this; 186f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 187f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 188f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 189f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 190f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)RBBIDataWrapper *RBBIDataWrapper::addReference() { 191f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) umtx_atomic_inc(&fRefCount); 192f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return this; 193f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 194f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 195f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 196f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 197f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//----------------------------------------------------------------------------- 198f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 199f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// getRuleSourceString 200f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 201f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//----------------------------------------------------------------------------- 202f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)const UnicodeString &RBBIDataWrapper::getRuleSourceString() const { 203f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return fRuleString; 204f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 205f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 206f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 207f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//----------------------------------------------------------------------------- 208f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 209f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// print - debugging function to dump the runtime data tables. 210f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 211f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//----------------------------------------------------------------------------- 212f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#ifdef RBBI_DEBUG 213f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)void RBBIDataWrapper::printTable(const char *heading, const RBBIStateTable *table) { 214f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) uint32_t c; 215f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) uint32_t s; 216f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 217f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) RBBIDebugPrintf(" %s\n", heading); 218f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 219f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) RBBIDebugPrintf("State | Acc LA TagIx"); 220f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) for (c=0; c<fHeader->fCatCount; c++) {RBBIDebugPrintf("%3d ", c);} 221f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) RBBIDebugPrintf("\n------|---------------"); for (c=0;c<fHeader->fCatCount; c++) { 222f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) RBBIDebugPrintf("----"); 223f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 224f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) RBBIDebugPrintf("\n"); 225f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 226f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (table == NULL) { 227f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) RBBIDebugPrintf(" N U L L T A B L E\n\n"); 228f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 229f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 230f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) for (s=0; s<table->fNumStates; s++) { 231f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) RBBIStateTableRow *row = (RBBIStateTableRow *) 232f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) (table->fTableData + (table->fRowLen * s)); 233f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) RBBIDebugPrintf("%4d | %3d %3d %3d ", s, row->fAccepting, row->fLookAhead, row->fTagIdx); 234f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) for (c=0; c<fHeader->fCatCount; c++) { 235f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) RBBIDebugPrintf("%3d ", row->fNextState[c]); 236f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 237f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) RBBIDebugPrintf("\n"); 238f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 239f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) RBBIDebugPrintf("\n"); 240f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 241f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif 242f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 243f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 244f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#ifdef RBBI_DEBUG 245f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)void RBBIDataWrapper::printData() { 246f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) RBBIDebugPrintf("RBBI Data at %p\n", (void *)fHeader); 247f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) RBBIDebugPrintf(" Version = {%d %d %d %d}\n", fHeader->fFormatVersion[0], fHeader->fFormatVersion[1], 248f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fHeader->fFormatVersion[2], fHeader->fFormatVersion[3]); 249f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) RBBIDebugPrintf(" total length of data = %d\n", fHeader->fLength); 250f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) RBBIDebugPrintf(" number of character categories = %d\n\n", fHeader->fCatCount); 251f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 252f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) printTable("Forward State Transition Table", fForwardTable); 253f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) printTable("Reverse State Transition Table", fReverseTable); 254f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) printTable("Safe Forward State Transition Table", fSafeFwdTable); 255f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) printTable("Safe Reverse State Transition Table", fSafeRevTable); 256f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 257f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) RBBIDebugPrintf("\nOrignal Rules source:\n"); 258f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) for (int32_t c=0; fRuleSource[c] != 0; c++) { 259f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) RBBIDebugPrintf("%c", fRuleSource[c]); 260f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 261f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) RBBIDebugPrintf("\n\n"); 262f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 263f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif 264f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 265f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 266f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_NAMESPACE_END 267f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_NAMESPACE_USE 268f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 269f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//----------------------------------------------------------------------------- 270f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 271f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// ubrk_swap - byte swap and char encoding swap of RBBI data 272f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 273f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//----------------------------------------------------------------------------- 274f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 275f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_CAPI int32_t U_EXPORT2 276f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)ubrk_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *outData, 277f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UErrorCode *status) { 278f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 279f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (status == NULL || U_FAILURE(*status)) { 280f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return 0; 281f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 282f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(ds==NULL || inData==NULL || length<-1 || (length>0 && outData==NULL)) { 283f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *status=U_ILLEGAL_ARGUMENT_ERROR; 284f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return 0; 285f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 286f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 287f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 288f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Check that the data header is for for break data. 289f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // (Header contents are defined in genbrk.cpp) 290f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 291f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) const UDataInfo *pInfo = (const UDataInfo *)((const char *)inData+4); 292f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(!( pInfo->dataFormat[0]==0x42 && /* dataFormat="Brk " */ 293f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) pInfo->dataFormat[1]==0x72 && 294f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) pInfo->dataFormat[2]==0x6b && 295f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) pInfo->dataFormat[3]==0x20 && 296f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) pInfo->formatVersion[0]==3 )) { 297f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) udata_printError(ds, "ubrk_swap(): data format %02x.%02x.%02x.%02x (format version %02x) is not recognized\n", 298f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) pInfo->dataFormat[0], pInfo->dataFormat[1], 299f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) pInfo->dataFormat[2], pInfo->dataFormat[3], 300f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) pInfo->formatVersion[0]); 301f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *status=U_UNSUPPORTED_ERROR; 302f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return 0; 303f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 304f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 305f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 306f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Swap the data header. (This is the generic ICU Data Header, not the RBBI Specific 307f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // RBBIDataHeader). This swap also conveniently gets us 308f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // the size of the ICU d.h., which lets us locate the start 309f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // of the RBBI specific data. 310f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 311f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t headerSize=udata_swapDataHeader(ds, inData, length, outData, status); 312f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 313f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 314f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 315f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Get the RRBI Data Header, and check that it appears to be OK. 316f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 317f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Note: ICU 3.2 and earlier, RBBIDataHeader::fDataFormat was actually 318f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // an int32_t with a value of 1. Starting with ICU 3.4, 319f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // RBBI's fDataFormat matches the dataFormat field from the 320f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // UDataInfo header, four int8_t bytes. The value is {3,1,0,0} 321f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 322f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) const uint8_t *inBytes =(const uint8_t *)inData+headerSize; 323f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) RBBIDataHeader *rbbiDH = (RBBIDataHeader *)inBytes; 324f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (ds->readUInt32(rbbiDH->fMagic) != 0xb1a0 || 325f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) rbbiDH->fFormatVersion[0] != 3 || 326f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ds->readUInt32(rbbiDH->fLength) < sizeof(RBBIDataHeader)) 327f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) { 328f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) udata_printError(ds, "ubrk_swap(): RBBI Data header is invalid.\n"); 329f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *status=U_UNSUPPORTED_ERROR; 330f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return 0; 331f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 332f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 333f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 334f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Prefight operation? Just return the size 335f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 336f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t breakDataLength = ds->readUInt32(rbbiDH->fLength); 337f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t totalSize = headerSize + breakDataLength; 338f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (length < 0) { 339f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return totalSize; 340f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 341f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 342f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 343f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Check that length passed in is consistent with length from RBBI data header. 344f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 345f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (length < totalSize) { 346f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) udata_printError(ds, "ubrk_swap(): too few bytes (%d after ICU Data header) for break data.\n", 347f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) breakDataLength); 348f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *status=U_INDEX_OUTOFBOUNDS_ERROR; 349f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return 0; 350f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 351f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 352f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 353f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 354f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Swap the Data. Do the data itself first, then the RBBI Data Header, because 355f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // we need to reference the header to locate the data, and an 356f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // inplace swap of the header leaves it unusable. 357f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 358f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) uint8_t *outBytes = (uint8_t *)outData + headerSize; 359f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) RBBIDataHeader *outputDH = (RBBIDataHeader *)outBytes; 360f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 361f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t tableStartOffset; 362f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t tableLength; 363f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 364f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 365f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // If not swapping in place, zero out the output buffer before starting. 366f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Individual tables and other data items within are aligned to 8 byte boundaries 367f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // when originally created. Any unused space between items needs to be zero. 368f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 369f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (inBytes != outBytes) { 370f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) uprv_memset(outBytes, 0, breakDataLength); 371f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 372f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 373f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 374f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Each state table begins with several 32 bit fields. Calculate the size 375f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // in bytes of these. 376f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 377f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t topSize = offsetof(RBBIStateTable, fTableData); 378f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 379f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Forward state table. 380f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) tableStartOffset = ds->readUInt32(rbbiDH->fFTable); 381f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) tableLength = ds->readUInt32(rbbiDH->fFTableLen); 382f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 383f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (tableLength > 0) { 384f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ds->swapArray32(ds, inBytes+tableStartOffset, topSize, 385f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) outBytes+tableStartOffset, status); 386f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ds->swapArray16(ds, inBytes+tableStartOffset+topSize, tableLength-topSize, 387f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) outBytes+tableStartOffset+topSize, status); 388f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 389f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 390f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Reverse state table. Same layout as forward table, above. 391f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) tableStartOffset = ds->readUInt32(rbbiDH->fRTable); 392f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) tableLength = ds->readUInt32(rbbiDH->fRTableLen); 393f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 394f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (tableLength > 0) { 395f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ds->swapArray32(ds, inBytes+tableStartOffset, topSize, 396f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) outBytes+tableStartOffset, status); 397f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ds->swapArray16(ds, inBytes+tableStartOffset+topSize, tableLength-topSize, 398f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) outBytes+tableStartOffset+topSize, status); 399f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 400f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 401f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Safe Forward state table. Same layout as forward table, above. 402f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) tableStartOffset = ds->readUInt32(rbbiDH->fSFTable); 403f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) tableLength = ds->readUInt32(rbbiDH->fSFTableLen); 404f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 405f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (tableLength > 0) { 406f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ds->swapArray32(ds, inBytes+tableStartOffset, topSize, 407f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) outBytes+tableStartOffset, status); 408f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ds->swapArray16(ds, inBytes+tableStartOffset+topSize, tableLength-topSize, 409f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) outBytes+tableStartOffset+topSize, status); 410f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 411f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 412f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Safe Reverse state table. Same layout as forward table, above. 413f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) tableStartOffset = ds->readUInt32(rbbiDH->fSRTable); 414f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) tableLength = ds->readUInt32(rbbiDH->fSRTableLen); 415f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 416f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (tableLength > 0) { 417f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ds->swapArray32(ds, inBytes+tableStartOffset, topSize, 418f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) outBytes+tableStartOffset, status); 419f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ds->swapArray16(ds, inBytes+tableStartOffset+topSize, tableLength-topSize, 420f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) outBytes+tableStartOffset+topSize, status); 421f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 422f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 423f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Trie table for character categories 424f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) utrie_swap(ds, inBytes+ds->readUInt32(rbbiDH->fTrie), ds->readUInt32(rbbiDH->fTrieLen), 425f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) outBytes+ds->readUInt32(rbbiDH->fTrie), status); 426f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 427f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Source Rules Text. It's UChar data 428f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ds->swapArray16(ds, inBytes+ds->readUInt32(rbbiDH->fRuleSource), ds->readUInt32(rbbiDH->fRuleSourceLen), 429f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) outBytes+ds->readUInt32(rbbiDH->fRuleSource), status); 430f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 431f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Table of rule status values. It's all int_32 values 432f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ds->swapArray32(ds, inBytes+ds->readUInt32(rbbiDH->fStatusTable), ds->readUInt32(rbbiDH->fStatusTableLen), 433f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) outBytes+ds->readUInt32(rbbiDH->fStatusTable), status); 434f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 435f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // And, last, the header. 436f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // It is all int32_t values except for fFormataVersion, which is an array of four bytes. 437f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Swap the whole thing as int32_t, then re-swap the one field. 438f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 439f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ds->swapArray32(ds, inBytes, sizeof(RBBIDataHeader), outBytes, status); 440f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ds->swapArray32(ds, outputDH->fFormatVersion, 4, outputDH->fFormatVersion, status); 441f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 442f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return totalSize; 443f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 444f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 445f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 446f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif /* #if !UCONFIG_NO_BREAK_ITERATION */ 447