const CEI *Target::nextCE(int32_t offset) { UErrorCode status = U_ZERO_ERROR; int32_t low = -1, high = -1; uint32_t order; UBool cont = FALSE; if (offset >= bufferMin && offset < bufferMax) { return &ceb[offset]; } if (bufferMax >= bufferSize || offset != bufferMax) { return NULL; } do { low = ucol_getOffset(elements); order = ucol_next(elements, &status); high = ucol_getOffset(elements); if (order == (uint32_t)UCOL_NULLORDER) { //high = low = -1; break; } cont = isContinuation(order); order &= strengthMask; if (toShift && variableTop > order && (order & UCOL_PRIMARYORDERMASK) != 0) { if (strength >= UCOL_QUATERNARY) { order &= UCOL_PRIMARYORDERMASK; } else { order = UCOL_IGNORABLE; } } } while (order == UCOL_IGNORABLE); if (cont) { order |= UCOL_CONTINUATION_MARKER; } ceb[offset].order = order; ceb[offset].lowOffset = low; ceb[offset].highOffset = high; bufferMax += 1; return &ceb[offset]; }
// Collator.startswith {{{ static PyObject * icu_Collator_collation_order(icu_Collator *self, PyObject *args, PyObject *kwargs) { PyObject *a_; int32_t asz; int32_t actual_a; UChar *a; wchar_t *aw; UErrorCode status = U_ZERO_ERROR; UCollationElements *iter = NULL; int order = 0, len = -1; if (!PyArg_ParseTuple(args, "U", &a_)) return NULL; asz = (int32_t)PyUnicode_GetSize(a_); a = (UChar*)calloc(asz*4 + 2, sizeof(UChar)); aw = (wchar_t*)calloc(asz*4 + 2, sizeof(wchar_t)); if (a == NULL || aw == NULL ) return PyErr_NoMemory(); actual_a = (int32_t)PyUnicode_AsWideChar((PyUnicodeObject*)a_, aw, asz*4+1); if (actual_a > -1) { u_strFromWCS(a, asz*4 + 1, &actual_a, aw, -1, &status); iter = ucol_openElements(self->collator, a, actual_a, &status); if (iter != NULL && U_SUCCESS(status)) { order = ucol_next(iter, &status); len = ucol_getOffset(iter); ucol_closeElements(iter); iter = NULL; } } free(a); free(aw); return Py_BuildValue("ii", order, len); } // }}}
/** * Return an integer array containing all of the collation orders * returned by calls to next on the specified iterator */ OrderAndOffset* getOrders(UCollationElements *iter, int32_t *orderLength) { UErrorCode status; int32_t order; int32_t maxSize = 100; int32_t size = 0; int32_t offset = ucol_getOffset(iter); OrderAndOffset *temp; OrderAndOffset *orders =(OrderAndOffset *)malloc(sizeof(OrderAndOffset) * maxSize); status= U_ZERO_ERROR; while ((order=ucol_next(iter, &status)) != UCOL_NULLORDER) { if (size == maxSize) { maxSize *= 2; temp = (OrderAndOffset *)malloc(sizeof(OrderAndOffset) * maxSize); memcpy(temp, orders, size * sizeof(OrderAndOffset)); free(orders); orders = temp; } orders[size].order = order; orders[size].offset = offset; offset = ucol_getOffset(iter); size += 1; } if (maxSize > size && size > 0) { temp = (OrderAndOffset *)malloc(sizeof(OrderAndOffset) * size); memcpy(temp, orders, size * sizeof(OrderAndOffset)); free(orders); orders = temp; } *orderLength = size; return orders; }
OrderList::OrderList(UCollator *coll, const UnicodeString &string, int32_t stringOffset) : list(NULL), listMax(16), listSize(0) { UErrorCode status = U_ZERO_ERROR; UCollationElements *elems = ucol_openElements(coll, string.getBuffer(), string.length(), &status); uint32_t strengthMask = 0; int32_t order, low, high; switch (ucol_getStrength(coll)) { default: strengthMask |= UCOL_TERTIARYORDERMASK; /* fall through */ case UCOL_SECONDARY: strengthMask |= UCOL_SECONDARYORDERMASK; /* fall through */ case UCOL_PRIMARY: strengthMask |= UCOL_PRIMARYORDERMASK; } list = new Order[listMax]; ucol_setOffset(elems, stringOffset, &status); do { low = ucol_getOffset(elems); order = ucol_next(elems, &status); high = ucol_getOffset(elems); if (order != UCOL_NULLORDER) { order &= strengthMask; } if (order != UCOL_IGNORABLE) { add(order, low, high); } } while (order != UCOL_NULLORDER); ucol_closeElements(elems); }
// Collator.collation_order {{{ static PyObject * icu_Collator_collation_order(icu_Collator *self, PyObject *a_) { int32_t asz = 0; UChar *a = NULL; UErrorCode status = U_ZERO_ERROR; UCollationElements *iter = NULL; int order = 0, len = -1; a = python_to_icu(a_, &asz); if (a == NULL) goto end; iter = ucol_openElements(self->collator, a, asz, &status); if (U_FAILURE(status)) { PyErr_SetString(PyExc_ValueError, u_errorName(status)); goto end; } order = ucol_next(iter, &status); len = ucol_getOffset(iter); end: if (iter != NULL) ucol_closeElements(iter); iter = NULL; if (a != NULL) free(a); if (PyErr_Occurred()) return NULL; return Py_BuildValue("ii", order, len); } // }}}
//static jint NativeCollation_getOffset(JNIEnv*, jclass, jint address) { JNIEXPORT jint JNICALL Java_com_ibm_icu4jni_text_NativeCollation_getOffset(JNIEnv*, jclass, jint address) { return ucol_getOffset(toCollationElements(address)); }
int32_t CollationElementIterator::getOffset() const { return ucol_getOffset(m_data_); }
static jint NativeCollation_getOffset(JNIEnv*, jclass, jlong address) { return ucol_getOffset(toCollationElements(address)); }
void backAndForth(UCollationElements *iter) { /* Run through the iterator forwards and stick it into an array */ int32_t idx, o; UErrorCode status = U_ZERO_ERROR; int32_t orderLength = 0; OrderAndOffset *orders = getOrders(iter, &orderLength); /* Now go through it backwards and make sure we get the same values */ idx = orderLength; ucol_reset(iter); /* synwee : changed */ while ((o = ucol_previous(iter, &status)) != UCOL_NULLORDER) { #if TEST_OFFSETS int32_t offset = #endif ucol_getOffset(iter); idx -= 1; if (o != orders[idx].order) { if (o == 0) idx ++; else { while (idx > 0 && orders[-- idx].order == 0) { /* nothing... */ } if (o != orders[idx].order) { log_err("Mismatched order at index %d: 0x%8.8X vs. 0x%8.8X\n", idx, orders[idx].order, o); goto bail; } } } #if TEST_OFFSETS if (offset != orders[idx].offset) { log_err("Mismatched offset at index %d: %d vs. %d\n", idx, orders[idx].offset, offset); goto bail; } #endif } while (idx != 0 && orders[idx - 1].order == 0) { idx -= 1; } if (idx != 0) { log_err("Didn't get back to beginning - index is %d\n", idx); ucol_reset(iter); log_err("\nnext: "); if ((o = ucol_next(iter, &status)) != UCOL_NULLORDER) { log_err("Error at %x\n", o); } log_err("\nprev: "); if ((o = ucol_previous(iter, &status)) != UCOL_NULLORDER) { log_err("Error at %x\n", o); } log_verbose("\n"); } bail: free(orders); }
int32_t Target::getOffset() { return ucol_getOffset(elements); }
static void TestBug672() { UErrorCode status = U_ZERO_ERROR; UChar pattern[20]; UChar text[50]; int i; int result[3][3]; u_uastrcpy(pattern, "resume"); u_uastrcpy(text, "Time to resume updating my resume."); for (i = 0; i < 3; ++ i) { UCollator *coll = ucol_open(LOCALES[i], &status); UCollationElements *pitr = ucol_openElements(coll, pattern, -1, &status); UCollationElements *titer = ucol_openElements(coll, text, -1, &status); if (U_FAILURE(status)) { log_err_status(status, "ERROR: in creation of either the collator or the collation iterator :%s\n", myErrorName(status)); return; } log_verbose("locale tested %s\n", LOCALES[i]); while (ucol_next(pitr, &status) != UCOL_NULLORDER && U_SUCCESS(status)) { } if (U_FAILURE(status)) { log_err("ERROR: reversing collation iterator :%s\n", myErrorName(status)); return; } ucol_reset(pitr); ucol_setOffset(titer, u_strlen(pattern), &status); if (U_FAILURE(status)) { log_err("ERROR: setting offset in collator :%s\n", myErrorName(status)); return; } result[i][0] = ucol_getOffset(titer); log_verbose("Text iterator set to offset %d\n", result[i][0]); /* Use previous() */ ucol_previous(titer, &status); result[i][1] = ucol_getOffset(titer); log_verbose("Current offset %d after previous\n", result[i][1]); /* Add one to index */ log_verbose("Adding one to current offset...\n"); ucol_setOffset(titer, ucol_getOffset(titer) + 1, &status); if (U_FAILURE(status)) { log_err("ERROR: setting offset in collator :%s\n", myErrorName(status)); return; } result[i][2] = ucol_getOffset(titer); log_verbose("Current offset in text = %d\n", result[i][2]); ucol_closeElements(pitr); ucol_closeElements(titer); ucol_close(coll); } if (uprv_memcmp(result[0], result[1], 3) != 0 || uprv_memcmp(result[1], result[2], 3) != 0) { log_err("ERROR: Different locales have different offsets at the same character\n"); } }
/** * Test for getOffset() and setOffset() */ static void TestOffset() { UErrorCode status= U_ZERO_ERROR; UCollator *en_us=NULL; UCollationElements *iter, *pristine; int32_t offset; OrderAndOffset *orders; int32_t orderLength=0; int count = 0; UChar test1[50]; UChar test2[50]; u_uastrcpy(test1, "What subset of all possible test cases?"); u_uastrcpy(test2, "has the highest probability of detecting"); en_us = ucol_open("en_US", &status); log_verbose("Testing getOffset and setOffset for collations\n"); iter = ucol_openElements(en_us, test1, u_strlen(test1), &status); if(U_FAILURE(status)){ log_err_status(status, "ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", myErrorName(status)); ucol_close(en_us); return; } /* testing boundaries */ ucol_setOffset(iter, 0, &status); if (U_FAILURE(status) || ucol_previous(iter, &status) != UCOL_NULLORDER) { log_err("Error: After setting offset to 0, we should be at the end " "of the backwards iteration"); } ucol_setOffset(iter, u_strlen(test1), &status); if (U_FAILURE(status) || ucol_next(iter, &status) != UCOL_NULLORDER) { log_err("Error: After setting offset to end of the string, we should " "be at the end of the backwards iteration"); } /* Run all the way through the iterator, then get the offset */ orders = getOrders(iter, &orderLength); offset = ucol_getOffset(iter); if (offset != u_strlen(test1)) { log_err("offset at end != length %d vs %d\n", offset, u_strlen(test1) ); } /* Now set the offset back to the beginning and see if it works */ pristine=ucol_openElements(en_us, test1, u_strlen(test1), &status); if(U_FAILURE(status)){ log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", myErrorName(status)); ucol_close(en_us); return; } status = U_ZERO_ERROR; ucol_setOffset(iter, 0, &status); if (U_FAILURE(status)) { log_err("setOffset failed. %s\n", myErrorName(status)); } else { assertEqual(iter, pristine); } ucol_closeElements(pristine); ucol_closeElements(iter); free(orders); /* testing offsets in normalization buffer */ test1[0] = 0x61; test1[1] = 0x300; test1[2] = 0x316; test1[3] = 0x62; test1[4] = 0; ucol_setAttribute(en_us, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); iter = ucol_openElements(en_us, test1, 4, &status); if(U_FAILURE(status)){ log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", myErrorName(status)); ucol_close(en_us); return; } count = 0; while (ucol_next(iter, &status) != UCOL_NULLORDER && U_SUCCESS(status)) { switch (count) { case 0: if (ucol_getOffset(iter) != 1) { log_err("ERROR: Offset of iteration should be 1\n"); } break; case 3: if (ucol_getOffset(iter) != 4) { log_err("ERROR: Offset of iteration should be 4\n"); } break; default: if (ucol_getOffset(iter) != 3) { log_err("ERROR: Offset of iteration should be 3\n"); } } count ++; } ucol_reset(iter); count = 0; while (ucol_previous(iter, &status) != UCOL_NULLORDER && U_SUCCESS(status)) { switch (count) { case 0: case 1: if (ucol_getOffset(iter) != 3) { log_err("ERROR: Offset of iteration should be 3\n"); } break; case 2: if (ucol_getOffset(iter) != 1) { log_err("ERROR: Offset of iteration should be 1\n"); } break; default: if (ucol_getOffset(iter) != 0) { log_err("ERROR: Offset of iteration should be 0\n"); } } count ++; } if(U_FAILURE(status)){ log_err("ERROR: in iterating collation elements %s\n", myErrorName(status)); } ucol_closeElements(iter); ucol_close(en_us); }
static void TestSearchCollatorElements(void) { const TSCEItem * tsceItemPtr; for (tsceItemPtr = tsceItems; tsceItemPtr->locale != NULL; tsceItemPtr++) { UErrorCode status = U_ZERO_ERROR; UCollator* ucol = ucol_open(tsceItemPtr->locale, &status); if ( U_SUCCESS(status) ) { UCollationElements * uce = ucol_openElements(ucol, tsceText, kLen_tsceText, &status); if ( U_SUCCESS(status) ) { int32_t offset, element; const int32_t * nextOffsetPtr; const int32_t * limitOffsetPtr; nextOffsetPtr = tsceItemPtr->offsets; limitOffsetPtr = tsceItemPtr->offsets + tsceItemPtr->offsetsLen; do { offset = ucol_getOffset(uce); element = ucol_next(uce, &status); log_verbose("(%s) offset=%2d ce=%08x\n", tsceItemPtr->locale, offset, element); if ( element == 0 ) { log_err("error, locale %s, ucol_next returned element 0\n", tsceItemPtr->locale ); } if ( nextOffsetPtr < limitOffsetPtr ) { if (offset != *nextOffsetPtr) { log_err("error, locale %s, expected ucol_next -> ucol_getOffset %d, got %d\n", tsceItemPtr->locale, *nextOffsetPtr, offset ); nextOffsetPtr = limitOffsetPtr; break; } nextOffsetPtr++; } else { log_err("error, locale %s, ucol_next returned more elements than expected\n", tsceItemPtr->locale ); } } while ( U_SUCCESS(status) && element != UCOL_NULLORDER ); if ( nextOffsetPtr < limitOffsetPtr ) { log_err("error, locale %s, ucol_next returned fewer elements than expected\n", tsceItemPtr->locale ); } ucol_setOffset(uce, kLen_tsceText, &status); status = U_ZERO_ERROR; nextOffsetPtr = tsceItemPtr->offsets + tsceItemPtr->offsetsLen; limitOffsetPtr = tsceItemPtr->offsets; do { offset = ucol_getOffset(uce); element = ucol_previous(uce, &status); if ( element == 0 ) { log_err("error, locale %s, ucol_previous returned element 0\n", tsceItemPtr->locale ); } if ( nextOffsetPtr > limitOffsetPtr ) { nextOffsetPtr--; if (offset != *nextOffsetPtr) { log_err("error, locale %s, expected ucol_previous -> ucol_getOffset %d, got %d\n", tsceItemPtr->locale, *nextOffsetPtr, offset ); nextOffsetPtr = limitOffsetPtr; break; } } else { log_err("error, locale %s, ucol_previous returned more elements than expected\n", tsceItemPtr->locale ); } } while ( U_SUCCESS(status) && element != UCOL_NULLORDER ); if ( nextOffsetPtr > limitOffsetPtr ) { log_err("error, locale %s, ucol_previous returned fewer elements than expected\n", tsceItemPtr->locale ); } ucol_closeElements(uce); } else { log_err("error, locale %s, ucol_openElements failed: %s\n", tsceItemPtr->locale, u_errorName(status) ); } ucol_close(ucol); } else { log_data_err("error, locale %s, ucol_open failed: %s\n", tsceItemPtr->locale, u_errorName(status) ); } } }