From 2158a16904fa2daffe0b27f3d36a7cbe96eb9cf7 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Fri, 7 Sep 2012 20:52:25 +0200 Subject: [PATCH] Add setlocale(3) and localeconv(3). Ok, these are kinda hacky but they do implement a skeleton that a real implementation can be based upon. --- libmaxsi/Makefile | 2 ++ libmaxsi/include/locale.h | 53 +++++++++++++++++++++++++++++---- libmaxsi/localeconv.cpp | 56 +++++++++++++++++++++++++++++++++++ libmaxsi/setlocale.cpp | 62 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 168 insertions(+), 5 deletions(-) create mode 100644 libmaxsi/localeconv.cpp create mode 100644 libmaxsi/setlocale.cpp 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); +} +