// returns the length of the label excluding the separator // if *limit == separator then the length returned does not include // the separtor. static inline int32_t getNextSeparator(UChar *src, int32_t srcLength, UChar **limit, UBool *done){ if(srcLength == -1){ int32_t i; for(i=0 ; ;i++){ if(src[i] == 0){ *limit = src + i; // point to null *done = TRUE; return i; } if(isLabelSeparator(src[i])){ *limit = src + (i+1); // go past the delimiter return i; } } }else{ int32_t i; for(i=0;i<srcLength;i++){ if(isLabelSeparator(src[i])){ *limit = src + (i+1); // go past the delimiter return i; } } // we have not found the delimiter // if(i==srcLength) *limit = src+srcLength; *done = TRUE; return i; } }
static jstring NativeIDN_convertImpl(JNIEnv* env, jclass, jstring javaSrc, jint flags, jboolean toAscii) { ScopedStringChars src(env, javaSrc); if (src.get() == NULL) { return NULL; } UChar dst[256]; UErrorCode status = U_ZERO_ERROR; size_t resultLength = toAscii ? uidna_IDNToASCII(src.get(), src.size(), &dst[0], sizeof(dst), flags, NULL, &status) : uidna_IDNToUnicode(src.get(), src.size(), &dst[0], sizeof(dst), flags, NULL, &status); if (U_FAILURE(status)) { jniThrowException(env, "java/lang/IllegalArgumentException", u_errorName(status)); return NULL; } if (!toAscii) { // ICU only translates separators to ASCII for toASCII. // Java expects the translation for toUnicode too. // We may as well do this here, while the string is still mutable. for (size_t i = 0; i < resultLength; ++i) { if (isLabelSeparator(dst[i])) { dst[i] = '.'; } } } return env->NewString(&dst[0], resultLength); }