xref: /illumos-gate/usr/src/lib/libxcurses/src/libc/xcurses/wacs.c (revision dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright (c) 1995, by Sun Microsystems, Inc.
24  * All rights reserved.
25  */
26 
27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
28 
29 /*
30  * wacs.c
31  *
32  * XCurses Library
33  *
34  * Copyright 1990, 1995 by Mortice Kern Systems Inc.  All rights reserved.
35  *
36  */
37 
38 #if M_RCSID
39 #ifndef lint
40 static char rcsID[] = "$Header: /rd/src/libc/xcurses/rcs/wacs.c 1.8 1995/10/02 19:48:06 ant Exp $";
41 #endif
42 #endif
43 
44 #include <private.h>
45 #include <limits.h>
46 
47 /*
48  * Mapping defined in Xcurses Section 6.2.12 (p260).
49  */
50 const cchar_t __WACS_VLINE =
51 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("x") };
52 const cchar_t __WACS_HLINE =
53 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("q") };
54 const cchar_t __WACS_ULCORNER =
55 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("l") };
56 const cchar_t __WACS_URCORNER =
57 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("k") };
58 const cchar_t __WACS_LLCORNER =
59 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("m") };
60 const cchar_t __WACS_LRCORNER =
61 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("j") };
62 const cchar_t __WACS_RTEE =
63 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("u") };
64 const cchar_t __WACS_LTEE =
65 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("t") };
66 const cchar_t __WACS_BTEE =
67 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("v") };
68 const cchar_t __WACS_TTEE =
69 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("w") };
70 const cchar_t __WACS_PLUS =
71 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("n") };
72 const cchar_t __WACS_S1 =
73 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("o") };
74 const cchar_t __WACS_S9 =
75 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("s") };
76 const cchar_t __WACS_DIAMOND =
77 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("`") };
78 const cchar_t __WACS_CKBOARD =
79 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("a") };
80 const cchar_t __WACS_DEGREE =
81 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("f") };
82 const cchar_t __WACS_PLMINUS =
83 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("g") };
84 const cchar_t __WACS_BULLET =
85 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("~") };
86 const cchar_t __WACS_LARROW =
87 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L(",") };
88 const cchar_t __WACS_RARROW =
89 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("+") };
90 const cchar_t __WACS_DARROW =
91 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L(".") };
92 const cchar_t __WACS_UARROW =
93 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("-") };
94 const cchar_t __WACS_BOARD =
95 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("h") };
96 const cchar_t __WACS_LANTERN =
97 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("i") };
98 const cchar_t __WACS_BLOCK =
99 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("0") };
100 
101 #ifdef NOT_NOW
102 const cchar_t *WACS_VLINE = (const cchar_t *) &__WACS_VLINE;
103 const cchar_t *WACS_HLINE = (const cchar_t *) &__WACS_HLINE;
104 const cchar_t *WACS_ULCORNER = (const cchar_t *) &__WACS_ULCORNER;
105 const cchar_t *WACS_URCORNER = (const cchar_t *) &__WACS_URCORNER;
106 const cchar_t *WACS_LLCORNER = (const cchar_t *) &__WACS_LLCORNER;
107 const cchar_t *WACS_LRCORNER = (const cchar_t *) &__WACS_LRCORNER;
108 const cchar_t *WACS_RTEE = (const cchar_t *) &__WACS_RTEE;
109 const cchar_t *WACS_LTEE = (const cchar_t *) &__WACS_LTEE;
110 const cchar_t *WACS_BTEE = (const cchar_t *) &__WACS_BTEE;
111 const cchar_t *WACS_TTEE = (const cchar_t *) &__WACS_TTEE;
112 const cchar_t *WACS_PLUS = (const cchar_t *) &__WACS_PLUS;
113 const cchar_t *WACS_S1 = (const cchar_t *) &__WACS_S1;
114 const cchar_t *WACS_S9 = (const cchar_t *) &__WACS_S9;
115 const cchar_t *WACS_DIAMOND = (const cchar_t *) &__WACS_DIAMOND;
116 const cchar_t *WACS_CKBOARD = (const cchar_t *) &__WACS_CKBOARD;
117 const cchar_t *WACS_DEGREE = (const cchar_t *) &__WACS_DEGREE;
118 const cchar_t *WACS_PLMINUS = (const cchar_t *) &__WACS_PLMINUS;
119 const cchar_t *WACS_BULLET = (const cchar_t *) &__WACS_BULLET;
120 const cchar_t *WACS_LARROW = (const cchar_t *) &__WACS_LARROW;
121 const cchar_t *WACS_RARROW = (const cchar_t *) &__WACS_RARROW;
122 const cchar_t *WACS_DARROW = (const cchar_t *) &__WACS_DARROW;
123 const cchar_t *WACS_UARROW = (const cchar_t *) &__WACS_UARROW;
124 const cchar_t *WACS_BOARD = (const cchar_t *) &__WACS_BOARD;
125 const cchar_t *WACS_LANTERN = (const cchar_t *) &__WACS_LANTERN;
126 const cchar_t *WACS_BLOCK = (const cchar_t *) &__WACS_BLOCK;
127 #endif
128 
129 /* The default characters are from the _primary_ character set. */
130 static unsigned char acs_defaults[] =
131 	"x|q-l+k+m+j+u+t+v+w+n+o-s_`+a:f\'g#~o,<+>.v-^h#i#0#";
132 
133 int
134 __m_acs_cc(chtype acs, cchar_t *cc)
135 {
136 	int i, ch;
137 	unsigned char *acsc;
138 
139 	/* Is it a single-byte character? */
140 	if (UCHAR_MAX < (A_CHARTEXT & acs) || __m_chtype_cc(acs, cc) == ERR)
141 		return -1;
142 
143 	if (!(acs & A_ALTCHARSET))
144 		return 0;
145 
146 	/* Pick the acs mapping string to use. */
147 	if (acs_chars == (char *) 0) {
148 		/* Use primary character set. */
149 		acsc = acs_defaults;
150 		acs &= ~A_ALTCHARSET;
151 	} else {
152 		acsc = (unsigned char *) acs_chars;
153 	}
154 
155 	/* Assume that acsc is even in length. */
156 	for (i = 0; acsc[i] != '\0'; i += 2) {
157 		if (acsc[i] == (acs & A_CHARTEXT)) {
158 			(void) __m_chtype_cc(
159 				(chtype) ((acs & A_ATTRIBUTES) | acsc[i+1]), cc
160 			);
161 			break;
162 		}
163 	}
164 
165 	return 0;
166 }
167 
168 int
169 __m_wacs_cc(const cchar_t *acs, cchar_t *cc)
170 {
171 	int i;
172 	unsigned char *acsc, mb[MB_LEN_MAX];
173 
174 	*cc = *acs;
175 	cc->_f = 1;
176 
177 	/* Is it a single-byte character? */
178 	if (!(acs->_at & WA_ALTCHARSET)
179 	|| acs->_n != 1 || wctomb((char *) mb, acs->_wc[0]) != 1)
180 		/* No, just return the original character. */
181 		return 0;
182 
183 	/* Pick the acs mapping string to use. */
184 	if (acs_chars == (char *) 0) {
185 		/* Use primary character set. */
186 		acsc = acs_defaults;
187 		cc->_at &= ~A_ALTCHARSET;
188 	} else {
189 		acsc = (unsigned char *) acs_chars;
190 	}
191 
192 	/* Assume that acsc is even in length. */
193 	for (i = 0; acsc[i] != '\0'; i += 2) {
194 		if (acsc[i] == *mb) {
195 			(void) mbtowc(cc->_wc, (char *) &acsc[i+1], 1);
196 			cc->_at |= A_ALTCHARSET;
197 			break;
198 		}
199 	}
200 
201 	return 0;
202 }
203