Author: iratqq
Date: Sat Feb 23 04:20:29 2008
New Revision: 5239
Modified:
trunk/scm/sj3.scm
trunk/uim/sj3.c
Log:
* uim/sj3.c (uim_sj3_getnthdouon):
- New function.
* scm/sj3.scm
(sj3-make-map-from-kana-string):
- New function.
(sj3-get-nth-douon):
- Remove.
(sj3-lib-get-nth-candidate):
- Use sj3-lib-get-nth-douon.
Modified: trunk/scm/sj3.scm
==============================================================================
--- trunk/scm/sj3.scm (original)
+++ trunk/scm/sj3.scm Sat Feb 23 04:20:29 2008
@@ -49,23 +49,24 @@
(sj3-lib-open "" sj3-user)))
(define (sj3-lib-alloc-context)
#t)
+(define (sj3-make-map-from-kana-string str)
+ (map (lambda (x) (apply string-append x))
+ (apply zip (map (lambda (c)
+ (ja-find-kana-list-from-rule ja-rk-rule-basic c))
+ (reverse (string-to-list str))))))
(define (sj3-getdouon str)
- (define (make-map-from-kana-string str)
- (map (lambda (x) (apply string-append x))
- (apply zip (map (lambda (c)
- (ja-find-kana-list-from-rule
ja-rk-rule-basic c))
- (reverse (string-to-list str))))))
(let ((douon (sj3-lib-getdouon str))
- (kana-list (make-map-from-kana-string str)))
+ (kana-list (sj3-make-map-from-kana-string str)))
(append douon
(map list kana-list))))
-(define (sj3-get-nth-douon str nth)
- (let ((douon (sj3-getdouon str)))
- (car (list-ref douon nth))))
(define (sj3-get-nth-yomi sc-ctx nth)
(car (list-ref sc-ctx nth)))
(define (sj3-lib-get-nth-candidate sc-ctx seg nth)
- (sj3-get-nth-douon (sj3-get-nth-yomi sc-ctx seg) nth))
+ (let* ((yomi (sj3-get-nth-yomi sc-ctx seg))
+ (cnt (sj3-lib-douoncnt yomi)))
+ (if (< nth cnt)
+ (sj3-lib-get-nth-douon yomi nth)
+ (list-ref (sj3-make-map-from-kana-string yomi) (- nth cnt)))))
(define (sj3-lib-release-context sc)
#t)
(define (sj3-lib-get-unconv-candidate sc-ctx seg-idx)
Modified: trunk/uim/sj3.c
==============================================================================
--- trunk/uim/sj3.c (original)
+++ trunk/uim/sj3.c Sat Feb 23 04:20:29 2008
@@ -292,6 +292,27 @@
}
static uim_lisp
+uim_sj3_getnthdouon(uim_lisp yomi_, uim_lisp nth_)
+{
+ const char *yomi = REFER_C_STR(yomi_);
+ int douon_cnt;
+ struct douon douon[BUFSIZ];
+ int nth = C_INT(nth_);
+ uim_lisp ret_ = uim_scm_f();
+
+ if (255 < strlen(yomi))
+ return uim_sj3_make_error("*SJ3-YOMI-STRING-TOO-LONG*", N_("Yomi
string is too long."));
+
+ douon_cnt = sj3_getdouon_euc((unsigned char *)yomi, douon);
+ if (douon_cnt == -1)
+ return uim_sj3_server_down_error();
+
+ if (douon_cnt < nth)
+ return uim_scm_f();
+ return MAKE_STR((char *)douon[nth].ddata);
+}
+
+static uim_lisp
uim_sj3_gakusyuu(uim_lisp dcid_)
{
struct studyrec *dcid = C_PTR(dcid_);
@@ -492,6 +513,7 @@
uim_scm_init_proc1("sj3-lib-getkan", uim_sj3_getkan);
uim_scm_init_proc1("sj3-lib-douoncnt", uim_sj3_douoncnt);
uim_scm_init_proc1("sj3-lib-getdouon", uim_sj3_getdouon);
+ uim_scm_init_proc2("sj3-lib-get-nth-douon", uim_sj3_getnthdouon);
uim_scm_init_proc1("sj3-lib-gakusyuu", uim_sj3_gakusyuu);
uim_scm_init_proc3("sj3-lib-gakusyuu2", uim_sj3_gakusyuu2);
uim_scm_init_proc3("sj3-lib-touroku", uim_sj3_touroku);