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