mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
The new files for gnc_locale functions, ommitted from r20110.
git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@20214 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
parent
f273f3382e
commit
c8adfe555f
191
src/core-utils/gnc-locale-utils.c
Normal file
191
src/core-utils/gnc-locale-utils.c
Normal file
@ -0,0 +1,191 @@
|
||||
/********************************************************************\
|
||||
* gnc-locale-utils.c -- locale functions *
|
||||
* Copyright (C) 2000 Dave Peticolas <dave@krondo.com> *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or *
|
||||
* modify it under the terms of the GNU General Public License as *
|
||||
* published by the Free Software Foundation; either version 2 of *
|
||||
* the License, or (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License*
|
||||
* along with this program; if not, contact: *
|
||||
* *
|
||||
* Free Software Foundation Voice: +1-617-542-5942 *
|
||||
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
|
||||
* Boston, MA 02110-1301, USA gnu@gnu.org *
|
||||
\********************************************************************/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "gnc-locale-utils.h"
|
||||
|
||||
#include <glib.h>
|
||||
#include <glib/gi18n.h>
|
||||
|
||||
static void
|
||||
gnc_lconv_set_utf8 (char **p_value, char *default_value)
|
||||
{
|
||||
char *value = *p_value;
|
||||
*p_value = NULL;
|
||||
|
||||
if ((value == NULL) || (value[0] == 0))
|
||||
value = default_value;
|
||||
|
||||
#ifdef G_OS_WIN32
|
||||
{
|
||||
/* get number of resulting wide characters */
|
||||
size_t count = mbstowcs (NULL, value, 0);
|
||||
if (count > 0)
|
||||
{
|
||||
/* malloc and convert */
|
||||
wchar_t *wvalue = g_malloc ((count + 1) * sizeof(wchar_t));
|
||||
count = mbstowcs (wvalue, value, count + 1);
|
||||
if (count > 0)
|
||||
{
|
||||
*p_value = g_utf16_to_utf8 (wvalue, -1, NULL, NULL, NULL);
|
||||
}
|
||||
g_free (wvalue);
|
||||
}
|
||||
}
|
||||
#else /* !G_OS_WIN32 */
|
||||
*p_value = g_locale_to_utf8 (value, -1, NULL, NULL, NULL);
|
||||
#endif
|
||||
|
||||
if (*p_value == NULL)
|
||||
{
|
||||
// The g_locale_to_utf8 conversion failed. FIXME: Should we rather
|
||||
// use an empty string instead of the default_value? Not sure.
|
||||
*p_value = default_value;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gnc_lconv_set_char (char *p_value, char default_value)
|
||||
{
|
||||
if ((p_value != NULL) && (*p_value == CHAR_MAX))
|
||||
*p_value = default_value;
|
||||
}
|
||||
|
||||
struct lconv *
|
||||
gnc_localeconv (void)
|
||||
{
|
||||
static struct lconv lc;
|
||||
static gboolean lc_set = FALSE;
|
||||
|
||||
if (lc_set)
|
||||
return &lc;
|
||||
|
||||
lc = *localeconv();
|
||||
|
||||
gnc_lconv_set_utf8(&lc.decimal_point, ".");
|
||||
gnc_lconv_set_utf8(&lc.thousands_sep, ",");
|
||||
gnc_lconv_set_utf8(&lc.grouping, "\003");
|
||||
gnc_lconv_set_utf8(&lc.int_curr_symbol, "USD ");
|
||||
gnc_lconv_set_utf8(&lc.currency_symbol, "$");
|
||||
gnc_lconv_set_utf8(&lc.mon_decimal_point, ".");
|
||||
gnc_lconv_set_utf8(&lc.mon_thousands_sep, ",");
|
||||
gnc_lconv_set_utf8(&lc.mon_grouping, "\003");
|
||||
gnc_lconv_set_utf8(&lc.negative_sign, "-");
|
||||
gnc_lconv_set_utf8(&lc.positive_sign, "");
|
||||
|
||||
gnc_lconv_set_char(&lc.frac_digits, 2);
|
||||
gnc_lconv_set_char(&lc.int_frac_digits, 2);
|
||||
gnc_lconv_set_char(&lc.p_cs_precedes, 1);
|
||||
gnc_lconv_set_char(&lc.p_sep_by_space, 0);
|
||||
gnc_lconv_set_char(&lc.n_cs_precedes, 1);
|
||||
gnc_lconv_set_char(&lc.n_sep_by_space, 0);
|
||||
gnc_lconv_set_char(&lc.p_sign_posn, 1);
|
||||
gnc_lconv_set_char(&lc.n_sign_posn, 1);
|
||||
|
||||
lc_set = TRUE;
|
||||
|
||||
return &lc;
|
||||
}
|
||||
|
||||
const char *
|
||||
gnc_locale_default_iso_currency_code (void)
|
||||
{
|
||||
static char *code = NULL;
|
||||
struct lconv *lc;
|
||||
|
||||
if (code)
|
||||
return code;
|
||||
|
||||
lc = gnc_localeconv ();
|
||||
|
||||
code = g_strdup (lc->int_curr_symbol);
|
||||
|
||||
/* The int_curr_symbol includes a space at the end! Note: you
|
||||
* can't just change "USD " to "USD" in gnc_localeconv, because
|
||||
* that is only used if int_curr_symbol was not defined in the
|
||||
* current locale. If it was, it will have the space! */
|
||||
g_strstrip (code);
|
||||
|
||||
return code;
|
||||
}
|
||||
|
||||
/* Return the number of decimal places for this locale. */
|
||||
int
|
||||
gnc_locale_decimal_places (void)
|
||||
{
|
||||
static gboolean got_it = FALSE;
|
||||
static int places;
|
||||
struct lconv *lc;
|
||||
|
||||
if (got_it)
|
||||
return places;
|
||||
|
||||
lc = gnc_localeconv();
|
||||
places = lc->frac_digits;
|
||||
|
||||
/* frac_digits is already initialized by gnc_localeconv, hopefully
|
||||
* to a reasonable default. */
|
||||
got_it = TRUE;
|
||||
|
||||
return places;
|
||||
}
|
||||
|
||||
|
||||
static GList *locale_stack = NULL;
|
||||
|
||||
void
|
||||
gnc_push_locale (int category, const char *locale)
|
||||
{
|
||||
char *saved_locale;
|
||||
|
||||
g_return_if_fail (locale != NULL);
|
||||
|
||||
# ifdef G_OS_WIN32
|
||||
/* On win32, setlocale() doesn't say anything useful. Use
|
||||
glib's function instead. */
|
||||
saved_locale = g_win32_getlocale();
|
||||
# else
|
||||
saved_locale = g_strdup(setlocale(category, NULL) ?
|
||||
setlocale(category, NULL) : "C");
|
||||
#endif
|
||||
locale_stack = g_list_prepend (locale_stack, saved_locale);
|
||||
setlocale (category, locale);
|
||||
}
|
||||
|
||||
void
|
||||
gnc_pop_locale (int category)
|
||||
{
|
||||
char *saved_locale;
|
||||
GList *node;
|
||||
|
||||
g_return_if_fail (locale_stack != NULL);
|
||||
|
||||
node = locale_stack;
|
||||
saved_locale = node->data;
|
||||
|
||||
setlocale (category, saved_locale);
|
||||
|
||||
locale_stack = g_list_remove_link (locale_stack, node);
|
||||
g_list_free_1 (node);
|
||||
g_free (saved_locale);
|
||||
}
|
62
src/core-utils/gnc-locale-utils.h
Normal file
62
src/core-utils/gnc-locale-utils.h
Normal file
@ -0,0 +1,62 @@
|
||||
/********************************************************************\
|
||||
* gnc-locale-utils.h -- Locale manipulation functions *
|
||||
* Copyright (C) 2000 Dave Peticolas <dave@krondo.com> *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or *
|
||||
* modify it under the terms of the GNU General Public License as *
|
||||
* published by the Free Software Foundation; either version 2 of *
|
||||
* the License, or (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License*
|
||||
* along with this program; if not, contact: *
|
||||
* *
|
||||
* Free Software Foundation Voice: +1-617-542-5942 *
|
||||
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
|
||||
* Boston, MA 02110-1301, USA gnu@gnu.org *
|
||||
\********************************************************************/
|
||||
#ifndef GNC_LOCALE_UTILS_H
|
||||
#define GNC_LOCALE_UTILS_H
|
||||
|
||||
#include <glib.h>
|
||||
#include <locale.h>
|
||||
|
||||
/* The gnc_localeconv() subroutine returns an lconv structure
|
||||
* containing locale information. If no locale is set, the structure
|
||||
* is given default (en_US) values. */
|
||||
struct lconv * gnc_localeconv (void);
|
||||
|
||||
|
||||
/* Returns the default ISO currency string of the current locale. */
|
||||
const char * gnc_locale_default_iso_currency_code (void);
|
||||
|
||||
/* Returns the number of decimal place to print in the current locale */
|
||||
int gnc_locale_decimal_places (void);
|
||||
|
||||
/** Temporarily change locale, pushing the old one onto a stack
|
||||
* Currently, this has no effect on gnc_localeconv. i.e., after the
|
||||
* first call to gnc_localeconv, subsequent calls will return the same
|
||||
* information.
|
||||
*
|
||||
* WARNING: Be careful to maintain the correct nesting order of pushes
|
||||
* or pops; otherwise, the localization results might be
|
||||
* interesting. Note that the stack does not keep track of which
|
||||
* category a locale was pushed from, so careless use will alse
|
||||
* produce interesting results.
|
||||
*
|
||||
* @param category: The locale category (e.g. LC_ALL, LC_NUMERIC) to push onto
|
||||
* @param locale: The new locale to set
|
||||
*/
|
||||
void gnc_push_locale (int category, const char *locale);
|
||||
|
||||
/** Restore the last-pushed locale.
|
||||
* @param category: The locale category to restore the locale to.
|
||||
*/
|
||||
void gnc_pop_locale (int category);
|
||||
|
||||
|
||||
#endif /* GNC_LOCALE_UTILS_H */
|
Loading…
Reference in New Issue
Block a user