1*e12a957fSPedro F. Giffuni /*-
2057ca2d4SBaptiste Daroussin * Copyright 2010 Nexenta Systems, Inc. All rights reserved.
3057ca2d4SBaptiste Daroussin * Copyright 2015 John Marino <draco@marino.st>
4057ca2d4SBaptiste Daroussin *
5057ca2d4SBaptiste Daroussin * This source code is derived from the illumos localedef command, and
6057ca2d4SBaptiste Daroussin * provided under BSD-style license terms by Nexenta Systems, Inc.
7057ca2d4SBaptiste Daroussin *
8057ca2d4SBaptiste Daroussin * Redistribution and use in source and binary forms, with or without
9057ca2d4SBaptiste Daroussin * modification, are permitted provided that the following conditions
10057ca2d4SBaptiste Daroussin * are met:
11057ca2d4SBaptiste Daroussin *
12057ca2d4SBaptiste Daroussin * 1. Redistributions of source code must retain the above copyright
13057ca2d4SBaptiste Daroussin * notice, this list of conditions and the following disclaimer.
14057ca2d4SBaptiste Daroussin * 2. Redistributions in binary form must reproduce the above copyright
15057ca2d4SBaptiste Daroussin * notice, this list of conditions and the following disclaimer in the
16057ca2d4SBaptiste Daroussin * documentation and/or other materials provided with the distribution.
17057ca2d4SBaptiste Daroussin *
18057ca2d4SBaptiste Daroussin * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19057ca2d4SBaptiste Daroussin * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20057ca2d4SBaptiste Daroussin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21057ca2d4SBaptiste Daroussin * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
22057ca2d4SBaptiste Daroussin * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23057ca2d4SBaptiste Daroussin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24057ca2d4SBaptiste Daroussin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25057ca2d4SBaptiste Daroussin * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26057ca2d4SBaptiste Daroussin * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27057ca2d4SBaptiste Daroussin * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28057ca2d4SBaptiste Daroussin * POSSIBILITY OF SUCH DAMAGE.
29057ca2d4SBaptiste Daroussin */
30057ca2d4SBaptiste Daroussin
31057ca2d4SBaptiste Daroussin /*
32057ca2d4SBaptiste Daroussin * LC_MESSAGES database generation routines for localedef.
33057ca2d4SBaptiste Daroussin */
34057ca2d4SBaptiste Daroussin #include <sys/cdefs.h>
35057ca2d4SBaptiste Daroussin #include <stdio.h>
36057ca2d4SBaptiste Daroussin #include <stdlib.h>
37057ca2d4SBaptiste Daroussin #include <errno.h>
38057ca2d4SBaptiste Daroussin #include <sys/types.h>
39057ca2d4SBaptiste Daroussin #include <string.h>
40057ca2d4SBaptiste Daroussin #include <unistd.h>
41057ca2d4SBaptiste Daroussin #include "localedef.h"
42057ca2d4SBaptiste Daroussin #include "parser.h"
43057ca2d4SBaptiste Daroussin #include "lmessages.h"
44057ca2d4SBaptiste Daroussin
45057ca2d4SBaptiste Daroussin static struct lc_messages_T msgs;
46057ca2d4SBaptiste Daroussin
47057ca2d4SBaptiste Daroussin void
init_messages(void)48057ca2d4SBaptiste Daroussin init_messages(void)
49057ca2d4SBaptiste Daroussin {
50057ca2d4SBaptiste Daroussin (void) memset(&msgs, 0, sizeof (msgs));
51057ca2d4SBaptiste Daroussin }
52057ca2d4SBaptiste Daroussin
53057ca2d4SBaptiste Daroussin void
add_message(wchar_t * wcs)54057ca2d4SBaptiste Daroussin add_message(wchar_t *wcs)
55057ca2d4SBaptiste Daroussin {
56057ca2d4SBaptiste Daroussin char *str;
57057ca2d4SBaptiste Daroussin
58057ca2d4SBaptiste Daroussin if ((str = to_mb_string(wcs)) == NULL) {
59057ca2d4SBaptiste Daroussin INTERR;
60057ca2d4SBaptiste Daroussin return;
61057ca2d4SBaptiste Daroussin }
62057ca2d4SBaptiste Daroussin free(wcs);
63057ca2d4SBaptiste Daroussin
64057ca2d4SBaptiste Daroussin switch (last_kw) {
65057ca2d4SBaptiste Daroussin case T_YESSTR:
66057ca2d4SBaptiste Daroussin msgs.yesstr = str;
67057ca2d4SBaptiste Daroussin break;
68057ca2d4SBaptiste Daroussin case T_NOSTR:
69057ca2d4SBaptiste Daroussin msgs.nostr = str;
70057ca2d4SBaptiste Daroussin break;
71057ca2d4SBaptiste Daroussin case T_YESEXPR:
72057ca2d4SBaptiste Daroussin msgs.yesexpr = str;
73057ca2d4SBaptiste Daroussin break;
74057ca2d4SBaptiste Daroussin case T_NOEXPR:
75057ca2d4SBaptiste Daroussin msgs.noexpr = str;
76057ca2d4SBaptiste Daroussin break;
77057ca2d4SBaptiste Daroussin default:
78057ca2d4SBaptiste Daroussin free(str);
79057ca2d4SBaptiste Daroussin INTERR;
80057ca2d4SBaptiste Daroussin break;
81057ca2d4SBaptiste Daroussin }
82057ca2d4SBaptiste Daroussin }
83057ca2d4SBaptiste Daroussin
84057ca2d4SBaptiste Daroussin void
dump_messages(void)85057ca2d4SBaptiste Daroussin dump_messages(void)
86057ca2d4SBaptiste Daroussin {
87057ca2d4SBaptiste Daroussin FILE *f;
88057ca2d4SBaptiste Daroussin char *ptr;
89057ca2d4SBaptiste Daroussin
90057ca2d4SBaptiste Daroussin if (msgs.yesstr == NULL) {
91057ca2d4SBaptiste Daroussin warn("missing field 'yesstr'");
92057ca2d4SBaptiste Daroussin msgs.yesstr = "";
93057ca2d4SBaptiste Daroussin }
94057ca2d4SBaptiste Daroussin if (msgs.nostr == NULL) {
95057ca2d4SBaptiste Daroussin warn("missing field 'nostr'");
96057ca2d4SBaptiste Daroussin msgs.nostr = "";
97057ca2d4SBaptiste Daroussin }
98057ca2d4SBaptiste Daroussin
99057ca2d4SBaptiste Daroussin /*
100057ca2d4SBaptiste Daroussin * CLDR likes to add : separated lists for yesstr and nostr.
101057ca2d4SBaptiste Daroussin * Legacy Solaris code does not seem to grok this. Fix it.
102057ca2d4SBaptiste Daroussin */
103057ca2d4SBaptiste Daroussin if ((ptr = strchr(msgs.yesstr, ':')) != NULL)
104057ca2d4SBaptiste Daroussin *ptr = 0;
105057ca2d4SBaptiste Daroussin if ((ptr = strchr(msgs.nostr, ':')) != NULL)
106057ca2d4SBaptiste Daroussin *ptr = 0;
107057ca2d4SBaptiste Daroussin
108057ca2d4SBaptiste Daroussin if ((f = open_category()) == NULL) {
109057ca2d4SBaptiste Daroussin return;
110057ca2d4SBaptiste Daroussin }
111057ca2d4SBaptiste Daroussin
112057ca2d4SBaptiste Daroussin if ((putl_category(msgs.yesexpr, f) == EOF) ||
113057ca2d4SBaptiste Daroussin (putl_category(msgs.noexpr, f) == EOF) ||
114057ca2d4SBaptiste Daroussin (putl_category(msgs.yesstr, f) == EOF) ||
115057ca2d4SBaptiste Daroussin (putl_category(msgs.nostr, f) == EOF)) {
116057ca2d4SBaptiste Daroussin return;
117057ca2d4SBaptiste Daroussin }
118057ca2d4SBaptiste Daroussin close_category(f);
119057ca2d4SBaptiste Daroussin }
120