loadmsgcat.c
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:34k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /* Load needed message catalogs.
  2.    Copyright (C) 1995-1999, 2000-2002 Free Software Foundation, Inc.
  3.    This program is free software; you can redistribute it and/or modify it
  4.    under the terms of the GNU Library General Public License as published
  5.    by the Free Software Foundation; either version 2, or (at your option)
  6.    any later version.
  7.    This program is distributed in the hope that it will be useful,
  8.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  10.    Library General Public License for more details.
  11.    You should have received a copy of the GNU Library General Public
  12.    License along with this program; if not, write to the Free Software
  13.    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
  14.    USA.  */
  15. /* Tell glibc's <string.h> to provide a prototype for mempcpy().
  16.    This must come before <config.h> because <config.h> may include
  17.    <features.h>, and once <features.h> has been included, it's too late.  */
  18. #ifndef _GNU_SOURCE
  19. # define _GNU_SOURCE    1
  20. #endif
  21. #ifdef HAVE_CONFIG_H
  22. # include <config.h>
  23. #endif
  24. #include <ctype.h>
  25. #include <errno.h>
  26. #include <fcntl.h>
  27. #include <sys/types.h>
  28. #include <sys/stat.h>
  29. #ifdef __GNUC__
  30. # define alloca __builtin_alloca
  31. # define HAVE_ALLOCA 1
  32. #else
  33. # if defined HAVE_ALLOCA_H || defined _LIBC
  34. #  include <alloca.h>
  35. # else
  36. #  ifdef _AIX
  37.  #pragma alloca
  38. #  else
  39. #   ifndef alloca
  40. char *alloca ();
  41. #   endif
  42. #  endif
  43. # endif
  44. #endif
  45. #include <stdlib.h>
  46. #include <string.h>
  47. #if defined HAVE_UNISTD_H || defined _LIBC
  48. # include <unistd.h>
  49. #endif
  50. #ifdef _LIBC
  51. # include <langinfo.h>
  52. # include <locale.h>
  53. #endif
  54. #if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) 
  55.     || (defined _LIBC && defined _POSIX_MAPPED_FILES)
  56. # include <sys/mman.h>
  57. # undef HAVE_MMAP
  58. # define HAVE_MMAP 1
  59. #else
  60. # undef HAVE_MMAP
  61. #endif
  62. #if defined HAVE_STDINT_H_WITH_UINTMAX || defined _LIBC
  63. # include <stdint.h>
  64. #endif
  65. #if defined HAVE_INTTYPES_H || defined _LIBC
  66. # include <inttypes.h>
  67. #endif
  68. #include "gmo.h"
  69. #include "gettextP.h"
  70. #include "hash-string.h"
  71. #include "plural-exp.h"
  72. #ifdef _LIBC
  73. # include "../locale/localeinfo.h"
  74. #endif
  75. /* Provide fallback values for macros that ought to be defined in <inttypes.h>.
  76.    Note that our fallback values need not be literal strings, because we don't
  77.    use them with preprocessor string concatenation.  */
  78. #if !defined PRId8 || PRI_MACROS_BROKEN
  79. # undef PRId8
  80. # define PRId8 "d"
  81. #endif
  82. #if !defined PRIi8 || PRI_MACROS_BROKEN
  83. # undef PRIi8
  84. # define PRIi8 "i"
  85. #endif
  86. #if !defined PRIo8 || PRI_MACROS_BROKEN
  87. # undef PRIo8
  88. # define PRIo8 "o"
  89. #endif
  90. #if !defined PRIu8 || PRI_MACROS_BROKEN
  91. # undef PRIu8
  92. # define PRIu8 "u"
  93. #endif
  94. #if !defined PRIx8 || PRI_MACROS_BROKEN
  95. # undef PRIx8
  96. # define PRIx8 "x"
  97. #endif
  98. #if !defined PRIX8 || PRI_MACROS_BROKEN
  99. # undef PRIX8
  100. # define PRIX8 "X"
  101. #endif
  102. #if !defined PRId16 || PRI_MACROS_BROKEN
  103. # undef PRId16
  104. # define PRId16 "d"
  105. #endif
  106. #if !defined PRIi16 || PRI_MACROS_BROKEN
  107. # undef PRIi16
  108. # define PRIi16 "i"
  109. #endif
  110. #if !defined PRIo16 || PRI_MACROS_BROKEN
  111. # undef PRIo16
  112. # define PRIo16 "o"
  113. #endif
  114. #if !defined PRIu16 || PRI_MACROS_BROKEN
  115. # undef PRIu16
  116. # define PRIu16 "u"
  117. #endif
  118. #if !defined PRIx16 || PRI_MACROS_BROKEN
  119. # undef PRIx16
  120. # define PRIx16 "x"
  121. #endif
  122. #if !defined PRIX16 || PRI_MACROS_BROKEN
  123. # undef PRIX16
  124. # define PRIX16 "X"
  125. #endif
  126. #if !defined PRId32 || PRI_MACROS_BROKEN
  127. # undef PRId32
  128. # define PRId32 "d"
  129. #endif
  130. #if !defined PRIi32 || PRI_MACROS_BROKEN
  131. # undef PRIi32
  132. # define PRIi32 "i"
  133. #endif
  134. #if !defined PRIo32 || PRI_MACROS_BROKEN
  135. # undef PRIo32
  136. # define PRIo32 "o"
  137. #endif
  138. #if !defined PRIu32 || PRI_MACROS_BROKEN
  139. # undef PRIu32
  140. # define PRIu32 "u"
  141. #endif
  142. #if !defined PRIx32 || PRI_MACROS_BROKEN
  143. # undef PRIx32
  144. # define PRIx32 "x"
  145. #endif
  146. #if !defined PRIX32 || PRI_MACROS_BROKEN
  147. # undef PRIX32
  148. # define PRIX32 "X"
  149. #endif
  150. #if !defined PRId64 || PRI_MACROS_BROKEN
  151. # undef PRId64
  152. # define PRId64 (sizeof (long) == 8 ? "ld" : "lld")
  153. #endif
  154. #if !defined PRIi64 || PRI_MACROS_BROKEN
  155. # undef PRIi64
  156. # define PRIi64 (sizeof (long) == 8 ? "li" : "lli")
  157. #endif
  158. #if !defined PRIo64 || PRI_MACROS_BROKEN
  159. # undef PRIo64
  160. # define PRIo64 (sizeof (long) == 8 ? "lo" : "llo")
  161. #endif
  162. #if !defined PRIu64 || PRI_MACROS_BROKEN
  163. # undef PRIu64
  164. # define PRIu64 (sizeof (long) == 8 ? "lu" : "llu")
  165. #endif
  166. #if !defined PRIx64 || PRI_MACROS_BROKEN
  167. # undef PRIx64
  168. # define PRIx64 (sizeof (long) == 8 ? "lx" : "llx")
  169. #endif
  170. #if !defined PRIX64 || PRI_MACROS_BROKEN
  171. # undef PRIX64
  172. # define PRIX64 (sizeof (long) == 8 ? "lX" : "llX")
  173. #endif
  174. #if !defined PRIdLEAST8 || PRI_MACROS_BROKEN
  175. # undef PRIdLEAST8
  176. # define PRIdLEAST8 "d"
  177. #endif
  178. #if !defined PRIiLEAST8 || PRI_MACROS_BROKEN
  179. # undef PRIiLEAST8
  180. # define PRIiLEAST8 "i"
  181. #endif
  182. #if !defined PRIoLEAST8 || PRI_MACROS_BROKEN
  183. # undef PRIoLEAST8
  184. # define PRIoLEAST8 "o"
  185. #endif
  186. #if !defined PRIuLEAST8 || PRI_MACROS_BROKEN
  187. # undef PRIuLEAST8
  188. # define PRIuLEAST8 "u"
  189. #endif
  190. #if !defined PRIxLEAST8 || PRI_MACROS_BROKEN
  191. # undef PRIxLEAST8
  192. # define PRIxLEAST8 "x"
  193. #endif
  194. #if !defined PRIXLEAST8 || PRI_MACROS_BROKEN
  195. # undef PRIXLEAST8
  196. # define PRIXLEAST8 "X"
  197. #endif
  198. #if !defined PRIdLEAST16 || PRI_MACROS_BROKEN
  199. # undef PRIdLEAST16
  200. # define PRIdLEAST16 "d"
  201. #endif
  202. #if !defined PRIiLEAST16 || PRI_MACROS_BROKEN
  203. # undef PRIiLEAST16
  204. # define PRIiLEAST16 "i"
  205. #endif
  206. #if !defined PRIoLEAST16 || PRI_MACROS_BROKEN
  207. # undef PRIoLEAST16
  208. # define PRIoLEAST16 "o"
  209. #endif
  210. #if !defined PRIuLEAST16 || PRI_MACROS_BROKEN
  211. # undef PRIuLEAST16
  212. # define PRIuLEAST16 "u"
  213. #endif
  214. #if !defined PRIxLEAST16 || PRI_MACROS_BROKEN
  215. # undef PRIxLEAST16
  216. # define PRIxLEAST16 "x"
  217. #endif
  218. #if !defined PRIXLEAST16 || PRI_MACROS_BROKEN
  219. # undef PRIXLEAST16
  220. # define PRIXLEAST16 "X"
  221. #endif
  222. #if !defined PRIdLEAST32 || PRI_MACROS_BROKEN
  223. # undef PRIdLEAST32
  224. # define PRIdLEAST32 "d"
  225. #endif
  226. #if !defined PRIiLEAST32 || PRI_MACROS_BROKEN
  227. # undef PRIiLEAST32
  228. # define PRIiLEAST32 "i"
  229. #endif
  230. #if !defined PRIoLEAST32 || PRI_MACROS_BROKEN
  231. # undef PRIoLEAST32
  232. # define PRIoLEAST32 "o"
  233. #endif
  234. #if !defined PRIuLEAST32 || PRI_MACROS_BROKEN
  235. # undef PRIuLEAST32
  236. # define PRIuLEAST32 "u"
  237. #endif
  238. #if !defined PRIxLEAST32 || PRI_MACROS_BROKEN
  239. # undef PRIxLEAST32
  240. # define PRIxLEAST32 "x"
  241. #endif
  242. #if !defined PRIXLEAST32 || PRI_MACROS_BROKEN
  243. # undef PRIXLEAST32
  244. # define PRIXLEAST32 "X"
  245. #endif
  246. #if !defined PRIdLEAST64 || PRI_MACROS_BROKEN
  247. # undef PRIdLEAST64
  248. # define PRIdLEAST64 PRId64
  249. #endif
  250. #if !defined PRIiLEAST64 || PRI_MACROS_BROKEN
  251. # undef PRIiLEAST64
  252. # define PRIiLEAST64 PRIi64
  253. #endif
  254. #if !defined PRIoLEAST64 || PRI_MACROS_BROKEN
  255. # undef PRIoLEAST64
  256. # define PRIoLEAST64 PRIo64
  257. #endif
  258. #if !defined PRIuLEAST64 || PRI_MACROS_BROKEN
  259. # undef PRIuLEAST64
  260. # define PRIuLEAST64 PRIu64
  261. #endif
  262. #if !defined PRIxLEAST64 || PRI_MACROS_BROKEN
  263. # undef PRIxLEAST64
  264. # define PRIxLEAST64 PRIx64
  265. #endif
  266. #if !defined PRIXLEAST64 || PRI_MACROS_BROKEN
  267. # undef PRIXLEAST64
  268. # define PRIXLEAST64 PRIX64
  269. #endif
  270. #if !defined PRIdFAST8 || PRI_MACROS_BROKEN
  271. # undef PRIdFAST8
  272. # define PRIdFAST8 "d"
  273. #endif
  274. #if !defined PRIiFAST8 || PRI_MACROS_BROKEN
  275. # undef PRIiFAST8
  276. # define PRIiFAST8 "i"
  277. #endif
  278. #if !defined PRIoFAST8 || PRI_MACROS_BROKEN
  279. # undef PRIoFAST8
  280. # define PRIoFAST8 "o"
  281. #endif
  282. #if !defined PRIuFAST8 || PRI_MACROS_BROKEN
  283. # undef PRIuFAST8
  284. # define PRIuFAST8 "u"
  285. #endif
  286. #if !defined PRIxFAST8 || PRI_MACROS_BROKEN
  287. # undef PRIxFAST8
  288. # define PRIxFAST8 "x"
  289. #endif
  290. #if !defined PRIXFAST8 || PRI_MACROS_BROKEN
  291. # undef PRIXFAST8
  292. # define PRIXFAST8 "X"
  293. #endif
  294. #if !defined PRIdFAST16 || PRI_MACROS_BROKEN
  295. # undef PRIdFAST16
  296. # define PRIdFAST16 "d"
  297. #endif
  298. #if !defined PRIiFAST16 || PRI_MACROS_BROKEN
  299. # undef PRIiFAST16
  300. # define PRIiFAST16 "i"
  301. #endif
  302. #if !defined PRIoFAST16 || PRI_MACROS_BROKEN
  303. # undef PRIoFAST16
  304. # define PRIoFAST16 "o"
  305. #endif
  306. #if !defined PRIuFAST16 || PRI_MACROS_BROKEN
  307. # undef PRIuFAST16
  308. # define PRIuFAST16 "u"
  309. #endif
  310. #if !defined PRIxFAST16 || PRI_MACROS_BROKEN
  311. # undef PRIxFAST16
  312. # define PRIxFAST16 "x"
  313. #endif
  314. #if !defined PRIXFAST16 || PRI_MACROS_BROKEN
  315. # undef PRIXFAST16
  316. # define PRIXFAST16 "X"
  317. #endif
  318. #if !defined PRIdFAST32 || PRI_MACROS_BROKEN
  319. # undef PRIdFAST32
  320. # define PRIdFAST32 "d"
  321. #endif
  322. #if !defined PRIiFAST32 || PRI_MACROS_BROKEN
  323. # undef PRIiFAST32
  324. # define PRIiFAST32 "i"
  325. #endif
  326. #if !defined PRIoFAST32 || PRI_MACROS_BROKEN
  327. # undef PRIoFAST32
  328. # define PRIoFAST32 "o"
  329. #endif
  330. #if !defined PRIuFAST32 || PRI_MACROS_BROKEN
  331. # undef PRIuFAST32
  332. # define PRIuFAST32 "u"
  333. #endif
  334. #if !defined PRIxFAST32 || PRI_MACROS_BROKEN
  335. # undef PRIxFAST32
  336. # define PRIxFAST32 "x"
  337. #endif
  338. #if !defined PRIXFAST32 || PRI_MACROS_BROKEN
  339. # undef PRIXFAST32
  340. # define PRIXFAST32 "X"
  341. #endif
  342. #if !defined PRIdFAST64 || PRI_MACROS_BROKEN
  343. # undef PRIdFAST64
  344. # define PRIdFAST64 PRId64
  345. #endif
  346. #if !defined PRIiFAST64 || PRI_MACROS_BROKEN
  347. # undef PRIiFAST64
  348. # define PRIiFAST64 PRIi64
  349. #endif
  350. #if !defined PRIoFAST64 || PRI_MACROS_BROKEN
  351. # undef PRIoFAST64
  352. # define PRIoFAST64 PRIo64
  353. #endif
  354. #if !defined PRIuFAST64 || PRI_MACROS_BROKEN
  355. # undef PRIuFAST64
  356. # define PRIuFAST64 PRIu64
  357. #endif
  358. #if !defined PRIxFAST64 || PRI_MACROS_BROKEN
  359. # undef PRIxFAST64
  360. # define PRIxFAST64 PRIx64
  361. #endif
  362. #if !defined PRIXFAST64 || PRI_MACROS_BROKEN
  363. # undef PRIXFAST64
  364. # define PRIXFAST64 PRIX64
  365. #endif
  366. #if !defined PRIdMAX || PRI_MACROS_BROKEN
  367. # undef PRIdMAX
  368. # define PRIdMAX (sizeof (uintmax_t) == sizeof (long) ? "ld" : "lld")
  369. #endif
  370. #if !defined PRIiMAX || PRI_MACROS_BROKEN
  371. # undef PRIiMAX
  372. # define PRIiMAX (sizeof (uintmax_t) == sizeof (long) ? "li" : "lli")
  373. #endif
  374. #if !defined PRIoMAX || PRI_MACROS_BROKEN
  375. # undef PRIoMAX
  376. # define PRIoMAX (sizeof (uintmax_t) == sizeof (long) ? "lo" : "llo")
  377. #endif
  378. #if !defined PRIuMAX || PRI_MACROS_BROKEN
  379. # undef PRIuMAX
  380. # define PRIuMAX (sizeof (uintmax_t) == sizeof (long) ? "lu" : "llu")
  381. #endif
  382. #if !defined PRIxMAX || PRI_MACROS_BROKEN
  383. # undef PRIxMAX
  384. # define PRIxMAX (sizeof (uintmax_t) == sizeof (long) ? "lx" : "llx")
  385. #endif
  386. #if !defined PRIXMAX || PRI_MACROS_BROKEN
  387. # undef PRIXMAX
  388. # define PRIXMAX (sizeof (uintmax_t) == sizeof (long) ? "lX" : "llX")
  389. #endif
  390. #if !defined PRIdPTR || PRI_MACROS_BROKEN
  391. # undef PRIdPTR
  392. # define PRIdPTR 
  393.   (sizeof (void *) == sizeof (long) ? "ld" : 
  394.    sizeof (void *) == sizeof (int) ? "d" : 
  395.    "lld")
  396. #endif
  397. #if !defined PRIiPTR || PRI_MACROS_BROKEN
  398. # undef PRIiPTR
  399. # define PRIiPTR 
  400.   (sizeof (void *) == sizeof (long) ? "li" : 
  401.    sizeof (void *) == sizeof (int) ? "i" : 
  402.    "lli")
  403. #endif
  404. #if !defined PRIoPTR || PRI_MACROS_BROKEN
  405. # undef PRIoPTR
  406. # define PRIoPTR 
  407.   (sizeof (void *) == sizeof (long) ? "lo" : 
  408.    sizeof (void *) == sizeof (int) ? "o" : 
  409.    "llo")
  410. #endif
  411. #if !defined PRIuPTR || PRI_MACROS_BROKEN
  412. # undef PRIuPTR
  413. # define PRIuPTR 
  414.   (sizeof (void *) == sizeof (long) ? "lu" : 
  415.    sizeof (void *) == sizeof (int) ? "u" : 
  416.    "llu")
  417. #endif
  418. #if !defined PRIxPTR || PRI_MACROS_BROKEN
  419. # undef PRIxPTR
  420. # define PRIxPTR 
  421.   (sizeof (void *) == sizeof (long) ? "lx" : 
  422.    sizeof (void *) == sizeof (int) ? "x" : 
  423.    "llx")
  424. #endif
  425. #if !defined PRIXPTR || PRI_MACROS_BROKEN
  426. # undef PRIXPTR
  427. # define PRIXPTR 
  428.   (sizeof (void *) == sizeof (long) ? "lX" : 
  429.    sizeof (void *) == sizeof (int) ? "X" : 
  430.    "llX")
  431. #endif
  432. /* @@ end of prolog @@ */
  433. #ifdef _LIBC
  434. /* Rename the non ISO C functions.  This is required by the standard
  435.    because some ISO C functions will require linking with this object
  436.    file and the name space must not be polluted.  */
  437. # define open   __open
  438. # define close  __close
  439. # define read   __read
  440. # define mmap   __mmap
  441. # define munmap __munmap
  442. #endif
  443. /* For those losing systems which don't have `alloca' we have to add
  444.    some additional code emulating it.  */
  445. #ifdef HAVE_ALLOCA
  446. # define freea(p) /* nothing */
  447. #else
  448. # define alloca(n) malloc (n)
  449. # define freea(p) free (p)
  450. #endif
  451. /* For systems that distinguish between text and binary I/O.
  452.    O_BINARY is usually declared in <fcntl.h>. */
  453. #if !defined O_BINARY && defined _O_BINARY
  454.   /* For MSC-compatible compilers.  */
  455. # define O_BINARY _O_BINARY
  456. # define O_TEXT _O_TEXT
  457. #endif
  458. #ifdef __BEOS__
  459.   /* BeOS 5 has O_BINARY and O_TEXT, but they have no effect.  */
  460. # undef O_BINARY
  461. # undef O_TEXT
  462. #endif
  463. /* On reasonable systems, binary I/O is the default.  */
  464. #ifndef O_BINARY
  465. # define O_BINARY 0
  466. #endif
  467. /* Prototypes for local functions.  Needed to ensure compiler checking of
  468.    function argument counts despite of K&R C function definition syntax.  */
  469. static const char *get_sysdep_segment_value PARAMS ((const char *name));
  470. /* We need a sign, whether a new catalog was loaded, which can be associated
  471.    with all translations.  This is important if the translations are
  472.    cached by one of GCC's features.  */
  473. int _nl_msg_cat_cntr;
  474. /* Expand a system dependent string segment.  Return NULL if unsupported.  */
  475. static const char *
  476. get_sysdep_segment_value (name)
  477.      const char *name;
  478. {
  479.   /* Test for an ISO C 99 section 7.8.1 format string directive.
  480.      Syntax:
  481.      P R I { d | i | o | u | x | X }
  482.      { { | LEAST | FAST } { 8 | 16 | 32 | 64 } | MAX | PTR }  */
  483.   /* We don't use a table of 14 times 6 'const char *' strings here, because
  484.      data relocations cost startup time.  */
  485.   if (name[0] == 'P' && name[1] == 'R' && name[2] == 'I')
  486.     {
  487.       if (name[3] == 'd' || name[3] == 'i' || name[3] == 'o' || name[3] == 'u'
  488.   || name[3] == 'x' || name[3] == 'X')
  489. {
  490.   if (name[4] == '8' && name[5] == '')
  491.     {
  492.       if (name[3] == 'd')
  493. return PRId8;
  494.       if (name[3] == 'i')
  495. return PRIi8;
  496.       if (name[3] == 'o')
  497. return PRIo8;
  498.       if (name[3] == 'u')
  499. return PRIu8;
  500.       if (name[3] == 'x')
  501. return PRIx8;
  502.       if (name[3] == 'X')
  503. return PRIX8;
  504.       abort ();
  505.     }
  506.   if (name[4] == '1' && name[5] == '6' && name[6] == '')
  507.     {
  508.       if (name[3] == 'd')
  509. return PRId16;
  510.       if (name[3] == 'i')
  511. return PRIi16;
  512.       if (name[3] == 'o')
  513. return PRIo16;
  514.       if (name[3] == 'u')
  515. return PRIu16;
  516.       if (name[3] == 'x')
  517. return PRIx16;
  518.       if (name[3] == 'X')
  519. return PRIX16;
  520.       abort ();
  521.     }
  522.   if (name[4] == '3' && name[5] == '2' && name[6] == '')
  523.     {
  524.       if (name[3] == 'd')
  525. return PRId32;
  526.       if (name[3] == 'i')
  527. return PRIi32;
  528.       if (name[3] == 'o')
  529. return PRIo32;
  530.       if (name[3] == 'u')
  531. return PRIu32;
  532.       if (name[3] == 'x')
  533. return PRIx32;
  534.       if (name[3] == 'X')
  535. return PRIX32;
  536.       abort ();
  537.     }
  538.   if (name[4] == '6' && name[5] == '4' && name[6] == '')
  539.     {
  540.       if (name[3] == 'd')
  541. return PRId64;
  542.       if (name[3] == 'i')
  543. return PRIi64;
  544.       if (name[3] == 'o')
  545. return PRIo64;
  546.       if (name[3] == 'u')
  547. return PRIu64;
  548.       if (name[3] == 'x')
  549. return PRIx64;
  550.       if (name[3] == 'X')
  551. return PRIX64;
  552.       abort ();
  553.     }
  554.   if (name[4] == 'L' && name[5] == 'E' && name[6] == 'A'
  555.       && name[7] == 'S' && name[8] == 'T')
  556.     {
  557.       if (name[9] == '8' && name[10] == '')
  558. {
  559.   if (name[3] == 'd')
  560.     return PRIdLEAST8;
  561.   if (name[3] == 'i')
  562.     return PRIiLEAST8;
  563.   if (name[3] == 'o')
  564.     return PRIoLEAST8;
  565.   if (name[3] == 'u')
  566.     return PRIuLEAST8;
  567.   if (name[3] == 'x')
  568.     return PRIxLEAST8;
  569.   if (name[3] == 'X')
  570.     return PRIXLEAST8;
  571.   abort ();
  572. }
  573.       if (name[9] == '1' && name[10] == '6' && name[11] == '')
  574. {
  575.   if (name[3] == 'd')
  576.     return PRIdLEAST16;
  577.   if (name[3] == 'i')
  578.     return PRIiLEAST16;
  579.   if (name[3] == 'o')
  580.     return PRIoLEAST16;
  581.   if (name[3] == 'u')
  582.     return PRIuLEAST16;
  583.   if (name[3] == 'x')
  584.     return PRIxLEAST16;
  585.   if (name[3] == 'X')
  586.     return PRIXLEAST16;
  587.   abort ();
  588. }
  589.       if (name[9] == '3' && name[10] == '2' && name[11] == '')
  590. {
  591.   if (name[3] == 'd')
  592.     return PRIdLEAST32;
  593.   if (name[3] == 'i')
  594.     return PRIiLEAST32;
  595.   if (name[3] == 'o')
  596.     return PRIoLEAST32;
  597.   if (name[3] == 'u')
  598.     return PRIuLEAST32;
  599.   if (name[3] == 'x')
  600.     return PRIxLEAST32;
  601.   if (name[3] == 'X')
  602.     return PRIXLEAST32;
  603.   abort ();
  604. }
  605.       if (name[9] == '6' && name[10] == '4' && name[11] == '')
  606. {
  607.   if (name[3] == 'd')
  608.     return PRIdLEAST64;
  609.   if (name[3] == 'i')
  610.     return PRIiLEAST64;
  611.   if (name[3] == 'o')
  612.     return PRIoLEAST64;
  613.   if (name[3] == 'u')
  614.     return PRIuLEAST64;
  615.   if (name[3] == 'x')
  616.     return PRIxLEAST64;
  617.   if (name[3] == 'X')
  618.     return PRIXLEAST64;
  619.   abort ();
  620. }
  621.     }
  622.   if (name[4] == 'F' && name[5] == 'A' && name[6] == 'S'
  623.       && name[7] == 'T')
  624.     {
  625.       if (name[8] == '8' && name[9] == '')
  626. {
  627.   if (name[3] == 'd')
  628.     return PRIdFAST8;
  629.   if (name[3] == 'i')
  630.     return PRIiFAST8;
  631.   if (name[3] == 'o')
  632.     return PRIoFAST8;
  633.   if (name[3] == 'u')
  634.     return PRIuFAST8;
  635.   if (name[3] == 'x')
  636.     return PRIxFAST8;
  637.   if (name[3] == 'X')
  638.     return PRIXFAST8;
  639.   abort ();
  640. }
  641.       if (name[8] == '1' && name[9] == '6' && name[10] == '')
  642. {
  643.   if (name[3] == 'd')
  644.     return PRIdFAST16;
  645.   if (name[3] == 'i')
  646.     return PRIiFAST16;
  647.   if (name[3] == 'o')
  648.     return PRIoFAST16;
  649.   if (name[3] == 'u')
  650.     return PRIuFAST16;
  651.   if (name[3] == 'x')
  652.     return PRIxFAST16;
  653.   if (name[3] == 'X')
  654.     return PRIXFAST16;
  655.   abort ();
  656. }
  657.       if (name[8] == '3' && name[9] == '2' && name[10] == '')
  658. {
  659.   if (name[3] == 'd')
  660.     return PRIdFAST32;
  661.   if (name[3] == 'i')
  662.     return PRIiFAST32;
  663.   if (name[3] == 'o')
  664.     return PRIoFAST32;
  665.   if (name[3] == 'u')
  666.     return PRIuFAST32;
  667.   if (name[3] == 'x')
  668.     return PRIxFAST32;
  669.   if (name[3] == 'X')
  670.     return PRIXFAST32;
  671.   abort ();
  672. }
  673.       if (name[8] == '6' && name[9] == '4' && name[10] == '')
  674. {
  675.   if (name[3] == 'd')
  676.     return PRIdFAST64;
  677.   if (name[3] == 'i')
  678.     return PRIiFAST64;
  679.   if (name[3] == 'o')
  680.     return PRIoFAST64;
  681.   if (name[3] == 'u')
  682.     return PRIuFAST64;
  683.   if (name[3] == 'x')
  684.     return PRIxFAST64;
  685.   if (name[3] == 'X')
  686.     return PRIXFAST64;
  687.   abort ();
  688. }
  689.     }
  690.   if (name[4] == 'M' && name[5] == 'A' && name[6] == 'X'
  691.       && name[7] == '')
  692.     {
  693.       if (name[3] == 'd')
  694. return PRIdMAX;
  695.       if (name[3] == 'i')
  696. return PRIiMAX;
  697.       if (name[3] == 'o')
  698. return PRIoMAX;
  699.       if (name[3] == 'u')
  700. return PRIuMAX;
  701.       if (name[3] == 'x')
  702. return PRIxMAX;
  703.       if (name[3] == 'X')
  704. return PRIXMAX;
  705.       abort ();
  706.     }
  707.   if (name[4] == 'P' && name[5] == 'T' && name[6] == 'R'
  708.       && name[7] == '')
  709.     {
  710.       if (name[3] == 'd')
  711. return PRIdPTR;
  712.       if (name[3] == 'i')
  713. return PRIiPTR;
  714.       if (name[3] == 'o')
  715. return PRIoPTR;
  716.       if (name[3] == 'u')
  717. return PRIuPTR;
  718.       if (name[3] == 'x')
  719. return PRIxPTR;
  720.       if (name[3] == 'X')
  721. return PRIXPTR;
  722.       abort ();
  723.     }
  724. }
  725.     }
  726.   /* Other system dependent strings are not valid.  */
  727.   return NULL;
  728. }
  729. /* Initialize the codeset dependent parts of an opened message catalog.
  730.    Return the header entry.  */
  731. const char *
  732. internal_function
  733. _nl_init_domain_conv (domain_file, domain, domainbinding)
  734.      struct loaded_l10nfile *domain_file;
  735.      struct loaded_domain *domain;
  736.      struct binding *domainbinding;
  737. {
  738.   /* Find out about the character set the file is encoded with.
  739.      This can be found (in textual form) in the entry "".  If this
  740.      entry does not exist or if this does not contain the `charset='
  741.      information, we will assume the charset matches the one the
  742.      current locale and we don't have to perform any conversion.  */
  743.   char *nullentry;
  744.   size_t nullentrylen;
  745.   /* Preinitialize fields, to avoid recursion during _nl_find_msg.  */
  746.   domain->codeset_cntr =
  747.     (domainbinding != NULL ? domainbinding->codeset_cntr : 0);
  748. #ifdef _LIBC
  749.   domain->conv = (__gconv_t) -1;
  750. #else
  751. # if HAVE_ICONV
  752.   domain->conv = (iconv_t) -1;
  753. # endif
  754. #endif
  755.   domain->conv_tab = NULL;
  756.   /* Get the header entry.  */
  757.   nullentry = _nl_find_msg (domain_file, domainbinding, "", &nullentrylen);
  758.   if (nullentry != NULL)
  759.     {
  760. #if defined _LIBC || HAVE_ICONV
  761.       const char *charsetstr;
  762.       charsetstr = strstr (nullentry, "charset=");
  763.       if (charsetstr != NULL)
  764. {
  765.   size_t len;
  766.   char *charset;
  767.   const char *outcharset;
  768.   charsetstr += strlen ("charset=");
  769.   len = strcspn (charsetstr, " tn");
  770.   charset = (char *) alloca (len + 1);
  771. # if defined _LIBC || HAVE_MEMPCPY
  772.   *((char *) mempcpy (charset, charsetstr, len)) = '';
  773. # else
  774.   memcpy (charset, charsetstr, len);
  775.   charset[len] = '';
  776. # endif
  777.   /* The output charset should normally be determined by the
  778.      locale.  But sometimes the locale is not used or not correctly
  779.      set up, so we provide a possibility for the user to override
  780.      this.  Moreover, the value specified through
  781.      bind_textdomain_codeset overrides both.  */
  782.   if (domainbinding != NULL && domainbinding->codeset != NULL)
  783.     outcharset = domainbinding->codeset;
  784.   else
  785.     {
  786.       outcharset = getenv ("OUTPUT_CHARSET");
  787.       if (outcharset == NULL || outcharset[0] == '')
  788. {
  789. # ifdef _LIBC
  790.   outcharset = (*_nl_current[LC_CTYPE])->values[_NL_ITEM_INDEX (CODESET)].string;
  791. # else
  792. #  if HAVE_ICONV
  793.   extern const char *locale_charset PARAMS ((void));
  794.   outcharset = locale_charset ();
  795. #  endif
  796. # endif
  797. }
  798.     }
  799. # ifdef _LIBC
  800.   /* We always want to use transliteration.  */
  801.   outcharset = norm_add_slashes (outcharset, "TRANSLIT");
  802.   charset = norm_add_slashes (charset, NULL);
  803.   if (__gconv_open (outcharset, charset, &domain->conv,
  804.     GCONV_AVOID_NOCONV)
  805.       != __GCONV_OK)
  806.     domain->conv = (__gconv_t) -1;
  807. # else
  808. #  if HAVE_ICONV
  809.   /* When using GNU libc >= 2.2 or GNU libiconv >= 1.5,
  810.      we want to use transliteration.  */
  811. #   if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 
  812.        || _LIBICONV_VERSION >= 0x0105
  813.   if (strchr (outcharset, '/') == NULL)
  814.     {
  815.       char *tmp;
  816.       len = strlen (outcharset);
  817.       tmp = (char *) alloca (len + 10 + 1);
  818.       memcpy (tmp, outcharset, len);
  819.       memcpy (tmp + len, "//TRANSLIT", 10 + 1);
  820.       outcharset = tmp;
  821.       domain->conv = iconv_open (outcharset, charset);
  822.       freea (outcharset);
  823.     }
  824.   else
  825. #   endif
  826.     domain->conv = iconv_open (outcharset, charset);
  827. #  endif
  828. # endif
  829.   freea (charset);
  830. }
  831. #endif /* _LIBC || HAVE_ICONV */
  832.     }
  833.   return nullentry;
  834. }
  835. /* Frees the codeset dependent parts of an opened message catalog.  */
  836. void
  837. internal_function
  838. _nl_free_domain_conv (domain)
  839.      struct loaded_domain *domain;
  840. {
  841.   if (domain->conv_tab != NULL && domain->conv_tab != (char **) -1)
  842.     free (domain->conv_tab);
  843. #ifdef _LIBC
  844.   if (domain->conv != (__gconv_t) -1)
  845.     __gconv_close (domain->conv);
  846. #else
  847. # if HAVE_ICONV
  848.   if (domain->conv != (iconv_t) -1)
  849.     iconv_close (domain->conv);
  850. # endif
  851. #endif
  852. }
  853. /* Load the message catalogs specified by FILENAME.  If it is no valid
  854.    message catalog do nothing.  */
  855. void
  856. internal_function
  857. _nl_load_domain (domain_file, domainbinding)
  858.      struct loaded_l10nfile *domain_file;
  859.      struct binding *domainbinding;
  860. {
  861.   int fd;
  862.   size_t size;
  863. #ifdef _LIBC
  864.   struct stat64 st;
  865. #else
  866.   struct stat st;
  867. #endif
  868.   struct mo_file_header *data = (struct mo_file_header *) -1;
  869.   int use_mmap = 0;
  870.   struct loaded_domain *domain;
  871.   int revision;
  872.   const char *nullentry;
  873.   domain_file->decided = 1;
  874.   domain_file->data = NULL;
  875.   /* Note that it would be useless to store domainbinding in domain_file
  876.      because domainbinding might be == NULL now but != NULL later (after
  877.      a call to bind_textdomain_codeset).  */
  878.   /* If the record does not represent a valid locale the FILENAME
  879.      might be NULL.  This can happen when according to the given
  880.      specification the locale file name is different for XPG and CEN
  881.      syntax.  */
  882.   if (domain_file->filename == NULL)
  883.     return;
  884.   /* Try to open the addressed file.  */
  885.   fd = open (domain_file->filename, O_RDONLY | O_BINARY);
  886.   if (fd == -1)
  887.     return;
  888.   /* We must know about the size of the file.  */
  889.   if (
  890. #ifdef _LIBC
  891.       __builtin_expect (fstat64 (fd, &st) != 0, 0)
  892. #else
  893.       __builtin_expect (fstat (fd, &st) != 0, 0)
  894. #endif
  895.       || __builtin_expect ((size = (size_t) st.st_size) != st.st_size, 0)
  896.       || __builtin_expect (size < sizeof (struct mo_file_header), 0))
  897.     {
  898.       /* Something went wrong.  */
  899.       close (fd);
  900.       return;
  901.     }
  902. #ifdef HAVE_MMAP
  903.   /* Now we are ready to load the file.  If mmap() is available we try
  904.      this first.  If not available or it failed we try to load it.  */
  905.   data = (struct mo_file_header *) mmap (NULL, size, PROT_READ,
  906.  MAP_PRIVATE, fd, 0);
  907.   if (__builtin_expect (data != (struct mo_file_header *) -1, 1))
  908.     {
  909.       /* mmap() call was successful.  */
  910.       close (fd);
  911.       use_mmap = 1;
  912.     }
  913. #endif
  914.   /* If the data is not yet available (i.e. mmap'ed) we try to load
  915.      it manually.  */
  916.   if (data == (struct mo_file_header *) -1)
  917.     {
  918.       size_t to_read;
  919.       char *read_ptr;
  920.       data = (struct mo_file_header *) malloc (size);
  921.       if (data == NULL)
  922. return;
  923.       to_read = size;
  924.       read_ptr = (char *) data;
  925.       do
  926. {
  927.   long int nb = (long int) read (fd, read_ptr, to_read);
  928.   if (nb <= 0)
  929.     {
  930. #ifdef EINTR
  931.       if (nb == -1 && errno == EINTR)
  932. continue;
  933. #endif
  934.       close (fd);
  935.       return;
  936.     }
  937.   read_ptr += nb;
  938.   to_read -= nb;
  939. }
  940.       while (to_read > 0);
  941.       close (fd);
  942.     }
  943.   /* Using the magic number we can test whether it really is a message
  944.      catalog file.  */
  945.   if (__builtin_expect (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED,
  946. 0))
  947.     {
  948.       /* The magic number is wrong: not a message catalog file.  */
  949. #ifdef HAVE_MMAP
  950.       if (use_mmap)
  951. munmap ((caddr_t) data, size);
  952.       else
  953. #endif
  954. free (data);
  955.       return;
  956.     }
  957.   domain = (struct loaded_domain *) malloc (sizeof (struct loaded_domain));
  958.   if (domain == NULL)
  959.     return;
  960.   domain_file->data = domain;
  961.   domain->data = (char *) data;
  962.   domain->use_mmap = use_mmap;
  963.   domain->mmap_size = size;
  964.   domain->must_swap = data->magic != _MAGIC;
  965.   domain->malloced = NULL;
  966.   /* Fill in the information about the available tables.  */
  967.   revision = W (domain->must_swap, data->revision);
  968.   /* We support only the major revision 0.  */
  969.   switch (revision >> 16)
  970.     {
  971.     case 0:
  972.       domain->nstrings = W (domain->must_swap, data->nstrings);
  973.       domain->orig_tab = (const struct string_desc *)
  974. ((char *) data + W (domain->must_swap, data->orig_tab_offset));
  975.       domain->trans_tab = (const struct string_desc *)
  976. ((char *) data + W (domain->must_swap, data->trans_tab_offset));
  977.       domain->hash_size = W (domain->must_swap, data->hash_tab_size);
  978.       domain->hash_tab =
  979. (domain->hash_size > 2
  980.  ? (const nls_uint32 *)
  981.    ((char *) data + W (domain->must_swap, data->hash_tab_offset))
  982.  : NULL);
  983.       domain->must_swap_hash_tab = domain->must_swap;
  984.       /* Now dispatch on the minor revision.  */
  985.       switch (revision & 0xffff)
  986. {
  987. case 0:
  988.   domain->n_sysdep_strings = 0;
  989.   domain->orig_sysdep_tab = NULL;
  990.   domain->trans_sysdep_tab = NULL;
  991.   break;
  992. case 1:
  993. default:
  994.   {
  995.     nls_uint32 n_sysdep_strings;
  996.     if (domain->hash_tab == NULL)
  997.       /* This is invalid.  These minor revisions need a hash table.  */
  998.       goto invalid;
  999.     n_sysdep_strings =
  1000.       W (domain->must_swap, data->n_sysdep_strings);
  1001.     if (n_sysdep_strings > 0)
  1002.       {
  1003. nls_uint32 n_sysdep_segments;
  1004. const struct sysdep_segment *sysdep_segments;
  1005. const char **sysdep_segment_values;
  1006. const nls_uint32 *orig_sysdep_tab;
  1007. const nls_uint32 *trans_sysdep_tab;
  1008. size_t memneed;
  1009. char *mem;
  1010. struct sysdep_string_desc *inmem_orig_sysdep_tab;
  1011. struct sysdep_string_desc *inmem_trans_sysdep_tab;
  1012. nls_uint32 *inmem_hash_tab;
  1013. unsigned int i;
  1014. /* Get the values of the system dependent segments.  */
  1015. n_sysdep_segments =
  1016.   W (domain->must_swap, data->n_sysdep_segments);
  1017. sysdep_segments = (const struct sysdep_segment *)
  1018.   ((char *) data
  1019.    + W (domain->must_swap, data->sysdep_segments_offset));
  1020. sysdep_segment_values =
  1021.   alloca (n_sysdep_segments * sizeof (const char *));
  1022. for (i = 0; i < n_sysdep_segments; i++)
  1023.   {
  1024.     const char *name =
  1025.       (char *) data
  1026.       + W (domain->must_swap, sysdep_segments[i].offset);
  1027.     nls_uint32 namelen =
  1028.       W (domain->must_swap, sysdep_segments[i].length);
  1029.     if (!(namelen > 0 && name[namelen - 1] == ''))
  1030.       {
  1031. freea (sysdep_segment_values);
  1032. goto invalid;
  1033.       }
  1034.     sysdep_segment_values[i] = get_sysdep_segment_value (name);
  1035.   }
  1036. orig_sysdep_tab = (const nls_uint32 *)
  1037.   ((char *) data
  1038.    + W (domain->must_swap, data->orig_sysdep_tab_offset));
  1039. trans_sysdep_tab = (const nls_uint32 *)
  1040.   ((char *) data
  1041.    + W (domain->must_swap, data->trans_sysdep_tab_offset));
  1042. /* Compute the amount of additional memory needed for the
  1043.    system dependent strings and the augmented hash table.  */
  1044. memneed = 2 * n_sysdep_strings
  1045.   * sizeof (struct sysdep_string_desc)
  1046.   + domain->hash_size * sizeof (nls_uint32);
  1047. for (i = 0; i < 2 * n_sysdep_strings; i++)
  1048.   {
  1049.     const struct sysdep_string *sysdep_string =
  1050.       (const struct sysdep_string *)
  1051.       ((char *) data
  1052.        + W (domain->must_swap,
  1053.     i < n_sysdep_strings
  1054.     ? orig_sysdep_tab[i]
  1055.     : trans_sysdep_tab[i - n_sysdep_strings]));
  1056.     size_t need = 0;
  1057.     const struct segment_pair *p = sysdep_string->segments;
  1058.     if (W (domain->must_swap, p->sysdepref) != SEGMENTS_END)
  1059.       for (p = sysdep_string->segments;; p++)
  1060. {
  1061.   nls_uint32 sysdepref;
  1062.   need += W (domain->must_swap, p->segsize);
  1063.   sysdepref = W (domain->must_swap, p->sysdepref);
  1064.   if (sysdepref == SEGMENTS_END)
  1065.     break;
  1066.   if (sysdepref >= n_sysdep_segments)
  1067.     {
  1068.       /* Invalid.  */
  1069.       freea (sysdep_segment_values);
  1070.       goto invalid;
  1071.     }
  1072.   need += strlen (sysdep_segment_values[sysdepref]);
  1073. }
  1074.     memneed += need;
  1075.   }
  1076. /* Allocate additional memory.  */
  1077. mem = (char *) malloc (memneed);
  1078. if (mem == NULL)
  1079.   goto invalid;
  1080. domain->malloced = mem;
  1081. inmem_orig_sysdep_tab = (struct sysdep_string_desc *) mem;
  1082. mem += n_sysdep_strings * sizeof (struct sysdep_string_desc);
  1083. inmem_trans_sysdep_tab = (struct sysdep_string_desc *) mem;
  1084. mem += n_sysdep_strings * sizeof (struct sysdep_string_desc);
  1085. inmem_hash_tab = (nls_uint32 *) mem;
  1086. mem += domain->hash_size * sizeof (nls_uint32);
  1087. /* Compute the system dependent strings.  */
  1088. for (i = 0; i < 2 * n_sysdep_strings; i++)
  1089.   {
  1090.     const struct sysdep_string *sysdep_string =
  1091.       (const struct sysdep_string *)
  1092.       ((char *) data
  1093.        + W (domain->must_swap,
  1094.     i < n_sysdep_strings
  1095.     ? orig_sysdep_tab[i]
  1096.     : trans_sysdep_tab[i - n_sysdep_strings]));
  1097.     const char *static_segments =
  1098.       (char *) data
  1099.       + W (domain->must_swap, sysdep_string->offset);
  1100.     const struct segment_pair *p = sysdep_string->segments;
  1101.     /* Concatenate the segments, and fill
  1102.        inmem_orig_sysdep_tab[i] (for i < n_sysdep_strings) and
  1103.        inmem_trans_sysdep_tab[i-n_sysdep_strings] (for
  1104.        i >= n_sysdep_strings).  */
  1105.     if (W (domain->must_swap, p->sysdepref) == SEGMENTS_END)
  1106.       {
  1107. /* Only one static segment.  */
  1108. inmem_orig_sysdep_tab[i].length =
  1109.   W (domain->must_swap, p->segsize);
  1110. inmem_orig_sysdep_tab[i].pointer = static_segments;
  1111.       }
  1112.     else
  1113.       {
  1114. inmem_orig_sysdep_tab[i].pointer = mem;
  1115. for (p = sysdep_string->segments;; p++)
  1116.   {
  1117.     nls_uint32 segsize =
  1118.       W (domain->must_swap, p->segsize);
  1119.     nls_uint32 sysdepref =
  1120.       W (domain->must_swap, p->sysdepref);
  1121.     size_t n;
  1122.     if (segsize > 0)
  1123.       {
  1124. memcpy (mem, static_segments, segsize);
  1125. mem += segsize;
  1126. static_segments += segsize;
  1127.       }
  1128.     if (sysdepref == SEGMENTS_END)
  1129.       break;
  1130.     n = strlen (sysdep_segment_values[sysdepref]);
  1131.     memcpy (mem, sysdep_segment_values[sysdepref], n);
  1132.     mem += n;
  1133.   }
  1134. inmem_orig_sysdep_tab[i].length =
  1135.   mem - inmem_orig_sysdep_tab[i].pointer;
  1136.       }
  1137.   }
  1138. /* Compute the augmented hash table.  */
  1139. for (i = 0; i < domain->hash_size; i++)
  1140.   inmem_hash_tab[i] =
  1141.     W (domain->must_swap_hash_tab, domain->hash_tab[i]);
  1142. for (i = 0; i < n_sysdep_strings; i++)
  1143.   {
  1144.     const char *msgid = inmem_orig_sysdep_tab[i].pointer;
  1145.     nls_uint32 hash_val = hash_string (msgid);
  1146.     nls_uint32 idx = hash_val % domain->hash_size;
  1147.     nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2));
  1148.     for (;;)
  1149.       {
  1150. if (inmem_hash_tab[idx] == 0)
  1151.   {
  1152.     /* Hash table entry is empty.  Use it.  */
  1153.     inmem_hash_tab[idx] = 1 + domain->nstrings + i;
  1154.     break;
  1155.   }
  1156. if (idx >= domain->hash_size - incr)
  1157.   idx -= domain->hash_size - incr;
  1158. else
  1159.   idx += incr;
  1160.       }
  1161.   }
  1162. freea (sysdep_segment_values);
  1163. domain->n_sysdep_strings = n_sysdep_strings;
  1164. domain->orig_sysdep_tab = inmem_orig_sysdep_tab;
  1165. domain->trans_sysdep_tab = inmem_trans_sysdep_tab;
  1166. domain->hash_tab = inmem_hash_tab;
  1167. domain->must_swap_hash_tab = 0;
  1168.       }
  1169.     else
  1170.       {
  1171. domain->n_sysdep_strings = 0;
  1172. domain->orig_sysdep_tab = NULL;
  1173. domain->trans_sysdep_tab = NULL;
  1174.       }
  1175.   }
  1176.   break;
  1177. }
  1178.       break;
  1179.     default:
  1180.       /* This is an invalid revision.  */
  1181.     invalid:
  1182.       /* This is an invalid .mo file.  */
  1183.       if (domain->malloced)
  1184. free (domain->malloced);
  1185. #ifdef HAVE_MMAP
  1186.       if (use_mmap)
  1187. munmap ((caddr_t) data, size);
  1188.       else
  1189. #endif
  1190. free (data);
  1191.       free (domain);
  1192.       domain_file->data = NULL;
  1193.       return;
  1194.     }
  1195.   /* Now initialize the character set converter from the character set
  1196.      the file is encoded with (found in the header entry) to the domain's
  1197.      specified character set or the locale's character set.  */
  1198.   nullentry = _nl_init_domain_conv (domain_file, domain, domainbinding);
  1199.   /* Also look for a plural specification.  */
  1200.   EXTRACT_PLURAL_EXPRESSION (nullentry, &domain->plural, &domain->nplurals);
  1201. }
  1202. #ifdef _LIBC
  1203. void
  1204. internal_function
  1205. _nl_unload_domain (domain)
  1206.      struct loaded_domain *domain;
  1207. {
  1208.   if (domain->plural != &__gettext_germanic_plural)
  1209.     __gettext_free_exp (domain->plural);
  1210.   _nl_free_domain_conv (domain);
  1211.   if (domain->malloced)
  1212.     free (domain->malloced);
  1213. # ifdef _POSIX_MAPPED_FILES
  1214.   if (domain->use_mmap)
  1215.     munmap ((caddr_t) domain->data, domain->mmap_size);
  1216.   else
  1217. # endif /* _POSIX_MAPPED_FILES */
  1218.     free ((void *) domain->data);
  1219.   free (domain);
  1220. }
  1221. #endif