+ case URX_ONECHAR_I:
+ {
+ UChar32 c = URX_VAL(op);
+ if (u_hasBinaryProperty(c, UCHAR_CASE_SENSITIVE)) {
+ // We have a cased character to fold
+ c = u_foldCase(c, U_FOLD_CASE_DEFAULT);
+ op = URX_BUILD(URX_ONECHAR_I, c);
+ }
+
+ fRXPat->fCompiledPat->setElementAt(op, dst);
+ dst++;
+ break;
+ }
+ case URX_STRING_I:
+ {
+ op = URX_BUILD(URX_STRING_I, URX_VAL(op)+stringDelta);
+
+ src++;
+ int32_t lengthOp = (int32_t)fRXPat->fCompiledPat->elementAti(src);
+
+ caseStringBuffer.setTo(fRXPat->fLiteralText, URX_VAL(op), URX_VAL(lengthOp));
+ caseStringBuffer.foldCase(U_FOLD_CASE_DEFAULT);
+
+ int32_t newLen = caseStringBuffer.length();
+ if (newLen <= URX_VAL(lengthOp)) {
+ // don't shift if we don't have to, take the tiny memory hit of a smaller string
+ fRXPat->fLiteralText.replace(URX_VAL(op), newLen, caseStringBuffer);
+ } else {
+ // shift other strings over...at least UnicodeString handles this for us!
+ fRXPat->fLiteralText.replace(URX_VAL(op), URX_VAL(lengthOp), caseStringBuffer);
+ stringDelta += newLen - URX_VAL(lengthOp);
+ }
+ lengthOp = URX_BUILD(URX_STRING_LEN, newLen);
+
+ fRXPat->fCompiledPat->setElementAt(op, dst);
+ fRXPat->fCompiledPat->setElementAt(lengthOp, dst+1);
+ dst += 2;
+ break;
+ }
+ case URX_BACKREF:
+ case URX_BACKREF_I:
+ {
+ int32_t where = URX_VAL(op);
+ if (where > fRXPat->fGroupMap->size()) {
+ error(U_REGEX_INVALID_BACK_REF);
+ break;
+ }
+ where = fRXPat->fGroupMap->elementAti(where-1);
+ op = URX_BUILD(opType, where);
+ fRXPat->fCompiledPat->setElementAt(op, dst);
+ dst++;
+
+ fRXPat->fNeedsAltInput = TRUE;
+ break;
+ }
+ case URX_STRING:
+ op = URX_BUILD(URX_STRING, URX_VAL(op)+stringDelta);
+ // continue