xref: /freebsd/usr.bin/localedef/messages.c (revision 1d386b48a555f61cb7325543adbbb5c3f3407a66)
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