Blame intl/loadmsgcat.c

Packit Service 82fcde
/* Load needed message catalogs.
Packit Service 82fcde
   Copyright (C) 1995-2018 Free Software Foundation, Inc.
Packit Service 82fcde
Packit Service 82fcde
   This program is free software: you can redistribute it and/or modify
Packit Service 82fcde
   it under the terms of the GNU Lesser General Public License as published by
Packit Service 82fcde
   the Free Software Foundation; either version 2.1 of the License, or
Packit Service 82fcde
   (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   This program is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 82fcde
   GNU Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public License
Packit Service 82fcde
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
/* Tell glibc's <string.h> to provide a prototype for mempcpy().
Packit Service 82fcde
   This must come before <config.h> because <config.h> may include
Packit Service 82fcde
   <features.h>, and once <features.h> has been included, it's too late.  */
Packit Service 82fcde
#ifndef _GNU_SOURCE
Packit Service 82fcde
# define _GNU_SOURCE    1
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#ifdef HAVE_CONFIG_H
Packit Service 82fcde
# include <config.h>
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#include <assert.h>
Packit Service 82fcde
#include <ctype.h>
Packit Service 82fcde
#include <errno.h>
Packit Service 82fcde
#include <fcntl.h>
Packit Service 82fcde
#include <sys/types.h>
Packit Service 82fcde
#include <sys/stat.h>
Packit Service 82fcde
Packit Service 82fcde
#include <stdlib.h>
Packit Service 82fcde
#include <string.h>
Packit Service 82fcde
Packit Service 82fcde
#if defined HAVE_UNISTD_H || defined _LIBC
Packit Service 82fcde
# include <unistd.h>
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#ifdef _LIBC
Packit Service 82fcde
# include <langinfo.h>
Packit Service 82fcde
# include <locale.h>
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
Packit Service 82fcde
    || (defined _LIBC && defined _POSIX_MAPPED_FILES)
Packit Service 82fcde
# include <sys/mman.h>
Packit Service 82fcde
# undef HAVE_MMAP
Packit Service 82fcde
# define HAVE_MMAP	1
Packit Service 82fcde
#else
Packit Service 82fcde
# undef HAVE_MMAP
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#if defined HAVE_STDINT_H_WITH_UINTMAX || defined _LIBC
Packit Service 82fcde
# include <stdint.h>
Packit Service 82fcde
#endif
Packit Service 82fcde
#if defined HAVE_INTTYPES_H || defined _LIBC
Packit Service 82fcde
# include <inttypes.h>
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#include "gmo.h"
Packit Service 82fcde
#include "gettextP.h"
Packit Service 82fcde
#include "hash-string.h"
Packit Service 82fcde
#include "plural-exp.h"
Packit Service 82fcde
Packit Service 82fcde
#ifdef _LIBC
Packit Service 82fcde
# include "../locale/localeinfo.h"
Packit Service 82fcde
# include <not-cancel.h>
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* Handle multi-threaded applications.  */
Packit Service 82fcde
#ifdef _LIBC
Packit Service 82fcde
# include <libc-lock.h>
Packit Service 82fcde
#else
Packit Service 82fcde
# include "lock.h"
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#ifdef _LIBC
Packit Service 82fcde
# define PRI_MACROS_BROKEN 0
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* Provide fallback values for macros that ought to be defined in <inttypes.h>.
Packit Service 82fcde
   Note that our fallback values need not be literal strings, because we don't
Packit Service 82fcde
   use them with preprocessor string concatenation.  */
