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