langinfo.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /*
  2. * Copyright (c) 2021, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/DateConstants.h>
  7. #include <langinfo.h>
  8. // Values taken from glibc's en_US locale files.
  9. static char const* __nl_langinfo(nl_item item)
  10. {
  11. switch (item) {
  12. case CODESET:
  13. return "UTF-8";
  14. case D_T_FMT:
  15. return "%a %d %b %Y %r %Z";
  16. case D_FMT:
  17. return "%m/%d/%Y";
  18. case T_FMT:
  19. return "%r";
  20. case T_FMT_AMPM:
  21. return "%I:%M:%S %p";
  22. case AM_STR:
  23. return "AM";
  24. case PM_STR:
  25. return "PM";
  26. case DAY_1:
  27. case DAY_2:
  28. case DAY_3:
  29. case DAY_4:
  30. case DAY_5:
  31. case DAY_6:
  32. case DAY_7:
  33. return long_day_names[item - DAY_1].characters_without_null_termination();
  34. case ABDAY_1:
  35. case ABDAY_2:
  36. case ABDAY_3:
  37. case ABDAY_4:
  38. case ABDAY_5:
  39. case ABDAY_6:
  40. case ABDAY_7:
  41. return short_day_names[item - ABDAY_1].characters_without_null_termination();
  42. case MON_1:
  43. case MON_2:
  44. case MON_3:
  45. case MON_4:
  46. case MON_5:
  47. case MON_6:
  48. case MON_7:
  49. case MON_8:
  50. case MON_9:
  51. case MON_10:
  52. case MON_11:
  53. case MON_12:
  54. return long_month_names[item - MON_1].characters_without_null_termination();
  55. case ABMON_1:
  56. case ABMON_2:
  57. case ABMON_3:
  58. case ABMON_4:
  59. case ABMON_5:
  60. case ABMON_6:
  61. case ABMON_7:
  62. case ABMON_8:
  63. case ABMON_9:
  64. case ABMON_10:
  65. case ABMON_11:
  66. case ABMON_12:
  67. return short_month_names[item - ABMON_1].characters_without_null_termination();
  68. case RADIXCHAR:
  69. return ".";
  70. case THOUSEP:
  71. return ",";
  72. case YESEXPR:
  73. return "^[+1yY]";
  74. case NOEXPR:
  75. return "^[-0nN]";
  76. // en_US does not have ERA.
  77. case ERA:
  78. case ERA_D_FMT:
  79. case ERA_D_T_FMT:
  80. case ERA_T_FMT:
  81. // en_US also doesn't have special digit symbols.
  82. case ALT_DIGITS:
  83. // Invalid values also return an empty string.
  84. default:
  85. return "";
  86. }
  87. }
  88. extern "C" {
  89. char* nl_langinfo(nl_item item)
  90. {
  91. // POSIX states that returned strings should not be modified,
  92. // so this cast is probably fine.
  93. return const_cast<char*>(__nl_langinfo(item));
  94. }
  95. }