gmo.h revision a04eba3f8868af1d9b7b504d3d430c55ed3dc777
1a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* Description of GNU message catalog format: general file layout.
2a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   Copyright (C) 1995, 1997, 2000-2002 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
32a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
33a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* The following contortions are an attempt to use the C preprocessor
34a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   to determine an unsigned integral type that is 32 bits wide.  An
35a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
36a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   as of version autoconf-2.13, the AC_CHECK_SIZEOF macro doesn't work
37a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   when cross-compiling.  */
38a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
39a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if __STDC__
40a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define UINT_MAX_32_BITS 4294967295U
41a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#else
42a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define UINT_MAX_32_BITS 0xFFFFFFFF
43a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif
44a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
45a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* If UINT_MAX isn't defined, assume it's a 32-bit type.
46a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   This should be valid for all systems GNU cares about because
47a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   that doesn't include 16-bit systems, and only modern systems
48a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   (that certainly have <limits.h>) have 64+-bit integral types.  */
49a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
50a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#ifndef UINT_MAX
51a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# define UINT_MAX UINT_MAX_32_BITS
52a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif
53a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
54a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#if UINT_MAX == UINT_MAX_32_BITS
55a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'otypedef unsigned nls_uint32;
56a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#else
57a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# if USHRT_MAX == UINT_MAX_32_BITS
58a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'otypedef unsigned short nls_uint32;
59a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# else
60a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#  if ULONG_MAX == UINT_MAX_32_BITS
61a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'otypedef unsigned long nls_uint32;
62a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#  else
63a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* The following line is intended to throw an error.  Using #error is
64a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o     not portable enough.  */
65a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  "Cannot determine unsigned 32-bit data type."
66a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#  endif
67a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o# endif
68a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif
69a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
70a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
71a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* Header for binary .mo file format.  */
72a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'ostruct mo_file_header
73a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o{
74a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* The magic number.  */
75a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 magic;
76a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* The revision number of the file format.  */
77a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 revision;
78a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
79a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* The following are only used in .mo files with major revision 0.  */
80a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
81a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* The number of strings pairs.  */
82a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 nstrings;
83a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* Offset of table with start offsets of original strings.  */
84a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 orig_tab_offset;
85a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* Offset of table with start offsets of translated strings.  */
86a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 trans_tab_offset;
87a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* Size of hash table.  */
88a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 hash_tab_size;
89a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* Offset of first hash table entry.  */
90a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 hash_tab_offset;
91a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
92a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* The following are only used in .mo files with minor revision >= 1.  */
93a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
94a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* The number of system dependent segments.  */
95a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 n_sysdep_segments;
96a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* Offset of table describing system dependent segments.  */
97a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 sysdep_segments_offset;
98a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* The number of system dependent strings pairs.  */
99a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 n_sysdep_strings;
100a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* Offset of table with start offsets of original sysdep strings.  */
101a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 orig_sysdep_tab_offset;
102a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* Offset of table with start offsets of translated sysdep strings.  */
103a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 trans_sysdep_tab_offset;
104a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o};
105a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
106a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* Descriptor for static string contained in the binary .mo file.  */
107a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'ostruct string_desc
108a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o{
109a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* Length of addressed string, not including the trailing NUL.  */
110a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 length;
111a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* Offset of string in file.  */
112a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 offset;
113a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o};
114a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
115a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* The following are only used in .mo files with minor revision >= 1.  */
116a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
117a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* Descriptor for system dependent string segment.  */
118a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'ostruct sysdep_segment
119a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o{
120a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* Length of addressed string, including the trailing NUL.  */
121a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 length;
122a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* Offset of string in file.  */
123a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 offset;
124a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o};
125a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
126a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* Descriptor for system dependent string.  */
127a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'ostruct sysdep_string
128a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o{
129a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* Offset of static string segments in file.  */
130a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  nls_uint32 offset;
131a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  /* Alternating sequence of static and system dependent segments.
132a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o     The last segment is a static segment, including the trailing NUL.  */
133a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  struct segment_pair
134a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  {
135a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o    /* Size of static segment.  */
136a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o    nls_uint32 segsize;
137a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o    /* Reference to system dependent string segment, or ~0 at the end.  */
138a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o    nls_uint32 sysdepref;
139a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o  } segments[1];
140a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o};
141a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
142a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* Marker for the end of the segments[] array.  This has the value 0xFFFFFFFF,
143a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o   regardless whether 'int' is 16 bit, 32 bit, or 64 bit.  */
144a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#define SEGMENTS_END ((nls_uint32) ~0)
145a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
146a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o/* @@ begin of epilog @@ */
147a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o
148a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif	/* gettext.h  */
149