comparison lib/wnnlib.c @ 0:92745d501b9a

initial import from kinput2-v3.1
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Mon, 08 Mar 2010 04:44:30 +0900
parents
children 983aff0dcf18
comparison
equal deleted inserted replaced
-1:000000000000 0:92745d501b9a
1 /*
2 * wnnlib -- $B$+$J4A;zJQ49MQ%i%$%V%i%j(B (jllib $BBP1~HG(B)
3 *
4 * $B$3$N%i%$%V%i%j$O!"(Bkinput V2 $B$KIUB0$7$F$$$?!"(BSRA $B$N@PA>:,$5$s$N(B
5 * jclib 5.2 $B$r%Y!<%9$K:n@.$7$^$7$?!#(B
6 *
7 * $B?9It(B $B1QG7(B
8 */
9
10 /*
11 * Copyright (c) 1989 Software Research Associates, Inc.
12 * Copyright (c) 1998 MORIBE, Hideyuki
13 *
14 * Permission to use, copy, modify, and distribute this software and its
15 * documentation for any purpose and without fee is hereby granted, provided
16 * that the above copyright notice appear in all copies and that both that
17 * copyright notice and this permission notice appear in supporting
18 * documentation, and that the name of Software Research Associates not be
19 * used in advertising or publicity pertaining to distribution of the
20 * software without specific, written prior permission. Software Research
21 * Associates makes no representations about the suitability of this software
22 * for any purpose. It is provided "as is" without express or implied
23 * warranty.
24 *
25 * Author: Makoto Ishisone, Software Research Associates, Inc., Japan
26 * ishisone@sra.co.jp
27 * MORIBE, Hideyuki
28 */
29
30 /*
31 * Portability issue:
32 *
33 * + define SYSV, SVR4 or USG if you don't have bcopy() or bzero().
34 *
35 * if you define USG (which should be defined if your OS is based
36 * on System V Rel 2) or SYSV (in case of System V Rel 3),
37 * memchr() is used for bzero(), and my own version of bcopy()
38 * is used in order to handle overlapping regions.
39 *
40 * if you define SVR4 (yes, System V Rel4), memmove() is used for
41 * bcopy(), and memchr() is used for bzero().
42 *
43 * + wnnlib assumes bcopy() can handle overlapping data blocks.
44 * If your bcopy() can't, you should define OVERLAP_BCOPY,
45 * which force to use my own bcopy() rather than the one
46 * in libc.a.
47 */
48
49 /*
50 * $B35MW(B
51 *
52 * wnnlib $B$O(B Wnn6 $B$K$bBP1~$7$?(B kinput $B$N(B CcWnn $B%*%V%8%'%/%H8~$1$N9b%l%Y%k(B
53 * $B$+$J4A;zJQ49%i%$%V%i%j$G$"$k!#(B
54 *
55 * $B=>Mh$N(B Kinput $B$K$*$$$F$O!"(BWnn $B$H$N%$%s%?%U%'!<%9$O!"(Bjslib $B%Y!<%9$N(B
56 * jilib $B$H(B jclib $B$G$"$C$?!#$H$3$m$,!"(BWnn6 $B$G3HD%$5$l$?5!G=$r;HMQ$7$?$/$F(B
57 * $B$b!"(Bjslib $B%l%Y%k$N;EMM$,$[$H$s$IH=$i$J$+$C$?!#$3$N$?$a!"(Bmule $B$N(B egg $B%$(B
58 * $B%s%?%U%'!<%9$G;HMQ$7$F$$$k(B jllib $B$rMQ$$$F!"=>Mh$N(B jilib $B$H(B jclib $B$N%$(B
59 * $B%s%?%U%'!<%9$r$G$-$k$@$1JQ99$7$J$$$h$&$K$7$F!"?7$?$K(B wnnlib $B$H$7$F=q$-(B
60 * $B49$($?!#(B
61 *
62 * wnnlib $B$O!"(BWnn6 $B$@$1$G$J$/!"$=$l0JA0$N(B Wnn4 $B$K$bBP1~$7$F$$$k$O$:$G(B
63 * $B$"$k$,%F%9%H$O$7$F$$$J$$!#(B
64 *
65 * wnnlib $B$O!"=>Mh$N(B jclib $B$HF1MM$K!"$+$J%P%C%U%!$HI=<(%P%C%U%!$H$$$&#2$D(B
66 * $B$N%P%C%U%!$r;}$D!#$+$J%P%C%U%!$K$OFI$_J8;zNs$,F~$j!"I=<(%P%C%U%!$K$OJQ(B
67 * $B497k2L(B($BI=<(J8;zNs(B)$B$,F~$k!#$+$J%P%C%U%!$H8@$&8F$SJ}$O$"$^$j@53N$G$O$J$$!#(B
68 * Wnn Version 4 $B0J9_$G$O4A;z$+$JJQ49$b$G$-$k$+$i$G$"$k!#(B
69 *
70 * $B%I%C%H$H%+%l%s%HJ8@a$H$$$&35G0$r;}$A!"J8;z$NA^F~(B / $B:o=|$O%I%C%H$N0LCV$K(B
71 * $BBP$7$F9T$J$o$l!"JQ49$=$NB>$NA`:n$O%+%l%s%HJ8@a$KBP$7$F9T$J$o$l$k!#(B
72 * Wnn Version 4 $B0J9_$G$OBgJ8@a$H>.J8@a$H$$$&#2<oN`$NJ8@a$N35G0$,$"$k$,!"(B
73 * $B$=$l$KBP1~$7$F(B wnnlib $B$bEvA3$3$N#2<oN`$r07$&$3$H$,$G$-$k!#(B
74 *
75 * $B$3$N%i%$%V%i%j$O<!$N$h$&$J5!G=$rDs6!$9$k!#(B
76 * $B!&$+$J%P%C%U%!$X$NJ8;z$NA^F~(B / $B:o=|(B
77 * $B!&$+$J4A;zJQ49(B / $B:FJQ49(B / $BL5JQ49(B
78 * $B!&$R$i$,$J"N%+%?%+%JJQ49(B
79 * $B!&3NDj(B
80 * $B!&J8@a$N3HBg(B / $B=L>.(B
81 * $B!&%+%l%s%HJ8@a(B / $B%I%C%H$N0\F0(B
82 * $B!&<!8uJd(B/$BA08uJdCV$-49$((B
83 * $B!&8uJd<h$j=P$7(B / $BA*Br(B
84 * $B!&%P%C%U%!$N%/%j%"(B
85 *
86 * $BJ8;z%3!<%I$H$7$F$O(B Wnn $B$HF1$8$/(B EUC $BFbIt%3!<%I(B (process code) $B$r;HMQ$9$k!#(B
87 */
88
89 /*
90 * Wnn Version 6 (FI Wnn) $BBP1~$K$"$?$C$F(B
91 *
92 * $B=>Mh$N(B Kinput2 $B$G$O!"(BWnn $B$H$N%$%s%?!<%U%'!<%9$O!"(Bjslib $B$r%Y!<%9$K(B
93 * $B$7$?(Bjilib $B$H(B jclib $B$G!"$b$H$b$H(B Wnn Version 3 $B$N(B libjd $B$N>e$K:n$i(B
94 * $B$l$?%i%$%V%i%j$G$"$k!#(B
95 *
96 * Wnn Version 6 $BBP1~$K$"$?$C$F!"(Bjslib $B%l%Y%k$NDI2C5!G=$d>\:Y%$%s%?%U%'!<(B
97 * $B%9$,H=$i$J$+$C$?$?$a!"(Bjslib $B$NBe$o$j$K(B mule $B$N(B egg $B%$%s%?%U%'!<%9$G;H(B
98 * $BMQ$5$l$F$$$k(B jllib $B$r%Y!<%9$K$7$F!"(Bjilib $B$H(B jclib $B$r?7$?$K(B wnnlib $B$H$7(B
99 * $B$F=q$-49$($k$3$H$K$7$?!#=q$-49$($O!"0J2<$NJ}?K$G9T$C$?!#(B
100 *
101 * 1. $B%G!<%?9=B$!"%$%s%?%U%'!<%9(B ($B4X?tL>$dJQ?tL>$b(B) $B$r$J$k$Y$/=>Mh$N(B
102 * jclib$B$HF1$8$K$9$k!#(B
103 *
104 * 2. $B$+$J%P%C%U%!$HI=<(%P%C%U%!$NFs$D$NJ8;z%P%C%U%!$r;}$A!"(B
105 * $B$+$J%P%C%U%!$K$OFI$_!"I=<(%P%C%U%!$K$OJQ497k2L$,F~$k$H$+(B
106 * $BMM!9$JA`:n$O%+%l%s%HJ8@a$H8F$P$l$kJ8@a$KBP$7$F9T$J$o$l$k$H$+$$$C$?(B
107 * $B4pK\E*$J%3%s%;%W%H$OJQ$($J$$!#(B
108 *
109 * 3. $B=>Mh$N%i%$%V%i%j$r;H$C$?%"%W%j%1!<%7%g%s$,?7$7$$%i%$%V%i%j$K(B
110 * $B0\9T$7$d$9$$$h$&$K!"4X?t%$%s%?!<%U%'%$%9$b$G$-$k$@$1;w$?$b$N$K$9$k!#(B
111 *
112 * 4. 1,2,3 $B$NJ}?K$r$G$-$k$@$1<i$j$D$D!"(BWnn6 $B$GF3F~$5$l$?<!$N$h$&$J(B
113 * $B5!G=$r%5%]!<%H$9$k!#(B
114 * $B!&(BFI $BJQ49(B/$B3X=,(B
115 * $B!&L5JQ493X=,(B
116 *
117 * 5. 1 $B$+$i(B 4 $B$^$G$NJ}?K$K=>$$$D$D!"%/%$%C%/!&%O%C%/$9$k!#(B
118 */
119
120 /*
121 * $B%a%b(B ($BCm(B: $B:G=i$NItJ,$O!"@PA>:,$5$s$N(B jclib $B:n@.%a%b(B)
122 *
123 * ver 0.0 89/07/21
124 * $B$H$j$"$($::n$j$O$8$a$k(B
125 * ver 0.1 89/08/02
126 * $BH>J,$/$i$$$+$1$?(B
127 * $B<!8uJd4XO"$,$^$@$G$-$F$$$J$$(B
128 * ver 0.2 89/08/04
129 * jcInsertChar() / jcDeleteChar() $B$r:n@.(B
130 * ver 0.3 89/08/07
131 * $B0l1~$G$-$?(B
132 * $B$^$@$$$/$D$+5?LdE@$,$"$k$1$l$I(B
133 * ver 0.4 89/08/08
134 * $B:#;H$C$?$h%S%C%H$N07$$$r;D$7$F!"$[$\$G$-$?$N$G$O$J$$$+$H(B
135 * $B;W$o$l$k(B
136 * $B:Y$+$$%P%0$r$+$J$j=$@5(B
137 * ver 0.5 89/08/09
138 * $BN)LZ$5$s(B@KABA $B$K<ALd$7$?=j!":#;H$C$?$h%S%C%H$rMn$9$N$b(B
139 * $B%/%i%$%"%s%HB&$N@UG$$G$"$k$3$H$,$o$+$k(B
140 * $B$3$l$X$NBP1~(B
141 * $B$D$$$G$K%G!<%?9=B$$N@bL@$rDI2C(B
142 * $B%U%!%$%k$N%5%$%:$,(B 80KB $B$r1[$($F$7$^$C$?(B
143 * $B%3%a%s%H$r$H$l$P$+$J$j>.$5$/$J$k$s$@$1$I(B
144 * ver 0.6 89/08/22
145 * jcDeleteChar() $B$rA4LLE*$K=q$-D>$9(B
146 * $B$3$l$G0l1~@5$7$/F0:n$9$k$h$&$K$J$C$?(B
147 * jcInsertChar() $B$G:G8e$N(B clauseInfo $B$N@_Dj$,4V0c$C$F$$$?$N$G(B
148 * $B$=$l$r=$@5(B
149 * jcPrintDetail() $B$K4JC1$J(B clauseInfo $B%G!<%?$N(B consistency check $B$r(B
150 * $BF~$l$k(B
151 * ver 0.7 89/08/26
152 * jcExpand() $B$N%P%0=$@5(B
153 * $B>.J8@a$NC1J8@aJQ49$r>/$7=$@5(B
154 * ver 0.8 89/08/30
155 * changecinfo() $B$G(B conv $B%U%i%0$r%;%C%H$9$k$N$rK:$l$F$$$?(B
156 * moveKBuf()/moveDBuf()/moveCInfo() $B$r>/$7=$@5(B
157 * SYSV $B$,(B define $B$5$l$F$$$l$P(B bcopy()/bzero() $B$NBe$o$j$K(B
158 * memcpy()/memset() $B$r;H$&$h$&$K=$@5(B
159 * ver 0.9 89/09/22
160 * setLCandData() $B$G<!8uJd%P%C%U%!$N8uJd?t$K%+%l%s%HBgJ8@a$N(B
161 * $BJ,$r2C$($k$N$rK:$l$F$$$?(B
162 * ver 0.10 89/10/16
163 * wnn-4.0.1 $B$G(B commonheader.h -> commonhd.h $B$K$J$C$?$N$G(B
164 * $B$=$l$N=$@5(B
165 * ver 0.11 89/10/18
166 * USG $B$,(B define $B$5$l$F$$$F$b(B memcpy()/memset() $B$r;H$&$h$&$K=$@5(B
167 * ver 0.12 89/10/19
168 * resizeBuffer() $B$G%I%C%H$N:F@_Dj$rK:$l$F$$$k$H$$$&=EBg$J%P%0$r=$@5(B
169 * ver 4.0 89/10/27
170 * $B%P!<%8%g%sHV9f$r=$@5$7$F(B 4.0 $B$K$9$k!#(B
171 * --- kinput $B$r(B R4 $B$K(B contribute ---
172 * ver 4.1 90/06/04
173 * $B%/%i%$%"%s%HB&$K$"$k<-=q!&IQEY%U%!%$%k$N%;!<%V$,$G$-$J$$$H$$$&(B
174 * $B=EBg$J%P%0$r=$@5(B
175 * ver 4.2 90/06/15
176 * $B<-=q$,EPO?2DG=$+$I$&$+$NH=Dj$,4V0c$C$F$$$F!"5UJQ492DG=<-=q$N(B
177 * $B%;!<%V$,$G$-$J$$$H$$$&$^$?$^$?=EBg$J%P%0$r=$@5(B
178 * $B:#$N$H$3$m(B kinput/wterm $B$H$bC18lEPO?5!G=$,$D$$$F$J$$$N$G(B
179 * $B<B32$O$J$+$C$?$,(B
180 * ver 4.3 91/08/15
181 * $BJ8;z%G!<%?7?$H$7$F(B wchar_t $B$G$O$J$/!"(Bwchar $B$r;H$&$h$&$K$9$k(B
182 * $B:G=*E*$K$O(B Wnn $B$N<!4|%P!<%8%g%s$N7?$K9g$o$;$k$D$b$j(B
183 * ver 4.4 91/09/18
184 * SYSV $B$^$?$O(B USG $B$,Dj5A$5$l$F$$$k>l9g$K$O<+F0E*$K(B OVERLAP_BCOPY
185 * $B$bDj5A$9$k$h$&$K$7$?(B
186 * SVR4 $B$,Dj5A$5$l$F$$$k>l9g$K$O(B bcopy $B$NBe$o$j$K(B memmove() $B$r;HMQ(B
187 * $B$9$k$h$&$K$7$?(B
188 * ver 4.5 91/09/23
189 * DEBUG $B$r(B DEBUG_JCLIB $B$KJQ99(B
190 * ver 5.0 91/10/01
191 * kinput2 $B%j%j!<%98~$1$K%P!<%8%g%sHV9f$r=$@5$7$F(B 5.0 $B$K$9$k!#(B
192 * --- kinput2 $B$r(B R5 $B$K(B contribute ---
193 * ver 5.1 92/02/07
194 * John Yates $B$5$s(B (yates@bldrsoft.com) $B$+$i(B getLCandDataLen() $B$G(B
195 * $BJ8;z?t$r?t$(4V0c$($F$$$?$N$r;XE&$5$l$?$N$G$=$l$N=$@5(B
196 * ver 5.2 92/12/24
197 * jcInsertChar() $B$G%G!<%?$N=i4|2=$r$7$F$$$J$+$C$?ItJ,$,$"$C$?(B
198 * $B$N$G=$@5(B ($BCM$,BeF~$5$l$k$^$G;HMQ$5$l$J$$$N$G%P%0$G$O$J$$$N$@$,(B
199 * $B$A$g$C$H5$;}$A$o$k$$$N$G(B)
200 *
201 * --- wnnlib $B:n@.%a%b(B ---
202 *
203 * ver 0.1 98/03/12
204 * $B$H$j$"$($:!"(Bjllib $B%$%s%?%U%'!<%9$K=q49$($r;O$a$k!#(B
205 * ver 0.2 98/03/16
206 * $B$^$@$$$/$D$+7|G0;v9`$O$"$k$b$N$N!"4pK\E*$J=q49$($,=*$o$C$?$N$G!"(B
207 * $B%G%P%C%0$r;O$a$k!#$=$l$J$j$K!"F0$$$F$$$kMM;R!#(B
208 * ver 0.3 98/03/18
209 * $B$$$/$+%P%0$,8+$D$+$C$?(B ($B%3%"!&%@%s%W$7$?(B) $B$N$G!"$=$l$i$r=$@5!#(B
210 * $B$^$@!"(BWnn6 $B$N5!G=$,M-8z$K$J$C$F$$$k$+NI$/$o$+$i$J$$!#(B
211 * ver 0.4 98/07/01
212 * $B0JA0$+$i5$$K$J$C$F$$$?%k!<%W$K4Y$k8=>]$N860x$,$d$C$HH=$C$?!#(B
213 * $B860x$O!"JQ49$N(B cancel $B$N1dD9$G8F$P$l$k(B expandOrShrink $B$NCf$G!"(B
214 * $BL5JQ49;XDj$N;~$G$b(B ltop ($BBgJ8@a(B) $B%U%i%C%0$r%j%;%C%H$7$F$$$J$+$C(B
215 * $B$?$?$a$G!"$=$l$r=$@5$7$?!#(B
216 * ver 0.5 98/10/15
217 * $B:G8e$N=$@5$+$iLs(B 3 $B%v7n4V!";HMQ$7$?$,FC$KLdBj$,$J$+$C$?$N$G!"(B
218 * kinput2-fix5 $B$N(B alpha $BHG$,$G$?$N$r5!2q$K!"(Bkinput2 $B%a!<%j%s%0!&(B
219 * $B%j%9%H$XEj9F!#(B
220 * ver 0.6 98/12/03
221 * $B@PA>:,$5$s$h$j!"J8@a3HBg$N$G$N%P%0$NJs9p$,$"$C$?$N$G(B (kinput2
222 * $B%a!<%j%s%0!&%j%9%H(B 2106 $B!A(B 2118 $B;2>H(B)$B!"$=$l$r=$@5!#(B
223 *
224 * --- kinput2-fix-alpha2 $B$K<h$j9~$^$l$k(B ---
225 *
226 * ver 0.7 98/12/23
227 * doKantanSCConvert() $B$G>.J8@a$H$7$FC1J8@aJQ49$7$J$1$l$P$$$1$J$$(B
228 * $B$H$3$m$r!"BgJ8@a$H$7$FJQ49$7$F$$$?%P%0$r=$@5!#(B
229 *
230 * ver 0.8 99/01/06
231 * kinput2-fix5-alpha4 $B$,$G$?$N$r5!2q$K!"%I%C%H0J9_$r:o=|$9$kJT=8(B
232 * $B5!G=(B (kill-line) $B$r<B8=$9$k(B jcKillLine() $B$rDI2C$9$k(B ($B<B$O!"(Bwnnlib
233 * $B:n@.;~$+$i<B8=$7$h$&$H;W$C$F$$$F!"%@%_!<4X?t$@$1$O(B wnnlib $B$KB8(B
234 * $B:_$7$F$$$?(B)$B!#$3$l$N%G%P%C%0Cf$K!">e$N(B ver 0.4 $B$G=$@5$7$?$O$:$N(B
235 * $B%P%0$,:F8=!#(B
236 *
237 * ver 0.9 99/01/18
238 * $B$d$O$j!"(Bcancel $B$N1dD9$N=hM}$,$&$^$/$J$$$3$H$,H=L@!#$D$^$j!"J8(B
239 * $B@a3HBg$K$h$k(B cancel $B=hM}$G$O!"J8@a>pJs$,(B CcWnn $B$,4|BT$9$k$b$N(B
240 * $B$H0[$C$F$$$k$?$a(B ($B$3$l$,!"(Bjclib $B$H(B wnnlib $B$N0c$$(B)$B!"8mF0:n$r$7(B
241 * $B$?!#$3$N$?$a!"FHN)$7$?(B cancel $B=hM}$r(B jcCancel() $B%U%!%s%/%7%g%s(B
242 * $B$H$7$F<B8=$9$k$3$H$K$7$?!#$G$b!"(Bexpand-noconv $B$d(B shrink-noconv
243 * $B$J$I$G$OF1MM$NLdBj$,B8:_$9$k$N$G!"(Bjclib $B$H$N8_49$rJ]$D0UL#$G!"(B
244 * expandOrShrink $B$NCf$GFCJL07$$$9$k$3$H$K$7$?(B ($B;H$&?M$O!"$$$J$$(B
245 * $B$H;W$&$,!#(Bdoc/ccdef $B;2>H(B)$B!#(B
246 * $B$^$?!"(BgetHint() $B$H(B forceStudy() $B$N=hM}$r<c43$N8+D>$7$?!#(B
247 *
248 * ver 0.99 99/03/05
249 * $BA02s$N(B getHint() $B$N=hM}$NI{:nMQ$G!"(BsetCandiate() $B$G<!8uJd<h$j=P$7(B
250 * $B8e$NBgJ8@a>pJs$NJQ99J}K!$K$"$C$?@x:_%P%0$r=$@5!#(B
251 *
252 * ver ?.?? 99/03/29 ishisone
253 * $BA0$K<h$j=P$7$?8uJd0lMw$r:FMxMQ$9$k$+$I$&$+$NH=Dj$rJQ99!#(B
254 * $B:FMxMQ$N>r7o$r$-$D$/$9$k!#$^$?(B Wnn4 $B$N(B jl $B%i%$%V%i%j$NIT6q9g(B
255 * ($B;EMM$+$b(B) $B$N2sHr:v$NAH$_9~$_!#(B
256 *
257 * ver ?.?? 99/04/12 ishisone
258 * jcOpen() $B$K2C$($F(B jcOpen2() $B$r<BAu!#$3$l$O(B Wnn4 $B$H(B Wnn6 $B$=$l$>$l$N(B
259 * $B=i4|2=%U%!%$%k$r;XDj$9$k$3$H$,$G$-!"<B:]$K@\B3$7$?%5!<%P$N(B
260 * $B%P!<%8%g%s$r%A%'%C%/$7$F!"$I$A$i$r;HMQ$9$k$+7h$a$k$H$$$&$b$N!#(B
261 *
262 * ver ?.?? 99/05/07 ishisone
263 * $B!VL5NLBg?t!WLdBj$N2sHr:v$N<BAu!#$H$O$$$C$F$bJ8@a?-=L$N:]$N(B
264 * $BA0J8@a$H$N@\B3$r$d$a$k$@$1!#!VL5NLBg?t!WLdBj$K$D$$$F$O(B
265 * expandOrShrink() $B$N%3%a%s%H;2>H!#(B
266 *
267 * ver ?.?? 99/05/25 ishisone
268 * config.h $B$r%$%s%/%k!<%I$7$J$$$h$&$K$9$k!#I,MW$J$N$O(B LIBDIR $B$@$1(B
269 * $B$@$7!"(Bconfig.h $B$N(B LIBDIR $B$NCM$,@5$7$$$H$$$&J]>Z$b$J$$$?$a!#(B
270 * /usr/local/lib/wnn $B$K7h$a$&$A!#(B($B%*!<%P!<%i%$%I$9$k$3$H$O$G$-$k(B)
271 *
272 * --- kinput2 version 3.0 $B%j%j!<%9(B ---
273 *
274 * ver ?.?? 01/01/10
275 * Wnn7 $BBP1~!#$H$O$$$C$F$b:G>.8B$NBP1~$G!"(BWnn7 $B$N?7$7$$5!G=$r(B
276 * $BMxMQ$G$-$k$o$1$G$O$J$$!#(B
277 * $B;HMQ$5$l$F$$$J$$JQ?t$r:o=|!#(B
278 */
279
280 /*
281 * $B%U%!%s%/%7%g%s(B
282 *
283 * struct wnn_buf jcOpen(char *servername, char *envname,
284 * char *rcfilename, int override,
285 * void (*errmsgfunc)(), int (*confirmfunc)(),
286 * int timeout)
287 * jl_open $B$"$k$$$O(B jl_open_lang $B$KBP1~$7$?(B wnnlib $B$N%$%s%?%U%'!<(B
288 * $B%9$G!"$3$N4X?t$NCf$G<B:]$K(B jl_open $B$"$k$$$O(B jl_open_lang $B$r8F(B
289 * $B$S=P$9!#(Boverride $B$,(B True $B$N>l9g!"4{$K4D6-$,%5!<%PB&$K$"$C$F$b!"(B
290 * $B4D6-$r:F=i4|2=$9$k!#(B
291 *
292 * int jcClose(struct wnn_buf *wnnbuf)
293 * jl_close $B$r8F$S=P$7!"(BjcOpen $B$G3MF@$7$?(B wnnbuf $B$N2rJ|$H%5!<%P$H(B
294 * $B$N@\B3$r@Z$k!#(B
295 *
296 * int jcIsConnect(struct wnn_buf *wnnbuf)
297 * $B%5!<%P$H$N@\B3>uBV$r(B jl_isconnect $B$GD4$Y$k!#(Bwnnbuf $B$,(B NULL$B!"(B
298 * $B4D6-$,:n@.$5$l$F$$$J$$!"$"$k$$$O%5!<%P$H@\B3$5$l$F$$$J$$>l9g$K$O(B 0$B!#(B
299 * wnnbuf $B$,%5!<%P$H@\B3$5$l$F$$$l$P!"(B1 $B$rJV$9!#(B
300 *
301 * jcConvBuf *jcCreateBuffer(struct wnn_env *env, int nclause, int buffersize)
302 * $B;XDj$5$l$?4D6-$r;H$C$FJQ49$N%P%C%U%!$r:n@.$9$k!#%P%C%U%!$O(B
303 * $BJ#?t:n$k$3$H$,$G$-$k!#0l$D$N%P%C%U%!$G$OF1;~$KJ#?t$NJ8$r(B
304 * $BJQ49$9$k$3$H$O$G$-$J$$$N$G!"J#?t$NJ8$rJB9T$7$FJQ49$7$?$$>l9g$K$O(B
305 * $B4v$D$+$N%P%C%U%!$rMQ0U$7$J$/$F$O$J$i$J$$!#(B
306 * $B4D6-$N@_Dj$^$G$rM=$a$d$C$F$*$/I,MW$,$"$k!#$D$^$j%5!<%P$H$N@\B3!"(B
307 * $B4D6-$N@8@.!"<-=q$N@_Dj$J$I$O(B jcOpen $B$G9T$C$F$*$/I,MW$,$"$k!#(B
308 * $B0z?t$N(B nclause $B$H(B buffersize $B$G!"$=$l$>$l=i4|2=;~$K%"%m%1!<%H$9$k(B
309 * $BJ8@a>pJs$*$h$S$+$J(B/$BI=<(%P%C%U%!$NBg$-$5$,;XDj$G$-$k!#(B
310 * $B$?$@$7$3$l$i$O!"%5%$%:$,B-$j$J$/$J$l$PI,MW$K1~$8$F<+F0E*$K(B
311 * $BA}$d$5$l$k$?$a!"$3$3$K;XDj$7$?0J>e$N?t$NJ8@a$d!"J8;zNs$,JQ49$G$-$J$$(B
312 * $B$o$1$G$O$J$$!#$=$l$>$l(B 0 $B$^$?$OIi$NCM$r;XDj$9$k$H!"%G%U%)%k%H$N(B
313 * $B%5%$%:$G%"%m%1!<%H$5$l$k!#=>$C$FDL>o$O(B nclause/buffersize $B$H$b(B
314 * 0 $B$r;XDj$7$F$*$1$P$h$$!#(B
315 * $B%j%?!<%s%P%j%e!<$H$7$F%P%C%U%!$rJV$9!#%(%i!<$N;~$K$O(B NULL $B$,(B
316 * $BJV$5$l$k!#(B
317 *
318 * int jcDestroyBuffer(jcConvBuf *buf, int savedic)
319 * $B%P%C%U%!$N;HMQ$r=*N;$9$k!#4D6-$r>C$7$?$j!"%5!<%P$H$N@\B3$r@Z$C$?$j(B
320 * $B$9$k$3$H$O!"(BjcClose $B$G9T$&!#(B
321 * $B0z?t(B savedic $B$,(B 0 $B$G$J$1$l$P!"4D6-Cf$G;HMQ$5$l$F$$$kA4$F$N<-=q$r(B
322 * $B%;!<%V$9$k!#(B
323 *
324 * int jcClear(jcConvBuf *buf)
325 * $B%P%C%U%!$r%/%j%"$9$k!#?7$?$KJQ49$r;O$a$k:]$K$O:G=i$K$3$N(B
326 * $B%U%!%s%/%7%g%s$r8F$P$J$1$l$P$J$i$J$$!#(B
327 *
328 * int jcInsertChar(jcConvBuf *buf, int c)
329 * $B%I%C%H$K#1J8;zA^F~$9$k!#(B
330 * $B%+%l%s%HJ8@a$,4{$KJQ49$5$l$F$$$l$PL5JQ49$N>uBV$KLa$k!#(B
331 * $B%+%l%s%HJ8@a$OBgJ8@a$G$"$k!#(B
332 *
333 * int jcDeleteChar(jcConvBuf *buf, int prev)
334 * $B%I%C%H$NA0Kt$O8e$m$N#1J8;z$r:o=|$9$k!#(B
335 * $B%+%l%s%HJ8@a$,4{$KJQ49$5$l$F$$$l$PL5JQ49$N>uBV$KLa$k!#(B
336 * $B%+%l%s%HJ8@a$OBgJ8@a$G$"$k!#(B
337 *
338 * int jcConvert(jcConvBuf *buf, int small, int tan, int jump)
339 * $B%+%l%s%HJ8@a$+$i8e$m$rJQ49$9$k!#(B
340 * $B0z?t(B tan $B$,(B 0 $B$J$iO"J8@aJQ49!"$=$&$G$J$1$l$P%+%l%s%HJ8@a$r(B
341 * $BC1J8@aJQ49$7!"$=$N$"$H$rO"J8@aJQ49$9$k!#(B
342 * $B0z?t(B small $B$,(B 0 $B$G$J$1$l$P>.J8@a$,!"$=$&$G$J$1$l$PBgJ8@a$,(B
343 * $B%+%l%s%HJ8@a$H$7$F;H$o$l$k!#(B
344 * $B0z?t(B jump $B$G!"JQ498e$N%+%l%s%HJ8@a$N0LCV$,7h$^$k!#(Bjump $B$,(B
345 * 0 $B$J$i%+%l%s%HJ8@a$N0LCV$OJQ49$7$F$bJQ$o$i$J$$(B ($B$?$@$7(B
346 * $B%+%l%s%HJ8@a$H$7$FBgJ8@a$r;XDj$7$?>l9g!"JQ498e$N%+%l%s%H(B
347 * $B>.J8@a$O%+%l%s%HBgJ8@a$N:G=i$N>.J8@a$K$J$k(B) $B$,!"(B0 $B$G$J$1$l$P(B
348 * $B:G8e$NJ8@a$N<!(B ($B6uJ8@a(B) $B$K0\F0$9$k!#C`<!JQ49$7$F$$$/$h$&$J(B
349 * $B%"%W%j%1!<%7%g%s$G$O$3$l$r(B 1 $B$K$9$k$H$h$$$@$m$&!#(B
350 *
351 * int jcUnconvert(jcConvBuf *buf)
352 * $B%+%l%s%HBgJ8@a$rL5JQ49$N>uBV$KLa$9!#(B
353 * $B%+%l%s%HBgJ8@a$,$$$/$D$+$N>.J8@a$+$i$G$-$F$$$?>l9g!"$3$l$i$N(B
354 * $B>.J8@a$O$^$H$a$i$l!"0l$D$NL5JQ49>uBV$NJ8@a$K$J$k!#(B
355 * $B%+%l%s%H>.J8@a$rL5JQ49$KLa$95!G=$OMQ0U$7$J$$!#$J$<$+$H$$$&$H!"(B
356 * $BBgJ8@a$NCf$N(B 1 $B>.J8@a$N$_$,L5JQ49$K$J$C$F$7$^$&$H!"$=$NJ8@a$K(B
357 * $B4X$7$F(B jcMove() $B$G0\F0$r9T$J$C$?;~!"$I$&0\F0$9$l$P$h$$$N$+(B
358 * $B$h$/$o$+$i$J$$!"$D$^$j0\F0$N%;%^%s%F%#%/%9$,ITL@3N$K$J$C$F$7$^$&(B
359 * $B$+$i$G$"$k!#(B
360 *
361 * int jcKana(jcConvBuf *buf, int small, int kind)
362 * $B%+%l%s%HJ8@a$r$+$J$K$9$k!#(B
363 * $B0z?t(B kind $B$,!"(BJC_HIRAGANA $B$J$i$R$i$,$J!"(BJC_KATAKANA $B$J$i%+%?%+%J$K(B
364 * $BJQ$o$k!#J8@a$NJQ49>uBV$OJQ2=$7$J$$!#$D$^$jJQ49$5$l$F$$$l$P(B
365 * $BJQ49>uBV$N$^$^!"L$JQ49$N>uBV$J$iL$JQ49$N$^$^$G$"$k!#(B
366 * $B0z?t(B small $B$,(B 0 $B$G$J$1$l$P%+%l%s%H>.J8@a$,!"$=$&$G$J$1$l$P(B
367 * $B%+%l%s%HBgJ8@a$,JQ$o$k!#(B
368 * $B%+%l%s%HBgJ8@a$r$+$J$K$9$k>l9g!"$=$NCf$N>.J8@a$O0l$D$K$^$H$a$i$l$k!#(B
369 *
370 * int jcFix(jcConvBuf *buf)
371 * $B8=:_!"%P%C%U%!$K$O$$$C$F$$$kJQ49J8;zNs$r3NDj$5$;$k!#(B
372 *
373 * int jcFix1(jcConvBuf *buf)
374 * $B8=:_!"%P%C%U%!$K$O$$$C$F$$$kJQ49J8;zNs$N@hF,0lJ8;z$@$1$r3NDj$5$;$k!#(B
375 *
376 * int jcExpand(jcConvBuf *buf, int small, int convf)
377 * $B%+%l%s%HJ8@a$ND9$5$r#1J8;z?-$P$9!#0z?t(B convf $B$,(B 0 $B$G$J$1$l$P(B
378 * $B?-$P$7$?$"$H:FJQ49$9$k!#(B
379 * $B0z?t(B small $B$,(B 0 $B$G$J$1$l$P>.J8@a$,!"$=$&$G$J$1$l$PBgJ8@a$,(B
380 * $B%+%l%s%HJ8@a$H$7$F;H$o$l$k!#(B
381 *
382 * int jcShrink(jcConvBuf *buf, int small, int convf)
383 * $B%+%l%s%HJ8@a$ND9$5$r#1J8;z=L$a$k!#0z?t(B convf $B$,(B 0 $B$G$J$1$l$P(B
384 * $B=L$a$?$"$H:FJQ49$9$k!#(B
385 * $B0z?t(B small $B$,(B 0 $B$G$J$1$l$P>.J8@a$,!"$=$&$G$J$1$l$PBgJ8@a$,(B
386 * $B%+%l%s%HJ8@a$H$7$F;H$o$l$k!#(B
387 *
388 * int jcNext(jcConvBuf *buf, int small, int prev)
389 * $B%+%l%s%HJ8@a$r<!8uJdKt$OA08uJd$GCV$-49$($k!#(B
390 * $B0z?t(B small $B$,(B 0 $B$G$J$1$l$P>.J8@a$,!"$=$&$G$J$1$l$PBgJ8@a$,(B
391 * $B%+%l%s%HJ8@a$H$7$F;H$o$l$k!#(B
392 *
393 * int jcCandidateInfo(jcConvBuf *buf, int small, int *ncandp, int *curcandp)
394 * $B<!8uJd$N>pJs$rJV$9!#(B
395 * $B<!8uJd0lMw$r=P$9$?$a$K$O:G=i$K$3$N4X?t$r8F$V$H$h$$!#(B
396 *
397 * int jcGetCandidate(jcConvBuf *buf, int n, wchar *candstr)
398 * $B;XDj$5$l$?8uJdHV9f$NJ8;zNs$rJV$9!#%+%l%s%H8uJdHV9f$O$3$NHV9f$K(B
399 * $BJQ$o$k!#I=<(%P%C%U%!$OJQ2=$7$J$$!#(B
400 * $BBg@N$N(B wnnlib $B$O<!8uJd$,MQ0U$5$l$F$$$J$1$l$PMQ0U$7$?$,!"$3$N%P!<%8%g%s(B
401 * $B$G$O%(%i!<$K$J$k!#(BjcNext $B$d(B jcCandidateInfo $B$r@h$K8F$s$G$*$+$J$1$l$P(B
402 * $B$J$i$J$$!#(B
403 *
404 * int jcSelect(jcConvBuf *buf, int n)
405 * $B;XDj$5$l$?HV9f$N8uJd$GI=<(%P%C%U%!$rCV$-49$($k!#(B
406 * $B%+%l%s%H8uJdHV9f$O$3$NHV9f$KJQ$o$k!#(B
407 *
408 * int jcDotOffset(jcConvBuf *buf)
409 * $BBgJ8@a$N@hF,$+$i$N%I%C%H$N%*%U%;%C%H$rJV$9!#(B
410 * $BNc$($P(B 0 $B$J$i%I%C%H$,%+%l%s%HJ8@a$N@hF,$K$"$k$3$H$K$J$k!#(B
411 *
412 * int jcIsConverted(jcConvBuf *buf, int cl)
413 * $B;XDj$5$l$?J8@a$,JQ49$5$l$F$$$k$+$I$&$+$rJV$9(B
414 * 0 $B$J$iL5JQ49>uBV(B
415 * 1 $B$J$iJQ49>uBV(B
416 * -1 $B$J$i(B $B%(%i!<(B
417 *
418 * int jcMove(jcConvBuf *buf, int small, int dir)
419 * $B%I%C%H!&%+%l%s%HJ8@a$r0\F0$9$k!#(B
420 * $B%+%l%s%HJ8@a$,JQ49:Q$_$G$"$l$PJ8@a0\F0$7!"$=$&$G$J$1$l$P(B
421 * $B%I%C%H$N$_$,0\F0$9$k!#(B
422 * $BJ8@a0\F0;~$K!"0z?t(B small $B$,(B 0 $B$G$J$1$l$P>.J8@aC10L$G0\F0$7!"(B
423 * $B$=$&$G$J$1$l$PBgJ8@aC10L$K0\F0$9$k!#(B
424 *
425 * int jcTop(jcConvBuf *buf)
426 * $B%I%C%H!&%+%l%s%HJ8@a$rJ8$N@hF,$K0\F0$9$k!#%+%l%s%H>.J8@a!&(B
427 * $B%+%l%s%HBgJ8@a$H$b$K0\F0$9$k!#(B
428 *
429 * int jcBottom(jcConvBuf *buf)
430 * $B%I%C%H!&%+%l%s%HJ8@a$rJ8$N:G8e$K0\F0$9$k!#%+%l%s%H>.J8@a!&(B
431 * $B%+%l%s%HBgJ8@a$H$b$K0\F0$9$k!#(B
432 * $B$b$7!":G8e$NJ8@a$,L5JQ49>uBV$G$"$l$P%+%l%s%HJ8@a$O$=$NJ8@a$K$J$j!"(B
433 * $B%I%C%H$O$=$NJ8@a$N:G8e$KMh$k!#$=$&$G$J$1$l$P%+%l%s%HJ8@a$O(B
434 * $B:G8e$NJ8@a$N<!(B ($B$D$^$j6u$NJ8@a(B) $B$KMh$k!#(B
435 *
436 * int jcChangeClause(jcConvBuf *buf, wchar *str)
437 * $B%+%l%s%HBgJ8@a$r;XDj$5$l$?J8;zNs$GF~$l49$($k!#(B
438 * $BI=<(%P%C%U%!$@$1$G$O$J$/!"$+$J%P%C%U%!$NFbMF$b(B
439 * $BCV$-49$o$k!#J8@a$OL5JQ49>uBV$K$J$k!#(B
440 *
441 * int jcSaveDic(jcConvBuf *buf)
442 * $B;HMQCf$N4D6-$G;H$o$l$F$$$kA4$F$N<-=qJB$S$KIQEY%U%!%$%k$r(B
443 * $B%;!<%V$9$k!#(B
444 * $B$3$N%U%!%s%/%7%g%s$O>o$K(B 0 $B$rJV$9!#K\Ev$K%;!<%V$5$l$?$+$N(B
445 * $B%A%'%C%/$O$7$J$$!#(B
446 *
447 * int jcCancel(jcConvBuf *buf)
448 * $B8=:_F~NOCf$N$9$Y$F$NJ8;zNs$r!"JQ49:Q$_$N$b$N$r4^$a$F!"$9$Y$FL$(B
449 * $BJQ49>uBV$K$9$k!#%*%j%8%J%k$N(B CcWnn $B$H(B jclib $B%$%s%?%U%'!<%9$G$O!"(B
450 * $B@hF,J8@a$rA4F~NOJ8;zNs$ND9$5$^$G3HD%$9$k$3$H$G!"$3$N=hM}$r9T$J$C(B
451 * $B$F$$$?$,!"$3$N=hM}$H(B jllib $B$H$N%$%s%?%U%'!<%9$,$&$^$/9g$o$:!"(B
452 * wnnlib $B$G$OFHN)$7$?%U%!%s%/%7%g%s$H$7$?!#(B
453 *
454 * int jcKillLine(jcConvBuf *buf)
455 * $B8=:_$N%I%C%H$"$k$$$O%+%l%s%HJ8@a0J9_$r:o=|$9$k!#%I%C%H$,$"$kJ8(B
456 * $B@a$,4{$KJQ49$5$l$F$$$l$P!"$=$NJ8@a!"$D$^$j%+%l%s%HJ8@a$r4^$a$F(B
457 * $B:o=|$9$k!#%I%C%H$"$k$$$O%+%l%s%HJ8@a$,@hF,$G$"$l$P!"(BjcClear()
458 * $B$HF1$8F0:n$r$9$k!#$D$^$j!"(BjcClear() $B<+BN$OITMW$K$J$k$N$@$,!"5l(B
459 * $B%$%s%?%U%'!<%9$r9MN8$7$F!"(BjcClear() $B$O$=$N$^$^;D$9!#(B
460 * $B$J$*!":o=|8e$N%I%C%H$H%+%l%s%HJ8@a$O!"A4JQ49BP>]J8;zNs$NKvHx!"(B
461 * $B$"$k$$$O:G=*J8@a$NKvHx$K$"$k6uJ8@a$K$J$k!#(B
462 *
463 * $B$3$l$i$N%U%!%s%/%7%g%s$OFC$K=q$+$l$F$$$J$1$l$P@.8y$N>l9g$K$O(B 0,
464 * $B%(%i!<$N>l9g$K$O(B -1 $B$rJV$9!#(B
465 *
466 */
467
468 /*
469 * $B%0%m!<%P%kJQ?t(B
470 *
471 * wnnlib $B$G;H$o$l$k%0%m!<%P%kJQ?t$O(B jcErrno $B$?$@0l$D$G$"$k!#(B
472 *
473 * extern int jcErrno
474 * $B%(%i!<$N:]$K!"%(%i!<%3!<%I$,BeF~$5$l$k!#%(%i!<%3!<%I$O(B wnnlib.h $B$G(B
475 * $BDj5A$5$l$F$$$k!#(B
476 */
477
478 /*
479 * $B%G!<%?9=B$(B
480 *
481 * wnnlib $B$N;}$D%G!<%?$G!"%"%W%j%1!<%7%g%s$+$iD>@\%"%/%;%9$7$F$h$$$N$O(B
482 * $BJQ49%P%C%U%!(B jcConvBuf $B7?$N(B public member $B$H=q$+$l$?ItJ,$N$_$G$"$k!#(B
483 * $BD>@\%"%/%;%9$7$F$h$$$H$$$C$F$b!"CM$r;2>H$9$k$@$1$G!"CM$rJQ99$9$k$3$H$O(B
484 * $B5v$5$l$J$$!#%"%W%j%1!<%7%g%s$,>!<j$KCM$rJQ99$7$?>l9g$N(B wnnlib $B$NF0:n$O(B
485 * $BJ]>Z$5$l$J$$!#(B
486 *
487 * <$BJQ49%P%C%U%!(B>
488 *
489 * jcConvBuf $B7?$O(B wnnlib.h $B$G<!$N$h$&$KDj5A$5$l$F$$$k!#(B
490 *
491 * typedef struct {
492 * /-* public member *-/
493 * int nClause; $BJ8@a?t(B
494 * int curClause; $B%+%l%s%HJ8@aHV9f(B
495 * int curLCStart; $B%+%l%s%HBgJ8@a3+;OJ8@aHV9f(B
496 * int curLCEnd; $B%+%l%s%HBgJ8@a=*N;J8@aHV9f(B
497 * wchar *kanaBuf; $B$+$J%P%C%U%!$N@hF,(B
498 * wchar *kanaEnd; $B$+$J%P%C%U%!$NKvHx(B
499 * wchar *displayBuf; $BI=<(%P%C%U%!$N@hF,(B
500 * wchar *displayEnd; $BI=<(%P%C%U%!$NKvHx(B
501 * jcClause *clauseInfo; $BJ8@a>pJs(B
502 * struct wnn_env *env;
503 * /-* private member *-/
504 * [ $B>JN,(B ]
505 * } jcConvBuf;
506 *
507 * nClause $B$O8=:_$NJ8@a?t$rI=$9!#$3$l$O>.J8@a$N?t$G$"$k!#(B
508 * curClause $B$O%+%l%s%H>.J8@a$NHV9f$G$"$k!#(B
509 * curLCStart $B$H(B curLCEnd $B$O%+%l%s%HBgJ8@a$NHO0O$r<($9!#(BcurLCStart $B$+$i(B
510 * curLCEnd-1 $B$NHO0O$NJ8@a$,%+%l%s%HBgJ8@a$G$"$k!#$D$^$j!"(BcurLCEnd $B$O(B
511 * $B<!$NBgJ8@a$N@hF,$NHV9f$G$"$k!#(B
512 *
513 * kanaBuf $B$H(B displayBuf $B$,$+$J%P%C%U%!$HI=<(%P%C%U%!$G$"$k!#(B
514 * jcInsertChar() $BEy$r;H$C$FF~NO$5$l$?FI$_$O$+$J%P%C%U%!$HI=<(%P%C%U%!$KF~$k!#(B
515 * $B$3$l$rJQ49$9$k$H!"I=<(%P%C%U%!$NJ}$@$1$,4A;z$NJ8;zNs$K$J$k!#(B
516 * kanaEnd $B$*$h$S(B displayEnd $B$O$=$l$>$l$N%P%C%U%!$KF~$l$i$l$?J8;zNs$N:G8e(B
517 * $B$NJ8;z$N<!$r;X$7$F$$$k!#$+$J%P%C%U%!!&I=<(%P%C%U%!$O$I$A$i$b(B NULL $B%?!<%_(B
518 * $B%M!<%H$5$l$J$$!#(B
519 *
520 * clauseInfo $B$OJ8@a>pJs$NF~$C$?G[Ns$G$"$k!#$3$l$O$"$H$G@bL@$9$k!#(B
521 *
522 * env $B$O$3$NJQ49%P%C%U%!$N;HMQ$9$k4D6-$G$"$k!#(B
523 *
524 * <$BJ8@a>pJs(B>
525 *
526 * $B3FJ8@a$N>pJs$O(B clauseInfo $B$H$$$&L>A0$N(B jcClause $B7?$NG[Ns$KF~$C$F$$$k!#(B
527 * jcClause $B7?$O(B wnnlib.h $B$G<!$N$h$&$KDj5A$5$l$F$$$k!#(B
528 *
529 * typedef struct {
530 * wchar *kanap; $BFI$_J8;zNs(B ($B$+$J%P%C%U%!$NCf$r;X$9(B)
531 * wchar *dispp; $BI=<(J8;zNs(B ($BI=<(%P%C%U%!$NCf$r;X$9(B)
532 * char conv; $BJQ49:Q$_$+(B
533 * 0: $BL$JQ49(B 1: $BJQ49:Q(B -1: wnnlib $B$G5?;wJQ49(B
534 * char ltop; $BBgJ8@a$N@hF,$+(B?
535 * } jcClause;
536 *
537 * kanap $B$O!"$+$J%P%C%U%!>e$N!"$=$NJ8@a$NFI$_$N;O$^$j$N0LCV$r<($9%]%$%s%?(B
538 * $B$G$"$k!#$^$?!"(Bdispp $B$O!"I=<(%P%C%U%!(B $B>e$G!"$=$NJ8@a$N;O$^$j$N0LCV$r<($9!#(B
539 * $B=>$C$F!"(Bn $BHV$NJ8@a$O!"(B
540 * $B$h$_(B: clauseInfo[n].kanap $B$+$i(B clauseInfo[n+1].kanap $B$NA0$^$G(B
541 * $B4A;z(B: clauseInfo[n].dispp $B$+$i(B clauseInfo[n+1].dispp $B$NA0$^$G(B
542 * $B$H$J$k!#$3$N$h$&$K(B n $BHVL\$NJ8@a$NHO0O$r<($9$N$K(B n+1 $BHVL\$N(B clauseInfo $B$,(B
543 * $BI,MW$J$?$a!"(BclauseInfo $B$NG[Ns$NMWAG$O>o$K@hF,$+$iJ8@a?t(B+1$B8D$,M-8z$G$"$k!#(B
544 * $B$J$*!"@hF,J8@a$O(B 0 $BHVL\$+$i;O$^$k$b$N$H$9$k!#(B
545 *
546 * conv $B$O$=$NJ8@a$NJQ49>uBV$rI=$9!#(B0 $B$J$iL$JQ49>uBV!"(B1 $B$J$iJQ49>uBV!"(B
547 * -1 $B$J$i(B jcKana() $B$K$h$C$F5?;wJQ49$5$l$?$3$H$r<($9!#$3$l$O!"JQ49$N3X=,$H(B
548 * $BIQEY>pJs$N99?7$N$?$a$K;HMQ$9$k!#(B
549 *
550 * ltop $B$,(B 0 $B$G$J$1$l$P$=$NJ8@a$,BgJ8@a$N@hF,$G$"$k$3$H$r<($9!#(Bimabit $B$O(B
551 * $B$=$NJ8@a$N448l$N:#;H$C$?$h%S%C%H$,F~$C$F$$$k!#(B
552 *
553 * kanap, dispp $BEy$G!"(Bn $BHVL\$NJ8@a$NHO0O$r<($9$N$K(B n+1 $BHVL\$NJ8@a>pJs$,(B
554 * $BI,MW$J$?$a!"(BclauseInfo $B$NG[Ns$NMWAG$O>o$K@hF,$+$iJ8@a?t(B+1$B8D$,M-8z$G$"$k!#(B
555 * $BJ8@a?t(B+1 $B8DL\$NJ8@a>pJs(B (clauseInfo[nClause]) $B$O(B
556 * kanap, dispp: $B$=$l$>$l(B kanaEnd, displayEnd $B$KEy$7$$(B
557 * conv: 0 ($BL$JQ49>uBV(B)
558 * ltop: 1
559 * $B$G$"$k!#(B
560 *
561 * $BJ8@a>pJs$N(B kanap, dispp $B$rNc$r;H$C$F<($7$F$*$/!#(B
562 *
563 * $BNcJ8(B: $B$3$l$O%G!<%?9=B$$r<($9$?$a$NNcJ8$G$9(B ($BJ8@a?t(B 6)
564 *
565 * kanap: $B#0(B $B#1(B $B#2(B $B#3(B $B#4(B $B#5(B $B#6(B(=kanaEnd)
566 * $B"-(B $B"-(B $B"-(B $B"-(B $B"-(B $B"-(B $B"-(B
567 * kanaBuf: $B$3$l$O$G!<$?$3$&$>$&$r$7$a$9$?$a$N$l$$$V$s$G$9(B
568 *
569 * dispp: $B#0(B $B#1(B $B#2(B $B#3(B $B#4(B $B#5(B $B#6(B(=displayEnd)
570 * $B"-(B $B"-(B $B"-(B $B"-(B $B"-(B $B"-(B $B"-(B
571 * displayBuf: $B$3$l$O%G!<%?9=B$$r<($9$?$a$NNcJ8$G$9(B
572 */
573
574 #ifndef lint
575 static char *rcsid = "$Id: wnnlib.c,v 10.18 2002/01/10 15:51:47 ishisone Exp $";
576 #endif
577
578 #ifdef DEBUG_WNNLIB
579 #include <stdio.h>
580 #endif
581 #include "wnnlib.h"
582 #include "WStr.h"
583 #include <string.h>
584 #include <pwd.h>
585 #include <X11/Xos.h>
586
587 #ifndef LIBDIR
588 #define LIBDIR "/usr/local/lib/wnn"
589 #endif
590
591 #ifndef NULL
592 #define NULL 0
593 #endif
594
595 /*
596 * Wnn7 $B$G$OBgC@$K$b$$$/$D$+$N(B API $B4X?t$K%P%C%U%!%5%$%:$r;XDj$9$k(B
597 * $B0z?t$rDI2C$7$F$$$k$?$a!"%P!<%8%g%s$rD4$Y!"$=$l$K$h$C$F0z?t$r(B
598 * $BJQ99$7$J$1$l$P$J$i$J$$!#$H$j$"$($:K\%W%m%0%i%`$G$O(B Wnn7 $B$N0z?t$K9g$o$;$k!#(B
599 */
600
601 /* Wnn7 $B$+$I$&$+$NH=Dj(B */
602 #ifdef WNN_RENSOU
603 #define WNN7
604 #endif
605
606 #ifdef WNN7
607 #define ki2_jl_get_yomi jl_get_yomi
608 #define ki2_jl_get_kanji jl_get_kanji
609 #define ki2_jl_get_zenkouho_kanji jl_get_zenkouho_kanji
610 #define ki2_jl_fuzokugo_get jl_fuzokugo_get
611 #else
612 #define ki2_jl_get_yomi(a, b, c, d, sz) jl_get_yomi(a, b, c, d)
613 #define ki2_jl_get_kanji(a, b, c, d, sz) jl_get_kanji(a, b, c, d)
614 #define ki2_jl_get_zenkouho_kanji(a, b, c, sz) jl_get_zenkouho_kanji(a, b, c)
615 #define ki2_jl_fuzokugo_get(a, b, sz) jl_fuzokugo_get(a, b)
616 #endif /* WNN7 */
617
618 #ifdef DEBUG_WNNLIB
619 #ifdef __STDC__
620 static void showBuffers(jcConvBuf *, char *);
621 static void printBuffer(wchar *start, wchar *end);
622 #else
623 static void showBuffers();
624 static void printBuffer();
625 #endif
626 #define TRACE(f, m) fprintf(stderr, "%s: %s\n", (f), (m));
627 #else
628 #define TRACE(f, m)
629 #endif
630
631 #define CHECKFIXED(buf) \
632 { if ((buf)->fixed) { jcErrno = JE_ALREADYFIXED; return -1; } }
633 #define Free(p) {if (p) free((char *)(p));}
634 #define DotSet(buf) (buf)->dot = (buf)->clauseInfo[(buf)->curLCStart].kanap
635
636 #define KANABEG 0xa4a1 /* '$B$!(B' */
637 #define KANAEND 0xa4f3 /* '$B$s(B' */
638 #define KATAOFFSET 0x100 /* $B%+%?%+%J$H$R$i$,$J$N%3!<%I!&%*%U%;%C%H(B */
639
640 /* 1$BJ8@a$NFI$_!&4A;z$r<h$j=P$9%P%C%U%!$N%5%$%:(B */
641 #define CL_BUFSZ 512
642
643 /* $B%G%U%)%k%H$N%P%C%U%!%5%$%:(B */
644 #define DEF_BUFFERSIZE 100 /* 100 $BJ8;z(B */
645 #define DEF_CLAUSESIZE 20 /* 20 $BJ8@a(B */
646 #define DEF_CANDSIZE 1024 /* 1K $B%P%$%H(B */
647 #define DEF_RESETSIZE 10 /* 10 $BC18l(B */
648
649 /* buf->candKind $B$NCM(B */
650 #define CAND_SMALL 0 /* $B>.J8@a8uJd(B */
651 #define CAND_LARGE 1 /* $BBgJ8@a8uJd(B */
652
653 #define MAXFZK LENGTHBUNSETSU
654
655 #ifdef SVR4
656 #define bcopy(p, q, l) memmove(q, p, l)
657 #define bzero(p, l) memset(p, 0, l)
658 #else
659 #if defined(SYSV) || defined(USG)
660 #define OVERLAP_BCOPY
661 extern char *memset();
662 #define bzero(p, l) memset(p, 0, l)
663 #endif
664 #endif
665
666 #ifdef __STDC__
667 /* $B%U%!%s%/%7%g%s%W%m%H%?%$%W@k8@(B */
668 static void moveKBuf(jcConvBuf *, int, int);
669 static void moveDBuf(jcConvBuf *, int, int);
670 static void moveCInfo(jcConvBuf *, int, int);
671 static int resizeBuffer(jcConvBuf *, int);
672 static int resizeCInfo(jcConvBuf *, int);
673 static void setCurClause(jcConvBuf *, int);
674 static int getHint(jcConvBuf *, int, int);
675 static int renConvert(jcConvBuf *, int);
676 static int tanConvert(jcConvBuf *, int);
677 static int doKanrenConvert(jcConvBuf *, int);
678 static int doKantanDConvert(jcConvBuf *, int, int);
679 static int doKantanSConvert(jcConvBuf *, int);
680 static int unconvert(jcConvBuf *, int, int);
681 static int expandOrShrink(jcConvBuf *, int, int, int);
682 static int makeConverted(jcConvBuf *, int);
683 static int getCandidates(jcConvBuf *, int);
684 static int setCandidate(jcConvBuf *, int);
685 static void checkCandidates(jcConvBuf *, int, int);
686 static int forceStudy(jcConvBuf *, int);
687 #else
688 static void moveKBuf();
689 static void moveDBuf();
690 static void moveCInfo();
691 static int resizeBuffer();
692 static int resizeCInfo();
693 static void setCurClause();
694 static int getHint();
695 static int renConvert();
696 static int tanConvert();
697 static int doKanrenConvert();
698 static int doKantanDConvert();
699 static int doKantanSConvert();
700 static int unconvert();
701 static int expandOrShrink();
702 static int makeConverted();
703 static int getCandidates();
704 static int setCandidate();
705 static void checkCandidates();
706 static int forceStudy();
707 #endif
708
709 /* $B%(%i!<HV9f(B */
710 int jcErrno;
711
712 /*
713 * portability $B$N$?$a$N%U%!%s%/%7%g%s(B
714 */
715
716 #ifdef OVERLAP_BCOPY
717 #undef bcopy
718 static
719 bcopy(from, to, n)
720 register char *from;
721 register char *to;
722 register int n;
723 {
724 if (n <= 0 || from == to) return;
725
726 if (from < to) {
727 from += n;
728 to += n;
729 while (n-- > 0)
730 *--to = *--from;
731 } else {
732 while (n-- > 0)
733 *to++ = *from++;
734 }
735 }
736 #endif
737
738 /*
739 * wnnlib $BFbIt$G;H$o$l$k%U%!%s%/%7%g%s(B
740 */
741
742 /* moveKBuf -- $B$+$J%P%C%U%!$N;XDj$5$l$?J8@a$N@hF,$+$i$"$H$rF0$+$9(B */
743 static void
744 moveKBuf(buf, cl, move)
745 jcConvBuf *buf;
746 int cl;
747 int move;
748 {
749 jcClause *clp = buf->clauseInfo + cl;
750 jcClause *clpend;
751 int movelen;
752
753 TRACE("moveKBuf", "Enter")
754
755 if (move == 0) return;
756
757 if ((movelen = buf->kanaEnd - clp->kanap) > 0) {
758 /* $B$+$J%P%C%U%!$NFbMF$rF0$+$9(B */
759 (void)bcopy((char *)clp->kanap, (char *)(clp->kanap + move),
760 movelen * sizeof(wchar));
761 }
762
763 /* $B$+$J%P%C%U%!$NJQ99$K9g$o$;$F(B clauseInfo $B$r%"%C%W%G!<%H$9$k(B */
764 clpend = buf->clauseInfo + buf->nClause;
765 while (clp <= clpend) {
766 clp->kanap += move;
767 clp++;
768 }
769
770 /* kanaEnd $B$N%"%C%W%G!<%H(B */
771 buf->kanaEnd += move;
772 }
773
774 /* moveDBuf -- $BI=<(%P%C%U%!$N;XDj$5$l$?J8@a$N@hF,$+$i$"$H$rF0$+$9(B */
775 static void
776 moveDBuf(buf, cl, move)
777 jcConvBuf *buf;
778 int cl;
779 int move;
780 {
781 jcClause *clp = buf->clauseInfo + cl;
782 jcClause *clpend;
783 int movelen;
784
785 TRACE("moveDBuf", "Enter")
786
787 if (move == 0) return;
788
789 if ((movelen = buf->displayEnd - clp->dispp) > 0) {
790 /* $BI=<(%P%C%U%!$NFbMF$rF0$+$9(B */
791 (void)bcopy((char *)clp->dispp, (char *)(clp->dispp + move),
792 movelen * sizeof(wchar));
793 }
794
795 /* $BI=<(%P%C%U%!$NJQ99$K9g$o$;$F(B clauseInfo $B$r(B
796 * $B%"%C%W%G!<%H$9$k(B
797 */
798 clpend = buf->clauseInfo + buf->nClause;
799 while (clp <= clpend) {
800 clp->dispp += move;
801 clp++;
802 }
803
804 /* displayEnd $B$N%"%C%W%G!<%H(B */
805 buf->displayEnd += move;
806 }
807
808 /* moveCInfo -- ClauseInfo $B$N;XDj$5$l$?J8@a$N@hF,$+$i$"$H$rF0$+$9(B */
809 static void
810 moveCInfo(buf, cl, move)
811 jcConvBuf *buf;
812 int cl;
813 int move;
814 {
815 jcClause *clp = buf->clauseInfo + cl;
816 int len;
817
818 TRACE("moveCInfo", "Enter")
819
820 /* move $B$K@5$N?t$r;XDj$9$l$PJ8@a$NA^F~!"Ii$J$iJ8@a$N:o=|$K$J$k(B */
821
822 if (move == 0) return;
823
824 if ((len = buf->nClause + 1 - cl) > 0) {
825 (void)bcopy((char *)clp, (char *)(clp + move),
826 len * sizeof(jcClause));
827 }
828 buf->nClause += move;
829
830 /*
831 * $B8uJd$r<h$j=P$7$F$$$kJ8@a$,$"$l$P!"L58z$K$7$F$*$/!#(B
832 *
833 * $B$?$@$7!"8uJd$r<h$j=P$7$?7k2L!"J8@a?t$,JQ2=$7$?>l9g$K$O!"(B
834 * setCandidate() $B$NCf$G@_Dj$7$J$*$5$l$k!"$^$?!"(Bjllib $BFb$G$b(B
835 * $BF1$8J8@a$KBP$9$kA48uJd<h$j=P$7$,$"$C$?>l9g$N9MN8$,$"$k!#(B
836 * $B$H$$$&$3$H$G!"$3$3$O0BA4%5%$%I$G$$$/!#(B
837 */
838 if (buf->candClause >= 0) {
839 buf->candClause = -1;
840 buf->candClauseEnd = -1;
841 }
842 }
843
844 /* resizeBuffer -- $B$+$J(B/$BI=<(%P%C%U%!$NBg$-$5$rJQ$($k(B */
845 static int
846 resizeBuffer(buf, len)
847 jcConvBuf *buf;
848 int len;
849 {
850 wchar *kbufold, *dbufold;
851 wchar *kbufnew, *dbufnew;
852 int allocsize;
853 jcClause *clp, *clpend;
854
855 TRACE("resizeBuffer", "Enter")
856
857 kbufold = buf->kanaBuf;
858 dbufold = buf->displayBuf;
859
860 /* realloc $B$9$k(B */
861 allocsize = (len + 1) * sizeof(wchar);
862 kbufnew = (wchar *)realloc((char *)kbufold, allocsize);
863 dbufnew = (wchar *)realloc((char *)dbufold, allocsize);
864
865 if (kbufnew == NULL || dbufnew == NULL) {
866 Free(kbufnew);
867 Free(dbufnew);
868 jcErrno = JE_NOCORE;
869 return -1;
870 }
871
872 buf->bufferSize = len;
873
874 if (kbufnew == kbufold && dbufnew == dbufold) {
875 /* $B%]%$%s%?$OA0$HJQ$o$C$F$$$J$$(B */
876 return 0;
877 }
878
879 /* $B3F<o%]%$%s%?$r$D$1JQ$($k(B */
880
881 buf->kanaBuf = kbufnew;
882 buf->kanaEnd = kbufnew + (buf->kanaEnd - kbufold);
883 buf->displayBuf = dbufnew;
884 buf->displayEnd = dbufnew + (buf->displayEnd - dbufold);
885
886 buf->dot = kbufnew + (buf->dot - kbufold);
887
888 clp = buf->clauseInfo;
889 clpend = clp + buf->nClause;
890 while (clp <= clpend) {
891 clp->kanap = kbufnew + (clp->kanap - kbufold);
892 clp->dispp = dbufnew + (clp->dispp - dbufold);
893 clp++;
894 }
895
896 return 0;
897 }
898
899 /* resizeCInfo -- clauseInfo $B%P%C%U%!$NBg$-$5$rJQ$($k(B */
900 static int
901 resizeCInfo(buf, size)
902 jcConvBuf *buf;
903 int size;
904 {
905 jcClause *cinfonew;
906
907 TRACE("resizeCInfo", "Enter")
908
909 /* realloc $B$9$k(B */
910 cinfonew = (jcClause *)realloc((char *)buf->clauseInfo,
911 (size + 1) * sizeof(jcClause));
912 if (cinfonew == NULL) {
913 jcErrno = JE_NOCORE;
914 return -1;
915 }
916
917 buf->clauseSize = size;
918 buf->clauseInfo = cinfonew;
919 return 0;
920 }
921
922 /* setCurClause -- $B%+%l%s%HJ8@a$r@_Dj$9$k(B */
923 static void
924 setCurClause(buf, cl)
925 jcConvBuf *buf;
926 int cl; /* $B%+%l%s%H>.J8@aHV9f(B */
927 {
928 jcClause *clp = buf->clauseInfo;
929 int i;
930
931 TRACE("setCurClause", "Enter")
932
933 /* $B%+%l%s%H>.J8@a(B */
934 buf->curClause = cl;
935
936 /* $B%+%l%s%HBgJ8@a3+;OJ8@a(B */
937 for (i = cl; i > 0 && !clp[i].ltop; i--)
938 ;
939 buf->curLCStart = i;
940
941 /* $B%+%l%s%HBgJ8@a=*N;J8@a(B ($B$N<!(B) */
942 for (i = cl + 1; i <= buf->nClause && !clp[i].ltop; i++)
943 ;
944 buf->curLCEnd = i;
945 }
946
947 /* getHint -- $BJ8@a$NA08e$N@\B3>pJs$rF@$k(B */
948 static int
949 getHint(buf, start, end)
950 jcConvBuf *buf;
951 int start;
952 int end;
953 {
954 jcClause *cinfo = buf->clauseInfo;
955 int hint = 0;
956
957 TRACE("getHint", "Enter")
958
959 /*
960 * $B:G=i$NJ8@a$ND>A0$NJ8@a$,JQ49$5$l$F$$$l$P!"A0$NJ8@a$H@\B3$r$9$k(B
961 */
962 if (start > 0 && cinfo[start - 1].conv == 1)
963 hint |= WNN_USE_MAE;
964
965 /*
966 * $B:G8e$NJ8@a$ND>8e$,JQ49$5$l$F$$$F$$$l$P!"8e$NJ8@a$H@\B3$r$9$k(B
967 */
968 if (end > 0 && end < jl_bun_suu(buf->wnn) && cinfo[end].conv == 1)
969 hint |= WNN_USE_ATO;
970
971 return hint;
972 }
973
974
975 /* renConvert -- $B%+%l%s%HJ8@a$+$i8e$m$rO"J8@aJQ49$9$k(B */
976 static int
977 renConvert(buf, small)
978 jcConvBuf *buf;
979 int small;
980 {
981 TRACE("renConvert", "Enter")
982
983 /* $BO"J8@aJQ49$9$k(B */
984 if (doKanrenConvert(buf,
985 small ? buf->curClause : buf->curLCStart) < 0) {
986 return -1;
987 }
988
989 /*
990 * $B%+%l%s%HJ8@a$N@_Dj(B
991 * small $B$,(B 0 $B$J$i!"(B
992 * $B%+%l%s%HBgJ8@a$N@hF,$O(B buf->curLCStart $B$GJQ$o$i$:(B
993 * $B%+%l%s%HBgJ8@a=*$j$O(B ltop $B%U%i%0$r%5!<%A$7$FC5$9(B
994 * $B%+%l%s%H>.J8@a$O%+%l%s%HBgJ8@a@hF,$K0\F0(B
995 * small $B$,(B 0 $B$G$J$$$J$i!"(B
996 * $B%+%l%s%H>.J8@a$O(B buf->curClause $B$GJQ$o$i$:(B
997 * $B%+%l%s%HBgJ8@a$N@hF,$*$h$S=*$j$O!"%+%l%s%H>.J8@a$N(B
998 * $BA08e$r(B ltop $B%U%i%0$r%5!<%A$7$FC5$9(B
999 */
1000 setCurClause(buf, small ? buf->curClause : buf->curLCStart);
1001
1002 /* $B%I%C%H$N@_Dj(B */
1003 DotSet(buf);
1004
1005 return 0;
1006 }
1007
1008 /* tanConvert -- $B%+%l%s%HJ8@a$rC1J8@aJQ49$9$k(B */
1009 static int
1010 tanConvert(buf, small)
1011 jcConvBuf *buf;
1012 int small;
1013 {
1014 TRACE("tanConvert", "Enter")
1015
1016 /*
1017 * $BC1J8@aJQ49$N>l9g!"4pK\E*$K(B 2 $BCJ3,$N=hM}$r9T$J$&$3$H$K$J$k(B
1018 * $B$^$:!"%+%l%s%HJ8@a$rC1J8@aJQ49(B
1019 * $B<!$K!"$=$N$"$H$rO"J8@aJQ49(B
1020 */
1021
1022 if (small) {
1023 /* $B$^$:C1J8@aJQ49$9$k(B */
1024 if (doKantanSConvert(buf, buf->curClause) < 0)
1025 return -1;
1026
1027 /* $B%+%l%s%HJ8@a$N@_Dj(B
1028 * $B%+%l%s%H>.J8@a$O(B buf->curClause $B$GJQ$o$i$:(B
1029 * $B%+%l%s%HBgJ8@a$N@hF,$H:G8e$O%+%l%s%H>.J8@a$N(B
1030 * $BA08e$K(B ltop $B%U%i%0$r%5!<%A$7$FC5$9(B
1031 */
1032 setCurClause(buf, buf->curClause);
1033 /* $B%I%C%H$N@_Dj(B */
1034 DotSet(buf);
1035
1036 /* $BO"J8@aJQ49(B */
1037 if (buf->curClause + 1 < buf->nClause &&
1038 buf->clauseInfo[buf->curClause + 1].conv == 0) {
1039 /* $B>.J8@a$NC1J8@aJQ49%b!<%I$G!"<!$NJ8@a$,(B
1040 * $BL5JQ49$@$C$?>l9g!"(Bltop $B%U%i%0$r(B 0 $B$K$7$F(B
1041 * $BA0$H@\B3$G$-$k$h$&$K$9$k(B
1042 */
1043 buf->clauseInfo[buf->curClause + 1].ltop = 0;
1044 }
1045 if (doKanrenConvert(buf, buf->curClause + 1) < 0)
1046 return -1;
1047
1048 /* $B$b$&0lEY%+%l%s%HJ8@a$N@_Dj(B
1049 * $BO"J8@aJQ49$N7k2L$K$h$C$F$O%+%l%s%HBgJ8@a$N:G8e$,(B
1050 * $B0\F0$9$k$3$H$,$"$k(B
1051 */
1052 setCurClause(buf, buf->curClause);
1053
1054 /* $B%I%C%H$O0\F0$7$J$$$N$G:F@_Dj$7$J$/$F$h$$(B */
1055 } else {
1056 /* $B$^$:C1J8@aJQ49$9$k(B */
1057 if (doKantanDConvert(buf, buf->curLCStart, buf->curLCEnd) < 0)
1058 return -1;
1059
1060 /* $B%+%l%s%HJ8@a$N@_Dj(B
1061 * $B%+%l%s%HBgJ8@a$N@hF,$O(B buf->curLCStart $B$GJQ$o$i$:(B
1062 * $B%+%l%s%HBgJ8@a=*$j$O(B ltop $B%U%i%0$r%5!<%A$7$FC5$9(B
1063 * $B%+%l%s%H>.J8@a$O%+%l%s%HBgJ8@a@hF,$K0\F0(B
1064 */
1065 setCurClause(buf, buf->curLCStart);
1066 DotSet(buf);
1067
1068 /* $BO"J8@aJQ49(B */
1069 if (doKanrenConvert(buf, buf->curLCEnd) < 0)
1070 return -1;
1071 /* $B$3$A$i$O(B small $B$N;~$H0c$C$FO"J8@aJQ49$N7k2L%+%l%s%HJ8@a$,(B
1072 * $B0\F0$9$k$3$H$O$J$$(B
1073 */
1074 }
1075
1076 return 0;
1077 }
1078
1079 /* doKanrenConvert -- $B;XDj$5$l$?J8@a$+$i8e$m$rO"J8@aJQ49$9$k(B */
1080 static int
1081 doKanrenConvert(buf, cl)
1082 jcConvBuf *buf;
1083 int cl;
1084 {
1085 jcClause *clp;
1086 wchar *kanap, *dispp;
1087 wchar savechar;
1088 int nsbun;
1089 int len, n;
1090
1091 TRACE("doKanrenConvert", "Enter")
1092
1093 /*
1094 * $B;XDj$5$l$?J8@a$+$i8e$m$rO"J8@aJQ49$9$k(B
1095 * $B%+%l%s%HJ8@a$N:F@_Dj$J$I$O$7$J$$(B
1096 */
1097
1098 if (cl >= buf->nClause) {
1099 /* $B;XDj$5$l$?J8@a$O$J$$(B
1100 * $B%(%i!<$K$O$7$J$$(B
1101 * $B6u$NJ8@a$rJQ49$7$h$&$H$7$?;~$K!"$=$l$r;vA0$K%A%'%C%/$7$F(B
1102 * $B%(%i!<$K$9$k$N$O>e0L$N4X?t$N@UG$$G$"$k(B
1103 */
1104 return 0;
1105 }
1106
1107 /*
1108 * $BJQ49$9$kA0$K!">/$J$/$H$b;XDj$5$l$?J8@a$ND>A0$^$G$,JQ49$5$l$F(B
1109 * $B$$$k$3$H$rJ]>Z$9$k(B
1110 */
1111 if (makeConverted(buf, cl) < 0)
1112 return -1;
1113
1114 clp = buf->clauseInfo + cl;
1115
1116 /* $B$+$J%P%C%U%!$r(B NULL $B%?!<%_%M!<%H$5$;$F$*$/(B */
1117 *(buf->kanaEnd) = 0;
1118
1119 /* $BO"J8@aJQ49$9$k(B */
1120 #ifdef WNN6
1121 nsbun = jl_fi_ren_conv(buf->wnn, clp->kanap,
1122 cl, -1, getHint(buf, cl, -1));
1123 #else
1124 nsbun = jl_ren_conv(buf->wnn, clp->kanap,
1125 cl, -1, getHint(buf, cl, -1));
1126 #endif
1127
1128 if (nsbun < 0) {
1129 jcErrno = JE_WNNERROR;
1130 return -1;
1131 }
1132
1133 /* clauseInfo $B$N%5%$%:$N%A%'%C%/(B */
1134 if (nsbun > buf->clauseSize) {
1135 if (resizeCInfo(buf, cl + nsbun) < 0)
1136 return -1;
1137 }
1138
1139 /* $B<!$KJQ49J8;zNs$ND9$5$N%A%'%C%/(B */
1140 clp = buf->clauseInfo + cl;
1141 len = (clp->dispp - buf->displayBuf) + jl_kanji_len(buf->wnn, cl, -1);
1142
1143 if (len > buf->bufferSize) {
1144 if (resizeBuffer(buf, len) < 0)
1145 return -1;
1146 }
1147
1148 buf->nClause = nsbun;
1149
1150 /* $B$G$O(B clauseInfo $B$KJQ497k2L$rF~$l$F$$$/(B */
1151 clp = buf->clauseInfo + cl;
1152 kanap = clp->kanap;
1153 dispp = clp->dispp;
1154 while (cl < buf->nClause) {
1155 n = cl + 1;
1156
1157 /* $BJ8@a>pJs$N@_Dj(B */
1158 clp->conv = 1;
1159 clp->kanap = kanap;
1160 clp->dispp = dispp;
1161 clp->ltop = jl_dai_top(buf->wnn, cl);
1162
1163 /* $BI=<(%P%C%U%!$XJQ49J8;zNs$r%3%T!<$9$k(B */
1164 /* jl_get_kanji $B$O!"(BNULL $B$^$G%3%T!<$9$k$N$GCm0U(B */
1165 len = jl_kanji_len(buf->wnn, cl, n);
1166 savechar = dispp[len];
1167 (void)ki2_jl_get_kanji(buf->wnn, cl, n, dispp, len);
1168 dispp[len] = savechar;
1169 dispp += len;
1170
1171 /* $B$+$J%P%C%U%!$N0LCV$rJ8@a$N:G8e$K$9$k(B */
1172 kanap += jl_yomi_len(buf->wnn, cl, n);
1173
1174 /* $B%+%l%s%HJ8@a$N99?7(B */
1175 cl = n;
1176 clp++;
1177 }
1178
1179 /* $B:G8e$N(B clauseInfo $B$N@_Dj(B */
1180 clp->kanap = buf->kanaEnd;
1181 clp->dispp = buf->displayEnd = dispp;
1182 clp->conv = 0;
1183 clp->ltop = 1;
1184
1185 #ifdef DEBUG_WNNLIB
1186 showBuffers(buf, "after doKanrenConvert");
1187 #endif
1188
1189 return 0;
1190 }
1191
1192 /* doKantanDConvert -- $B;XDj$5$l$?HO0O$NJ8@a$rBgJ8@a$H$7$FC1J8@aJQ49$9$k(B */
1193 static int
1194 doKantanDConvert(buf, cls, cle)
1195 jcConvBuf *buf;
1196 int cls;
1197 int cle;
1198 {
1199 jcClause *clps, *clpe;
1200 int len, diff, newlen;
1201 int cldiff, nclausenew;
1202 wchar *kanap, *dispp;
1203 wchar savechar;
1204 wchar *savep;
1205 int nsbunnew, nsbunold;
1206 int i, n;
1207
1208 TRACE("doKantanDConvert", "Enter")
1209
1210 /*
1211 * $BJQ49$9$kA0$K!">/$J$/$H$b;XDj$5$l$?J8@a$ND>A0$^$G$,JQ49$5$l$F(B
1212 * $B$$$k$3$H$rJ]>Z$9$k(B
1213 */
1214 if (makeConverted(buf, cls) < 0)
1215 return -1;
1216
1217 /*
1218 * $B;XDj$5$l$?HO0O$NJ8@a$rBgJ8@a$H$7$FC1J8@aJQ49$9$k(B
1219 * $B%+%l%s%HJ8@a$N:F@_Dj$J$I$O$7$J$$(B
1220 */
1221
1222 clps = buf->clauseInfo + cls;
1223 clpe = buf->clauseInfo + cle;
1224 nsbunold = jl_bun_suu(buf->wnn);
1225 if (nsbunold < 0) {
1226 jcErrno = JE_WNNERROR;
1227 return -1;
1228 }
1229
1230 /*
1231 * $BFI$_$r(B NULL $B%?!<%_%M!<%H$9$k(B
1232 * $BC1$K(B 0 $B$rF~$l$k$H<!$NJ8@a$,2u$l$k$N$G!"$=$NA0$K%;!<%V$7$F$*$/(B
1233 */
1234 savep = clpe->kanap;
1235 savechar = *savep;
1236 *savep = 0;
1237
1238 /* $BC1J8@aJQ49$9$k(B */
1239 nsbunnew = jl_tan_conv(buf->wnn, clps->kanap, cls, cle,
1240 getHint(buf, cls, cle), WNN_DAI);
1241
1242 /* $B$9$+$5$:%;!<%V$7$F$"$C$?J8;z$r$b$H$KLa$9(B */
1243 *savep = savechar;
1244
1245 if (nsbunnew < 0) {
1246 jcErrno = JE_WNNERROR;
1247 return -1;
1248 }
1249
1250 cldiff = (cle - cls) - (nsbunold - nsbunnew);
1251 nclausenew = buf->nClause + cldiff;
1252 /* clauseInfo $B$N%5%$%:$N%A%'%C%/(B */
1253 if (nclausenew > buf->clauseSize) {
1254 if (resizeCInfo(buf, nclausenew) < 0)
1255 return -1;
1256 }
1257
1258 /* $BJQ49J8;zNs$ND9$5$N%A%'%C%/(B */
1259 len = jl_kanji_len(buf->wnn, cls, cle + cldiff);
1260 diff = len - (clpe->dispp - clps->dispp);
1261 newlen = (buf->displayEnd - buf->displayBuf) + diff;
1262 if (newlen > buf->bufferSize) {
1263 if (resizeBuffer(buf, newlen) < 0)
1264 return -1;
1265 }
1266
1267 /*
1268 * $BJ8@a$rA^F~$9$k$N$G!"I=<(%P%C%U%!$NFbMF$r0\F0$5$;$k!#(B
1269 *
1270 * $B$I$&$;$"$H$+$iO"J8@aJQ49$9$k$+$i$$$$$G$O$J$$$+$H$$$&9M$(J}$b$"$k$,!"(B
1271 * $B$I$3$G%(%i!<$,5/$3$C$F$b0l1~$N(B consistency $B$,J]$?$l$k$h$&$K(B
1272 * $B$9$k$H$$$&$N$,L\I8$G$"$k(B
1273 */
1274 moveDBuf(buf, cle, diff);
1275
1276 /* clauseInfo $B$rF0$+$9(B ($BF1;~$K(B nClause $B$b%"%C%W%G!<%H$5$l$k(B) */
1277 moveCInfo(buf, cle, cldiff);
1278
1279 /* $B$G$O(B clauseInfo $B$KJQ497k2L$rF~$l$k(B */
1280 clps = buf->clauseInfo + cls;
1281 kanap = clps->kanap;
1282 dispp = clps->dispp;
1283 cldiff += (cle - cls);
1284 for (i = 0; i < cldiff; i++) {
1285 n = cls + 1;
1286
1287 /* $BJ8@a>pJs$r@_Dj$9$k(B */
1288 clps->conv = 1;
1289 clps->ltop = jl_dai_top(buf->wnn, cls);
1290 clps->kanap = kanap;
1291 clps->dispp = dispp;
1292
1293 /* $BI=<(%P%C%U%!$X$NJQ49J8;zNs$N%3%T!<(B */
1294 /* jl_get_kanji $B$O!"(BNULL $B$^$G%3%T!<$9$k$N$GCm0U(B */
1295 len = jl_kanji_len(buf->wnn, cls, n);
1296 savechar = dispp[len];
1297 (void)ki2_jl_get_kanji(buf->wnn, cls, n, dispp, len);
1298 dispp[len] = savechar;
1299 dispp += len;
1300
1301 /* $B$+$J%P%C%U%!$N0LCV$r99?7(B */
1302 kanap += jl_yomi_len(buf->wnn, cls, n);
1303
1304 /* $B<!$NJ8@a>pJs$N99?7(B */
1305 cls = n;
1306 clps++;
1307 }
1308
1309 /* $B<!$N(B clauseInfo $B$N@_Dj(B */
1310 if (cls < jl_bun_suu(buf->wnn))
1311 clps->ltop = jl_dai_top(buf->wnn, cls);
1312 else
1313 clps->ltop = 1;
1314
1315 return 0;
1316 }
1317
1318 /* doKantanSConvert -- $B;XDj$5$l$?J8@a$r>.J8@a$H$7$FC1J8@aJQ49$9$k(B */
1319 static int
1320 doKantanSConvert(buf, cl)
1321 jcConvBuf *buf;
1322 int cl;
1323 {
1324 int next = cl + 1;
1325 jcClause *clp;
1326 int len, newlen, diff;
1327 wchar savechar;
1328 wchar *savep;
1329 int nsbun;
1330
1331 TRACE("doKantanSConvert", "Enter")
1332
1333 /*
1334 * $BJQ49$9$kA0$K!">/$J$/$H$b;XDj$5$l$?J8@a$ND>A0$^$G$,JQ49$5$l$F(B
1335 * $B$$$k$3$H$rJ]>Z$9$k(B
1336 */
1337 if (makeConverted(buf, cl) < 0)
1338 return -1;
1339
1340 /*
1341 * $B;XDj$5$l$?J8@a$r>.J8@a$H$7$FC1J8@aJQ49$9$k(B
1342 * $B%+%l%s%HJ8@a$N:F@_Dj$J$I$O$7$J$$(B
1343 */
1344
1345 clp = buf->clauseInfo + cl;
1346
1347 /*
1348 * $BFI$_$r(B NULL $B%?!<%_%M!<%H$9$k(B
1349 * $BC1$K(B 0 $B$rF~$l$k$H<!$NJ8@a$,2u$l$k$N$G!"$=$NA0$K%;!<%V$7$F$*$/(B
1350 */
1351 savep = (clp + 1)->kanap;
1352 savechar = *savep;
1353 *savep = 0;
1354
1355 /* $BC1J8@aJQ49$9$k(B */
1356 nsbun = jl_tan_conv(buf->wnn, clp->kanap, cl, next,
1357 getHint(buf, cl, next), WNN_SHO);
1358
1359
1360 /* $B$9$+$5$:%;!<%V$7$F$"$C$?J8;z$r$b$H$KLa$9(B */
1361 *savep = savechar;
1362
1363 if (nsbun < 0) {
1364 jcErrno = JE_WNNERROR;
1365 return -1;
1366 }
1367
1368 /* $BJQ49J8;zNs$ND9$5$N%A%'%C%/(B */
1369 clp = buf->clauseInfo + cl;
1370 len = jl_kanji_len(buf->wnn, cl);
1371 diff = len - ((clp + 1)->dispp - clp->dispp);
1372 newlen = (buf->displayEnd - buf->displayBuf) + diff;
1373 if (newlen > buf->bufferSize) {
1374 if (resizeBuffer(buf, newlen) < 0)
1375 return -1;
1376 }
1377
1378 /* $BJ8@a$rA^F~$9$k$N$G!"I=<(%P%C%U%!$NFbMF$r0\F0$5$;$k(B */
1379 /* $B$I$&$;$"$H$+$iO"J8@aJQ49$9$k$+$i$$$$$G$O$J$$$+$H$$$&9M$(J}$b$"$k$,!"(B
1380 * $B$I$3$G%(%i!<$,5/$3$C$F$b0l1~$N(B consistency $B$,J]$?$l$k$h$&$K(B
1381 * $B$9$k$H$$$&$N$,L\I8$G$"$k(B
1382 */
1383 moveDBuf(buf, next, diff);
1384
1385 /* $B$G$O(B clauseInfo $B$KJQ497k2L$rF~$l$k(B */
1386 clp = buf->clauseInfo + cl;
1387 clp->conv = 1;
1388 clp->ltop = jl_dai_top(buf->wnn, cl);
1389
1390 /* $BI=<(%P%C%U%!$XJQ49J8;zNs$r%3%T!<(B */
1391 /* jl_get_kanji $B$G$O!":G8e$N(B NULL $B$b%3%T!<$5$l$k$N$GCm0U(B */
1392 savechar = clp->dispp[len];
1393 (void)ki2_jl_get_kanji(buf->wnn, cl, next, clp->dispp, len);
1394 clp->dispp[len] = savechar;
1395
1396 /* $B<!$N(B clauseInfo $B$N@_Dj(B */
1397 if (next < jl_bun_suu(buf->wnn))
1398 (clp + 1)->ltop = jl_dai_top(buf->wnn, next);
1399
1400 return 0;
1401 }
1402
1403
1404 /* makeConverted -- $B;XDj$5$l$?J8@a$ND>A0$^$G$,(B jllib $B$GJQ49$5$l$F$$$k(B
1405 $B$3$H$rJ]>Z$9$k(B */
1406 static int
1407 makeConverted(buf, cl)
1408 jcConvBuf *buf;
1409 int cl;
1410 {
1411 int nsbun;
1412 int next;
1413 int status;
1414 wchar savechar;
1415 jcClause *clpc, *clpn;
1416
1417 TRACE("makeConverted", "Enter")
1418
1419 #ifdef DEBUG_WNNLIB
1420 showBuffers(buf, "before makeConverted");
1421 #endif
1422
1423 /* $B4{$KJQ49$5$l$F$$$k$+%A%'%C%/$9$k(B */
1424 nsbun = jl_bun_suu(buf->wnn);
1425 if (cl <= nsbun)
1426 return 0;
1427
1428 /* $BJQ49$5$l$F$$$J$$J8@a$rEPO?$9$k(B */
1429 clpc = buf->clauseInfo + nsbun;
1430 for (; nsbun < cl; nsbun = next, clpc = clpn) {
1431 clpn = clpc + 1;
1432 next = nsbun + 1;
1433
1434 /* $B4{$KEPO?$5$l$F$$$l$P!"2?$b$7$J$$(B */
1435 if (clpc->conv == 1)
1436 continue;
1437
1438 /* $BI=<(J8;zNs$r(B NULL $B%?!<%_%M!<%H$9$k(B */
1439 savechar = *clpn->dispp;
1440 *clpn->dispp = 0;
1441
1442 /*
1443 * jllib $B$K$OL5JQ49$NJ8@a$rEPO?$9$k5!G=$,$J$$$N$G!"(B
1444 * $B$H$j$"$($:A08e$N@\B3$J$7$GC1J8@aJQ49$9$k$3$H$K$9$k(B
1445 */
1446 status = jl_tan_conv(buf->wnn, clpc->dispp,
1447 nsbun, next, WNN_NO_USE, WNN_SHO);
1448
1449 /* $B%;!<%V$7$?J8;z$rLa$9(B */
1450 *clpn->dispp = savechar;
1451
1452 if (status < 0) {
1453 jcErrno = JE_WNNERROR;
1454 return -1;
1455 }
1456 }
1457
1458 #ifdef DEBUG_WNNLIB
1459 showBuffers(buf, "after makeConverted");
1460 #endif
1461
1462 return 0;
1463 }
1464
1465 /* unconvert -- $B;XDj$5$l$?HO0O$NJ8@a$r0l$D$NL5JQ49$NJ8@a$K$9$k(B */
1466 static int
1467 unconvert(buf, start, end)
1468 jcConvBuf *buf;
1469 int start;
1470 int end;
1471 {
1472 jcClause *clps, *clpe;
1473 int diff, len;
1474 wchar savechar;
1475
1476 TRACE("unconvert", "Enter")
1477
1478 if (end <= start)
1479 return 0;
1480
1481 if (start >= buf->nClause)
1482 return 0;
1483
1484 #ifdef DEBUG_WNNLIB
1485 showBuffers(buf, "before unconvert");
1486 #endif
1487
1488 clps = buf->clauseInfo + start;
1489 clpe = buf->clauseInfo + end;
1490
1491 /*
1492 * $BI=<(%P%C%U%!$NFbMF$r$+$J%P%C%U%!$NFbMF$GCV$-49$($k(B
1493 * $B!D$H$$$C$F$b<B:]$NF0:n$O$=$l$[$I4JC1$G$O$J$$(B
1494 *
1495 * $B!&$^$:!"CV$-49$($?7k2L!"I=<(%P%C%U%!$,$"$U$l$J$$$+D4$Y!"(B
1496 * $B$"$U$l$k$h$&$J$i%P%C%U%!$N%5%$%:$rBg$-$/$9$k(B
1497 * $B!&I=<(%P%C%U%!$K!"$+$J%P%C%U%!$+$i%G!<%?$r0\$9(B
1498 * $B!&(BclauseInfo $B$r=q$-49$($F!"(Bstart $B$+$i(B end-1 $B$^$G$NJ8@a$r(B
1499 * $B0l$D$NL5JQ49$NJ8@a$K$^$H$a$k(B
1500 * $B!&$b$A$m$s(B nClause $B$bJQ$($k(B
1501 * $B!&(Bstart+1 $B$+$i:G8e$^$G$NJ8@a$N(B clauseInfo $B$N(B dispp $B$r(B
1502 * $BI=<(%P%C%U%!$N$:$l$K1~$8$FD4@0$9$k(B
1503 *
1504 * $B$=$NB>$K<!$N$3$H$b9T$J$&I,MW$,$"$k$,!"$3$N4X?t$G$O$d$i$J$$(B
1505 * $B>e0L$N4X?t$G@_Dj$9$k$3$H(B
1506 * $B!&BgJ8@a%U%i%0(B (ltop) $B$N@_Dj(B
1507 * $B!&%+%l%s%HJ8@a!"$*$h$S<!8uJdJ8@a$N0\F0(B
1508 * $B<!8uJdJ8@a$,L5JQ49$NJ8@a$K$J$C$F$7$^$C$?;~$N=hM}(B
1509 * $B!&%I%C%H$N0\F0(B
1510 */
1511
1512 /* $BFI$_$ND9$5$H4A;z$ND9$5$N:9$rD4$Y$k(B */
1513 diff = (clpe->kanap - clps->kanap) - (clpe->dispp - clps->dispp);
1514 /* $BCV$-49$($?>l9g$NI=<(%P%C%U%!$ND9$5(B */
1515 len = (buf->displayEnd - buf->displayBuf) + diff;
1516 /* $B%P%C%U%!$N%5%$%:$,B-$j$J$1$l$P%5%$%:$rBg$-$/$9$k(B */
1517 if (len > buf->bufferSize) {
1518 if (resizeBuffer(buf, len) < 0) {
1519 /* $B%5%$%:$,JQ$($i$l$J$+$C$?(B */
1520 return -1;
1521 }
1522 }
1523
1524 /* $BCV$-49$((B */
1525 /* $B$^$:8e$m$NItJ,$rF0$+$7$F$+$i(B */
1526 moveDBuf(buf, end, diff);
1527 /* $BFI$_$rF~$l$k(B */
1528 (void)bcopy((char *)clps->kanap, (char *)clps->dispp,
1529 (clpe->kanap - clps->kanap) * sizeof(wchar));
1530
1531 /*
1532 * start $B$+$i(B end $B$^$G$NJ8@a$r0l$D$K$^$H$a$k(B
1533 */
1534
1535 /* $BL5JQ49>uBV$K$J$C$?J8@a$N(B clauseInfo $B$N@_Dj(B */
1536 clps->conv = 0;
1537
1538 /* end $B$+$i$"$H$N(B clauseInfo $B$r(B'$B$D$a$k(B' */
1539 moveCInfo(buf, end, start + 1 - end);
1540
1541 /* $BJ8@a$rEPO?$9$k(B */
1542 /* $BEPO?$5$l$F$$$kJ8@a$ND9$5$r%A%'%C%/(B */
1543 if (jl_bun_suu(buf->wnn) < end)
1544 end = -1;
1545
1546 /* $BEPO?$9$kA0$K!"FI$_$r(B NULL $B%?!<%_%M!<%H$7$F$*$/(B */
1547 clpe = clps + 1;
1548 savechar = *clpe->kanap;
1549 *clpe->kanap = 0;
1550
1551 /* $BL5JQ49$GEPO?$7$?$$$,$G$-$J$$$N$G!"A08e$N@\B3$J$7$G!"C1J8@a(B
1552 * $BJQ49$9$k(B
1553 */
1554
1555 len = jl_tan_conv(buf->wnn, clps->kanap,
1556 start, end, WNN_NO_USE, WNN_SHO);
1557
1558 /* $BFI$_$r85$K!"La$7$F$*$/(B */
1559 *clpe->kanap = savechar;
1560
1561 #ifdef DEBUG_WNNLIB
1562 showBuffers(buf, "after unconvert");
1563 #endif
1564
1565 /* $BEPO?$G$-$?$+$r!"%A%'%C%/(B */
1566 if (len < 0) {
1567 jcErrno = JE_WNNERROR;
1568 return -1;
1569 }
1570
1571 return 0;
1572 }
1573
1574 static int
1575 expandOrShrink(buf, small, expand, convf)
1576 jcConvBuf *buf;
1577 int small;
1578 int expand;
1579 int convf;
1580 {
1581 jcClause *clp, *clpe;
1582 wchar *kanap, *dispp;
1583 int start, end;
1584 int len;
1585 int nsbun;
1586
1587 TRACE("expandOrShrink", "Enter")
1588
1589 start = small ? buf->curClause : buf->curLCStart;
1590 end = small ? start + 1 : buf->curLCEnd;
1591
1592 clp = buf->clauseInfo + start;
1593 clpe = buf->clauseInfo + end;
1594
1595 /*
1596 * $B?-$S=L$_$G$-$k$+$N%A%'%C%/(B
1597 */
1598 if (expand) {
1599 /*
1600 * $B%+%l%s%HJ8@a$,:G8e$NJ8@a$N;~$K$O(B
1601 * $B$b$&9-$2$i$l$J$$(B
1602 */
1603 if (end >= buf->nClause) {
1604 jcErrno = JE_CANTEXPAND;
1605 return -1;
1606 }
1607 len = 1;
1608 } else {
1609 if (buf->curClause == buf->nClause ||
1610 clpe->kanap - clp->kanap <= 1) {
1611 /* $B%+%l%s%HJ8@a$,6u$+!"$"$k$$$OD9$5$,#10J2<(B */
1612 jcErrno = JE_CANTSHRINK;
1613 return -1;
1614 }
1615 len = -1;
1616 }
1617
1618 /* $BA48uJdJ8@a$,%+%l%s%HBgJ8@a$+$=$l0J9_$K$"$l$PL58z$K$9$k(B */
1619 checkCandidates(buf, start, buf->nClause);
1620
1621 /* jclib $B$H8_49$rJ]$D$?$a!":FJQ49;XDj$G$J$$>l9g$O!"FCJL$K=hM}$9$k(B */
1622 if (!convf) {
1623 /* jclib $B$HF1MM$K(B unconvert() $B$r;H$C$F!"=hM}$r$7$F$bNI$$$N(B
1624 * $B$@$,!"L5BL$,$"$k$N$GFH<+$N=hM}$H$9$k(B
1625 */
1626 int ksize;
1627 int dsize;
1628
1629 /* jllib $B$N>pJs$,$"$l$P!"%+%l%s%HJ8@a0J9_$rL58z$K$9$k(B */
1630 if (start < jl_bun_suu(buf->wnn))
1631 jl_kill(buf->wnn, start, -1);
1632
1633 /* $B%+%l%s%HJ8@a0J9_$NI=<(%P%C%U%!$NFbMF$r!"$+$J%P%C%U%!(B
1634 * $B$NFbMF$GCV49$($k(B (unconvert() $B;2>H(B)
1635 */
1636
1637 clp = buf->clauseInfo + start;
1638
1639 /* $B$^$:!"I=<(%P%C%U%!$NBg$-$5$rD4$Y!"I,MW$J$i$P%P%C%U%!(B
1640 * $B$r3HD%$9$k(B
1641 */
1642 ksize = buf->kanaEnd - clp->kanap;
1643 dsize = ksize + (clp->dispp - buf->displayBuf);
1644 if (dsize > buf->bufferSize) {
1645 if (resizeBuffer(buf, dsize))
1646 return -1;
1647 }
1648
1649 /* $BI=<(%P%C%U%!$NFbMF$r!"$+$J%P%C%U%!$NFbMF$GCV49$($k(B */
1650 bcopy(clp->kanap, clp->dispp, ksize * sizeof (wchar));
1651
1652 /* $BI=<(%P%C%U%!$N=*$j$r@_Dj$9$k(B */
1653 buf->displayEnd = clp->dispp + ksize;
1654
1655 /* $B%+%l%s%HJ8@a$r@_Dj$9$k(B
1656 */
1657 buf->curClause = buf->curLCStart = start;
1658 buf->dot = clp->kanap;
1659 clp->conv = 0;
1660 clp->ltop = 1;
1661
1662 /* $B?-=L$7$?7k2L!"J8@a?t$O(B start + 1 ($B%+%l%s%HJ8@a$ND9(B
1663 * $B$5$,(B 1 $B$G$"$C$?;~!"=L$a$?7k2L%+%l%s%HJ8@a$,$J$/$J$k!#(B
1664 * $B$^$?$O!"%+%l%s%HJ8@a$N8e$K$R$H$D$NJ8@a$7$+$J$/!"$=(B
1665 * $B$NJ8@a$ND9$5$,(B 1 $B$G$"$C$?>l9g!"?-$P$7$?7k2L%+%l%s%H(B
1666 * $BJ8@a$h$j8e$NJ8@a$,$J$/$J$k(B) $B$+(B start + 2 $B$K$J$k(B
1667 */
1668
1669 /* $B$^$:!"?-=L8e$N%+%l%s%HJ8@a$ND9$5$r7W;;$9$k(B */
1670 ksize = buf->clauseInfo[end].kanap - clp->kanap + len;
1671
1672 /* $B$=$7$F!"%+%l%s%HJ8@a$N8e$K$"$kJ8@a$r@_Dj$9$k(B */
1673 if (ksize == 0 || buf->displayEnd == clp->dispp + ksize) {
1674 /* $B=L$a$?7k2L%+%l%s%HJ8@a$,$J$/$J$C$?$+!"(B
1675 * $B?-$P$7$?7k2L%+%l%s%HJ8@a$N8e$NJ8@a$,$J$/$J$C$?(B
1676 *
1677 * $B$3$l$i$N>l9g$O!"A0$N%+%l%s%HJ8@a0J9_$r$R$H(B
1678 * $B$^$H$a(B ($B$R$H$D$NBgJ8@a(B) $B$K$7$F!"$=$l$r%+%l(B
1679 * $B%s%HJ8@a(B ($BBgJ8@a(B) $B$H$7$F$7$^$&(B
1680 *
1681 * $B$3$N;~!"(BclauseInfo $B$NBg$-$5$O!"I,$:(B start + 1
1682 * $B$h$jBg$-$$$3$H$,J]>Z$5$l$F$$$k(B
1683 */
1684 buf->nClause = buf->curLCEnd = start + 1;
1685
1686 /* $BKvHxJ8@a$r%]%$%s%H$5$;$k(B */
1687 clp++;
1688 } else if (start + 2 > buf->clauseSize
1689 && resizeCInfo(buf, start + 1) < 0) {
1690 /* $B=L$a$h$&$H$9$kJ8@a$,:G8e$NJ8@a$@$C$?>l9g!"(B
1691 * $BD9$5$,(B 1 $B$NJ8@a$,A}$($k$3$H$K$J$k!#(B
1692 * $B$,!"(BclauseInfo $B$NBg$-$5$r%A%'%C%/$7!"$=$l$r(B
1693 * $BA}$d$;$J$+$C$?$N$G!"%+%l%s%HJ8@a0J9_$rA4It$R(B
1694 * $B$H$^$H$a$K$9$k(B ($B%P%C%U%!$N@09g@-$rJ]$D$?$a(B)
1695 */
1696 buf->nClause = buf->curLCEnd = start + 1;
1697 clp++;
1698 clp->kanap = buf->kanaEnd;
1699 clp->dispp = buf->displayEnd;
1700 clp->conv = 0;
1701 clp->ltop = 1;
1702
1703 /* $B$G$b!"%(%i!<$O%(%i!<$J$N$G!"%(%i!<$H$7$FJV$9(B */
1704 #ifdef DEBUG_WNNLIB
1705 showBuffers(buf,
1706 "after expandOrShrink [noconv, error]");
1707 #endif
1708 return -1;
1709 } else {
1710 /* $B?-=L$G$-$?$N$G!"%+%l%s%HJ8@a$N8e$NJ8@a$r@_Dj$9$k(B
1711 * ($B$"$^$j!"0UL#$O$J$$$H$O;W$&$,!">.J8@a$N?-=L8e$N(B
1712 * $BBgJ8@a$N@_Dj$O!"(Bjclib $B$N@_Dj$HF1$8$K$7$F$*$/(B)
1713 */
1714 buf->curLCEnd = start + (small ? 2 : 1);
1715 buf->nClause = start + 2;
1716 clpe = clp + 1;
1717 clpe->kanap = clp->kanap + ksize;
1718 clpe->dispp = clp->dispp + ksize;
1719 clpe->conv = 0;
1720 clpe->ltop = small ? 0 : 1;
1721
1722 /* $BKvHxJ8@a$r%]%$%s%H$5$;$k(B */
1723 clp += 2;
1724 }
1725
1726 /* $BKvHxJ8@a$N>pJs$r@_Dj$9$k(B */
1727 clp->kanap = buf->kanaEnd;
1728 clp->dispp = buf->displayEnd;
1729 clp->conv = 0;
1730 clp->ltop = 1;
1731
1732 #ifdef DEBUG_WNNLIB
1733 showBuffers(buf, "after expandOrShrink [noconv]");
1734 #endif
1735 return 0;
1736 }
1737
1738 /* $B$9$Y$F$NJ8@a$,JQ49$5$l$F$$$k$3$H$rJ]>Z$9$k(B */
1739 makeConverted(buf, buf->nClause);
1740
1741 /*
1742 * $BJ8@a$ND9$5$rJQ99$9$k!#$3$N;~!"A0J8@a$K@\B32DG=$K$7$F$*$/$H(B
1743 * $B:$$k$3$H$,$"$k!#Nc$($P!VL5NLBg?t!W$HF~NO$7$h$&$H$7$F!"(B
1744 * a) "$B$`$j$g$&$?$$$9$&(B" $B$rJQ49$9$k$H(B"$BL5NA(B $BBP?t(B" $B$H$J$k!#(B
1745 * b) "$BL5NA(B" $B$r(B "$BL5NL(B" $B$KD>$9!#(B
1746 * c) "$BBP?t(B" $B$r(B "$BBg?t(B" $B$KD>$=$&$H;W$C$?$,8uJd$K$J$$$N$G(B2$BJ8;zJ,(B
1747 * $BJ8@a$r=L$a$F(B "$BBg(B $B?t(B" $B$KJ,$1$h$&$H$9$k!#(B
1748 * d) $B$H$3$m$,(B "$B$?$$(B" $B$,A08uJd$K@\B3$7$F$7$^$$!"(B"$BL5NLBN(B $B?t(B" $B$K$J$k!#(B
1749 * e) "$BL5NLBg(B" $B$H$$$&8uJd$O$J$$$N$G!";EJ}$J$/(B2$BJ8;zJ8@a$r=L$a$k$H(B
1750 * "$BL5NA(B $BBP?t(B" $B$K$J$C$F$7$^$C$?!#(B
1751 * f) b) $B$KLa$k!#(B
1752 * ($B$^!"$3$N>l9g$K$O$O$8$a$+$i!VL5NLBg?t!W$rEPO?$7$F$*$1$P$$$$$N$@$,(B)
1753 */
1754 len += jl_yomi_len(buf->wnn, start, end);
1755 #ifdef WNN6
1756 nsbun = jl_fi_nobi_conv(buf->wnn, start, len, -1, 0,
1757 small ? WNN_SHO : WNN_DAI);
1758 #else
1759 nsbun = jl_nobi_conv(buf->wnn, start, len, -1, 0,
1760 small ? WNN_SHO : WNN_DAI);
1761 #endif
1762
1763 if (nsbun < 0) {
1764 jcErrno = JE_WNNERROR;
1765 return -1;
1766 }
1767
1768 /* clauseInfo $B$N%5%$%:$N%A%'%C%/$7$F!"I,MW$J$i$PA}$d$9(B */
1769 if (nsbun > buf->clauseSize) {
1770 if (resizeCInfo(buf, nsbun) < 0)
1771 return -1;
1772 }
1773 buf->nClause = nsbun;
1774
1775 /* $BI=<(%P%C%U%!$NBg$-$5$r%A%'%C%/$7$F!"I,MW$J$i$PA}$d$9(B */
1776 clp = buf->clauseInfo + start;
1777 len = clp->dispp - buf->displayBuf + jl_kanji_len(buf->wnn, start, -1);
1778 if (len > buf->bufferSize) {
1779 if (resizeBuffer(buf, len) < 0)
1780 return -1;
1781 }
1782
1783 /* $B%+%l%s%HJ8@a$r3P$($F$*$/(B */
1784 buf->curClause = start;
1785
1786 /* $BJQ497k2L$r!"I=<(%P%C%U%!$KF~$l$F$$$/(B */
1787 clp = buf->clauseInfo + start;
1788 kanap = clp->kanap;
1789 dispp = clp->dispp;
1790 while (start < nsbun) {
1791 end = start + 1;
1792
1793 /* $BJ8@a>pJs$N@_Dj(B */
1794 clp->kanap = kanap;
1795 clp->dispp = dispp;
1796
1797 /* $BI=<(%P%C%U%!$KJQ49J8;zNs$r%3%T!<(B
1798 * jl_get_kanji $B$O:G8e$N(B NULL $B$^$G%3%T!<$5$l$k$N$GCm0U(B
1799 */
1800 {
1801 int i = jl_kanji_len(buf->wnn, start, end);
1802 wchar c = dispp[i];
1803
1804 (void)ki2_jl_get_kanji(buf->wnn, start, end, dispp, i);
1805 dispp[i] = c; /* $B85$KLa$9(B */
1806 dispp += i; /* $B0LCV$N99?7(B */
1807 clp->conv = 1;
1808 clp->ltop = jl_dai_top(buf->wnn, start);
1809 }
1810
1811 /* $B$+$J%P%C%U%!$N0LCV$r99?7(B */
1812 kanap += jl_yomi_len(buf->wnn, start, end);
1813
1814 /* $B<!$NJ8@a$X(B */
1815 start = end;
1816 clp++;
1817 }
1818
1819 /* $B:G8e$N(B clauseInfo $B$N@_Dj(B */
1820 clp->kanap = buf->kanaEnd;
1821 clp->dispp = buf->displayEnd = dispp;
1822 clp->conv = 0;
1823 clp->ltop = 1;
1824
1825 /* $B%+%l%s%HJ8@a$r:F@_Dj$9$k(B */
1826 setCurClause(buf, buf->curClause);
1827
1828 /* $B%I%C%H$N:F@_Dj(B */
1829 DotSet(buf);
1830
1831 #ifdef DEBUG_WNNLIB
1832 showBuffers(buf, "after expand_or_shrink");
1833 #endif
1834 return 0;
1835 }
1836
1837 /* getCandidates -- $BA48uJd$r<h$j=P$9!#$?$@$7!"4{$K<h$j=P$7:Q$_$J$i2?$b$7$J$$(B */
1838 static int
1839 getCandidates(buf, small)
1840 jcConvBuf *buf;
1841 int small;
1842 {
1843 int start, end;
1844
1845 TRACE("getCandidates", "Enter")
1846
1847 /*
1848 * $B4{$K8uJd$,<h$j=P$5$l$F$$$k>l9g!"%+%l%s%HJ8@a$H8uJdJ8@a$,0lCW(B
1849 * $B$7$J$$$3$H$b$"$k$,!"8uJdJ8@a$N@_Dj$rM%@h$9$k$3$H$K$9$k!#$3$N(B
1850 * $B>l9g!"8uJdJ8@a$O!"I,$:%+%l%s%HJ8@a$KEy$7$$$+$=$l$K4^$^$l$F$$(B
1851 * $B$k$O$:!#(B
1852 */
1853 if (small) {
1854 /* $B8uJd$,<h$j=P$7:Q$_$J$i!"2?$b$7$J$$(B */
1855 if (buf->candKind == CAND_SMALL &&
1856 buf->candClause == buf->curClause)
1857 return 0;
1858
1859 /* $B%+%l%s%H>.J8@a$N8uJd$r<h$j=P$9(B */
1860 start = buf->curClause;
1861 end = start + 1;
1862 if (jl_zenkouho(buf->wnn,
1863 start,
1864 getHint(buf, start, end) & WNN_USE_MAE,
1865 WNN_UNIQ) < 0) {
1866 buf->candClause = -1;
1867 jcErrno = JE_WNNERROR;
1868 return -1;
1869 }
1870 } else {
1871 /* $B8uJd$,<h$j=P$7:Q$_$J$i!"2?$b$7$J$$(B */
1872 #if 0
1873 if (buf->candKind == CAND_LARGE &&
1874 buf->candClause >= buf->curLCStart &&
1875 buf->candClauseEnd <= buf->curLCEnd)
1876 return 0;
1877 #else
1878 if (buf->candKind == CAND_LARGE &&
1879 buf->candClause >= buf->curLCStart &&
1880 buf->candClauseEnd <= buf->curLCEnd &&
1881 buf->candClause <= buf->curClause &&
1882 buf->candClauseEnd > buf->curClause)
1883 return 0;
1884 #endif
1885
1886 /* $B%+%l%s%HBgJ8@a$N8uJd$r<h$j=P$9(B */
1887 start = buf->curLCStart;
1888 end = buf->curLCEnd;
1889 #ifndef WNN6
1890 /*
1891 * jl $B%i%$%V%i%j$N8uJd%P%C%U%!FbMF$rGK4~$9$k!#(B
1892 * curLCStart $B$,0JA0$HF1$8$G$+$D(B curLCEnd $B$,(B
1893 * $B0[$J$k>l9g(B ($B$D$^$j%+%l%s%HBgJ8@a$,8e$m$K?-$S$?>l9g(B)$B!"(B
1894 * $B$3$&$7$J$$$H(B Wnn4 $B$N(B jl $B%i%$%V%i%j$O8uJd$r:F<hF@(B
1895 * $B$7$F$/$l$J$$!#(B
1896 */
1897 jl_kill(buf->wnn, 0, 0);
1898 #endif
1899 if (jl_zenkouho_dai(buf->wnn,
1900 start,
1901 end,
1902 getHint(buf, start, end),
1903 WNN_UNIQ) < 0) {
1904 buf->candClause = -1;
1905 jcErrno = JE_WNNERROR;
1906 return -1;
1907 }
1908 }
1909
1910 /* $B<!8uJd$N<h$j=P$7$N$?$a$N>pJs$r3P$($F$*$/(B */
1911 buf->candKind = small ? CAND_SMALL : CAND_LARGE;
1912 buf->candClause = start;
1913 buf->candClauseEnd = end;
1914 return 0;
1915 }
1916
1917 /* setCandidate -- $B;XDj$5$l$?8uJd$G%P%C%U%!$rCV$-49$($k(B */
1918 static int
1919 setCandidate(buf, n)
1920 jcConvBuf *buf;
1921 int n;
1922 {
1923 int start = buf->candClause;
1924 int end = buf->candClauseEnd;
1925 int oldlen, newlen, bdiff;
1926 int oldclen, newclen, cdiff;
1927 int newend;
1928 jcClause *clp;
1929
1930 TRACE("setCandidate", "Enter")
1931 #ifdef DEBUG_WNNLIB
1932 fprintf(stderr, "setCandidate for %d as %s\n",
1933 n, buf->candKind == CAND_SMALL ? "small" : "large");
1934 showBuffers(buf, "setCandiate (before)");
1935 #endif
1936
1937 clp = buf->clauseInfo + start;
1938 oldlen = (buf->clauseInfo + end)->dispp - clp->dispp;
1939 oldclen = jl_bun_suu(buf->wnn);
1940
1941 if (buf->candKind == CAND_SMALL) {
1942 /* $B%+%l%s%H>.J8@a$r!";XDj8uJd$GCV$-49$($k(B */
1943 if (jl_set_jikouho(buf->wnn, n) < 0) {
1944 jcErrno = JE_WNNERROR;
1945 return -1;
1946 }
1947 } else {
1948 /* $B%+%l%s%HBgJ8@a$r!";XDj8uJd$GCV$-49$($k(B */
1949 if (jl_set_jikouho_dai(buf->wnn, n) < 0) {
1950 jcErrno = JE_WNNERROR;
1951 return -1;
1952 }
1953 }
1954
1955 /* $BJQ498e$NJ8@a?t$N%A%'%C%/$9$k(B */
1956 newclen = jl_bun_suu(buf->wnn);
1957 if (newclen < 0) {
1958 jcErrno = JE_WNNERROR;
1959 return -1;
1960 }
1961 cdiff = newclen - oldclen;
1962 newend = end + cdiff;
1963
1964 /* $BJQ498e$N%G%#%9%W%l%$%P%C%U%!$N%5%$%:$r%A%'%C%/$9$k(B */
1965 newlen = jl_kanji_len(buf->wnn, start, newend);
1966 if (newlen <= 0) {
1967 jcErrno = JE_WNNERROR;
1968 return -1;
1969 }
1970 bdiff = newlen - oldlen;
1971
1972 #ifdef DEBUG_WNNLIB
1973 {
1974 wchar candstr[1024];
1975
1976 fprintf(stderr, "Candidate[%s]: '",
1977 buf->candKind == CAND_SMALL ? "small" : "large");
1978 if (newlen >= 1024) {
1979 fprintf(stderr,
1980 "* candidate string is too large [%d] *",
1981 newlen);
1982 } else {
1983 candstr[0] = 0;
1984 ki2_jl_get_zenkouho_kanji(buf->wnn, n, candstr, 1024);
1985 printBuffer (candstr, candstr + newlen);
1986 }
1987 fprintf(stderr, "'\n");
1988 }
1989 #endif
1990
1991 /*
1992 * $B%G%#%9%W%l%$%P%C%U%!$r:F@_Dj$9$k(B
1993 *
1994 * $B:G=i$K!"=<J,$J%G%#%9%W%l%$%P%C%U%!$NBg$-$5$r3NJ]$7$F$*$/!#(B
1995 * $B<!$K!"CV$-49$(8e$N8uJdJ8;zNs$N$?$a$N>l=j$r3NJ]$9$k!#:G8e$K!"(B
1996 * $BCV$-49$($k8uJdJ8;zNs$r%G%#%9%W%l%$%P%C%U%!$KA^F~$9$k!#(B
1997 */
1998 {
1999 int buflen = (buf->displayEnd - buf->displayBuf) + bdiff;
2000 wchar *dispp = clp->dispp;
2001 wchar tmp;
2002
2003 if (buflen > buf->bufferSize
2004 && resizeBuffer(buf, buflen) < 0) {
2005 return -1;
2006 }
2007
2008 moveDBuf(buf, end, bdiff);
2009
2010 /*
2011 * $B8uJdJ8;zNs$NA^F~$O!"(Bjl_get_kanji() $B$rMQ$$$k$N$G!"(B
2012 * $B$=$l$,@_Dj$9$k:G8e$N(B NUL $BJ8;z$KCm0U!#(B
2013 */
2014 tmp = dispp[newlen];
2015 if (ki2_jl_get_kanji(buf->wnn, start, newend,
2016 dispp, newlen) <= 0) {
2017 jcErrno = JE_WNNERROR;
2018 return -1;
2019 }
2020 dispp[newlen] = tmp;
2021 }
2022
2023
2024 /*
2025 * clauseInfo$B$r:F@_Dj$9$k(B
2026 *
2027 * $B:G=i$K!"=<J,$J(B clauseInfo $B$NBg$-$5$r3NJ]$7$F$*$/!#<!$K!"(B
2028 * $B8uJdCV$-49$(8e$NJ8@a>pJs$N$?$a$N>l=j$r3NJ]$9$k!#:G8e$K!"(B
2029 * $BCV$-49$($?8uJd$N%P%C%U%!>pJs$r@_Dj$9$k!#(B
2030 */
2031 {
2032 wchar *kanap, *dispp;
2033 int i, j;
2034
2035 if (buf->nClause + cdiff > buf->clauseSize
2036 && resizeCInfo(buf, buf->nClause + cdiff) < 0) {
2037 return -1;
2038 }
2039
2040 moveCInfo(buf, end, cdiff);
2041
2042 kanap = clp->kanap;
2043 dispp = clp->dispp;
2044 for (i = start; i < newend; i = j) {
2045 clp->kanap = kanap;
2046 clp->dispp = dispp;
2047 clp->conv = 1;
2048 clp->ltop = jl_dai_top(buf->wnn, i);
2049 j = i + 1;
2050 kanap += jl_yomi_len(buf->wnn, i, j);
2051 dispp += jl_kanji_len(buf->wnn, i, j);
2052 clp++;
2053 }
2054
2055 /*
2056 * $B8uJd$N<h$j=P$7$K$h$C$F!"A08e$NBgJ8@a$,JQ99$K$J$C$F(B
2057 * $B$$$k$+$b$7$l$J$$$N$G!"$=$l$i$r:F@_Dj$9$k!#D>8e$NJ8(B
2058 * $B@a$@$1$GNI$$$O$:$@$,!"G0$N$?$a!"$9$Y$F$r%A%'%C%/$9(B
2059 * $B$k$3$H$K$9$k!#(B
2060 */
2061 for (i = 0; i < start; i++)
2062 buf->clauseInfo[i].ltop = jl_dai_top(buf->wnn, i);
2063 for (i = newend; i < newclen; i++)
2064 buf->clauseInfo[i].ltop = jl_dai_top(buf->wnn, i);
2065 }
2066
2067 /*
2068 * $B<!8uJd$GCV$-49$($?7k2L!"CV$-49$(BP>]J8@a$H$=$NA08e$NBgJ8@a(B
2069 * $B$,0\F0$7$F$$$k$+$b$7$l$J$$$N$G!"%+%l%s%HJ8@a$r:F@_Dj$9$k!#(B
2070 */
2071 setCurClause(buf, start);
2072
2073 /*
2074 * $BJ8@a$N0\F0$KH<$$!"8uJdJ8@a$b0\F0$7$F$$$k$O$:$J$N$G!":F@_Dj(B
2075 * $B$7$F$*$/(B (moveCInfo() $B;2>H(B)
2076 */
2077 buf->candClause = start;
2078 buf->candClauseEnd = end + cdiff;
2079
2080 #ifdef DEBUG_WNNLIB
2081 showBuffers(buf, "setCandiate (after)");
2082 #endif
2083 return 0;
2084 }
2085
2086 /* checkCandidates -- $BA48uJd$,M-8z$+%A%'%C%/$7$F!"I,MW$J=hM}$r9T$J$&(B */
2087 static void
2088 checkCandidates(buf, cls, cle)
2089 jcConvBuf *buf;
2090 int cls;
2091 int cle;
2092 {
2093 /* $BJ8@aHV9f(B cls $B$+$i(B cle - 1 $B$^$G$NJ8@a$,JQ99$5$l$k(B
2094 * $B<!8uJd%P%C%U%!$K$O$$$C$F$$$k8uJdJ8@a$,$3$NCf$K4^$^$l$F$$$l$P(B
2095 * $B<!8uJd%P%C%U%!$NFbMF$rL58z$K$7$J$/$F$O$J$i$J$$(B
2096 *
2097 * $B$I$N$h$&$J>l9g$+$H$$$&$H!"(B
2098 * 1. buf->candKind $B$,(B CAND_SMALL $B$G!"(B
2099 * cls <= buf->candClause < cle
2100 * 2. buf->candKind $B$,(B CAND_LARGE $B$G!"(B
2101 * buf->candClause < cle $B$+$D(B cls < buf->candClauseEnd
2102 */
2103 if (buf->candKind == CAND_SMALL)
2104 buf->candClauseEnd = buf->candClause + 1; /* $BG0$N$?$a(B */
2105 if (buf->candClause < cle && cls < buf->candClauseEnd) {
2106 /* $BL58z$K$9$k(B */
2107 buf->candClause = buf->candClauseEnd = -1;
2108 }
2109 }
2110
2111
2112 /* forceStudy -- $BL$JQ49$*$h$S5?;wJQ49J8@a$N3X=,(B */
2113 static int
2114 forceStudy(buf, n)
2115 jcConvBuf *buf;
2116 int n;
2117 {
2118 int i, j, k;
2119 int status;
2120 wchar yomi[CL_BUFSZ], kanji[CL_BUFSZ];
2121
2122 TRACE("forceStudy", "Enter")
2123
2124 #ifdef DEBUG_WNNLIB
2125 showBuffers(buf, "forceStudy");
2126 #endif
2127
2128 if (n < 0 || n > buf->nClause)
2129 n = buf->nClause;
2130
2131 /* $B$3$3$G$$$&3X=,$H$O!"IQEY>pJs$N99?7$H9M$($F$h$$(B */
2132
2133 /*
2134 * Wnn6 $B$G$O!"L5JQ493X=,5!G=$,$"$j!"(Bwnnlib $B$K$h$k5?;wJQ49$dL$(B
2135 * $BJQ49$NJ8@a$r3X=,$5$;$k$3$H$,$G$-$k!#$?$@$7!"L$JQ49$NJ8@a$K(B
2136 * $BBP$7$FC1=c$KIQEY$N99?7$O$G$-$J$$$N$GCm0U(B
2137 */
2138
2139 /*
2140 * $B:G=i$K!"JQ49:Q$_$NJ8@a?t$rD4$Y$k!#F~NO$5$l$?J8@a$,$9$Y$FJQ(B
2141 * $B49:Q$_(B (conv == 1) $B$G$"$l$P!"A4J8@a$r$NJ8@a$NIQEY>pJs$r$^$H(B
2142 * $B$a$F99?7$9$k!#JQ49:Q$_$G$J$$J8@a$,$"$C$?>l9g!"$H$j$"$($:JQ(B
2143 * $B49$7$F!"JQ497k2L$,I=<(%P%C%U%!$NFbMF$H0lCW$7$F$$$l$P!"IQEY(B
2144 * $B>pJs$r99?7$9$k$3$H$K$9$k(B
2145 */
2146 status = 0;
2147 for (i = 0; i < n; i++) {
2148 if (buf->clauseInfo[i].conv == 1)
2149 status++;
2150 }
2151
2152 /* $B$9$Y$F$NJ8@a$,JQ49$5$l$F$$$?$i!"A4$F$NJ8@a$NIQEY$r99?7$9$k(B */
2153 if (status == n) {
2154 #ifdef WNN6
2155 status = jl_optimize_fi(buf->wnn, 0, -1);
2156 #else
2157 status = jl_update_hindo(buf->wnn, 0, -1);
2158 #endif
2159 if (status < 0) {
2160 jcErrno = JE_WNNERROR;
2161 return -1;
2162 }
2163 return 0;
2164 }
2165
2166 /*
2167 * $BJ8@aC10L$GIQEY>pJs$r99?7$9$k(B
2168 * $BL$JQ49$NJ8@a$,$"$l$P!"L$JQ49$H$7$FIQEY>pJs$r99?7$9$k(B (Wnn6
2169 * $B$NL5JQ493X=,5!G=(B)
2170 */
2171
2172 /* $BIQEY>pJs$r99?7$9$kA0$K!"A4J8@a$rJQ49$7$F$*$/(B */
2173 if (makeConverted(buf, n) < 0)
2174 return -1;
2175
2176 for (i = 0; i < n; i = j) {
2177 j = i + 1;
2178 /*
2179 * $BJQ49:Q$_$NJ8@a$G$"$l$P!"$=$N$^$^IQEY>pJs$r99?7$9$k(B
2180 */
2181 if (buf->clauseInfo[i].conv == 1) {
2182 #ifdef WNN6
2183 status = jl_optimize_fi(buf->wnn, i, j);
2184 #else
2185 status = jl_update_hindo(buf->wnn, i, j);
2186 #endif
2187 if (status < 0) {
2188 jcErrno = JE_WNNERROR;
2189 return -1;
2190 }
2191 continue;
2192 }
2193
2194 /*
2195 * $BL$JQ49$H5?;wJQ49$NJ8@a$KBP$7$F$O!"FI$_$r3X=,$9$k(B
2196 * $BL$JQ49$H5?;wJQ49$N>l9g$G$b!"(Bwnnlib $B$G$OI=<(%P%C%U%!$H$+(B
2197 * $B$J%P%C%U%!$NN>J}$,0lCW$7$F$$$k$N$G(B (jcKana() $B;2>H(B)$B!"(B
2198 * $B$3$3$G$O(B jllib $B$NFI$_%G!<%?$r;HMQ$9$k(B
2199 */
2200
2201 /* $BFI$_J8;zNs$HJQ49:QJ8;zNs$ND9$5%A%'%C%/(B */
2202 if (jl_yomi_len(buf->wnn, i, j) >= CL_BUFSZ ||
2203 jl_kanji_len(buf->wnn, i, j) >= CL_BUFSZ) {
2204 /* $B%P%C%U%!%*!<%P%U%m!<$rHr$1$k(B */
2205 continue;
2206 }
2207
2208 /* $BFI$_J8;zNs$N<h$j=P$7(B */
2209 if (ki2_jl_get_yomi(buf->wnn, i, j, yomi, CL_BUFSZ) < 0) {
2210 jcErrno = JE_WNNERROR;
2211 return -1;
2212 }
2213 /* $BJQ49:Q$_J8;zNs$r<h$j=P$9(B */
2214 if (ki2_jl_get_kanji(buf->wnn, i, j, kanji, CL_BUFSZ) < 0) {
2215 jcErrno = JE_WNNERROR;
2216 return -1;
2217 }
2218
2219 /*
2220 * $BFI$_$HJQ498e$,0lCW$7$F$$$l$P!"3X=,:Q$_$H$_$J$7$F!"(B
2221 * $B$=$N$^$^IQEY>pJs$r99?7$9$k(B
2222 */
2223 if (wstrcmp (yomi, kanji) == 0) {
2224 #ifdef WNN6
2225 status = jl_optimize_fi(buf->wnn, i, j);
2226 #else
2227 status = jl_update_hindo(buf->wnn, i, j);
2228 #endif
2229 if (status < 0) {
2230 jcErrno = JE_WNNERROR;
2231 return -1;
2232 }
2233 continue;
2234 }
2235
2236 /*
2237 * $BFI$_$HJQ498e$,0lCW$7$J$$$N$G!"A48uJd$NCf$+$iC5$9(B
2238 * $B$b$7!"0lCW$9$k$b$N$,$"$l$P!"IQEY>pJs$r99?7$7!"$=$&(B
2239 * $B$G$J$1$l$PIQEY>pJs$O99?7$7$J$$(B
2240 */
2241 if (jl_zenkouho(buf->wnn, i,
2242 getHint(buf, -1, -1), WNN_UNIQ) < 0) {
2243 jcErrno = JE_WNNERROR;
2244 return -1;
2245 }
2246 status = jl_zenkouho_suu(buf->wnn);
2247 if (status < 0) {
2248 jcErrno = JE_WNNERROR;
2249 return -1;
2250 }
2251 for (k = 0; k < status; k++) {
2252 ki2_jl_get_zenkouho_kanji(buf->wnn, k, kanji,
2253 CL_BUFSZ);
2254 /* $BI,$:(B NUL $B%?!<%_%M!<%H$5$l$k$h$&$K$7$F$*$/(B */
2255 kanji[CL_BUFSZ - 1] = 0;
2256 if (wstrcmp(yomi, kanji) != 0)
2257 continue;
2258 if (jl_set_jikouho(buf->wnn, k) < 0) {
2259 jcErrno = JE_WNNERROR;
2260 return -1;
2261 }
2262 #ifdef WNN6
2263 status = jl_optimize_fi(buf->wnn, i, j);
2264 #else
2265 status = jl_update_hindo(buf->wnn, i, j);
2266 #endif
2267 if (status < 0) {
2268 jcErrno = JE_WNNERROR;
2269 return -1;
2270 }
2271 break;
2272 }
2273 }
2274
2275 return 0;
2276 }
2277
2278
2279 /*
2280 * $B$3$3$+$i(B Public $B$J%U%!%s%/%7%g%s(B
2281 */
2282
2283 /* jcCreateBuf -- $BJQ49%P%C%U%!$N:n@.(B */
2284 jcConvBuf *
2285 jcCreateBuffer(wnn, nclause, buffersize)
2286 struct wnn_buf *wnn;
2287 int nclause;
2288 int buffersize;
2289 {
2290 jcConvBuf *buf;
2291
2292 TRACE("jcCreateBuffer", "Enter")
2293
2294 /* $B$^$:(B jcConvBuf $B$N3NJ](B */
2295 if ((buf = (jcConvBuf *)malloc(sizeof(jcConvBuf))) == NULL) {
2296 jcErrno = JE_NOCORE;
2297 return NULL;
2298 }
2299 (void)bzero((char *)buf, sizeof(jcConvBuf));
2300 buf->wnn = wnn;
2301
2302 /* $B<!$K3F<o%P%C%U%!$N3NJ](B */
2303
2304 /* $B$^$:!"$+$J%P%C%U%!$HI=<(%P%C%U%!(B */
2305 buf->bufferSize = (buffersize <= 0) ? DEF_BUFFERSIZE : buffersize;
2306 /* $B%P%C%U%!$N:G8e$r(B NULL $B%?!<%_%M!<%H$9$k$3$H$,$"$k$N$G!"(B
2307 * 1$BJ8;zJ8Bg$-$/$7$F$*$/(B
2308 */
2309 buf->kanaBuf = (wchar *)malloc((buf->bufferSize + 1) *
2310 sizeof(wchar));
2311 buf->displayBuf = (wchar *)malloc((buf->bufferSize + 1) *
2312 sizeof(wchar));
2313
2314 /* $B<!$K(B clauseInfo $B%P%C%U%!(B */
2315 buf->clauseSize = (nclause <= 0) ? DEF_CLAUSESIZE : nclause;
2316 /* clauseInfo $B%P%C%U%!$O(B nclause + 1 $B8D%"%m%1!<%H$9$k(B
2317 * $B$J$<$+$H$$$&$H(B clauseinfo $B$O%G%j%_%?$H$7$FMWAG$r(B
2318 * 1$B8D;H$&$N$G(B nclause $B8D$NJ8@a$r07$&$?$a$K$O(B nclause + 1 $B8D$N(B
2319 * $BBg$-$5$r;}$?$J$1$l$P$J$i$J$$$+$i$G$"$k(B
2320 */
2321 buf->clauseInfo = (jcClause *)malloc((buf->clauseSize + 1)
2322 * sizeof(jcClause));
2323
2324 if (buf->kanaBuf == NULL || buf->displayBuf == NULL ||
2325 buf->clauseInfo == NULL) {
2326 /* malloc() $B$G$-$J$+$C$?(B */
2327 Free(buf->kanaBuf);
2328 Free(buf->displayBuf);
2329 Free(buf->clauseInfo);
2330 Free(buf);
2331 jcErrno = JE_NOCORE;
2332 return NULL;
2333 }
2334
2335 (void)jcClear(buf);
2336 return buf;
2337 }
2338
2339 /* jcDestroyBuffer -- $BJQ49%P%C%U%!$N>C5n(B */
2340 int
2341 jcDestroyBuffer(buf, savedic)
2342 jcConvBuf *buf;
2343 int savedic;
2344 {
2345 TRACE("jcDestroyBuffer", "Enter")
2346
2347 if (buf == NULL)
2348 return 0;
2349
2350 /* $B%"%m%1!<%H$7$?%a%b%j$N2rJ|(B */
2351 Free(buf->kanaBuf);
2352 Free(buf->displayBuf);
2353 Free(buf->clauseInfo);
2354
2355 /* savedic $B$,(B 0 $B$G$J$1$l$P!"4D6-$K%m!<%I$5$l$F$$$kA4$F$N%U%!%$%k$r(B
2356 * save $B$9$k(B
2357 */
2358 if (savedic && jl_dic_save_all(buf->wnn) < 0) {
2359 jcErrno = JE_WNNERROR;
2360 return -1;
2361 }
2362
2363 Free(buf);
2364
2365 return 0;
2366 }
2367
2368 /* jcClear -- wnnlib $B$N=i4|2=(B ($B?7$?$JJQ49$r;O$a$kKh$K8F$P$J$1$l$P$J$i$J$$(B) */
2369 int
2370 jcClear(buf)
2371 jcConvBuf *buf;
2372 {
2373 TRACE("jcClear", "Enter")
2374
2375 /* $B=i4|CM$N@_Dj(B */
2376 buf->nClause = buf->curClause = buf->curLCStart = 0;
2377 buf->curLCEnd = 1;
2378 buf->candClause = buf->candClauseEnd = -1;
2379 buf->kanaEnd = buf->kanaBuf;
2380 buf->displayEnd = buf->displayBuf;
2381 buf->clauseInfo[0].kanap = buf->kanaBuf;
2382 buf->clauseInfo[0].dispp = buf->displayBuf;
2383 buf->clauseInfo[0].conv = 0;
2384 buf->clauseInfo[0].ltop = 1;
2385 buf->dot = buf->kanaBuf;
2386 buf->fixed = 0;
2387 jcErrno = JE_NOERROR;
2388
2389 if (jl_bun_suu(buf->wnn) > 0)
2390 jl_kill(buf->wnn, 0, -1);
2391
2392 return 0;
2393 }
2394
2395 /* jcConvert -- $B%+%l%s%HJ8@a0J9_$r$+$J4A;zJQ49$9$k(B */
2396 int
2397 jcConvert(buf, small, tan, jump)
2398 jcConvBuf *buf;
2399 int small;
2400 int tan;
2401 int jump;
2402 {
2403 int ret;
2404
2405 TRACE("jcConvert", "Enter")
2406
2407 CHECKFIXED(buf);
2408
2409 if (buf->curClause == buf->nClause) {
2410 /* $B%+%l%s%HJ8@a$,:G8e$NJ8@a$G$7$+$b6u(B */
2411 jcErrno = JE_CLAUSEEMPTY;
2412 return -1;
2413 }
2414
2415 /* $BA48uJdJ8@a$,%+%l%s%HBgJ8@a$+$=$l0J9_$K$"$l$PL58z$K$9$k(B */
2416 checkCandidates(buf,
2417 small ? buf->curClause : buf->curLCStart,
2418 buf->nClause);
2419
2420 if (tan) {
2421 ret = tanConvert(buf, small);
2422 } else {
2423 ret = renConvert(buf, small);
2424 }
2425
2426 if (ret < 0)
2427 return ret;
2428
2429 if (jump) {
2430 /* $B%I%C%H$H%+%l%s%HJ8@a$rJ8$N:G8e$K0\F0$5$;$k(B */
2431 buf->curClause = buf->curLCStart = buf->nClause;
2432 buf->curLCEnd = buf->nClause + 1;
2433 buf->dot = buf->kanaEnd;
2434 }
2435 return 0;
2436 }
2437
2438 /* jcUnconvert -- $B%+%l%s%HBgJ8@a$rL5JQ49$N>uBV$KLa$9(B */
2439 int
2440 jcUnconvert(buf)
2441 jcConvBuf *buf;
2442 {
2443 jcClause *clp = buf->clauseInfo + buf->curClause;
2444
2445 TRACE("jcUnconvert", "Enter")
2446
2447 CHECKFIXED(buf);
2448
2449 if (buf->curClause == buf->nClause) {
2450 /* $B%+%l%s%HJ8@a$,:G8e$NJ8@a$G$7$+$b6u(B */
2451 jcErrno = JE_CLAUSEEMPTY;
2452 return -1;
2453 }
2454
2455 if (!clp->conv) {
2456 /* $B%+%l%s%HJ8@a$OJQ49$5$l$F$$$J$$(B */
2457 /* $BL5JQ49$NJ8@a$O(B wnnlib $BFbIt$G$O>o$KBgJ8@a$H$7$F(B
2458 * $B07$o$l$k$N$G!"%+%l%s%H>.J8@a$NJQ49>uBV$r8+$F!"(B
2459 * $B$=$l$,JQ49>uBV$J$i%+%l%s%HBgJ8@aFb$N(B
2460 * $BA4$F$N>.J8@a$OJQ49>uBV!"$=$&$G$J$1$l$PL5JQ49>uBV!"(B
2461 * $B$K$J$k(B
2462 */
2463 jcErrno = JE_NOTCONVERTED;
2464 return -1;
2465 }
2466
2467 /* $BA48uJdJ8@a$,%+%l%s%HBgJ8@a$+$=$l0J9_$K$"$l$PL58z$K$9$k(B */
2468 checkCandidates(buf, buf->curLCStart, buf->nClause);
2469
2470 /* $BL5JQ49>uBV$K$9$k(B */
2471 if (unconvert(buf, buf->curLCStart, buf->curLCEnd) < 0)
2472 return -1;
2473
2474 /* $BBgJ8@a$N@_Dj(B */
2475 clp = buf->clauseInfo + buf->curLCStart;
2476 clp->ltop = 1;
2477 (++clp)->ltop = 1;
2478
2479 /* $B%+%l%s%HJ8@a$N:F@_Dj(B */
2480 buf->curClause = buf->curLCStart;
2481 buf->curLCEnd = buf->curLCStart + 1;
2482
2483 /* $B%I%C%H$N@_Dj(B */
2484 DotSet(buf);
2485
2486 return 0;
2487 }
2488
2489 /* jcCancel -- $BF~NOCf$NA4J8@a$rL5JQ49>uBV$K$9$k(B */
2490 int
2491 jcCancel(buf)
2492 jcConvBuf *buf;
2493 {
2494 TRACE("jcCancel", "Enter")
2495
2496 CHECKFIXED(buf);
2497
2498 if (buf->nClause <= 0)
2499 return 0;
2500
2501 /*
2502 * $BI=<(%P%C%U%!$NFbMF$r$+$J%P%C%U%!$NFbMF$GCV49$($k(B
2503 * $B$3$N:]!"%P%C%U%!$NBg$-$5$O5$$K$9$kI,MW$,L5$$!#$J$<$J$i!"I=(B
2504 * $B<(%P%C%U%!$H$+$J%P%C%U%!$NBg$-$5$O>o$KF1$8$@$+$i(B
2505 */
2506 bcopy(buf->kanaBuf, buf->displayBuf, buf->bufferSize * sizeof (wchar));
2507
2508 /*
2509 * $B:#$"$kA4J8@a$r0l$D$NL5JQ49>uBV$NBgJ8@a$K$9$k(B
2510 * $B$3$N:]$b!"J8@a?t$r5$$K$9$kI,MW$O$J$$!#$J$<$J$i!">/$/$H$b0l$D(B
2511 * $B$NJ8@a$O$"$C$?$O$:$@$+$i(B
2512 */
2513 buf->curClause = buf->curLCStart = 0;
2514 buf->nClause = buf->curLCEnd = 1;
2515 buf->displayEnd = buf->displayBuf + (buf->kanaEnd - buf->kanaBuf);
2516 buf->clauseInfo[0].conv = 0;
2517 buf->clauseInfo[0].ltop = 1;
2518 buf->clauseInfo[1].kanap = buf->kanaEnd;
2519 buf->clauseInfo[1].dispp = buf->displayEnd;
2520 buf->clauseInfo[1].conv = 0;
2521 buf->clauseInfo[1].ltop = 1;
2522
2523 /* $BA48uJdJ8@a$bL58z$K$9$k(B */
2524 buf->candClause = buf->candClauseEnd = -1;
2525
2526 /* jllib $B$NJQ49>uBV$bL58z$K$9$k(B */
2527 if (jl_bun_suu(buf->wnn) > 0)
2528 jl_kill(buf->wnn, 0, -1);
2529
2530 return 0;
2531 }
2532
2533 /* jcExpand -- $B%+%l%s%HJ8@a$r#1J8;z9-$2$k(B */
2534 int
2535 jcExpand(buf, small, convf)
2536 jcConvBuf *buf;
2537 int small;
2538 int convf;
2539 {
2540 TRACE("jcExpand", "Enter")
2541
2542 CHECKFIXED(buf);
2543
2544 return expandOrShrink(buf, small, 1, convf);
2545 }
2546
2547 /* jcShrink -- $B%+%l%s%HJ8@a$r#1J8;z=L$a$k(B */
2548 int
2549 jcShrink(buf, small, convf)
2550 jcConvBuf *buf;
2551 int small;
2552 int convf;
2553 {
2554 TRACE("jcShrink", "Enter")
2555
2556 CHECKFIXED(buf);
2557
2558 return expandOrShrink(buf, small, 0, convf);
2559 }
2560
2561 /* jcKana -- $B%+%l%s%HJ8@a$r$+$J$K$9$k(B */
2562 int
2563 jcKana(buf, small, kind)
2564 jcConvBuf *buf;
2565 int small;
2566 int kind;
2567 {
2568 jcClause *clp;
2569 wchar *kanap, *kanaendp, *dispp;
2570 int start, end;
2571 int conv;
2572 int c;
2573
2574 TRACE("jcKana", "Enter")
2575
2576 CHECKFIXED(buf);
2577
2578 /* $BJ8@aHV9f$N%A%'%C%/(B */
2579 if (buf->curClause >= buf->nClause) {
2580 /* $B%+%l%s%HJ8@a$,:G8e$NJ8@a$G$7$+$b6u$@$C$?>l9g(B
2581 * $B$3$N>l9g%(%i!<$K$7$F$b$h$$$,(B...
2582 */
2583 return 0;
2584 }
2585
2586 /*
2587 * $B%+%l%s%HJ8@a$,JQ49$5$l$F$$$l$P$$$C$?$sL5JQ49$K$9$k(B
2588 */
2589
2590 /* $B$"$H$GJQ49>uBV$r$b$H$KLa$9$?$a!"JQ49>uBV$r%;!<%V$7$F$*$/(B */
2591 conv = buf->clauseInfo[buf->curClause].conv;
2592
2593 if (small) {
2594 start = buf->curClause;
2595 end = start + 1;
2596 } else {
2597 start = buf->curLCStart;
2598 end = buf->curLCEnd;
2599 }
2600
2601 /* $BA48uJdJ8@a$N%A%'%C%/(B */
2602 checkCandidates(buf, start, end);
2603
2604 /* $BL5JQ49>uBV$K$9$k(B */
2605 if (unconvert(buf, start, end) < 0) {
2606 return -1;
2607 }
2608
2609 /*
2610 * small $B$,(B 0$B!"$D$^$j%+%l%s%HJ8@a$H$7$FBgJ8@a$rA*Br$7$?>l9g!"(B
2611 * $B$=$NCf$N>.J8@a$O0l$D$K$^$H$a$i$l$k$N$G!"(BcurClause $B$H(B
2612 * curLCEnd $B$rJQ$($kI,MW$,$"$k(B
2613 */
2614 if (!small) {
2615 buf->curClause = buf->curLCStart;
2616 buf->curLCEnd = buf->curLCStart + 1;
2617 }
2618
2619 /*
2620 * $B$+$JJQ49$9$k(B
2621 *
2622 * $BI=<(%P%C%U%!$@$1$G$O$J$/!"$+$J%P%C%U%!$bJQ49$9$k(B
2623 *
2624 * $B$3$l$K$O$5$7$?$kM}M3$O$J$$$,!"$^$"!"(BVer3 $BHG$N(B jclib $B$,(B
2625 * $B$=$&$@$C$?$N$G!D(B
2626 */
2627 clp = buf->clauseInfo + buf->curClause;
2628 kanap = clp->kanap;
2629 kanaendp = (clp + 1)->kanap;
2630 dispp = clp->dispp;
2631
2632 if (kind == JC_HIRAGANA) { /* $B%+%?%+%J"*$R$i$,$J(B */
2633 /* $B%+%?%+%J$r$R$i$,$J$KJQ49$9$k:]$K$O$R$i$,$J$K$J$$;z(B
2634 * "$B%t%u%v(B" $B$,$"$k$N$G$$$-$*$$$GJQ49$7$F$7$^$o$J$$$h$&$K(B
2635 * $B5$$rIU$1$J$1$l$P$J$i$J$$(B
2636 * ($B$^$"<B:]$O5$$r$D$1$k$H$$$&$[$I$N$b$N$G$O$J$$$,(B)
2637 */
2638 while (kanap < kanaendp) {
2639 c = *kanap;
2640 if ((KANABEG + KATAOFFSET) <= c &&
2641 c <= (KANAEND + KATAOFFSET)) {
2642 *kanap = *dispp = c - KATAOFFSET;
2643 }
2644 kanap++, dispp++;
2645 }
2646 } else { /* $B$R$i$,$J"*%+%?%+%J(B */
2647 while (kanap < kanaendp) {
2648 c = *kanap;
2649 if (KANABEG <= c && c <= KANAEND) {
2650 *kanap = *dispp = c + KATAOFFSET;
2651 }
2652 kanap++, dispp++;
2653 }
2654 }
2655
2656 /*
2657 * $BJQ49>uBV$r$b$H$KLa$7$F$*$/(B
2658 */
2659
2660 /* $B$H$O$$$C$F$b4{$KJQ49$5$l$?J8@a$N>l9g!"$3$l$NIQEY>pJs$r(B
2661 * $B%5!<%P$KAw$k$H$^$:$$$N$G!"$"$H$G$+$JJQ49$7$?$3$H$,$o$+$k$h$&$K(B
2662 * jcClause.conv $B$O(B -1 $B$K%;%C%H$9$k(B
2663 */
2664 clp->conv = conv ? -1 : 0;
2665
2666 return 0;
2667 }
2668
2669 /* jcFix -- $B3NDj$9$k(B */
2670 int
2671 jcFix(buf)
2672 jcConvBuf *buf;
2673 {
2674 TRACE("jcFix", "Enter")
2675
2676 if (buf->fixed) {
2677 /* $B4{$K3NDj$5$l$F$$$k(B
2678 * $B%(%i!<$K$7$F$b$h$$$,!D(B
2679 */
2680 return 0;
2681 }
2682
2683 if (forceStudy(buf, buf->nClause) < 0)
2684 return -1;
2685
2686 /* $B3NDj%U%i%0$rN)$F$k(B */
2687 buf->fixed = 1;
2688
2689 return 0;
2690 }
2691
2692
2693 /* jcFix1 -- $B:G=i$N0lJ8;z$@$1$r3NDj$9$k(B */
2694 int
2695 jcFix1(buf)
2696 jcConvBuf *buf;
2697 {
2698 TRACE("jcFix1", "Enter")
2699
2700 if (buf->fixed) {
2701 /* $B4{$K3NDj$5$l$F$$$k(B
2702 * $B%(%i!<$K$7$F$b$h$$$,!D(B
2703 */
2704 return 0;
2705 }
2706
2707 if (buf->nClause >= 1) {
2708 /* $B:G=i$NJ8@a$@$1$r3X=,$9$k(B */
2709 if (forceStudy(buf, 1) < 0)
2710 return -1;
2711
2712 /* $B:G=i$NJ8@a$N0lJ8;z$@$1$K$9$k(B */
2713 buf->nClause = 1;
2714 buf->curClause = buf->curLCStart = 0;
2715 buf->curLCEnd = 1;
2716 buf->kanaEnd = buf->kanaBuf + 1; /* $B%@%_!<(B */
2717 buf->displayEnd = buf->displayBuf + 1;
2718 buf->clauseInfo[0].kanap = buf->kanaBuf;
2719 buf->clauseInfo[0].dispp = buf->displayBuf;
2720 buf->clauseInfo[0].ltop = 1;
2721 buf->clauseInfo[1].kanap = buf->kanaBuf + 1; /* $B%@%_!<(B */
2722 buf->clauseInfo[1].dispp = buf->displayBuf + 1;
2723 buf->clauseInfo[1].ltop = 1;
2724 buf->dot = buf->kanaBuf + 1;
2725 buf->candClause = buf->candClauseEnd = -1;
2726 }
2727
2728
2729 /* $B3NDj%U%i%0$rN)$F$k(B */
2730 buf->fixed = 1;
2731
2732 return 0;
2733 }
2734
2735 /* jcNext -- $B%+%l%s%HJ8@a$r<!8uJd(B/$BA08uJd$GCV$-49$($k(B */
2736 int
2737 jcNext(buf, small, prev)
2738 jcConvBuf *buf;
2739 int small;
2740 int prev;
2741 {
2742 int n;
2743
2744 TRACE("jcNext", "Enter")
2745
2746 CHECKFIXED(buf);
2747
2748 if (!buf->clauseInfo[buf->curClause].conv) {
2749 /* $B$^$@JQ49$5$l$F$$$J$$(B */
2750 jcErrno = JE_NOTCONVERTED;
2751 return -1;
2752 }
2753
2754 /* $BA48uJd$,F@$i$l$F$$$J$1$l$P!"A48uJd$rF@$k(B */
2755 if (getCandidates(buf, small) < 0)
2756 return -1;
2757
2758 n = jl_zenkouho_suu(buf->wnn);
2759 if (n <= 1) {
2760 /* $B<!8uJd$,$J$$(B */
2761 jcErrno = n < 0 ? JE_WNNERROR : JE_NOCANDIDATE;
2762 return -1;
2763 }
2764
2765 /* $B<!8uJdHV9f$rF@$k(B */
2766 n = jl_c_zenkouho(buf->wnn) + (prev ? -1 : 1);
2767 if (n < 0) {
2768 n = jl_zenkouho_suu(buf->wnn) - 1;
2769 } else if (n >= jl_zenkouho_suu(buf->wnn)) {
2770 n = 0;
2771 }
2772
2773 if (setCandidate(buf, n) < 0) {
2774 /* $B<!8uJd$,F@$i$l$J$+$C$?(B */
2775 jcErrno = JE_WNNERROR;
2776 return -1;
2777 }
2778
2779 return 0;
2780 }
2781
2782 /* jcCandidateInfo -- $B<!8uJd$N?t$H8=:_$N8uJdHV9f$rD4$Y$k(B
2783 * $B$b$7<!8uJd$,$^$@%P%C%U%!$KF~$C$F$$$J$1$l$PMQ0U$9$k(B
2784 */
2785 int
2786 jcCandidateInfo(buf, small, ncandp, curcandp)
2787 jcConvBuf *buf;
2788 int small;
2789 int *ncandp;
2790 int *curcandp;
2791 {
2792 int cand, ncand;
2793
2794 TRACE("jcCandidateInfo", "Enter")
2795
2796 CHECKFIXED(buf);
2797
2798 if (!buf->clauseInfo[buf->curClause].conv) {
2799 /* $B$^$@JQ49$5$l$F$$$J$$(B */
2800 jcErrno = JE_NOTCONVERTED;
2801 return -1;
2802 }
2803
2804 /* $BA48uJd$,F@$i$l$F$$$J$1$l$P!"A48uJd$rF@$k(B */
2805 if (getCandidates(buf, small) < 0)
2806 return -1;
2807
2808 ncand = jl_zenkouho_suu(buf->wnn);
2809 if (ncand <= 1) {
2810 /* $B8uJd$,$J$$(B */
2811 jcErrno = (ncand < 0) ? JE_WNNERROR : JE_NOCANDIDATE;
2812 return -1;
2813 }
2814
2815 /* $B8=:_$N8uJdHV9f$rF@$k(B */
2816 cand = jl_c_zenkouho(buf->wnn);
2817 if (cand < 0) {
2818 /* $B8uJd$,F@$i$l$J$$(B */
2819 jcErrno = JE_WNNERROR;
2820 return -1;
2821 }
2822
2823 if (ncandp != NULL) *ncandp = ncand;
2824 if (curcandp != NULL) *curcandp = cand;
2825
2826 return 0;
2827 }
2828
2829 /* jcGetCandidate -- $B;XDj$5$l$?HV9f$N8uJd$r<h$j=P$9(B */
2830 int
2831 jcGetCandidate(buf, n, candstr)
2832 jcConvBuf *buf;
2833 int n;
2834 wchar *candstr;
2835 {
2836 wchar tmp[CL_BUFSZ];
2837
2838 TRACE("jcGetCandidate", "Enter")
2839
2840 CHECKFIXED(buf);
2841
2842 /* $BJ8@a$N%A%'%C%/(B */
2843 if (buf->candClause < 0) {
2844 jcErrno = JE_NOCANDIDATE;
2845 return -1;
2846 }
2847
2848 /* $B8uJdHV9f$N%A%'%C%/(B */
2849 if (n < 0 || n >= jl_zenkouho_suu(buf->wnn)) {
2850 jcErrno = JE_NOSUCHCANDIDATE;
2851 return -1;
2852 }
2853
2854 /* $BJ8;zNs$r%3%T!<(B */
2855 ki2_jl_get_zenkouho_kanji(buf->wnn, n, tmp, CL_BUFSZ);
2856 tmp[CL_BUFSZ - 1] = 0;
2857 wstrcpy(candstr, tmp);
2858
2859 return 0;
2860 }
2861
2862 /* jcSelect -- $BI=<(%P%C%U%!$r;XDj$5$l$?8uJd$HCV$-49$($k(B */
2863 int
2864 jcSelect(buf, n)
2865 jcConvBuf *buf;
2866 int n;
2867 {
2868 TRACE("jcSelect", "Enter")
2869
2870 CHECKFIXED(buf);
2871
2872 #ifdef DEBUG_WNNLIB
2873 fprintf(stderr,
2874 "Select: %d [%s for %d - %d]\n",
2875 n,
2876 buf->candKind == CAND_SMALL ? "small" : "large",
2877 buf->candClause,
2878 buf->candClauseEnd);
2879 #endif
2880
2881 /* $BJ8@a$N%A%'%C%/(B */
2882 if (buf->candClause < 0) {
2883 jcErrno = JE_NOCANDIDATE;
2884 return -1;
2885 }
2886
2887 /* $B8uJdHV9f$N%A%'%C%/(B */
2888 if (n < 0 || n >= jl_zenkouho_suu(buf->wnn)) {
2889 jcErrno = JE_NOSUCHCANDIDATE;
2890 return -1;
2891 }
2892
2893 /* $B8uJd$,%;%C%H$5$l$F$$$J$1$l$P!"%;%C%H$9$k(B */
2894 if (jl_c_zenkouho(buf->wnn) != n && setCandidate(buf, n) < 0)
2895 return -1;
2896
2897 return 0;
2898 }
2899
2900 /* jcDotOffset -- $BBgJ8@a$N@hF,$+$i$N%I%C%H$N%*%U%;%C%H$rJV$9(B */
2901 int
2902 jcDotOffset(buf)
2903 jcConvBuf *buf;
2904 {
2905 TRACE("jcDotOffset", "Enter")
2906
2907 return buf->dot - buf->clauseInfo[buf->curLCStart].kanap;
2908 }
2909
2910 /* jcIsConverted -- $B;XDj$5$l$?J8@a$,JQ49$5$l$F$$$k$+$I$&$+$rJV$9(B */
2911 int
2912 jcIsConverted(buf, cl)
2913 jcConvBuf *buf;
2914 int cl;
2915 {
2916 TRACE("jcIsConverted", "Enter")
2917
2918 if (cl < 0 || cl > buf->nClause) {
2919 /* cl == jcNClause $B$N$H$-$r%(%i!<$K$7$F$b$$$$$N$@$1$l$I(B
2920 * $B%+%l%s%HJ8@a$,(B jcNClause $B$N$H$-$,$"$k$N$G(B
2921 * $B%(%i!<$H$O$7$J$$$3$H$K$7$?(B
2922 */
2923 return -1;
2924 }
2925 return (buf->clauseInfo[cl].conv != 0);
2926 }
2927
2928 /* jcMove -- $B%I%C%H!&%+%l%s%HJ8@a$r0\F0$9$k(B */
2929 int
2930 jcMove(buf, small, dir)
2931 jcConvBuf *buf;
2932 int small;
2933 int dir;
2934 {
2935 jcClause *clp = buf->clauseInfo + buf->curClause;
2936 int i;
2937
2938 TRACE("jcMove", "Enter")
2939
2940 if (!clp->conv) {
2941 /* $B%+%l%s%HJ8@a$,JQ49$5$l$F$$$J$$$N$G!"%I%C%H$N0\F0$K$J$k(B */
2942 if (dir == JC_FORWARD) {
2943 if (buf->curClause == buf->nClause) {
2944 /* $B$9$G$K0lHV:G8e$K$$$k(B */
2945 jcErrno = JE_CANTMOVE;
2946 return -1;
2947 } else if (buf->dot == (clp + 1)->kanap) {
2948 /* $B%I%C%H$,%+%l%s%HJ8@a$N:G8e$K$"$k$N$G(B
2949 * $BJ8@a0\F0$9$k(B
2950 */
2951 goto clausemove;
2952 } else {
2953 buf->dot++;
2954 }
2955 } else {
2956 if (buf->dot == clp->kanap) {
2957 /* $B%I%C%H$,%+%l%s%HJ8@a$N@hF,$K$"$k$N$G(B
2958 * $BJ8@a0\F0$9$k(B
2959 */
2960 goto clausemove;
2961 } else
2962 buf->dot--;
2963 }
2964 return 0;
2965 }
2966
2967 clausemove: /* $BJ8@a0\F0(B */
2968 clp = buf->clauseInfo;
2969
2970 if (small) {
2971 /* $B>.J8@aC10L$N0\F0(B */
2972 if (dir == JC_FORWARD) {
2973 if (buf->curClause == buf->nClause) {
2974 jcErrno = JE_CANTMOVE;
2975 return -1;
2976 }
2977 buf->curClause++;
2978 if (buf->curClause >= buf->curLCEnd) {
2979 /* $BBgJ8@a$b0\F0$9$k(B */
2980 buf->curLCStart = buf->curLCEnd;
2981 for (i = buf->curLCStart + 1;
2982 i <= buf->nClause && !clp[i].ltop; i++)
2983 ;
2984 buf->curLCEnd = i;
2985 }
2986 } else { /* JC_BACKWARD */
2987 if (buf->curClause == 0) {
2988 jcErrno = JE_CANTMOVE;
2989 return -1;
2990 }
2991 buf->curClause--;
2992 if (buf->curClause < buf->curLCStart) {
2993 /* $BBgJ8@a$b0\F0$9$k(B */
2994 buf->curLCEnd = buf->curLCStart;
2995 for (i = buf->curClause; !clp[i].ltop; i--)
2996 ;
2997 buf->curLCStart = i;
2998 }
2999 }
3000 } else {
3001 /* $BBgJ8@aC10L$N0\F0(B */
3002 if (dir == JC_FORWARD) {
3003 if (buf->curLCStart == buf->nClause) {
3004 jcErrno = JE_CANTMOVE;
3005 return -1;
3006 }
3007 buf->curLCStart = buf->curClause = buf->curLCEnd;
3008 for (i = buf->curLCStart + 1;
3009 i <= buf->nClause && !clp[i].ltop; i++)
3010 ;
3011 buf->curLCEnd = i;
3012 } else {
3013 if (buf->curLCStart == 0) {
3014 jcErrno = JE_CANTMOVE;
3015 return -1;
3016 }
3017 buf->curLCEnd = buf->curLCStart;
3018 for (i = buf->curLCEnd - 1; !clp[i].ltop; i--)
3019 ;
3020 buf->curLCStart = buf->curClause = i;
3021 }
3022 }
3023
3024 /* $BJ8@a0\F0$7$?$i%I%C%H$O$=$NJ8@a$N@hF,$K0\F0$9$k(B */
3025 buf->dot = clp[buf->curClause].kanap;
3026
3027 return 0;
3028 }
3029
3030 /* jcTop -- $B%I%C%H!&%+%l%s%HJ8@a$rJ8$N@hF,$K0\F0$9$k(B */
3031 int
3032 jcTop(buf)
3033 jcConvBuf *buf;
3034 {
3035 TRACE("jcTop", "Enter")
3036
3037 /* $B%+%l%s%HJ8@a$r(B 0 $B$K$7$F%I%C%H$r@hF,$K;}$C$F$/$k(B */
3038 setCurClause(buf, 0);
3039 buf->dot = buf->kanaBuf;
3040
3041 return 0;
3042 }
3043
3044 /* jcBottom -- $B%I%C%H!&%+%l%s%HJ8@a$rJ8$N:G8e$K0\F0$9$k(B */
3045 int
3046 jcBottom(buf)
3047 jcConvBuf *buf;
3048 {
3049 TRACE("jcBottom", "Enter")
3050
3051 /*
3052 * Ver3 $BBP1~$N(B jclib $B$G$O!"%+%l%s%HJ8@a$r(B jcNClause $B$K$7$F(B
3053 * $B%I%C%H$r:G8e$K;}$C$F$/$k$@$1$@$C$?(B
3054 * $B$3$l$@$H!":G8e$NJ8@a$K$+$J$rF~$l$F$$$F!"%+!<%=%k$rF0$+$7$F(B
3055 * jcBottom() $B$G85$KLa$C$F:F$S$+$J$rF~$l$k$H!"JL$NJ8@a$K(B
3056 * $B$J$C$F$7$^$&(B
3057 * $B$=$3$G!":G8e$NJ8@a$,L5JQ49>uBV$N;~$K$O!"%+%l%s%HJ8@a$O(B
3058 * buf->nClause $B$G$O$J$/!"(Bbuf->nClause - 1 $B$K$9$k$3$H$K$9$k(B
3059 */
3060 if (buf->nClause > 0 && !buf->clauseInfo[buf->nClause - 1].conv) {
3061 buf->curClause = buf->curLCStart = buf->nClause - 1;
3062 buf->curLCEnd = buf->nClause;
3063 } else {
3064 buf->curClause = buf->curLCStart = buf->nClause;
3065 buf->curLCEnd = buf->nClause + 1;
3066 }
3067 buf->dot = buf->kanaEnd;
3068 return 0;
3069 }
3070
3071 /* jcInsertChar -- $B%I%C%H$N0LCV$K0lJ8;zA^F~$9$k(B */
3072 int
3073 jcInsertChar(buf, c)
3074 jcConvBuf *buf;
3075 int c;
3076 {
3077 jcClause *clp;
3078 wchar *dot, *dispdot;
3079 int ksizenew, dsizenew;
3080
3081 TRACE("jcInsertChar", "Enter")
3082
3083 CHECKFIXED(buf);
3084
3085 /* $BA48uJdJ8@a$,%+%l%s%HBgJ8@a$K$"$l$PL58z$K$9$k(B */
3086 checkCandidates(buf, buf->curLCStart, buf->curLCEnd);
3087
3088 /*
3089 * $B!&%+%l%s%HJ8@aHV9f$,(B buf->nClause $B$G$"$k>l9g(B
3090 * - $B$3$l$O%I%C%H$,:G8e$NJ8@a$N<!$K$"$k$H$$$&$3$H$J$N$G(B
3091 * $B?7$7$$J8@a$r:n$k(B
3092 * $B!&JQ49:Q$_$NJ8@a$N>l9g(B
3093 * - $BL5JQ49$N>uBV$KLa$7$F$+$iA^F~(B
3094 * $B!&$=$NB>(B
3095 * - $BC1$KA^F~$9$l$P$h$$(B
3096 */
3097 clp = buf->clauseInfo + buf->curLCStart;
3098 if (buf->curLCStart == buf->nClause) {
3099 /* $B?7$?$KJ8@a$r:n$k(B */
3100 /* clauseInfo $B$N%5%$%:$N%A%'%C%/(B */
3101 if (buf->nClause >= buf->clauseSize &&
3102 resizeCInfo(buf, buf->nClause + 1) < 0) {
3103 return -1;
3104 }
3105 /* buf->nClause $B$N%"%C%W%G!<%H$H(B clauseInfo $B$N@_Dj(B */
3106 buf->nClause += 1;
3107 clp = buf->clauseInfo + buf->nClause;
3108 clp->conv = 0;
3109 clp->ltop = 1;
3110 clp->kanap = buf->kanaEnd;
3111 clp->dispp = buf->displayEnd;
3112 } else if (clp->conv) {
3113 /* $BL5JQ49>uBV$K$9$k(B */
3114 if (unconvert(buf, buf->curLCStart, buf->curLCEnd) < 0)
3115 return -1;
3116 buf->curClause = buf->curLCStart;
3117 buf->curLCEnd = buf->curLCStart + 1;
3118 DotSet(buf);
3119 }
3120
3121 clp = buf->clauseInfo + buf->curLCStart;
3122
3123 /* $B%P%C%U%!$NBg$-$5$N%A%'%C%/(B */
3124 ksizenew = (buf->kanaEnd - buf->kanaBuf) + 1;
3125 dsizenew = (buf->displayEnd - buf->displayBuf) + 1;
3126 if ((ksizenew > buf->bufferSize || dsizenew > buf->bufferSize) &&
3127 resizeBuffer(buf, ksizenew > dsizenew ? ksizenew : dsizenew) < 0) {
3128 return -1;
3129 }
3130
3131 /* $B$+$J%P%C%U%!$r%"%C%W%G!<%H(B */
3132 dot = buf->dot;
3133 /* $B%+%l%s%HJ8@a$N8e$m$r0lJ8;z$:$i$9(B */
3134 moveKBuf(buf, buf->curLCStart + 1, 1);
3135 /* $B%+%l%s%HJ8@aFb$N%I%C%H0J9_$r0lJ8;z$:$i$9(B */
3136 (void)bcopy((char *)dot, (char *)(dot + 1),
3137 ((clp + 1)->kanap - dot) * sizeof(wchar));
3138 /* $BA^F~(B */
3139 *dot = c;
3140
3141 /* $BI=<(%P%C%U%!$r%"%C%W%G!<%H(B */
3142 dispdot = clp->dispp + (dot - clp->kanap);
3143 /* $B%+%l%s%HJ8@a$N8e$m$r0lJ8;z$:$i$9(B */
3144 moveDBuf(buf, buf->curLCStart + 1, 1);
3145 /* $B%+%l%s%HJ8@aFb$N%I%C%H0J9_$r0lJ8;z$:$i$9(B */
3146 (void)bcopy((char *)dispdot, (char *)(dispdot + 1),
3147 ((clp + 1)->dispp - dispdot) * sizeof(wchar));
3148 /* $BA^F~(B */
3149 *dispdot = c;
3150
3151 /* $B%I%C%H$r99?7(B */
3152 buf->dot++;
3153
3154 return 0;
3155 }
3156
3157 /* jcDeleteChar -- $B%I%C%H$NA0$^$?$O8e$m$N0lJ8;z$r:o=|$9$k(B */
3158 int
3159 jcDeleteChar(buf, prev)
3160 jcConvBuf *buf;
3161 int prev;
3162 {
3163 jcClause *clp;
3164 wchar *dot, *dispdot;
3165
3166 TRACE("jcDeleteChar", "Enter")
3167
3168 CHECKFIXED(buf);
3169
3170 clp = buf->clauseInfo;
3171 if (buf->nClause == 0) {
3172 /* $BJ8@a?t$,(B 0$B!"$D$^$j2?$bF~$C$F$$$J$$;~(B:
3173 * - $B%(%i!<(B
3174 */
3175 jcErrno = JE_CANTDELETE;
3176 return -1;
3177 } else if (buf->curClause >= buf->nClause) {
3178 /* $B%+%l%s%HJ8@a$,:G8e$NJ8@a$N<!$K$"$k;~(B:
3179 * - prev $B$G$"$l$P!"A0$NJ8@a$N:G8e$NJ8;z$r:o=|(B
3180 * $B%+%l%s%HJ8@a$OA0$NJ8@a$K0\F0$9$k(B
3181 * $BI,MW$J$i$PA0$NJ8@a$rL5JQ49$KLa$7$F$+$i:o=|$9$k(B
3182 * $BA0$NJ8@a$,$J$$$3$H$O$"$jF@$J$$(B
3183 * - !prev $B$J$i$P%(%i!<(B
3184 */
3185 if (!prev) {
3186 jcErrno = JE_CANTDELETE;
3187 return -1;
3188 }
3189 (void)jcMove(buf, 0, JC_BACKWARD);
3190 } else if (clp[buf->curLCStart].conv) {
3191 /* $B%+%l%s%HJ8@a$,JQ49$5$l$F$$$k;~(B:
3192 * - prev $B$G$"$l$PA0$NJ8@a$N:G8e$NJ8;z$r:o=|(B
3193 * $B%+%l%s%HJ8@a$OA0$NJ8@a$K0\F0$9$k(B
3194 * $BI,MW$J$i$PA0$NJ8@a$rL5JQ49$KLa$7$F$+$i:o=|$9$k(B
3195 * $B%+%l%s%HJ8@a$,@hF,$J$i$P%(%i!<(B
3196 * - !prev $B$J$i%+%l%s%HJ8@a$rL5JQ49$KLa$7$F!"J8@a$N(B
3197 * $B:G=i$NJ8;z$r:o=|(B
3198 */
3199 if (prev) {
3200 if (buf->curLCStart == 0) {
3201 jcErrno = JE_CANTDELETE;
3202 return -1;
3203 }
3204 (void)jcMove(buf, 0, JC_BACKWARD);
3205 }
3206 } else {
3207 /* $B%+%l%s%HJ8@a$,JQ49$5$l$F$$$J$$;~(B:
3208 * - prev $B$G$"$l$P%I%C%H$NA0$NJ8;z$r:o=|(B
3209 * $B$?$@$7%I%C%H$,J8@a$N@hF,$K$"$l$PA0$NJ8@a$N(B
3210 * $B:G8e$NJ8;z$r:o=|(B
3211 * $B$=$N;~$K$O%+%l%s%HJ8@a$OA0$NJ8@a$K0\F0$9$k(B
3212 * $BI,MW$J$i$PA0$NJ8@a$rL5JQ49$KLa$7$F$+$i:o=|$9$k(B
3213 * $B%+%l%s%HJ8@a$,@hF,$J$i$P%(%i!<(B
3214 * - !prev $B$J$i%I%C%H$N<!$NJ8;z$r:o=|(B
3215 * $B%I%C%H$,J8@a$N:G8e$NJ8;z$N<!$K$"$l$P%(%i!<(B
3216 */
3217 if (prev) {
3218 if (buf->dot == clp[buf->curLCStart].kanap) {
3219 if (buf->curLCStart == 0) {
3220 jcErrno = JE_CANTDELETE;
3221 return -1;
3222 }
3223 (void)jcMove(buf, 0, JC_BACKWARD);
3224 }
3225 } else {
3226 if (buf->dot == clp[buf->curLCEnd].kanap) {
3227 jcErrno = JE_CANTDELETE;
3228 return -1;
3229 }
3230 }
3231 }
3232
3233 if (buf->clauseInfo[buf->curLCStart].conv) {
3234 /* $B%+%l%s%HJ8@a$,JQ49:Q$_$G$"$l$PL5JQ49$KLa$9(B */
3235 if (jcUnconvert(buf) < 0)
3236 return -1;
3237 /* prev $B$G$"$l$PJ8@a$N:G8e$NJ8;z!"$=$&$G$J$1$l$PJ8@a$N(B
3238 * $B@hF,$NJ8;z$r:o=|$9$k(B
3239 */
3240 if (prev) {
3241 buf->dot = buf->clauseInfo[buf->curLCEnd].kanap - 1;
3242 } else {
3243 buf->dot = buf->clauseInfo[buf->curLCStart].kanap;
3244 }
3245 } else {
3246 /* prev $B$J$i%I%C%H$r#1J8;zLa$7$F$*$/(B
3247 * $B$3$&$9$l$P%I%C%H$N8e$m$NJ8;z$r:o=|$9$k$3$H$K$J$k(B
3248 * $B:o=|$7=*$o$C$?$H$-$K%I%C%H$rF0$+$9I,MW$b$J$$(B
3249 */
3250 if (prev)
3251 buf->dot--;
3252 }
3253
3254 clp = buf->clauseInfo + buf->curLCStart;
3255
3256 /* $B$+$J%P%C%U%!$r%"%C%W%G!<%H(B */
3257 dot = buf->dot;
3258 /* $B%+%l%s%HJ8@aFb$N%I%C%H0J9_$r0lJ8;z$:$i$9(B */
3259 (void)bcopy((char *)(dot + 1), (char *)dot,
3260 ((clp + 1)->kanap - (dot + 1)) * sizeof(wchar));
3261 /* $B%+%l%s%HJ8@a$N8e$m$r0lJ8;z$:$i$9(B */
3262 moveKBuf(buf, buf->curLCEnd, -1);
3263
3264 /* $BI=<(%P%C%U%!$r%"%C%W%G!<%H(B */
3265 dispdot = clp->dispp + (dot - clp->kanap);
3266 /* $B%+%l%s%HJ8@aFb$N%I%C%H0J9_$r0lJ8;z$:$i$9(B */
3267 (void)bcopy((char *)(dispdot + 1), (char *)dispdot,
3268 ((clp + 1)->dispp - (dispdot + 1)) * sizeof(wchar));
3269 /* $B%+%l%s%HJ8@a$N8e$m$r0lJ8;z$:$i$9(B */
3270 moveDBuf(buf, buf->curLCEnd, -1);
3271
3272 /* $B%+%l%s%HJ8@a$ND9$5$,#1$@$C$?>l9g$K$OJ8@a$,#18:$k$3$H$K$J$k(B */
3273 if (clp->kanap == (clp + 1)->kanap) {
3274 /* $BJ8@a$,$J$/$J$C$F$7$^$C$?(B */
3275 moveCInfo(buf, buf->curLCEnd, -1);
3276 setCurClause(buf, buf->curLCStart);
3277 DotSet(buf);
3278 }
3279
3280 return 0;
3281 }
3282
3283 /* jcKillLine -- $B%I%C%H0J9_$r:o=|$9$k(B */
3284 int
3285 jcKillLine(buf)
3286 jcConvBuf *buf;
3287 {
3288 int cc = buf->curClause;
3289
3290 TRACE("jcKillLine", "Enter")
3291
3292 CHECKFIXED(buf);
3293
3294 /* $BF~NOCf$NJ8@a$,$J$$$+!"%I%C%H$,:G8e$NJ8@a$N<!$K$"$l$P!"%(%i!<(B */
3295 if (buf->nClause <= 0 || cc >= buf->nClause) {
3296 jcErrno = JE_CANTDELETE;
3297 return -1;
3298 }
3299
3300 #ifdef DEBUG_WNNLIB
3301 showBuffers(buf, "before jcKillLine");
3302 #endif
3303
3304 /* $B%I%C%H$,F~NO$N@hF,$G$"$l$P!"(BjcClear $B$r8F=P$7$F=*$j(B */
3305 if (buf->dot == buf->kanaBuf)
3306 return jcClear(buf);
3307
3308 /*
3309 * $B%I%C%H0J9_$r:o=|$9$k(B
3310 * $B$H$$$C$F$b!"C1$KJ8@a>pJs$H%]%$%s%?$rJQ99$9$l$PNI$$(B
3311 */
3312 checkCandidates(buf, cc, buf->nClause);
3313 if (buf->clauseInfo[cc].conv) {
3314 /* $BJQ49$5$l$F$$$l$P!"%+%l%s%HJ8@a$r4^$a$F:o=|(B */
3315 buf->kanaEnd = buf->dot = buf->clauseInfo[cc].kanap;
3316 buf->displayEnd = buf->clauseInfo[cc].dispp;
3317
3318 /* $B%+%l%s%HJ8@a$rKvHxJ8@a$K0\$9(B */
3319 buf->nClause = buf->curClause = buf->curLCStart = cc;
3320 buf->curLCEnd = cc + 1;
3321 } else {
3322 /* $BL$JQ49$J$i$P!"%I%C%H0J9_$r:o=|(B */
3323 buf->kanaEnd = buf->dot;
3324 buf->displayEnd = buf->clauseInfo[cc].dispp
3325 + (buf->dot - buf->clauseInfo[cc].kanap);
3326
3327 /* $B%+%l%s%HJ8@a$O$=$N$^$^$G!"KvHx$@$1$r5$$K$9$l$P$h$$(B */
3328 cc++;
3329 buf->nClause = buf->curLCEnd = cc;
3330 }
3331
3332 /* $B6u$NKvHxJ8@a$N@_Dj$r$9$k(B */
3333 buf->clauseInfo[cc].kanap = buf->kanaEnd;
3334 buf->clauseInfo[cc].dispp = buf->displayEnd;
3335 buf->clauseInfo[cc].conv = 0;
3336 buf->clauseInfo[cc].ltop = 1;
3337
3338 /* $B%+%l%s%HJ8@a$H$=$l0J9_$N(B jllib $B$NJ8@a>pJs$bL58z$K$9$k(B */
3339 if (jl_bun_suu(buf->wnn) > cc)
3340 jl_kill(buf->wnn, cc, -1);
3341
3342 #ifdef DEBUG_WNNLIB
3343 showBuffers(buf, "after jcKillLine");
3344 #endif
3345 return 0;
3346 }
3347
3348 /* jcChangeClause -- $B%+%l%s%HBgJ8@a$r;XDj$5$l$?J8;zNs$GCV$-49$($k(B */
3349 int
3350 jcChangeClause(buf, str)
3351 jcConvBuf *buf;
3352 wchar *str;
3353 {
3354 jcClause *clps, *clpe;
3355 wchar *p;
3356 int newlen;
3357 int oklen, odlen;
3358 int ksize, dsize;
3359
3360 TRACE("jcChangeClause", "Enter")
3361
3362 CHECKFIXED(buf);
3363
3364 clps = buf->clauseInfo + buf->curLCStart;
3365 clpe = buf->clauseInfo + buf->curLCEnd;
3366
3367 newlen = 0;
3368 p = str;
3369 while (*p++)
3370 newlen++;
3371
3372 /* $B$+$J%P%C%U%!$HI=<(%P%C%U%!$N%5%$%:$rD4$Y$F!"(B
3373 * $BF~$i$J$+$C$?$iBg$-$/$9$k(B
3374 */
3375 if (buf->curLCStart < buf->nClause) {
3376 oklen = clpe->kanap - clps->kanap;
3377 odlen = clpe->dispp - clps->dispp;
3378 } else {
3379 oklen = odlen = 0;
3380 }
3381 ksize = (buf->kanaEnd - buf->kanaBuf) + newlen - oklen;
3382 dsize = (buf->displayEnd - buf->displayBuf) + newlen - odlen;
3383 if (ksize > buf->bufferSize || dsize > buf->bufferSize) {
3384 if (resizeBuffer(buf, ksize > dsize ? ksize : dsize) < 0)
3385 return -1;
3386 }
3387
3388 /* curLCStart $B$,(B nClause $B$KEy$7$$;~$@$1!"?7$?$KJ8@a$,:n$i$l$k(B */
3389 if (buf->curLCStart == buf->nClause) {
3390 /* clauseInfo $B$NBg$-$5$rD4$Y$k(B*/
3391 if (buf->nClause + 1 > buf->clauseSize) {
3392 if (resizeCInfo(buf, buf->nClause + 1) < 0)
3393 return -1;
3394 }
3395 /* $B?7$?$K$G$-$?(B clauseInfo $B$K$O!"(BnClause $BHVL\(B
3396 * ($B$D$^$j:G8e$N(B clauseInfo) $B$NFbMF$r%3%T!<$7$F$*$/(B
3397 */
3398 clpe = buf->clauseInfo + buf->nClause + 1;
3399 *clpe = *(clpe - 1);
3400
3401 buf->nClause++;
3402 }
3403
3404 clps = buf->clauseInfo + buf->curLCStart;
3405 clpe = buf->clauseInfo + buf->curLCEnd;
3406
3407 /* $B$+$J%P%C%U%!$NJQ99(B */
3408 /* $B$^$:$O8e$m$r0\F0$5$;$k(B */
3409 moveKBuf(buf, buf->curLCEnd, newlen - oklen);
3410 /* str $B$r%3%T!<(B */
3411 (void)bcopy((char *)str, (char *)clps->kanap,
3412 newlen * sizeof(wchar));
3413 /* $BI=<(%P%C%U%!$NJQ99(B */
3414 /* $B$^$:$O8e$m$r0\F0$5$;$k(B */
3415 moveDBuf(buf, buf->curLCEnd, newlen - odlen);
3416 /* str $B$r%3%T!<(B */
3417 (void)bcopy((char *)str, (char *)clps->dispp,
3418 newlen * sizeof(wchar));
3419
3420 /* clauseInfo $B$NJQ99(B */
3421 /* $B$^$:$O8e$m$r0\F0$5$;$k(B */
3422 if (clpe > clps + 1) {
3423 (void)bcopy((char *)clpe, (char *)(clps + 1),
3424 (buf->nClause + 1 - buf->curLCEnd) *
3425 sizeof(jcClause));
3426 }
3427 clps->conv = 0;
3428 clps->ltop = 1;
3429 (clps + 1)->ltop = 1;
3430
3431 return 0;
3432 }
3433
3434 /* jcSaveDic -- $B<-=q!&IQEY%U%!%$%k$r%;!<%V$9$k(B */
3435 int
3436 jcSaveDic(buf)
3437 jcConvBuf *buf;
3438 {
3439 TRACE("jcSaveDic", "Enter")
3440
3441 return jl_dic_save_all(buf->wnn);
3442 }
3443
3444 /* $B%5!<%P$H$N@\B3$N$?$a$N4X?t72(B */
3445
3446 struct wnn_buf *
3447 jcOpen(server, envname, override, rcfile, errmsg, confirm, timeout)
3448 char *server;
3449 char *envname;
3450 int override;
3451 char *rcfile;
3452 void (*errmsg)();
3453 int (*confirm)();
3454 int timeout;
3455 {
3456 return jcOpen2(server, envname, override, rcfile, rcfile, errmsg, confirm, timeout);
3457 }
3458
3459 struct wnn_buf *
3460 jcOpen2(server, envname, override, rcfile4, rcfile6, errmsg, confirm, timeout)
3461 char *server;
3462 char *envname;
3463 int override;
3464 char *rcfile4; /* wnnenvrc for Wnn4 */
3465 char *rcfile6; /* wnnenvrc for Wnn6 */
3466 void (*errmsg)();
3467 int (*confirm)();
3468 int timeout;
3469 {
3470 struct wnn_buf *wnnbuf;
3471 struct wnn_env *wnnenv;
3472 char *rcfile;
3473 int env_exists;
3474 int wnn_version;
3475 extern char *getenv();
3476
3477 TRACE("jcOpen2", "Enter")
3478
3479 /* $B%5!<%PL>$,(B NULL $B$^$?$O6uJ8;zNs$@$C$?>l9g$O4D6-JQ?t(B JSERVER $B$r;HMQ$9$k(B */
3480 if (server == NULL || server[0] == '\0') {
3481 server = getenv("JSERVER");
3482 }
3483
3484 /* $B4D6-L>$,6uJ8;zNs$@$C$?>l9g$O!"%f!<%6L>$r;HMQ$9$k(B */
3485 if (envname != NULL && *envname == 0) {
3486 struct passwd *p = getpwuid(getuid());
3487
3488 if (p != NULL) envname = p->pw_name;
3489 }
3490
3491 /*
3492 * jserver $B$N%P!<%8%g%s$K$h$C$F(B wnnrc $B$rJQ$($?$$$N$@$,!"(B
3493 * $B%P!<%8%g%s$rD4$Y$k$?$a$K$O$^$:@\B3$7$J$/$F$O$J$i$J$$!#(B
3494 * $B$=$3$G(B wnnrc $B0z?t$r(B NULL $B$K$7$F@\B3$9$k!#(B
3495 */
3496 #if JSERVER_VERSION > 0x4030
3497 wnnbuf = jl_open_lang(envname, server, "ja_JP",
3498 NULL, confirm, errmsg, timeout);
3499 #else
3500 wnnbuf = jl_open(envname, server, NULL, confirm, errmsg, timeout);
3501 #endif
3502
3503 /*
3504 * $B!&%P%C%U%!$,:n$l$J$+$C$?(B
3505 * $B!&(Bjserver $B$K@\B3$G$-$J$+$C$?(B
3506 * $B!&(Bwnnrc $B%U%!%$%k$N;XDj$,$J$$(B ($B$D$^$j=i4|2=$7$J$$(B)
3507 * $B>l9g$K$O$3$l$G=*$j!#(B
3508 */
3509 if (wnnbuf == NULL ||
3510 !jl_isconnect(wnnbuf) ||
3511 (rcfile4 == NULL && rcfile6 == NULL)) {
3512 return wnnbuf;
3513 }
3514
3515 wnnenv = jl_env_get(wnnbuf);
3516
3517 /*
3518 * $B0JA0$+$i4D6-$,B8:_$7$F$$$?$+$I$&$+$H!"%5!<%P$N%P!<%8%g%s$rD4$Y$k!#(B
3519 * $B4D6-$,B8:_$7$F$$$?$+$I$&$+$O(B jl_fuzokugo_get $B$G(B ($B$D$^$jIUB08l(B
3520 * $B<-=q$,@_Dj$5$l$F$$$k$+$I$&$+$G(B) $BH=CG$9$k!#(Bjl_open_lang $B$O4D6-$,(B
3521 * $B$J$1$l$P:n$C$F$7$^$&$?$a!"(Bjs_env_exist $B$O;H$($J$$!#(B
3522 */
3523 {
3524 char fzk[1024];
3525 int serv_ver, lib_ver;
3526
3527 if (ki2_jl_fuzokugo_get(wnnbuf, fzk, 1024) != -1) {
3528 env_exists = 1;
3529 TRACE("jcOpen2", "env exists");
3530 } else {
3531 env_exists = 0;
3532 TRACE("jcOpen2", "no env");
3533 }
3534 if (js_version(wnnenv->js_id, &serv_ver, &lib_ver) != -1 &&
3535 serv_ver >= 0x4f00) {
3536 wnn_version = 6;
3537 TRACE("jcOpen2", "Wnn6");
3538 } else {
3539 wnn_version = 4;
3540 TRACE("jcOpen2", "Wnn4");
3541 }
3542 }
3543
3544 /* wnnrc $B$NA*Br(B */
3545 rcfile = (wnn_version == 4) ? rcfile4 : rcfile6;
3546
3547 /*
3548 * $B4D6-$,$9$G$KB8:_$7$+$D4D6-$N>e=q$-$,;XDj$5$l$F$$$J$$!"$"$k$$$O(B
3549 * rcfile $B$,(B NULL $B$N>l9g$K$O$3$l$G=*$j!#(B
3550 */
3551 if ((env_exists && !override) || rcfile == NULL) return wnnbuf;
3552
3553 /*
3554 * wnnrc $B$,6uJ8;zNs$@$C$?>l9g$O!"%G%U%)%k%H$r;HMQ$9$k!#(B
3555 * 1. $B4D6-JQ?t(B WNNENVRC4 $B$^$?$O(B WNNENVRC6
3556 * 2. $B4D6-JQ?t(B WNNENVRC
3557 * 3. $B%7%9%F%`$N%G%U%)%k%H(B
3558 * $B$N=g$G8!:w$9$k!#:G8e$N$O$A$g$C$H$$$$$+$2$s!#(B
3559 */
3560 if (*rcfile == '\0') {
3561 rcfile = getenv((wnn_version == 4) ? "WNNENVRC4" : "WNNENVRC6");
3562 if (rcfile == NULL || access(rcfile, R_OK) != 0) {
3563 rcfile = getenv("WNNENVRC");
3564 }
3565 if (rcfile == NULL || access(rcfile, R_OK) != 0) {
3566 if (wnn_version == 6) {
3567 #ifdef WNN6
3568 rcfile = "@DEFAULT";
3569 #else
3570 rcfile = "wnnenvrc";
3571 #endif
3572 } else {
3573 #if defined(LIBDIR) && JSERVER_VERSION > 0x4030
3574 static char envrc[256];
3575 rcfile = envrc;
3576 (void)sprintf(rcfile, "%s/ja_JP/wnnenvrc", LIBDIR);
3577 if (access(rcfile, R_OK) != 0)
3578 (void) sprintf(rcfile, "%s/wnnenvrc", LIBDIR);
3579 #else
3580 rcfile = "wnnenvrc";
3581 #endif
3582 }
3583 }
3584 }
3585
3586 /* $B4D6-@_Dj$9$k(B */
3587 (void)jl_set_env_wnnrc(wnnenv, rcfile, confirm, errmsg);
3588
3589 return wnnbuf;
3590 }
3591
3592 int
3593 jcClose(wnnbuf)
3594 struct wnn_buf *wnnbuf;
3595 {
3596 TRACE("jcClose", "Enter")
3597
3598 if (wnnbuf != NULL)
3599 jl_close(wnnbuf);
3600 return 0;
3601 }
3602
3603 int
3604 jcIsConnect(wnnbuf)
3605 struct wnn_buf *wnnbuf;
3606 {
3607 TRACE("jcIsConnect", "Enter")
3608
3609 if (wnnbuf == NULL)
3610 return 0;
3611 return jl_isconnect(wnnbuf);
3612 }
3613
3614 #ifdef DEBUG_WNNLIB
3615 static void
3616 printBuffer(start, end)
3617 wchar *start;
3618 wchar *end;
3619 {
3620 wchar wc;
3621
3622 while (start < end) {
3623 wc = *start++;
3624 if (wc >= 0200) {
3625 putc((wc >> 8) & 0xff, stderr);
3626 wc &= 0xff;
3627 } else if (wc < 040 || wc == 0177) {
3628 putc('^', stderr);
3629 wc ^= 0100;
3630 } else if (wc == '^' || wc == '\\') {
3631 putc('\\', stderr);
3632 }
3633 putc(wc, stderr);
3634 }
3635 }
3636
3637 static void
3638 showBuffers(buf, tag)
3639 jcConvBuf *buf;
3640 char *tag;
3641 {
3642 int i;
3643 jcClause *clp = buf->clauseInfo;
3644 wchar ws[512];
3645
3646 fprintf(stderr, "Buffer Info [%s]\n", tag);
3647 fprintf(stderr, "nClause = %d, curClause = %d [%d, %d], ",
3648 buf->nClause, buf->curClause, buf->curLCStart, buf->curLCEnd);
3649
3650 if (buf->dot < buf->kanaBuf) {
3651 fprintf(stderr, "dot < 0\n");
3652 } else if (buf->dot > buf->kanaEnd) {
3653 fprintf(stderr, "dot > 0\n");
3654 } else if (buf->nClause == 0) {
3655 fprintf(stderr, "dot == 0\n");
3656 } else {
3657 for (i = 0; i < buf->nClause; i++) {
3658 if (buf->dot <= clp[i].kanap)
3659 break;
3660 }
3661 if (buf->dot < clp[i].kanap)
3662 i--;
3663 fprintf(stderr, "dot = %d.%d\n", i, buf->dot - clp[i].kanap);
3664 }
3665
3666 for (i = 0; i < buf->nClause; i++) {
3667 fprintf(stderr,
3668 "clause[%d]: conv = %d, ltop = %d",
3669 i, clp->conv, clp->ltop);
3670 if (clp->conv == 1) {
3671 fprintf(stderr, " [%d]", jl_dai_top(buf->wnn, i));
3672 }
3673 fprintf(stderr, "\n");
3674 fprintf(stderr, "clause[%d]: Kana = '", i);
3675 printBuffer(clp->kanap, (clp + 1)->kanap);
3676 fprintf(stderr, "'\n");
3677 if (clp->conv == 1) {
3678 fprintf(stderr, "clause[%d]: Yomi = '", i);
3679 (void)ki2_jl_get_yomi(buf->wnn, i, i + 1, ws, 512);
3680 printBuffer(ws, ws + jl_yomi_len(buf->wnn, i, i + 1));
3681 fprintf(stderr, "'\n");
3682 }
3683 fprintf(stderr, "clause[%d]: Disp = '", i);
3684 printBuffer(clp->dispp, (clp + 1)->dispp);
3685 fprintf(stderr, "'\n");
3686 if (clp->conv == 1) {
3687 fprintf(stderr, "clause[%d]: Conv = '", i);
3688 (void)ki2_jl_get_kanji(buf->wnn, i, i + 1, ws, 512);
3689 printBuffer(ws, ws + jl_kanji_len(buf->wnn, i, i + 1));
3690 fprintf(stderr, "'\n");
3691 }
3692 clp++;
3693 }
3694 }
3695 #endif /* DEBUG_WNNLIB */