xref: /netbsd-src/lib/libcurses/keyname.c (revision 8b0f9554ff8762542c4defc4f70e1eb76fb508fa)
1 /*	$NetBSD: keyname.c,v 1.5 2007/10/25 20:32:40 jdc Exp $	*/
2 
3 /*-
4  * Copyright (c) 2003 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Julian Coleman.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. All advertising materials mentioning features or use of this software
19  *    must display the following acknowledgement:
20  *        This product includes software developed by the NetBSD
21  *        Foundation, Inc. and its contributors.
22  * 4. Neither the name of The NetBSD Foundation nor the names of its
23  *    contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36  * POSSIBILITY OF SUCH DAMAGE.
37  */
38 
39 #include <sys/cdefs.h>
40 #ifndef lint
41 __RCSID("$NetBSD: keyname.c,v 1.5 2007/10/25 20:32:40 jdc Exp $");
42 #endif				/* not lint */
43 
44 #include <stdlib.h>
45 #include <string.h>
46 
47 #include "curses.h"
48 #include "curses_private.h"
49 
50 #define KEYNAMEMAX (size_t) 14	/* "KEY_BACKSPACE\0" */
51 static char name[KEYNAMEMAX + 1];
52 
53 /*
54  * keyname --
55  *	Return name of key or NULL;
56  */
57 char *
58 keyname(int key)
59 {
60 /* We don't bother with the large keyname table if SMALL is defined. */
61 #ifdef SMALL
62 	strcpy(name, "-1\0");
63 	return name;
64 #else
65 	if (key < 0) {
66 		strcpy(name, "-1\0");
67 		return name;
68 	}
69 
70 	/* No name. */
71 	if (key == 0x100) {
72 		strcpy(name, "-1\0");
73 		return name;
74 	}
75 
76 	/* Control codes */
77 	if (key < 0x20) {
78 		name[0] = '^';
79 		name[1] = (char) (key + 64);	/* Offset of '@' */
80 		name[2] = '\0';
81 		return name;
82 	}
83 
84 	/* "Normal" keys */
85 	if (key < 0x7F) {
86 		name[0] = (char) key;
87 		name[1] = '\0';
88 		return name;
89 	}
90 
91 	/* Delete key */
92 	if (key == 0x7F) {
93 		strcpy(name, "^?\0");
94 		return name;
95 	}
96 
97 	/* Meta + control codes */
98 	if (key < 0x9F) {
99 		strcpy(name, "M-^");
100 		name[3] = (char) (key - 64);	/* Offset of '@' */
101 		name[4] = '\0';
102 		return name;
103 	}
104 
105 	/* Meta + "normal" keys */
106 	if (key < 0xFF) {
107 		strcpy (name, "M-");
108 		name[2] = (char) (key - 128);
109 		name[3] = '\0';
110 		return name;
111 	}
112 
113 	/* Meta + delete key */
114 	if (key == 0xFF) {
115 		strcpy(name, "M-^?\0");
116 		return name;
117 	}
118 
119 	/* Key names.  Synchronise this with curses.h. */
120 	if (key == 0x101) {
121 		strncpy(name, "KEY_BREAK\0", KEYNAMEMAX);
122 		return name;
123 	}
124 	if (key == 0x102) {
125 		strncpy(name, "KEY_DOWN\0", KEYNAMEMAX);
126 		return name;
127 	}
128 	if (key == 0x103) {
129 		strncpy(name, "KEY_UP\0", KEYNAMEMAX);
130 		return name;
131 	}
132 	if (key == 0x104) {
133 		strncpy(name, "KEY_LEFT\0", KEYNAMEMAX);
134 		return name;
135 	}
136 	if (key == 0x105) {
137 		strncpy(name, "KEY_RIGHT\0", KEYNAMEMAX);
138 		return name;
139 	}
140 	if (key == 0x106) {
141 		strncpy(name, "KEY_HOME\0", KEYNAMEMAX);
142 		return name;
143 	}
144 	if (key == 0x107) {
145 		strncpy(name, "KEY_BACKSPACE\0", KEYNAMEMAX);
146 		return name;
147 	}
148 	/* Function key block (64 keys). */
149 	if (key < 0x148) {
150 		int i;
151 
152 		strcpy(name, "KEY_F(");
153 		i = snprintf(&name[6], (size_t) 3, "%d", key - 0x108);
154 		name[6 + i] = ')';
155 		name[7 + i] = '\0';
156 		return name;
157 	}
158 	if (key == 0x148) {
159 		strncpy(name, "KEY_DL\0", KEYNAMEMAX);
160 		return name;
161 	}
162 	if (key == 0x149) {
163 		strncpy(name, "KEY_IL\0", KEYNAMEMAX);
164 		return name;
165 	}
166 	if (key == 0x14A) {
167 		strncpy(name, "KEY_DC\0", KEYNAMEMAX);
168 		return name;
169 	}
170 	if (key == 0x14B) {
171 		strncpy(name, "KEY_IC\0", KEYNAMEMAX);
172 		return name;
173 	}
174 	if (key == 0x14C) {
175 		strncpy(name, "KEY_EIC\0", KEYNAMEMAX);
176 		return name;
177 	}
178 	if (key == 0x14D) {
179 		strncpy(name, "KEY_CLEAR\0", KEYNAMEMAX);
180 		return name;
181 	}
182 	if (key == 0x14E) {
183 		strncpy(name, "KEY_EOS\0", KEYNAMEMAX);
184 		return name;
185 	}
186 	if (key == 0x14F) {
187 		strncpy(name, "KEY_EOL\0", KEYNAMEMAX);
188 		return name;
189 	}
190 	if (key == 0x150) {
191 		strncpy(name, "KEY_SF\0", KEYNAMEMAX);
192 		return name;
193 	}
194 	if (key == 0x151) {
195 		strncpy(name, "KEY_SR\0", KEYNAMEMAX);
196 		return name;
197 	}
198 	if (key == 0x152) {
199 		strncpy(name, "KEY_NPAGE\0", KEYNAMEMAX);
200 		return name;
201 	}
202 	if (key == 0x153) {
203 		strncpy(name, "KEY_PPAGE\0", KEYNAMEMAX);
204 		return name;
205 	}
206 	if (key == 0x154) {
207 		strncpy(name, "KEY_STAB\0", KEYNAMEMAX);
208 		return name;
209 	}
210 	if (key == 0x155) {
211 		strncpy(name, "KEY_CTAB\0", KEYNAMEMAX);
212 		return name;
213 	}
214 	if (key == 0x156) {
215 		strncpy(name, "KEY_CATAB\0", KEYNAMEMAX);
216 		return name;
217 	}
218 	if (key == 0x157) {
219 		strncpy(name, "KEY_ENTER\0", KEYNAMEMAX);
220 		return name;
221 	}
222 	if (key == 0x158) {
223 		strncpy(name, "KEY_SRESET\0", KEYNAMEMAX);
224 		return name;
225 	}
226 	if (key == 0x159) {
227 		strncpy(name, "KEY_RESET\0", KEYNAMEMAX);
228 		return name;
229 	}
230 	if (key == 0x15A) {
231 		strncpy(name, "KEY_PRINT\0", KEYNAMEMAX);
232 		return name;
233 	}
234 	if (key == 0x15B) {
235 		strncpy(name, "KEY_LL\0", KEYNAMEMAX);
236 		return name;
237 	}
238 	if (key == 0x15C) {
239 		strncpy(name, "KEY_A1\0", KEYNAMEMAX);
240 		return name;
241 	}
242 	if (key == 0x15D) {
243 		strncpy(name, "KEY_A3\0", KEYNAMEMAX);
244 		return name;
245 	}
246 	if (key == 0x15E) {
247 		strncpy(name, "KEY_B2\0", KEYNAMEMAX);
248 		return name;
249 	}
250 	if (key == 0x15F) {
251 		strncpy(name, "KEY_C1\0", KEYNAMEMAX);
252 		return name;
253 	}
254 	if (key == 0x160) {
255 		strncpy(name, "KEY_C3\0", KEYNAMEMAX);
256 		return name;
257 	}
258 	if (key == 0x161) {
259 		strncpy(name, "KEY_BTAB\0", KEYNAMEMAX);
260 		return name;
261 	}
262 	if (key == 0x162) {
263 		strncpy(name, "KEY_BEG\0", KEYNAMEMAX);
264 		return name;
265 	}
266 	if (key == 0x163) {
267 		strncpy(name, "KEY_CANCEL\0", KEYNAMEMAX);
268 		return name;
269 	}
270 	if (key == 0x164) {
271 		strncpy(name, "KEY_CLOSE\0", KEYNAMEMAX);
272 		return name;
273 	}
274 	if (key == 0x165) {
275 		strncpy(name, "KEY_COMMAND\0", KEYNAMEMAX);
276 		return name;
277 	}
278 	if (key == 0x166) {
279 		strncpy(name, "KEY_COPY\0", KEYNAMEMAX);
280 		return name;
281 	}
282 	if (key == 0x167) {
283 		strncpy(name, "KEY_CREATE\0", KEYNAMEMAX);
284 		return name;
285 	}
286 	if (key == 0x168) {
287 		strncpy(name, "KEY_END\0", KEYNAMEMAX);
288 		return name;
289 	}
290 	if (key == 0x169) {
291 		strncpy(name, "KEY_EXIT\0", KEYNAMEMAX);
292 		return name;
293 	}
294 	if (key == 0x16A) {
295 		strncpy(name, "KEY_FIND\0", KEYNAMEMAX);
296 		return name;
297 	}
298 	if (key == 0x16B) {
299 		strncpy(name, "KEY_HELP\0", KEYNAMEMAX);
300 		return name;
301 	}
302 	if (key == 0x16C) {
303 		strncpy(name, "KEY_MARK\0", KEYNAMEMAX);
304 		return name;
305 	}
306 	if (key == 0x16D) {
307 		strncpy(name, "KEY_MESSAGE\0", KEYNAMEMAX);
308 		return name;
309 	}
310 	if (key == 0x16E) {
311 		strncpy(name, "KEY_MOVE\0", KEYNAMEMAX);
312 		return name;
313 	}
314 	if (key == 0x16F) {
315 		strncpy(name, "KEY_NEXT\0", KEYNAMEMAX);
316 		return name;
317 	}
318 	if (key == 0x170) {
319 		strncpy(name, "KEY_OPEN\0", KEYNAMEMAX);
320 		return name;
321 	}
322 	if (key == 0x171) {
323 		strncpy(name, "KEY_OPTIONS\0", KEYNAMEMAX);
324 		return name;
325 	}
326 	if (key == 0x172) {
327 		strncpy(name, "KEY_PREVIOUS\0", KEYNAMEMAX);
328 		return name;
329 	}
330 	if (key == 0x173) {
331 		strncpy(name, "KEY_REDO\0", KEYNAMEMAX);
332 		return name;
333 	}
334 	if (key == 0x174) {
335 		strncpy(name, "KEY_REFERENCE\0", KEYNAMEMAX);
336 		return name;
337 	}
338 	if (key == 0x175) {
339 		strncpy(name, "KEY_REFRESH\0", KEYNAMEMAX);
340 		return name;
341 	}
342 	if (key == 0x176) {
343 		strncpy(name, "KEY_REPLACE\0", KEYNAMEMAX);
344 		return name;
345 	}
346 	if (key == 0x177) {
347 		strncpy(name, "KEY_RESTART\0", KEYNAMEMAX);
348 		return name;
349 	}
350 	if (key == 0x178) {
351 		strncpy(name, "KEY_RESUME\0", KEYNAMEMAX);
352 		return name;
353 	}
354 	if (key == 0x179) {
355 		strncpy(name, "KEY_SAVE\0", KEYNAMEMAX);
356 		return name;
357 	}
358 	if (key == 0x17A) {
359 		strncpy(name, "KEY_SBEG\0", KEYNAMEMAX);
360 		return name;
361 	}
362 	if (key == 0x17B) {
363 		strncpy(name, "KEY_SCANCEL\0", KEYNAMEMAX);
364 		return name;
365 	}
366 	if (key == 0x17C) {
367 		strncpy(name, "KEY_SCOMMAND\0", KEYNAMEMAX);
368 		return name;
369 	}
370 	if (key == 0x17D) {
371 		strncpy(name, "KEY_SCOPY\0", KEYNAMEMAX);
372 		return name;
373 	}
374 	if (key == 0x17E) {
375 		strncpy(name, "KEY_SCREATE\0", KEYNAMEMAX);
376 		return name;
377 	}
378 	if (key == 0x17F) {
379 		strncpy(name, "KEY_SDC\0", KEYNAMEMAX);
380 		return name;
381 	}
382 	if (key == 0x180) {
383 		strncpy(name, "KEY_SDL\0", KEYNAMEMAX);
384 		return name;
385 	}
386 	if (key == 0x181) {
387 		strncpy(name, "KEY_SELECT\0", KEYNAMEMAX);
388 		return name;
389 	}
390 	if (key == 0x182) {
391 		strncpy(name, "KEY_SEND\0", KEYNAMEMAX);
392 		return name;
393 	}
394 	if (key == 0x183) {
395 		strncpy(name, "KEY_SEOL\0", KEYNAMEMAX);
396 		return name;
397 	}
398 	if (key == 0x184) {
399 		strncpy(name, "KEY_SEXIT\0", KEYNAMEMAX);
400 		return name;
401 	}
402 	if (key == 0x185) {
403 		strncpy(name, "KEY_SFIND\0", KEYNAMEMAX);
404 		return name;
405 	}
406 	if (key == 0x186) {
407 		strncpy(name, "KEY_SHELP\0", KEYNAMEMAX);
408 		return name;
409 	}
410 	if (key == 0x187) {
411 		strncpy(name, "KEY_SHOME\0", KEYNAMEMAX);
412 		return name;
413 	}
414 	if (key == 0x188) {
415 		strncpy(name, "KEY_SIC\0", KEYNAMEMAX);
416 		return name;
417 	}
418 	if (key == 0x189) {
419 		strncpy(name, "KEY_SLEFT\0", KEYNAMEMAX);
420 		return name;
421 	}
422 	if (key == 0x18A) {
423 		strncpy(name, "KEY_SMESSAGE\0", KEYNAMEMAX);
424 		return name;
425 	}
426 	if (key == 0x18B) {
427 		strncpy(name, "KEY_SMOVE\0", KEYNAMEMAX);
428 		return name;
429 	}
430 	if (key == 0x18C) {
431 		strncpy(name, "KEY_SNEXT\0", KEYNAMEMAX);
432 		return name;
433 	}
434 	if (key == 0x18D) {
435 		strncpy(name, "KEY_SOPTIONS\0", KEYNAMEMAX);
436 		return name;
437 	}
438 	if (key == 0x18E) {
439 		strncpy(name, "KEY_SPREVIOUS\0", KEYNAMEMAX);
440 		return name;
441 	}
442 	if (key == 0x18F) {
443 		strncpy(name, "KEY_SPRINT\0", KEYNAMEMAX);
444 		return name;
445 	}
446 	if (key == 0x190) {
447 		strncpy(name, "KEY_SREDO\0", KEYNAMEMAX);
448 		return name;
449 	}
450 	if (key == 0x191) {
451 		strncpy(name, "KEY_SREPLACE\0", KEYNAMEMAX);
452 		return name;
453 	}
454 	if (key == 0x192) {
455 		strncpy(name, "KEY_SRIGHT\0", KEYNAMEMAX);
456 		return name;
457 	}
458 	if (key == 0x193) {
459 		strncpy(name, "KEY_SRSUME\0", KEYNAMEMAX);
460 		return name;
461 	}
462 	if (key == 0x194) {
463 		strncpy(name, "KEY_SSAVE\0", KEYNAMEMAX);
464 		return name;
465 	}
466 	if (key == 0x195) {
467 		strncpy(name, "KEY_SSUSPEND\0", KEYNAMEMAX);
468 		return name;
469 	}
470 	if (key == 0x196) {
471 		strncpy(name, "KEY_SUNDO\0", KEYNAMEMAX);
472 		return name;
473 	}
474 	if (key == 0x197) {
475 		strncpy(name, "KEY_SUSPEND\0", KEYNAMEMAX);
476 		return name;
477 	}
478 	if (key == 0x198) {
479 		strncpy(name, "KEY_UNDO\0", KEYNAMEMAX);
480 		return name;
481 	}
482 	if (key == 0x199) {
483 		strncpy(name, "KEY_MOUSE\0", KEYNAMEMAX);
484 		return name;
485 	}
486 	if (key == 0x200) {
487 		strncpy(name, "KEY_RESIZE\0", KEYNAMEMAX);
488 		return name;
489 	}
490 	/* No more names. */
491 	strncpy(name, "UNKOWN KEY\0", KEYNAMEMAX);
492 	return name;
493 #endif
494 }
495 /*
496  * key_name --
497  *	Return name of key or NULL;
498  */
499 char *
500 key_name(wchar_t key)
501 {
502 #ifndef HAVE_WCHAR
503 	return NULL;
504 #else
505 	(void) keyname((int) key);
506 
507 	if (!strncmp(name, "M-", 2)) {
508 		/* Remove the "M-" */
509 		name[0] = name[2];
510 		name[1] = '\0';
511 	}
512 	return name;
513 #endif /* HAVE_WCHAR */
514 }
515 
516