xref: /illumos-gate/usr/src/lib/libc/inc/msgfmt.h (revision 982b4ad2dc6b5ed2a2c8c1670e94ecf1fe63fc56)
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
35 extern "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 
85 struct 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 
93 struct 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 
375 enum gnu_msgidstr {
376 	MSGID = 0,
377 	MSGSTR = 1
378 };
379 
380 struct 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 
390 struct 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 
398 struct gnu_msg_ent {
399 	uint32_t	len;
400 	uint32_t	offset;
401 };
402 
403 struct gnu_dynamic_ent {
404 	uint32_t	len;
405 	uint32_t	idx;
406 };
407 
408 struct 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