diff --git a/libmaxsi/Makefile b/libmaxsi/Makefile
index 1c04a677..42dfe21f 100644
--- a/libmaxsi/Makefile
+++ b/libmaxsi/Makefile
@@ -37,6 +37,7 @@ stdio.o \
dir.o \
fddir-sortix.o \
setjmp.o \
+setlocale.o \
sortix-sound.o \
readparamstring.o \
process.o \
@@ -84,6 +85,7 @@ fstat.o \
ftruncate.o \
getcwd.o \
getdtablesize.o \
+localeconv.o \
lseek.o \
mbtowc.o \
mkdir.o \
diff --git a/libmaxsi/include/locale.h b/libmaxsi/include/locale.h
index c7ff46ea..e203af91 100644
--- a/libmaxsi/include/locale.h
+++ b/libmaxsi/include/locale.h
@@ -1,6 +1,6 @@
-/******************************************************************************
+/*******************************************************************************
- COPYRIGHT(C) JONAS 'SORTIE' TERMANSEN 2012.
+ Copyright(C) Jonas 'Sortie' Termansen 2012.
This file is part of LibMaxsi.
@@ -11,8 +11,8 @@
LibMaxsi 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 Lesser General Public License for
- more details.
+ FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+ details.
You should have received a copy of the GNU Lesser General Public License
along with LibMaxsi. If not, see .
@@ -29,7 +29,50 @@
__BEGIN_DECLS
-/* TODO: Actually implement this header. */
+struct lconv
+{
+ char* decimal_point;
+ char* thousands_sep;
+ char* grouping;
+ char* int_curr_symbol;
+ char* currency_symbol;
+ char* mon_decimal_point;
+ char* mon_thousands_sep;
+ char* mon_grouping;
+ char* positive_sign;
+ char* negative_sign;
+ char int_frac_digits;
+ char frac_digits;
+ char p_cs_precedes;
+ char n_cs_precedes;
+ char p_sep_by_space;
+ char n_sep_by_space;
+ char p_sign_posn;
+ char n_sign_posn;
+ char int_p_cs_precedes;
+ char int_n_cs_precedes;
+ char int_p_sep_by_space;
+ char int_n_sep_by_space;
+ char int_p_sign_posn;
+ char int_n_sign_posn;
+};
+
+#define LC_COLLATE 0
+#define LC_CTYPE 1
+#define LC_MESSAGES 2
+#define LC_MONETARY 3
+#define LC_NUMERIC 4
+#define LC_TIME 5
+#define LC_ALL 6
+#define LC_NUM_CATEGORIES LC_ALL
+
+const char* sortix_setlocale(int category, const char* locale);
+#if defined(_SORTIX_SOURCE) && __SORTIX_STDLIB_REDIRECTS
+const char* setlocale(int category, const char* locale) asm("sortix_setlocale");
+#else
+char* setlocale(int category, const char* locale);
+#endif
+struct lconv* localeconv(void);
__END_DECLS
diff --git a/libmaxsi/localeconv.cpp b/libmaxsi/localeconv.cpp
new file mode 100644
index 00000000..8237bfa3
--- /dev/null
+++ b/libmaxsi/localeconv.cpp
@@ -0,0 +1,56 @@
+/*******************************************************************************
+
+ Copyright(C) Jonas 'Sortie' Termansen 2012.
+
+ This file is part of LibMaxsi.
+
+ LibMaxsi is free software: you can redistribute it and/or modify it under
+ the terms of the GNU Lesser General Public License as published by the Free
+ Software Foundation, either version 3 of the License, or (at your option)
+ any later version.
+
+ LibMaxsi 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 Lesser General Public License for more
+ details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with LibMaxsi. If not, see .
+
+ localeconv.cpp
+ Return locale-specific information.
+
+*******************************************************************************/
+
+#include
+
+static struct lconv lc;
+
+extern "C" struct lconv* localeconv(void)
+{
+ lc.decimal_point = (char*) ".";
+ lc.thousands_sep = (char*) "";
+ lc.grouping = (char*) "";
+ lc.int_curr_symbol = (char*) "";
+ lc.currency_symbol = (char*) "";
+ lc.mon_decimal_point = (char*) "";
+ lc.mon_thousands_sep = (char*) "";
+ lc.mon_grouping = (char*) "";
+ lc.positive_sign = (char*) "";
+ lc.negative_sign = (char*) "";
+ lc.int_frac_digits = 127;
+ lc.frac_digits = 127;
+ lc.p_cs_precedes = 127;
+ lc.n_cs_precedes = 127;
+ lc.p_sep_by_space = 127;
+ lc.n_sep_by_space = 127;
+ lc.p_sign_posn = 127;
+ lc.n_sign_posn = 127;
+ lc.int_p_cs_precedes = 127;
+ lc.int_n_cs_precedes = 127;
+ lc.int_p_sep_by_space = 127;
+ lc.int_n_sep_by_space = 127;
+ lc.int_p_sign_posn = 127;
+ lc.int_n_sign_posn = 127;
+ return &lc;
+}
diff --git a/libmaxsi/setlocale.cpp b/libmaxsi/setlocale.cpp
new file mode 100644
index 00000000..5658804a
--- /dev/null
+++ b/libmaxsi/setlocale.cpp
@@ -0,0 +1,62 @@
+/*******************************************************************************
+
+ Copyright(C) Jonas 'Sortie' Termansen 2012.
+
+ This file is part of LibMaxsi.
+
+ LibMaxsi is free software: you can redistribute it and/or modify it under
+ the terms of the GNU Lesser General Public License as published by the Free
+ Software Foundation, either version 3 of the License, or (at your option)
+ any later version.
+
+ LibMaxsi 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 Lesser General Public License for more
+ details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with LibMaxsi. If not, see .
+
+ setlocale.cpp
+ Set program locale.
+
+*******************************************************************************/
+
+#define __SORTIX_STDLIB_REDIRECTS 0
+#include
+#include
+#include
+#include
+
+static char* current_locales[LC_NUM_CATEGORIES] = { NULL };
+
+extern "C" const char* sortix_setlocale(int category, const char* locale)
+{
+ if ( category < 0 || LC_ALL < category ) { errno = EINVAL; return NULL; }
+ char* new_strings[LC_NUM_CATEGORIES];
+ int from = category;
+ int to = category;
+ if ( !locale ) { return current_locales[to]; }
+ if ( category == LC_ALL ) { from = 0; to = LC_NUM_CATEGORIES-1; }
+ for ( int i = from; i <= to; i++ )
+ {
+ new_strings[i] = strdup(locale);
+ if ( !new_strings[i] )
+ {
+ for ( int n = from; n < i; n++ ) { free(new_strings[n]); }
+ return NULL;
+ }
+ }
+ for ( int i = from; i <= to; i++ )
+ {
+ free(current_locales[i]);
+ current_locales[i] = new_strings[i];
+ }
+ return locale;
+}
+
+extern "C" char* setlocale(int category, const char* locale)
+{
+ return (char*) sortix_setlocale(category, locale);
+}
+