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 }