1e12a957fSPedro 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_NUMERIC 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 "lnumeric.h"
44057ca2d4SBaptiste Daroussin
45057ca2d4SBaptiste Daroussin static struct lc_numeric_T numeric;
46057ca2d4SBaptiste Daroussin
47057ca2d4SBaptiste Daroussin void
init_numeric(void)48057ca2d4SBaptiste Daroussin init_numeric(void)
49057ca2d4SBaptiste Daroussin {
50057ca2d4SBaptiste Daroussin (void) memset(&numeric, 0, sizeof (numeric));
51057ca2d4SBaptiste Daroussin }
52057ca2d4SBaptiste Daroussin
53057ca2d4SBaptiste Daroussin void
add_numeric_str(wchar_t * wcs)54057ca2d4SBaptiste Daroussin add_numeric_str(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_DECIMAL_POINT:
66057ca2d4SBaptiste Daroussin numeric.decimal_point = str;
67057ca2d4SBaptiste Daroussin break;
68057ca2d4SBaptiste Daroussin case T_THOUSANDS_SEP:
69057ca2d4SBaptiste Daroussin numeric.thousands_sep = str;
70057ca2d4SBaptiste Daroussin break;
71057ca2d4SBaptiste Daroussin default:
72057ca2d4SBaptiste Daroussin free(str);
73057ca2d4SBaptiste Daroussin INTERR;
74057ca2d4SBaptiste Daroussin break;
75057ca2d4SBaptiste Daroussin }
76057ca2d4SBaptiste Daroussin }
77057ca2d4SBaptiste Daroussin
78057ca2d4SBaptiste Daroussin void
reset_numeric_group(void)79057ca2d4SBaptiste Daroussin reset_numeric_group(void)
80057ca2d4SBaptiste Daroussin {
81057ca2d4SBaptiste Daroussin free((char *)numeric.grouping);
82057ca2d4SBaptiste Daroussin numeric.grouping = NULL;
83057ca2d4SBaptiste Daroussin }
84057ca2d4SBaptiste Daroussin
85057ca2d4SBaptiste Daroussin void
add_numeric_group(int n)86057ca2d4SBaptiste Daroussin add_numeric_group(int n)
87057ca2d4SBaptiste Daroussin {
88057ca2d4SBaptiste Daroussin char *s;
89057ca2d4SBaptiste Daroussin
90057ca2d4SBaptiste Daroussin if (numeric.grouping == NULL) {
91057ca2d4SBaptiste Daroussin (void) asprintf(&s, "%d", n);
92057ca2d4SBaptiste Daroussin } else {
93057ca2d4SBaptiste Daroussin (void) asprintf(&s, "%s;%d", numeric.grouping, n);
94057ca2d4SBaptiste Daroussin }
95057ca2d4SBaptiste Daroussin if (s == NULL)
96*3141e51dSKyle Evans fprintf(stderr, "out of memory\n");
97057ca2d4SBaptiste Daroussin
98057ca2d4SBaptiste Daroussin free((char *)numeric.grouping);
99057ca2d4SBaptiste Daroussin numeric.grouping = s;
100057ca2d4SBaptiste Daroussin }
101057ca2d4SBaptiste Daroussin
102057ca2d4SBaptiste Daroussin void
dump_numeric(void)103057ca2d4SBaptiste Daroussin dump_numeric(void)
104057ca2d4SBaptiste Daroussin {
105057ca2d4SBaptiste Daroussin FILE *f;
106057ca2d4SBaptiste Daroussin
107057ca2d4SBaptiste Daroussin if ((f = open_category()) == NULL) {
108057ca2d4SBaptiste Daroussin return;
109057ca2d4SBaptiste Daroussin }
110057ca2d4SBaptiste Daroussin
111057ca2d4SBaptiste Daroussin if ((putl_category(numeric.decimal_point, f) == EOF) ||
112057ca2d4SBaptiste Daroussin (putl_category(numeric.thousands_sep, f) == EOF) ||
113057ca2d4SBaptiste Daroussin (putl_category(numeric.grouping, f) == EOF)) {
114057ca2d4SBaptiste Daroussin return;
115057ca2d4SBaptiste Daroussin }
116057ca2d4SBaptiste Daroussin close_category(f);
117057ca2d4SBaptiste Daroussin }
118