65
68
static struct canna_context *context_array = NULL;
67
71
static int context_array_len;
68
73
static int rk_initialized = -1;
69
74
static char *cannaserver = NULL;
71
static struct canna_api {
73
/* struct rkfuncs Rk; */
74
int (*RkInitialize)(char *);
75
int (*RkCreateContext)(void);
76
int (*RkCloseContext)(int);
77
int (*RkBgnBun)(int, char *, int, int);
78
int (*RkEndBun)(int, int);
79
int (*RkFinalize)(void);
80
int (*RkGetDicList)(int, char *, int);
81
int (*RkMountDic)(int, char *, int);
83
int (*RkXfer)(int, int);
84
int (*RkEnlarge)(int);
85
int (*RkShorten)(int);
86
int (*RkGetStat)(int, RkStat *);
87
int (*RkGoTo)(int, int);
88
int (*RkGetKanji)(int, char *, int);
89
int (*RkGetKanjiList)(int, char *, int);
90
int (*RkSetServerName)(char *);
96
api.lib = dlopen(LIBCANNA_SO, RTLD_NOW);
100
*(int **)(&api.RkInitialize) = dlsym(api.lib, "RkInitialize");
101
*(int **)(&api.RkFinalize) = dlsym(api.lib, "RkFinalize");
102
*(int **)(&api.RkGetDicList) = dlsym(api.lib, "RkGetDicList");
103
*(int **)(&api.RkMountDic) = dlsym(api.lib, "RkMountDic");
104
*(int **)(&api.RkCreateContext) = dlsym(api.lib, "RkCreateContext");
105
*(int **)(&api.RkCloseContext) = dlsym(api.lib, "RkCloseContext");
106
*(int **)(&api.RkBgnBun) = dlsym(api.lib, "RkBgnBun");
107
*(int **)(&api.RkEndBun) = dlsym(api.lib, "RkEndBun");
108
*(int **)(&api.RkGoTo) = dlsym(api.lib, "RkGoTo");
109
*(int **)(&api.RkGetKanji) = dlsym(api.lib, "RkGetKanji");
110
*(int **)(&api.RkGetKanjiList) = dlsym(api.lib, "RkGetKanjiList");
111
*(int **)(&api.RkGetStat) = dlsym(api.lib, "RkGetStat");
112
*(int **)(&api.RkXfer) = dlsym(api.lib, "RkXfer");
113
*(int **)(&api.RkNfer) = dlsym(api.lib, "RkXfer");
114
*(int **)(&api.RkEnlarge) = dlsym(api.lib, "RkEnlarge");
115
*(int **)(&api.RkShorten) = dlsym(api.lib, "RkShorten");
116
if(api.RkInitialize && api.RkFinalize && api.RkGetDicList &&
117
api.RkMountDic && api.RkCreateContext && api.RkCloseContext &&
118
api.RkBgnBun && api.RkEndBun && api.RkGoTo && api.RkGetKanji &&
119
api.RkGetKanjiList && api.RkGetStat && api.RkXfer && api.RkNfer &&
120
api.RkEnlarge && api.RkShorten)
128
76
static struct canna_context *
129
77
get_canna_context(int id)
126
if (rk_initialized == -1) {
127
if (RkInitialize(cannaserver) == -1) {
128
fprintf(stderr, "%s\n", strerror(errno));
184
138
create_context() {
188
142
struct canna_context *cc = context_array;
190
if(rk_initialized == -1) {
191
if(api.RkInitialize(cannaserver) == -1) {
144
if (rk_initialized == -1) {
145
if (RkInitialize(cannaserver) == -1) {
192
146
fprintf(stderr, "%s\n", strerror(errno));
195
149
rk_initialized = 1;
198
for(i = 0; i < MAX_CONTEXT; i++) {
199
if(cc->rk_context_id == -1) {
152
for (i = 0; i < MAX_CONTEXT; i++) {
153
if (cc->rk_context_id == -1) {
201
cc->rk_context_id = api.RkCreateContext();
202
dic_num = api.RkGetDicList(cc->rk_context_id,
155
cc->rk_context_id = RkCreateContext();
156
dic_num = RkGetDicList(cc->rk_context_id,
203
157
cc->diclist, BUFSIZE);
206
} else if(dic_num == -1) {
159
return uim_scm_make_int(i);
160
} else if (dic_num == -1) {
207
161
/* invalid context number */
211
165
/* buf[] = "dicname1\0dicname2\0dicname3\0...dicname_n\0\0" */
212
166
buf = cc->diclist;
213
for(j = 0; j < dic_num; j++) {
214
api.RkMountDic(cc->rk_context_id, buf, 0);
167
for (j = 0; j < dic_num; j++) {
168
RkMountDic(cc->rk_context_id, buf, 0);
215
169
buflen = strlen(buf) + 1;
173
return uim_scm_make_int(i);
227
release_context(LISP id_)
181
release_context(uim_lisp id_)
229
183
int id = uim_scm_c_int(id_);
230
184
struct canna_context *cc = get_canna_context(id);
235
if(cc->rk_context_id == -1)
238
if(api.RkCloseContext(cc->rk_context_id) != -1) {
189
if (cc->rk_context_id == -1)
192
if (RkCloseContext(cc->rk_context_id) != -1) {
239
193
cc->rk_context_id = -1;
284
238
char buf[BUFSIZE];
285
239
struct canna_context *cc = get_canna_context(id);
290
if(cc->rk_context_id == -1)
244
if (cc->rk_context_id == -1)
293
247
tmp_segment_num = segment_num;
294
if(segment_num >= cc->segment_num)
248
if (segment_num >= cc->segment_num)
295
249
tmp_segment_num = 0;
297
for(i = 0; i <= tmp_segment_num; i++) {
251
for (i = 0; i <= tmp_segment_num; i++) {
299
api.RkGoTo(cc->rk_context_id, i);
300
len = api.RkGetKanji(cc->rk_context_id, buf, BUFSIZE);
301
/* printf("segment: %d, buf: %s\n", i, buf); */
253
RkGoTo(cc->rk_context_id, i);
254
len = RkGetKanji(cc->rk_context_id, (unsigned char *)buf, BUFSIZE);
255
#ifdef UIM_CANNA_DEBUG
256
printf("segment: %d, buf: %s\n", i, buf);
304
api.RkGoTo(cc->rk_context_id, tmp_segment_num);
260
RkGoTo(cc->rk_context_id, tmp_segment_num);
305
261
_update_status(id);
309
begin_conversion(LISP id_, LISP str_)
265
begin_conversion(uim_lisp id_, uim_lisp str_)
311
267
int id = uim_scm_c_int(id_);
313
269
int len, segment_num, mode;
314
270
struct canna_context *cc = get_canna_context(id);
319
if(cc->rk_context_id == -1)
275
if (cc->rk_context_id == -1)
322
278
mode = cc->rk_mode;
323
279
str = uim_scm_c_str(str_);
324
280
len = strlen(str);
326
segment_num = api.RkBgnBun(cc->rk_context_id, str, len, mode);
282
segment_num = RkBgnBun(cc->rk_context_id, str, len, mode);
328
if(segment_num == -1) {
284
if (segment_num == -1) {
329
285
/* failed to conversion */
335
291
cc->segment_num = segment_num;
336
292
_update_segment(id, 0);
341
return intcons(cc->segment_num);
297
return uim_scm_make_int(cc->segment_num);
345
get_nth_candidate(LISP id_, LISP seg_, LISP nth_)
301
get_nth_candidate(uim_lisp id_, uim_lisp seg_, uim_lisp nth_)
347
303
int id = uim_scm_c_int(id_);
348
304
int seg = uim_scm_c_int(seg_);
351
307
char buf[BUFSIZE];
357
313
_update_segment(id, seg);
358
if(nth > cc->max_current_cand_num)
314
if (nth > cc->max_current_cand_num)
361
api.RkXfer(cc->rk_context_id, nth);
362
len = api.RkGetKanji(cc->rk_context_id, buf, BUFSIZE);
364
/* printf("nth: %d, kanji: %s\n", nth, buf); */
365
return strcons(len, buf);
317
RkXfer(cc->rk_context_id, nth);
318
len = RkGetKanji(cc->rk_context_id, (unsigned char *)buf, BUFSIZE);
319
#ifdef UIM_CANNA_DEBUG
320
printf("nth: %d, kanji: %s\n", nth, buf);
322
return uim_scm_make_str(buf);
369
get_nr_segments(LISP id_)
326
get_nr_segments(uim_lisp id_)
371
328
int id = uim_scm_c_int(id_);
373
330
struct canna_context *cc = get_canna_context(id);
378
if(cc->rk_context_id == -1)
381
return intcons(cc->segment_num);
335
if (cc->rk_context_id == -1)
338
return uim_scm_make_int(cc->segment_num);
385
get_nr_candidate(LISP id_, LISP nth_)
342
get_nr_candidate(uim_lisp id_, uim_lisp nth_)
387
344
int id = uim_scm_c_int(id_);
388
345
int nth = uim_scm_c_int(nth_);
390
347
struct canna_context *cc = get_canna_context(id);
395
if(cc->rk_context_id == -1)
398
api.RkGoTo(cc->rk_context_id, nth);
400
if(api.RkGetStat(cc->rk_context_id, &stat) == 0)
401
return intcons(stat.maxcand);
352
if (cc->rk_context_id == -1)
355
RkGoTo(cc->rk_context_id, nth);
357
if (RkGetStat(cc->rk_context_id, &stat) == 0)
358
return uim_scm_make_int(stat.maxcand);
407
resize_segment(LISP id_, LISP s_, LISP nth_)
364
resize_segment(uim_lisp id_, uim_lisp s_, uim_lisp nth_)
409
366
int id = uim_scm_c_int(id_);
410
367
int s = uim_scm_c_int(s_);
411
368
int nth = uim_scm_c_int(nth_);
412
369
struct canna_context *cc = get_canna_context(id);
417
if(cc->rk_context_id == -1)
420
api.RkGoTo(cc->rk_context_id, s);
421
api.RkNfer(cc->rk_context_id);
424
cc->segment_num = api.RkEnlarge(cc->rk_context_id);
374
if (cc->rk_context_id == -1)
377
RkGoTo(cc->rk_context_id, s);
378
RkNfer(cc->rk_context_id);
381
cc->segment_num = RkEnlarge(cc->rk_context_id);
426
cc->segment_num = api.RkShorten(cc->rk_context_id);
383
cc->segment_num = RkShorten(cc->rk_context_id);
428
385
_update_segment(id, cc->current_segment_num);
434
commit_segment(LISP id_, LISP s_, LISP nth_)
391
commit_segment(uim_lisp id_, uim_lisp s_, uim_lisp nth_)
436
393
int id = uim_scm_c_int(id_);
437
395
int s = uim_scm_c_int(s_);
438
396
int nth = uim_scm_c_int(nth_);
439
398
struct canna_context *cc = get_canna_context(id);
444
if(cc->rk_context_id == -1)
447
api.RkEndBun(cc->rk_context_id, 1);
403
if (cc->rk_context_id == -1)
406
RkEndBun(cc->rk_context_id, 1);
448
407
cc->segment_num = -1;
452
reset_conversion(LISP id_)
413
reset_conversion(uim_lisp id_)
454
415
int id = uim_scm_c_int(id_);
456
417
_reset_conversion(id);
462
true_sym = siod_true_value();
463
init_subr_1("canna-lib-init", init_canna_lib);
465
init_subr_0("canna-lib-alloc-context", create_context);
466
init_subr_1("canna-lib-release-context", release_context);
467
init_subr_3("canna-lib-get-nth-candidate", get_nth_candidate);
468
init_subr_1("canna-lib-get-nr-segments",get_nr_segments);
469
init_subr_2("canna-lib-get-nr-candidates", get_nr_candidate);
470
init_subr_3("canna-lib-resize-segment", resize_segment);
471
init_subr_2("canna-lib-begin-conversion", begin_conversion);
472
init_subr_3("canna-lib-commit-segment", commit_segment);
473
init_subr_1("canna-lib-reset-conversion", reset_conversion);
479
if(cannaserver != NULL) {
423
uim_plugin_instance_init(void)
425
uim_scm_init_subr_1("canna-lib-init", init_canna_lib);
427
uim_scm_init_subr_0("canna-lib-alloc-context", create_context);
428
uim_scm_init_subr_1("canna-lib-release-context", release_context);
429
uim_scm_init_subr_3("canna-lib-get-nth-candidate", get_nth_candidate);
430
uim_scm_init_subr_1("canna-lib-get-nr-segments",get_nr_segments);
431
uim_scm_init_subr_2("canna-lib-get-nr-candidates", get_nr_candidate);
432
uim_scm_init_subr_3("canna-lib-resize-segment", resize_segment);
433
uim_scm_init_subr_2("canna-lib-begin-conversion", begin_conversion);
434
uim_scm_init_subr_3("canna-lib-commit-segment", commit_segment);
435
uim_scm_init_subr_1("canna-lib-reset-conversion", reset_conversion);
439
uim_plugin_instance_quit(void)
441
if (cannaserver != NULL) {
480
442
free(cannaserver);
481
443
cannaserver = NULL;
484
if(api.RkFinalize && rk_initialized == 1) {
446
if (/* RkFinalize && */ rk_initialized == 1) {
486
448
rk_initialized = -1;
491
memset(&api, 0, sizeof(struct canna_api));
494
if(context_array != NULL) {
451
if (context_array != NULL) {
495
452
free(context_array);
496
453
context_array = NULL;