lmonetary.c revision 89907
1144518Sdavidxu/* 2144518Sdavidxu * Copyright (c) 2000, 2001 Alexey Zelkin <phantom@FreeBSD.org> 3144518Sdavidxu * All rights reserved. 4144518Sdavidxu * 5144518Sdavidxu * Redistribution and use in source and binary forms, with or without 6144518Sdavidxu * modification, are permitted provided that the following conditions 7144518Sdavidxu * are met: 8144518Sdavidxu * 1. Redistributions of source code must retain the above copyright 9144518Sdavidxu * notice, this list of conditions and the following disclaimer. 10144518Sdavidxu * 2. Redistributions in binary form must reproduce the above copyright 11144518Sdavidxu * notice, this list of conditions and the following disclaimer in the 12144518Sdavidxu * documentation and/or other materials provided with the distribution. 13144518Sdavidxu * 14144518Sdavidxu * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15144518Sdavidxu * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16144518Sdavidxu * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17144518Sdavidxu * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18144518Sdavidxu * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19144518Sdavidxu * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20144518Sdavidxu * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21144518Sdavidxu * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22144518Sdavidxu * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23144518Sdavidxu * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24144518Sdavidxu * SUCH DAMAGE. 25144518Sdavidxu * 26144518Sdavidxu * $FreeBSD: head/lib/libc/locale/lmonetary.c 89907 2002-01-28 08:26:38Z ache $ 27144518Sdavidxu */ 28144518Sdavidxu 29144518Sdavidxu#include <limits.h> 30144518Sdavidxu#include <stdlib.h> 31144518Sdavidxu#include "lmonetary.h" 32144518Sdavidxu#include "ldpart.h" 33177853Sdavidxu 34177853Sdavidxuextern int __mlocale_changed; 35177853Sdavidxuextern const char * __fix_locale_grouping_str(const char *); 36177853Sdavidxu 37177853Sdavidxu#define LCMONETARY_SIZE (sizeof(struct lc_monetary_T) / sizeof(char *)) 38177853Sdavidxu 39177853Sdavidxustatic char empty[] = ""; 40177853Sdavidxustatic char numempty[] = { CHAR_MAX, '\0'}; 41177853Sdavidxu 42163334Sdavidxustatic const struct lc_monetary_T _C_monetary_locale = { 43163334Sdavidxu empty, /* int_curr_symbol */ 44163334Sdavidxu empty, /* currency_symbol */ 45163334Sdavidxu empty, /* mon_decimal_point */ 46163334Sdavidxu empty, /* mon_thousands_sep */ 47163334Sdavidxu numempty, /* mon_grouping */ 48163334Sdavidxu empty, /* positive_sign */ 49163334Sdavidxu empty, /* negative_sign */ 50144518Sdavidxu numempty, /* int_frac_digits */ 51163334Sdavidxu numempty, /* frac_digits */ 52161680Sdavidxu numempty, /* p_cs_precedes */ 53177853Sdavidxu numempty, /* p_sep_by_space */ 54161680Sdavidxu numempty, /* n_cs_precedes */ 55161680Sdavidxu numempty, /* n_sep_by_space */ 56161680Sdavidxu numempty, /* p_sign_posn */ 57163334Sdavidxu numempty /* n_sign_posn */ 58161680Sdavidxu}; 59161680Sdavidxu 60161680Sdavidxustatic struct lc_monetary_T _monetary_locale; 61161680Sdavidxustatic int _monetary_using_locale; 62161680Sdavidxustatic char *_monetary_locale_buf; 63177853Sdavidxu 64177853Sdavidxustatic char 65161680Sdavidxucnv(const char *str) { 66161680Sdavidxu int i = strtol(str, NULL, 10); 67161680Sdavidxu if (i == -1) 68163334Sdavidxu i = CHAR_MAX; 69161680Sdavidxu return (char)i; 70177853Sdavidxu} 71161680Sdavidxu 72161680Sdavidxuint 73161680Sdavidxu__monetary_load_locale(const char *name) { 74163334Sdavidxu 75161680Sdavidxu int ret; 76177853Sdavidxu __mlocale_changed = 1; 77161680Sdavidxu ret = __part_load_locale(name, &_monetary_using_locale, 78161680Sdavidxu _monetary_locale_buf, "LC_MONETARY", 79161680Sdavidxu LCMONETARY_SIZE, LCMONETARY_SIZE, 80161680Sdavidxu (const char **)&_monetary_locale); 81161680Sdavidxu if (ret == 0 && _monetary_using_locale) { 82161680Sdavidxu _monetary_locale.mon_grouping = 83177853Sdavidxu __fix_locale_grouping_str(_monetary_locale.mon_grouping); 84161680Sdavidxu 85161680Sdavidxu#define M_ASSIGN_CHAR(NAME) (((char *)_monetary_locale.NAME)[0] = \ 86161680Sdavidxu cnv(_monetary_locale.NAME)) 87173801Sdavidxu 88144518Sdavidxu M_ASSIGN_CHAR(int_frac_digits); 89144518Sdavidxu M_ASSIGN_CHAR(frac_digits); 90144518Sdavidxu M_ASSIGN_CHAR(p_cs_precedes); 91144518Sdavidxu M_ASSIGN_CHAR(p_sep_by_space); 92177853Sdavidxu M_ASSIGN_CHAR(n_cs_precedes); 93177853Sdavidxu M_ASSIGN_CHAR(n_sep_by_space); 94144518Sdavidxu M_ASSIGN_CHAR(p_sign_posn); 95144518Sdavidxu M_ASSIGN_CHAR(n_sign_posn); 96144518Sdavidxu } 97178647Sdavidxu return ret; 98144518Sdavidxu} 99173801Sdavidxu 100173801Sdavidxustruct lc_monetary_T * 101173801Sdavidxu__get_current_monetary_locale(void) { 102178647Sdavidxu 103178647Sdavidxu return (_monetary_using_locale 104178647Sdavidxu ? &_monetary_locale 105173801Sdavidxu : (struct lc_monetary_T *)&_C_monetary_locale); 106173801Sdavidxu} 107173801Sdavidxu 108178647Sdavidxu#ifdef LOCALE_DEBUG 109173801Sdavidxuvoid 110178647Sdavidxumonetdebug() { 111177853Sdavidxuprintf( "int_curr_symbol = %s\n" 112144518Sdavidxu "currency_symbol = %s\n" 113164877Sdavidxu "mon_decimal_point = %s\n" 114164902Sdavidxu "mon_thousands_sep = %s\n" 115164902Sdavidxu "mon_grouping = %s\n" 116164902Sdavidxu "positive_sign = %s\n" 117164902Sdavidxu "negative_sign = %s\n" 118164902Sdavidxu "int_frac_digits = %d\n" 119164902Sdavidxu "frac_digits = %d\n" 120164877Sdavidxu "p_cs_precedes = %d\n" 121164877Sdavidxu "p_sep_by_space = %d\n" 122164877Sdavidxu "n_cs_precedes = %d\n" 123164877Sdavidxu "n_sep_by_space = %d\n" 124164877Sdavidxu "p_sign_posn = %d\n" 125164877Sdavidxu "n_sign_posn = %d\n", 126164877Sdavidxu _monetary_locale.int_curr_symbol, 127164877Sdavidxu _monetary_locale.currency_symbol, 128164877Sdavidxu _monetary_locale.mon_decimal_point, 129177853Sdavidxu _monetary_locale.mon_thousands_sep, 130164878Sdavidxu _monetary_locale.mon_grouping, 131177853Sdavidxu _monetary_locale.positive_sign, 132164877Sdavidxu _monetary_locale.negative_sign, 133164877Sdavidxu _monetary_locale.int_frac_digits[0], 134164877Sdavidxu _monetary_locale.frac_digits[0], 135164877Sdavidxu _monetary_locale.p_cs_precedes[0], 136164877Sdavidxu _monetary_locale.p_sep_by_space[0], 137165110Sdavidxu _monetary_locale.n_cs_precedes[0], 138165110Sdavidxu _monetary_locale.n_sep_by_space[0], 139177853Sdavidxu _monetary_locale.p_sign_posn[0], 140164877Sdavidxu _monetary_locale.n_sign_posn[0] 141164877Sdavidxu); 142164877Sdavidxu} 143164877Sdavidxu#endif /* LOCALE_DEBUG */ 144164877Sdavidxu