From 407eed212ac09cd69aa95e2584673fc3ee9295ec Mon Sep 17 00:00:00 2001 From: Bananymous Date: Sat, 19 Apr 2025 20:02:01 +0300 Subject: [PATCH] LibC: Implement nl_langinfo All values are from POSIX locale except CODESET which can be "UTF-8" depending on the current locale --- userspace/libraries/LibC/CMakeLists.txt | 1 + userspace/libraries/LibC/langinfo.cpp | 90 +++++++++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 userspace/libraries/LibC/langinfo.cpp diff --git a/userspace/libraries/LibC/CMakeLists.txt b/userspace/libraries/LibC/CMakeLists.txt index d0f38f67..ba65d7eb 100644 --- a/userspace/libraries/LibC/CMakeLists.txt +++ b/userspace/libraries/LibC/CMakeLists.txt @@ -11,6 +11,7 @@ set(LIBC_SOURCES ftw.cpp grp.cpp inttypes.cpp + langinfo.cpp libgen.cpp locale.cpp malloc.cpp diff --git a/userspace/libraries/LibC/langinfo.cpp b/userspace/libraries/LibC/langinfo.cpp new file mode 100644 index 00000000..ce6dbbdd --- /dev/null +++ b/userspace/libraries/LibC/langinfo.cpp @@ -0,0 +1,90 @@ +#include +#include + +#include + +static const char* nl_langinfo_impl(nl_item item) +{ + // only codeset is affected by current locales + if (item == CODESET) + { + switch (__getlocale(LC_CTYPE)) + { + case LOCALE_INVALID: ASSERT_NOT_REACHED(); + case LOCALE_UTF8: return "UTF-8"; + case LOCALE_POSIX: return "ANSI_X3.4-1968"; + } + ASSERT_NOT_REACHED(); + } + + // other values from POSIX locale + switch (item) + { + // LC_TIME + case D_T_FMT: return "%a %b %e %H:%M:%S %Y"; + case D_FMT: return "%m/%d/%y"; + case T_FMT: return "%H:%M:%S"; + case AM_STR: return "AM"; + case PM_STR: return "PM"; + case T_FMT_AMPM: return "%I:%M:%S %p"; + case ERA: return ""; + case ERA_D_T_FMT: return ""; + case ERA_D_FMT: return ""; + case ERA_T_FMT: return ""; + case DAY_1: return "Sunday"; + case DAY_2: return "Monday"; + case DAY_3: return "Tuesday"; + case DAY_4: return "Wednesday"; + case DAY_5: return "Thursday"; + case DAY_6: return "Friday"; + case DAY_7: return "Saturday"; + case ABDAY_1: return "Sun"; + case ABDAY_2: return "Mon"; + case ABDAY_3: return "Tue"; + case ABDAY_4: return "Wed"; + case ABDAY_5: return "Thu"; + case ABDAY_6: return "Fri"; + case ABDAY_7: return "Sat"; + case MON_1: return "January"; + case MON_2: return "February"; + case MON_3: return "March"; + case MON_4: return "April"; + case MON_5: return "May"; + case MON_6: return "June"; + case MON_7: return "July"; + case MON_8: return "August"; + case MON_9: return "September"; + case MON_10: return "October"; + case MON_11: return "November"; + case MON_12: return "December"; + case ABMON_1: return "Jan"; + case ABMON_2: return "Feb"; + case ABMON_3: return "Mar"; + case ABMON_4: return "Apr"; + case ABMON_5: return "May"; + case ABMON_6: return "Jun"; + case ABMON_7: return "Jul"; + case ABMON_8: return "Aug"; + case ABMON_9: return "Sep"; + case ABMON_10: return "Oct"; + case ABMON_11: return "Nov"; + case ABMON_12: return "Dec"; + // LC_NUMERIC + case RADIXCHAR: return "."; + case THOUSEP: return ""; + // LC_MESSAGES + case YESEXPR: return "^[yY]"; + case NOEXPR: return "^[nN]"; + // LC_MONETARY + case CRNCYSTR: return ""; + } + + return ""; +} + +char* nl_langinfo(nl_item item) +{ + // NOTE: POSIX says "The application shall not modify the string returned" + // so const_cast from string literal *should* be fine + return const_cast(nl_langinfo_impl(item)); +}