1 1.18 christos /* $NetBSD: nl_langinfo.c,v 1.18 2017/01/10 17:50:24 christos Exp $ */ 2 1.4 kleink 3 1.12 tnozaki /*- 4 1.12 tnozaki * Copyright (c)2008 Citrus Project, 5 1.12 tnozaki * All rights reserved. 6 1.12 tnozaki * 7 1.12 tnozaki * Redistribution and use in source and binary forms, with or without 8 1.12 tnozaki * modification, are permitted provided that the following conditions 9 1.12 tnozaki * are met: 10 1.12 tnozaki * 1. Redistributions of source code must retain the above copyright 11 1.12 tnozaki * notice, this list of conditions and the following disclaimer. 12 1.12 tnozaki * 2. Redistributions in binary form must reproduce the above copyright 13 1.12 tnozaki * notice, this list of conditions and the following disclaimer in the 14 1.12 tnozaki * documentation and/or other materials provided with the distribution. 15 1.12 tnozaki * 16 1.12 tnozaki * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17 1.12 tnozaki * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 1.12 tnozaki * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 1.12 tnozaki * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20 1.12 tnozaki * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 1.12 tnozaki * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 1.12 tnozaki * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 1.12 tnozaki * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 1.12 tnozaki * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 1.12 tnozaki * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 1.12 tnozaki * SUCH DAMAGE. 27 1.1 jtc */ 28 1.1 jtc 29 1.5 christos #include <sys/cdefs.h> 30 1.18 christos __RCSID("$NetBSD: nl_langinfo.c,v 1.18 2017/01/10 17:50:24 christos Exp $"); 31 1.1 jtc 32 1.16 joerg #include "namespace.h" 33 1.12 tnozaki #include <sys/types.h> 34 1.17 joerg #include <sys/localedef.h> 35 1.12 tnozaki #include <langinfo.h> 36 1.17 joerg #include <stddef.h> 37 1.12 tnozaki #define __SETLOCALE_SOURCE__ 38 1.1 jtc #include <locale.h> 39 1.12 tnozaki #include <stdlib.h> 40 1.17 joerg #include <string.h> 41 1.12 tnozaki 42 1.17 joerg #include "runetype_local.h" 43 1.12 tnozaki #include "setlocale_local.h" 44 1.1 jtc 45 1.17 joerg static const char langinfo_category[] = { 46 1.17 joerg [ D_T_FMT ] = LC_TIME, 47 1.17 joerg [ D_FMT ] = LC_TIME, 48 1.17 joerg [ T_FMT ] = LC_TIME, 49 1.17 joerg [ T_FMT_AMPM ] = LC_TIME, 50 1.17 joerg [ AM_STR ] = LC_TIME, 51 1.17 joerg [ PM_STR ] = LC_TIME, 52 1.17 joerg [ DAY_1 ] = LC_TIME, 53 1.17 joerg [ DAY_2 ] = LC_TIME, 54 1.17 joerg [ DAY_3 ] = LC_TIME, 55 1.17 joerg [ DAY_4 ] = LC_TIME, 56 1.17 joerg [ DAY_5 ] = LC_TIME, 57 1.17 joerg [ DAY_6 ] = LC_TIME, 58 1.17 joerg [ DAY_7 ] = LC_TIME, 59 1.17 joerg [ ABDAY_1 ] = LC_TIME, 60 1.17 joerg [ ABDAY_2 ] = LC_TIME, 61 1.17 joerg [ ABDAY_3 ] = LC_TIME, 62 1.17 joerg [ ABDAY_4 ] = LC_TIME, 63 1.17 joerg [ ABDAY_5 ] = LC_TIME, 64 1.17 joerg [ ABDAY_6 ] = LC_TIME, 65 1.17 joerg [ ABDAY_7 ] = LC_TIME, 66 1.17 joerg [ MON_1 ] = LC_TIME, 67 1.17 joerg [ MON_2 ] = LC_TIME, 68 1.17 joerg [ MON_3 ] = LC_TIME, 69 1.17 joerg [ MON_4 ] = LC_TIME, 70 1.17 joerg [ MON_5 ] = LC_TIME, 71 1.17 joerg [ MON_6 ] = LC_TIME, 72 1.17 joerg [ MON_7 ] = LC_TIME, 73 1.17 joerg [ MON_8 ] = LC_TIME, 74 1.17 joerg [ MON_9 ] = LC_TIME, 75 1.17 joerg [ MON_10 ] = LC_TIME, 76 1.17 joerg [ MON_11 ] = LC_TIME, 77 1.17 joerg [ MON_12 ] = LC_TIME, 78 1.17 joerg [ ABMON_1 ] = LC_TIME, 79 1.17 joerg [ ABMON_2 ] = LC_TIME, 80 1.17 joerg [ ABMON_3 ] = LC_TIME, 81 1.17 joerg [ ABMON_4 ] = LC_TIME, 82 1.17 joerg [ ABMON_5 ] = LC_TIME, 83 1.17 joerg [ ABMON_6 ] = LC_TIME, 84 1.17 joerg [ ABMON_7 ] = LC_TIME, 85 1.17 joerg [ ABMON_8 ] = LC_TIME, 86 1.17 joerg [ ABMON_9 ] = LC_TIME, 87 1.17 joerg [ ABMON_10 ] = LC_TIME, 88 1.17 joerg [ ABMON_11 ] = LC_TIME, 89 1.17 joerg [ ABMON_12 ] = LC_TIME, 90 1.17 joerg [ RADIXCHAR ] = LC_NUMERIC, 91 1.17 joerg [ THOUSEP ] = LC_NUMERIC, 92 1.17 joerg [ YESSTR ] = LC_MESSAGES, 93 1.17 joerg [ YESEXPR ] = LC_MESSAGES, 94 1.17 joerg [ NOSTR ] = LC_MESSAGES, 95 1.17 joerg [ NOEXPR ] = LC_MESSAGES, 96 1.17 joerg [ CRNCYSTR ] = 0, 97 1.17 joerg [ CODESET ] = LC_CTYPE, 98 1.17 joerg [ ERA ] = 0, 99 1.17 joerg [ ERA_D_FMT ] = 0, 100 1.17 joerg [ ERA_D_T_FMT ] = 0, 101 1.17 joerg [ ERA_T_FMT ] = 0, 102 1.17 joerg [ ALT_DIGITS ] = 0, 103 1.17 joerg }; 104 1.17 joerg 105 1.18 christos #define offsetofu16(a, b) ((uint16_t)offsetof(a, b)) 106 1.18 christos 107 1.17 joerg static const uint16_t langinfo_offset[] = { 108 1.18 christos [ D_T_FMT ] = offsetofu16(_TimeLocale, d_t_fmt), 109 1.18 christos [ D_FMT ] = offsetofu16(_TimeLocale, d_fmt), 110 1.18 christos [ T_FMT ] = offsetofu16(_TimeLocale, t_fmt), 111 1.18 christos [ T_FMT_AMPM ] = offsetofu16(_TimeLocale, t_fmt_ampm), 112 1.18 christos [ AM_STR ] = offsetofu16(_TimeLocale, am_pm[0]), 113 1.18 christos [ PM_STR ] = offsetofu16(_TimeLocale, am_pm[1]), 114 1.18 christos [ DAY_1 ] = offsetofu16(_TimeLocale, day[0]), 115 1.18 christos [ DAY_2 ] = offsetofu16(_TimeLocale, day[1]), 116 1.18 christos [ DAY_3 ] = offsetofu16(_TimeLocale, day[2]), 117 1.18 christos [ DAY_4 ] = offsetofu16(_TimeLocale, day[3]), 118 1.18 christos [ DAY_5 ] = offsetofu16(_TimeLocale, day[4]), 119 1.18 christos [ DAY_6 ] = offsetofu16(_TimeLocale, day[5]), 120 1.18 christos [ DAY_7 ] = offsetofu16(_TimeLocale, day[6]), 121 1.18 christos [ ABDAY_1 ] = offsetofu16(_TimeLocale, abday[0]), 122 1.18 christos [ ABDAY_2 ] = offsetofu16(_TimeLocale, abday[1]), 123 1.18 christos [ ABDAY_3 ] = offsetofu16(_TimeLocale, abday[2]), 124 1.18 christos [ ABDAY_4 ] = offsetofu16(_TimeLocale, abday[3]), 125 1.18 christos [ ABDAY_5 ] = offsetofu16(_TimeLocale, abday[4]), 126 1.18 christos [ ABDAY_6 ] = offsetofu16(_TimeLocale, abday[5]), 127 1.18 christos [ ABDAY_7 ] = offsetofu16(_TimeLocale, abday[6]), 128 1.18 christos [ MON_1 ] = offsetofu16(_TimeLocale, mon[0]), 129 1.18 christos [ MON_2 ] = offsetofu16(_TimeLocale, mon[1]), 130 1.18 christos [ MON_3 ] = offsetofu16(_TimeLocale, mon[2]), 131 1.18 christos [ MON_4 ] = offsetofu16(_TimeLocale, mon[3]), 132 1.18 christos [ MON_5 ] = offsetofu16(_TimeLocale, mon[4]), 133 1.18 christos [ MON_6 ] = offsetofu16(_TimeLocale, mon[5]), 134 1.18 christos [ MON_7 ] = offsetofu16(_TimeLocale, mon[6]), 135 1.18 christos [ MON_8 ] = offsetofu16(_TimeLocale, mon[7]), 136 1.18 christos [ MON_9 ] = offsetofu16(_TimeLocale, mon[8]), 137 1.18 christos [ MON_10 ] = offsetofu16(_TimeLocale, mon[9]), 138 1.18 christos [ MON_11 ] = offsetofu16(_TimeLocale, mon[10]), 139 1.18 christos [ MON_12 ] = offsetofu16(_TimeLocale, mon[11]), 140 1.18 christos [ ABMON_1 ] = offsetofu16(_TimeLocale, abmon[0]), 141 1.18 christos [ ABMON_2 ] = offsetofu16(_TimeLocale, abmon[1]), 142 1.18 christos [ ABMON_3 ] = offsetofu16(_TimeLocale, abmon[2]), 143 1.18 christos [ ABMON_4 ] = offsetofu16(_TimeLocale, abmon[3]), 144 1.18 christos [ ABMON_5 ] = offsetofu16(_TimeLocale, abmon[4]), 145 1.18 christos [ ABMON_6 ] = offsetofu16(_TimeLocale, abmon[5]), 146 1.18 christos [ ABMON_7 ] = offsetofu16(_TimeLocale, abmon[6]), 147 1.18 christos [ ABMON_8 ] = offsetofu16(_TimeLocale, abmon[7]), 148 1.18 christos [ ABMON_9 ] = offsetofu16(_TimeLocale, abmon[8]), 149 1.18 christos [ ABMON_10 ] = offsetofu16(_TimeLocale, abmon[9]), 150 1.18 christos [ ABMON_11 ] = offsetofu16(_TimeLocale, abmon[10]), 151 1.18 christos [ ABMON_12 ] = offsetofu16(_TimeLocale, abmon[11]), 152 1.18 christos [ RADIXCHAR ] = offsetofu16(_NumericLocale, decimal_point), 153 1.18 christos [ THOUSEP ] = offsetofu16(_NumericLocale, thousands_sep), 154 1.18 christos [ YESSTR ] = offsetofu16(_MessagesLocale, yesstr), 155 1.18 christos [ YESEXPR ] = offsetofu16(_MessagesLocale, yesexpr), 156 1.18 christos [ NOSTR ] = offsetofu16(_MessagesLocale, nostr), 157 1.18 christos [ NOEXPR ] = offsetofu16(_MessagesLocale, noexpr), 158 1.17 joerg [ CRNCYSTR ] = 0, 159 1.18 christos [ CODESET ] = offsetofu16(_RuneLocale, rl_codeset), 160 1.17 joerg [ ERA ] = 0, 161 1.17 joerg [ ERA_D_FMT ] = 0, 162 1.17 joerg [ ERA_D_T_FMT ] = 0, 163 1.17 joerg [ ERA_T_FMT ] = 0, 164 1.17 joerg [ ALT_DIGITS ] = 0, 165 1.17 joerg }; 166 1.17 joerg 167 1.16 joerg __weak_alias(nl_langinfo_l, _nl_langinfo_l) 168 1.16 joerg 169 1.1 jtc char * 170 1.12 tnozaki nl_langinfo(nl_item item) 171 1.1 jtc { 172 1.16 joerg 173 1.16 joerg return nl_langinfo_l(item, _current_locale()); 174 1.16 joerg } 175 1.16 joerg 176 1.16 joerg char * 177 1.16 joerg nl_langinfo_l(nl_item item, locale_t loc) 178 1.16 joerg { 179 1.17 joerg char *s; 180 1.17 joerg int category; 181 1.17 joerg size_t offset; 182 1.17 joerg 183 1.17 joerg if (item < 0 || item >= (long)__arraycount(langinfo_category)) 184 1.17 joerg return __UNCONST(""); /* Outside the defined range */ 185 1.17 joerg 186 1.17 joerg category = langinfo_category[item]; 187 1.17 joerg if (category == 0) 188 1.17 joerg return __UNCONST(""); /* Not in use */ 189 1.17 joerg offset = langinfo_offset[item]; 190 1.1 jtc 191 1.17 joerg memcpy(&s, (char *)loc->part_impl[category] + offset, sizeof(s)); 192 1.12 tnozaki if (s == NULL) 193 1.17 joerg return __UNCONST(""); 194 1.17 joerg else 195 1.17 joerg return s; 196 1.1 jtc } 197