1a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* Description of GNU message catalog format: general file layout.
2b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o   Copyright (C) 1995, 1997, 2000-2002, 2004 Free Software Foundation, Inc.
3a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
4a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   This program is free software; you can redistribute it and/or modify it
5a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   under the terms of the GNU Library General Public License as published
6a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   by the Free Software Foundation; either version 2, or (at your option)
7a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   any later version.
8a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
9a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   This program is distributed in the hope that it will be useful,
10a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   but WITHOUT ANY WARRANTY; without even the implied warranty of
11a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   Library General Public License for more details.
13a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
14a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   You should have received a copy of the GNU Library General Public
15a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   License along with this program; if not, write to the Free Software
16a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
17a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   USA.  */
18a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
19a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#ifndef _GETTEXT_H
20a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#define _GETTEXT_H 1
21a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
22a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#include <limits.h>
23a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
24a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* @@ end of prolog @@ */
25a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
26a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* The magic number of the GNU message catalog format.  */
27a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#define _MAGIC 0x950412de
28a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#define _MAGIC_SWAPPED 0xde120495
29a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
30a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* Revision number of the currently used .mo (binary) file format.  */
31a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#define MO_REVISION_NUMBER 0
32b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o#define MO_REVISION_NUMBER_WITH_SYSDEP_I 1
33a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
34a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* The following contortions are an attempt to use the C preprocessor
35a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   to determine an unsigned integral type that is 32 bits wide.  An
36a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
37a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   as of version autoconf-2.13, the AC_CHECK_SIZEOF macro doesn't work
38a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   when cross-compiling.  */
39a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
40a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if __STDC__
41a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define UINT_MAX_32_BITS 4294967295U
42a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#else
43a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define UINT_MAX_32_BITS 0xFFFFFFFF
44a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif
45a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
46a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* If UINT_MAX isn't defined, assume it's a 32-bit type.
47a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   This should be valid for all systems GNU cares about because
48a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   that doesn't include 16-bit systems, and only modern systems
49a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   (that certainly have <limits.h>) have 64+-bit integral types.  */
50a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
51a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#ifndef UINT_MAX
52a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define UINT_MAX UINT_MAX_32_BITS
53a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif
54a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
55a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if UINT_MAX == UINT_MAX_32_BITS
56a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'otypedef unsigned nls_uint32;
57a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#else
58a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# if USHRT_MAX == UINT_MAX_32_BITS
59a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'otypedef unsigned short nls_uint32;
60a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# else
61a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#  if ULONG_MAX == UINT_MAX_32_BITS
62a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'otypedef unsigned long nls_uint32;
63a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#  else
64a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* The following line is intended to throw an error.  Using #error is
65a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o     not portable enough.  */
66a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  "Cannot determine unsigned 32-bit data type."
67a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#  endif
68a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# endif
69a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif
70a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
71a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
72a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* Header for binary .mo file format.  */
73a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'ostruct mo_file_header
74a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o{
75a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* The magic number.  */
76a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 magic;
77a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* The revision number of the file format.  */
78a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 revision;
79a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
80b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o  /* The following are only used in .mo files with major revision 0 or 1.  */
81a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
82a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* The number of strings pairs.  */
83a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 nstrings;
84a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* Offset of table with start offsets of original strings.  */
85a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 orig_tab_offset;
86a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* Offset of table with start offsets of translated strings.  */
87a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 trans_tab_offset;
88a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* Size of hash table.  */
89a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 hash_tab_size;
90a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* Offset of first hash table entry.  */
91a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 hash_tab_offset;
92a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
93a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* The following are only used in .mo files with minor revision >= 1.  */
94a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
95a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* The number of system dependent segments.  */
96a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 n_sysdep_segments;
97a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* Offset of table describing system dependent segments.  */
98a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 sysdep_segments_offset;
99a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* The number of system dependent strings pairs.  */
100a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 n_sysdep_strings;
101a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* Offset of table with start offsets of original sysdep strings.  */
102a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 orig_sysdep_tab_offset;
103a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* Offset of table with start offsets of translated sysdep strings.  */
104a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 trans_sysdep_tab_offset;
105a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o};
106a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
107a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* Descriptor for static string contained in the binary .mo file.  */
108a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'ostruct string_desc
109a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o{
110a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* Length of addressed string, not including the trailing NUL.  */
111a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 length;
112a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* Offset of string in file.  */
113a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 offset;
114a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o};
115a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
116a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* The following are only used in .mo files with minor revision >= 1.  */
117a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
118a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* Descriptor for system dependent string segment.  */
119a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'ostruct sysdep_segment
120a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o{
121a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* Length of addressed string, including the trailing NUL.  */
122a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 length;
123a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* Offset of string in file.  */
124a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 offset;
125a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o};
126a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
127a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* Descriptor for system dependent string.  */
128a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'ostruct sysdep_string
129a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o{
130a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* Offset of static string segments in file.  */
131a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 offset;
132a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* Alternating sequence of static and system dependent segments.
133a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o     The last segment is a static segment, including the trailing NUL.  */
134a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  struct segment_pair
135a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  {
136a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o    /* Size of static segment.  */
137a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o    nls_uint32 segsize;
138a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o    /* Reference to system dependent string segment, or ~0 at the end.  */
139a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o    nls_uint32 sysdepref;
140a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  } segments[1];
141a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o};
142a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
143a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* Marker for the end of the segments[] array.  This has the value 0xFFFFFFFF,
144a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   regardless whether 'int' is 16 bit, 32 bit, or 64 bit.  */
145a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#define SEGMENTS_END ((nls_uint32) ~0)
146a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
147a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* @@ begin of epilog @@ */
148a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
149a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif	/* gettext.h  */
150