Browse Source

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

Eric Andersen 23 years ago
parent
commit
c132ecc38f
4 changed files with 107 additions and 9 deletions
  1. 49 0
      include/locale.h
  2. 6 6
      libc/misc/locale/Makefile
  3. 0 3
      libc/misc/locale/locale.c
  4. 52 0
      libc/misc/locale/localeconv.c

+ 49 - 0
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  */

+ 6 - 6
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

+ 0 - 3
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 */

+ 52 - 0
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;
+}
+