- const uint8_t *reorderTable = settings.reorderTable;
- if(reorderTable != NULL) {
- const uint16_t *scripts = data->scripts;
- int32_t length = data->scriptsLength;
- uint32_t prevLastByte = 0;
- for(int32_t i = 0; i < length;) {
- // reordered last byte of the group
- uint32_t lastByte = reorderTable[scripts[i] & 0xff];
- if(lastByte < prevLastByte) {
- // The permutation affects the groups up to Latin.
- return -1;
+ UBool digitsAreReordered = FALSE;
+ if(settings.hasReordering()) {
+ uint32_t prevStart = 0;
+ uint32_t beforeDigitStart = 0;
+ uint32_t digitStart = 0;
+ uint32_t afterDigitStart = 0;
+ for(int32_t group = UCOL_REORDER_CODE_FIRST;
+ group < UCOL_REORDER_CODE_FIRST + CollationData::MAX_NUM_SPECIAL_REORDER_CODES;
+ ++group) {
+ uint32_t start = data->getFirstPrimaryForGroup(group);
+ start = settings.reorder(start);
+ if(group == UCOL_REORDER_CODE_DIGIT) {
+ beforeDigitStart = prevStart;
+ digitStart = start;
+ } else if(start != 0) {
+ if(start < prevStart) {
+ // The permutation affects the groups up to Latin.
+ return -1;
+ }
+ // In the future, there might be a special group between digits & Latin.
+ if(digitStart != 0 && afterDigitStart == 0 && prevStart == beforeDigitStart) {
+ afterDigitStart = start;
+ }
+ prevStart = start;