summaryrefslogtreecommitdiff
path: root/src/runtime/java/jni_utils.c
diff options
context:
space:
mode:
authorKrasimir Angelov <kr.angelov@gmail.com>2017-09-25 10:36:38 +0200
committerKrasimir Angelov <kr.angelov@gmail.com>2017-09-25 10:36:38 +0200
commit66c20b1996bf38ff78deb3672d1ec3bb6400f126 (patch)
treedb70f370a70b4548cc5e2eb1d8a6c212f5ce1026 /src/runtime/java/jni_utils.c
parent91728a3a9833d6151e339bc786a36bf339a9afe4 (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.c31
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);