Packit Service 82fcde
#if !defined PRId8 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRId8
Packit Service 82fcde
# define PRId8 "d"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIi8 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIi8
Packit Service 82fcde
# define PRIi8 "i"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIo8 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIo8
Packit Service 82fcde
# define PRIo8 "o"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIu8 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIu8
Packit Service 82fcde
# define PRIu8 "u"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIx8 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIx8
Packit Service 82fcde
# define PRIx8 "x"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIX8 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIX8
Packit Service 82fcde
# define PRIX8 "X"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRId16 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRId16
Packit Service 82fcde
# define PRId16 "d"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIi16 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIi16
Packit Service 82fcde
# define PRIi16 "i"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIo16 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIo16
Packit Service 82fcde
# define PRIo16 "o"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIu16 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIu16
Packit Service 82fcde
# define PRIu16 "u"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIx16 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIx16
Packit Service 82fcde
# define PRIx16 "x"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIX16 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIX16
Packit Service 82fcde
# define PRIX16 "X"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRId32 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRId32
Packit Service 82fcde
# define PRId32 "d"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIi32 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIi32
Packit Service 82fcde
# define PRIi32 "i"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIo32 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIo32
Packit Service 82fcde
# define PRIo32 "o"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIu32 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIu32
Packit Service 82fcde
# define PRIu32 "u"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIx32 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIx32
Packit Service 82fcde
# define PRIx32 "x"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIX32 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIX32
Packit Service 82fcde
# define PRIX32 "X"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRId64 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRId64
Packit Service 82fcde
# define PRId64 (sizeof (long) == 8 ? "ld" : "lld")
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIi64 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIi64
Packit Service 82fcde
# define PRIi64 (sizeof (long) == 8 ? "li" : "lli")
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIo64 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIo64
Packit Service 82fcde
# define PRIo64 (sizeof (long) == 8 ? "lo" : "llo")
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIu64 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIu64
Packit Service 82fcde
# define PRIu64 (sizeof (long) == 8 ? "lu" : "llu")
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIx64 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIx64
Packit Service 82fcde
# define PRIx64 (sizeof (long) == 8 ? "lx" : "llx")
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIX64 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIX64
Packit Service 82fcde
# define PRIX64 (sizeof (long) == 8 ? "lX" : "llX")
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIdLEAST8 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIdLEAST8
Packit Service 82fcde
# define PRIdLEAST8 "d"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIiLEAST8 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIiLEAST8
Packit Service 82fcde
# define PRIiLEAST8 "i"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIoLEAST8 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIoLEAST8
Packit Service 82fcde
# define PRIoLEAST8 "o"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIuLEAST8 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIuLEAST8
Packit Service 82fcde
# define PRIuLEAST8 "u"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIxLEAST8 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIxLEAST8
Packit Service 82fcde
# define PRIxLEAST8 "x"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIXLEAST8 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIXLEAST8
Packit Service 82fcde
# define PRIXLEAST8 "X"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIdLEAST16 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIdLEAST16
Packit Service 82fcde
# define PRIdLEAST16 "d"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIiLEAST16 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIiLEAST16
Packit Service 82fcde
# define PRIiLEAST16 "i"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIoLEAST16 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIoLEAST16
Packit Service 82fcde
# define PRIoLEAST16 "o"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIuLEAST16 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIuLEAST16
Packit Service 82fcde
# define PRIuLEAST16 "u"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIxLEAST16 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIxLEAST16
Packit Service 82fcde
# define PRIxLEAST16 "x"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIXLEAST16 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIXLEAST16
Packit Service 82fcde
# define PRIXLEAST16 "X"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIdLEAST32 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIdLEAST32
Packit Service 82fcde
# define PRIdLEAST32 "d"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIiLEAST32 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIiLEAST32
Packit Service 82fcde
# define PRIiLEAST32 "i"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIoLEAST32 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIoLEAST32
Packit Service 82fcde
# define PRIoLEAST32 "o"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIuLEAST32 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIuLEAST32
Packit Service 82fcde
# define PRIuLEAST32 "u"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIxLEAST32 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIxLEAST32
Packit Service 82fcde
# define PRIxLEAST32 "x"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIXLEAST32 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIXLEAST32
Packit Service 82fcde
# define PRIXLEAST32 "X"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIdLEAST64 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIdLEAST64
Packit Service 82fcde
# define PRIdLEAST64 PRId64
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIiLEAST64 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIiLEAST64
Packit Service 82fcde
# define PRIiLEAST64 PRIi64
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIoLEAST64 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIoLEAST64
Packit Service 82fcde
# define PRIoLEAST64 PRIo64
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIuLEAST64 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIuLEAST64
Packit Service 82fcde
# define PRIuLEAST64 PRIu64
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIxLEAST64 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIxLEAST64
Packit Service 82fcde
# define PRIxLEAST64 PRIx64
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIXLEAST64 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIXLEAST64
Packit Service 82fcde
# define PRIXLEAST64 PRIX64
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIdFAST8 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIdFAST8
Packit Service 82fcde
# define PRIdFAST8 "d"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIiFAST8 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIiFAST8
Packit Service 82fcde
# define PRIiFAST8 "i"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIoFAST8 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIoFAST8
Packit Service 82fcde
# define PRIoFAST8 "o"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIuFAST8 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIuFAST8
Packit Service 82fcde
# define PRIuFAST8 "u"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIxFAST8 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIxFAST8
Packit Service 82fcde
# define PRIxFAST8 "x"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIXFAST8 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIXFAST8
Packit Service 82fcde
# define PRIXFAST8 "X"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIdFAST16 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIdFAST16
Packit Service 82fcde
# define PRIdFAST16 "d"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIiFAST16 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIiFAST16
Packit Service 82fcde
# define PRIiFAST16 "i"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIoFAST16 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIoFAST16
Packit Service 82fcde
# define PRIoFAST16 "o"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIuFAST16 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIuFAST16
Packit Service 82fcde
# define PRIuFAST16 "u"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIxFAST16 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIxFAST16
Packit Service 82fcde
# define PRIxFAST16 "x"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIXFAST16 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIXFAST16
Packit Service 82fcde
# define PRIXFAST16 "X"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIdFAST32 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIdFAST32
Packit Service 82fcde
# define PRIdFAST32 "d"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIiFAST32 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIiFAST32
Packit Service 82fcde
# define PRIiFAST32 "i"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIoFAST32 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIoFAST32
Packit Service 82fcde
# define PRIoFAST32 "o"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIuFAST32 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIuFAST32
Packit Service 82fcde
# define PRIuFAST32 "u"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIxFAST32 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIxFAST32
Packit Service 82fcde
# define PRIxFAST32 "x"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIXFAST32 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIXFAST32
Packit Service 82fcde
# define PRIXFAST32 "X"
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIdFAST64 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIdFAST64
Packit Service 82fcde
# define PRIdFAST64 PRId64
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIiFAST64 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIiFAST64
Packit Service 82fcde
# define PRIiFAST64 PRIi64
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIoFAST64 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIoFAST64
Packit Service 82fcde
# define PRIoFAST64 PRIo64
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIuFAST64 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIuFAST64
Packit Service 82fcde
# define PRIuFAST64 PRIu64
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIxFAST64 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIxFAST64
Packit Service 82fcde
# define PRIxFAST64 PRIx64
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIXFAST64 || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIXFAST64
Packit Service 82fcde
# define PRIXFAST64 PRIX64
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIdMAX || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIdMAX
Packit Service 82fcde
# define PRIdMAX (sizeof (uintmax_t) == sizeof (long) ? "ld" : "lld")
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIiMAX || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIiMAX
Packit Service 82fcde
# define PRIiMAX (sizeof (uintmax_t) == sizeof (long) ? "li" : "lli")
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIoMAX || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIoMAX
Packit Service 82fcde
# define PRIoMAX (sizeof (uintmax_t) == sizeof (long) ? "lo" : "llo")
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIuMAX || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIuMAX
Packit Service 82fcde
# define PRIuMAX (sizeof (uintmax_t) == sizeof (long) ? "lu" : "llu")
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIxMAX || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIxMAX
Packit Service 82fcde
# define PRIxMAX (sizeof (uintmax_t) == sizeof (long) ? "lx" : "llx")
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIXMAX || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIXMAX
Packit Service 82fcde
# define PRIXMAX (sizeof (uintmax_t) == sizeof (long) ? "lX" : "llX")
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIdPTR || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIdPTR
Packit Service 82fcde
# define PRIdPTR \
Packit Service 82fcde
  (sizeof (void *) == sizeof (long) ? "ld" : \
Packit Service 82fcde
   sizeof (void *) == sizeof (int) ? "d" : \
Packit Service 82fcde
   "lld")
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIiPTR || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIiPTR
Packit Service 82fcde
# define PRIiPTR \
Packit Service 82fcde
  (sizeof (void *) == sizeof (long) ? "li" : \
Packit Service 82fcde
   sizeof (void *) == sizeof (int) ? "i" : \
Packit Service 82fcde
   "lli")
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIoPTR || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIoPTR
Packit Service 82fcde
# define PRIoPTR \
Packit Service 82fcde
  (sizeof (void *) == sizeof (long) ? "lo" : \
Packit Service 82fcde
   sizeof (void *) == sizeof (int) ? "o" : \
Packit Service 82fcde
   "llo")
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIuPTR || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIuPTR
Packit Service 82fcde
# define PRIuPTR \
Packit Service 82fcde
  (sizeof (void *) == sizeof (long) ? "lu" : \
Packit Service 82fcde
   sizeof (void *) == sizeof (int) ? "u" : \
Packit Service 82fcde
   "llu")
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIxPTR || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIxPTR
Packit Service 82fcde
# define PRIxPTR \
Packit Service 82fcde
  (sizeof (void *) == sizeof (long) ? "lx" : \
Packit Service 82fcde
   sizeof (void *) == sizeof (int) ? "x" : \
Packit Service 82fcde
   "llx")
Packit Service 82fcde
#endif
Packit Service 82fcde
#if !defined PRIXPTR || PRI_MACROS_BROKEN
Packit Service 82fcde
# undef PRIXPTR
Packit Service 82fcde
# define PRIXPTR \
Packit Service 82fcde
  (sizeof (void *) == sizeof (long) ? "lX" : \
Packit Service 82fcde
   sizeof (void *) == sizeof (int) ? "X" : \
Packit Service 82fcde
   "llX")
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* @@ end of prolog @@ */
Packit Service 82fcde
Packit Service 82fcde
#ifdef _LIBC
Packit Service 82fcde
/* Rename the non ISO C functions.  This is required by the standard
Packit Service 82fcde
   because some ISO C functions will require linking with this object
Packit Service 82fcde
   file and the name space must not be polluted.  */
Packit Service 82fcde
# define open(name, flags)	__open_nocancel (name, flags)
Packit Service 82fcde
# define close(fd)		__close_nocancel_nostatus (fd)
Packit Service 82fcde
# define read(fd, buf, n)	__read_nocancel (fd, buf, n)
Packit Service 82fcde
# define mmap(addr, len, prot, flags, fd, offset) \
Packit Service 82fcde
  __mmap (addr, len, prot, flags, fd, offset)
Packit Service 82fcde
# define munmap(addr, len)	__munmap (addr, len)
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* For systems that distinguish between text and binary I/O.
Packit Service 82fcde
   O_BINARY is usually declared in <fcntl.h>. */
Packit Service 82fcde
#if !defined O_BINARY && defined _O_BINARY
Packit Service 82fcde
  /* For MSC-compatible compilers.  */
Packit Service 82fcde
# define O_BINARY _O_BINARY
Packit Service 82fcde
# define O_TEXT _O_TEXT
Packit Service 82fcde
#endif
Packit Service 82fcde
#ifdef __BEOS__
Packit Service 82fcde
  /* BeOS 5 has O_BINARY and O_TEXT, but they have no effect.  */
Packit Service 82fcde
# undef O_BINARY
Packit Service 82fcde
# undef O_TEXT
Packit Service 82fcde
#endif
Packit Service 82fcde
/* On reasonable systems, binary I/O is the default.  */
Packit Service 82fcde
#ifndef O_BINARY
Packit Service 82fcde
# define O_BINARY 0
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* We need a sign, whether a new catalog was loaded, which can be associated
Packit Service 82fcde
   with all translations.  This is important if the translations are
