/*
 * Copyright (C) 2006 The Android Open Source Project
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "ErrorCode.h"
#include "JNIHelp.h"
#include "ScopedJavaUnicodeString.h"
#include "unicode/normlzr.h"

static jstring normalizeImpl(JNIEnv* env, jclass, jstring s, jint intMode) {
    ScopedJavaUnicodeString src(env, s);
    UNormalizationMode mode = static_cast<UNormalizationMode>(intMode);
    UErrorCode errorCode = U_ZERO_ERROR;
    UnicodeString dst;
    Normalizer::normalize(src.unicodeString(), mode, 0, dst, errorCode);
    icu4jni_error(env, errorCode);
    return dst.isBogus() ? NULL : env->NewString(dst.getBuffer(), dst.length());
}

static jboolean isNormalizedImpl(JNIEnv* env, jclass, jstring s, jint intMode) {
    ScopedJavaUnicodeString src(env, s);
    UNormalizationMode mode = static_cast<UNormalizationMode>(intMode);
    UErrorCode errorCode = U_ZERO_ERROR;
    UBool result = Normalizer::isNormalized(src.unicodeString(), mode, errorCode);
    icu4jni_error(env, errorCode);
    return result;
}

static JNINativeMethod gMethods[] = {
    /* name, signature, funcPtr */
    {"normalizeImpl", "(Ljava/lang/String;I)Ljava/lang/String;", (void*) normalizeImpl},
    {"isNormalizedImpl", "(Ljava/lang/String;I)Z", (void*) isNormalizedImpl},
};
extern "C" int register_com_ibm_icu4jni_text_NativeNormalizer(JNIEnv* env) {
    return jniRegisterNativeMethods(env,
            "com/ibm/icu4jni/text/NativeNormalizer", gMethods, NELEM(gMethods));
}
