r20214 - gnucash/trunk/src/core-utils - The new files for gnc_locale functions, ommitted from r20110.

John Ralls jralls at code.gnucash.org
Mon Jan 31 10:27:57 EST 2011


Author: jralls
Date: 2011-01-31 10:27:57 -0500 (Mon, 31 Jan 2011)
New Revision: 20214
Trac: http://svn.gnucash.org/trac/changeset/20214

Added:
   gnucash/trunk/src/core-utils/gnc-locale-utils.c
   gnucash/trunk/src/core-utils/gnc-locale-utils.h
Log:
The new files for gnc_locale functions, ommitted from r20110.

Added: gnucash/trunk/src/core-utils/gnc-locale-utils.c
===================================================================
--- gnucash/trunk/src/core-utils/gnc-locale-utils.c	                        (rev 0)
+++ gnucash/trunk/src/core-utils/gnc-locale-utils.c	2011-01-31 15:27:57 UTC (rev 20214)
@@ -0,0 +1,191 @@
+/********************************************************************\
+ * gnc-locale-utils.c -- locale functions		            *
+ * Copyright (C) 2000 Dave Peticolas <dave at 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 at 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);
+}

Added: gnucash/trunk/src/core-utils/gnc-locale-utils.h
===================================================================
--- gnucash/trunk/src/core-utils/gnc-locale-utils.h	                        (rev 0)
+++ gnucash/trunk/src/core-utils/gnc-locale-utils.h	2011-01-31 15:27:57 UTC (rev 20214)
@@ -0,0 +1,62 @@
+/********************************************************************\
+ * gnc-locale-utils.h -- Locale manipulation functions		    *
+ * Copyright (C) 2000 Dave Peticolas <dave at 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 at 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 */



More information about the gnucash-changes mailing list