Packit Service 82fcde
   cached by one of GCC's features.  */
Packit Service 82fcde
int _nl_msg_cat_cntr;
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Expand a system dependent string segment.  Return NULL if unsupported.  */
Packit Service 82fcde
static const char *
Packit Service 82fcde
get_sysdep_segment_value (const char *name)
Packit Service 82fcde
{
Packit Service 82fcde
  /* Test for an ISO C 99 section 7.8.1 format string directive.
Packit Service 82fcde
     Syntax:
Packit Service 82fcde
     P R I { d | i | o | u | x | X }
Packit Service 82fcde
     { { | LEAST | FAST } { 8 | 16 | 32 | 64 } | MAX | PTR }  */
Packit Service 82fcde
  /* We don't use a table of 14 times 6 'const char *' strings here, because
Packit Service 82fcde
     data relocations cost startup time.  */
Packit Service 82fcde
  if (name[0] == 'P' && name[1] == 'R' && name[2] == 'I')
Packit Service 82fcde
    {
Packit Service 82fcde
      if (name[3] == 'd' || name[3] == 'i' || name[3] == 'o' || name[3] == 'u'
Packit Service 82fcde
	  || name[3] == 'x' || name[3] == 'X')
Packit Service 82fcde
	{
Packit Service 82fcde
	  if (name[4] == '8' && name[5] == '\0')
Packit Service 82fcde
	    {
Packit Service 82fcde
	      if (name[3] == 'd')
Packit Service 82fcde
		return PRId8;
Packit Service 82fcde
	      if (name[3] == 'i')
Packit Service 82fcde
		return PRIi8;
Packit Service 82fcde
	      if (name[3] == 'o')
Packit Service 82fcde
		return PRIo8;
Packit Service 82fcde
	      if (name[3] == 'u')
Packit Service 82fcde
		return PRIu8;
Packit Service 82fcde
	      if (name[3] == 'x')
Packit Service 82fcde
		return PRIx8;
Packit Service 82fcde
	      if (name[3] == 'X')
Packit Service 82fcde
		return PRIX8;
Packit Service 82fcde
	      abort ();
Packit Service 82fcde
	    }
Packit Service 82fcde
	  if (name[4] == '1' && name[5] == '6' && name[6] == '\0')
Packit Service 82fcde
	    {
Packit Service 82fcde
	      if (name[3] == 'd')
Packit Service 82fcde
		return PRId16;
Packit Service 82fcde
	      if (name[3] == 'i')
Packit Service 82fcde
		return PRIi16;
Packit Service 82fcde
	      if (name[3] == 'o')
Packit Service 82fcde
		return PRIo16;
Packit Service 82fcde
	      if (name[3] == 'u')
Packit Service 82fcde
		return PRIu16;
Packit Service 82fcde
	      if (name[3] == 'x')
Packit Service 82fcde
		return PRIx16;
Packit Service 82fcde
	      if (name[3] == 'X')
Packit Service 82fcde
		return PRIX16;
Packit Service 82fcde
	      abort ();
Packit Service 82fcde
	    }
Packit Service 82fcde
	  if (name[4] == '3' && name[5] == '2' && name[6] == '\0')
Packit Service 82fcde
	    {
Packit Service 82fcde
	      if (name[3] == 'd')
Packit Service 82fcde
		return PRId32;
Packit Service 82fcde
	      if (name[3] == 'i')
Packit Service 82fcde
		return PRIi32;
Packit Service 82fcde
	      if (name[3] == 'o')
Packit Service 82fcde
		return PRIo32;
Packit Service 82fcde
	      if (name[3] == 'u')
Packit Service 82fcde
		return PRIu32;
Packit Service 82fcde
	      if (name[3] == 'x')
Packit Service 82fcde
		return PRIx32;
Packit Service 82fcde
	      if (name[3] == 'X')
Packit Service 82fcde
		return PRIX32;
Packit Service 82fcde
	      abort ();
Packit Service 82fcde
	    }
Packit Service 82fcde
	  if (name[4] == '6' && name[5] == '4' && name[6] == '\0')
Packit Service 82fcde
	    {
Packit Service 82fcde
	      if (name[3] == 'd')
Packit Service 82fcde
		return PRId64;
Packit Service 82fcde
	      if (name[3] == 'i')
Packit Service 82fcde
		return PRIi64;
Packit Service 82fcde
	      if (name[3] == 'o')
Packit Service 82fcde
		return PRIo64;
Packit Service 82fcde
	      if (name[3] == 'u')
Packit Service 82fcde
		return PRIu64;
Packit Service 82fcde
	      if (name[3] == 'x')
Packit Service 82fcde
		return PRIx64;
Packit Service 82fcde
	      if (name[3] == 'X')
Packit Service 82fcde
		return PRIX64;
Packit Service 82fcde
	      abort ();
Packit Service 82fcde
	    }
Packit Service 82fcde
	  if (name[4] == 'L' && name[5] == 'E' && name[6] == 'A'
Packit Service 82fcde
	      && name[7] == 'S' && name[8] == 'T')
Packit Service 82fcde
	    {
Packit Service 82fcde
	      if (name[9] == '8' && name[10] == '\0')
Packit Service 82fcde
		{
Packit Service 82fcde
		  if (name[3] == 'd')
Packit Service 82fcde
		    return PRIdLEAST8;
Packit Service 82fcde
		  if (name[3] == 'i')
Packit Service 82fcde
		    return PRIiLEAST8;
Packit Service 82fcde
		  if (name[3] == 'o')
Packit Service 82fcde
		    return PRIoLEAST8;
Packit Service 82fcde
		  if (name[3] == 'u')
Packit Service 82fcde
		    return PRIuLEAST8;
Packit Service 82fcde
		  if (name[3] == 'x')
Packit Service 82fcde
		    return PRIxLEAST8;
Packit Service 82fcde
		  if (name[3] == 'X')
Packit Service 82fcde
		    return PRIXLEAST8;
Packit Service 82fcde
		  abort ();
Packit Service 82fcde
		}
Packit Service 82fcde
	      if (name[9] == '1' && name[10] == '6' && name[11] == '\0')
Packit Service 82fcde
		{
Packit Service 82fcde
		  if (name[3] == 'd')
Packit Service 82fcde
		    return PRIdLEAST16;
Packit Service 82fcde
		  if (name[3] == 'i')
Packit Service 82fcde
		    return PRIiLEAST16;
Packit Service 82fcde
		  if (name[3] == 'o')
Packit Service 82fcde
		    return PRIoLEAST16;
Packit Service 82fcde
		  if (name[3] == 'u')
Packit Service 82fcde
		    return PRIuLEAST16;
Packit Service 82fcde
		  if (name[3] == 'x')
Packit Service 82fcde
		    return PRIxLEAST16;
Packit Service 82fcde
		  if (name[3] == 'X')
Packit Service 82fcde
		    return PRIXLEAST16;
Packit Service 82fcde
		  abort ();
Packit Service 82fcde
		}
Packit Service 82fcde
	      if (name[9] == '3' && name[10] == '2' && name[11] == '\0')
Packit Service 82fcde
		{
Packit Service 82fcde
		  if (name[3] == 'd')
Packit Service 82fcde
		    return PRIdLEAST32;
Packit Service 82fcde
		  if (name[3] == 'i')
Packit Service 82fcde
		    return PRIiLEAST32;
Packit Service 82fcde
		  if (name[3] == 'o')
Packit Service 82fcde
		    return PRIoLEAST32;
Packit Service 82fcde
		  if (name[3] == 'u')
Packit Service 82fcde
		    return PRIuLEAST32;
Packit Service 82fcde
		  if (name[3] == 'x')
Packit Service 82fcde
		    return PRIxLEAST32;
Packit Service 82fcde
		  if (name[3] == 'X')
Packit Service 82fcde
		    return PRIXLEAST32;
Packit Service 82fcde
		  abort ();
Packit Service 82fcde
		}
Packit Service 82fcde
	      if (name[9] == '6' && name[10] == '4' && name[11] == '\0')
Packit Service 82fcde
		{
Packit Service 82fcde
		  if (name[3] == 'd')
Packit Service 82fcde
		    return PRIdLEAST64;
Packit Service 82fcde
		  if (name[3] == 'i')
Packit Service 82fcde
		    return PRIiLEAST64;
Packit Service 82fcde
		  if (name[3] == 'o')
Packit Service 82fcde
		    return PRIoLEAST64;
Packit Service 82fcde
		  if (name[3] == 'u')
Packit Service 82fcde
		    return PRIuLEAST64;
Packit Service 82fcde
		  if (name[3] == 'x')
Packit Service 82fcde
		    return PRIxLEAST64;
Packit Service 82fcde
		  if (name[3] == 'X')
Packit Service 82fcde
		    return PRIXLEAST64;
Packit Service 82fcde
		  abort ();
Packit Service 82fcde
		}
Packit Service 82fcde
	    }
Packit Service 82fcde
	  if (name[4] == 'F' && name[5] == 'A' && name[6] == 'S'
Packit Service 82fcde
	      && name[7] == 'T')
Packit Service 82fcde
	    {
Packit Service 82fcde
	      if (name[8] == '8' && name[9] == '\0')
Packit Service 82fcde
		{
Packit Service 82fcde
		  if (name[3] == 'd')
Packit Service 82fcde
		    return PRIdFAST8;
Packit Service 82fcde
		  if (name[3] == 'i')
Packit Service 82fcde
		    return PRIiFAST8;
Packit Service 82fcde
		  if (name[3] == 'o')
Packit Service 82fcde
		    return PRIoFAST8;
Packit Service 82fcde
		  if (name[3] == 'u')
Packit Service 82fcde
		    return PRIuFAST8;
Packit Service 82fcde
		  if (name[3] == 'x')
Packit Service 82fcde
		    return PRIxFAST8;
Packit Service 82fcde
		  if (name[3] == 'X')
Packit Service 82fcde
		    return PRIXFAST8;
Packit Service 82fcde
		  abort ();
Packit Service 82fcde
		}
Packit Service 82fcde
	      if (name[8] == '1' && name[9] == '6' && name[10] == '\0')
Packit Service 82fcde
		{
Packit Service 82fcde
		  if (name[3] == 'd')
Packit Service 82fcde
		    return PRIdFAST16;
Packit Service 82fcde
		  if (name[3] == 'i')
Packit Service 82fcde
		    return PRIiFAST16;
Packit Service 82fcde
		  if (name[3] == 'o')
Packit Service 82fcde
		    return PRIoFAST16;
Packit Service 82fcde
		  if (name[3] == 'u')
Packit Service 82fcde
		    return PRIuFAST16;
Packit Service 82fcde
		  if (name[3] == 'x')
Packit Service 82fcde
		    return PRIxFAST16;
Packit Service 82fcde
		  if (name[3] == 'X')
Packit Service 82fcde
		    return PRIXFAST16;
Packit Service 82fcde
		  abort ();
Packit Service 82fcde
		}
Packit Service 82fcde
	      if (name[8] == '3' && name[9] == '2' && name[10] == '\0')
Packit Service 82fcde
		{
Packit Service 82fcde
		  if (name[3] == 'd')
Packit Service 82fcde
		    return PRIdFAST32;
Packit Service 82fcde
		  if (name[3] == 'i')
Packit Service 82fcde
		    return PRIiFAST32;
Packit Service 82fcde
		  if (name[3] == 'o')
Packit Service 82fcde
		    return PRIoFAST32;
Packit Service 82fcde
		  if (name[3] == 'u')
Packit Service 82fcde
		    return PRIuFAST32;
Packit Service 82fcde
		  if (name[3] == 'x')
Packit Service 82fcde
		    return PRIxFAST32;
Packit Service 82fcde
		  if (name[3] == 'X')
Packit Service 82fcde
		    return PRIXFAST32;
Packit Service 82fcde
		  abort ();
Packit Service 82fcde
		}
Packit Service 82fcde
	      if (name[8] == '6' && name[9] == '4' && name[10] == '\0')
Packit Service 82fcde
		{
Packit Service 82fcde
		  if (name[3] == 'd')
Packit Service 82fcde
		    return PRIdFAST64;
Packit Service 82fcde
		  if (name[3] == 'i')
Packit Service 82fcde
		    return PRIiFAST64;
Packit Service 82fcde
		  if (name[3] == 'o')
Packit Service 82fcde
		    return PRIoFAST64;
Packit Service 82fcde
		  if (name[3] == 'u')
Packit Service 82fcde
		    return PRIuFAST64;
Packit Service 82fcde
		  if (name[3] == 'x')
Packit Service 82fcde
		    return PRIxFAST64;
Packit Service 82fcde
		  if (name[3] == 'X')
Packit Service 82fcde
		    return PRIXFAST64;
Packit Service 82fcde
		  abort ();
Packit Service 82fcde
		}
Packit Service 82fcde
	    }
Packit Service 82fcde
	  if (name[4] == 'M' && name[5] == 'A' && name[6] == 'X'
Packit Service 82fcde
	      && name[7] == '\0')
Packit Service 82fcde
	    {
Packit Service 82fcde
	      if (name[3] == 'd')
Packit Service 82fcde
		return PRIdMAX;
Packit Service 82fcde
	      if (name[3] == 'i')
Packit Service 82fcde
		return PRIiMAX;
Packit Service 82fcde
	      if (name[3] == 'o')
Packit Service 82fcde
		return PRIoMAX;
Packit Service 82fcde
	      if (name[3] == 'u')
Packit Service 82fcde
		return PRIuMAX;
Packit Service 82fcde
	      if (name[3] == 'x')
Packit Service 82fcde
		return PRIxMAX;
Packit Service 82fcde
	      if (name[3] == 'X')
Packit Service 82fcde
		return PRIXMAX;
Packit Service 82fcde
	      abort ();
Packit Service 82fcde
	    }
Packit Service 82fcde
	  if (name[4] == 'P' && name[5] == 'T' && name[6] == 'R'
Packit Service 82fcde
	      && name[7] == '\0')
Packit Service 82fcde
	    {
Packit Service 82fcde
	      if (name[3] == 'd')
Packit Service 82fcde
		return PRIdPTR;
Packit Service 82fcde
	      if (name[3] == 'i')
Packit Service 82fcde
		return PRIiPTR;
Packit Service 82fcde
	      if (name[3] == 'o')
Packit Service 82fcde
		return PRIoPTR;
Packit Service 82fcde
	      if (name[3] == 'u')
Packit Service 82fcde
		return PRIuPTR;
Packit Service 82fcde
	      if (name[3] == 'x')
Packit Service 82fcde
		return PRIxPTR;
Packit Service 82fcde
	      if (name[3] == 'X')
Packit Service 82fcde
		return PRIXPTR;
Packit Service 82fcde
	      abort ();
Packit Service 82fcde
	    }
Packit Service 82fcde
	}
Packit Service 82fcde
    }
Packit Service 82fcde
  /* Test for a glibc specific printf() format directive flag.  */
Packit Service 82fcde
  if (name[0] == 'I' && name[1] == '\0')
Packit Service 82fcde
    {
Packit Service 82fcde
#if defined _LIBC \
Packit Service 82fcde
    || ((__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)) \
Packit Service 82fcde
        && !defined __UCLIBC__)
Packit Service 82fcde
      /* The 'I' flag, in numeric format directives, replaces ASCII digits
Packit Service 82fcde
	 with the 'outdigits' defined in the LC_CTYPE locale facet.  This is
Packit Service 82fcde
	 used for Farsi (Persian), some Indic languages, and maybe Arabic.  */
Packit Service 82fcde
      return "I";
Packit Service 82fcde
#else
Packit Service 82fcde
      return "";
Packit Service 82fcde
#endif
Packit Service 82fcde
    }
