GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: usr.bin/mg/cinfo.c Lines: 0 31 0.0 %
Date: 2017-11-07 Branches: 0 21 0.0 %

Line Branch Exec Source
1
/*	$OpenBSD: cinfo.c,v 1.18 2015/03/19 21:22:15 bcallah Exp $	*/
2
3
/* This file is in the public domain. */
4
5
/*
6
 *		Character class tables.
7
 * Do it yourself character classification
8
 * macros, that understand the multinational character set,
9
 * and let me ask some questions the standard macros (in
10
 * ctype.h) don't let you ask.
11
 */
12
13
#include <sys/queue.h>
14
#include <signal.h>
15
#include <stdio.h>
16
#include <string.h>
17
18
#include "def.h"
19
20
/*
21
 * This table, indexed by a character drawn
22
 * from the 256 member character set, is used by my
23
 * own character type macros to answer questions about the
24
 * type of a character. It handles the full multinational
25
 * character set, and lets me ask some questions that the
26
 * standard "ctype" macros cannot ask.
27
 */
28
/*
29
 * Due to incompatible behaviour between "standard" emacs and
30
 * ctags word traversing, '_' character's value is changed on
31
 * the fly in ctags mode, hence non-const.
32
 */
33
char cinfo[256] = {
34
	_MG_C, _MG_C, _MG_C, _MG_C,				      /* 0x0X */
35
	_MG_C, _MG_C, _MG_C, _MG_C,
36
	_MG_C, _MG_C, _MG_C, _MG_C,
37
	_MG_C, _MG_C, _MG_C, _MG_C,
38
	_MG_C, _MG_C, _MG_C, _MG_C,				      /* 0x1X */
39
	_MG_C, _MG_C, _MG_C, _MG_C,
40
	_MG_C, _MG_C, _MG_C, _MG_C,
41
	_MG_C, _MG_C, _MG_C, _MG_C,
42
	0, _MG_P, 0, 0,						      /* 0x2X */
43
	_MG_W, _MG_W, 0, _MG_W,
44
	0, 0, 0, 0,
45
	0, 0, _MG_P, 0,
46
	_MG_D | _MG_W, _MG_D | _MG_W, _MG_D | _MG_W, _MG_D | _MG_W,   /* 0x3X */
47
	_MG_D | _MG_W, _MG_D | _MG_W, _MG_D | _MG_W, _MG_D | _MG_W,
48
	_MG_D | _MG_W, _MG_D | _MG_W, 0, 0,
49
	0, 0, 0, _MG_P,
50
	0, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,		      /* 0x4X */
51
	_MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
52
	_MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
53
	_MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
54
	_MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,   /* 0x5X */
55
	_MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
56
	_MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, 0,
57
	0, 0, 0, 0,
58
	0, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,		      /* 0x6X */
59
	_MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
60
	_MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
61
	_MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
62
	_MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,   /* 0x7X */
63
	_MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
64
	_MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, 0,
65
	0, 0, 0, _MG_C,
66
	0, 0, 0, 0,						      /* 0x8X */
67
	0, 0, 0, 0,
68
	0, 0, 0, 0,
69
	0, 0, 0, 0,
70
	0, 0, 0, 0,						      /* 0x9X */
71
	0, 0, 0, 0,
72
	0, 0, 0, 0,
73
	0, 0, 0, 0,
74
	0, 0, 0, 0,						      /* 0xAX */
75
	0, 0, 0, 0,
76
	0, 0, 0, 0,
77
	0, 0, 0, 0,
78
	0, 0, 0, 0,						      /* 0xBX */
79
	0, 0, 0, 0,
80
	0, 0, 0, 0,
81
	0, 0, 0, 0,
82
	_MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,   /* 0xCX */
83
	_MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
84
	_MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
85
	_MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
86
	0, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,		      /* 0xDX */
87
	_MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
88
	_MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
89
	_MG_U | _MG_W, _MG_U | _MG_W, 0, _MG_W,
90
	_MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,   /* 0xEX */
91
	_MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
92
	_MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
93
	_MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
94
	0, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,		      /* 0xFX */
95
	_MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
96
	_MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
97
	_MG_L | _MG_W, _MG_L | _MG_W, 0, 0
98
};
99
100
/*
101
 * Find the name of a keystroke.  Needs to be changed to handle 8-bit printing
102
 * characters and function keys better.	 Returns a pointer to the terminating
103
 * '\0'.  Returns NULL on failure.
104
 */
105
char *
106
getkeyname(char *cp, size_t len, int k)
107
{
108
	const char	*np;
109
	size_t		 copied;
110
111
	if (k < 0)
112
		k = CHARMASK(k);	/* sign extended char */
113
	switch (k) {
114
	case CCHR('@'):
115
		np = "C-SPC";
116
		break;
117
	case CCHR('I'):
118
		np = "TAB";
119
		break;
120
	case CCHR('M'):
121
		np = "RET";
122
		break;
123
	case CCHR('['):
124
		np = "ESC";
125
		break;
126
	case ' ':
127
		np = "SPC";
128
		break;		/* yuck again */
129
	case CCHR('?'):
130
		np = "DEL";
131
		break;
132
	default:
133
		if (k >= KFIRST && k <= KLAST &&
134
		    (np = keystrings[k - KFIRST]) != NULL)
135
			break;
136
		if (k > CCHR('?')) {
137
			*cp++ = '0';
138
			*cp++ = ((k >> 6) & 7) + '0';
139
			*cp++ = ((k >> 3) & 7) + '0';
140
			*cp++ = (k & 7) + '0';
141
			*cp = '\0';
142
			return (cp);
143
		} else if (k < ' ') {
144
			*cp++ = 'C';
145
			*cp++ = '-';
146
			k = CCHR(k);
147
			if (ISUPPER(k))
148
				k = TOLOWER(k);
149
		}
150
		*cp++ = k;
151
		*cp = '\0';
152
		return (cp);
153
	}
154
	copied = strlcpy(cp, np, len);
155
	if (copied >= len)
156
		copied = len - 1;
157
	return (cp + copied);
158
}