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);

Reply via email to