Packit Service 82fcde
  /* Other system dependent strings are not valid.  */
Packit Service 82fcde
  return NULL;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
/* Load the message catalogs specified by FILENAME.  If it is no valid
Packit Service 82fcde
   message catalog do nothing.  */
Packit Service 82fcde
void
Packit Service 82fcde
_nl_load_domain (struct loaded_l10nfile *domain_file,
Packit Service 82fcde
		 struct binding *domainbinding)
Packit Service 82fcde
{
Packit Service 82fcde
  __libc_lock_define_initialized_recursive (static, lock);
Packit Service 82fcde
  int fd = -1;
Packit Service 82fcde
  size_t size;
Packit Service 82fcde
#ifdef _LIBC
Packit Service 82fcde
  struct stat64 st;
Packit Service 82fcde
#else
Packit Service 82fcde
  struct stat st;
Packit Service 82fcde
#endif
Packit Service 82fcde
  struct mo_file_header *data = (struct mo_file_header *) -1;
Packit Service 82fcde
  int use_mmap = 0;
Packit Service 82fcde
  struct loaded_domain *domain;
Packit Service 82fcde
  int revision;
Packit Service 82fcde
  const char *nullentry;
Packit Service 82fcde
  size_t nullentrylen;
Packit Service 82fcde
Packit Service 82fcde
  __libc_lock_lock_recursive (lock);
Packit Service 82fcde
  if (domain_file->decided != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      /* There are two possibilities:
Packit Service 82fcde
Packit Service 82fcde
	 + this is the same thread calling again during this initialization
Packit Service 82fcde
	   via _nl_find_msg.  We have initialized everything this call needs.
Packit Service 82fcde
Packit Service 82fcde
	 + this is another thread which tried to initialize this object.
Packit Service 82fcde
	   Not necessary anymore since if the lock is available this
Packit Service 82fcde
	   is finished.
Packit Service 82fcde
      */
Packit Service 82fcde
      goto done;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  domain_file->decided = -1;
Packit Service 82fcde
  domain_file->data = NULL;
Packit Service 82fcde
Packit Service 82fcde
  /* Note that it would be useless to store domainbinding in domain_file
Packit Service 82fcde
     because domainbinding might be == NULL now but != NULL later (after
Packit Service 82fcde
     a call to bind_textdomain_codeset).  */
Packit Service 82fcde
Packit Service 82fcde
  /* If the record does not represent a valid locale the FILENAME
Packit Service 82fcde
     might be NULL.  This can happen when according to the given
Packit Service 82fcde
     specification the locale file name is different for XPG and CEN
Packit Service 82fcde
     syntax.  */
Packit Service 82fcde
  if (domain_file->filename == NULL)
Packit Service 82fcde
    goto out;
Packit Service 82fcde
Packit Service 82fcde
  /* Try to open the addressed file.  */
Packit Service 82fcde
  fd = open (domain_file->filename, O_RDONLY | O_BINARY);
Packit Service 82fcde
  if (fd == -1)
Packit Service 82fcde
    goto out;
Packit Service 82fcde
Packit Service 82fcde
  /* We must know about the size of the file.  */
Packit Service 82fcde
  if (
Packit Service 82fcde
#ifdef _LIBC
Packit Service 82fcde
      __builtin_expect (fstat64 (fd, &st) != 0, 0)
Packit Service 82fcde
#else
Packit Service 82fcde
      __builtin_expect (fstat (fd, &st) != 0, 0)
Packit Service 82fcde
#endif
Packit Service 82fcde
      || __builtin_expect ((size = (size_t) st.st_size) != st.st_size, 0)
Packit Service 82fcde
      || __builtin_expect (size < sizeof (struct mo_file_header), 0))
Packit Service 82fcde
    /* Something went wrong.  */
Packit Service 82fcde
    goto out;
Packit Service 82fcde
Packit Service 82fcde
#ifdef HAVE_MMAP
Packit Service 82fcde
  /* Now we are ready to load the file.  If mmap() is available we try
Packit Service 82fcde
     this first.  If not available or it failed we try to load it.  */
Packit Service 82fcde
  data = (struct mo_file_header *) mmap (NULL, size, PROT_READ,
Packit Service 82fcde
					 MAP_PRIVATE, fd, 0);
Packit Service 82fcde
Packit Service 82fcde
  if (__builtin_expect (data != MAP_FAILED, 1))
Packit Service 82fcde
    {
Packit Service 82fcde
      /* mmap() call was successful.  */
Packit Service 82fcde
      close (fd);
Packit Service 82fcde
      fd = -1;
Packit Service 82fcde
      use_mmap = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  assert (MAP_FAILED == (void *) -1);
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
  /* If the data is not yet available (i.e. mmap'ed) we try to load
Packit Service 82fcde
     it manually.  */
Packit Service 82fcde
  if (data == (struct mo_file_header *) -1)
Packit Service 82fcde
    {
Packit Service 82fcde
      size_t to_read;
Packit Service 82fcde
      char *read_ptr;
Packit Service 82fcde
Packit Service 82fcde
      data = (struct mo_file_header *) malloc (size);
Packit Service 82fcde
      if (data == NULL)
Packit Service 82fcde
	goto out;
Packit Service 82fcde
Packit Service 82fcde
      to_read = size;
Packit Service 82fcde
      read_ptr = (char *) data;
Packit Service 82fcde
      do
Packit Service 82fcde
	{
Packit Service 82fcde
	  long int nb = (long int) read (fd, read_ptr, to_read);
Packit Service 82fcde
	  if (nb <= 0)
Packit Service 82fcde
	    {
Packit Service 82fcde
#ifdef EINTR
Packit Service 82fcde
	      if (nb == -1 && errno == EINTR)
Packit Service 82fcde
		continue;
Packit Service 82fcde
#endif
Packit Service 82fcde
	      goto out;
Packit Service 82fcde
	    }
Packit Service 82fcde
	  read_ptr += nb;
Packit Service 82fcde
	  to_read -= nb;
Packit Service 82fcde
	}
Packit Service 82fcde
      while (to_read > 0);
Packit Service 82fcde
Packit Service 82fcde
      close (fd);
Packit Service 82fcde
      fd = -1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* Using the magic number we can test whether it really is a message
Packit Service 82fcde
     catalog file.  */
Packit Service 82fcde
  if (__builtin_expect (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED,
Packit Service 82fcde
			0))
Packit Service 82fcde
    {
Packit Service 82fcde
      /* The magic number is wrong: not a message catalog file.  */
Packit Service 82fcde
#ifdef HAVE_MMAP
Packit Service 82fcde
      if (use_mmap)
Packit Service 82fcde
	munmap ((caddr_t) data, size);
Packit Service 82fcde
      else
Packit Service 82fcde
#endif
Packit Service 82fcde
	free (data);
Packit Service 82fcde
      goto out;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  domain = (struct loaded_domain *) malloc (sizeof (struct loaded_domain));
Packit Service 82fcde
  if (domain == NULL)
Packit Service 82fcde
    goto out;
Packit Service 82fcde
  domain_file->data = domain;
Packit Service 82fcde
Packit Service 82fcde
  domain->data = (char *) data;
Packit Service 82fcde
  domain->use_mmap = use_mmap;
Packit Service 82fcde
  domain->mmap_size = size;
Packit Service 82fcde
  domain->must_swap = data->magic != _MAGIC;
Packit Service 82fcde
  domain->malloced = NULL;
Packit Service 82fcde
Packit Service 82fcde
  /* Fill in the information about the available tables.  */
Packit Service 82fcde
  revision = W (domain->must_swap, data->revision);
Packit Service 82fcde
  /* We support only the major revisions 0 and 1.  */
Packit Service 82fcde
  switch (revision >> 16)
Packit Service 82fcde
    {
Packit Service 82fcde
    case 0:
Packit Service 82fcde
    case 1:
Packit Service 82fcde
      domain->nstrings = W (domain->must_swap, data->nstrings);
Packit Service 82fcde
      domain->orig_tab = (const struct string_desc *)
Packit Service 82fcde
	((char *) data + W (domain->must_swap, data->orig_tab_offset));
Packit Service 82fcde
      domain->trans_tab = (const struct string_desc *)
Packit Service 82fcde
	((char *) data + W (domain->must_swap, data->trans_tab_offset));
Packit Service 82fcde
      domain->hash_size = W (domain->must_swap, data->hash_tab_size);
Packit Service 82fcde
      domain->hash_tab =
Packit Service 82fcde
	(domain->hash_size > 2
Packit Service 82fcde
	 ? (const nls_uint32 *)
Packit Service 82fcde
	   ((char *) data + W (domain->must_swap, data->hash_tab_offset))
Packit Service 82fcde
	 : NULL);
Packit Service 82fcde
      domain->must_swap_hash_tab = domain->must_swap;
Packit Service 82fcde
Packit Service 82fcde
      /* Now dispatch on the minor revision.  */
Packit Service 82fcde
      switch (revision & 0xffff)
Packit Service 82fcde
	{
Packit Service 82fcde
	case 0:
Packit Service 82fcde
	  domain->n_sysdep_strings = 0;
Packit Service 82fcde
	  domain->orig_sysdep_tab = NULL;
Packit Service 82fcde
	  domain->trans_sysdep_tab = NULL;
Packit Service 82fcde
	  break;
Packit Service 82fcde
	case 1:
Packit Service 82fcde
	default:
Packit Service 82fcde
	  {
Packit Service 82fcde
	    nls_uint32 n_sysdep_strings;
Packit Service 82fcde
Packit Service 82fcde
	    if (domain->hash_tab == NULL)
Packit Service 82fcde
	      /* This is invalid.  These minor revisions need a hash table.  */
Packit Service 82fcde
	      goto invalid;
Packit Service 82fcde
Packit Service 82fcde
	    n_sysdep_strings =
Packit Service 82fcde
	      W (domain->must_swap, data->n_sysdep_strings);
Packit Service 82fcde
	    if (n_sysdep_strings > 0)
Packit Service 82fcde
	      {
Packit Service 82fcde
		nls_uint32 n_sysdep_segments;
Packit Service 82fcde
		const struct sysdep_segment *sysdep_segments;
Packit Service 82fcde
		const char **sysdep_segment_values;
Packit Service 82fcde
		const nls_uint32 *orig_sysdep_tab;
Packit Service 82fcde
		const nls_uint32 *trans_sysdep_tab;
Packit Service 82fcde
		nls_uint32 n_inmem_sysdep_strings;
Packit Service 82fcde
		size_t memneed;
Packit Service 82fcde
		char *mem;
Packit Service 82fcde
		struct sysdep_string_desc *inmem_orig_sysdep_tab;
Packit Service 82fcde
		struct sysdep_string_desc *inmem_trans_sysdep_tab;
Packit Service 82fcde
		nls_uint32 *inmem_hash_tab;
Packit Service 82fcde
		unsigned int i, j;
Packit Service 82fcde
Packit Service 82fcde
		/* Get the values of the system dependent segments.  */
Packit Service 82fcde
		n_sysdep_segments =
Packit Service 82fcde
		  W (domain->must_swap, data->n_sysdep_segments);
Packit Service 82fcde
		sysdep_segments = (const struct sysdep_segment *)
Packit Service 82fcde
		  ((char *) data
Packit Service 82fcde
		   + W (domain->must_swap, data->sysdep_segments_offset));
Packit Service 82fcde
		sysdep_segment_values = calloc
Packit Service 82fcde
		  (n_sysdep_segments, sizeof (const char *));
Packit Service 82fcde
		if (sysdep_segment_values == NULL)
Packit Service 82fcde
		  goto invalid;
Packit Service 82fcde
		for (i = 0; i < n_sysdep_segments; i++)
Packit Service 82fcde
		  {
Packit Service 82fcde
		    const char *name =
Packit Service 82fcde
		      (char *) data
Packit Service 82fcde
		      + W (domain->must_swap, sysdep_segments[i].offset);
Packit Service 82fcde
		    nls_uint32 namelen =
Packit Service 82fcde
		      W (domain->must_swap, sysdep_segments[i].length);
Packit Service 82fcde
Packit Service 82fcde
		    if (!(namelen > 0 && name[namelen - 1] == '\0'))
Packit Service 82fcde
		      {
Packit Service 82fcde
			free (sysdep_segment_values);
Packit Service 82fcde
			goto invalid;
Packit Service 82fcde
		      }
Packit Service 82fcde
Packit Service 82fcde
		    sysdep_segment_values[i] = get_sysdep_segment_value (name);
Packit Service 82fcde
		  }
Packit Service 82fcde
Packit Service 82fcde
		orig_sysdep_tab = (const nls_uint32 *)
Packit Service 82fcde
		  ((char *) data
Packit Service 82fcde
		   + W (domain->must_swap, data->orig_sysdep_tab_offset));
Packit Service 82fcde
		trans_sysdep_tab = (const nls_uint32 *)
Packit Service 82fcde
		  ((char *) data
Packit Service 82fcde
		   + W (domain->must_swap, data->trans_sysdep_tab_offset));
Packit Service 82fcde
Packit Service 82fcde
		/* Compute the amount of additional memory needed for the
Packit Service 82fcde
		   system dependent strings and the augmented hash table.
Packit Service 82fcde
		   At the same time, also drop string pairs which refer to
Packit Service 82fcde
		   an undefined system dependent segment.  */
Packit Service 82fcde
		n_inmem_sysdep_strings = 0;
Packit Service 82fcde
		memneed = domain->hash_size * sizeof (nls_uint32);
Packit Service 82fcde
		for (i = 0; i < n_sysdep_strings; i++)
Packit Service 82fcde
		  {
Packit Service 82fcde
		    int valid = 1;
Packit Service 82fcde
		    size_t needs[2];
Packit Service 82fcde
Packit Service 82fcde
		    for (j = 0; j < 2; j++)
Packit Service 82fcde
		      {
Packit Service 82fcde
			const struct sysdep_string *sysdep_string =
Packit Service 82fcde
			  (const struct sysdep_string *)
Packit Service 82fcde
			  ((char *) data
Packit Service 82fcde
			   + W (domain->must_swap,
Packit Service 82fcde
				j == 0
Packit Service 82fcde
				? orig_sysdep_tab[i]
Packit Service 82fcde
				: trans_sysdep_tab[i]));
Packit Service 82fcde
			size_t need = 0;
Packit Service 82fcde
			const struct segment_pair *p = sysdep_string->segments;
Packit Service 82fcde
Packit Service 82fcde
			if (W (domain->must_swap, p->sysdepref) != SEGMENTS_END)
Packit Service 82fcde
			  for (p = sysdep_string->segments;; p++)
Packit Service 82fcde
			    {
Packit Service 82fcde
			      nls_uint32 sysdepref;
Packit Service 82fcde
Packit Service 82fcde
			      need += W (domain->must_swap, p->segsize);
Packit Service 82fcde
Packit Service 82fcde
			      sysdepref = W (domain->must_swap, p->sysdepref);
Packit Service 82fcde
			      if (sysdepref == SEGMENTS_END)
Packit Service 82fcde
				break;
Packit Service 82fcde
Packit Service 82fcde
			      if (sysdepref >= n_sysdep_segments)
Packit Service 82fcde
				{
Packit Service 82fcde
				  /* Invalid.  */
Packit Service 82fcde
				  free (sysdep_segment_values);
Packit Service 82fcde
				  goto invalid;
Packit Service 82fcde
				}
Packit Service 82fcde
Packit Service 82fcde
			      if (sysdep_segment_values[sysdepref] == NULL)
Packit Service 82fcde
				{
Packit Service 82fcde
				  /* This particular string pair is invalid.  */
Packit Service 82fcde
				  valid = 0;
Packit Service 82fcde
				  break;
Packit Service 82fcde
				}
Packit Service 82fcde
Packit Service 82fcde
			      need += strlen (sysdep_segment_values[sysdepref]);
Packit Service 82fcde
			    }
Packit Service 82fcde
Packit Service 82fcde
			needs[j] = need;
Packit Service 82fcde
			if (!valid)
Packit Service 82fcde
			  break;
Packit Service 82fcde
		      }
Packit Service 82fcde
Packit Service 82fcde
		    if (valid)
Packit Service 82fcde
		      {
Packit Service 82fcde
			n_inmem_sysdep_strings++;
Packit Service 82fcde
			memneed += needs[0] + needs[1];
Packit Service 82fcde
		      }
Packit Service 82fcde
		  }
Packit Service 82fcde
		memneed += 2 * n_inmem_sysdep_strings
Packit Service 82fcde
			   * sizeof (struct sysdep_string_desc);
Packit Service 82fcde
Packit Service 82fcde
		if (n_inmem_sysdep_strings > 0)
Packit Service 82fcde
		  {
Packit Service 82fcde
		    unsigned int k;
Packit Service 82fcde
Packit Service 82fcde
		    /* Allocate additional memory.  */
Packit Service 82fcde
		    mem = (char *) malloc (memneed);
Packit Service 82fcde
		    if (mem == NULL)
Packit Service 82fcde
		      goto invalid;
Packit Service 82fcde
Packit Service 82fcde
		    domain->malloced = mem;
Packit Service 82fcde
		    inmem_orig_sysdep_tab = (struct sysdep_string_desc *) mem;
Packit Service 82fcde
		    mem += n_inmem_sysdep_strings
Packit Service 82fcde
			   * sizeof (struct sysdep_string_desc);
Packit Service 82fcde
		    inmem_trans_sysdep_tab = (struct sysdep_string_desc *) mem;
Packit Service 82fcde
		    mem += n_inmem_sysdep_strings
Packit Service 82fcde
			   * sizeof (struct sysdep_string_desc);
Packit Service 82fcde
		    inmem_hash_tab = (nls_uint32 *) mem;
Packit Service 82fcde
		    mem += domain->hash_size * sizeof (nls_uint32);
Packit Service 82fcde
Packit Service 82fcde
		    /* Compute the system dependent strings.  */
Packit Service 82fcde
		    k = 0;
Packit Service 82fcde
		    for (i = 0; i < n_sysdep_strings; i++)
Packit Service 82fcde
		      {
Packit Service 82fcde
			int valid = 1;
Packit Service 82fcde
Packit Service 82fcde
			for (j = 0; j < 2; j++)
Packit Service 82fcde
			  {
Packit Service 82fcde
			    const struct sysdep_string *sysdep_string =
Packit Service 82fcde
			      (const struct sysdep_string *)
Packit Service 82fcde
			      ((char *) data
Packit Service 82fcde
			       + W (domain->must_swap,
Packit Service 82fcde
				    j == 0
Packit Service 82fcde
				    ? orig_sysdep_tab[i]
Packit Service 82fcde
				    : trans_sysdep_tab[i]));
Packit Service 82fcde
			    const struct segment_pair *p =
Packit Service 82fcde
			      sysdep_string->segments;
Packit Service 82fcde
Packit Service 82fcde
			    if (W (domain->must_swap, p->sysdepref)
Packit Service 82fcde
				!= SEGMENTS_END)
Packit Service 82fcde
			      for (p = sysdep_string->segments;; p++)
Packit Service 82fcde
				{
Packit Service 82fcde
				  nls_uint32 sysdepref;
Packit Service 82fcde
Packit Service 82fcde
				  sysdepref =
Packit Service 82fcde
				    W (domain->must_swap, p->sysdepref);
Packit Service 82fcde
				  if (sysdepref == SEGMENTS_END)
Packit Service 82fcde
				    break;
Packit Service 82fcde
Packit Service 82fcde
				  if (sysdep_segment_values[sysdepref] == NULL)
Packit Service 82fcde
				    {
Packit Service 82fcde
				      /* This particular string pair is
Packit Service 82fcde
					 invalid.  */
Packit Service 82fcde
				      valid = 0;
Packit Service 82fcde
				      break;
Packit Service 82fcde
				    }
Packit Service 82fcde
				}
Packit Service 82fcde
Packit Service 82fcde
			    if (!valid)
Packit Service 82fcde
			      break;
Packit Service 82fcde
			  }
Packit Service 82fcde
Packit Service 82fcde
			if (valid)
Packit Service 82fcde
			  {
Packit Service 82fcde
			    for (j = 0; j < 2; j++)
Packit Service 82fcde
			      {
Packit Service 82fcde
				const struct sysdep_string *sysdep_string =
Packit Service 82fcde
				  (const struct sysdep_string *)
Packit Service 82fcde
				  ((char *) data
Packit Service 82fcde
				   + W (domain->must_swap,
Packit Service 82fcde
					j == 0
Packit Service 82fcde
					? orig_sysdep_tab[i]
Packit Service 82fcde
					: trans_sysdep_tab[i]));
Packit Service 82fcde
				const char *static_segments =
Packit Service 82fcde
				  (char *) data
Packit Service 82fcde
				  + W (domain->must_swap, sysdep_string->offset);
Packit Service 82fcde
				const struct segment_pair *p =
Packit Service 82fcde
				  sysdep_string->segments;
Packit Service 82fcde
Packit Service 82fcde
				/* Concatenate the segments, and fill
Packit Service 82fcde
				   inmem_orig_sysdep_tab[k] (for j == 0) and
Packit Service 82fcde
				   inmem_trans_sysdep_tab[k] (for j == 1).  */
Packit Service 82fcde
Packit Service 82fcde
				struct sysdep_string_desc *inmem_tab_entry =
Packit Service 82fcde
				  (j == 0
Packit Service 82fcde
				   ? inmem_orig_sysdep_tab
Packit Service 82fcde
				   : inmem_trans_sysdep_tab)
Packit Service 82fcde
				  + k;
Packit Service 82fcde
Packit Service 82fcde
				if (W (domain->must_swap, p->sysdepref)
Packit Service 82fcde
				    == SEGMENTS_END)
Packit Service 82fcde
				  {
Packit Service 82fcde
				    /* Only one static segment.  */
Packit Service 82fcde
				    inmem_tab_entry->length =
Packit Service 82fcde
				      W (domain->must_swap, p->segsize);
Packit Service 82fcde
				    inmem_tab_entry->pointer = static_segments;
Packit Service 82fcde
				  }
Packit Service 82fcde
				else
Packit Service 82fcde
				  {
Packit Service 82fcde
				    inmem_tab_entry->pointer = mem;
Packit Service 82fcde
Packit Service 82fcde
				    for (p = sysdep_string->segments;; p++)
Packit Service 82fcde
				      {
Packit Service 82fcde
					nls_uint32 segsize =
Packit Service 82fcde
					  W (domain->must_swap, p->segsize);
Packit Service 82fcde
					nls_uint32 sysdepref =
Packit Service 82fcde
					  W (domain->must_swap, p->sysdepref);
Packit Service 82fcde
					size_t n;
Packit Service 82fcde
Packit Service 82fcde
					if (segsize > 0)
Packit Service 82fcde
					  {
Packit Service 82fcde
					    memcpy (mem, static_segments, segsize);
Packit Service 82fcde
					    mem += segsize;
Packit Service 82fcde
					    static_segments += segsize;
Packit Service 82fcde
					  }
Packit Service 82fcde
Packit Service 82fcde
					if (sysdepref == SEGMENTS_END)
Packit Service 82fcde
					  break;
Packit Service 82fcde
Packit Service 82fcde
					n = strlen (sysdep_segment_values[sysdepref]);
Packit Service 82fcde
					memcpy (mem, sysdep_segment_values[sysdepref], n);
Packit Service 82fcde
					mem += n;
Packit Service 82fcde
				      }
Packit Service 82fcde
Packit Service 82fcde
				    inmem_tab_entry->length =
Packit Service 82fcde
				      mem - inmem_tab_entry->pointer;
Packit Service 82fcde
				  }
Packit Service 82fcde
			      }
Packit Service 82fcde
Packit Service 82fcde
			    k++;
Packit Service 82fcde
			  }
Packit Service 82fcde
		      }
Packit Service 82fcde
		    if (k != n_inmem_sysdep_strings)
Packit Service 82fcde
		      abort ();
Packit Service 82fcde
Packit Service 82fcde
		    /* Compute the augmented hash table.  */
Packit Service 82fcde
		    for (i = 0; i < domain->hash_size; i++)
Packit Service 82fcde
		      inmem_hash_tab[i] =
Packit Service 82fcde
			W (domain->must_swap_hash_tab, domain->hash_tab[i]);
Packit Service 82fcde
		    for (i = 0; i < n_inmem_sysdep_strings; i++)
Packit Service 82fcde
		      {
Packit Service 82fcde
			const char *msgid = inmem_orig_sysdep_tab[i].pointer;
Packit Service 82fcde
			nls_uint32 hash_val = __hash_string (msgid);
Packit Service 82fcde
			nls_uint32 idx = hash_val % domain->hash_size;
Packit Service 82fcde
			nls_uint32 incr =
Packit Service 82fcde
			  1 + (hash_val % (domain->hash_size - 2));
Packit Service 82fcde
Packit Service 82fcde
			for (;;)
Packit Service 82fcde
			  {
Packit Service 82fcde
			    if (inmem_hash_tab[idx] == 0)
Packit Service 82fcde
			      {
Packit Service 82fcde
				/* Hash table entry is empty.  Use it.  */
Packit Service 82fcde
				inmem_hash_tab[idx] = 1 + domain->nstrings + i;
Packit Service 82fcde
				break;
Packit Service 82fcde
			      }
Packit Service 82fcde
Packit Service 82fcde
			    if (idx >= domain->hash_size - incr)
Packit Service 82fcde
			      idx -= domain->hash_size - incr;
Packit Service 82fcde
			    else
Packit Service 82fcde
			      idx += incr;
Packit Service 82fcde
			  }
Packit Service 82fcde
		      }
Packit Service 82fcde
Packit Service 82fcde
		    domain->n_sysdep_strings = n_inmem_sysdep_strings;
Packit Service 82fcde
		    domain->orig_sysdep_tab = inmem_orig_sysdep_tab;
Packit Service 82fcde
		    domain->trans_sysdep_tab = inmem_trans_sysdep_tab;
Packit Service 82fcde
Packit Service 82fcde
		    domain->hash_tab = inmem_hash_tab;
Packit Service 82fcde
		    domain->must_swap_hash_tab = 0;
Packit Service 82fcde
		  }
Packit Service 82fcde
		else
Packit Service 82fcde
		  {
Packit Service 82fcde
		    domain->n_sysdep_strings = 0;
Packit Service 82fcde
		    domain->orig_sysdep_tab = NULL;
Packit Service 82fcde
		    domain->trans_sysdep_tab = NULL;
Packit Service 82fcde
		  }
Packit Service 82fcde
Packit Service 82fcde
		free (sysdep_segment_values);
Packit Service 82fcde
	      }
Packit Service 82fcde
	    else
Packit Service 82fcde
	      {
Packit Service 82fcde
		domain->n_sysdep_strings = 0;
Packit Service 82fcde
		domain->orig_sysdep_tab = NULL;
Packit Service 82fcde
		domain->trans_sysdep_tab = NULL;
Packit Service 82fcde
	      }
Packit Service 82fcde
	  }
Packit Service 82fcde
	  break;
Packit Service 82fcde
	}
Packit Service 82fcde
      break;
Packit Service 82fcde
    default:
Packit Service 82fcde
      /* This is an invalid revision.  */
Packit Service 82fcde
    invalid:
Packit Service 82fcde
      /* This is an invalid .mo file or we ran out of resources.  */
Packit Service 82fcde
      free (domain->malloced);
Packit Service 82fcde
#ifdef HAVE_MMAP
Packit Service 82fcde
      if (use_mmap)
Packit Service 82fcde
	munmap ((caddr_t) data, size);
Packit Service 82fcde
      else
Packit Service 82fcde
#endif
Packit Service 82fcde
	free (data);
Packit Service 82fcde
      free (domain);
Packit Service 82fcde
      domain_file->data = NULL;
Packit Service 82fcde
      goto out;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* No caches of converted translations so far.  */
Packit Service 82fcde
  domain->conversions = NULL;
Packit Service 82fcde
  domain->nconversions = 0;
Packit Service 82fcde
#ifdef _LIBC
Packit Service 82fcde
  __libc_rwlock_init (domain->conversions_lock);
Packit Service 82fcde
#else
Packit Service 82fcde
  gl_rwlock_init (domain->conversions_lock);
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
  /* Get the header entry and look for a plural specification.  */
Packit Service 82fcde
#ifdef IN_LIBGLOCALE
Packit Service 82fcde
  nullentry =
Packit Service 82fcde
    _nl_find_msg (domain_file, domainbinding, NULL, "", &nullentrylen);
Packit Service 82fcde
#else
Packit Service 82fcde
  nullentry = _nl_find_msg (domain_file, domainbinding, "", 0, &nullentrylen);
Packit Service 82fcde
#endif
Packit Service 82fcde
  if (__builtin_expect (nullentry == (char *) -1, 0))
Packit Service 82fcde
    {
Packit Service 82fcde
#ifdef _LIBC
Packit Service 82fcde
      __libc_rwlock_fini (domain->conversions_lock);
Packit Service 82fcde
#endif
Packit Service 82fcde
      goto invalid;
Packit Service 82fcde
    }
Packit Service 82fcde
  EXTRACT_PLURAL_EXPRESSION (nullentry, &domain->plural, &domain->nplurals);
Packit Service 82fcde
Packit Service 82fcde
 out:
Packit Service 82fcde
  if (fd != -1)
Packit Service 82fcde
    close (fd);
Packit Service 82fcde
Packit Service 82fcde
  domain_file->decided = 1;
Packit Service 82fcde
Packit Service 82fcde
 done:
Packit Service 82fcde
  __libc_lock_unlock_recursive (lock);
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
#ifdef _LIBC
Packit Service 82fcde
void
Packit Service 82fcde
__libc_freeres_fn_section
Packit Service 82fcde
_nl_unload_domain (struct loaded_domain *domain)
Packit Service 82fcde
{
Packit Service 82fcde
  size_t i;
Packit Service 82fcde
Packit Service 82fcde
  if (domain->plural != &__gettext_germanic_plural)
Packit Service 82fcde
    __gettext_free_exp ((struct expression *) domain->plural);
Packit Service 82fcde
Packit Service 82fcde
  for (i = 0; i < domain->nconversions; i++)
Packit Service 82fcde
    {
Packit Service 82fcde
      struct converted_domain *convd = &domain->conversions[i];
Packit Service 82fcde
Packit Service 82fcde
      free ((char *) convd->encoding);
Packit Service 82fcde
      if (convd->conv_tab != NULL && convd->conv_tab != (char **) -1)
Packit Service 82fcde
	free (convd->conv_tab);
Packit Service 82fcde
      if (convd->conv != (__gconv_t) -1)
Packit Service 82fcde
	__gconv_close (convd->conv);
Packit Service 82fcde
    }
Packit Service 82fcde
  free (domain->conversions);
Packit Service 82fcde
  __libc_rwlock_fini (domain->conversions_lock);
Packit Service 82fcde
Packit Service 82fcde
  free (domain->malloced);
Packit Service 82fcde
Packit Service 82fcde
# ifdef _POSIX_MAPPED_FILES
Packit Service 82fcde
  if (domain->use_mmap)
Packit Service 82fcde
    munmap ((caddr_t) domain->data, domain->mmap_size);
Packit Service 82fcde
  else
Packit Service 82fcde
# endif	/* _POSIX_MAPPED_FILES */
Packit Service 82fcde
    free ((void *) domain->data);
Packit Service 82fcde
Packit Service 82fcde
  free (domain);
Packit Service 82fcde
}
Packit Service 82fcde
#endif