UChar32 UCharCharacterIterator::setIndex32(int32_t position) { if (position < begin) { position = begin; } else if (position > end) { position = end; } if (position < end) { UTF_SET_CHAR_START(text, begin, position); int32_t i = this->pos = position; UChar32 c; UTF_NEXT_CHAR(text, i, end, c); return c; } else { this->pos = position; return DONE; } }
UChar32 UCharCharacterIterator::next32PostInc() { if (pos < end) { UChar32 c; UTF_NEXT_CHAR(text, pos, end, c); return c; } else { return DONE; } }
UChar32 UCharCharacterIterator::first32() { pos = begin; if(pos < end) { int32_t i = pos; UChar32 c; UTF_NEXT_CHAR(text, i, end, c); return c; } else { return DONE; } }
/** * Encode a UTF-16 string in BOCU-1. * Does not check for overflows, but otherwise useful function. * * @param s input UTF-16 string * @param length number of UChar code units in s * @param p pointer to output byte array * @return number of bytes output */ static int32_t writeString(const UChar *s, int32_t length, uint8_t *p) { uint8_t *p0; int32_t c, prev, i; prev=0; p0=p; i=0; while(i<length) { UTF_NEXT_CHAR(s, i, length, c); p+=writePacked(encodeBocu1(&prev, c), p); } return (int32_t)(p-p0); }
UChar32 UCharCharacterIterator::next32() { if (pos < end) { UTF_FWD_1(text, pos, end); if(pos < end) { int32_t i = pos; UChar32 c; UTF_NEXT_CHAR(text, i, end, c); return c; } } /* make current() return DONE */ pos = end; return DONE; }
/* * When we have UBIDI_OUTPUT_REVERSE set on ubidi_writeReordered(), then we * semantically write RTL runs in reverse and later reverse them again. * Instead, we actually write them in forward order to begin with. * However, if the RTL run was to be mirrored, we need to mirror here now * since the implicit second reversal must not do it. * It looks strange to do mirroring in LTR output, but it is only because * we are writing RTL output in reverse. */ static int32_t doWriteForward(const UChar *src, int32_t srcLength, UChar *dest, int32_t destSize, uint16_t options, UErrorCode *pErrorCode) { /* optimize for several combinations of options */ switch(options&(UBIDI_REMOVE_BIDI_CONTROLS|UBIDI_DO_MIRRORING)) { case 0: { /* simply copy the LTR run to the destination */ int32_t length=srcLength; if(destSize<length) { *pErrorCode=U_BUFFER_OVERFLOW_ERROR; return srcLength; } do { *dest++=*src++; } while(--length>0); return srcLength; } case UBIDI_DO_MIRRORING: { /* do mirroring */ int32_t i=0, j=0; UChar32 c; if(destSize<srcLength) { *pErrorCode=U_BUFFER_OVERFLOW_ERROR; return srcLength; } do { UTF_NEXT_CHAR(src, i, srcLength, c); c=u_charMirror(c); UTF_APPEND_CHAR_UNSAFE(dest, j, c); } while(i<srcLength); return srcLength; } case UBIDI_REMOVE_BIDI_CONTROLS: { /* copy the LTR run and remove any BiDi control characters */ int32_t remaining=destSize; UChar c; do { c=*src++; if(!IS_BIDI_CONTROL_CHAR(c)) { if(--remaining<0) { *pErrorCode=U_BUFFER_OVERFLOW_ERROR; /* preflight the length */ while(--srcLength>0) { c=*src++; if(!IS_BIDI_CONTROL_CHAR(c)) { --remaining; } } return destSize-remaining; } *dest++=c; } } while(--srcLength>0); return destSize-remaining; } default: { /* remove BiDi control characters and do mirroring */ int32_t remaining=destSize; int32_t i, j=0; UChar32 c; do { i=0; UTF_NEXT_CHAR(src, i, srcLength, c); src+=i; srcLength-=i; if(!IS_BIDI_CONTROL_CHAR(c)) { remaining-=i; if(remaining<0) { *pErrorCode=U_BUFFER_OVERFLOW_ERROR; /* preflight the length */ while(srcLength>0) { c=*src++; if(!IS_BIDI_CONTROL_CHAR(c)) { --remaining; } --srcLength; } return destSize-remaining; } c=u_charMirror(c); UTF_APPEND_CHAR_UNSAFE(dest, j, c); } } while(srcLength>0); return j; } } /* end of switch */ }