/* compare UCMappings for sorting */ static int32_t compareMappings(UCMTable *lTable, const UCMapping *l, UCMTable *rTable, const UCMapping *r, UBool uFirst) { int32_t result; /* choose which side to compare first */ if(uFirst) { /* Unicode then bytes */ result=compareUnicode(lTable, l, rTable, r); if(result==0) { result=compareBytes(lTable, l, rTable, r, FALSE); /* not lexically, like canonucm */ } } else { /* bytes then Unicode */ result=compareBytes(lTable, l, rTable, r, TRUE); /* lexically, for builder */ if(result==0) { result=compareUnicode(lTable, l, rTable, r); } } if(result!=0) { return result; } /* compare the flags */ return l->f-r->f; }
bool Key::operator == (const Key & rhs) const { int compare = compareBytes (row, 0, rowLength, rhs.row, 0, rhs.columnFamilyLength); if (compare != 0) return false; compare = compareBytes (colFamily, 0, columnFamilyLength, rhs.colFamily, 0, rhs.columnFamilyLength); if (compare != 0) return false; compare = compareBytes (colQualifier, 0, colQualLen, rhs.colQualifier, 0, rhs.colQualLen); if (compare != 0) return false; return (timestamp < rhs.timestamp); }
bool Key::operator < (const Key &rhs) const { int compare = compareBytes (row, 0, rowLength, rhs.row, 0, rhs.rowLength); if (compare < 0) return true; else if (compare > 0) return false; compare = compareBytes (colFamily, 0, columnFamilyLength, rhs.colFamily, 0, rhs.columnFamilyLength); if (compare < 0) return true; else if (compare > 0) return false; compare = compareBytes (colQualifier, 0, colQualLen, rhs.colQualifier, 0, rhs.colQualLen); if (compare < 0) return true; return false; }
static uint8_t checkBaseExtBytes(UCMStates *baseStates, UCMTable *base, UCMTable *ext, UBool moveToExt, UBool intersectBase) { UCMapping *mb, *me; int32_t *baseMap, *extMap; int32_t b, e, bLimit, eLimit, cmp; uint8_t result; UBool isSISO; baseMap=base->reverseMap; extMap=ext->reverseMap; b=e=0; bLimit=base->mappingsLength; eLimit=ext->mappingsLength; result=0; isSISO=(UBool)(baseStates->outputType==MBCS_OUTPUT_2_SISO); for(;;) { /* skip irrelevant mappings on both sides */ for(;; ++b) { if(b==bLimit) { return result; } mb=base->mappings+baseMap[b]; if(intersectBase==2 && mb->bLen==1) { /* * comparing a base against a DBCS extension: * leave SBCS base mappings alone */ continue; } if(mb->f==0 || mb->f==3) { break; } } for(;;) { if(e==eLimit) { return result; } me=ext->mappings+extMap[e]; if(me->f==0 || me->f==3) { break; } ++e; } /* compare the base and extension mappings */ cmp=compareBytes(base, mb, ext, me, TRUE); if(cmp<0) { if(intersectBase) { /* mapping in base but not in ext, move it */ mb->moveFlag|=UCM_MOVE_TO_EXT; result|=NEEDS_MOVE; /* * does mb map from an input sequence that is a prefix of me's? * for SI/SO tables, a single byte is never a prefix because it * occurs in a separate single-byte state */ } else if( mb->bLen<me->bLen && (!isSISO || mb->bLen>1) && 0==uprv_memcmp(UCM_GET_BYTES(base, mb), UCM_GET_BYTES(ext, me), mb->bLen) ) { if(moveToExt) { /* mark this mapping to be moved to the extension table */ mb->moveFlag|=UCM_MOVE_TO_EXT; result|=NEEDS_MOVE; } else { fprintf(stderr, "ucm error: the base table contains a mapping whose input sequence\n" " is a prefix of the input sequence of an extension mapping\n"); ucm_printMapping(base, mb, stderr); ucm_printMapping(ext, me, stderr); result|=HAS_ERRORS; } } ++b; } else if(cmp==0) { /* * same output: remove the extension mapping, * otherwise treat as an error */ if( mb->f==me->f && mb->uLen==me->uLen && 0==uprv_memcmp(UCM_GET_CODE_POINTS(base, mb), UCM_GET_CODE_POINTS(ext, me), 4*mb->uLen) ) { me->moveFlag|=UCM_REMOVE_MAPPING; result|=NEEDS_MOVE; } else if(intersectBase) { /* mapping in base but not in ext, move it */ mb->moveFlag|=UCM_MOVE_TO_EXT; result|=NEEDS_MOVE; } else { fprintf(stderr, "ucm error: the base table contains a mapping whose input sequence\n" " is the same as the input sequence of an extension mapping\n" " but it maps differently\n"); ucm_printMapping(base, mb, stderr); ucm_printMapping(ext, me, stderr); result|=HAS_ERRORS; } ++b; } else /* cmp>0 */ { ++e; } } }