xref: /netbsd-src/lib/libcurses/keyname.c (revision 23c8222edbfb0f0932d88a8351d3a0cf817dfb9e)
1 /*	$NetBSD: keyname.c,v 1.1 2003/06/20 06:56:29 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.1 2003/06/20 06:56:29 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 /*
52  * keyname --
53  *	Return name of key or NULL;
54  */
55 char *
56 keyname(int key)
57 {
58 /* We don't bother with the large keyname table if SMALL is defined. */
59 #ifdef SMALL
60 	return NULL;
61 #else
62 	char *name;
63 
64 	if ((name = malloc(KEYNAMEMAX + 1)) == NULL)
65 		return NULL;
66 
67 	if (key < 0)
68 		return NULL;
69 
70 	/* Control codes */
71 	if (key < 0x20) {
72 		name[0] = '^';
73 		name[1] = (char) (key + 64);	/* Offset of '@' */
74 		name[2] = '\0';
75 		return name;
76 	}
77 
78 	/* "Normal" keys */
79 	if (key < 0x7F) {
80 		name[0] = (char) key;
81 		name[1] = '\0';
82 		return name;
83 	}
84 
85 	/* Delete key */
86 	if (key == 0x7F) {
87 		strcpy(name, "^?\0");
88 		return name;
89 	}
90 
91 	/* Meta + control codes */
92 	if (key < 0x9F) {
93 		strcpy(name, "M-^");
94 		name[3] = (char) (key - 64);	/* Offset of '@' */
95 		name[4] = '\0';
96 		return name;
97 	}
98 
99 	/* Meta + "normal" keys */
100 	if (key < 0xFF) {
101 		strcpy (name, "M-");
102 		name[2] = (char) (key - 128);
103 		name[3] = '\0';
104 		return name;
105 	}
106 
107 	/* Meta + delete key */
108 	if (key == 0xFF) {
109 		strcpy(name, "M-^?\0");
110 		return name;
111 	}
112 
113 	/* No name. */
114 	if (key == 0x100)
115 		return NULL;
116 
117 	/* Key names.  Synchronise this with curses.h. */
118 	if (key == 0x101) {
119 		strncpy(name, "KEY_BREAK\0", KEYNAMEMAX);
120 		return name;
121 	}
122 	if (key == 0x102) {
123 		strncpy(name, "KEY_DOWN\0", KEYNAMEMAX);
124 		return name;
125 	}
126 	if (key == 0x103) {
127 		strncpy(name, "KEY_UP\0", KEYNAMEMAX);
128 		return name;
129 	}
130 	if (key == 0x104) {
131 		strncpy(name, "KEY_LEFT\0", KEYNAMEMAX);
132 		return name;
133 	}
134 	if (key == 0x105) {
135 		strncpy(name, "KEY_RIGHT\0", KEYNAMEMAX);
136 		return name;
137 	}
138 	if (key == 0x106) {
139 		strncpy(name, "KEY_HOME\0", KEYNAMEMAX);
140 		return name;
141 	}
142 	if (key == 0x107) {
143 		strncpy(name, "KEY_BACKSPACE\0", KEYNAMEMAX);
144 		return name;
145 	}
146 	/* Function key block (64 keys). */
147 	if (key < 0x148) {
148 		int i;
149 
150 		strcpy(name, "KEY_F(");
151 		i = snprintf(&name[6], (size_t) 3, "%d", key - 0x108);
152 		name[6 + i] = ')';
153 		name[7 + i] = '\0';
154 		return name;
155 	}
156 	if (key == 0x148) {
157 		strncpy(name, "KEY_DL\0", KEYNAMEMAX);
158 		return name;
159 	}
160 	if (key == 0x149) {
161 		strncpy(name, "KEY_IL\0", KEYNAMEMAX);
162 		return name;
163 	}
164 	if (key == 0x14A) {
165 		strncpy(name, "KEY_DC\0", KEYNAMEMAX);
166 		return name;
167 	}
168 	if (key == 0x14B) {
169 		strncpy(name, "KEY_IC\0", KEYNAMEMAX);
170 		return name;
171 	}
172 	if (key == 0x14C) {
173 		strncpy(name, "KEY_EIC\0", KEYNAMEMAX);
174 		return name;
175 	}
176 	if (key == 0x14D) {
177 		strncpy(name, "KEY_CLEAR\0", KEYNAMEMAX);
178 		return name;
179 	}
180 	if (key == 0x14E) {
181 		strncpy(name, "KEY_EOS\0", KEYNAMEMAX);
182 		return name;
183 	}
184 	if (key == 0x14F) {
185 		strncpy(name, "KEY_EOL\0", KEYNAMEMAX);
186 		return name;
187 	}
188 	if (key == 0x150) {
189 		strncpy(name, "KEY_SF\0", KEYNAMEMAX);
190 		return name;
191 	}
192 	if (key == 0x151) {
193 		strncpy(name, "KEY_SR\0", KEYNAMEMAX);
194 		return name;
195 	}
196 	if (key == 0x152) {
197 		strncpy(name, "KEY_NPAGE\0", KEYNAMEMAX);
198 		return name;
199 	}
200 	if (key == 0x153) {
201 		strncpy(name, "KEY_PPAGE\0", KEYNAMEMAX);
202 		return name;
203 	}
204 	if (key == 0x154) {
205 		strncpy(name, "KEY_STAB\0", KEYNAMEMAX);
206 		return name;
207 	}
208 	if (key == 0x155) {
209 		strncpy(name, "KEY_CTAB\0", KEYNAMEMAX);
210 		return name;
211 	}
212 	if (key == 0x156) {
213 		strncpy(name, "KEY_CATAB\0", KEYNAMEMAX);
214 		return name;
215 	}
216 	if (key == 0x157) {
217 		strncpy(name, "KEY_ENTER\0", KEYNAMEMAX);
218 		return name;
219 	}
220 	if (key == 0x158) {
221 		strncpy(name, "KEY_SRESET\0", KEYNAMEMAX);
222 		return name;
223 	}
224 	if (key == 0x159) {
225 		strncpy(name, "KEY_RESET\0", KEYNAMEMAX);
226 		return name;
227 	}
228 	if (key == 0x15A) {
229 		strncpy(name, "KEY_PRINT\0", KEYNAMEMAX);
230 		return name;
231 	}
232 	if (key == 0x15B) {
233 		strncpy(name, "KEY_LL\0", KEYNAMEMAX);
234 		return name;
235 	}
236 	if (key == 0x15C) {
237 		strncpy(name, "KEY_A1\0", KEYNAMEMAX);
238 		return name;
239 	}
240 	if (key == 0x15D) {
241 		strncpy(name, "KEY_A3\0", KEYNAMEMAX);
242 		return name;
243 	}
244 	if (key == 0x15E) {
245 		strncpy(name, "KEY_B2\0", KEYNAMEMAX);
246 		return name;
247 	}
248 	if (key == 0x15F) {
249 		strncpy(name, "KEY_C1\0", KEYNAMEMAX);
250 		return name;
251 	}
252 	if (key == 0x160) {
253 		strncpy(name, "KEY_C3\0", KEYNAMEMAX);
254 		return name;
255 	}
256 	if (key == 0x161) {
257 		strncpy(name, "KEY_BTAB\0", KEYNAMEMAX);
258 		return name;
259 	}
260 	if (key == 0x162) {
261 		strncpy(name, "KEY_BEG\0", KEYNAMEMAX);
262 		return name;
263 	}
264 	if (key == 0x163) {
265 		strncpy(name, "KEY_CANCEL\0", KEYNAMEMAX);
266 		return name;
267 	}
268 	if (key == 0x164) {
269 		strncpy(name, "KEY_CLOSE\0", KEYNAMEMAX);
270 		return name;
271 	}
272 	if (key == 0x165) {
273 		strncpy(name, "KEY_COMMAND\0", KEYNAMEMAX);
274 		return name;
275 	}
276 	if (key == 0x166) {
277 		strncpy(name, "KEY_COPY\0", KEYNAMEMAX);
278 		return name;
279 	}
280 	if (key == 0x167) {
281 		strncpy(name, "KEY_CREATE\0", KEYNAMEMAX);
282 		return name;
283 	}
284 	if (key == 0x168) {
285 		strncpy(name, "KEY_END\0", KEYNAMEMAX);
286 		return name;
287 	}
288 	if (key == 0x169) {
289 		strncpy(name, "KEY_EXIT\0", KEYNAMEMAX);
290 		return name;
291 	}
292 	if (key == 0x16A) {
293 		strncpy(name, "KEY_FIND\0", KEYNAMEMAX);
294 		return name;
295 	}
296 	if (key == 0x16B) {
297 		strncpy(name, "KEY_HELP\0", KEYNAMEMAX);
298 		return name;
299 	}
300 	if (key == 0x16C) {
301 		strncpy(name, "KEY_MARK\0", KEYNAMEMAX);
302 		return name;
303 	}
304 	if (key == 0x16D) {
305 		strncpy(name, "KEY_MESSAGE\0", KEYNAMEMAX);
306 		return name;
307 	}
308 	if (key == 0x16E) {
309 		strncpy(name, "KEY_MOVE\0", KEYNAMEMAX);
310 		return name;
311 	}
312 	if (key == 0x16F) {
313 		strncpy(name, "KEY_NEXT\0", KEYNAMEMAX);
314 		return name;
315 	}
316 	if (key == 0x170) {
317 		strncpy(name, "KEY_OPEN\0", KEYNAMEMAX);
318 		return name;
319 	}
320 	if (key == 0x171) {
321 		strncpy(name, "KEY_OPTIONS\0", KEYNAMEMAX);
322 		return name;
323 	}
324 	if (key == 0x172) {
325 		strncpy(name, "KEY_PREVIOUS\0", KEYNAMEMAX);
326 		return name;
327 	}
328 	if (key == 0x173) {
329 		strncpy(name, "KEY_REDO\0", KEYNAMEMAX);
330 		return name;
331 	}
332 	if (key == 0x174) {
333 		strncpy(name, "KEY_REFERENCE\0", KEYNAMEMAX);
334 		return name;
335 	}
336 	if (key == 0x175) {
337 		strncpy(name, "KEY_REFRESH\0", KEYNAMEMAX);
338 		return name;
339 	}
340 	if (key == 0x176) {
341 		strncpy(name, "KEY_REPLACE\0", KEYNAMEMAX);
342 		return name;
343 	}
344 	if (key == 0x177) {
345 		strncpy(name, "KEY_RESTART\0", KEYNAMEMAX);
346 		return name;
347 	}
348 	if (key == 0x178) {
349 		strncpy(name, "KEY_RESUME\0", KEYNAMEMAX);
350 		return name;
351 	}
352 	if (key == 0x179) {
353 		strncpy(name, "KEY_SAVE\0", KEYNAMEMAX);
354 		return name;
355 	}
356 	if (key == 0x17A) {
357 		strncpy(name, "KEY_SBEG\0", KEYNAMEMAX);
358 		return name;
359 	}
360 	if (key == 0x17B) {
361 		strncpy(name, "KEY_SCANCEL\0", KEYNAMEMAX);
362 		return name;
363 	}
364 	if (key == 0x17C) {
365 		strncpy(name, "KEY_SCOMMAND\0", KEYNAMEMAX);
366 		return name;
367 	}
368 	if (key == 0x17D) {
369 		strncpy(name, "KEY_SCOPY\0", KEYNAMEMAX);
370 		return name;
371 	}
372 	if (key == 0x17E) {
373 		strncpy(name, "KEY_SCREATE\0", KEYNAMEMAX);
374 		return name;
375 	}
376 	if (key == 0x17F) {
377 		strncpy(name, "KEY_SDC\0", KEYNAMEMAX);
378 		return name;
379 	}
380 	if (key == 0x180) {
381 		strncpy(name, "KEY_SDL\0", KEYNAMEMAX);
382 		return name;
383 	}
384 	if (key == 0x181) {
385 		strncpy(name, "KEY_SELECT\0", KEYNAMEMAX);
386 		return name;
387 	}
388 	if (key == 0x182) {
389 		strncpy(name, "KEY_SEND\0", KEYNAMEMAX);
390 		return name;
391 	}
392 	if (key == 0x183) {
393 		strncpy(name, "KEY_SEOL\0", KEYNAMEMAX);
394 		return name;
395 	}
396 	if (key == 0x184) {
397 		strncpy(name, "KEY_SEXIT\0", KEYNAMEMAX);
398 		return name;
399 	}
400 	if (key == 0x185) {
401 		strncpy(name, "KEY_SFIND\0", KEYNAMEMAX);
402 		return name;
403 	}
404 	if (key == 0x186) {
405 		strncpy(name, "KEY_SHELP\0", KEYNAMEMAX);
406 		return name;
407 	}
408 	if (key == 0x187) {
409 		strncpy(name, "KEY_SHOME\0", KEYNAMEMAX);
410 		return name;
411 	}
412 	if (key == 0x188) {
413 		strncpy(name, "KEY_SIC\0", KEYNAMEMAX);
414 		return name;
415 	}
416 	if (key == 0x189) {
417 		strncpy(name, "KEY_SLEFT\0", KEYNAMEMAX);
418 		return name;
419 	}
420 	if (key == 0x18A) {
421 		strncpy(name, "KEY_SMESSAGE\0", KEYNAMEMAX);
422 		return name;
423 	}
424 	if (key == 0x18B) {
425 		strncpy(name, "KEY_SMOVE\0", KEYNAMEMAX);
426 		return name;
427 	}
428 	if (key == 0x18C) {
429 		strncpy(name, "KEY_SNEXT\0", KEYNAMEMAX);
430 		return name;
431 	}
432 	if (key == 0x18D) {
433 		strncpy(name, "KEY_SOPTIONS\0", KEYNAMEMAX);
434 		return name;
435 	}
436 	if (key == 0x18E) {
437 		strncpy(name, "KEY_SPREVIOUS\0", KEYNAMEMAX);
438 		return name;
439 	}
440 	if (key == 0x18F) {
441 		strncpy(name, "KEY_SPRINT\0", KEYNAMEMAX);
442 		return name;
443 	}
444 	if (key == 0x190) {
445 		strncpy(name, "KEY_SREDO\0", KEYNAMEMAX);
446 		return name;
447 	}
448 	if (key == 0x191) {
449 		strncpy(name, "KEY_SREPLACE\0", KEYNAMEMAX);
450 		return name;
451 	}
452 	if (key == 0x192) {
453 		strncpy(name, "KEY_SRIGHT\0", KEYNAMEMAX);
454 		return name;
455 	}
456 	if (key == 0x193) {
457 		strncpy(name, "KEY_SRSUME\0", KEYNAMEMAX);
458 		return name;
459 	}
460 	if (key == 0x194) {
461 		strncpy(name, "KEY_SSAVE\0", KEYNAMEMAX);
462 		return name;
463 	}
464 	if (key == 0x195) {
465 		strncpy(name, "KEY_SSUSPEND\0", KEYNAMEMAX);
466 		return name;
467 	}
468 	if (key == 0x196) {
469 		strncpy(name, "KEY_SUNDO\0", KEYNAMEMAX);
470 		return name;
471 	}
472 	if (key == 0x197) {
473 		strncpy(name, "KEY_SUSPEND\0", KEYNAMEMAX);
474 		return name;
475 	}
476 	if (key == 0x198) {
477 		strncpy(name, "KEY_UNDO\0", KEYNAMEMAX);
478 		return name;
479 	}
480 	if (key == 0x199) {
481 		strncpy(name, "KEY_MOUSE\0", KEYNAMEMAX);
482 		return name;
483 	}
484 	/* No more names. */
485 	return NULL;
486 #endif
487 }
488