1053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
2053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
3053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
4053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * you may not use this file except in compliance with the License.
6053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * You may obtain a copy of the License at
7053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
8053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
10053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * See the License for the specific language governing permissions and
14053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * limitations under the License.
15053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
16053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#include "jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni.h"
17053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
18053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#include "nj_lib.h"
19053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#include "nj_err.h"
20053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#include "nj_ext.h"
21053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#include "nj_dic.h"
22053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
23053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
24053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#include <stdlib.h>
25053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#include <string.h>
26053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#include <dlfcn.h>
27053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
28053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#include "OpenWnnJni.h"
29053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
30053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
31053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#include "predef_table.h"
32053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
33053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/**
34053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * functions for internal use
35053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
36053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectstatic void clearDictionaryStructure( NJ_DIC_INFO* dicInfo ) {
37053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	dicInfo->type		= 0;
38053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	dicInfo->handle		= NULL;
39053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*	dicInfo->srhCache	= NULL; */
40053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
41053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	dicInfo->dic_freq[ NJ_MODE_TYPE_HENKAN ].base = 0;
42053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	dicInfo->dic_freq[ NJ_MODE_TYPE_HENKAN ].high = 0;
43053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
44053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
45053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectstatic NJ_CHAR convertUTFCharToNjChar( NJ_UINT8* src )
46053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
47053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_CHAR     ret;
48053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT8*   dst;
49053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
50053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /* convert UTF-16BE character to NJ_CHAR format */
51053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    dst = ( NJ_UINT8* )&ret;
52053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    dst[ 0 ] = src[ 0 ];
53053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    dst[ 1 ] = src[ 1 ];
54053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
55053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    return ret;
56053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
57053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
58053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectstatic int convertStringToNjChar( JNIEnv *env, NJ_CHAR* dst, jstring srcJ, int maxChars )
59053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
60053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	const unsigned char*	src;
61053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
62053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	src = ( const unsigned char* )( ( *env )->GetStringUTFChars( env, srcJ, NULL ) );
63053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( src != NULL ) {
64053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		int     i, o;
65053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
66053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* convert UTF-8 to UTF-16BE */
67053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        for( i = o = 0 ; src[ i ] != 0x00 && o < maxChars ; ) {
68053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			NJ_UINT8* dst_tmp;
69053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			dst_tmp = ( NJ_UINT8* )&( dst[ o ] );
70053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
71053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if( ( src[ i ] & 0x80 ) == 0x00 ) {
72053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /* U+0000 ... U+007f */
73053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /* 8[0xxxxxxx] -> 16BE[00000000 0xxxxxxx] */
74053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                dst_tmp[ 0 ] = 0x00;
75053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                dst_tmp[ 1 ] = src[ i + 0 ] & 0x7f;
76053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                i++;
77053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                o++;
78053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else if( ( src[ i ] & 0xe0 ) == 0xc0 ) {
79053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /* U+0080 ... U+07ff */
80053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /* 8[110xxxxx 10yyyyyy] -> 16BE[00000xxx xxyyyyyy] */
81053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if( src[ i + 1 ] == 0x00 ) {
82053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    break;
83053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
84053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                dst_tmp[ 0 ] = ( ( src[ i + 0 ] & 0x1f ) >> 2 );
85053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                dst_tmp[ 1 ] = ( ( src[ i + 0 ] & 0x1f ) << 6 ) |   ( src[ i + 1 ] & 0x3f );
86053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                i += 2;
87053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                o++;
88053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else if( ( src[ i ] & 0xf0 ) == 0xe0 ) {
89053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /* U+0800 ... U+ffff */
90053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /* 8[1110xxxx 10yyyyyy 10zzzzzz] -> 16BE[xxxxyyyy yyzzzzzz] */
91053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if( src[ i + 1 ] == 0x00 || src[ i + 2 ] == 0x00 ) {
92053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    break;
93053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
94053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                dst_tmp[ 0 ] = ( ( src[ i + 0 ] & 0x0f ) << 4 ) | ( ( src[ i + 1 ] & 0x3f ) >> 2 );
95053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                dst_tmp[ 1 ] = ( ( src[ i + 1 ] & 0x3f ) << 6 ) |   ( src[ i + 2 ] & 0x3f );
96053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                i += 3;
97053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                o++;
98053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else if( ( src[ i ] & 0xf8 ) == 0xf0 ) {
99053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                NJ_UINT8    dst1, dst2, dst3;
100053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /* U+10000 ... U+10ffff */
101053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /* 8[11110www 10xxxxxx 10yyyyyy 10zzzzzz] -> 32BE[00000000 000wwwxx xxxxyyyy yyzzzzzz] */
102053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /*                                        -> 16BE[110110WW XXxxxxyy 110111yy yyzzzzzz] */
103053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /*                                                      -- --======       == --------  */
104053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /*                                                      dst1   dst2          dst3      */
105053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /*                                        "wwwxx"(00001-10000) - 1 = "WWXX"(0000-1111) */
106053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if( !( o < maxChars - 1 ) ) {
107053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    /* output buffer is full */
108053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    break;
109053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
110053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if( src[ i + 1 ] == 0x00 || src[ i + 2 ] == 0x00 || src[ i + 3 ] == 0x00 ) {
111053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    break;
112053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
113053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                dst1 = ( ( ( src[ i + 0 ] & 0x07 ) << 2 ) | ( ( src[ i + 1 ] & 0x3f ) >> 4 ) ) - 1;
114053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                dst2 =   ( ( src[ i + 1 ] & 0x3f ) << 4 ) | ( ( src[ i + 2 ] & 0x3f ) >> 2 );
115053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                dst3 =   ( ( src[ i + 2 ] & 0x3f ) << 6 ) |   ( src[ i + 3 ] & 0x3f );
116053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
117053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                dst_tmp[ 0 ] = 0xd8 | ( ( dst1 & 0x0c ) >> 2 );
118053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                dst_tmp[ 1 ] =        ( ( dst1 & 0x03 ) << 6 ) | ( ( dst2 & 0xfc ) >> 2 );
119053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                dst_tmp[ 2 ] = 0xdc |                            ( ( dst2 & 0x03 ) );
120053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                dst_tmp[ 3 ] =                                                              dst3;
121053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                i += 4;
122053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                o += 2;
123053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {    /* Broken code */
124053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
125053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
126053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
127053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dst[ o ] = NJ_CHAR_NUL;
128053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
129053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		( *env )->ReleaseStringUTFChars( env, srcJ, ( const char* )src );
130053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		return 0;
131053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	}
132053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* If retrieveing the string failed, return an error code */
133053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return NJ_SET_ERR_VAL(NJ_FUNC_JNI_CONVERT_STR_TO_NJC, NJ_ERR_JNI_FUNC_FAILED);
134053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
135053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
136053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectstatic int convertNjCharToString( JNIEnv* env, jstring* dstJ, NJ_CHAR* src, int maxChars )
137053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
138053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    char        dst[ (NJ_MAX_LEN + NJ_MAX_RESULT_LEN + NJ_TERM_LEN ) * 3 + 1 ];
139053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
140053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	int		i, o;
141053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
142053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* convert UTF-16BE to a UTF-8 */
143053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	for( i = o = 0 ; src[ i ] != 0x0000 && i < maxChars ; ) {
144053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		NJ_UINT8* src_tmp;
145053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		src_tmp = ( NJ_UINT8* )&( src[ i ] );
146053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
147053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if( src_tmp[ 0 ] == 0x00 && src_tmp[ 1 ] <= 0x7f ) {
148053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* U+0000 ... U+007f */
149053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* 16BE[00000000 0xxxxxxx] -> 8[0xxxxxxx] */
150053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            dst[ o + 0 ] = src_tmp[ 1 ] & 0x007f;
151053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            i++;
152053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            o++;
153053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else if ( src_tmp[ 0 ] <= 0x07 ) {
154053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* U+0080 ... U+07ff */
155053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* 16BE[00000xxx xxyyyyyy] -> 8[110xxxxx 10yyyyyy] */
156053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            dst[ o + 0 ] = 0xc0 | ( ( src_tmp[ 0 ] & 0x07 ) << 2 ) | ( ( src_tmp[ 1 ] & 0xc0 ) >> 6 );
157053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            dst[ o + 1 ] = 0x80 |                                    ( ( src_tmp[ 1 ] & 0x3f ) );
158053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            i++;
159053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            o += 2;
160053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else if ( src_tmp[ 0 ] >= 0xd8 && src_tmp[ 0 ] <= 0xdb ) {
161053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            NJ_UINT8    src1, src2, src3;
162053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* U+10000 ... U+10ffff (surrogate pair) */
163053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* 32BE[00000000 000wwwxx xxxxyyyy yyzzzzzz] -> 8[11110www 10xxxxxx 10yyyyyy 10zzzzzz] */
164053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* 16BE[110110WW XXxxxxyy 110111yy yyzzzzzz]                                           */
165053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /*            -- --======       == --------                                            */
166053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /*            src1 src2            src3                                                */
167053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* "WWXX"(0000-1111) + 1 = "wwwxx"(0001-10000)                                         */
168053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if( !( i < maxChars - 1 ) || src_tmp[ 2 ] < 0xdc || src_tmp[ 2 ] > 0xdf ) {
169053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /* That is broken code */
170053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
171053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
172053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            src1 = ( ( ( src_tmp[ 0 ] & 0x03 ) << 2 ) | ( ( src_tmp[ 1 ] & 0xc0 ) >> 6 )                               ) + 1;
173053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            src2 =                                      ( ( src_tmp[ 1 ] & 0x3f ) << 2 ) | ( ( src_tmp[ 2 ] & 0x03 ) );
174053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            src3 =                                                                             src_tmp[ 3 ];
175053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
176053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            dst[ o + 0 ] = 0xf0 | ( ( src1 & 0x1c ) >> 2 );
177053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            dst[ o + 1 ] = 0x80 | ( ( src1 & 0x03 ) << 4 ) | ( ( src2 & 0xf0 ) >> 4 );
178053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            dst[ o + 2 ] = 0x80 |                            ( ( src2 & 0x0f ) << 2 ) | ( ( src3 & 0xc0 ) >> 6 );
179053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            dst[ o + 3 ] = 0x80 |                                                         ( src3 & 0x3f );
180053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            i += 2;
181053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            o += 4;
182053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
183053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* U+0800 ... U+ffff (except range of surrogate pair) */
184053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* 16BE[xxxxyyyy yyzzzzzz] -> 8[1110xxxx 10yyyyyy 10zzzzzz] */
185053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            dst[ o + 0 ] = 0xe0 | ( ( src_tmp[ 0 ] & 0xf0 ) >> 4 );
186053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            dst[ o + 1 ] = 0x80 | ( ( src_tmp[ 0 ] & 0x0f ) << 2 ) | ( ( src_tmp[ 1 ] & 0xc0 ) >> 6  );
187053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            dst[ o + 2 ] = 0x80 |                                    ( ( src_tmp[ 1 ] & 0x3f ) );
188053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            i++;
189053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            o += 3;
190053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
191053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	}
192053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	dst[ o ] = 0x00;
193053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
194053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	*dstJ = ( *env )->NewStringUTF( env, dst );
195053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
196053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* If NewString() failed, return an error code */
197053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return ( *dstJ == NULL ) ? NJ_SET_ERR_VAL(NJ_FUNC_JNI_CONVERT_NJC_TO_STR, NJ_ERR_JNI_FUNC_FAILED) : 0;
198053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
199053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
200053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
201053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
202053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    createWnnWork
203053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (Ljava/lang/String;)J
204053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
205053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT jlong JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_createWnnWork
206053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jobject obj, jstring dicLibPathJ)
207053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
208053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK*		work;
209053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
210053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* Allocating the internal work area */
211053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = ( NJ_JNIWORK* )malloc( sizeof( NJ_JNIWORK ) );
212053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
213053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		NJ_UINT32*		dic_size;
214053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		NJ_UINT8*		dic_type;
215053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        NJ_UINT8**      dic_data;
216053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        NJ_UINT8**      con_data;
217053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		const char*		dicLibPath;
218053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		NJ_INT16		result;
219053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		int				i;
220053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
221053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		/* Initialize the work area */
222053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		memset( work, 0x00, sizeof( NJ_JNIWORK ) );
223053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
224053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		/* Load the dictionary library which is specified by dicLibPathJ */
225053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		if( dicLibPathJ == NULL ||
226053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			( dicLibPath = ( *env )->GetStringUTFChars( env, dicLibPathJ, 0 ) ) == NULL ) {
227053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			free( work );
228053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			return 0;
229053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		}
230053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
231053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		work->dicLibHandle = ( void* )dlopen( dicLibPath, RTLD_LAZY );
232053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		( *env )->ReleaseStringUTFChars( env, dicLibPathJ, dicLibPath );
233053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
234053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		if( work->dicLibHandle == NULL ) {
235053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			free( work );
236053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			return 0;
237053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		}
238053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
239053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		/* Retrieve data pointers of dictionary from the dictionary library, and put to internal work area */
240053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		dic_size = ( NJ_UINT32* )dlsym( work->dicLibHandle, "dic_size" );
241053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		dic_type = ( NJ_UINT8* )dlsym( work->dicLibHandle, "dic_type" );
242053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dic_data = ( NJ_UINT8** )dlsym( work->dicLibHandle, "dic_data" );
243053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		if( dic_size == NULL || dic_type == NULL || dic_data == NULL ) {
244053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			dlclose( work->dicLibHandle );
245053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			free( work );
246053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			return 0;
247053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		}
248053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
249053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		for( i = 0 ; i < NJ_MAX_DIC ; i++ ) {
250053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            work->dicHandle[ i ]    = dic_data[ i ];
251053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			work->dicSize[ i ]      = dic_size[ i ];
252053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			work->dicType[ i ]      = dic_type[ i ];
253053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		}
254053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
255053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* Set the rule dictionary if the rule data exist */
256053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        con_data = ( NJ_UINT8** )dlsym( work->dicLibHandle, "con_data" );
257053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if( con_data != NULL ) {
258053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            work->dicSet.rHandle[ NJ_MODE_TYPE_HENKAN ] = con_data[ 0 ];
259053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
260053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
261053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		/* Execute the initialize method to initialize the internal work area */
262053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		result = njx_init( &( work->wnnClass ) );
263053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
264053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		if( result >= 0 ) {
265053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            jlong   jresult;
266053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
267053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            *( NJ_JNIWORK** )&jresult = work;
268053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			return jresult;
269053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		}
270053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
271053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		/* If allocating a byte array failed, free all resource, and return NULL */
272053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		dlclose( work->dicLibHandle );
273053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		free( work );
274053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	}
275053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* If allocating the internal work area failed, return NULL */
276053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return 0;
277053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
278053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
279053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
280053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
281053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    freeWnnWork
282053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (J)I
283053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
284053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT jint JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_freeWnnWork
285053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jobject obj, jlong wnnWork)
286053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
287053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK*	work;
288053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
289053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
290053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
291053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		/* If the internal work area was not yet released, remove that */
292053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if( work->dicLibHandle != NULL ) {
293053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        	dlclose( work->dicLibHandle );
294053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            work->dicLibHandle = NULL;
295053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
296053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		free( work );
297053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
298053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		return 0;
299053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	}
300053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
301053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* freeWnnWork() is always successful even if the internal work area was already released */
302053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return 0;
303053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
304053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
305053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
306053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
307053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    clearDictionaryParameters
308053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (J)I
309053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
310053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT jint JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_clearDictionaryParameters
311053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jobject obj, jlong wnnWork)
312053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
313053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK*	work;
314053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
315053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
316053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
317053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		int				index;
318053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
319053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		/* Clear all dictionary set information structure and reset search state */
320053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		for( index = 0 ; index < NJ_MAX_DIC ; index++ ) {
321053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    		clearDictionaryStructure( &( work->dicSet.dic[ index ] ) );
322053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		}
323053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        work->flag = NJ_JNI_FLAG_NONE;
324053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
325053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* Clear the cache information */
326053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        memset( work->dicSet.keyword, 0x00, sizeof( work->dicSet.keyword ) );
327053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
328053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		return 0;
329053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	}
330053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
331053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* If the internal work area was already released, return an error code */
332053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return NJ_SET_ERR_VAL(NJ_FUNC_JNI_CLEAR_DICTIONARY_PARAMETERS, NJ_ERR_NOT_ALLOCATED);
333053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
334053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
335053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
336053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
337053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    setDictionaryParameter
338053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (JIII)I
339053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
340053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT jint JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_setDictionaryParameter
341053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jobject obj, jlong wnnWork, jint index, jint base, jint high)
342053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
343053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK*	work;
344053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
345053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( ( index < 0  || index > NJ_MAX_DIC-1 ) ||
346053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		( base <  -1 || base > 1000 ) ||
347053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		( high <  -1 || high > 1000 ) ) {
348053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		/* If a invalid parameter was specified, return an error code */
349053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SET_DICTIONARY_PARAMETERS, NJ_ERR_INVALID_PARAM);
350053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	}
351053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
352053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
353053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
354053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		/* Create the dictionary set information structure */
355053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		if( base < 0 || high < 0 || base > high ) {
356053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			/* If -1 was specified to base or high, clear that dictionary information structure */
357053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* If base is larger than high, clear that dictionary information structure */
358053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    		clearDictionaryStructure( &( work->dicSet.dic[ index ] ) );
359053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		} else {
360053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			/* Set the dictionary informatin structure */
361053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    		work->dicSet.dic[ index ].type		= work->dicType[ index ];
362053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    		work->dicSet.dic[ index ].handle	= work->dicHandle[ index ];
363053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    		work->dicSet.dic[ index ].srhCache	= &( work->srhCache[ index ] );
364053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
365053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    		work->dicSet.dic[ index ].dic_freq[ NJ_MODE_TYPE_HENKAN ].base = base;
366053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    		work->dicSet.dic[ index ].dic_freq[ NJ_MODE_TYPE_HENKAN ].high = high;
367053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		}
368053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
369053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* Reset search state because the dicionary information was changed */
370053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        work->flag = NJ_JNI_FLAG_NONE;
371053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
372053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		return 0;
373053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	}
374053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
375053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* If the internal work area was already released, return an error code */
376053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SET_DICTIONARY_PARAMETERS, NJ_ERR_NOT_ALLOCATED);
377053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
378053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
379053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
380053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
381053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    searchWord
382053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (JIILjava/lang/String;)I
383053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
384053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT jint JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_searchWord
385053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jobject obj, jlong wnnWork, jint operation, jint order, jstring keyString)
386053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
387053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK*	work;
388053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
389053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( !( operation == jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_SEARCH_EXACT ||
390053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project           operation == jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_SEARCH_PREFIX ||
391053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project           operation == jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_SEARCH_LINK ) ||
392053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		!( order == jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_ORDER_BY_FREQUENCY ||
393053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project           order == jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_ORDER_BY_KEY ) ||
394053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		   keyString == NULL ) {
395053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		/* If a invalid parameter was specified, return an error code */
396053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SEARCH_WORD, NJ_ERR_INVALID_PARAM);
397053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	}
398053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
399053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
400053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
401053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if( ( *env )->GetStringLength( env, keyString ) > NJ_MAX_LEN ) {
402053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* If too long key string was specified, return "No result is found" */
403053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            work->flag &= ~NJ_JNI_FLAG_ENABLE_CURSOR;
404053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            work->flag &= ~NJ_JNI_FLAG_ENABLE_RESULT;
405053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return 0;
406053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
407053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
408053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		if( convertStringToNjChar( env, work->keyString, keyString, NJ_MAX_LEN ) >= 0 ) {
409053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            jint    result;
410053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
411053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			/* Set the structure for search */
412053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			memset( &( work->cursor ), 0x00, sizeof( NJ_CURSOR ) );
413053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			work->cursor.cond.operation	= operation;
414053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			work->cursor.cond.mode		= order;
415053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			work->cursor.cond.ds		= &( work->dicSet );
416053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			work->cursor.cond.yomi		= work->keyString;
417053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project   			work->cursor.cond.charset	= &( work->approxSet );
418053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
419d56eddfd5e0f193359f93e7ef665338cace9e2e9Daisuke Miyakawa            /* If the link search feature is specified, set the predict search information to structure */
420d56eddfd5e0f193359f93e7ef665338cace9e2e9Daisuke Miyakawa            if( operation == jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_SEARCH_LINK ) {
421053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                work->cursor.cond.yomi  = work->previousStroke;
422053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                work->cursor.cond.kanji = work->previousCandidate;
423053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
424053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
425053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			/* Search a specified word */
426053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            memcpy( &( work->wnnClass.dic_set ), &( work->dicSet ), sizeof( NJ_DIC_SET ) );
427053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			result = ( jint )njx_search_word( &( work->wnnClass ), &( work->cursor ) );
428053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
429053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* If a result is found, enable getNextWord method */
430053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if( result == 1 ) {
431053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                work->flag |= NJ_JNI_FLAG_ENABLE_CURSOR;
432053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
433053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                work->flag &= ~NJ_JNI_FLAG_ENABLE_CURSOR;
434053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
435053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            work->flag &= ~NJ_JNI_FLAG_ENABLE_RESULT;
436053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
437053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return result;
438053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		}
439053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		/* If converting the string failed, return an error code */
440053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SEARCH_WORD, NJ_ERR_INTERNAL);
441053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	}
442053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
443053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* If the internal work area was already released, return an error code */
444053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SEARCH_WORD, NJ_ERR_NOT_ALLOCATED);
445053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
446053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
447053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
448053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
449053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    getNextWord
450f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa * Signature: (JI)I
451053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
452053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT jint JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_getNextWord
453f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa  (JNIEnv *env, jclass obj, jlong wnnWork, jint length)
454053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
455053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK*	work;
456053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
457053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
458053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
459053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if( work->flag & NJ_JNI_FLAG_ENABLE_CURSOR ) {
460053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            jint    result;
461053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
462f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa       		/* Get a specified word and search a next word */
463f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa            if( length <= 0 ) {
464f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa        		result = ( jint )njx_get_word( &( work->wnnClass ), &( work->cursor ), &( work->result ) );
465f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa            } else {
466f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa                do {
467f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa            		result = ( jint )njx_get_word( &( work->wnnClass ), &( work->cursor ), &( work->result ) );
468f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa                    if( length == ( NJ_GET_YLEN_FROM_STEM( &( work->result.word ) ) + NJ_GET_YLEN_FROM_FZK( &( work->result.word ) ) ) ) {
469f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa                        break;
470f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa                    }
471f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa                } while( result > 0 );
472f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa            }
473053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
474053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* If a result is found, enable getStroke, getCandidate, getFrequency methods */
475053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if( result > 0 ) {
476053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                work->flag |= NJ_JNI_FLAG_ENABLE_RESULT;
477053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
478053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                work->flag &= ~NJ_JNI_FLAG_ENABLE_RESULT;
479053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
480053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return result;
481053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
482053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* When njx_search_word() was not yet called, return "No result is found" */
483053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return 0;
484053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
485053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	}
486053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
487053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* If the internal work area was already released, return an error code */
488053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return NJ_SET_ERR_VAL(NJ_FUNC_JNI_GET_WORD, NJ_ERR_NOT_ALLOCATED);
489053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
490053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
491053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
492053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
493053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    getStroke
494053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (J)Ljava/lang/String;
495053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
496053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT jstring JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_getStroke
497053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jobject obj, jlong wnnWork)
498053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
499053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK*	work;
500053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
501053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
502053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
503053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project   		jstring		str;
504053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
505053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if( work->flag & NJ_JNI_FLAG_ENABLE_RESULT ) {
506053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    		NJ_CHAR		stroke[ NJ_MAX_LEN + NJ_TERM_LEN ];
507053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
508053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    		if( njx_get_stroke( &( work->wnnClass ), &( work->result ), stroke, sizeof( NJ_CHAR ) * ( NJ_MAX_LEN + NJ_TERM_LEN ) ) >= 0 &&
509053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    			convertNjCharToString( env, &str, stroke, NJ_MAX_LEN ) >= 0 ) {
510053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    			return str;
511053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    		}
512053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
513053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* When njx_get_word() was not yet called, return "No result is found" */
514053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if( convertNjCharToString( env, &str, ( NJ_CHAR* )"\x00\x00", NJ_MAX_LEN ) >= 0 ) {
515053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                return str;
516053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
517053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
518053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	}
519053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
520053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* If the internal work area was already released, return an error status */
521053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return NULL;
522053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
523053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
524053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
525053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
526053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    getCandidate
527053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (J)Ljava/lang/String;
528053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
529053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT jstring JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_getCandidate
530053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jobject obj, jlong wnnWork)
531053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
532053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK*	work;
533053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
534053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
535053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
536053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project   		jstring		str;
537053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
538053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if( work->flag & NJ_JNI_FLAG_ENABLE_RESULT ) {
539053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    		NJ_CHAR		candidate[ NJ_MAX_LEN + NJ_TERM_LEN ];
540053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
541053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    		if( njx_get_candidate( &( work->wnnClass ), &( work->result ), candidate, sizeof( NJ_CHAR ) * ( NJ_MAX_RESULT_LEN + NJ_TERM_LEN ) ) >= 0 &&
542053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    			convertNjCharToString( env, &str, candidate, NJ_MAX_RESULT_LEN ) >= 0 ) {
543053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    			return str;
544053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
545053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
546053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* When njx_get_word() was not yet called, return "No result is found" */
547053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if( convertNjCharToString( env, &str, ( NJ_CHAR* )"\x00\x00", NJ_MAX_RESULT_LEN ) >= 0 ) {
548053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                return str;
549053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
550053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
551053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	}
552053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
553053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* If the internal work area was already released, return an error status */
554053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return NULL;
555053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
556053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
557053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
558053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
559053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    getFrequency
560053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (J)I
561053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
562053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT jint JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_getFrequency
563053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jobject obj, jlong wnnWork)
564053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
565053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK*	work;
566053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
567053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
568053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
569053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if( work->flag & NJ_JNI_FLAG_ENABLE_RESULT ) {
570053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    		return ( jint )( work->result.word.stem.hindo );
571053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
572053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* When njx_get_word() was not yet called, return "No result is found" */
573053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return 0;
574053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
575053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	}
576053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
577053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* If the internal work area was already released, return an error code */
578053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return NJ_SET_ERR_VAL(NJ_FUNC_JNI_GET_FREQUENCY, NJ_ERR_NOT_ALLOCATED);
579053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
580053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
581053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
582053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
583053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    clearApproxPatterns
584053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (J)V
585053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
586053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT void JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_clearApproxPatterns
587053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jobject obj, jlong wnnWork)
588053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
589053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK*	work;
590053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
591053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
592053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
593053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		int			i;
594053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
595053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* Clear state */
596053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        work->flag = NJ_JNI_FLAG_NONE;
597053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
598053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* Clear approximate patterns */
599053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		work->approxSet.charset_count = 0;
600053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		for( i = 0 ; i < NJ_MAX_CHARSET ; i++ ) {
601053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			work->approxSet.from[ i ] = NULL;
602053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			work->approxSet.to[ i ]   = NULL;
603053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		}
604053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
605053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* Clear the cache information */
606053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        memset( work->dicSet.keyword, 0x00, sizeof( work->dicSet.keyword ) );
607053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	}
608053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
609053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
610053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
611053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
612053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    setApproxPattern
613053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (JLjava/lang/String;Ljava/lang/String;)I
614053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
615053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT jint JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_setApproxPattern__JLjava_lang_String_2Ljava_lang_String_2
616053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jobject obj, jlong wnnWork, jstring srcJ, jstring dstJ)
617053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
618053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK*	work;
619053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
620053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( srcJ == NULL || ( *env )->GetStringLength( env, srcJ ) == 0 || ( *env )->GetStringLength( env, srcJ ) > 1 ||
621053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		dstJ == NULL || ( *env )->GetStringLength( env, dstJ ) == 0 || ( *env )->GetStringLength( env, dstJ ) > 3 ) {
622053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		/* If a invalid parameter was specified, return an error code */
623053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SET_APPROX_PATTERN, NJ_ERR_INVALID_PARAM);
624053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	}
625053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
626053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
627053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
628053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		if( work->approxSet.charset_count < NJ_MAX_CHARSET ) {
629053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			NJ_CHAR*		from;
630053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			NJ_CHAR*		to;
631053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
632053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			/* Set pointers of string to store approximate informations */
633053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			from = work->approxStr + NJ_APPROXSTORE_SIZE * work->approxSet.charset_count;
634053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			to   = work->approxStr + NJ_APPROXSTORE_SIZE * work->approxSet.charset_count + NJ_MAX_CHARSET_FROM_LEN + NJ_TERM_LEN;
635053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			work->approxSet.from[ work->approxSet.charset_count ] = from;
636053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			work->approxSet.to[ work->approxSet.charset_count ]   = to;
637053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
638053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			/* Convert approximate informations to internal format */
639053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			if( convertStringToNjChar( env, from, srcJ, NJ_MAX_CHARSET_FROM_LEN ) >= 0 &&
640053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project				convertStringToNjChar( env, to, dstJ, NJ_MAX_CHARSET_TO_LEN )   >= 0 ) {
641053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project				work->approxSet.charset_count++;
642053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
643053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /* Reset search state because the seach condition was changed */
644053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                work->flag = NJ_JNI_FLAG_NONE;
645053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
646053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project				return 0;
647053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			}
648053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
649053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			/* If converting informations failed, reset pointers, and return an error code */
650053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			work->approxSet.from[ work->approxSet.charset_count ] = NULL;
651053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			work->approxSet.to[ work->approxSet.charset_count ]   = NULL;
652053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SET_APPROX_PATTERN, NJ_ERR_INTERNAL);
653053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		}
654053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		/* If the approx pattern registration area was full, return an error code */
655053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SET_APPROX_PATTERN, NJ_ERR_APPROX_PATTERN_IS_FULL);
656053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	}
657053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
658053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* If the internal work area was already released, return an error code */
659053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SET_APPROX_PATTERN, NJ_ERR_NOT_ALLOCATED);
660053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
661053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
662053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
663053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
664053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    setApproxPattern
665053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (JI)I
666053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
667053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT jint JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_setApproxPattern__JI
668053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jclass obj, jlong wnnWork, jint approxPattern)
669053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
670053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK	*work;
671053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
672053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( !( approxPattern == jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_APPROX_PATTERN_EN_TOUPPER ||
673053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		   approxPattern == jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_APPROX_PATTERN_EN_TOLOWER ||
674053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		   approxPattern == jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_APPROX_PATTERN_EN_QWERTY_NEAR ||
675053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		   approxPattern == jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_APPROX_PATTERN_EN_QWERTY_NEAR_UPPER ||
676053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		   approxPattern == jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_APPROX_PATTERN_JAJP_12KEY_NORMAL ) ) {
677053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		/* If a invalid parameter was specified, return an error code */
678053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SET_APPROX_PATTERN, NJ_ERR_INVALID_PARAM);
679053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	}
680053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
681053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
682053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
683053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		const PREDEF_APPROX_PATTERN*	pattern;
684053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
685053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        pattern = predefinedApproxPatterns[ approxPattern ];
686053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		if( work->approxSet.charset_count + pattern->size <= NJ_MAX_CHARSET ) {
687053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			int     i;
688053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
689053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			for( i = 0 ; i < pattern->size ; i++ ) {
690053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project				NJ_CHAR*    from;
691053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project				NJ_CHAR*    to;
692053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
693053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project				/* Set pointers of string to store approximate informations */
694053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project				from = work->approxStr + NJ_APPROXSTORE_SIZE * ( work->approxSet.charset_count + i );
695053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project				to   = work->approxStr + NJ_APPROXSTORE_SIZE * ( work->approxSet.charset_count + i ) + NJ_MAX_CHARSET_FROM_LEN + NJ_TERM_LEN;
696053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project				work->approxSet.from[ work->approxSet.charset_count + i ] = from;
697053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project				work->approxSet.to[ work->approxSet.charset_count + i ]   = to;
698053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
699053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project				/* Set approximate pattern */
700053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project				from[ 0 ] = convertUTFCharToNjChar( pattern->from + i * 2 );    /* "2" means the size of UTF-16BE */
701053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project				from[ 1 ] = 0x0000;
702053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
703053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project				to[ 0 ] = convertUTFCharToNjChar( pattern->to + i * 2 );        /* "2" means the size of UTF-16BE */
704053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project				to[ 1 ] = 0x0000;
705053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			}
706053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			work->approxSet.charset_count += pattern->size;
707053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
708053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* Reset search state because the seach condition was changed */
709053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            work->flag = NJ_JNI_FLAG_NONE;
710053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
711053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project			return 0;
712053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		}
713053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		/* If the approx pattern registration area was full, return an error code */
714053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SET_APPROX_PATTERN, NJ_ERR_APPROX_PATTERN_IS_FULL);
715053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	}
716053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
717053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* If the internal work area was already released, return an error code */
718053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SET_APPROX_PATTERN, NJ_ERR_NOT_ALLOCATED);
719053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
720053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
721053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
722053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
723053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    getLeftPartOfSpeech
724053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (J)I
725053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
726053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT jint JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_getLeftPartOfSpeech
727053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jclass obj, jlong wnnWork)
728053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
729053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK*	work;
730053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
731053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
732053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
733053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_GET_FPOS_FROM_STEM( &( work->result.word ) );
734053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
735053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
736053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* If the internal work area was already released, return an error code */
737053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return NJ_SET_ERR_VAL(NJ_FUNC_JNI_GET_LEFT_PART_OF_SPEECH, NJ_ERR_NOT_ALLOCATED);
738053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
739053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
740053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
741053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
742053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    getRightPartOfSpeech
743053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (J)I
744053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
745053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT jint JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_getRightPartOfSpeech
746053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jclass obj, jlong wnnWork)
747053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
748053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK*	work;
749053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
750053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
751053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
752053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_GET_BPOS_FROM_STEM( &( work->result.word ) );
753053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
754053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
755053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* If the internal work area was already released, return an error code */
756053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return NJ_SET_ERR_VAL(NJ_FUNC_JNI_GET_RIGHT_PART_OF_SPEECH, NJ_ERR_NOT_ALLOCATED);
757053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
758053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
759053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
760053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
761053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    clearResult
762053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (J)V
763053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
764053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT void JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_clearResult
765053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jclass obj, jlong wnnWork)
766053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
767053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK*	work;
768053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
769053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
770053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
771053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* Clear the current word information */
772053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        memset( &( work->result ), 0x00, sizeof( NJ_RESULT ) );
773053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        memset( &( work->previousStroke ), 0x00, sizeof( work->previousStroke ) );
774053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        memset( &( work->previousCandidate ), 0x00, sizeof( work->previousCandidate ) );
775053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
776053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
777053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /* In this method, No error reports. */
778053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
779053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
780053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
781053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
782053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    setLeftPartOfSpeech
783053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (JI)I
784053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
785053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT jint JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_setLeftPartOfSpeech
786053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jclass obj, jlong wnnWork, jint leftPartOfSpeech)
787053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
788053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK*	work;
789053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
790053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
791053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
792053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        NJ_UINT16   lcount = 0, rcount = 0;
793053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
794053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if( work->dicSet.rHandle[ NJ_MODE_TYPE_HENKAN ] == NULL ) {
795053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* No rule dictionary was set */
796053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        	return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SET_LEFT_PART_OF_SPEECH, NJ_ERR_NO_RULEDIC);
797053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
798053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
799053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        njd_r_get_count( work->dicSet.rHandle[ NJ_MODE_TYPE_HENKAN ], &lcount, &rcount );
800053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
801053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if( leftPartOfSpeech < 1 || leftPartOfSpeech > lcount ) {
802053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    		/* If a invalid parameter was specified, return an error code */
803053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    		return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SET_LEFT_PART_OF_SPEECH, NJ_ERR_INVALID_PARAM);
804053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
805053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
806053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        NJ_SET_FPOS_TO_STEM( &( work->result.word ), leftPartOfSpeech );
807053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return 0;
808053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
809053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
810053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* If the internal work area was already released, return an error code */
811053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SET_LEFT_PART_OF_SPEECH, NJ_ERR_NOT_ALLOCATED);
812053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
813053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
814053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
815053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
816053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    setRightPartOfSpeech
817053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (JI)I
818053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
819053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT jint JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_setRightPartOfSpeech
820053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jclass obj, jlong wnnWork, jint rightPartOfSpeech)
821053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
822053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK*	work;
823053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
824053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
825053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
826053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        NJ_UINT16   lcount = 0, rcount = 0;
827053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
828053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if( work->dicSet.rHandle[ NJ_MODE_TYPE_HENKAN ] == NULL ) {
829053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* No rule dictionary was set */
830053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        	return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SET_RIGHT_PART_OF_SPEECH, NJ_ERR_NO_RULEDIC);
831053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
832053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
833053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        njd_r_get_count( work->dicSet.rHandle[ NJ_MODE_TYPE_HENKAN ], &lcount, &rcount );
834053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
835053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if( rightPartOfSpeech < 1 || rightPartOfSpeech > rcount ) {
836053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    		/* If a invalid parameter was specified, return an error code */
837053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    		return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SET_RIGHT_PART_OF_SPEECH, NJ_ERR_INVALID_PARAM);
838053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
839053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
840053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        NJ_SET_BPOS_TO_STEM( &( work->result.word ), rightPartOfSpeech );
841053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return 0;
842053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
843053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
844053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* If the internal work area was already released, return an error code */
845053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SET_RIGHT_PART_OF_SPEECH, NJ_ERR_NOT_ALLOCATED);
846053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
847053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
848053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
849053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
850053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    setStroke
851053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (JLjava/lang/String;)I
852053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
853053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT jint JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_setStroke
854053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jclass obj, jlong wnnWork, jstring stroke)
855053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
856053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK*	work;
857053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
858053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if( stroke == NULL ) {
859053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		/* If a invalid parameter was specified, return an error code */
860053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SET_STROKE, NJ_ERR_INVALID_PARAM);
861053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
862053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
863053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
864053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
865053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if( ( *env )->GetStringLength( env, stroke ) > NJ_MAX_LEN ) {
866053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    		/* If a invalid parameter was specified, return an error code */
867053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        	return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SET_STROKE, NJ_ERR_YOMI_TOO_LONG);
868053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
869053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
870053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* Store stroke string */
871053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		if( convertStringToNjChar( env, work->previousStroke, stroke, NJ_MAX_LEN ) >= 0 ) {
872053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return 0;
873053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
874053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
875053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		/* If converting the string failed, return an error code */
876053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SET_STROKE, NJ_ERR_INTERNAL);
877053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
878053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
879053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* If the internal work area was already released, return an error code */
880053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SET_STROKE, NJ_ERR_NOT_ALLOCATED);
881053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
882053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
883053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
884053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
885053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    setCandidate
886053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (JLjava/lang/String;)I
887053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
888053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT jint JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_setCandidate
889053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jclass obj, jlong wnnWork, jstring candidate)
890053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
891053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK*	work;
892053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
893053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if( candidate == NULL ) {
894053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		/* If a invalid parameter was specified, return an error code */
895053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SET_CANDIDATE, NJ_ERR_INVALID_PARAM);
896053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
897053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
898053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
899053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
900053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if( ( *env )->GetStringLength( env, candidate ) > NJ_MAX_RESULT_LEN ) {
901053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    		/* If a invalid parameter was specified, return an error code */
902053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        	return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SET_CANDIDATE, NJ_ERR_CANDIDATE_TOO_LONG);
903053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
904053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
905053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* Store candidate string */
906053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		if( convertStringToNjChar( env, work->previousCandidate, candidate, NJ_MAX_RESULT_LEN ) >= 0 ) {
907053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return 0;
908053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
909053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
910053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		/* If converting the string failed, return an error code */
911053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SET_CANDIDATE, NJ_ERR_INTERNAL);
912053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
913053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
914053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* If the internal work area was already released, return an error code */
915053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SET_CANDIDATE, NJ_ERR_NOT_ALLOCATED);
916053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
917053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
918053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
919053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
920053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    selectWord
921053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (J)I
922053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
923053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT jint JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_selectWord
924053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jclass obj, jlong wnnWork)
925053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
926053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK*	work;
927053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
928053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
929053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
930053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* Put the previous word information to engine */
931053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        memcpy( &( work->wnnClass.dic_set ), &( work->dicSet ), sizeof( NJ_DIC_SET ) );
932053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return ( jint )njx_select( &( work->wnnClass ), &( work->result ) );
933053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
934053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
935053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* If the internal work area was already released, return an error code */
936053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return NJ_SET_ERR_VAL(NJ_FUNC_JNI_SELECT_WORD, NJ_ERR_NOT_ALLOCATED);
937053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
938053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
939053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
940053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
941053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    getLeftPartOfSpeechSpecifiedType
942053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (JI)I
943053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
944053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT jint JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_getLeftPartOfSpeechSpecifiedType
945053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jclass obj, jlong wnnWork, jint type)
946053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
947053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK*	work;
948053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
949053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
950053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
951053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        switch( type ) {
952053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_POS_TYPE_V1:
953053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            type = NJ_HINSI_V1_F;
954053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
955053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_POS_TYPE_V2:
956053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            type = NJ_HINSI_V2_F;
957053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
958053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_POS_TYPE_V3:
959053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            type = NJ_HINSI_V3_F;
960053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
961053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_POS_TYPE_BUNTOU:
962053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    		/* No part of speech is defined at this type */
963053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return 0;
964053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_POS_TYPE_TANKANJI:
965053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            type = NJ_HINSI_TANKANJI_F;
966053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
967053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_POS_TYPE_SUUJI:
968053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    		/* No part of speech is defined at this type */
969053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return 0;
970053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_POS_TYPE_MEISI:
971053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            type = NJ_HINSI_MEISI_F;
972053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
973053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_POS_TYPE_JINMEI:
974053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            type = NJ_HINSI_JINMEI_F;
975053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
976053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_POS_TYPE_CHIMEI:
977053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            type = NJ_HINSI_CHIMEI_F;
978053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
979053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_POS_TYPE_KIGOU:
980053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            type = NJ_HINSI_KIGOU_F;
981053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
982053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        default:
983053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    		/* If a invalid parameter was specified, return an error code */
984053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        	return NJ_SET_ERR_VAL(NJ_FUNC_JNI_GET_LEFT_PART_OF_SPEECH_SPECIFIED_TYPE, NJ_ERR_INVALID_PARAM);
985053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
986053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return ( jint )njd_r_get_hinsi( work->dicSet.rHandle[ NJ_MODE_TYPE_HENKAN ], type );
987053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
988053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
989053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* If the internal work area was already released, return an error code */
990053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return NJ_SET_ERR_VAL(NJ_FUNC_JNI_GET_LEFT_PART_OF_SPEECH_SPECIFIED_TYPE, NJ_ERR_NOT_ALLOCATED);
991053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
992053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
993053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
994053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
995053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    getRightPartOfSpeechSpecifiedType
996053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (JI)I
997053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
998053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT jint JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_getRightPartOfSpeechSpecifiedType
999053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jclass obj, jlong wnnWork, jint type)
1000053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
1001053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK*	work;
1002053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1003053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
1004053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
1005053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        switch( type ) {
1006053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_POS_TYPE_V1:
1007053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    		/* No part of speech is defined at this type */
1008053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return 0;
1009053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_POS_TYPE_V2:
1010053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    		/* No part of speech is defined at this type */
1011053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return 0;
1012053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_POS_TYPE_V3:
1013053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    		/* No part of speech is defined at this type */
1014053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return 0;
1015053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_POS_TYPE_BUNTOU:
1016053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            type = NJ_HINSI_BUNTOU_B;
1017053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
1018053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_POS_TYPE_TANKANJI:
1019053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            type = NJ_HINSI_TANKANJI_B;
1020053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
1021053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_POS_TYPE_SUUJI:
1022053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            type = NJ_HINSI_SUUJI_B;
1023053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
1024053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_POS_TYPE_MEISI:
1025053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            type = NJ_HINSI_MEISI_B;
1026053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
1027053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_POS_TYPE_JINMEI:
1028053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            type = NJ_HINSI_JINMEI_B;
1029053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
1030053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_POS_TYPE_CHIMEI:
1031053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            type = NJ_HINSI_CHIMEI_B;
1032053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
1033053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_POS_TYPE_KIGOU:
1034053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            type = NJ_HINSI_KIGOU_B;
1035053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
1036053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        default:
1037053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    		/* If a invalid parameter was specified, return an error code */
1038053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        	return NJ_SET_ERR_VAL(NJ_FUNC_JNI_GET_LEFT_PART_OF_SPEECH_SPECIFIED_TYPE, NJ_ERR_INVALID_PARAM);
1039053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1040053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return ( jint )njd_r_get_hinsi( work->dicSet.rHandle[ NJ_MODE_TYPE_HENKAN ], type );
1041053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1042053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1043053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* If the internal work area was already released, return an error code */
1044053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return NJ_SET_ERR_VAL(NJ_FUNC_JNI_GET_RIGHT_PART_OF_SPEECH_SPECIFIED_TYPE, NJ_ERR_NOT_ALLOCATED);
1045053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
1046053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1047053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
1048053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
1049053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    getConnectArray
1050053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (JI)[B
1051053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
1052053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT jbyteArray JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_getConnectArray
1053053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jclass obj, jlong wnnWork, jint leftPartOfSpeech)
1054053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
1055053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK*	work;
1056053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1057053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
1058053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
1059053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        NJ_UINT16   lcount = 0, rcount = 0;
1060053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        jbyteArray  resultJ;
1061053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1062053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if( work->dicSet.rHandle[ NJ_MODE_TYPE_HENKAN ] == NULL ) {
1063053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* No rule dictionary was set */
1064053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        	return NULL;
1065053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1066053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1067053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        njd_r_get_count( work->dicSet.rHandle[ NJ_MODE_TYPE_HENKAN ], &lcount, &rcount );
1068053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1069053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if( leftPartOfSpeech < 0 || leftPartOfSpeech > lcount ) {
1070053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* Invalid POS is specified */
1071053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return NULL;
1072053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1073053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1074053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* 1-origin */
1075053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        resultJ = ( *env )->NewByteArray( env, rcount + 1 );
1076053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1077053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if( resultJ != NULL ) {
1078053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            jbyte   *result;
1079053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            result = ( *env )->GetByteArrayElements( env, resultJ, NULL );
1080053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1081053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if( result != NULL ) {
1082053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                int         i;
1083053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                NJ_UINT8*   connect;
1084053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1085053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if( leftPartOfSpeech == 0 ) {
1086053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    for( i = 0 ; i < rcount + 1 ; i++ ) {
1087053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        result[ i ] = 0;
1088053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    }
1089053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                } else {
1090053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    /* Get the packed connect array */
1091053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    njd_r_get_connect( work->dicSet.rHandle[ NJ_MODE_TYPE_HENKAN ], leftPartOfSpeech, NJ_RULE_TYPE_FTOB, &connect );
1092053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1093053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    /* Extract connect array from bit field */
1094053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    result[ 0 ] = 0;
1095053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1096053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    for( i = 0 ; i < rcount ; i++ ) {
1097053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        if( connect[ i / 8 ] & (0x80 >> (i % 8))) {
1098053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                            result[ i + 1 ] = 1;
1099053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        } else {
1100053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                            result[ i + 1 ] = 0;
1101053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        }
1102053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    }
1103053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
1104053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1105053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                ( *env )->ReleaseByteArrayElements( env, resultJ, result, 0 );
1106053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                return resultJ;
1107053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1108053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1109053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		/* If allocating the return area failed, return an error code */
1110053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project       	return NULL;
1111053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1112053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* If the internal work area was already released, return an error code */
1113053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    return NULL;
1114053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
1115053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1116053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
1117053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
1118053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    getNumberOfLeftPOS
1119053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (J)I
1120053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
1121053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT jint JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_getNumberOfLeftPOS
1122053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jclass obj, jlong wnnWork)
1123053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
1124053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK*	work;
1125053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1126053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
1127053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
1128053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if( work->dicSet.rHandle[ NJ_MODE_TYPE_HENKAN ] == NULL ) {
1129053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* No rule dictionary was set */
1130053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return 0;
1131053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
1132053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            NJ_UINT16   lcount = 0, rcount = 0;
1133053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1134053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            njd_r_get_count( work->dicSet.rHandle[ NJ_MODE_TYPE_HENKAN ], &lcount, &rcount );
1135053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return lcount;
1136053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1137053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1138053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1139053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* If the internal work area was already released, return an error code */
1140053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return NJ_SET_ERR_VAL(NJ_FUNC_JNI_GET_NUMBER_OF_LEFT_POS, NJ_ERR_NOT_ALLOCATED);
1141053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
1142053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1143053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
1144053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
1145053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    getNumberOfRightPOS
1146053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (J)I
1147053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
1148053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT jint JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_getNumberOfRightPOS
1149053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jclass obj, jlong wnnWork)
1150053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
1151053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK*	work;
1152053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1153053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
1154053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
1155053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if( work->dicSet.rHandle[ NJ_MODE_TYPE_HENKAN ] == NULL ) {
1156053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* No rule dictionary was set */
1157053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return 0;
1158053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
1159053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            NJ_UINT16   lcount = 0, rcount = 0;
1160053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1161053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            njd_r_get_count( work->dicSet.rHandle[ NJ_MODE_TYPE_HENKAN ], &lcount, &rcount );
1162053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return rcount;
1163053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1164053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1165053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1166053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* If the internal work area was already released, return an error code */
1167053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return NJ_SET_ERR_VAL(NJ_FUNC_JNI_GET_NUMBER_OF_RIGHT_POS, NJ_ERR_NOT_ALLOCATED);
1168053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
1169053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1170053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
1171053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
1172053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    getApproxPattern
1173053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (JLjava/lang/String;)[Ljava/lang/String;
1174053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
1175053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT jobjectArray JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_getApproxPattern
1176053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jclass obj, jlong wnnWork, jstring srcJ)
1177053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
1178053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK*	work;
1179053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1180053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( srcJ == NULL || ( *env )->GetStringLength( env, srcJ ) == 0 || ( *env )->GetStringLength( env, srcJ ) > 1 ) {
1181053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		/* If a invalid parameter was specified, return an error code */
1182053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		return NULL;
1183053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	}
1184053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1185053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
1186053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
1187053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        int         i, outIndex, outCount;
1188053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        NJ_CHAR     from[ NJ_MAX_CHARSET_FROM_LEN + NJ_TERM_LEN ];
1189053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1190053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if( convertStringToNjChar( env, from, srcJ, NJ_MAX_CHARSET_FROM_LEN ) >= 0 ) {
1191053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            outCount = 0;
1192053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            for( i = 0 ; i < work->approxSet.charset_count ; i++ ) {
1193053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if( nj_strcmp( from, work->approxSet.from[ i ] ) == 0 ) {
1194053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    outCount++;
1195053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
1196053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1197053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1198053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            jclass strC = ( *env )->FindClass( env, "java/lang/String" );
1199053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1200053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if( strC != NULL ) {
1201053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                jobjectArray retJ = ( *env )->NewObjectArray( env, outCount, strC, NULL );
1202053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1203053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if( retJ != NULL ) {
1204053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    for( i = outIndex = 0 ; i < work->approxSet.charset_count ; i++ ) {
1205053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        if( nj_strcmp( from, work->approxSet.from[ i ] ) == 0 ) {
1206053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                            jstring dstJ;
1207053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1208053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                            if( convertNjCharToString( env, &dstJ, work->approxSet.to[ i ], NJ_MAX_CHARSET_TO_LEN ) < 0 ) {
1209053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                return NULL;
1210053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                            }
1211053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1212053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                            ( *env )->SetObjectArrayElement( env, retJ, outIndex++, dstJ );
1213053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        }
1214053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1215053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    }
1216053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    return retJ;
1217053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
1218053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1219053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1220053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* If the internal error occured, return an error code */
1221053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NULL;
1222053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1223053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1224053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* If the internal work area was already released, return an error code */
1225053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return NULL;
1226053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
1227053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1228053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
1229053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
1230053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    createBindArray
1231053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (JLjava/lang/String;II)[Ljava/lang/String;
1232053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
1233053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT jobjectArray JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_createBindArray
1234053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jclass obj, jlong wnnWork, jstring keyStringJ, jint maxBindsOfQuery, jint maxPatternOfApprox)
1235053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
1236053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	NJ_JNIWORK*	work;
1237053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1238053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( keyStringJ == NULL ) {
1239053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		/* If a invalid parameter was specified, return an error code */
1240053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		return NULL;
1241053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	}
1242053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1243053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
1244053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
1245053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* create the string array for result */
1246053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        jclass strC = ( *env )->FindClass( env, "java/lang/String" );
1247053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1248053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if( strC != NULL ) {
1249053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            jobjectArray retJ = ( *env )->NewObjectArray( env, maxBindsOfQuery * (maxPatternOfApprox+1), strC, NULL );
1250053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1251053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if( retJ != NULL ) {
1252053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                NJ_CHAR     keyString[ NJ_MAX_LEN + NJ_TERM_LEN ];
1253053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1254053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if( convertStringToNjChar( env, keyString, keyStringJ, NJ_MAX_LEN ) >= 0 ) {
1255053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    int         queryLen, outIndex, approxPattern;
1256053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    NJ_CHAR     baseStr[ NJ_MAX_LEN + NJ_MAX_CHARSET_TO_LEN + NJ_TERM_LEN ];
1257053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1258053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    outIndex = 0;
1259053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    baseStr[ 0 ] = NJ_CHAR_NUL;
1260053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1261053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    for( queryLen = 0 ; queryLen < maxBindsOfQuery && keyString[ queryLen ] != NJ_CHAR_NUL ; queryLen++ ) {
1262053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        int i;
1263053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1264053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        for( i = -1, approxPattern = -1 ; i < work->approxSet.charset_count ; i++ ) {
1265053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                            if( i == -1 || keyString[ queryLen ] == work->approxSet.from[ i ][ 0 ] ) {
1266053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                int tailOffset = 0;
1267053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1268053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                if( i == -1 ) {
1269053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                    if(   *( ( NJ_UINT8* )( &keyString[ queryLen ] ) + 0 ) == 0x00 &&
1270053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                        ( *( ( NJ_UINT8* )( &keyString[ queryLen ] ) + 1 ) == 0x25 ||       /* '%' */
1271053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                          *( ( NJ_UINT8* )( &keyString[ queryLen ] ) + 1 ) == 0x5c ||       /* '\' */
1272053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                          *( ( NJ_UINT8* )( &keyString[ queryLen ] ) + 1 ) == 0x5f ) ) {    /* '_' */
1273053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                        *( ( NJ_UINT8* )( &baseStr[ queryLen + 0 ] ) + 0 ) = 0x00;
1274053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                        *( ( NJ_UINT8* )( &baseStr[ queryLen + 0 ] ) + 1 ) = 0x5c;  /* '\' */
1275053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                                           baseStr[ queryLen + 1 ] = keyString[ queryLen ];
1276053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                        tailOffset = 2;
1277053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                    } else {
1278053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                        baseStr[ queryLen + 0 ] = keyString[ queryLen ];
1279053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                        tailOffset = 1;
1280053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                    }
1281053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                } else {
1282053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                    nj_strcpy( &baseStr[ queryLen ], work->approxSet.to[ i ] );
1283053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                    tailOffset = nj_strlen( work->approxSet.to[ i ] );
1284053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                }
1285053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1286053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                *( ( NJ_UINT8* )( &baseStr[ queryLen + tailOffset     ] ) + 0 ) = 0x00;
1287053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                *( ( NJ_UINT8* )( &baseStr[ queryLen + tailOffset     ] ) + 1 ) = 0x25;  /* '%' */
1288053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                                   baseStr[ queryLen + tailOffset + 1 ]         = NJ_CHAR_NUL;
1289053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1290053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                jstring dstJ;
1291053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                if( convertNjCharToString( env, &dstJ, baseStr, NJ_MAX_LEN ) < 0 ) {
1292053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                    return NULL;
1293053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                }
1294053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1295053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                ( *env )->SetObjectArrayElement( env, retJ, outIndex++, dstJ );
1296053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                approxPattern++;
1297053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                            }
1298053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        }
1299053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        for( ; approxPattern < maxPatternOfApprox ; approxPattern++ ) {
1300053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                            jstring dstJ = ( *env )->NewStringUTF( env, "" );
1301053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                            if( dstJ == NULL ) {
1302053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                return NULL;
1303053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                            }
1304053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                            ( *env )->SetObjectArrayElement( env, retJ, outIndex++, dstJ );
1305053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        }
1306053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1307053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        *( ( NJ_UINT8* )( &baseStr[ queryLen     ] ) + 0 ) = 0x00;
1308053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        *( ( NJ_UINT8* )( &baseStr[ queryLen     ] ) + 1 ) = 0x5f;  /* '_' */
1309053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                           baseStr[ queryLen + 1 ]         = NJ_CHAR_NUL;
1310053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    }
1311053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1312053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    for( ; queryLen < maxBindsOfQuery ; queryLen++ ) {
1313053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        for( approxPattern = -1 ; approxPattern < maxPatternOfApprox ; approxPattern++ ) {
1314053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                            jstring dstJ = ( *env )->NewStringUTF( env, "%" );
1315053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                            if( dstJ == NULL ) {
1316053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                return NULL;
1317053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                            }
1318053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                            ( *env )->SetObjectArrayElement( env, retJ, outIndex++, dstJ );
1319053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        }
1320053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    }
1321053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1322053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    return retJ;
1323053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
1324053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1325053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1326053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* If the internal error occured, return an error code */
1327053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NULL;
1328053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1329053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1330053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	/* If the internal work area was already released, return an error code */
1331053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return NULL;
1332053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
1333053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1334053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
1335053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Class:     jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni
1336053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Method:    createQueryStringBase
1337053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Signature: (JIILjava/lang/String;)Ljava/lang/String;
1338053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
1339053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectJNIEXPORT jstring JNICALL Java_jp_co_omronsoft_openwnn_OpenWnnDictionaryImplJni_createQueryStringBase
1340053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project  (JNIEnv *env, jclass obj, jlong wnnWork, jint maxBindsOfQuery, jint maxPatternOfApprox, jstring keyColumnNameJ)
1341053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
1342053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_JNIWORK*	work;
1343053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    jstring retJ = NULL;
1344053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1345053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( keyColumnNameJ == NULL ) {
1346053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		/* If a invalid parameter was specified, return an error code */
1347053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project		return NULL;
1348053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	}
1349053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1350053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	work = *( NJ_JNIWORK** )&wnnWork;
1351053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	if( work != NULL ) {
1352053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    	const unsigned char* keyName = ( const unsigned char* )( ( *env )->GetStringUTFChars( env, keyColumnNameJ, NULL ) );
1353053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1354053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if( keyName != NULL ) {
1355053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            int keyLength = strlen( ( char* )keyName );
1356053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1357053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            char *dst = ( char* )malloc( maxBindsOfQuery * ( ( 1 + keyLength + 18 + 1 + 5 ) +
1358053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                                             ( ( 4 + keyLength + 18 ) * maxPatternOfApprox ) +
1359053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                                             1 ) );
1360053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if( dst != NULL ) {
1361053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                int queryLen, dstPtr;
1362053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1363053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            	for( queryLen = dstPtr = 0 ; queryLen < maxBindsOfQuery ; queryLen++ ) {
1364053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    int approxPattern;
1365053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1366053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    strcpy( &dst[ dstPtr                 ], "(" );
1367053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    strcpy( &dst[ dstPtr + 1             ], ( char* )keyName );
1368053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    strcpy( &dst[ dstPtr + 1 + keyLength ], " like ? escape '\x5c'" );
1369053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    dstPtr += 1 + keyLength + 18;
1370053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1371053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            		for( approxPattern = 0 ; approxPattern < maxPatternOfApprox ; approxPattern++ ) {
1372053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        strcpy( &dst[ dstPtr                 ], " or " );
1373053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        strcpy( &dst[ dstPtr + 4             ], ( char* )keyName );
1374053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        strcpy( &dst[ dstPtr + 4 + keyLength ], " like ? escape '\x5c'" );
1375053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        dstPtr += 4 + keyLength + 18;
1376053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            		}
1377053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    strcpy( &dst[ dstPtr ], ")" );
1378053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    dstPtr++;
1379053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1380053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            		if( queryLen != maxBindsOfQuery-1 ) {
1381053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        strcpy( &dst[ dstPtr ], " and " );
1382053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        dstPtr += 5;
1383053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            		}
1384053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            	}
1385053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1386053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                dst[ dstPtr ] = '\0';
1387053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                retJ = ( *env )->NewStringUTF( env, dst );
1388053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1389053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                free( dst );
1390053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1391053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1392053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project       		( *env )->ReleaseStringUTFChars( env, keyColumnNameJ, ( const char* )keyName );
1393053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1394053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1395053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project	return retJ;
1396053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
1397053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1398