xref: /titanic_51/usr/src/lib/libbc/libc/gen/common/wcstombs.c (revision 6f45ec7b0b964c3be967c4880e8867ac1e7763a5)
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 1991 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*
28  * wcstombs
29  */
30 
31 #pragma ident	"%Z%%M%	%I%	%E% SMI"
32 
33 #if !defined(lint) && defined(SCCSIDS)
34 static  char *sccsid = "%Z%%M% %I%     %E% SMI";
35 #endif
36 
37 #include <sys/types.h>
38 #include "codeset.h"
39 #include "mbextern.h"
40 
41 size_t
42 wcstombs(s, pwcs, n)
43 	char *s;
44 	wchar_t * pwcs;
45 	size_t n;
46 {
47 	char *handle;		/* handle */
48 	int (*p)();
49 	int num = 0;
50 	int ret;
51 
52 	switch (_code_set_info.code_id) {
53 	case CODESET_NONE:
54 		/*
55 		 * default code set
56 		 */
57 		 while (*pwcs && (num < n)) {
58 			*s++ = *pwcs++ & 0x00ff;
59 			num++;
60 		 }
61 		 if (num < n)
62 			*s = 0;
63 		 return (num);
64 		 break;
65 	case CODESET_EUC:
66 		/*
67 		 * EUC code set
68 		 */
69 		 return(_wcstombs_euc(s, pwcs, n));
70 		 break;
71 
72 	case CODESET_XCCS:
73 		/*
74 		 * XCCS code set
75 		 */
76 		return(_wcstombs_xccs(s, pwcs, n));
77 		break;
78 
79 	case CODESET_ISO2022:
80 		/*
81 		 * ISO family
82 		 */
83 		return(_wcstombs_iso(s, pwcs, n));
84 		break;
85 
86 	default:
87 		/*
88 		 * User defined code set
89 		 */
90 		 handle = _ml_open_library();
91 		 if (handle == (char *)NULL)
92 			return(ERROR_NO_LIB);	/* No user library */
93 		 p = (int (*)()) dlsym(handle, "_wcstombs");
94 		 if (p == (int (*)()) NULL)
95 			return(ERROR_NO_SYM);
96 		 ret = (*p)(s, pwcs, n);
97 		 return (ret);
98 		 break;
99 	}
100 	/* NOTREACHED */
101 }
102