diff options
| author | kr.angelov <kr.angelov@gmail.com> | 2014-05-08 14:56:46 +0000 |
|---|---|---|
| committer | kr.angelov <kr.angelov@gmail.com> | 2014-05-08 14:56:46 +0000 |
| commit | 41c8749b5ccfa4ccf3bad49209d746d945dfb123 (patch) | |
| tree | da7080bd53c917ad0aebafc4e6da2b251e03e7bb /src/runtime/java/jpgf.c | |
| parent | 1fbe17aabe89e9b90e871a103ec0cd100a0fd509 (diff) | |
fix the literals API in Java for strings with non-latin characters
Diffstat (limited to 'src/runtime/java/jpgf.c')
| -rw-r--r-- | src/runtime/java/jpgf.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/src/runtime/java/jpgf.c b/src/runtime/java/jpgf.c index c0a9873a8..868a25334 100644 --- a/src/runtime/java/jpgf.c +++ b/src/runtime/java/jpgf.c @@ -45,6 +45,27 @@ j2gu_string(JNIEnv *env, jstring s, GuPool* pool) { return copy; } +static size_t +gu2j_string_offset(GuString s, size_t offset) { + const char* utf8 = s; + size_t joffset = 0; + while (utf8-s < offset) { + gu_utf8_decode((const uint8_t**) &utf8); + joffset++; + } + return joffset; +} + +static size_t +j2gu_string_offset(GuString s, size_t joffset) { + const char* utf8 = s; + while (joffset > 0) { + gu_utf8_decode((const uint8_t**) &utf8); + joffset--; + } + return utf8-s; +} + static void* get_ref(JNIEnv *env, jobject self) { jfieldID refId = (*env)->GetFieldID(env, (*env)->GetObjectClass(env, self), "ref", "J"); @@ -735,7 +756,8 @@ jpgf_literal_callback_match(PgfLiteralCallback* self, (*cachedJVM)->AttachCurrentThread(cachedJVM, &env, NULL); jstring jsentence = gu2j_string(env, sentence); - jobject result = (*env)->CallObjectMethod(env, callback->jcallback, callback->match_methodId, lin_idx, jsentence, *poffset); + size_t joffset = gu2j_string_offset(sentence, *poffset); + jobject result = (*env)->CallObjectMethod(env, callback->jcallback, callback->match_methodId, lin_idx, jsentence, joffset); if (result == NULL) return NULL; @@ -750,8 +772,8 @@ jpgf_literal_callback_match(PgfLiteralCallback* self, double prob = (*env)->GetDoubleField(env, jep, probId); jfieldID offsetId = (*env)->GetFieldID(env, result_class, "offset", "I"); - *poffset = (*env)->GetIntField(env, result, offsetId); - + *poffset = j2gu_string_offset(sentence, (*env)->GetIntField(env, result, offsetId)); + PgfExprProb* ep = gu_new(PgfExprProb, out_pool); ep->expr = gu_variant_from_ptr(get_ref(env, jexpr)); ep->prob = prob; |
