summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/ldterm.h
blob: 16d76ce51c59710cc029cbb076412f76b2afeeb0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
/*	  All Rights Reserved  	*/


#ifndef _SYS_LDTERM_H
#define	_SYS_LDTERM_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"	/* SVr4.0 11.5	*/

#ifdef	__cplusplus
extern "C" {
#endif

#define	IBSIZE	16		/* "standard" input data block size */
#define	OBSIZE	64		/* "standard" output data block size */
#define	EBSIZE	16		/* "standard" echo data block size */

#ifndef MIN
#define	MIN(a, b) (((a) < (b)) ? (a) : (b))
#endif

#define	V_MIN 		tp->t_modes.c_cc[VMIN]
#define	V_TIME		tp->t_modes.c_cc[VTIME]
#define	RAW_MODE	!(tp->t_modes.c_lflag & ICANON)
#define	CANON_MODE	(tp->t_modes.c_lflag & ICANON)

/* flow control defines */
#define	TTXOLO	132
#define	TTXOHI	180
#define	HIWAT	1024
#define	LOWAT	200
#define	LDCHUNK	512


/*
 * The following for EUC and also other types of codesets.
 */

#define	EUCSIZE	sizeof (struct eucioc)
#define	EUCIN	0	/* copying eucioc_t IN from ioctl */
#define	EUCOUT	1	/* copying it OUT to user format */

/*
 * One assumption made throughout this module is:  EUC characters have
 * a display width less than 255.  Also, assumed around, is that they
 * consist of < 256 bytes, but we don't worry much about that.
 */

#define	EUC_TWIDTH	255	/* Width of a TAB, as returned by */
				/* "ldterm_dispwidth" */
#define	EUC_BSWIDTH	254	/* Width of a backspace as returned */
#define	EUC_NLWIDTH	253	/* newline & cr */
#define	EUC_CRWIDTH	252

#define	UNKNOWN_WIDTH	251

#define	EUC_MAXW	4	/* max display width and memory width, both */
#define	EUC_WARNCNT	20	/* # bad EUC erase attempts before hollering */

/* The next version will be the current LDTERM_DATA_VERSION + 1. */
#define	LDTERM_DATA_VERSION		1

/*
 * Supported codeset types:
 * When you are adding a new codeset type,  do not add any new codeset type
 * value that is smaller than LDTERM_CS_TYPE_MIN. You will also need to
 * add the new codeset type sequentially and also increase LDTERM_CS_TYPE_MAX
 * so that the LDTERM_CS_TYPE_MAX will be always equal to the last, new
 * codeset type value.
 *
 * Whenever you increase the LDTERM_CS_TYPE_MAX, you will also need to
 * increase the LDTERM_DATA_VERSION and also update the ldterm.c so that
 * ldterm will have proper version control.
 */
#define	LDTERM_CS_TYPE_MIN		1

#define	LDTERM_CS_TYPE_EUC		1
#define	LDTERM_CS_TYPE_PCCS		2
#define	LDTERM_CS_TYPE_UTF8		3

#define	LDTERM_CS_TYPE_MAX		3

/*
 * The maximum number of bytes in a character of the codeset that
 * can be handled by ldterm.
 */
#define	LDTERM_CS_MAX_BYTE_LENGTH	8

/*
 * The maximum number of sub-codesets in a codeset that can be
 * handled by ldterm.
 */
#define	LDTERM_CS_MAX_CODESETS		10

/* The maximum and minimum sub-codeset numbers possible in EUC codeset. */
#define	LDTERM_CS_TYPE_EUC_MIN_SUBCS	0
#define	LDTERM_CS_TYPE_EUC_MAX_SUBCS	3

/* The maximum and minimum sub-codeset numbers possible in PCCS codeset. */
#define	LDTERM_CS_TYPE_PCCS_MIN_SUBCS	1
#define	LDTERM_CS_TYPE_PCCS_MAX_SUBCS	LDTERM_CS_MAX_CODESETS

/* Some UTF-8 related values: */
/* The maximum and minimum UTF-8 character subsequent byte values. */
#define	LDTERM_CS_TYPE_UTF8_MIN_BYTE	0x80
#define	LDTERM_CS_TYPE_UTF8_MAX_BYTE	0xbf

/* Some maximum and minimum character values in UTF-32. */
#define	LDTERM_CS_TYPE_UTF8_MAX_P00	0x00ffff
#define	LDTERM_CS_TYPE_UTF8_MAX_P01	0x01ffff
#define	LDTERM_CS_TYPE_UTF8_MIN_CJKEXTB	0x020000
#define	LDTERM_CS_TYPE_UTF8_MAX_CJKEXTB	0x02a6d6
#define	LDTERM_CS_TYPE_UTF8_MIN_CJKCOMP	0x02f800
#define	LDTERM_CS_TYPE_UTF8_MAX_CJKCOMP	0x02fa1d
#define	LDTERM_CS_TYPE_UTF8_MIN_P14	0x0e0000
#define	LDTERM_CS_TYPE_UTF8_MAX_P14	0x0e007f
#define	LDTERM_CS_TYPE_UTF8_MIN_VARSEL	0x0e0100
#define	LDTERM_CS_TYPE_UTF8_MAX_VARSEL	0x0e01ef
#define	LDTERM_CS_TYPE_UTF8_MIN_P15	0x0f0000
#define	LDTERM_CS_TYPE_UTF8_MAX_P15	0x0ffffd
#define	LDTERM_CS_TYPE_UTF8_MIN_P16	0x100000
#define	LDTERM_CS_TYPE_UTF8_MAX_P16	0x10fffd

/* Bit shift number and mask values for conversion from UTF-8 to UCS-4. */
#define	LDTERM_CS_TYPE_UTF8_SHIFT_BITS	6
#define	LDTERM_CS_TYPE_UTF8_BIT_MASK	0x3f

/*
 * The following data structure is to provide codeset-specific
 * information for EUC and PC originated codesets (ldterm_eucpc_data_t)
 */
struct _ldterm_eucpc_data {
	uchar_t	byte_length;
	uchar_t	screen_width;
	uchar_t	msb_start;
	uchar_t	msb_end;
};
typedef struct _ldterm_eucpc_data ldterm_eucpc_data_t;

/* ldterm codeset data information for user side. */
struct _ldterm_cs_data_user {
	uchar_t	version;	/* version: 1 ~ 255 */
	uchar_t	codeset_type;
	uchar_t	csinfo_num;	/* the # of codesets */
	uchar_t	pad;
	char	locale_name[MAXNAMELEN];
	ldterm_eucpc_data_t	eucpc_data[LDTERM_CS_MAX_CODESETS];
						/* width data */
};
typedef struct _ldterm_cs_data_user ldterm_cs_data_user_t;

/* ldterm codeset data information for ldterm. */
struct _ldterm_cs_data {
	uchar_t	version;	/* version: 1 ~ 255 */
	uchar_t	codeset_type;
	uchar_t	csinfo_num;	/* the # of codesets */
	uchar_t	pad;
	char	*locale_name;
	ldterm_eucpc_data_t	eucpc_data[LDTERM_CS_MAX_CODESETS];
						/* width data */
};
typedef struct _ldterm_cs_data ldterm_cs_data_t;

/*
 * The following data structure is to handle Unicode codeset.
 * To represent a single Unicode plane, it requires to have 16384
 * 'ldterm_unicode_data_cell_t' elements.
 */
struct _ldterm_unicode_data_cell {
	uchar_t	u0:2;
	uchar_t	u1:2;
	uchar_t	u2:2;
	uchar_t	u3:2;
};
typedef struct _ldterm_unicode_data_cell ldterm_unicode_data_cell_t;

/* The following function pointers point the current codeset methods.  */
typedef struct _ldterm_cs_methods {
	int (*ldterm_dispwidth)(uchar_t, void *, int);
	int (*ldterm_memwidth)(uchar_t, void *);
} ldterm_cs_methods_t;

typedef struct ldterm_mod {
	struct termios t_modes;	/* Effective modes set by the provider below */
	struct termios t_amodes; /* Apparent modes for user programs */
	struct termios t_dmodes; /* Modes that driver wishes to process */
	unsigned int t_state;	/* internal state of ldterm module */
	int	t_line;		/* output line of tty */
	int	t_col;		/* output column of tty */
	int	t_rocount;	/* number of chars echoed since last output */
	int	t_rocol;	/* column in which first such char appeared */
	mblk_t	*t_message;	/* pointer to first mblk in message being */
				/* built */
	mblk_t	*t_endmsg;	/* pointer to last mblk in that message */
	size_t	t_msglen;	/* number of characters in that message */
	mblk_t	*t_echomp;	/* echoed output being assembled */
	int	t_rd_request;   /* Number of bytes requested by M_READ */
				/* during vmin/vtime read */
	int	t_iocid;	/* ID of ioctl reply being awaited */
	bufcall_id_t t_wbufcid;	/* ID of pending write-side bufcall */
	timeout_id_t t_vtid;	/* vtime timer id */

	/*
	 * The following are for EUC and also other types of codeset
	 * processing. Please read 'euc' as 'multi-byte codeset' instead.
	 */
	uchar_t	t_codeset;	/* current code set indicator (read side) */
	uchar_t	t_eucleft;	/* bytes left to get in current char (read) */
	uchar_t	t_eucign;	/* bytes left to ignore (output post proc) */
	uchar_t	t_eucpad;	/* padding ... for eucwioc */
	eucioc_t eucwioc;	/* eucioc structure (have to use bcopy) */
	uchar_t	*t_eucp;	/* ptr to parallel array of column widths */
	mblk_t	*t_eucp_mp;	/* the m_blk that holds parallel array */
	uchar_t	t_maxeuc;	/* the max length in memory bytes of an EUC */
	int	t_eucwarn;	/* bad EUC counter */

	/*
	 * The t_csdata, t_csmethods, t_scratch, and, t_scratch_len data
	 * fields are to support various non-EUC codesets.
	 */
	ldterm_cs_data_t	t_csdata;
	struct _ldterm_cs_methods t_csmethods;
	uchar_t			t_scratch[LDTERM_CS_MAX_BYTE_LENGTH];
	uchar_t			t_scratch_len;

	mblk_t	*t_closeopts;	/* preallocated stroptions for close */
	mblk_t	*t_drainmsg;	/* preallocated TCSBRK drain message */
} ldtermstd_state_t;

/*
 * Internal state bits.
 */
#define	TS_XCLUDE	0x00000001	/* exclusive-use flag against open */
#define	TS_TTSTOP	0x00000002	/* output stopped by ^S */
#define	TS_TBLOCK	0x00000004	/* input stopped by IXOFF mode */
#define	TS_QUOT		0x00000008	/* last character input was \ */
#define	TS_ERASE	0x00000010	/* within a \.../ for PRTRUB */
#define	TS_SLNCH	0x00000020	/* next character service routine */
					/* sees is literal */
#define	TS_PLNCH	0x00000040	/* next character put routine sees */
					/* is literal */

#define	TS_TTCR		0x00000080	/* mapping NL to CR-NL */
#define	TS_NOCANON	0x00000100	/* canonicalization done by somebody */
					/* below us */
#define	TS_RESCAN	0x00000400	/* canonicalization mode changed, */
					/* rescan input queue */
#define	TS_MREAD	0x00000800	/* timer started for vmin/vtime */
#define	TS_FLUSHWAIT	0x00001000	/* waiting for flush on write side */
#define	TS_MEUC		0x00010000	/* TRUE if multi-byte codesets used */
#define	TS_WARNED	0x00020000	/* already warned on console */
#define	TS_CLOSE	0x00040000	/* close in progress */
#define	TS_IOCWAIT	0x00080000	/* waiting for reply to ioctl message */
#define	TS_IFBLOCK	0x00100000	/* input flow blocked */
#define	TS_OFBLOCK	0x00200000	/* output flow blocked */
#define	TS_ISPTSTTY	0x00400000	/* is x/open terminal */

#ifdef	__cplusplus
}
#endif

#endif	/* _SYS_LDTERM_H */