summaryrefslogtreecommitdiff
path: root/Build/source/libs/icu/icu-xetex/i18n/ucoleitr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/icu/icu-xetex/i18n/ucoleitr.cpp')
-rw-r--r--Build/source/libs/icu/icu-xetex/i18n/ucoleitr.cpp258
1 files changed, 258 insertions, 0 deletions
diff --git a/Build/source/libs/icu/icu-xetex/i18n/ucoleitr.cpp b/Build/source/libs/icu/icu-xetex/i18n/ucoleitr.cpp
new file mode 100644
index 00000000000..d31a90f837b
--- /dev/null
+++ b/Build/source/libs/icu/icu-xetex/i18n/ucoleitr.cpp
@@ -0,0 +1,258 @@
+/*
+******************************************************************************
+* Copyright (C) 2001-2006, International Business Machines
+* Corporation and others. All Rights Reserved.
+******************************************************************************
+*
+* File ucoleitr.cpp
+*
+* Modification History:
+*
+* Date Name Description
+* 02/15/2001 synwee Modified all methods to process its own function
+* instead of calling the equivalent c++ api (coleitr.h)
+******************************************************************************/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/ucoleitr.h"
+#include "unicode/ustring.h"
+#include "unicode/sortkey.h"
+#include "ucol_imp.h"
+#include "cmemory.h"
+
+U_NAMESPACE_USE
+
+#define BUFFER_LENGTH 100
+
+typedef struct collIterate collIterator;
+
+/* public methods ---------------------------------------------------- */
+
+U_CAPI UCollationElements* U_EXPORT2
+ucol_openElements(const UCollator *coll,
+ const UChar *text,
+ int32_t textLength,
+ UErrorCode *status)
+{
+ UCollationElements *result;
+
+ if (U_FAILURE(*status)) {
+ return NULL;
+ }
+
+ result = (UCollationElements *)uprv_malloc(sizeof(UCollationElements));
+ /* test for NULL */
+ if (result == NULL) {
+ *status = U_MEMORY_ALLOCATION_ERROR;
+ return NULL;
+ }
+
+ result->reset_ = TRUE;
+ result->isWritable = FALSE;
+
+ if (text == NULL) {
+ textLength = 0;
+ }
+ uprv_init_collIterate(coll, text, textLength, &result->iteratordata_);
+
+ return result;
+}
+
+U_CAPI void U_EXPORT2
+ucol_closeElements(UCollationElements *elems)
+{
+ collIterate *ci = &elems->iteratordata_;
+ if (ci->writableBuffer != ci->stackWritableBuffer) {
+ uprv_free(ci->writableBuffer);
+ }
+ if (elems->isWritable && elems->iteratordata_.string != NULL)
+ {
+ uprv_free(elems->iteratordata_.string);
+ }
+ uprv_free(elems);
+}
+
+U_CAPI void U_EXPORT2
+ucol_reset(UCollationElements *elems)
+{
+ collIterate *ci = &(elems->iteratordata_);
+ elems->reset_ = TRUE;
+ ci->pos = ci->string;
+ if ((ci->flags & UCOL_ITER_HASLEN) == 0 || ci->endp == NULL) {
+ ci->endp = ci->string + u_strlen(ci->string);
+ }
+ ci->CEpos = ci->toReturn = ci->CEs;
+ ci->flags = UCOL_ITER_HASLEN;
+ if (ci->coll->normalizationMode == UCOL_ON) {
+ ci->flags |= UCOL_ITER_NORM;
+ }
+
+ if (ci->stackWritableBuffer != ci->writableBuffer) {
+ uprv_free(ci->writableBuffer);
+ ci->writableBuffer = ci->stackWritableBuffer;
+ ci->writableBufSize = UCOL_WRITABLE_BUFFER_SIZE;
+ }
+ ci->fcdPosition = NULL;
+}
+
+U_CAPI int32_t U_EXPORT2
+ucol_next(UCollationElements *elems,
+ UErrorCode *status)
+{
+ int32_t result;
+ if (U_FAILURE(*status)) {
+ return UCOL_NULLORDER;
+ }
+
+ elems->reset_ = FALSE;
+
+ result = (int32_t)ucol_getNextCE(elems->iteratordata_.coll,
+ &elems->iteratordata_,
+ status);
+
+ if (result == UCOL_NO_MORE_CES) {
+ result = UCOL_NULLORDER;
+ }
+ return result;
+}
+
+U_CAPI int32_t U_EXPORT2
+ucol_previous(UCollationElements *elems,
+ UErrorCode *status)
+{
+ if(U_FAILURE(*status)) {
+ return UCOL_NULLORDER;
+ }
+ else
+ {
+ int32_t result;
+
+ if (elems->reset_ &&
+ (elems->iteratordata_.pos == elems->iteratordata_.string)) {
+ if (elems->iteratordata_.endp == NULL) {
+ elems->iteratordata_.endp = elems->iteratordata_.string +
+ u_strlen(elems->iteratordata_.string);
+ elems->iteratordata_.flags |= UCOL_ITER_HASLEN;
+ }
+ elems->iteratordata_.pos = elems->iteratordata_.endp;
+ elems->iteratordata_.fcdPosition = elems->iteratordata_.endp;
+ }
+
+ elems->reset_ = FALSE;
+
+ result = (int32_t)ucol_getPrevCE(elems->iteratordata_.coll,
+ &(elems->iteratordata_),
+ status);
+
+ if (result == UCOL_NO_MORE_CES) {
+ result = UCOL_NULLORDER;
+ }
+
+ return result;
+ }
+}
+
+U_CAPI int32_t U_EXPORT2
+ucol_getMaxExpansion(const UCollationElements *elems,
+ int32_t order)
+{
+ uint8_t result;
+ UCOL_GETMAXEXPANSION(elems->iteratordata_.coll, (uint32_t)order, result);
+ return result;
+}
+
+U_CAPI void U_EXPORT2
+ucol_setText( UCollationElements *elems,
+ const UChar *text,
+ int32_t textLength,
+ UErrorCode *status)
+{
+ if (U_FAILURE(*status)) {
+ return;
+ }
+
+ if (elems->isWritable && elems->iteratordata_.string != NULL)
+ {
+ uprv_free(elems->iteratordata_.string);
+ }
+
+ if (text == NULL) {
+ textLength = 0;
+ }
+
+ elems->isWritable = FALSE;
+ uprv_init_collIterate(elems->iteratordata_.coll, text, textLength,
+ &elems->iteratordata_);
+
+ elems->reset_ = TRUE;
+}
+
+U_CAPI int32_t U_EXPORT2
+ucol_getOffset(const UCollationElements *elems)
+{
+ const collIterate *ci = &(elems->iteratordata_);
+ // while processing characters in normalization buffer getOffset will
+ // return the next non-normalized character.
+ // should be inline with the old implementation since the old codes uses
+ // nextDecomp in normalizer which also decomposes the string till the
+ // first base character is found.
+ if (ci->flags & UCOL_ITER_INNORMBUF) {
+ if (ci->fcdPosition == NULL) {
+ return 0;
+ }
+ return (int32_t)(ci->fcdPosition - ci->string);
+ }
+ else {
+ return (int32_t)(ci->pos - ci->string);
+ }
+}
+
+U_CAPI void U_EXPORT2
+ucol_setOffset(UCollationElements *elems,
+ int32_t offset,
+ UErrorCode *status)
+{
+ if (U_FAILURE(*status)) {
+ return;
+ }
+
+ // this methods will clean up any use of the writable buffer and points to
+ // the original string
+ collIterate *ci = &(elems->iteratordata_);
+ ci->pos = ci->string + offset;
+ ci->CEpos = ci->toReturn = ci->CEs;
+ if (ci->flags & UCOL_ITER_INNORMBUF) {
+ ci->flags = ci->origFlags;
+ }
+ if ((ci->flags & UCOL_ITER_HASLEN) == 0) {
+ ci->endp = ci->string + u_strlen(ci->string);
+ ci->flags |= UCOL_ITER_HASLEN;
+ }
+ ci->fcdPosition = NULL;
+ elems->reset_ = FALSE;
+}
+
+U_CAPI int32_t U_EXPORT2
+ucol_primaryOrder (int32_t order)
+{
+ order &= UCOL_PRIMARYMASK;
+ return (order >> UCOL_PRIMARYORDERSHIFT);
+}
+
+U_CAPI int32_t U_EXPORT2
+ucol_secondaryOrder (int32_t order)
+{
+ order &= UCOL_SECONDARYMASK;
+ return (order >> UCOL_SECONDARYORDERSHIFT);
+}
+
+U_CAPI int32_t U_EXPORT2
+ucol_tertiaryOrder (int32_t order)
+{
+ return (order & UCOL_TERTIARYMASK);
+}
+
+#endif /* #if !UCONFIG_NO_COLLATION */