fix dict_splitFaces to work for utf8 -- by calling into existing java

code.  Fixes multi-device play with Catalan dict.
This commit is contained in:
eehouse 2010-04-22 04:56:48 +00:00
parent bb2642f4b6
commit c2c463171c
3 changed files with 17 additions and 25 deletions

View file

@ -37,28 +37,17 @@ typedef struct _AndDictionaryCtxt {
XP_U8* bytes; XP_U8* bytes;
} AndDictionaryCtxt; } AndDictionaryCtxt;
static void splitFaces_via_java( JNIEnv* env, AndDictionaryCtxt* ctxt,
const XP_U8* ptr,
int nFaceBytes, int nFaces, XP_Bool isUTF8 );
void void
dict_splitFaces( DictionaryCtxt* dict, const XP_U8* bytes, dict_splitFaces( DictionaryCtxt* dict, const XP_U8* bytes,
XP_U16 nBytes, XP_U16 nFaces ) XP_U16 nBytes, XP_U16 nFaces )
{ {
XP_UCHAR* faces = (XP_UCHAR*)XP_CALLOC( dict->mpool, nBytes + nFaces ); AndDictionaryCtxt* ctxt = (AndDictionaryCtxt*)dict;
const XP_UCHAR** ptrs = (const XP_UCHAR**) splitFaces_via_java( ctxt->env, ctxt, bytes, nBytes, nFaces,
XP_CALLOC( dict->mpool, nFaces * sizeof(ptrs[0])); dict->isUTF8 );
XP_U16 ii;
XP_UCHAR* next = faces;
/* now split; this will not work for utf8!!! */
for ( ii = 0; ii < nFaces; ++ii ) {
ptrs[ii] = next;
*next++ = *bytes++;
*next++ = 0;
}
XP_ASSERT( next == faces + nFaces + nBytes );
XP_ASSERT( !dict->faces );
dict->faces = faces;
XP_ASSERT( !dict->facePtrs );
dict->facePtrs = ptrs;
} }
static XP_U32 static XP_U32
@ -409,10 +398,12 @@ and_dictionary_getChars( JNIEnv* env, DictionaryCtxt* dict )
} }
DictionaryCtxt* DictionaryCtxt*
and_dictionary_make_empty( MPFORMAL_NOCOMMA ) and_dictionary_make_empty( MPFORMAL JNIEnv* env, JNIUtilCtxt* jniutil )
{ {
AndDictionaryCtxt* anddict AndDictionaryCtxt* anddict
= (AndDictionaryCtxt*)XP_CALLOC( mpool, sizeof( *anddict ) ); = (AndDictionaryCtxt*)XP_CALLOC( mpool, sizeof( *anddict ) );
anddict->env = env;
anddict->jniutil = jniutil;
dict_super_init( (DictionaryCtxt*)anddict ); dict_super_init( (DictionaryCtxt*)anddict );
MPASSIGN( anddict->super.mpool, mpool ); MPASSIGN( anddict->super.mpool, mpool );
return (DictionaryCtxt*)anddict; return (DictionaryCtxt*)anddict;
@ -431,13 +422,11 @@ makeDict( MPFORMAL JNIEnv *env, JNIUtilCtxt* jniutil, jbyteArray jbytes )
(*env)->ReleaseByteArrayElements( env, jbytes, src, 0 ); (*env)->ReleaseByteArrayElements( env, jbytes, src, 0 );
anddict = (AndDictionaryCtxt*) anddict = (AndDictionaryCtxt*)
and_dictionary_make_empty( MPPARM_NOCOMMA(mpool) ); and_dictionary_make_empty( MPPARM(mpool) env, jniutil );
anddict->super.destructor = and_dictionary_destroy; anddict->super.destructor = and_dictionary_destroy;
/* anddict->super.func_dict_getShortName = and_dict_getShortName; */ /* anddict->super.func_dict_getShortName = and_dict_getShortName; */
anddict->bytes = localBytes; anddict->bytes = localBytes;
anddict->env = env;
anddict->jniutil = jniutil;
parseDict( anddict, localBytes, len ); parseDict( anddict, localBytes, len );
setBlankTile( &anddict->super ); setBlankTile( &anddict->super );

View file

@ -31,7 +31,8 @@ dict_splitFaces( DictionaryCtxt* dict, const XP_U8* bytes,
DictionaryCtxt* makeDict( MPFORMAL JNIEnv *env, JNIUtilCtxt* jniutil, DictionaryCtxt* makeDict( MPFORMAL JNIEnv *env, JNIUtilCtxt* jniutil,
jbyteArray bytes ); jbyteArray bytes );
DictionaryCtxt* and_dictionary_make_empty( MPFORMAL_NOCOMMA ); DictionaryCtxt* and_dictionary_make_empty( MPFORMAL JNIEnv *env,
JNIUtilCtxt* jniutil );
jobject and_dictionary_getChars( JNIEnv* env, DictionaryCtxt* dict ); jobject and_dictionary_getChars( JNIEnv* env, DictionaryCtxt* dict );

View file

@ -293,8 +293,10 @@ and_util_makeEmptyDict( XW_UtilCtxt* uc )
#ifdef STUBBED_DICT #ifdef STUBBED_DICT
XP_ASSERT(0); XP_ASSERT(0);
#else #else
return AndGlobals* globals = (AndGlobals*)uc->closure;
and_dictionary_make_empty( MPPARM_NOCOMMA( ((AndUtil*)uc)->util.mpool ) ); AndUtil* andutil = (AndUtil*)uc;
return and_dictionary_make_empty( MPPARM( ((AndUtil*)uc)->util.mpool )
*andutil->env, globals->jniutil );
#endif #endif
} }