0
|
1 /*
|
|
2 * $Id: init.c,v 1.2 2001/06/14 18:16:16 ura 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 OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999
|
|
10 * Copyright 1991, 1992 by Massachusetts Institute of Technology
|
|
11 *
|
|
12 * Author: OMRON SOFTWARE Co., Ltd. <freewnn@rd.kyoto.omronsoft.co.jp>
|
|
13 *
|
|
14 * This program is free software; you can redistribute it and/or modify
|
|
15 * it under the terms of the GNU General Public License as published by
|
|
16 * the Free Software Foundation; either version 2, or (at your option)
|
|
17 * any later version.
|
|
18 *
|
|
19 * This program is distributed in the hope that it will be useful,
|
|
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
22 * GNU General Public License for more details.
|
|
23 *
|
|
24 * You should have received a copy of the GNU General Public License
|
|
25 * along with GNU Emacs; see the file COPYING. If not, write to the
|
|
26 * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
27 *
|
|
28 * Commentary:
|
|
29 *
|
|
30 * Change log:
|
|
31 *
|
|
32 * Last modified date: 8,Feb.1999
|
|
33 *
|
|
34 * Code:
|
|
35 *
|
|
36 */
|
|
37
|
|
38 #include "sdefine.h"
|
|
39 #include "xim.h"
|
|
40 #include "sheader.h"
|
|
41 #include "ext.h"
|
|
42
|
|
43 static void
|
|
44 default_flag_set ()
|
|
45 {
|
|
46 cursor_colum = 0;
|
|
47 cursor_reverse = 0;
|
|
48 cursor_underline = 0;
|
|
49 cursor_invisible = 1;
|
|
50 cursor_bold = 0;
|
|
51 quote_flag = 0;
|
|
52 send_ascii_char = 0;
|
|
53 send_ascii_stack = 0;
|
|
54 send_ascii_char_quote = 0;
|
|
55 c_c->command_func_stack[0] = NULL;
|
|
56 c_c->func_stack_count = -1;
|
|
57 c_c->buffer_ignored = 0;
|
|
58 }
|
|
59
|
|
60 static int
|
|
61 copy_env (wc)
|
|
62 register WnnClientRec *wc;
|
|
63 {
|
|
64 WnnEnv *p;
|
|
65
|
|
66 for (p = wc->normal_env; p; p = p->next)
|
|
67 {
|
|
68 if (get_new_env (c_c, NULL, 0) < 0 || (p->host_name && !(servername = alloc_and_copy (p->host_name))))
|
|
69 goto ERROR_RET;
|
|
70 envrcname = p->envrc_name;
|
|
71 strcpy (env_name, p->env_name_str);
|
|
72 }
|
|
73 for (p = wc->reverse_env; p; p = p->next)
|
|
74 {
|
|
75 if (get_new_env (c_c, NULL, 1) < 0 || (p->host_name && !(reverse_servername = alloc_and_copy (p->host_name))))
|
|
76 goto ERROR_RET;
|
|
77 reverse_envrcname = p->envrc_name;
|
|
78 strcpy (reverse_env_name, p->env_name_str);
|
|
79 }
|
|
80
|
|
81 send_ascii_char = send_ascii_char_def;
|
|
82
|
|
83 c_c->m_table = wc->m_table;
|
|
84 c_c->m_table->re_count++;
|
|
85 return (0);
|
|
86 ERROR_RET:
|
|
87 free_env (c_c->normal_env);
|
|
88 free_env (c_c->reverse_env);
|
|
89 return (-1);
|
|
90 }
|
|
91
|
|
92 static void
|
|
93 add_wnnclientlist (cl)
|
|
94 register WnnClientRec *cl;
|
|
95 {
|
|
96 cl->next = wnnclient_list;
|
|
97 wnnclient_list = cl;
|
|
98 }
|
|
99
|
|
100 static void
|
|
101 remove_wnnclientlist (cl)
|
|
102 register WnnClientRec *cl;
|
|
103 {
|
|
104 register WnnClientList p, *prev;
|
|
105 for (prev = &wnnclient_list; p = *prev; prev = &p->next)
|
|
106 {
|
|
107 if (p == cl)
|
|
108 {
|
|
109 *prev = p->next;
|
|
110 break;
|
|
111 }
|
|
112 }
|
|
113 }
|
|
114
|
|
115 void
|
|
116 add_ximclientlist (cl)
|
|
117 register XIMClientRec *cl;
|
|
118 {
|
|
119 cl->next = ximclient_list;
|
|
120 ximclient_list = cl;
|
|
121 }
|
|
122
|
|
123 void
|
|
124 remove_ximclientlist (cl)
|
|
125 register XIMClientRec *cl;
|
|
126 {
|
|
127 register XIMClientList p, *prev;
|
|
128 for (prev = &ximclient_list; p = *prev; prev = &p->next)
|
|
129 {
|
|
130 if (p == cl)
|
|
131 {
|
|
132 *prev = p->next;
|
|
133 break;
|
|
134 }
|
|
135 }
|
|
136 }
|
|
137
|
|
138 void
|
|
139 add_inputlist (xi)
|
|
140 register XIMInputRec *xi;
|
|
141 {
|
|
142 xi->next = input_list;
|
|
143 input_list = xi;
|
|
144 }
|
|
145
|
|
146 void
|
|
147 remove_inputlist (xi)
|
|
148 register XIMInputRec *xi;
|
|
149 {
|
|
150 register XIMInputList p, *prev;
|
|
151 for (prev = &input_list; p = *prev; prev = &p->next)
|
|
152 {
|
|
153 if (p == xi)
|
|
154 {
|
|
155 *prev = p->next;
|
|
156 break;
|
|
157 }
|
|
158 }
|
|
159 }
|
|
160
|
|
161 static WnnClientRec *
|
|
162 find_same_lang (lang)
|
|
163 char *lang;
|
|
164 {
|
|
165 register XIMClientRec *p;
|
|
166 register XIMLangRec *xl;
|
|
167 register int i;
|
|
168 for (p = ximclient_list; p != NULL; p = p->next)
|
|
169 {
|
|
170 for (i = 0; i < p->lang_num; i++)
|
|
171 {
|
|
172 xl = p->xl[i];
|
|
173 if (xl->w_c && xl->w_c->m_table)
|
|
174 {
|
|
175 if (!strcmp (xl->lang_db->lang, lang) && xl->w_c != NULL)
|
|
176 {
|
|
177 return ((WnnClientRec *) xl->w_c);
|
|
178 }
|
|
179 }
|
|
180 }
|
|
181 }
|
|
182 return ((WnnClientRec *) NULL);
|
|
183 }
|
|
184
|
|
185 int
|
|
186 allocate_wnn (uname)
|
|
187 char *uname;
|
|
188 {
|
|
189 int len = 0;
|
|
190 register char *p;
|
|
191 extern void bzero ();
|
|
192
|
|
193 if (uname && *uname)
|
|
194 len = strlen (uname) + 1;
|
|
195 if (!(p = Malloc (sizeof (WnnClientRec) + sizeof (ClientBuf) + len)))
|
|
196 {
|
|
197 malloc_error ("allocation of data for wnn");
|
|
198 return (-1);
|
|
199 }
|
|
200 c_c = (WnnClientList) p;
|
|
201 bzero ((char *) c_c, sizeof (WnnClientRec));
|
|
202 p += sizeof (WnnClientRec);
|
|
203 c_b = (ClientBuf *) p;
|
|
204 bzero ((char *) c_b, sizeof (ClientBuf));
|
|
205 if (uname && *uname)
|
|
206 {
|
|
207 p += sizeof (ClientBuf);
|
|
208 c_c->user_name = (char *) p;
|
|
209 strcpy (c_c->user_name, uname);
|
|
210 }
|
|
211 add_wnnclientlist (c_c);
|
|
212 default_flag_set ();
|
|
213 return (0);
|
|
214 }
|
|
215
|
|
216 void
|
|
217 free_wnn ()
|
|
218 {
|
|
219 remove_wnnclientlist (c_c);
|
|
220 Free ((char *) c_c);
|
|
221 }
|
|
222
|
|
223 int
|
|
224 initialize_wnn (xl, root)
|
|
225 XIMLangRec *xl;
|
|
226 int root;
|
|
227 {
|
|
228 WnnClientRec *p;
|
|
229
|
|
230 if ((p = find_same_lang (xl->lang_db->lang)) != NULL)
|
|
231 {
|
|
232 if (copy_env (p) < 0)
|
|
233 return (-1);
|
|
234 }
|
|
235 else
|
|
236 {
|
|
237 if (uumrc_get_entries (xl->lang_db, 0, root) == -1)
|
|
238 {
|
|
239 return (-1);
|
|
240 }
|
|
241 if (init_key_table (xl->lang_db->lang) == -1)
|
|
242 {
|
|
243 del_client (c_c, 4);
|
|
244 return (-1);
|
|
245 }
|
|
246 }
|
|
247 henkan_off_flag = henkan_off_def;
|
|
248 maxlength = maxchg * 2;
|
|
249 if (allocate_areas () == -1)
|
|
250 {
|
|
251 del_client (c_c, 3);
|
|
252 return (-1);
|
|
253 }
|
|
254 if (init_history () == -1)
|
|
255 {
|
|
256 del_client (c_c, 2);
|
|
257 return (-1);
|
|
258 }
|
|
259 if (open_romkan (xl->lang_db) == -1)
|
|
260 {
|
|
261 del_client (c_c, 1);
|
|
262 return (-1);
|
|
263 }
|
|
264 return (0);
|
|
265 }
|