xref: /illumos-gate/usr/src/contrib/ast/src/lib/libast/comp/catopen.c (revision b30d193948be5a7794d7ae3ba0ed9c2f72c88e0f)
1*b30d1939SAndy Fiddaman /***********************************************************************
2*b30d1939SAndy Fiddaman *                                                                      *
3*b30d1939SAndy Fiddaman *               This software is part of the ast package               *
4*b30d1939SAndy Fiddaman *          Copyright (c) 1985-2011 AT&T Intellectual Property          *
5*b30d1939SAndy Fiddaman *                      and is licensed under the                       *
6*b30d1939SAndy Fiddaman *                 Eclipse Public License, Version 1.0                  *
7*b30d1939SAndy Fiddaman *                    by AT&T Intellectual Property                     *
8*b30d1939SAndy Fiddaman *                                                                      *
9*b30d1939SAndy Fiddaman *                A copy of the License is available at                 *
10*b30d1939SAndy Fiddaman *          http://www.eclipse.org/org/documents/epl-v10.html           *
11*b30d1939SAndy Fiddaman *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12*b30d1939SAndy Fiddaman *                                                                      *
13*b30d1939SAndy Fiddaman *              Information and Software Systems Research               *
14*b30d1939SAndy Fiddaman *                            AT&T Research                             *
15*b30d1939SAndy Fiddaman *                           Florham Park NJ                            *
16*b30d1939SAndy Fiddaman *                                                                      *
17*b30d1939SAndy Fiddaman *                 Glenn Fowler <gsf@research.att.com>                  *
18*b30d1939SAndy Fiddaman *                  David Korn <dgk@research.att.com>                   *
19*b30d1939SAndy Fiddaman *                   Phong Vo <kpv@research.att.com>                    *
20*b30d1939SAndy Fiddaman *                                                                      *
21*b30d1939SAndy Fiddaman ***********************************************************************/
22*b30d1939SAndy Fiddaman #pragma prototyped
23*b30d1939SAndy Fiddaman 
24*b30d1939SAndy Fiddaman /*
25*b30d1939SAndy Fiddaman  * catopen intercept
26*b30d1939SAndy Fiddaman  * the ast catalogs are checked first
27*b30d1939SAndy Fiddaman  * the ast mc* and native cat* routines do all the work
28*b30d1939SAndy Fiddaman  * catalogs found by mcfind() are converted from utf to ucs
29*b30d1939SAndy Fiddaman  *
30*b30d1939SAndy Fiddaman  * nl_catd is cast to void*
31*b30d1939SAndy Fiddaman  * this is either an Mc_t* (Mc_t.set != 0)
32*b30d1939SAndy Fiddaman  * or a Cc_t* where Cc_t.cat is the native nl_catd
33*b30d1939SAndy Fiddaman  */
34*b30d1939SAndy Fiddaman 
35*b30d1939SAndy Fiddaman #include <ast.h>
36*b30d1939SAndy Fiddaman #include <mc.h>
37*b30d1939SAndy Fiddaman #include <nl_types.h>
38*b30d1939SAndy Fiddaman #include <iconv.h>
39*b30d1939SAndy Fiddaman 
40*b30d1939SAndy Fiddaman #ifndef DEBUG_trace
41*b30d1939SAndy Fiddaman #define DEBUG_trace		0
42*b30d1939SAndy Fiddaman #endif
43*b30d1939SAndy Fiddaman #if DEBUG_trace
44*b30d1939SAndy Fiddaman #undef setlocale
45*b30d1939SAndy Fiddaman #endif
46*b30d1939SAndy Fiddaman 
47*b30d1939SAndy Fiddaman #if _lib_catopen
48*b30d1939SAndy Fiddaman 
49*b30d1939SAndy Fiddaman #undef	nl_catd
50*b30d1939SAndy Fiddaman #undef	catopen
51*b30d1939SAndy Fiddaman #undef	catgets
52*b30d1939SAndy Fiddaman #undef	catclose
53*b30d1939SAndy Fiddaman 
54*b30d1939SAndy Fiddaman typedef struct
55*b30d1939SAndy Fiddaman {
56*b30d1939SAndy Fiddaman 	Mcset_t*	set;
57*b30d1939SAndy Fiddaman 	nl_catd		cat;
58*b30d1939SAndy Fiddaman 	iconv_t		cvt;
59*b30d1939SAndy Fiddaman 	Sfio_t*		tmp;
60*b30d1939SAndy Fiddaman } Cc_t;
61*b30d1939SAndy Fiddaman 
62*b30d1939SAndy Fiddaman #else
63*b30d1939SAndy Fiddaman 
64*b30d1939SAndy Fiddaman #define _ast_nl_catd	nl_catd
65*b30d1939SAndy Fiddaman #define _ast_catopen	catopen
66*b30d1939SAndy Fiddaman #define _ast_catgets	catgets
67*b30d1939SAndy Fiddaman #define _ast_catclose	catclose
68*b30d1939SAndy Fiddaman 
69*b30d1939SAndy Fiddaman #endif
70*b30d1939SAndy Fiddaman 
71*b30d1939SAndy Fiddaman _ast_nl_catd
_ast_catopen(const char * name,int flag)72*b30d1939SAndy Fiddaman _ast_catopen(const char* name, int flag)
73*b30d1939SAndy Fiddaman {
74*b30d1939SAndy Fiddaman 	Mc_t*		mc;
75*b30d1939SAndy Fiddaman 	char*		s;
76*b30d1939SAndy Fiddaman 	Sfio_t*		ip;
77*b30d1939SAndy Fiddaman 	char		path[PATH_MAX];
78*b30d1939SAndy Fiddaman 
79*b30d1939SAndy Fiddaman 	/*
80*b30d1939SAndy Fiddaman 	 * first try the ast catalogs
81*b30d1939SAndy Fiddaman 	 */
82*b30d1939SAndy Fiddaman 
83*b30d1939SAndy Fiddaman #if DEBUG_trace
84*b30d1939SAndy Fiddaman sfprintf(sfstderr, "AHA#%d:%s %s LC_MESSAGES=%s:%s\n", __LINE__, __FILE__, name, _ast_setlocale(LC_MESSAGES, 0), setlocale(LC_MESSAGES, 0));
85*b30d1939SAndy Fiddaman #endif
86*b30d1939SAndy Fiddaman 	if ((s = mcfind(NiL, name, LC_MESSAGES, flag, path, sizeof(path))) && (ip = sfopen(NiL, s, "r")))
87*b30d1939SAndy Fiddaman 	{
88*b30d1939SAndy Fiddaman #if DEBUG_trace
89*b30d1939SAndy Fiddaman sfprintf(sfstderr, "AHA#%d:%s %s\n", __LINE__, __FILE__, s);
90*b30d1939SAndy Fiddaman #endif
91*b30d1939SAndy Fiddaman 		mc = mcopen(ip);
92*b30d1939SAndy Fiddaman 		sfclose(ip);
93*b30d1939SAndy Fiddaman 		if (mc)
94*b30d1939SAndy Fiddaman 			return (_ast_nl_catd)mc;
95*b30d1939SAndy Fiddaman 	}
96*b30d1939SAndy Fiddaman #if _lib_catopen
97*b30d1939SAndy Fiddaman 	if (strcmp(setlocale(LC_MESSAGES, NiL), "debug"))
98*b30d1939SAndy Fiddaman 	{
99*b30d1939SAndy Fiddaman 		Cc_t*		cc;
100*b30d1939SAndy Fiddaman 		nl_catd		d;
101*b30d1939SAndy Fiddaman 
102*b30d1939SAndy Fiddaman 		/*
103*b30d1939SAndy Fiddaman 		 * now the native catalogs
104*b30d1939SAndy Fiddaman 		 */
105*b30d1939SAndy Fiddaman 
106*b30d1939SAndy Fiddaman 		if (s && (d = catopen(s, flag)) != (nl_catd)(-1) || !(s = 0) && (d = catopen(name, flag)) != (nl_catd)(-1))
107*b30d1939SAndy Fiddaman 		{
108*b30d1939SAndy Fiddaman 			if (!(cc = newof(0, Cc_t, 1, 0)))
109*b30d1939SAndy Fiddaman 			{
110*b30d1939SAndy Fiddaman 				catclose(d);
111*b30d1939SAndy Fiddaman 				return (_ast_nl_catd)(-1);
112*b30d1939SAndy Fiddaman 			}
113*b30d1939SAndy Fiddaman 			cc->cat = d;
114*b30d1939SAndy Fiddaman 			if ((s || *name == '/') && (ast.locale.set & (1<<AST_LC_MESSAGES)))
115*b30d1939SAndy Fiddaman 			{
116*b30d1939SAndy Fiddaman 				if ((cc->cvt = iconv_open("", "utf")) == (iconv_t)(-1) || !(cc->tmp = sfstropen()))
117*b30d1939SAndy Fiddaman 				{
118*b30d1939SAndy Fiddaman 					catclose(d);
119*b30d1939SAndy Fiddaman 					free(cc);
120*b30d1939SAndy Fiddaman 					return (_ast_nl_catd)(-1);
121*b30d1939SAndy Fiddaman 				}
122*b30d1939SAndy Fiddaman 			}
123*b30d1939SAndy Fiddaman 			else
124*b30d1939SAndy Fiddaman 				cc->cvt = (iconv_t)(-1);
125*b30d1939SAndy Fiddaman #if DEBUG_trace
126*b30d1939SAndy Fiddaman sfprintf(sfstderr, "AHA#%d:%s %s %s native %p\n", __LINE__, __FILE__, s, name, cc->cat);
127*b30d1939SAndy Fiddaman #endif
128*b30d1939SAndy Fiddaman 			return (_ast_nl_catd)cc;
129*b30d1939SAndy Fiddaman 		}
130*b30d1939SAndy Fiddaman 	}
131*b30d1939SAndy Fiddaman #endif
132*b30d1939SAndy Fiddaman 
133*b30d1939SAndy Fiddaman 	/*
134*b30d1939SAndy Fiddaman 	 * loser
135*b30d1939SAndy Fiddaman 	 */
136*b30d1939SAndy Fiddaman 
137*b30d1939SAndy Fiddaman 	return (_ast_nl_catd)(-1);
138*b30d1939SAndy Fiddaman }
139*b30d1939SAndy Fiddaman 
140*b30d1939SAndy Fiddaman char*
_ast_catgets(_ast_nl_catd cat,int set,int num,const char * msg)141*b30d1939SAndy Fiddaman _ast_catgets(_ast_nl_catd cat, int set, int num, const char* msg)
142*b30d1939SAndy Fiddaman {
143*b30d1939SAndy Fiddaman 	if (cat == (_ast_nl_catd)(-1))
144*b30d1939SAndy Fiddaman 		return (char*)msg;
145*b30d1939SAndy Fiddaman #if _lib_catopen
146*b30d1939SAndy Fiddaman 	if (!((Cc_t*)cat)->set)
147*b30d1939SAndy Fiddaman 	{
148*b30d1939SAndy Fiddaman 		char*	s;
149*b30d1939SAndy Fiddaman 		size_t	n;
150*b30d1939SAndy Fiddaman 
151*b30d1939SAndy Fiddaman 		msg = (char*)catgets(((Cc_t*)cat)->cat, set, num, msg);
152*b30d1939SAndy Fiddaman 		if (((Cc_t*)cat)->cvt != (iconv_t)(-1))
153*b30d1939SAndy Fiddaman 		{
154*b30d1939SAndy Fiddaman 			s = (char*)msg;
155*b30d1939SAndy Fiddaman 			n = strlen(s);
156*b30d1939SAndy Fiddaman 			iconv_write(((Cc_t*)cat)->cvt, ((Cc_t*)cat)->tmp, &s, &n, NiL);
157*b30d1939SAndy Fiddaman 			if (s = sfstruse(((Cc_t*)cat)->tmp))
158*b30d1939SAndy Fiddaman 				return s;
159*b30d1939SAndy Fiddaman 		}
160*b30d1939SAndy Fiddaman 		return (char*)msg;
161*b30d1939SAndy Fiddaman 	}
162*b30d1939SAndy Fiddaman #endif
163*b30d1939SAndy Fiddaman 	return mcget((Mc_t*)cat, set, num, msg);
164*b30d1939SAndy Fiddaman }
165*b30d1939SAndy Fiddaman 
166*b30d1939SAndy Fiddaman int
_ast_catclose(_ast_nl_catd cat)167*b30d1939SAndy Fiddaman _ast_catclose(_ast_nl_catd cat)
168*b30d1939SAndy Fiddaman {
169*b30d1939SAndy Fiddaman 	if (cat == (_ast_nl_catd)(-1))
170*b30d1939SAndy Fiddaman 		return -1;
171*b30d1939SAndy Fiddaman #if _lib_catopen
172*b30d1939SAndy Fiddaman 	if (!((Cc_t*)cat)->set)
173*b30d1939SAndy Fiddaman 	{
174*b30d1939SAndy Fiddaman 		if (((Cc_t*)cat)->cvt != (iconv_t)(-1))
175*b30d1939SAndy Fiddaman 			iconv_close(((Cc_t*)cat)->cvt);
176*b30d1939SAndy Fiddaman 		if (((Cc_t*)cat)->tmp)
177*b30d1939SAndy Fiddaman 			sfclose(((Cc_t*)cat)->tmp);
178*b30d1939SAndy Fiddaman 		return catclose(((Cc_t*)cat)->cat);
179*b30d1939SAndy Fiddaman 	}
180*b30d1939SAndy Fiddaman #endif
181*b30d1939SAndy Fiddaman 	return mcclose((Mc_t*)cat);
182*b30d1939SAndy Fiddaman }
183