Home | History | Annotate | Download | only in inc
      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