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