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-1998 by Sun Microsystems, Inc. 24 * All rights reserved. 25 */ 26 27 #pragma ident "%Z%%M% %I% %E% SMI" 28 29 /* LINTLIBRARY */ 30 31 /* 32 * wacs.c 33 * 34 * XCurses Library 35 * 36 * Copyright 1990, 1995 by Mortice Kern Systems Inc. All rights reserved. 37 * 38 */ 39 40 #if M_RCSID 41 #ifndef lint 42 static char rcsID[] = 43 "$Header: /team/ps/sun_xcurses/archive/local_changes/xcurses/src/lib/" 44 "libxcurses/src/libc/xcurses/rcs/wacs.c 1.6 1998/05/04 21:16:22 " 45 "cbates Exp $"; 46 #endif 47 #endif 48 49 #include <private.h> 50 #include <limits.h> 51 52 /* 53 * Mapping defined in Xcurses Section 6.2.12 (p260). 54 */ 55 const cchar_t __WACS_VLINE = 56 { 1, 1, 0, WA_ALTCHARSET, L"x" }; 57 const cchar_t __WACS_HLINE = 58 { 1, 1, 0, WA_ALTCHARSET, L"q" }; 59 const cchar_t __WACS_ULCORNER = 60 { 1, 1, 0, WA_ALTCHARSET, L"l" }; 61 const cchar_t __WACS_URCORNER = 62 { 1, 1, 0, WA_ALTCHARSET, L"k" }; 63 const cchar_t __WACS_LLCORNER = 64 { 1, 1, 0, WA_ALTCHARSET, L"m" }; 65 const cchar_t __WACS_LRCORNER = 66 { 1, 1, 0, WA_ALTCHARSET, L"j" }; 67 const cchar_t __WACS_RTEE = 68 { 1, 1, 0, WA_ALTCHARSET, L"u" }; 69 const cchar_t __WACS_LTEE = 70 { 1, 1, 0, WA_ALTCHARSET, L"t" }; 71 const cchar_t __WACS_BTEE = 72 { 1, 1, 0, WA_ALTCHARSET, L"v" }; 73 const cchar_t __WACS_TTEE = 74 { 1, 1, 0, WA_ALTCHARSET, L"w" }; 75 const cchar_t __WACS_PLUS = 76 { 1, 1, 0, WA_ALTCHARSET, L"n" }; 77 const cchar_t __WACS_S1 = 78 { 1, 1, 0, WA_ALTCHARSET, L"o" }; 79 const cchar_t __WACS_S9 = 80 { 1, 1, 0, WA_ALTCHARSET, L"s" }; 81 const cchar_t __WACS_DIAMOND = 82 { 1, 1, 0, WA_ALTCHARSET, L"`" }; 83 const cchar_t __WACS_CKBOARD = 84 { 1, 1, 0, WA_ALTCHARSET, L"a" }; 85 const cchar_t __WACS_DEGREE = 86 { 1, 1, 0, WA_ALTCHARSET, L"f" }; 87 const cchar_t __WACS_PLMINUS = 88 { 1, 1, 0, WA_ALTCHARSET, L"g" }; 89 const cchar_t __WACS_BULLET = 90 { 1, 1, 0, WA_ALTCHARSET, L"~" }; 91 const cchar_t __WACS_LARROW = 92 { 1, 1, 0, WA_ALTCHARSET, L"," }; 93 const cchar_t __WACS_RARROW = 94 { 1, 1, 0, WA_ALTCHARSET, L"+" }; 95 const cchar_t __WACS_DARROW = 96 { 1, 1, 0, WA_ALTCHARSET, L"." }; 97 const cchar_t __WACS_UARROW = 98 { 1, 1, 0, WA_ALTCHARSET, L"-" }; 99 const cchar_t __WACS_BOARD = 100 { 1, 1, 0, WA_ALTCHARSET, L"h" }; 101 const cchar_t __WACS_LANTERN = 102 { 1, 1, 0, WA_ALTCHARSET, L"i" }; 103 const cchar_t __WACS_BLOCK = 104 { 1, 1, 0, WA_ALTCHARSET, L"0" }; 105 106 /* The default characters are from the _primary_ character set. */ 107 static const unsigned char acs_defaults[] = 108 "x|q-l+k+m+j+u+t+v+w+n+o-s_`+a:f\'g#~o,<+>.v-^h#i#0#"; 109 110 int 111 __m_acs_cc(chtype acs, cchar_t *cc) 112 { 113 int i; 114 unsigned char *acsc; 115 chtype vacs; 116 117 vacs = acs & A_CHARTEXT; 118 119 /* Is it a single-byte character? */ 120 if (UCHAR_MAX < vacs || 121 __m_chtype_cc(acs, cc) == ERR) 122 return (-1); 123 124 if (!(acs & A_ALTCHARSET)) 125 return (0); 126 127 /* Pick the acs mapping string to use. */ 128 if (acs_chars == NULL) { 129 /* Use primary character set. */ 130 acsc = (unsigned char *) acs_defaults; 131 acs &= ~A_ALTCHARSET; 132 } else { 133 acsc = (unsigned char *) acs_chars; 134 } 135 136 /* Assume that acsc is even in length. */ 137 for (i = 0; acsc[i] != '\0'; i += 2) { 138 if (acsc[i] == vacs) { 139 (void) __m_chtype_cc((chtype) 140 ((acs & A_ATTRIBUTES) | acsc[i+1]), cc); 141 break; 142 } 143 } 144 145 return (0); 146 } 147 148 /* Returns 1 if ALTCHARSET is to be cleared (override). 0 Otherwise. */ 149 int 150 __m_wacs_cc(const cchar_t *acs, cchar_t *cc) 151 { 152 int i; 153 unsigned char *acsc, mb[MB_LEN_MAX]; 154 int clearit = 0; 155 156 *cc = *acs; 157 cc->_f = 1; 158 159 /* Is it a single-byte character? */ 160 if (!(acs->_at & WA_ALTCHARSET) || 161 acs->_n != 1 || wctomb((char *) mb, acs->_wc[0]) != 1) 162 /* No, just return the original character. */ 163 return (0); 164 165 /* Pick the acs mapping string to use. */ 166 if (acs_chars == NULL) { 167 /* Use primary character set. */ 168 acsc = (unsigned char *) acs_defaults; 169 clearit = 1; 170 } else { 171 acsc = (unsigned char *) acs_chars; 172 } 173 174 /* Assume that acsc is even in length. */ 175 for (i = 0; acsc[i] != '\0'; i += 2) { 176 if (acsc[i] == *mb) { 177 (void) mbtowc(cc->_wc, (char *) &acsc[i+1], 1); 178 break; 179 } 180 } 181 182 return (clearit); 183 } 184