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