0
|
1 /*
|
|
2 * $Id: history.c,v 1.2 2001/06/14 18:16:15 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 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 1991 by Massachusetts Institute of Technology
|
|
14 *
|
|
15 * Author: OMRON SOFTWARE Co., Ltd. <freewnn@rd.kyoto.omronsoft.co.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, or (at your option)
|
|
20 * 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 GNU Emacs; see the file COPYING. If not, write to the
|
|
29 * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
30 *
|
|
31 * Commentary:
|
|
32 *
|
|
33 * Change log:
|
|
34 *
|
|
35 * Last modified date: 8,Feb.1999
|
|
36 *
|
|
37 * Code:
|
|
38 *
|
|
39 */
|
|
40 /* Version 4.0
|
|
41 */
|
|
42 #include <stdio.h>
|
|
43 #include "commonhd.h"
|
|
44 #include "sdefine.h"
|
|
45 #include "xim.h"
|
|
46 #include "sheader.h"
|
|
47 #include "jslib.h"
|
|
48 #include "ext.h"
|
|
49
|
|
50 int
|
|
51 init_history ()
|
|
52 {
|
|
53 int size1;
|
|
54 char *area_pter;
|
|
55
|
|
56 register History *hist, *pre, *end;
|
|
57
|
|
58 if ((history_cunt = max_history) < 1)
|
|
59 {
|
|
60 history_cunt = 0;
|
|
61 return (0);
|
|
62 }
|
|
63 size1 = history_cunt * sizeof (History);
|
|
64 if ((area_pter = Malloc ((unsigned) size1)) == NULL)
|
|
65 {
|
|
66 history_cunt = 0;
|
|
67 wnn_errorno = WNN_MALLOC_ERR;
|
|
68 return (-1);
|
|
69 }
|
|
70 hist = beginning_of_history = end_of_history = add_history = (History *) area_pter;
|
|
71 c_c->save_hist = (History *) area_pter;
|
|
72 pre = end = hist + (history_cunt - 1);
|
|
73 do
|
|
74 {
|
|
75 hist->hbuffer = NULL;
|
|
76 pre->next = hist;
|
|
77 hist->previous = pre;
|
|
78 hist->num = 0;
|
|
79 pre = hist++;
|
|
80 }
|
|
81 while (hist <= end);
|
|
82 return (0);
|
|
83 }
|
|
84
|
|
85 static void
|
|
86 set_up_history ()
|
|
87 {
|
|
88 if (add_history == beginning_of_history && end_of_history != beginning_of_history)
|
|
89 beginning_of_history = beginning_of_history->next;
|
|
90 end_of_history = add_history;
|
|
91 add_history = add_history->next;
|
|
92 current_history = NULL;
|
|
93 }
|
|
94
|
|
95 int
|
|
96 make_history (wstr, n)
|
|
97 register w_char *wstr;
|
|
98 register int n;
|
|
99 {
|
|
100 register char *p;
|
|
101
|
|
102 if (!history_cunt)
|
|
103 return (0);
|
|
104 if (n <= 0 || n > maxchg || *wstr == 0)
|
|
105 return (-1);
|
|
106
|
|
107 if (n == 1 && NORMAL_CHAR (*wstr))
|
|
108 {
|
|
109 if (!wchar_holding)
|
|
110 {
|
|
111 wchar_holding = 1;
|
|
112 set_up_history ();
|
|
113 end_of_history->num = 0;
|
|
114 }
|
|
115 if (!(p = Malloc ((unsigned) ((end_of_history->num + 1) * sizeof (w_char)))))
|
|
116 {
|
|
117 malloc_error ("allocation of data for history");
|
|
118 return (-1);
|
|
119 }
|
|
120 if (end_of_history->hbuffer)
|
|
121 Free (end_of_history->hbuffer);
|
|
122 end_of_history->hbuffer = (w_char *) p;
|
|
123 Strncpy (end_of_history->hbuffer + end_of_history->num, wstr, 1);
|
|
124 if (++(end_of_history->num) >= maxchg)
|
|
125 wchar_holding = 0;
|
|
126 return (0);
|
|
127 }
|
|
128 if (wchar_holding)
|
|
129 wchar_holding = 0;
|
|
130 if (n == 1 && !(KANJI_CHAR (*wstr)))
|
|
131 /* don't insert cntrol code in history buffer */
|
|
132 return (0);
|
|
133 if (end_of_history->num == n && Strncmp (end_of_history->hbuffer, wstr, n) == 0)
|
|
134 {
|
|
135 current_history = NULL;
|
|
136 return (0);
|
|
137 }
|
|
138 if (!(p = Malloc ((unsigned) (n * sizeof (w_char)))))
|
|
139 {
|
|
140 malloc_error ("allocation of data for history");
|
|
141 return (-1);
|
|
142 }
|
|
143 set_up_history ();
|
|
144 if (end_of_history->hbuffer != NULL)
|
|
145 Free ((char *) end_of_history->hbuffer);
|
|
146 end_of_history->hbuffer = (w_char *) p;
|
|
147 Strncpy (end_of_history->hbuffer, wstr, n);
|
|
148 end_of_history->num = n;
|
|
149
|
|
150 return (0);
|
|
151 }
|
|
152
|
|
153 static int
|
|
154 get_current_history (wbuf)
|
|
155 register w_char *wbuf;
|
|
156 {
|
|
157 if (!history_cunt)
|
|
158 return (0);
|
|
159 if (wchar_holding)
|
|
160 wchar_holding = 0;
|
|
161 if (current_history == NULL)
|
|
162 current_history = end_of_history;
|
|
163 Strncpy (wbuf, current_history->hbuffer, current_history->num);
|
|
164 return (current_history->num);
|
|
165 }
|
|
166
|
|
167 void
|
|
168 get_end_of_history (wbuf)
|
|
169 register w_char *wbuf;
|
|
170 {
|
|
171 if (!history_cunt)
|
|
172 {
|
|
173 *wbuf = 0;
|
|
174 }
|
|
175 else
|
|
176 {
|
|
177 if (wchar_holding)
|
|
178 wchar_holding = 0;
|
|
179 Strncpy (wbuf, end_of_history->hbuffer, end_of_history->num);
|
|
180 *(wbuf + end_of_history->num) = 0;
|
|
181 }
|
|
182 }
|
|
183
|
|
184 int
|
|
185 previous_history1 (buffer)
|
|
186 register w_char *buffer;
|
|
187 {
|
|
188 if (!history_cunt || current_history == beginning_of_history)
|
|
189 return (0); /* do nothing */
|
|
190
|
|
191 if (current_history != NULL)
|
|
192 current_history = current_history->previous;
|
|
193 return (get_current_history (buffer));
|
|
194 }
|
|
195
|
|
196 int
|
|
197 next_history1 (buffer)
|
|
198 register w_char *buffer;
|
|
199 {
|
|
200 if (!history_cunt || current_history == end_of_history || current_history == NULL)
|
|
201 return (0);
|
|
202
|
|
203 current_history = current_history->next;
|
|
204 return (get_current_history (buffer));
|
|
205 }
|
|
206
|
|
207 void
|
|
208 destroy_history ()
|
|
209 {
|
|
210 register History *p;
|
|
211 register int i;
|
|
212
|
|
213 if (c_c == NULL || c_c->save_hist == NULL)
|
|
214 return;
|
|
215 for (i = 0, p = c_c->save_hist; i < history_cunt; i++, p++)
|
|
216 {
|
|
217 if (p->hbuffer)
|
|
218 Free ((char *) p->hbuffer);
|
|
219 }
|
|
220 Free ((char *) c_c->save_hist);
|
|
221 }
|