xref: /illumos-gate/usr/src/lib/libxcurses/src/libc/xcurses/wacs.c (revision b0bb0d63258be430b0e22afcb1581974bd7b568e)
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 /*
28  * wacs.c
29  *
30  * XCurses Library
31  *
32  * Copyright 1990, 1995 by Mortice Kern Systems Inc.  All rights reserved.
33  *
34  */
35 
36 #if M_RCSID
37 #ifndef lint
38 static char rcsID[] = "$Header: /rd/src/libc/xcurses/rcs/wacs.c 1.8 1995/10/02 19:48:06 ant Exp $";
39 #endif
40 #endif
41 
42 #include <private.h>
43 #include <limits.h>
44 
45 /*
46  * Mapping defined in Xcurses Section 6.2.12 (p260).
47  */
48 const cchar_t __WACS_VLINE =
49 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("x") };
50 const cchar_t __WACS_HLINE =
51 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("q") };
52 const cchar_t __WACS_ULCORNER =
53 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("l") };
54 const cchar_t __WACS_URCORNER =
55 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("k") };
56 const cchar_t __WACS_LLCORNER =
57 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("m") };
58 const cchar_t __WACS_LRCORNER =
59 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("j") };
60 const cchar_t __WACS_RTEE =
61 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("u") };
62 const cchar_t __WACS_LTEE =
63 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("t") };
64 const cchar_t __WACS_BTEE =
65 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("v") };
66 const cchar_t __WACS_TTEE =
67 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("w") };
68 const cchar_t __WACS_PLUS =
69 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("n") };
70 const cchar_t __WACS_S1 =
71 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("o") };
72 const cchar_t __WACS_S9 =
73 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("s") };
74 const cchar_t __WACS_DIAMOND =
75 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("`") };
76 const cchar_t __WACS_CKBOARD =
77 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("a") };
78 const cchar_t __WACS_DEGREE =
79 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("f") };
80 const cchar_t __WACS_PLMINUS =
81 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("g") };
82 const cchar_t __WACS_BULLET =
83 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("~") };
84 const cchar_t __WACS_LARROW =
85 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L(",") };
86 const cchar_t __WACS_RARROW =
87 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("+") };
88 const cchar_t __WACS_DARROW =
89 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L(".") };
90 const cchar_t __WACS_UARROW =
91 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("-") };
92 const cchar_t __WACS_BOARD =
93 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("h") };
94 const cchar_t __WACS_LANTERN =
95 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("i") };
96 const cchar_t __WACS_BLOCK =
97 	{ 1, 1, WA_ALTCHARSET, 0, M_MB_L("0") };
98 
99 #ifdef NOT_NOW
100 const cchar_t *WACS_VLINE = (const cchar_t *) &__WACS_VLINE;
101 const cchar_t *WACS_HLINE = (const cchar_t *) &__WACS_HLINE;
102 const cchar_t *WACS_ULCORNER = (const cchar_t *) &__WACS_ULCORNER;
103 const cchar_t *WACS_URCORNER = (const cchar_t *) &__WACS_URCORNER;
104 const cchar_t *WACS_LLCORNER = (const cchar_t *) &__WACS_LLCORNER;
105 const cchar_t *WACS_LRCORNER = (const cchar_t *) &__WACS_LRCORNER;
106 const cchar_t *WACS_RTEE = (const cchar_t *) &__WACS_RTEE;
107 const cchar_t *WACS_LTEE = (const cchar_t *) &__WACS_LTEE;
108 const cchar_t *WACS_BTEE = (const cchar_t *) &__WACS_BTEE;
109 const cchar_t *WACS_TTEE = (const cchar_t *) &__WACS_TTEE;
110 const cchar_t *WACS_PLUS = (const cchar_t *) &__WACS_PLUS;
111 const cchar_t *WACS_S1 = (const cchar_t *) &__WACS_S1;
112 const cchar_t *WACS_S9 = (const cchar_t *) &__WACS_S9;
113 const cchar_t *WACS_DIAMOND = (const cchar_t *) &__WACS_DIAMOND;
114 const cchar_t *WACS_CKBOARD = (const cchar_t *) &__WACS_CKBOARD;
115 const cchar_t *WACS_DEGREE = (const cchar_t *) &__WACS_DEGREE;
116 const cchar_t *WACS_PLMINUS = (const cchar_t *) &__WACS_PLMINUS;
117 const cchar_t *WACS_BULLET = (const cchar_t *) &__WACS_BULLET;
118 const cchar_t *WACS_LARROW = (const cchar_t *) &__WACS_LARROW;
119 const cchar_t *WACS_RARROW = (const cchar_t *) &__WACS_RARROW;
120 const cchar_t *WACS_DARROW = (const cchar_t *) &__WACS_DARROW;
121 const cchar_t *WACS_UARROW = (const cchar_t *) &__WACS_UARROW;
122 const cchar_t *WACS_BOARD = (const cchar_t *) &__WACS_BOARD;
123 const cchar_t *WACS_LANTERN = (const cchar_t *) &__WACS_LANTERN;
124 const cchar_t *WACS_BLOCK = (const cchar_t *) &__WACS_BLOCK;
125 #endif
126 
127 /* The default characters are from the _primary_ character set. */
128 static unsigned char acs_defaults[] =
129 	"x|q-l+k+m+j+u+t+v+w+n+o-s_`+a:f\'g#~o,<+>.v-^h#i#0#";
130 
131 int
132 __m_acs_cc(chtype acs, cchar_t *cc)
133 {
134 	int i, ch;
135 	unsigned char *acsc;
136 
137 	/* Is it a single-byte character? */
138 	if (UCHAR_MAX < (A_CHARTEXT & acs) || __m_chtype_cc(acs, cc) == ERR)
139 		return -1;
140 
141 	if (!(acs & A_ALTCHARSET))
142 		return 0;
143 
144 	/* Pick the acs mapping string to use. */
145 	if (acs_chars == (char *) 0) {
146 		/* Use primary character set. */
147 		acsc = acs_defaults;
148 		acs &= ~A_ALTCHARSET;
149 	} else {
150 		acsc = (unsigned char *) acs_chars;
151 	}
152 
153 	/* Assume that acsc is even in length. */
154 	for (i = 0; acsc[i] != '\0'; i += 2) {
155 		if (acsc[i] == (acs & A_CHARTEXT)) {
156 			(void) __m_chtype_cc(
157 				(chtype) ((acs & A_ATTRIBUTES) | acsc[i+1]), cc
158 			);
159 			break;
160 		}
161 	}
162 
163 	return 0;
164 }
165 
166 int
167 __m_wacs_cc(const cchar_t *acs, cchar_t *cc)
168 {
169 	int i;
170 	unsigned char *acsc, mb[MB_LEN_MAX];
171 
172 	*cc = *acs;
173 	cc->_f = 1;
174 
175 	/* Is it a single-byte character? */
176 	if (!(acs->_at & WA_ALTCHARSET)
177 	|| acs->_n != 1 || wctomb((char *) mb, acs->_wc[0]) != 1)
178 		/* No, just return the original character. */
179 		return 0;
180 
181 	/* Pick the acs mapping string to use. */
182 	if (acs_chars == (char *) 0) {
183 		/* Use primary character set. */
184 		acsc = acs_defaults;
185 		cc->_at &= ~A_ALTCHARSET;
186 	} else {
187 		acsc = (unsigned char *) acs_chars;
188 	}
189 
190 	/* Assume that acsc is even in length. */
191 	for (i = 0; acsc[i] != '\0'; i += 2) {
192 		if (acsc[i] == *mb) {
193 			(void) mbtowc(cc->_wc, (char *) &acsc[i+1], 1);
194 			cc->_at |= A_ALTCHARSET;
195 			break;
196 		}
197 	}
198 
199 	return 0;
200 }
201