1 /*--------------------------------------------------------------------
2   -keyf- key input module.
3 
4     Copyright (c) 1998,1999,2000 SASAKI Shunsuke.
5     All rights reserved.
6 --------------------------------------------------------------------*/
7 #include "ed.h"
8 #include "sh.h"
9 
10 
11 
12 	/* KeyBoard Macro */
13 
14 #define	MAX_km	4096
15 
16 typedef	enum	{KM_none,KM_set,KM_do}	kmmode_t;
17 
18 typedef	struct	keylist
19 {
20 	int 			*buf;
21 	size_t 			n;		/* size of buffer */
22 	struct	keylist	*next;
23 }	kmlist_t;
24 
25 typedef	struct
26 {
27 	kmmode_t	mode;
28 	int 		buf[MAX_km];
29 	int 		n,x;
30 
31 	kmlist_t	*list;
32 }	keymacro_t;
33 
34 keymacro_t	km;
35 
36 
km_init()37 void	km_init()
38 {
39 	km.list=NULL;
40 	km.mode=KM_none;
41 }
42 
km_fin()43 void	km_fin()
44 {
45 	kmlist_t	*list,*next;
46 
47 	list=km.list;
48 	while(list!=NULL)
49 		{
50 		 next=list->next;
51 		 free(list);
52 		 list=next;
53 		}
54 	km.list=NULL;
55 }
56 
op_misc_kmacro()57 SHELL	void	op_misc_kmacro()
58 {
59 	if (km.mode==KM_set)
60 		{
61 		 km.mode = KM_none;
62 		 return;
63 		}
64 
65 	km.mode = KM_set;
66 	km.x=0;
67 }
68 
km_seek(int n)69 kmlist_t	*km_seek(int n)
70 {
71 	kmlist_t	*p;
72 
73 	p=km.list;
74 	while(n>0&& p!=NULL)
75 		{
76 		 p=p->next;
77 		 --n;
78 		}
79 	return p;
80 }
81 
km_addkey(int c)82 void	km_addkey(int c)
83 {
84 	if (km.mode!=KM_set)
85 		return;
86 
87 	if (km.x<MAX_km)
88 		km.buf[km.x++]=c;
89 }
90 
km_getkey()91 int 	km_getkey()
92 {
93 	int 	c;
94 
95 	if (km.mode!=KM_do)
96 		return -1;
97 
98 	c=km.buf[km.x++];
99 	if (km.x>=km.n)
100 		{
101 		 km.mode=KM_none;
102 		 if (km.n==0)
103 		 	return -1;
104 		}
105 
106 	return c;
107 }
108 
109 
km_set(int region,keydef_t * def,int k1,int k2)110 void	km_set(int region,keydef_t *def,int k1,int k2)
111 {
112 	kmlist_t	*list,*next;
113 	int 		n;
114 
115 	km.mode=KM_none;
116 
117 	if (def!=(void *)-1)
118 		{
119 		 if (def==NULL|| def->kdm!=KDM_macro)
120 		 	{
121 		 	 inkey_wait("�����ܡ��ɥޥ����顼 km_set");
122 		 	 return;
123 		 	}
124 
125 		 list=km_seek(def->funcNo);
126 		 if (list==NULL)
127 		 	{
128 		 	 inkey_wait("�����ܡ��ɥޥ����顼 km_set NULL");
129 		 	 return;
130 		 	}
131 		 free(list->buf);
132 		 list->buf=mem_alloc(km.x*sizeof(int));
133 		 list->n=km.x;
134 		 memcpy(list->buf,km.buf,km.x*sizeof(int));
135 		 system_msg("KeyMacro ���åȤ��ޤ�����");
136 		 return;
137 		}
138 
139 	list=mem_alloc(sizeof(kmlist_t));
140 	list->buf=mem_alloc(km.x*sizeof(int));
141 	list->n=km.x;
142 	memcpy(list->buf,km.buf,km.x*sizeof(int));
143 	list->next=NULL;
144 
145 	system_msg("KeyMacro���åȤ��ޤ�����");
146 
147 	n=0;
148 	if (km.list==NULL)
149 		km.list=list; else
150 		{
151 		 next=km.list;
152 		 while(next->next!=NULL)
153 		 	{
154 		 	 ++n;
155 		 	 next=next->next;
156 		 	}
157 		 next->next=list;
158 		}
159 	keydef_set(region,KDM_macro,n,k1,k2);
160 }
161 
km_macro(keydef_t * def)162 void	km_macro(keydef_t *def)
163 {
164 	kmlist_t	*list;
165 
166 	if (km.mode==KM_do)
167 		{
168 		 inkey_wait("�����ܡ��ɥޥ����顼 KM_do");
169 		 km.mode=KM_none;
170 		 return;
171 		}
172 
173 	list=km_seek(def->funcNo);
174 	if (list==NULL)
175 		{
176 		 inkey_wait("�����ܡ��ɥޥ����顼 km_seek");
177 		 km.mode=KM_none;
178 		 return;
179 		}
180 
181 	km.mode=KM_do;
182 
183 	km.x=0;
184 	km.n=list->n;
185 	memcpy(km.buf,list->buf,list->n*sizeof(int));
186 }
187 
188 /* keydef */
189 
190 
191 int 		keydef_n[MAX_region];
192 keydef_t	keydef[MAX_region][MAXKEYDEF];
193 
keydef_init()194 void	keydef_init()
195 {
196 	int 	i;
197 
198 	for (i=0;i<MAX_region;++i)
199 		keydef_n[i]=0;
200 }
201 
keydef_num(int r)202 int 	keydef_num(int r)
203 {
204 	if (r>=MAX_region)
205 		return -1;
206 	return keydef_n[r];
207 }
208 
keydef_set(int r,kdm_t kdm,int n,int k1,int k2)209 keydef_t	*keydef_set(int r,kdm_t kdm,int n,int k1,int k2)
210 {
211 	int 	num;
212 	keydef_t	*kdp;
213 
214 	num=keydef_num(r);
215 	if (num==-1|| num>=MAXKEYDEF)
216 		return;
217 
218 	kdp= &keydef[r][num];
219 
220 	kdp->key1   = k1;
221 	if (k2>='A' && k2<='z' && isalpha(k2))
222 		k2 &= 0x1f;
223 	kdp->key2   = k2;
224 	kdp->funcNo = n;
225 	kdp->kdm    = kdm;
226 	++keydef_n[r];
227 
228 //fprintf(stderr,"keydef_set: %02d  %04x %08x\n",n,k1,k2);
229 	return kdp;
230 }
231 
keydef_get(int r,int k1,int k2)232 keydef_t	*keydef_get(int r,int k1,int k2)
233 {
234 	int 		i;
235 	keydef_t	*p;
236 
237 	p=NULL;
238 	if (k2>='A' && k2<='z' && isalpha(k2))
239 		k2 &= 0x1f;
240 
241 	for (i=0; i<keydef_num(r); i++)
242 		{
243 /* fprintf(stderr,"k m: %02d  %04x %08x\n", i,
244 	keydef[r][i].key1, keydef[r][i].key2);
245 */
246 		 if (k1==keydef[r][i].key1)
247 		 	{
248 		 	 p=(void *)-1;
249 
250 		 	 if (k2== keydef[r][i].key2)
251 		 	 	return &keydef[r][i];
252 		 	}
253 		}
254 	return p;
255 }
256 
257 /* keyf */
258 
get_keyf(int region)259 int 	get_keyf(int region)
260 {
261 	int 	key1,key2;
262 	keydef_t	*def;
263 
264 	if (region>=MAX_region)
265 		return -1;
266 
267 	if (km.mode==KM_set)
268 		system_msg("KeyMacro������");
269 	if (km.mode==KM_do)
270 		system_msg("KeyMacro��ư��");
271 
272 	key1=km_getkey();
273 	if (key1!=-1)
274 		{
275 		 term_csr_flush();
276 		 return key1;
277 		}
278 
279 	if (region==0)
280 		CursorMove();
281 	key1=term_inkey();
282 	key2=-1;
283 
284 	def=keydef_get(region, key1, key2);
285 
286 //fprintf(stderr,"%08p: %04x %08x\n",def, key1, key2);
287 
288 	if (def!=(void *)-1)
289 		{
290 		 if (def==NULL)
291 		 	{
292 		 	 if (key1>0x100 || (iscnt(key1)&&key1!='\t'))
293 		 	 	def=(void *)-1; else
294 		 	 	key1|=KF_normalcode;
295 		 	}
296 		} else
297 		{
298 		 putDoubleKey(key1);
299 		 if (region==0)
300 		 	CursorMove();
301 		 key2=term_inkey();
302 		 delDoubleKey();
303 		 def=keydef_get(region, key1, key2);
304 		}
305 
306 /* �̾��ͭ���ʥ��� */
307 	if (def!=NULL&& def!=(void *)-1&& def->kdm==KDM_func)
308 		{
309 		 key1=def->funcNo;
310 		 keydef_args=def->args;
311 
312 		 def=NULL;
313 		}
314 	if (def==NULL)
315 		{
316 		 km_addkey(key1);
317 		 return key1;
318 		}
319 
320 /* �ޥ�����Ͽ�� */
321 	if (km.mode==KM_set)
322 		{
323 		 km_set(region,def,key1,key2);
324 		 return -1;
325 		}
326 
327 /* ̵���ʥ��� */
328 	if (def==(void *)-1)
329 		return -1;
330 
331 /* �ޥ���ư */
332 	km_macro(def);
333 	return -1;
334 }
335 
336 /*
337 	def					0			|			-1
338 	def->mode	func	N/A			|macro		N/A
339 				func	normalkey	|def		����̵��
340 	o ��Ͽ��	o		o			|-			-
341 	o �̾��	o		o			|macro��ư	o
342 */
343 
344 
345 
346 
keysel(const char * s,const char * t)347 int 	keysel(const char *s,const char *t)
348 {
349 	int 	c;
350 
351 	system_msg(s);
352 
353 	do	{
354 		 c = term_inkey();
355 		} while (strchr(t,c)==NULL);
356 
357 	return tolower(c);
358 }
359 
keysel_ynq(const char * s)360 bool	keysel_ynq(const char *s)
361 {
362 	char	tmpbuff[MAXLINESTR+1];
363 	char	c;
364 
365 	sprintf(tmpbuff, "%s... ? (y/n) :", s);
366 	c=keysel(tmpbuff,"Yy\r\nNn \x1b");
367 	return c=='y'||c=='\r'||c=='\n';
368 }
369 
keysel_yneq(const char * s)370 int 	keysel_yneq(const char *s)
371 {
372 	char	tmpbuff[MAXLINESTR+1];
373 	int 	c;
374 
375 	sprintf(tmpbuff, "%s... ? (y/n or ESC) :", s);
376 	c=keysel(tmpbuff,"Yy\r\nNn \x1b");
377 
378 	switch(c)
379 		{
380 	 case 'y':
381 	 case '\r':
382 	 case '\n':
383 	 	 return TRUE;
384 	 case 'n':
385 	 case ' ':
386 	 	 return FALSE;
387 	 case '\x1b':
388 	 default:
389 	 	 return ESCAPE;
390 	 	}
391 }
392 
inkey_wait(const char * buffer)393 void	inkey_wait(const char *buffer)
394 {
395 	term_bell();
396 	if (buffer!=NULL)
397 		system_msg(buffer);
398 
399 	term_inkey();
400 }
401 
402 
403 
404 char	**keydef_args;
405 
keyf_getarg(int n)406 const	char	*keyf_getarg(int n)
407 {
408 	if (n>MAX_args)
409 		return NULL;
410 	return keydef_args[n];
411 }
412 
keyf_numarg()413 int 	keyf_numarg()
414 {
415 	int 	i;
416 
417 	i=0;
418 	while(keydef_args[i]!=NULL)
419 		++i;
420 	return i;
421 }
422 
423