diff options
| author | Krasimir Angelov <kr.angelov@gmail.com> | 2017-09-25 10:36:38 +0200 |
|---|---|---|
| committer | Krasimir Angelov <kr.angelov@gmail.com> | 2017-09-25 10:36:38 +0200 |
| commit | 66c20b1996bf38ff78deb3672d1ec3bb6400f126 (patch) | |
| tree | db70f370a70b4548cc5e2eb1d8a6c212f5ce1026 /src/runtime/java/jni_utils.c | |
| parent | 91728a3a9833d6151e339bc786a36bf339a9afe4 (diff) | |
handle BIND & CAPIT in bracketedLinearize for Java
Diffstat (limited to 'src/runtime/java/jni_utils.c')
| -rw-r--r-- | src/runtime/java/jni_utils.c | 31 |
1 files changed, 31 insertions, 0 deletions
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 <jni.h> #include <gu/utf8.h> #include <gu/string.h> +#include <pgf/pgf.h> +#include <pgf/linearizer.h> #include "jni_utils.h" #ifndef __MINGW32__ #include <alloca.h> @@ -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); |
