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 }