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