xref: /titanic_52/usr/src/cmd/localedef/numeric.c (revision a0900badd8eb6bcca99411c8906b483e84f2da91)
1 /*
2  * This file and its contents are supplied under the terms of the
3  * Common Development and Distribution License ("CDDL"), version 1.0.
4  * You may only use this file in accordance with the terms of version
5  * 1.0 of the CDDL.
6  *
7  * A full copy of the text of the CDDL should have accompanied this
8  * source.  A copy of the CDDL is also available via the Internet at
9  * http://www.illumos.org/license/CDDL.
10  */
11 
12 /*
13  * Copyright 2010 Nexenta Systems, Inc.  All rights reserved.
14  */
15 
16 /*
17  * LC_NUMERIC database generation routines for localedef.
18  */
19 
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <errno.h>
23 #include <sys/types.h>
24 #include <string.h>
25 #include <unistd.h>
26 #include "localedef.h"
27 #include "parser.tab.h"
28 #include "lnumeric.h"
29 
30 static struct lc_numeric_T numeric;
31 
32 void
33 init_numeric(void)
34 {
35 	(void) memset(&numeric, 0, sizeof (numeric));
36 }
37 
38 void
39 add_numeric_str(wchar_t *wcs)
40 {
41 	char *str;
42 
43 	if ((str = to_mb_string(wcs)) == NULL) {
44 		INTERR;
45 		return;
46 	}
47 	free(wcs);
48 
49 	switch (last_kw) {
50 	case T_DECIMAL_POINT:
51 		numeric.decimal_point = str;
52 		break;
53 	case T_THOUSANDS_SEP:
54 		numeric.thousands_sep = str;
55 		break;
56 	default:
57 		free(str);
58 		INTERR;
59 		break;
60 	}
61 }
62 
63 void
64 reset_numeric_group(void)
65 {
66 	free((char *)numeric.grouping);
67 	numeric.grouping = NULL;
68 }
69 
70 void
71 add_numeric_group(int n)
72 {
73 	char *s;
74 
75 	if (numeric.grouping == NULL) {
76 		(void) asprintf(&s, "%d", n);
77 	} else {
78 		(void) asprintf(&s, "%s;%d", numeric.grouping, n);
79 	}
80 	if (s == NULL)
81 		errf(_("out of memory"));
82 
83 	free((char *)numeric.grouping);
84 	numeric.grouping = s;
85 }
86 
87 void
88 dump_numeric(void)
89 {
90 	FILE *f;
91 
92 	if ((f = open_category()) == NULL) {
93 		return;
94 	}
95 
96 	if ((putl_category(numeric.decimal_point, f) == EOF) ||
97 	    (putl_category(numeric.thousands_sep, f) == EOF) ||
98 	    (putl_category(numeric.grouping, f) == EOF)) {
99 		return;
100 	}
101 	close_category(f);
102 }
103