0
|
1 /*
|
|
2 * $Id: do_hindo_s.c,v 1.8 2002/06/22 13:25:45 hiroo Exp $
|
|
3 */
|
|
4
|
|
5 /*
|
|
6 * FreeWnn is a network-extensible Kana-to-Kanji conversion system.
|
|
7 * This file is part of FreeWnn.
|
|
8 *
|
|
9 * Copyright Kyoto University Research Institute for Mathematical Sciences
|
|
10 * 1987, 1988, 1989, 1990, 1991, 1992
|
|
11 * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999
|
|
12 * Copyright ASTEC, Inc. 1987, 1988, 1989, 1990, 1991, 1992
|
|
13 * Copyright FreeWnn Project 1999, 2000
|
|
14 *
|
|
15 * Maintainer: FreeWnn Project <freewnn@tomo.gr.jp>
|
|
16 *
|
|
17 * This program is free software; you can redistribute it and/or modify
|
|
18 * it under the terms of the GNU General Public License as published by
|
|
19 * the Free Software Foundation; either version 2 of the License, or
|
|
20 * (at your option) any later version.
|
|
21 *
|
|
22 * This program is distributed in the hope that it will be useful,
|
|
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
25 * GNU General Public License for more details.
|
|
26 *
|
|
27 * You should have received a copy of the GNU General Public License
|
|
28 * along with this program; if not, write to the Free Software
|
|
29 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
30 */
|
|
31
|
|
32 #if defined(HAVE_CONFIG_H)
|
|
33 #include <config.h>
|
|
34 #endif
|
|
35
|
|
36 #if STDC_HEADERS
|
|
37 # include <stdlib.h> /* rand(), drand48() */
|
|
38 #endif
|
|
39
|
|
40 #include "commonhd.h"
|
|
41 #include "jslib.h"
|
|
42 #include "kaiseki.h"
|
|
43 #include "jdata.h"
|
|
44 #include "de_header.h"
|
|
45
|
|
46 static int hindo_set ();
|
|
47
|
|
48 void
|
|
49 js_hindo_set ()
|
|
50 {
|
|
51 int env_id, dic, entry, ima, hindo, x;
|
|
52 int err = 0;
|
|
53 if ((env_id = envhandle ()) == -1)
|
|
54 err = -1;
|
|
55 dic = get4_cur ();
|
|
56 entry = get4_cur ();
|
|
57 ima = get4_cur ();
|
|
58 hindo = get4_cur ();
|
|
59 if (err == -1)
|
|
60 {
|
|
61 error_ret ();
|
|
62 return;
|
|
63 }
|
|
64 if (dic == -1)
|
|
65 {
|
|
66 giji_hindoup (entry);
|
|
67 put4_cur (0);
|
|
68 putc_purge ();
|
|
69 return;
|
|
70 }
|
|
71 if (find_dic_in_env (env_id, dic) == -1)
|
|
72 { /* no such dic */
|
|
73 wnn_errorno = WNN_DICT_NOT_USED;
|
|
74 error_ret ();
|
|
75 return;
|
|
76 }
|
|
77 if (dic_table[dic].hindo_rw)
|
|
78 {
|
|
79 wnn_errorno = WNN_RDONLY_HINDO;
|
|
80 error_ret ();
|
|
81 return;
|
|
82 }
|
|
83 switch (ima)
|
|
84 {
|
|
85 case WNN_HINDO_NOP:
|
|
86 case WNN_IMA_ON:
|
|
87 case WNN_IMA_OFF:
|
|
88 break;
|
|
89 default:
|
|
90 error_ret ();
|
|
91 return;
|
|
92 }
|
|
93 if (entry < 0)
|
|
94 {
|
|
95 error_ret ();
|
|
96 return;
|
|
97 }
|
|
98 x = hindo_set (dic, entry, ima, hindo);
|
|
99 if (x == -1)
|
|
100 {
|
|
101 error_ret ();
|
|
102 }
|
|
103 else
|
|
104 {
|
|
105 put4_cur (x);
|
|
106 }
|
|
107 putc_purge ();
|
|
108 return;
|
|
109 }
|
|
110
|
|
111 static int
|
|
112 hindo_set (dic_no, entry, imaop, hinop)
|
|
113 int dic_no;
|
|
114 int entry;
|
|
115 int imaop;
|
|
116 int hinop;
|
|
117 {
|
|
118 UCHAR *hst;
|
|
119 int ima, hindo;
|
|
120
|
|
121 if (dic_table[dic_no].hindo == -1)
|
|
122 {
|
|
123 hst = ((struct JT *) (files[dic_table[dic_no].body].area))->hindo;
|
|
124 ((struct JT *) (files[dic_table[dic_no].body].area))->hdirty = 1;
|
|
125 ((struct JT *) (files[dic_table[dic_no].body].area))->dirty = 1;
|
|
126 }
|
|
127 else
|
|
128 {
|
|
129 hst = ((struct HJT *) (files[dic_table[dic_no].hindo].area))->hindo;
|
|
130 ((struct HJT *) (files[dic_table[dic_no].hindo].area))->hdirty = 1;
|
|
131 }
|
|
132 ima = hst[entry] & 0x80;
|
|
133 hindo = hst[entry] & 0x7f;
|
|
134 switch (imaop)
|
|
135 {
|
|
136 case WNN_HINDO_NOP:
|
|
137 break;
|
|
138 case WNN_IMA_ON:
|
|
139 ima = 0x80;
|
|
140 break;
|
|
141 case WNN_IMA_OFF:
|
|
142 ima = 0x0;
|
|
143 break;
|
|
144 }
|
|
145 switch (hinop)
|
|
146 {
|
|
147 case WNN_HINDO_NOP:
|
|
148 break;
|
|
149 case WNN_HINDO_INC:
|
|
150 if ((hindo & 0x7e) != 0x7e && (DRAND () < (double) 1 / ((hindo >> 2) + 1)))
|
|
151 hindo++;
|
|
152 break;
|
|
153 case WNN_HINDO_DECL:
|
|
154 if (hindo > 0 && hindo <= 126 && (DRAND () < (double) 1 / ((hindo >> 2) + 1)))
|
|
155 hindo--;
|
|
156 break;
|
|
157 case WNN_ENTRY_NO_USE:
|
|
158 hindo = 0x7f;
|
|
159 break;
|
|
160 default:
|
|
161 hindo = asshuku (hinop);
|
|
162 }
|
|
163 hst[entry] = hindo | ima;
|
|
164 return (0);
|
|
165 }
|