From 66c20b1996bf38ff78deb3672d1ec3bb6400f126 Mon Sep 17 00:00:00 2001 From: Krasimir Angelov Date: Mon, 25 Sep 2017 10:36:38 +0200 Subject: handle BIND & CAPIT in bracketedLinearize for Java --- src/runtime/java/jni_utils.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'src/runtime/java/jni_utils.c') diff --git a/src/runtime/java/jni_utils.c b/src/runtime/java/jni_utils.c index f897b8372..13edd812d 100644 --- a/src/runtime/java/jni_utils.c +++ b/src/runtime/java/jni_utils.c @@ -1,6 +1,8 @@ #include #include #include +#include +#include #include "jni_utils.h" #ifndef __MINGW32__ #include @@ -59,6 +61,35 @@ gu2j_string_buf(JNIEnv *env, GuStringBuf* sbuf) { return gu2j_string_len(env, gu_string_buf_data(sbuf), gu_string_buf_length(sbuf)); } +JPGF_INTERNAL jstring +gu2j_string_capit(JNIEnv *env, GuString s, PgfCapitState capit) { + const char* utf8 = s; + size_t len = strlen(s); + + jchar* utf16 = alloca(len*sizeof(jchar)); + jchar* dst = utf16; + while (s-utf8 < len) { + GuUCS ucs = gu_utf8_decode((const uint8_t**) &s); + + if (capit == PGF_CAPIT_FIRST) { + ucs = gu_ucs_to_upper(ucs); + capit == PGF_CAPIT_NONE; + } else if (capit == PGF_CAPIT_NEXT) { + ucs = gu_ucs_to_upper(ucs); + } + + if (ucs <= 0xFFFF) { + *dst++ = ucs; + } else { + ucs -= 0x10000; + *dst++ = 0xD800+((ucs >> 10) & 0x3FF); + *dst++ = 0xDC00+(ucs & 0x3FF); + } + } + + return (*env)->NewString(env, utf16, dst-utf16); +} + JPGF_INTERNAL GuString j2gu_string(JNIEnv *env, jstring s, GuPool* pool) { GuString str = (*env)->GetStringUTFChars(env, s, 0); -- cgit v1.2.3