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