From c132ecc38fe4508e9dbd97ec9ada86d6637d97ae Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Wed, 21 Mar 2001 18:13:36 +0000 Subject: 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 --- include/locale.h | 49 ++++++++++++++++++++++++++++++++++++++++ libc/misc/locale/Makefile | 12 +++++----- libc/misc/locale/locale.c | 3 --- libc/misc/locale/localeconv.c | 52 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 107 insertions(+), 9 deletions(-) create mode 100644 libc/misc/locale/localeconv.c 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 + * + * 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 +#include + +/* 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; +} + -- cgit v1.2.3