1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#ifndef _MSGFMT_H
27#define	_MSGFMT_H
28
29#pragma ident	"%Z%%M%	%I%	%E% SMI"
30
31#include <stdint.h>
32#include <stddef.h>
33
34#ifdef	__cplusplus
35extern "C" {
36#endif
37
38/*
39 *	Sun MO file format
40 */
41
42/*
43 *
44 *		+-------------------------------+
45 *		| (int) middle message id       |
46 *		+-------------------------------+
47 *		| (int) total # of messages     |
48 *		+-------------------------------+
49 *		| (int) total msgid length      |
50 *		+-------------------------------+
51 *		| (int) total msgstr length     |
52 *		+-------------------------------+
53 *		| (int) size of msg_struct size	|
54 *		+-------------------------------+
55 *		+-------------------------------+
56 *		| (int) less                    |
57 *		+-------------------------------+
58 *		| (int) more                    |
59 *		+-------------------------------+
60 *		| (int) msgid offset            |
61 *		+-------------------------------+
62 *		| (int) msgstr offset           |
63 *		+-------------------------------+
64 *			................
65 *		+-------------------------------+
66 *		| (variable str) msgid          |
67 *		+-------------------------------+
68 *		| (variable str) msgid          |
69 *		+-------------------------------+
70 *			................
71 *		+-------------------------------+
72 *		| (variable str) msgid          |
73 *		+-------------------------------+
74 *		+-------------------------------+
75 *		| (variable str) msgstr         |
76 *		+-------------------------------+
77 *		| (variable str) msgstr         |
78 *		+-------------------------------+
79 *			................
80 *		+-------------------------------+
81 *		| (variable str) msgstr         |
82 *		+-------------------------------+
83 */
84
85struct msg_info {
86	int	msg_mid;			/* middle message id */
87	int	msg_count;			/* total # of messages */
88	int	str_count_msgid;	/* total msgid length */
89	int	str_count_msgstr;	/* total msgstr length */
90	int	msg_struct_size;	/* size of msg_struct_size */
91};
92
93struct msg_struct {
94	int	less;				/* index of left leaf */
95	int	more;				/* index of right leaf */
96	int	msgid_offset;		/* msgid offset */
97	int msgstr_offset;		/* msgstr offset */
98};
99
100#define	MSG_STRUCT_SIZE		(sizeof (struct msg_struct))
101
102/*
103 * The following is the size of the old msg_struct used be defined
104 * in usr/src/cmd/msgfmt/msgfmt.c.
105 * Old msg_struct contained:
106 * struct msg_struct {
107 *		char	*msgid;
108 *		char	*msgstr;
109 *		int	msgid_offset;
110 *		int	msgstr_offset;
111 *		struct msg_struct	*next;
112 * };
113 */
114#define	OLD_MSG_STRUCT_SIZE	20
115
116#define	LEAFINDICATOR		-99
117
118/*
119 *	GNU MO file format
120 */
121
122/*
123 *
124 *             +-----------------------------------------+
125 *           0 | (uint32_t) magic number                 |
126 *             +-----------------------------------------+
127 *           4 | (uint32_t) format revision              |
128 *             +-----------------------------------------+
129 *           8 | (uint32_t) number of strings            | == N
130 *             +-----------------------------------------+
131 *          12 | (uint32_t) offset of msgid table        | == O
132 *             +-----------------------------------------+
133 *          16 | (uint32_t) offset of msgstr table       | == T
134 *             +-----------------------------------------+
135 *          20 | (uint32_t) size of hashing table        | == S
136 *             +-----------------------------------------+
137 *          24 | (uint32_t) offset of hashing table      | == H
138 *             +-----------------------------------------+
139 *             +-----------------------------------------+
140 *           O | (uint32_t) length of 0th msgid          |
141 *             +-----------------------------------------+
142 *         O+4 | (uint32_t) offset of 0th msgid          | == M(0)
143 *             +-----------------------------------------+
144 *             ...............................
145 *             +-----------------------------------------+
146 * O+((N-1)*8) | (uint32_t) length of (N-1)th msgid      |
147 *             +-----------------------------------------+
148 * O+((N-1)*8) | (uint32_t) offset of (N-1)th msgid      | == M(N-1)
149 *       +4    +-----------------------------------------+
150 *             +-----------------------------------------+
151 *           T | (uint32_t) length of 0th msgstr         |
152 *             +-----------------------------------------+
153 *         T+4 | (uint32_t) offset of 0th msgstr         | == Q(0)
154 *             +-----------------------------------------+
155 *             ...............................
156 *             +-----------------------------------------+
157 * T+((N-1)*8) | (uint32_t) length of (N-1)th msgstr     |
158 *             +-----------------------------------------+
159 * T+((N-1)*8) | (uint32_t) offset of (N-1)th msgstr     | == Q(N-1)
160 *       +4    +-----------------------------------------+
161 *             +-----------------------------------------+
162 *           H | (uint32_t) start hashing table          |
163 *             +-----------------------------------------+
164 *             ...............................
165 *             +-----------------------------------------+
166 *   H + S * 4 | (uint32_t) end hashing table            |
167 *             +-----------------------------------------+
168 *             +-----------------------------------------+
169 *        M(0) | NULL terminated 0th msgid string        |
170 *             +-----------------------------------------+
171 *        M(1) | NULL terminated 1st msgid string        |
172 *             +-----------------------------------------+
173 *             ...............................
174 *             +-----------------------------------------+
175 *      M(N-1) | NULL terminated (N-1)th msgid string    |
176 *             +-----------------------------------------+
177 *             +-----------------------------------------+
178 *        Q(0) | NULL terminated 0th msgstr string       |
179 *             +-----------------------------------------+
180 *        Q(1) | NULL terminated 1st msgstr string       |
181 *             +-----------------------------------------+
182 *             ...............................
183 *             +-----------------------------------------+
184 *      Q(N-1) | NULL terminated (N-1)th msgstr string   |
185 *             +-----------------------------------------+
186 */
187
188/*
189 *	GNU MO file format (Revision 1)
190 */
191/*
192 *
193 *             +-----------------------------------------------+
194 *           0 | (uint32_t) magic number                       |
195 *             +-----------------------------------------------+
196 *           4 | (uint32_t) format revision                    |
197 *             +-----------------------------------------------+
198 *           8 | (uint32_t) number of strings                  | == N
199 *             +-----------------------------------------------+
200 *          12 | (uint32_t) offset of msgid table              | == O
201 *             +-----------------------------------------------+
202 *          16 | (uint32_t) offset of msgstr table             | == T
203 *             +-----------------------------------------------+
204 *          20 | (uint32_t) size of hashing table              | == S
205 *             +-----------------------------------------------+
206 *          24 | (uint32_t) offset of hashing table            | == H
207 *             +-----------------------------------------------+
208 *          32 | (uint32_t) number of dynamic macros           | == M
209 *             +-----------------------------------------------+
210 *          36 | (uint32_t) offset of dynamic macros           | == P
211 *             +-----------------------------------------------+
212 *          40 | (uint32_t) number of dynamic strings          | == D
213 *             +-----------------------------------------------+
214 *          44 | (uint32_t) offset of dynamic msgid tbl        | == A
215 *             +-----------------------------------------------+
216 *          48 | (uint32_t) offset of dynamic msgstr tbl       | == B
217 *             +-----------------------------------------------+
218 *             +-----------------------------------------------+
219 *           O | (uint32_t) length of 0th msgid                |
220 *             +-----------------------------------------------+
221 *         O+4 | (uint32_t) offset of 0th msgid                | == M(0)
222 *             +-----------------------------------------------+
223 *             ...............................
224 *             +-----------------------------------------------+
225 * O+((N-1)*8) | (uint32_t) length of (N-1)th msgid            |
226 *             +-----------------------------------------------+
227 * O+((N-1)*8) | (uint32_t) offset of (N-1)th msgid            | == M(N-1)
228 *       +4    +-----------------------------------------------+
229 *             +-----------------------------------------------+
230 *           T | (uint32_t) length of 0th msgstr               |
231 *             +-----------------------------------------------+
232 *         T+4 | (uint32_t) offset of 0th msgstr               | == Q(0)
233 *             +-----------------------------------------------+
234 *             ...............................
235 *             +-----------------------------------------------+
236 * T+((N-1)*8) | (uint32_t) length of (N-1)th msgstr           |
237 *             +-----------------------------------------------+
238 * T+((N-1)*8) | (uint32_t) offset of (N-1)th msgstr           | == Q(N-1)
239 *       +4    +-----------------------------------------------+
240 *             +-----------------------------------------------+
241 *           H | (uint32_t) start hashing table                |
242 *             +-----------------------------------------------+
243 *             ...............................
244 *             +-----------------------------------------------+
245 *   H + S * 4 | (uint32_t) end hashing table                  |
246 *             +-----------------------------------------------+
247 *             +-----------------------------------------------+
248 *           P | (uint32_t) length of 0th macro                |
249 *             +-----------------------------------------------+
250 *         P+4 | (uint32_t) offset of 0th macro                | == C(0)
251 *             +-----------------------------------------------+
252 *             ...............................
253 *             +-----------------------------------------------+
254 * P+((M-1)*8) | (uint32_t) length of (M-1)th macro            |
255 *             +-----------------------------------------------+
256 * P+((M-1)*8) | (uint32_t) offset of (M-1)th macro            | == C(M-1)
257 *       +4    +-----------------------------------------------+
258 *             +-----------------------------------------------+
259 *           A | (uint32_t) offset of 0th d_msgid              | == L(0)
260 *             +-----------------------------------------------+
261 *             ...............................
262 *             +-----------------------------------------------+
263 * A+((D-1)*4) | (uint32_t) offset of (D-1)th d_msgid          | == L(D-1)
264 *             +-----------------------------------------------+
265 *             +-----------------------------------------------+
266 *           B | (uint32_t) offset of 0th d_msgstr             | == E(0)
267 *             +-----------------------------------------------+
268 *             ...............................
269 *             +-----------------------------------------------+
270 * B+((D-1)*4) | (uint32_t) offset of (D-1)th d_msgstr         | == E(D-1)
271 *             +-----------------------------------------------+
272 *             +-----------------------------------------------+
273 *        L(0) | (uint32_t) offset of 0th d_msgid message      | == F(0)
274 *             +-----------------------------------------------+
275 *      L(0)+4 | (uint32_t) length of 0th fixed substring      |
276 *             +-----------------------------------------------+
277 *      L(0)+8 | (uint32_t) index to a dynamic macro           |
278 *             +-----------------------------------------------+
279 *             ...............................
280 *             +-----------------------------------------------+
281 *     L(0)+4+ | (uint32_t) length of (m-1)th fixed substring  |
282 *   ((m-1)*8) +-----------------------------------------------+
283 *     L(0)+8+ | (uint32_t) NOMORE_DYNAMIC_STR                 |
284 *   ((m-1)*8) +-----------------------------------------------+
285 *             +-----------------------------------------------+
286 *      L(D-1) | (uint32_t) offset of 0th d_msgid message      | == F(D-1)
287 *             +-----------------------------------------------+
288 *    L(D-1)+4 | (uint32_t) length of 0th fixed substring      |
289 *             +-----------------------------------------------+
290 *    L(D-1)+8 | (uint32_t) index to a dynamic macro           |
291 *             +-----------------------------------------------+
292 *             ...............................
293 *             +-----------------------------------------------+
294 *    L(D-1)+4 | (uint32_t) length of (m-1)th fixed substring  |
295 *   ((m-1)*8) +-----------------------------------------------+
296 *    L(D-1)+8 | (uint32_t) NOMORE_DYNAMIC_STR                 |
297 *   ((m-1)*8) +-----------------------------------------------+
298 *             +-----------------------------------------------+
299 *        E(0) | (uint32_t) offset of 0th d_msgstr message     | == G(0)
300 *             +-----------------------------------------------+
301 *      E(0)+4 | (uint32_t) length of 0th fixed substring      |
302 *             +-----------------------------------------------+
303 *      E(0)+8 | (uint32_t) index to a dynamic macro           |
304 *             +-----------------------------------------------+
305 *             ...............................
306 *             +-----------------------------------------------+
307 *     E(0)+4+ | (uint32_t) length of (m-1)th fixed substring  |
308 *   ((m-1)*8) +-----------------------------------------------+
309 *     E(0)+8+ | (uint32_t) NOMORE_DYNAMIC_STR                 |
310 *   ((m-1)*8) +-----------------------------------------------+
311 *             +-----------------------------------------------+
312 *      E(D-1) | (uint32_t) offset of 0th d_msgstr message     | == G(D-1)
313 *             +-----------------------------------------------+
314 *    E(D-1)+4 | (uint32_t) length of 0th fixed substring      |
315 *             +-----------------------------------------------+
316 *    E(D-1)+8 | (uint32_t) index to a dynamic macro           |
317 *             +-----------------------------------------------+
318 *             ...............................
319 *             +-----------------------------------------------+
320 *    E(D-1)+4 | (uint32_t) length of (m-1)th fixed substring  |
321 *   ((m-1)*8) +-----------------------------------------------+
322 *    E(D-1)+8 | (uint32_t) NOMORE_DYNAMIC_STR                 |
323 *   ((m-1)*8) +-----------------------------------------------+
324 *             +-----------------------------------------------+
325 *        M(0) | NULL terminated 0th msgid string              |
326 *             +-----------------------------------------------+
327 *        M(1) | NULL terminated 1st msgid string              |
328 *             +-----------------------------------------------+
329 *             ...............................
330 *             +-----------------------------------------------+
331 *      M(N-1) | NULL terminated (N-1)th msgid string          |
332 *             +-----------------------------------------------+
333 *        Q(0) | NULL terminated 0th msgstr string             |
334 *             +-----------------------------------------------+
335 *        Q(1) | NULL terminated 1st msgstr string             |
336 *             +-----------------------------------------------+
337 *             ...............................
338 *             +-----------------------------------------------+
339 *      Q(N-1) | NULL terminated (N-1)th msgstr string         |
340 *             +-----------------------------------------------+
341 *             +-----------------------------------------------+
342 *        C(0) | NULL terminated 0th macro                     |
343 *             +-----------------------------------------------+
344 *             ...............................
345 *             +-----------------------------------------------+
346 *      C(M-1) | NULL terminated (M-1)th macro                 |
347 *             +-----------------------------------------------+
348 *             +-----------------------------------------------+
349 *        F(0) | NULL terminated 0th dynamic msgid string      |
350 *             +-----------------------------------------------+
351 *             ...............................
352 *             +-----------------------------------------------+
353 *      F(D-1) | NULL terminated (D-1)th dynamic msgid string  |
354 *             +-----------------------------------------------+
355 *             +-----------------------------------------------+
356 *        G(0) | NULL terminated 0th dynamic msgstr string     |
357 *             +-----------------------------------------------+
358 *             ...............................
359 *             +-----------------------------------------------+
360 *      G(D-1) | NULL terminated (D-1)th dynamic msgstr string |
361 *             +-----------------------------------------------+
362 */
363
364#define	GNU_MAGIC			0x950412de
365#define	GNU_MAGIC_SWAPPED		0xde120495
366#define	GNU_REVISION			0
367#define	GNU_REVISION_0_0		0
368#define	GNU_REVISION_0_0_SWAPPED	0
369#define	GNU_REVISION_0_1		0x00000001
370#define	GNU_REVISION_0_1_SWAPPED	0x01000000
371#define	GNU_REVISION_1_1		0x00010001
372#define	GNU_REVISION_1_1_SWAPPED	0x01000100
373#define	NOMORE_DYNAMIC_MACRO		0xffffffff
374
375enum gnu_msgidstr {
376	MSGID = 0,
377	MSGSTR = 1
378};
379
380struct gnu_msg_info {
381	uint32_t	magic;
382	uint32_t	revision;
383	uint32_t	num_of_str;
384	uint32_t	off_msgid_tbl;
385	uint32_t	off_msgstr_tbl;
386	uint32_t	sz_hashtbl;
387	uint32_t	off_hashtbl;
388};
389
390struct gnu_msg_rev1_info {
391	uint32_t	num_of_dynamic_macro;
392	uint32_t	off_dynamic_macro;
393	uint32_t	num_of_dynamic_str;
394	uint32_t	off_dynamic_msgid_tbl;
395	uint32_t	off_dynamic_msgstr_tbl;
396};
397
398struct gnu_msg_ent {
399	uint32_t	len;
400	uint32_t	offset;
401};
402
403struct gnu_dynamic_ent {
404	uint32_t	len;
405	uint32_t	idx;
406};
407
408struct gnu_dynamic_tbl {
409	uint32_t	offset;
410	struct gnu_dynamic_ent	entry[1];
411};
412
413#ifdef	__cplusplus
414}
415#endif
416
417#endif /* _MSGFMT_H */
418