1 1.12 junyoung /* $NetBSD: libintl_local.h,v 1.12 2007/09/25 08:22:44 junyoung Exp $ */ 2 1.1 itojun 3 1.1 itojun /*- 4 1.5 minoura * Copyright (c) 2000, 2001 Citrus Project, 5 1.1 itojun * All rights reserved. 6 1.1 itojun * 7 1.1 itojun * Redistribution and use in source and binary forms, with or without 8 1.1 itojun * modification, are permitted provided that the following conditions 9 1.1 itojun * are met: 10 1.1 itojun * 1. Redistributions of source code must retain the above copyright 11 1.1 itojun * notice, this list of conditions and the following disclaimer. 12 1.1 itojun * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 itojun * notice, this list of conditions and the following disclaimer in the 14 1.1 itojun * documentation and/or other materials provided with the distribution. 15 1.1 itojun * 16 1.1 itojun * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17 1.1 itojun * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 1.1 itojun * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 1.1 itojun * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20 1.1 itojun * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 1.1 itojun * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 1.1 itojun * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 1.1 itojun * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 1.1 itojun * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 1.1 itojun * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 1.1 itojun * SUCH DAMAGE. 27 1.6 yamt * 28 1.6 yamt * $Citrus: xpg4dl/FreeBSD/lib/libintl/libintl_local.h,v 1.13 2001/09/27 15:18:45 yamt Exp $ 29 1.1 itojun */ 30 1.1 itojun 31 1.1 itojun #define MO_MAGIC 0x950412de 32 1.1 itojun #define MO_MAGIC_SWAPPED 0xde120495 33 1.8 tshiozak #define MO_GET_REV_MAJOR(r) (((r) >> 16) & 0xFFFF) 34 1.8 tshiozak #define MO_GET_REV_MINOR(r) ((r) & 0xFFFF) 35 1.8 tshiozak #define MO_MAKE_REV(maj, min) (((maj) << 16) | (min)) 36 1.1 itojun 37 1.6 yamt #define GETTEXT_MMAP_MAX (1024 * 1024) /*XXX*/ 38 1.2 itojun 39 1.2 itojun #define DEFAULT_DOMAINNAME "messages" 40 1.1 itojun 41 1.1 itojun /* *.mo file format */ 42 1.1 itojun struct mo { 43 1.11 junyoung uint32_t mo_magic; /* determines endian */ 44 1.11 junyoung uint32_t mo_revision; /* file format revision: 0 */ 45 1.11 junyoung uint32_t mo_nstring; /* N: number of strings */ 46 1.11 junyoung uint32_t mo_otable; /* O: original text table offset */ 47 1.11 junyoung uint32_t mo_ttable; /* T: translated text table offset */ 48 1.11 junyoung uint32_t mo_hsize; /* S: size of hashing table */ 49 1.11 junyoung uint32_t mo_hoffset; /* H: offset of hashing table */ 50 1.8 tshiozak /* rev 0.1 / 1.1 */ 51 1.8 tshiozak /* system dependent string support */ 52 1.11 junyoung uint32_t mo_sysdep_nsegs; /* number of sysdep segments */ 53 1.11 junyoung uint32_t mo_sysdep_segoff; /* offset of sysdep segment table */ 54 1.11 junyoung uint32_t mo_sysdep_nstring; /* number of strings */ 55 1.11 junyoung uint32_t mo_sysdep_otable; /* offset of original text table */ 56 1.11 junyoung uint32_t mo_sysdep_ttable; /* offset of translated text table */ 57 1.12 junyoung } __packed; 58 1.1 itojun 59 1.1 itojun struct moentry { 60 1.11 junyoung uint32_t len; /* strlen(str), so region will be len + 1 */ 61 1.11 junyoung uint32_t off; /* offset of \0-terminated string */ 62 1.12 junyoung } __packed; 63 1.1 itojun 64 1.9 tshiozak struct mosysdepsegentry { 65 1.11 junyoung uint32_t len; /* length of this part */ 66 1.11 junyoung uint32_t ref; /* reference number of the sysdep string, 67 1.9 tshiozak * concatenated just after this segment. 68 1.9 tshiozak */ 69 1.12 junyoung } __packed; 70 1.9 tshiozak #define MO_LASTSEG (0xFFFFFFFF) 71 1.9 tshiozak 72 1.9 tshiozak struct mosysdepstr { 73 1.11 junyoung uint32_t off; /* offset of seed text */ 74 1.9 tshiozak struct mosysdepsegentry segs[1]; /* text segments */ 75 1.12 junyoung } __packed; 76 1.8 tshiozak 77 1.1 itojun /* libintl internal data format */ 78 1.1 itojun struct moentry_h { 79 1.1 itojun size_t len; /* strlen(str), so region will be len + 1 */ 80 1.1 itojun char *off; /* offset of \0-terminated string */ 81 1.1 itojun }; 82 1.1 itojun 83 1.9 tshiozak struct mosysdepsegs_h { 84 1.9 tshiozak const char *str; 85 1.9 tshiozak size_t len; 86 1.9 tshiozak }; 87 1.9 tshiozak 88 1.9 tshiozak struct mosysdepsegentry_h { 89 1.11 junyoung uint32_t len; 90 1.11 junyoung uint32_t ref; 91 1.9 tshiozak }; 92 1.9 tshiozak 93 1.9 tshiozak struct mosysdepstr_h { 94 1.9 tshiozak const char *off; /* offset of the base string */ 95 1.9 tshiozak char *expanded; /* expanded string */ 96 1.9 tshiozak size_t expanded_len; /* length of expanded string */ 97 1.9 tshiozak struct mosysdepsegentry_h segs[1]; /* text segments */ 98 1.9 tshiozak }; 99 1.9 tshiozak 100 1.10 tshiozak struct gettext_plural; 101 1.1 itojun struct mo_h { 102 1.11 junyoung uint32_t mo_magic; /* determines endian */ 103 1.11 junyoung uint32_t mo_revision; /* file format revision: 0 */ 104 1.11 junyoung uint32_t mo_nstring; /* N: number of strings */ 105 1.1 itojun struct moentry_h *mo_otable; /* O: original text table offset */ 106 1.1 itojun struct moentry_h *mo_ttable; /* T: translated text table offset */ 107 1.1 itojun const char *mo_header; 108 1.10 tshiozak struct gettext_plural *mo_plural; 109 1.10 tshiozak unsigned long mo_nplurals; 110 1.1 itojun char *mo_charset; 111 1.11 junyoung uint32_t mo_hsize; /* S: size of hashing table */ 112 1.11 junyoung uint32_t *mo_htable; /* H: hashing table */ 113 1.9 tshiozak #define MO_HASH_SYSDEP_MASK 0x80000000 /* means sysdep entry */ 114 1.9 tshiozak 115 1.11 junyoung uint32_t mo_flags; 116 1.9 tshiozak #define MO_F_SYSDEP 0x00000001 /* enable sysdep string support */ 117 1.9 tshiozak 118 1.9 tshiozak /* system dependent string support */ 119 1.11 junyoung uint32_t mo_sysdep_nsegs; /* number of sysdep segments */ 120 1.11 junyoung uint32_t mo_sysdep_nstring; /* number of sysdep strings */ 121 1.9 tshiozak struct mosysdepsegs_h *mo_sysdep_segs; /* sysdep segment table */ 122 1.9 tshiozak struct mosysdepstr_h **mo_sysdep_otable; /* original text */ 123 1.9 tshiozak struct mosysdepstr_h **mo_sysdep_ttable; /* translated text */ 124 1.1 itojun }; 125 1.1 itojun 126 1.9 tshiozak 127 1.1 itojun struct mohandle { 128 1.1 itojun void *addr; /* mmap'ed region */ 129 1.1 itojun size_t len; 130 1.1 itojun struct mo_h mo; /* endian-flipped mo file header */ 131 1.1 itojun }; 132 1.4 itojun 133 1.4 itojun struct domainbinding { 134 1.4 itojun struct domainbinding *next; 135 1.4 itojun char domainname[PATH_MAX]; 136 1.4 itojun char path[PATH_MAX]; 137 1.7 yamt char *codeset; 138 1.5 minoura struct mohandle mohandle; 139 1.4 itojun }; 140 1.4 itojun 141 1.5 minoura extern struct domainbinding *__bindings; 142 1.5 minoura extern char __current_domainname[PATH_MAX]; 143 1.7 yamt 144 1.8 tshiozak __BEGIN_DECLS 145 1.11 junyoung const char *__gettext_iconv(const char *, struct domainbinding *); 146 1.11 junyoung uint32_t __intl_string_hash(const char *); 147 1.11 junyoung const char *__intl_sysdep_get_string_by_tag(const char *, size_t *); 148 1.8 tshiozak __END_DECLS 149