summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2001-03-21 18:13:36 +0000
committerEric Andersen <andersen@codepoet.org>2001-03-21 18:13:36 +0000
commitc132ecc38fe4508e9dbd97ec9ada86d6637d97ae (patch)
tree64331b264ad988f176bbd6c6c540451a4b1b19ef
parenta10cb1d4a37161dc39761e342d66837c9f22021d (diff)
Stub out localeconv. Please look over this to check it is correct....
I started trying to read the glibc code -- but that code is far too messy to be read. So I just wrote a silly C app against glibc, set the locale to POSIX, then called localeconv(). I wrote this version of localeconv.c so it returns the same stuff. -Erik
-rw-r--r--include/locale.h49
-rw-r--r--libc/misc/locale/Makefile12
-rw-r--r--libc/misc/locale/locale.c3
-rw-r--r--libc/misc/locale/localeconv.c52
4 files changed, 107 insertions, 9 deletions
diff --git a/include/locale.h b/include/locale.h
index f0c6f2e63..937c0f0d1 100644
--- a/include/locale.h
+++ b/include/locale.h
@@ -24,6 +24,55 @@
#define LC_MESSAGES 5
#define LC_ALL 6
+
+/* Structure giving information about numeric and monetary notation. */
+struct lconv
+{
+ /* Numeric (non-monetary) information. */
+
+ char *decimal_point; /* Decimal point character. */
+ char *thousands_sep; /* Thousands separator. */
+ /* Each element is the number of digits in each group;
+ elements with higher indices are farther left.
+ An element with value CHAR_MAX means that no further grouping is done.
+ An element with value 0 means that the previous element is used
+ for all groups farther left. */
+ char *grouping;
+
+ /* Monetary information. */
+
+ /* First three chars are a currency symbol from ISO 4217.
+ Fourth char is the separator. Fifth char is '\0'. */
+ char *int_curr_symbol;
+ char *currency_symbol; /* Local currency symbol. */
+ char *mon_decimal_point; /* Decimal point character. */
+ char *mon_thousands_sep; /* Thousands separator. */
+ char *mon_grouping; /* Like `grouping' element (above). */
+ char *positive_sign; /* Sign for positive values. */
+ char *negative_sign; /* Sign for negative values. */
+ char int_frac_digits; /* Int'l fractional digits. */
+ char frac_digits; /* Local fractional digits. */
+ /* 1 if currency_symbol precedes a positive value, 0 if succeeds. */
+ char p_cs_precedes;
+ /* 1 iff a space separates currency_symbol from a positive value. */
+ char p_sep_by_space;
+ /* 1 if currency_symbol precedes a negative value, 0 if succeeds. */
+ char n_cs_precedes;
+ /* 1 iff a space separates currency_symbol from a negative value. */
+ char n_sep_by_space;
+ /* Positive and negative sign positions:
+ 0 Parentheses surround the quantity and currency_symbol.
+ 1 The sign string precedes the quantity and currency_symbol.
+ 2 The sign string follows the quantity and currency_symbol.
+ 3 The sign string immediately precedes the currency_symbol.
+ 4 The sign string immediately follows the currency_symbol. */
+ char p_sign_posn;
+ char n_sign_posn;
+};
+
extern char *setlocale(int __category, __const char *__locale);
+/* Return the numeric/monetary information for the current locale. */
+extern struct lconv *localeconv __P ((void));
+
#endif /* locale.h */
diff --git a/libc/misc/locale/Makefile b/libc/misc/locale/Makefile
index c4b62a661..a54a0e38a 100644
--- a/libc/misc/locale/Makefile
+++ b/libc/misc/locale/Makefile
@@ -24,19 +24,19 @@ TOPDIR=../../
include $(TOPDIR)Rules.mak
LIBC=$(TOPDIR)libc.a
-MSRC=locale.c
-MOBJ= setlocale.o
+CSRC=locale.c localeconv.c
+COBJS=$(patsubst %.c,%.o, $(CSRC))
+OBJS=$(COBJS)
-OBJS=$(MOBJ)
-all: $(MOBJ) $(LIBC)
+all: $(OBJS) $(LIBC)
$(LIBC): ar-target
ar-target: $(OBJS)
$(AR) $(ARFLAGS) $(LIBC) $(OBJS)
-$(MOBJ): $(MSRC)
- $(CC) $(CFLAGS) -DL_$* $< -c -o $*.o
+$(COBJS): %.o : %.c
+ $(CC) $(CFLAGS) -c $< -o $@
$(STRIPTOOL) -x -R .note -R .comment $*.o
$(OBJS): Makefile
diff --git a/libc/misc/locale/locale.c b/libc/misc/locale/locale.c
index 1cb7a3b81..2abdde34e 100644
--- a/libc/misc/locale/locale.c
+++ b/libc/misc/locale/locale.c
@@ -23,8 +23,6 @@
#undef TEST_LOCALE
-#ifdef L_setlocale
-
#ifdef __UCLIBC_HAS_LOCALE__
static char C_LOCALE_NAME[]="C";
@@ -161,4 +159,3 @@ char *setlocale(int category, const char *locale)
#endif
-#endif /* L_setlocale */
diff --git a/libc/misc/locale/localeconv.c b/libc/misc/locale/localeconv.c
new file mode 100644
index 000000000..ab447924a
--- /dev/null
+++ b/libc/misc/locale/localeconv.c
@@ -0,0 +1,52 @@
+/* localeconv.c
+ *
+ * Written by Erik Andersen <andersee@debian.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; see the file COPYING.LIB. If not,
+ * write to the Free Software Foundation, Inc., 675 Mass Ave,
+ * Cambridge, MA 02139, USA. */
+
+#include <string.h>
+#include <locale.h>
+
+/* Return monetary and numeric information about the current locale. */
+struct lconv * localeconv __P ((void))
+{
+ static struct lconv result;
+ static char *blank = "";
+ static char *decimal = ".";
+ char junk = '\177';
+
+ result.decimal_point = decimal;
+ result.thousands_sep = blank;
+ result.grouping = "\177";
+ result.int_curr_symbol = blank;
+ result.currency_symbol = blank;
+ result.mon_decimal_point = blank;
+ result.mon_thousands_sep = blank;
+ result.mon_grouping = blank;
+ result.positive_sign = blank;
+ result.negative_sign = blank;
+ result.int_frac_digits = junk;
+ result.frac_digits = junk;
+ result.p_cs_precedes = junk;
+ result.p_sep_by_space = junk;
+ result.n_cs_precedes = junk;
+ result.n_sep_by_space = junk;
+ result.p_sign_posn = junk;
+ result.n_sign_posn = junk;
+
+ return &result;
+}
+