xref: /illumos-gate/usr/src/lib/libcurses/screen/wctomb.c (revision 734b6a94890be549309b21156f8ed6d4561cac51)
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 /*  Copyright (c) 1988 AT&T */
23 /*    All Rights Reserved   */
24 
25 
26 /*
27  *      Copyright (c) 1997, by Sun Microsystems, Inc.
28  *      All rights reserved.
29  */
30 
31 #pragma ident	"%Z%%M%	%I%	%E% SMI"
32 
33 /*LINTLIBRARY*/
34 
35 #include <sys/types.h>
36 #include <widec.h>
37 #include <ctype.h>
38 #include "curses_wchar.h"
39 
40 int
41 _curs_wctomb(char *s, wchar_t wchar)
42 {
43 	char *olds = s;
44 	int size, index;
45 	unsigned char d;
46 	if (!s)
47 		return (0);
48 	if (wchar <= 0177 || (wchar <= 0377 && (iscntrl((int)wchar) != 0)))  {
49 		/* LINTED */
50 		*s++ = (char)wchar;
51 		return (1);
52 	}
53 	switch (wchar & EUCMASK) {
54 
55 		case P11:
56 			size = eucw1;
57 			break;
58 
59 		case P01:
60 			/* LINTED */
61 			*s++ = (char)SS2;
62 			size = eucw2;
63 			break;
64 
65 		case P10:
66 			/* LINTED */
67 			*s++ = (char)SS3;
68 			size = eucw3;
69 			break;
70 
71 		default:
72 			return (-1);
73 	}
74 	if ((index = size) <= 0)
75 		return (-1);
76 	while (index--) {
77 		/* LINTED */
78 		d = wchar | 0200;
79 		wchar >>= 7;
80 		if (iscntrl(d))
81 			return (-1);
82 		s[index] = d;
83 	}
84 	/* LINTED */
85 	return ((int)(s - olds) + size);
86 }
87