15bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o/* Load needed message catalogs. 2b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o Copyright (C) 1995-1999, 2000-2004 Free Software Foundation, Inc. 35bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 4a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o This program is free software; you can redistribute it and/or modify it 5a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o under the terms of the GNU Library General Public License as published 6a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o by the Free Software Foundation; either version 2, or (at your option) 75bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o any later version. 85bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 95bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o This program is distributed in the hope that it will be useful, 105bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o but WITHOUT ANY WARRANTY; without even the implied warranty of 11a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o Library General Public License for more details. 135bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 14a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o You should have received a copy of the GNU Library General Public 15a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o License along with this program; if not, write to the Free Software 16a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 17a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o USA. */ 18a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 19a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* Tell glibc's <string.h> to provide a prototype for mempcpy(). 20a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o This must come before <config.h> because <config.h> may include 21a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o <features.h>, and once <features.h> has been included, it's too late. */ 22a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#ifndef _GNU_SOURCE 23a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define _GNU_SOURCE 1 24a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 255bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 265bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o#ifdef HAVE_CONFIG_H 275bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o# include <config.h> 285bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o#endif 295bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 30a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#include <ctype.h> 31a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#include <errno.h> 325bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o#include <fcntl.h> 335bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o#include <sys/types.h> 345bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o#include <sys/stat.h> 355bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 36a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#ifdef __GNUC__ 37b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o# undef alloca 38a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define alloca __builtin_alloca 39a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define HAVE_ALLOCA 1 40a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#else 41b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o# ifdef _MSC_VER 42b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o# include <malloc.h> 43b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o# define alloca _alloca 44a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# else 45b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o# if defined HAVE_ALLOCA_H || defined _LIBC 46b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o# include <alloca.h> 47a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# else 48b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o# ifdef _AIX 49b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o #pragma alloca 50b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o# else 51b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o# ifndef alloca 52a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'ochar *alloca (); 53b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o# endif 54a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# endif 55a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# endif 56a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# endif 575bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o#endif 585bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 59a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#include <stdlib.h> 60a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#include <string.h> 61a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 625bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o#if defined HAVE_UNISTD_H || defined _LIBC 635bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o# include <unistd.h> 645bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o#endif 655bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 66a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#ifdef _LIBC 67a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# include <langinfo.h> 68a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# include <locale.h> 69a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 70a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 71a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ 72a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o || (defined _LIBC && defined _POSIX_MAPPED_FILES) 735bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o# include <sys/mman.h> 74a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef HAVE_MMAP 75a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define HAVE_MMAP 1 76a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#else 77a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef HAVE_MMAP 785bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o#endif 795bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 80a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if defined HAVE_STDINT_H_WITH_UINTMAX || defined _LIBC 81a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# include <stdint.h> 82a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 83a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if defined HAVE_INTTYPES_H || defined _LIBC 84a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# include <inttypes.h> 85a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 86a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 87a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#include "gmo.h" 885bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o#include "gettextP.h" 89a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#include "hash-string.h" 90a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#include "plural-exp.h" 91a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 92a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#ifdef _LIBC 93a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# include "../locale/localeinfo.h" 94a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 95a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 96a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* Provide fallback values for macros that ought to be defined in <inttypes.h>. 97a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o Note that our fallback values need not be literal strings, because we don't 98a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o use them with preprocessor string concatenation. */ 99a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRId8 || PRI_MACROS_BROKEN 100a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRId8 101a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRId8 "d" 102a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 103a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIi8 || PRI_MACROS_BROKEN 104a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIi8 105a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIi8 "i" 106a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 107a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIo8 || PRI_MACROS_BROKEN 108a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIo8 109a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIo8 "o" 110a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 111a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIu8 || PRI_MACROS_BROKEN 112a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIu8 113a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIu8 "u" 114a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 115a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIx8 || PRI_MACROS_BROKEN 116a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIx8 117a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIx8 "x" 118a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 119a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIX8 || PRI_MACROS_BROKEN 120a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIX8 121a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIX8 "X" 122a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 123a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRId16 || PRI_MACROS_BROKEN 124a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRId16 125a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRId16 "d" 126a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 127a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIi16 || PRI_MACROS_BROKEN 128a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIi16 129a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIi16 "i" 130a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 131a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIo16 || PRI_MACROS_BROKEN 132a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIo16 133a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIo16 "o" 134a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 135a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIu16 || PRI_MACROS_BROKEN 136a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIu16 137a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIu16 "u" 138a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 139a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIx16 || PRI_MACROS_BROKEN 140a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIx16 141a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIx16 "x" 142a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 143a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIX16 || PRI_MACROS_BROKEN 144a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIX16 145a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIX16 "X" 146a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 147a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRId32 || PRI_MACROS_BROKEN 148a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRId32 149a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRId32 "d" 150a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 151a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIi32 || PRI_MACROS_BROKEN 152a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIi32 153a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIi32 "i" 154a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 155a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIo32 || PRI_MACROS_BROKEN 156a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIo32 157a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIo32 "o" 158a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 159a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIu32 || PRI_MACROS_BROKEN 160a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIu32 161a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIu32 "u" 162a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 163a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIx32 || PRI_MACROS_BROKEN 164a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIx32 165a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIx32 "x" 166a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 167a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIX32 || PRI_MACROS_BROKEN 168a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIX32 169a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIX32 "X" 170a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 171a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRId64 || PRI_MACROS_BROKEN 172a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRId64 173a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRId64 (sizeof (long) == 8 ? "ld" : "lld") 174a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 175a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIi64 || PRI_MACROS_BROKEN 176a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIi64 177a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIi64 (sizeof (long) == 8 ? "li" : "lli") 178a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 179a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIo64 || PRI_MACROS_BROKEN 180a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIo64 181a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIo64 (sizeof (long) == 8 ? "lo" : "llo") 182a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 183a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIu64 || PRI_MACROS_BROKEN 184a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIu64 185a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIu64 (sizeof (long) == 8 ? "lu" : "llu") 186a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 187a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIx64 || PRI_MACROS_BROKEN 188a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIx64 189a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIx64 (sizeof (long) == 8 ? "lx" : "llx") 190a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 191a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIX64 || PRI_MACROS_BROKEN 192a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIX64 193a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIX64 (sizeof (long) == 8 ? "lX" : "llX") 194a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 195a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIdLEAST8 || PRI_MACROS_BROKEN 196a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIdLEAST8 197a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIdLEAST8 "d" 198a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 199a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIiLEAST8 || PRI_MACROS_BROKEN 200a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIiLEAST8 201a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIiLEAST8 "i" 202a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 203a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIoLEAST8 || PRI_MACROS_BROKEN 204a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIoLEAST8 205a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIoLEAST8 "o" 206a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 207a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIuLEAST8 || PRI_MACROS_BROKEN 208a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIuLEAST8 209a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIuLEAST8 "u" 210a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 211a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIxLEAST8 || PRI_MACROS_BROKEN 212a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIxLEAST8 213a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIxLEAST8 "x" 214a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 215a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIXLEAST8 || PRI_MACROS_BROKEN 216a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIXLEAST8 217a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIXLEAST8 "X" 218a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 219a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIdLEAST16 || PRI_MACROS_BROKEN 220a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIdLEAST16 221a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIdLEAST16 "d" 222a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 223a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIiLEAST16 || PRI_MACROS_BROKEN 224a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIiLEAST16 225a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIiLEAST16 "i" 226a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 227a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIoLEAST16 || PRI_MACROS_BROKEN 228a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIoLEAST16 229a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIoLEAST16 "o" 230a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 231a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIuLEAST16 || PRI_MACROS_BROKEN 232a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIuLEAST16 233a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIuLEAST16 "u" 234a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 235a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIxLEAST16 || PRI_MACROS_BROKEN 236a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIxLEAST16 237a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIxLEAST16 "x" 238a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 239a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIXLEAST16 || PRI_MACROS_BROKEN 240a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIXLEAST16 241a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIXLEAST16 "X" 242a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 243a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIdLEAST32 || PRI_MACROS_BROKEN 244a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIdLEAST32 245a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIdLEAST32 "d" 246a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 247a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIiLEAST32 || PRI_MACROS_BROKEN 248a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIiLEAST32 249a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIiLEAST32 "i" 250a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 251a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIoLEAST32 || PRI_MACROS_BROKEN 252a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIoLEAST32 253a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIoLEAST32 "o" 254a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 255a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIuLEAST32 || PRI_MACROS_BROKEN 256a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIuLEAST32 257a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIuLEAST32 "u" 258a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 259a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIxLEAST32 || PRI_MACROS_BROKEN 260a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIxLEAST32 261a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIxLEAST32 "x" 262a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 263a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIXLEAST32 || PRI_MACROS_BROKEN 264a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIXLEAST32 265a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIXLEAST32 "X" 266a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 267a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIdLEAST64 || PRI_MACROS_BROKEN 268a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIdLEAST64 269a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIdLEAST64 PRId64 270a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 271a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIiLEAST64 || PRI_MACROS_BROKEN 272a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIiLEAST64 273a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIiLEAST64 PRIi64 274a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 275a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIoLEAST64 || PRI_MACROS_BROKEN 276a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIoLEAST64 277a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIoLEAST64 PRIo64 278a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 279a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIuLEAST64 || PRI_MACROS_BROKEN 280a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIuLEAST64 281a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIuLEAST64 PRIu64 282a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 283a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIxLEAST64 || PRI_MACROS_BROKEN 284a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIxLEAST64 285a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIxLEAST64 PRIx64 286a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 287a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIXLEAST64 || PRI_MACROS_BROKEN 288a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIXLEAST64 289a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIXLEAST64 PRIX64 290a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 291a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIdFAST8 || PRI_MACROS_BROKEN 292a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIdFAST8 293a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIdFAST8 "d" 294a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 295a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIiFAST8 || PRI_MACROS_BROKEN 296a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIiFAST8 297a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIiFAST8 "i" 298a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 299a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIoFAST8 || PRI_MACROS_BROKEN 300a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIoFAST8 301a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIoFAST8 "o" 302a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 303a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIuFAST8 || PRI_MACROS_BROKEN 304a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIuFAST8 305a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIuFAST8 "u" 306a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 307a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIxFAST8 || PRI_MACROS_BROKEN 308a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIxFAST8 309a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIxFAST8 "x" 310a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 311a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIXFAST8 || PRI_MACROS_BROKEN 312a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIXFAST8 313a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIXFAST8 "X" 314a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 315a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIdFAST16 || PRI_MACROS_BROKEN 316a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIdFAST16 317a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIdFAST16 "d" 318a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 319a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIiFAST16 || PRI_MACROS_BROKEN 320a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIiFAST16 321a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIiFAST16 "i" 322a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 323a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIoFAST16 || PRI_MACROS_BROKEN 324a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIoFAST16 325a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIoFAST16 "o" 326a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 327a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIuFAST16 || PRI_MACROS_BROKEN 328a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIuFAST16 329a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIuFAST16 "u" 330a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 331a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIxFAST16 || PRI_MACROS_BROKEN 332a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIxFAST16 333a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIxFAST16 "x" 334a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 335a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIXFAST16 || PRI_MACROS_BROKEN 336a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIXFAST16 337a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIXFAST16 "X" 338a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 339a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIdFAST32 || PRI_MACROS_BROKEN 340a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIdFAST32 341a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIdFAST32 "d" 342a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 343a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIiFAST32 || PRI_MACROS_BROKEN 344a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIiFAST32 345a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIiFAST32 "i" 346a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 347a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIoFAST32 || PRI_MACROS_BROKEN 348a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIoFAST32 349a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIoFAST32 "o" 350a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 351a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIuFAST32 || PRI_MACROS_BROKEN 352a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIuFAST32 353a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIuFAST32 "u" 354a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 355a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIxFAST32 || PRI_MACROS_BROKEN 356a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIxFAST32 357a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIxFAST32 "x" 358a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 359a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIXFAST32 || PRI_MACROS_BROKEN 360a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIXFAST32 361a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIXFAST32 "X" 362a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 363a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIdFAST64 || PRI_MACROS_BROKEN 364a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIdFAST64 365a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIdFAST64 PRId64 366a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 367a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIiFAST64 || PRI_MACROS_BROKEN 368a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIiFAST64 369a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIiFAST64 PRIi64 370a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 371a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIoFAST64 || PRI_MACROS_BROKEN 372a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIoFAST64 373a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIoFAST64 PRIo64 374a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 375a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIuFAST64 || PRI_MACROS_BROKEN 376a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIuFAST64 377a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIuFAST64 PRIu64 378a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 379a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIxFAST64 || PRI_MACROS_BROKEN 380a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIxFAST64 381a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIxFAST64 PRIx64 382a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 383a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIXFAST64 || PRI_MACROS_BROKEN 384a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIXFAST64 385a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIXFAST64 PRIX64 386a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 387a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIdMAX || PRI_MACROS_BROKEN 388a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIdMAX 389a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIdMAX (sizeof (uintmax_t) == sizeof (long) ? "ld" : "lld") 390a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 391a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIiMAX || PRI_MACROS_BROKEN 392a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIiMAX 393a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIiMAX (sizeof (uintmax_t) == sizeof (long) ? "li" : "lli") 394a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 395a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIoMAX || PRI_MACROS_BROKEN 396a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIoMAX 397a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIoMAX (sizeof (uintmax_t) == sizeof (long) ? "lo" : "llo") 398a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 399a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIuMAX || PRI_MACROS_BROKEN 400a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIuMAX 401a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIuMAX (sizeof (uintmax_t) == sizeof (long) ? "lu" : "llu") 402a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 403a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIxMAX || PRI_MACROS_BROKEN 404a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIxMAX 405a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIxMAX (sizeof (uintmax_t) == sizeof (long) ? "lx" : "llx") 406a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 407a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIXMAX || PRI_MACROS_BROKEN 408a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIXMAX 409a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIXMAX (sizeof (uintmax_t) == sizeof (long) ? "lX" : "llX") 410a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 411a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIdPTR || PRI_MACROS_BROKEN 412a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIdPTR 413a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIdPTR \ 414a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o (sizeof (void *) == sizeof (long) ? "ld" : \ 415a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o sizeof (void *) == sizeof (int) ? "d" : \ 416a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o "lld") 417a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 418a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIiPTR || PRI_MACROS_BROKEN 419a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIiPTR 420a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIiPTR \ 421a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o (sizeof (void *) == sizeof (long) ? "li" : \ 422a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o sizeof (void *) == sizeof (int) ? "i" : \ 423a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o "lli") 424a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 425a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIoPTR || PRI_MACROS_BROKEN 426a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIoPTR 427a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIoPTR \ 428a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o (sizeof (void *) == sizeof (long) ? "lo" : \ 429a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o sizeof (void *) == sizeof (int) ? "o" : \ 430a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o "llo") 431a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 432a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIuPTR || PRI_MACROS_BROKEN 433a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIuPTR 434a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIuPTR \ 435a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o (sizeof (void *) == sizeof (long) ? "lu" : \ 436a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o sizeof (void *) == sizeof (int) ? "u" : \ 437a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o "llu") 438a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 439a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIxPTR || PRI_MACROS_BROKEN 440a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIxPTR 441a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIxPTR \ 442a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o (sizeof (void *) == sizeof (long) ? "lx" : \ 443a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o sizeof (void *) == sizeof (int) ? "x" : \ 444a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o "llx") 445a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 446a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined PRIXPTR || PRI_MACROS_BROKEN 447a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef PRIXPTR 448a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define PRIXPTR \ 449a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o (sizeof (void *) == sizeof (long) ? "lX" : \ 450a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o sizeof (void *) == sizeof (int) ? "X" : \ 451a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o "llX") 452a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 4535bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 4545bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o/* @@ end of prolog @@ */ 4555bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 4565bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o#ifdef _LIBC 4575bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o/* Rename the non ISO C functions. This is required by the standard 4585bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o because some ISO C functions will require linking with this object 4595bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o file and the name space must not be polluted. */ 4605bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o# define open __open 4615bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o# define close __close 4625bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o# define read __read 4635bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o# define mmap __mmap 4645bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o# define munmap __munmap 4655bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o#endif 4665bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 467a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* For those losing systems which don't have `alloca' we have to add 468a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o some additional code emulating it. */ 469a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#ifdef HAVE_ALLOCA 470a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define freea(p) /* nothing */ 471a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#else 472a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define alloca(n) malloc (n) 473a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define freea(p) free (p) 474a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 475a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 476a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* For systems that distinguish between text and binary I/O. 477a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o O_BINARY is usually declared in <fcntl.h>. */ 478a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if !defined O_BINARY && defined _O_BINARY 479a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o /* For MSC-compatible compilers. */ 480a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define O_BINARY _O_BINARY 481a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define O_TEXT _O_TEXT 482a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 483a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#ifdef __BEOS__ 484a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o /* BeOS 5 has O_BINARY and O_TEXT, but they have no effect. */ 485a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef O_BINARY 486a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# undef O_TEXT 487a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 488a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* On reasonable systems, binary I/O is the default. */ 489a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#ifndef O_BINARY 490a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define O_BINARY 0 491a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 492a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 493a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 4945bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o/* We need a sign, whether a new catalog was loaded, which can be associated 4955bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o with all translations. This is important if the translations are 4965bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o cached by one of GCC's features. */ 497a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'oint _nl_msg_cat_cntr; 498a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 499a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 500a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* Expand a system dependent string segment. Return NULL if unsupported. */ 501a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'ostatic const char * 502b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'oget_sysdep_segment_value (const char *name) 503a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o{ 504a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o /* Test for an ISO C 99 section 7.8.1 format string directive. 505a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o Syntax: 506a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o P R I { d | i | o | u | x | X } 507a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { { | LEAST | FAST } { 8 | 16 | 32 | 64 } | MAX | PTR } */ 508a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o /* We don't use a table of 14 times 6 'const char *' strings here, because 509a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o data relocations cost startup time. */ 510a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[0] == 'P' && name[1] == 'R' && name[2] == 'I') 511a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 512a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'd' || name[3] == 'i' || name[3] == 'o' || name[3] == 'u' 513a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o || name[3] == 'x' || name[3] == 'X') 514a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 515a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[4] == '8' && name[5] == '\0') 516a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 517a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'd') 518a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRId8; 519a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'i') 520a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIi8; 521a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'o') 522a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIo8; 523a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'u') 524a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIu8; 525a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'x') 526a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIx8; 527a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'X') 528a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIX8; 529a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o abort (); 530a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 531a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[4] == '1' && name[5] == '6' && name[6] == '\0') 532a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 533a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'd') 534a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRId16; 535a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'i') 536a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIi16; 537a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'o') 538a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIo16; 539a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'u') 540a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIu16; 541a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'x') 542a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIx16; 543a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'X') 544a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIX16; 545a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o abort (); 546a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 547a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[4] == '3' && name[5] == '2' && name[6] == '\0') 548a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 549a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'd') 550a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRId32; 551a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'i') 552a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIi32; 553a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'o') 554a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIo32; 555a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'u') 556a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIu32; 557a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'x') 558a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIx32; 559a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'X') 560a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIX32; 561a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o abort (); 562a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 563a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[4] == '6' && name[5] == '4' && name[6] == '\0') 564a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 565a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'd') 566a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRId64; 567a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'i') 568a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIi64; 569a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'o') 570a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIo64; 571a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'u') 572a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIu64; 573a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'x') 574a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIx64; 575a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'X') 576a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIX64; 577a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o abort (); 578a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 579a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[4] == 'L' && name[5] == 'E' && name[6] == 'A' 580a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o && name[7] == 'S' && name[8] == 'T') 581a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 582a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[9] == '8' && name[10] == '\0') 583a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 584a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'd') 585a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIdLEAST8; 586a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'i') 587a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIiLEAST8; 588a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'o') 589a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIoLEAST8; 590a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'u') 591a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIuLEAST8; 592a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'x') 593a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIxLEAST8; 594a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'X') 595a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIXLEAST8; 596a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o abort (); 597a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 598a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[9] == '1' && name[10] == '6' && name[11] == '\0') 599a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 600a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'd') 601a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIdLEAST16; 602a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'i') 603a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIiLEAST16; 604a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'o') 605a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIoLEAST16; 606a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'u') 607a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIuLEAST16; 608a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'x') 609a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIxLEAST16; 610a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'X') 611a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIXLEAST16; 612a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o abort (); 613a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 614a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[9] == '3' && name[10] == '2' && name[11] == '\0') 615a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 616a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'd') 617a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIdLEAST32; 618a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'i') 619a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIiLEAST32; 620a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'o') 621a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIoLEAST32; 622a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'u') 623a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIuLEAST32; 624a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'x') 625a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIxLEAST32; 626a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'X') 627a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIXLEAST32; 628a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o abort (); 629a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 630a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[9] == '6' && name[10] == '4' && name[11] == '\0') 631a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 632a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'd') 633a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIdLEAST64; 634a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'i') 635a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIiLEAST64; 636a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'o') 637a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIoLEAST64; 638a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'u') 639a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIuLEAST64; 640a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'x') 641a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIxLEAST64; 642a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'X') 643a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIXLEAST64; 644a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o abort (); 645a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 646a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 647a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[4] == 'F' && name[5] == 'A' && name[6] == 'S' 648a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o && name[7] == 'T') 649a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 650a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[8] == '8' && name[9] == '\0') 651a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 652a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'd') 653a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIdFAST8; 654a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'i') 655a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIiFAST8; 656a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'o') 657a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIoFAST8; 658a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'u') 659a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIuFAST8; 660a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'x') 661a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIxFAST8; 662a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'X') 663a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIXFAST8; 664a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o abort (); 665a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 666a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[8] == '1' && name[9] == '6' && name[10] == '\0') 667a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 668a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'd') 669a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIdFAST16; 670a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'i') 671a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIiFAST16; 672a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'o') 673a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIoFAST16; 674a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'u') 675a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIuFAST16; 676a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'x') 677a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIxFAST16; 678a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'X') 679a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIXFAST16; 680a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o abort (); 681a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 682a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[8] == '3' && name[9] == '2' && name[10] == '\0') 683a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 684a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'd') 685a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIdFAST32; 686a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'i') 687a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIiFAST32; 688a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'o') 689a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIoFAST32; 690a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'u') 691a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIuFAST32; 692a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'x') 693a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIxFAST32; 694a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'X') 695a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIXFAST32; 696a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o abort (); 697a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 698a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[8] == '6' && name[9] == '4' && name[10] == '\0') 699a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 700a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'd') 701a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIdFAST64; 702a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'i') 703a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIiFAST64; 704a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'o') 705a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIoFAST64; 706a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'u') 707a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIuFAST64; 708a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'x') 709a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIxFAST64; 710a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'X') 711a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIXFAST64; 712a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o abort (); 713a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 714a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 715a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[4] == 'M' && name[5] == 'A' && name[6] == 'X' 716a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o && name[7] == '\0') 717a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 718a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'd') 719a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIdMAX; 720a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'i') 721a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIiMAX; 722a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'o') 723a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIoMAX; 724a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'u') 725a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIuMAX; 726a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'x') 727a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIxMAX; 728a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'X') 729a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIXMAX; 730a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o abort (); 731a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 732a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[4] == 'P' && name[5] == 'T' && name[6] == 'R' 733a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o && name[7] == '\0') 734a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 735a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'd') 736a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIdPTR; 737a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'i') 738a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIiPTR; 739a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'o') 740a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIoPTR; 741a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'u') 742a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIuPTR; 743a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'x') 744a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIxPTR; 745a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (name[3] == 'X') 746a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return PRIXPTR; 747a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o abort (); 748a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 749a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 750a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 751b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o /* Test for a glibc specific printf() format directive flag. */ 752b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o if (name[0] == 'I' && name[1] == '\0') 753b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o { 754b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o#if defined _LIBC || __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) 755b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o /* The 'I' flag, in numeric format directives, replaces ASCII digits 756b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o with the 'outdigits' defined in the LC_CTYPE locale facet. This is 757b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o used for Farsi (Persian) and maybe Arabic. */ 758b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o return "I"; 759b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o#else 760b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o return ""; 761b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o#endif 762b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o } 763a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o /* Other system dependent strings are not valid. */ 764a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return NULL; 765a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o} 7665bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 767a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* Initialize the codeset dependent parts of an opened message catalog. 768a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o Return the header entry. */ 769a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'oconst char * 770a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'ointernal_function 771b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o_nl_init_domain_conv (struct loaded_l10nfile *domain_file, 772b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o struct loaded_domain *domain, 773b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o struct binding *domainbinding) 774a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o{ 775a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o /* Find out about the character set the file is encoded with. 776a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o This can be found (in textual form) in the entry "". If this 777a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o entry does not exist or if this does not contain the `charset=' 778a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o information, we will assume the charset matches the one the 779a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o current locale and we don't have to perform any conversion. */ 780a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o char *nullentry; 781a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o size_t nullentrylen; 782a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 783a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o /* Preinitialize fields, to avoid recursion during _nl_find_msg. */ 784a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o domain->codeset_cntr = 785a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o (domainbinding != NULL ? domainbinding->codeset_cntr : 0); 786a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#ifdef _LIBC 787a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o domain->conv = (__gconv_t) -1; 788a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#else 789a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# if HAVE_ICONV 790a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o domain->conv = (iconv_t) -1; 791a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# endif 792a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 793a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o domain->conv_tab = NULL; 794a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 795a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o /* Get the header entry. */ 796a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o nullentry = _nl_find_msg (domain_file, domainbinding, "", &nullentrylen); 797a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 798a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (nullentry != NULL) 799a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 800a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if defined _LIBC || HAVE_ICONV 801a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o const char *charsetstr; 802a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 803a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o charsetstr = strstr (nullentry, "charset="); 804a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (charsetstr != NULL) 805a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 806a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o size_t len; 807a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o char *charset; 808a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o const char *outcharset; 809a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 810a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o charsetstr += strlen ("charset="); 811a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o len = strcspn (charsetstr, " \t\n"); 812a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 813a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o charset = (char *) alloca (len + 1); 814a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# if defined _LIBC || HAVE_MEMPCPY 815a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o *((char *) mempcpy (charset, charsetstr, len)) = '\0'; 816a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# else 817a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o memcpy (charset, charsetstr, len); 818a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o charset[len] = '\0'; 819a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# endif 820a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 821a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o /* The output charset should normally be determined by the 822a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o locale. But sometimes the locale is not used or not correctly 823a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o set up, so we provide a possibility for the user to override 824a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o this. Moreover, the value specified through 825a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o bind_textdomain_codeset overrides both. */ 826a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (domainbinding != NULL && domainbinding->codeset != NULL) 827a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o outcharset = domainbinding->codeset; 828a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o else 829a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 830a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o outcharset = getenv ("OUTPUT_CHARSET"); 831a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (outcharset == NULL || outcharset[0] == '\0') 832a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 833a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# ifdef _LIBC 834b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o outcharset = _NL_CURRENT (LC_CTYPE, CODESET); 835a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# else 836a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# if HAVE_ICONV 837b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o extern const char *locale_charset (void); 838a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o outcharset = locale_charset (); 839a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# endif 840a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# endif 841a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 842a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 843a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 844a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# ifdef _LIBC 845a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o /* We always want to use transliteration. */ 846a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o outcharset = norm_add_slashes (outcharset, "TRANSLIT"); 847a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o charset = norm_add_slashes (charset, NULL); 848a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (__gconv_open (outcharset, charset, &domain->conv, 849a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o GCONV_AVOID_NOCONV) 850a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o != __GCONV_OK) 851a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o domain->conv = (__gconv_t) -1; 852a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# else 853a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# if HAVE_ICONV 854a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o /* When using GNU libc >= 2.2 or GNU libiconv >= 1.5, 855a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o we want to use transliteration. */ 856a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 \ 857a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o || _LIBICONV_VERSION >= 0x0105 858a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (strchr (outcharset, '/') == NULL) 859a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 860a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o char *tmp; 861a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 862a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o len = strlen (outcharset); 863a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o tmp = (char *) alloca (len + 10 + 1); 864a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o memcpy (tmp, outcharset, len); 865a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o memcpy (tmp + len, "//TRANSLIT", 10 + 1); 866a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o outcharset = tmp; 867a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 868a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o domain->conv = iconv_open (outcharset, charset); 869a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 870a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o freea (outcharset); 871a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 872a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o else 873a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# endif 874a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o domain->conv = iconv_open (outcharset, charset); 875a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# endif 876a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# endif 877a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 878a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o freea (charset); 879a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 880a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif /* _LIBC || HAVE_ICONV */ 881a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 882a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 883a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o return nullentry; 884a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o} 885a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 886a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* Frees the codeset dependent parts of an opened message catalog. */ 887a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'ovoid 888a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'ointernal_function 889b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o_nl_free_domain_conv (struct loaded_domain *domain) 890a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o{ 891a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (domain->conv_tab != NULL && domain->conv_tab != (char **) -1) 892a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o free (domain->conv_tab); 893a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 894a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#ifdef _LIBC 895a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (domain->conv != (__gconv_t) -1) 896a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o __gconv_close (domain->conv); 897a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#else 898a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# if HAVE_ICONV 899a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (domain->conv != (iconv_t) -1) 900a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o iconv_close (domain->conv); 901a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# endif 902a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 903a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o} 9045bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 9055bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o/* Load the message catalogs specified by FILENAME. If it is no valid 9065bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o message catalog do nothing. */ 9075bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'ovoid 9085bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'ointernal_function 909b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o_nl_load_domain (struct loaded_l10nfile *domain_file, 910b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o struct binding *domainbinding) 9115bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o{ 9125bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o int fd; 9135bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o size_t size; 914a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#ifdef _LIBC 915a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o struct stat64 st; 916a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#else 9175bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o struct stat st; 918a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 9195bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o struct mo_file_header *data = (struct mo_file_header *) -1; 9205bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o int use_mmap = 0; 9215bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o struct loaded_domain *domain; 922a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o int revision; 923a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o const char *nullentry; 9245bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 9255bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o domain_file->decided = 1; 9265bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o domain_file->data = NULL; 9275bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 928a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o /* Note that it would be useless to store domainbinding in domain_file 929a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o because domainbinding might be == NULL now but != NULL later (after 930a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o a call to bind_textdomain_codeset). */ 931a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 9325bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o /* If the record does not represent a valid locale the FILENAME 9335bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o might be NULL. This can happen when according to the given 9345bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o specification the locale file name is different for XPG and CEN 9355bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o syntax. */ 9365bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o if (domain_file->filename == NULL) 9375bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o return; 9385bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 9395bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o /* Try to open the addressed file. */ 940a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o fd = open (domain_file->filename, O_RDONLY | O_BINARY); 9415bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o if (fd == -1) 9425bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o return; 9435bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 9445bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o /* We must know about the size of the file. */ 945a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if ( 946a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#ifdef _LIBC 947a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o __builtin_expect (fstat64 (fd, &st) != 0, 0) 948a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#else 949a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o __builtin_expect (fstat (fd, &st) != 0, 0) 950a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 951a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o || __builtin_expect ((size = (size_t) st.st_size) != st.st_size, 0) 952a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o || __builtin_expect (size < sizeof (struct mo_file_header), 0)) 9535bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o { 9545bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o /* Something went wrong. */ 9555bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o close (fd); 9565bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o return; 9575bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o } 9585bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 959a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#ifdef HAVE_MMAP 9605bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o /* Now we are ready to load the file. If mmap() is available we try 9615bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o this first. If not available or it failed we try to load it. */ 9625bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o data = (struct mo_file_header *) mmap (NULL, size, PROT_READ, 9635bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o MAP_PRIVATE, fd, 0); 9645bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 965a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (__builtin_expect (data != (struct mo_file_header *) -1, 1)) 9665bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o { 9675bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o /* mmap() call was successful. */ 9685bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o close (fd); 9695bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o use_mmap = 1; 9705bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o } 9715bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o#endif 9725bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 9735bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o /* If the data is not yet available (i.e. mmap'ed) we try to load 9745bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o it manually. */ 9755bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o if (data == (struct mo_file_header *) -1) 9765bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o { 9775bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o size_t to_read; 9785bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o char *read_ptr; 9795bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 9805bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o data = (struct mo_file_header *) malloc (size); 9815bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o if (data == NULL) 9825bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o return; 9835bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 9845bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o to_read = size; 9855bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o read_ptr = (char *) data; 9865bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o do 9875bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o { 9885bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o long int nb = (long int) read (fd, read_ptr, to_read); 989a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (nb <= 0) 9905bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o { 991a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#ifdef EINTR 992a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (nb == -1 && errno == EINTR) 993a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o continue; 994a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif 9955bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o close (fd); 9965bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o return; 9975bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o } 9985bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o read_ptr += nb; 9995bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o to_read -= nb; 10005bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o } 10015bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o while (to_read > 0); 10025bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 10035bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o close (fd); 10045bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o } 10055bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 10065bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o /* Using the magic number we can test whether it really is a message 10075bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o catalog file. */ 1008a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (__builtin_expect (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED, 1009a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 0)) 10105bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o { 10115bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o /* The magic number is wrong: not a message catalog file. */ 1012a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#ifdef HAVE_MMAP 10135bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o if (use_mmap) 1014a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o munmap ((void *) data, size); 10155bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o else 10165bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o#endif 10175bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o free (data); 10185bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o return; 10195bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o } 10205bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 1021a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o domain = (struct loaded_domain *) malloc (sizeof (struct loaded_domain)); 1022a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (domain == NULL) 10235bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o return; 1024a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o domain_file->data = domain; 10255bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 10265bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o domain->data = (char *) data; 10275bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o domain->use_mmap = use_mmap; 10285bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o domain->mmap_size = size; 10295bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o domain->must_swap = data->magic != _MAGIC; 1030a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o domain->malloced = NULL; 10315bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 10325bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o /* Fill in the information about the available tables. */ 1033a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o revision = W (domain->must_swap, data->revision); 1034b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o /* We support only the major revisions 0 and 1. */ 1035a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o switch (revision >> 16) 10365bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o { 10375bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o case 0: 1038b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o case 1: 10395bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o domain->nstrings = W (domain->must_swap, data->nstrings); 1040a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o domain->orig_tab = (const struct string_desc *) 10415bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o ((char *) data + W (domain->must_swap, data->orig_tab_offset)); 1042a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o domain->trans_tab = (const struct string_desc *) 10435bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o ((char *) data + W (domain->must_swap, data->trans_tab_offset)); 10445bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o domain->hash_size = W (domain->must_swap, data->hash_tab_size); 1045a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o domain->hash_tab = 1046a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o (domain->hash_size > 2 1047a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o ? (const nls_uint32 *) 1048a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o ((char *) data + W (domain->must_swap, data->hash_tab_offset)) 1049a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o : NULL); 1050a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o domain->must_swap_hash_tab = domain->must_swap; 1051a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 1052a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o /* Now dispatch on the minor revision. */ 1053a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o switch (revision & 0xffff) 1054a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 1055a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o case 0: 1056a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o domain->n_sysdep_strings = 0; 1057a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o domain->orig_sysdep_tab = NULL; 1058a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o domain->trans_sysdep_tab = NULL; 1059a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o break; 1060a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o case 1: 1061a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o default: 1062a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 1063a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o nls_uint32 n_sysdep_strings; 1064a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 1065a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (domain->hash_tab == NULL) 1066a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o /* This is invalid. These minor revisions need a hash table. */ 1067a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o goto invalid; 1068a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 1069a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o n_sysdep_strings = 1070a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o W (domain->must_swap, data->n_sysdep_strings); 1071a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (n_sysdep_strings > 0) 1072a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 1073a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o nls_uint32 n_sysdep_segments; 1074a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o const struct sysdep_segment *sysdep_segments; 1075a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o const char **sysdep_segment_values; 1076a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o const nls_uint32 *orig_sysdep_tab; 1077a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o const nls_uint32 *trans_sysdep_tab; 1078b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o nls_uint32 n_inmem_sysdep_strings; 1079a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o size_t memneed; 1080a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o char *mem; 1081a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o struct sysdep_string_desc *inmem_orig_sysdep_tab; 1082a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o struct sysdep_string_desc *inmem_trans_sysdep_tab; 1083a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o nls_uint32 *inmem_hash_tab; 1084b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o unsigned int i, j; 1085a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 1086a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o /* Get the values of the system dependent segments. */ 1087a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o n_sysdep_segments = 1088a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o W (domain->must_swap, data->n_sysdep_segments); 1089a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o sysdep_segments = (const struct sysdep_segment *) 1090a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o ((char *) data 1091a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o + W (domain->must_swap, data->sysdep_segments_offset)); 1092a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o sysdep_segment_values = 1093a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o alloca (n_sysdep_segments * sizeof (const char *)); 1094a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o for (i = 0; i < n_sysdep_segments; i++) 1095a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 1096a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o const char *name = 1097a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o (char *) data 1098a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o + W (domain->must_swap, sysdep_segments[i].offset); 1099a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o nls_uint32 namelen = 1100a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o W (domain->must_swap, sysdep_segments[i].length); 1101a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 1102a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (!(namelen > 0 && name[namelen - 1] == '\0')) 1103a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 1104a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o freea (sysdep_segment_values); 1105a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o goto invalid; 1106a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 1107a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 1108a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o sysdep_segment_values[i] = get_sysdep_segment_value (name); 1109a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 1110a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 1111a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o orig_sysdep_tab = (const nls_uint32 *) 1112a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o ((char *) data 1113a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o + W (domain->must_swap, data->orig_sysdep_tab_offset)); 1114a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o trans_sysdep_tab = (const nls_uint32 *) 1115a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o ((char *) data 1116a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o + W (domain->must_swap, data->trans_sysdep_tab_offset)); 1117a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 1118a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o /* Compute the amount of additional memory needed for the 1119b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o system dependent strings and the augmented hash table. 1120b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o At the same time, also drop string pairs which refer to 1121b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o an undefined system dependent segment. */ 1122b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o n_inmem_sysdep_strings = 0; 1123b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o memneed = domain->hash_size * sizeof (nls_uint32); 1124b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o for (i = 0; i < n_sysdep_strings; i++) 1125a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 1126b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o int valid = 1; 1127b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o size_t needs[2]; 1128b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o 1129b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o for (j = 0; j < 2; j++) 1130b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o { 1131b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o const struct sysdep_string *sysdep_string = 1132b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o (const struct sysdep_string *) 1133b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o ((char *) data 1134b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o + W (domain->must_swap, 1135b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o j == 0 1136b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o ? orig_sysdep_tab[i] 1137b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o : trans_sysdep_tab[i])); 1138b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o size_t need = 0; 1139b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o const struct segment_pair *p = sysdep_string->segments; 1140b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o 1141b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o if (W (domain->must_swap, p->sysdepref) != SEGMENTS_END) 1142b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o for (p = sysdep_string->segments;; p++) 1143a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 1144b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o nls_uint32 sysdepref; 1145a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 1146b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o need += W (domain->must_swap, p->segsize); 1147a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 1148b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o sysdepref = W (domain->must_swap, p->sysdepref); 1149b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o if (sysdepref == SEGMENTS_END) 1150b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o break; 1151a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 1152b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o if (sysdepref >= n_sysdep_segments) 1153b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o { 1154b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o /* Invalid. */ 1155b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o freea (sysdep_segment_values); 1156b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o goto invalid; 1157b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o } 1158b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o 1159b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o if (sysdep_segment_values[sysdepref] == NULL) 1160b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o { 1161b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o /* This particular string pair is invalid. */ 1162b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o valid = 0; 1163b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o break; 1164b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o } 1165a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 1166b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o need += strlen (sysdep_segment_values[sysdepref]); 1167b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o } 1168a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 1169b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o needs[j] = need; 1170b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o if (!valid) 1171b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o break; 1172b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o } 1173b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o 1174b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o if (valid) 1175a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 1176b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o n_inmem_sysdep_strings++; 1177b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o memneed += needs[0] + needs[1]; 1178a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 1179b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o } 1180b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o memneed += 2 * n_inmem_sysdep_strings 1181b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o * sizeof (struct sysdep_string_desc); 1182b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o 1183b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o if (n_inmem_sysdep_strings > 0) 1184b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o { 1185b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o unsigned int k; 1186b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o 1187b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o /* Allocate additional memory. */ 1188b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o mem = (char *) malloc (memneed); 1189b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o if (mem == NULL) 1190b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o goto invalid; 1191b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o 1192b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o domain->malloced = mem; 1193b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o inmem_orig_sysdep_tab = (struct sysdep_string_desc *) mem; 1194b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o mem += n_inmem_sysdep_strings 1195b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o * sizeof (struct sysdep_string_desc); 1196b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o inmem_trans_sysdep_tab = (struct sysdep_string_desc *) mem; 1197b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o mem += n_inmem_sysdep_strings 1198b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o * sizeof (struct sysdep_string_desc); 1199b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o inmem_hash_tab = (nls_uint32 *) mem; 1200b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o mem += domain->hash_size * sizeof (nls_uint32); 1201b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o 1202b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o /* Compute the system dependent strings. */ 1203b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o k = 0; 1204b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o for (i = 0; i < n_sysdep_strings; i++) 1205a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 1206b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o int valid = 1; 1207a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 1208b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o for (j = 0; j < 2; j++) 1209a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 1210b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o const struct sysdep_string *sysdep_string = 1211b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o (const struct sysdep_string *) 1212b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o ((char *) data 1213b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o + W (domain->must_swap, 1214b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o j == 0 1215b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o ? orig_sysdep_tab[i] 1216b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o : trans_sysdep_tab[i])); 1217b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o const struct segment_pair *p = 1218b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o sysdep_string->segments; 1219b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o 1220b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o if (W (domain->must_swap, p->sysdepref) 1221b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o != SEGMENTS_END) 1222b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o for (p = sysdep_string->segments;; p++) 1223b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o { 1224b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o nls_uint32 sysdepref; 1225b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o 1226b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o sysdepref = 1227b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o W (domain->must_swap, p->sysdepref); 1228b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o if (sysdepref == SEGMENTS_END) 1229b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o break; 1230b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o 1231b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o if (sysdep_segment_values[sysdepref] == NULL) 1232b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o { 1233b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o /* This particular string pair is 1234b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o invalid. */ 1235b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o valid = 0; 1236b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o break; 1237b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o } 1238b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o } 1239b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o 1240b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o if (!valid) 1241b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o break; 1242b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o } 1243a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 1244b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o if (valid) 1245b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o { 1246b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o for (j = 0; j < 2; j++) 1247a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 1248b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o const struct sysdep_string *sysdep_string = 1249b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o (const struct sysdep_string *) 1250b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o ((char *) data 1251b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o + W (domain->must_swap, 1252b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o j == 0 1253b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o ? orig_sysdep_tab[i] 1254b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o : trans_sysdep_tab[i])); 1255b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o const char *static_segments = 1256b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o (char *) data 1257b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o + W (domain->must_swap, sysdep_string->offset); 1258b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o const struct segment_pair *p = 1259b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o sysdep_string->segments; 1260b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o 1261b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o /* Concatenate the segments, and fill 1262b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o inmem_orig_sysdep_tab[k] (for j == 0) and 1263b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o inmem_trans_sysdep_tab[k] (for j == 1). */ 1264b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o 1265b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o struct sysdep_string_desc *inmem_tab_entry = 1266b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o (j == 0 1267b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o ? inmem_orig_sysdep_tab 1268b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o : inmem_trans_sysdep_tab) 1269b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o + k; 1270b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o 1271b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o if (W (domain->must_swap, p->sysdepref) 1272b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o == SEGMENTS_END) 1273b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o { 1274b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o /* Only one static segment. */ 1275b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o inmem_tab_entry->length = 1276b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o W (domain->must_swap, p->segsize); 1277b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o inmem_tab_entry->pointer = static_segments; 1278b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o } 1279b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o else 1280b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o { 1281b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o inmem_tab_entry->pointer = mem; 1282b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o 1283b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o for (p = sysdep_string->segments;; p++) 1284b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o { 1285b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o nls_uint32 segsize = 1286b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o W (domain->must_swap, p->segsize); 1287b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o nls_uint32 sysdepref = 1288b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o W (domain->must_swap, p->sysdepref); 1289b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o size_t n; 1290b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o 1291b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o if (segsize > 0) 1292b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o { 1293b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o memcpy (mem, static_segments, segsize); 1294b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o mem += segsize; 1295b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o static_segments += segsize; 1296b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o } 1297b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o 1298b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o if (sysdepref == SEGMENTS_END) 1299b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o break; 1300b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o 1301b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o n = strlen (sysdep_segment_values[sysdepref]); 1302b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o memcpy (mem, sysdep_segment_values[sysdepref], n); 1303b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o mem += n; 1304b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o } 1305b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o 1306b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o inmem_tab_entry->length = 1307b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o mem - inmem_tab_entry->pointer; 1308b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o } 1309a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 1310a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 1311b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o k++; 1312a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 1313a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 1314b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o if (k != n_inmem_sysdep_strings) 1315b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o abort (); 1316b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o 1317b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o /* Compute the augmented hash table. */ 1318b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o for (i = 0; i < domain->hash_size; i++) 1319b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o inmem_hash_tab[i] = 1320b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o W (domain->must_swap_hash_tab, domain->hash_tab[i]); 1321b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o for (i = 0; i < n_inmem_sysdep_strings; i++) 1322a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 1323b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o const char *msgid = inmem_orig_sysdep_tab[i].pointer; 1324b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o nls_uint32 hash_val = hash_string (msgid); 1325b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o nls_uint32 idx = hash_val % domain->hash_size; 1326b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o nls_uint32 incr = 1327b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o 1 + (hash_val % (domain->hash_size - 2)); 1328b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o 1329b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o for (;;) 1330a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 1331b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o if (inmem_hash_tab[idx] == 0) 1332b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o { 1333b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o /* Hash table entry is empty. Use it. */ 1334b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o inmem_hash_tab[idx] = 1 + domain->nstrings + i; 1335b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o break; 1336b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o } 1337a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 1338b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o if (idx >= domain->hash_size - incr) 1339b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o idx -= domain->hash_size - incr; 1340b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o else 1341b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o idx += incr; 1342b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o } 1343a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 1344a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 1345b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o domain->n_sysdep_strings = n_inmem_sysdep_strings; 1346b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o domain->orig_sysdep_tab = inmem_orig_sysdep_tab; 1347b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o domain->trans_sysdep_tab = inmem_trans_sysdep_tab; 1348a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 1349b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o domain->hash_tab = inmem_hash_tab; 1350b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o domain->must_swap_hash_tab = 0; 1351b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o } 1352b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o else 1353b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o { 1354b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o domain->n_sysdep_strings = 0; 1355b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o domain->orig_sysdep_tab = NULL; 1356b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o domain->trans_sysdep_tab = NULL; 1357b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o } 1358a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 1359b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o freea (sysdep_segment_values); 1360a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 1361a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o else 1362a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o { 1363a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o domain->n_sysdep_strings = 0; 1364a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o domain->orig_sysdep_tab = NULL; 1365a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o domain->trans_sysdep_tab = NULL; 1366a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 1367a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 1368a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o break; 1369a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o } 13705bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o break; 13715bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o default: 1372a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o /* This is an invalid revision. */ 1373a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o invalid: 1374a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o /* This is an invalid .mo file. */ 137545e338f5332a54295893dba2e32cc093d1316f60Jim Meyering free (domain->malloced); 1376a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#ifdef HAVE_MMAP 13775bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o if (use_mmap) 1378a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o munmap ((void *) data, size); 13795bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o else 13805bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o#endif 13815bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o free (data); 13825bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o free (domain); 13835bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o domain_file->data = NULL; 13845bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o return; 13855bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o } 13865bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 1387a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o /* Now initialize the character set converter from the character set 1388a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o the file is encoded with (found in the header entry) to the domain's 1389a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o specified character set or the locale's character set. */ 1390a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o nullentry = _nl_init_domain_conv (domain_file, domain, domainbinding); 1391a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 1392a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o /* Also look for a plural specification. */ 1393a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o EXTRACT_PLURAL_EXPRESSION (nullentry, &domain->plural, &domain->nplurals); 13945bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o} 13955bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 13965bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 13975bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o#ifdef _LIBC 13985bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'ovoid 13995bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'ointernal_function 1400b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o_nl_unload_domain (struct loaded_domain *domain) 14015bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o{ 1402a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o if (domain->plural != &__gettext_germanic_plural) 1403a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o __gettext_free_exp (domain->plural); 1404a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 1405a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o _nl_free_domain_conv (domain); 1406a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 140745e338f5332a54295893dba2e32cc093d1316f60Jim Meyering free (domain->malloced); 1408a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o 1409a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# ifdef _POSIX_MAPPED_FILES 14105bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o if (domain->use_mmap) 1411a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o munmap ((void *) domain->data, domain->mmap_size); 14125bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o else 1413a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# endif /* _POSIX_MAPPED_FILES */ 14145bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o free ((void *) domain->data); 14155bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o 14165bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o free (domain); 14175bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o} 14185bc5a89c2a5c07b0237c13d37d869c986b5435fbTheodore Ts'o#endif 1419