1 | /* $FreeBSD: src/lib/libc/nls/msgcat.h,v 1.8 2000/09/03 21:05:10 ache Exp $ */
|
---|
2 |
|
---|
3 | #ifndef _MSGCAT_H_
|
---|
4 | #define _MSGCAT_H_
|
---|
5 |
|
---|
6 |
|
---|
7 | /***********************************************************
|
---|
8 | Copyright 1990, by Alfalfa Software Incorporated, Cambridge, Massachusetts.
|
---|
9 |
|
---|
10 | All Rights Reserved
|
---|
11 |
|
---|
12 | Permission to use, copy, modify, and distribute this software and its
|
---|
13 | documentation for any purpose and without fee is hereby granted,
|
---|
14 | provided that the above copyright notice appear in all copies and that
|
---|
15 | both that copyright notice and this permission notice appear in
|
---|
16 | supporting documentation, and that Alfalfa's name not be used in
|
---|
17 | advertising or publicity pertaining to distribution of the software
|
---|
18 | without specific, written prior permission.
|
---|
19 |
|
---|
20 | ALPHALPHA DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
---|
21 | ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
---|
22 | ALPHALPHA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
---|
23 | ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
---|
24 | WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
---|
25 | ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
---|
26 | SOFTWARE.
|
---|
27 |
|
---|
28 | If you make any modifications, bugfixes or other changes to this software
|
---|
29 | we'd appreciate it if you could send a copy to us so we can keep things
|
---|
30 | up-to-date. Many thanks.
|
---|
31 | Kee Hinckley
|
---|
32 | Alfalfa Software, Inc.
|
---|
33 | 267 Allston St., #3
|
---|
34 | Cambridge, MA 02139 USA
|
---|
35 | nazgul@alfalfa.com
|
---|
36 |
|
---|
37 | ******************************************************************/
|
---|
38 |
|
---|
39 |
|
---|
40 | #include <sys/types.h>
|
---|
41 |
|
---|
42 | /*
|
---|
43 | * On disk data structures
|
---|
44 | */
|
---|
45 |
|
---|
46 | /* For or'd constants */
|
---|
47 | #define MCMakeId(s,m) (unsigned long) ( ((unsigned short)s << (sizeof(short)*8)) \
|
---|
48 | | (unsigned short)m )
|
---|
49 | #define MCSetId(id) (unsigned int) ( id >> (sizeof(short) * 8) )
|
---|
50 | #define MCMsgId(id) (unsigned int) ( (id << (sizeof(short) * 8)) \
|
---|
51 | >> (sizeof(short) * 8) )
|
---|
52 | #define MCMagicLen 8
|
---|
53 | #define MCMagic "*nazgul*"
|
---|
54 | #define MCLastMsg 0
|
---|
55 | #define MCLastSet 0
|
---|
56 |
|
---|
57 | #define MCMajorVer 1L
|
---|
58 | #define MCMinorVer 0
|
---|
59 |
|
---|
60 | /*
|
---|
61 | * Critical note here. Sets and Messages *MUST* be stored in ascending
|
---|
62 | * order. There are stored that way (by specification) in the original
|
---|
63 | * data file, however in the process of merging in new stuff you might
|
---|
64 | * mix that up. Don't! The catget stuff does a binary search and will
|
---|
65 | * totally lose it if these aren't in order (not contiguous mind you, just
|
---|
66 | * in order. If this turns out to be a major problem this could be enhanced
|
---|
67 | * by adding a 'sorted' flag to the db, and sorting msgs and sets at load
|
---|
68 | * time if things aren't sorted, but I'd like not to have to do that.
|
---|
69 | */
|
---|
70 |
|
---|
71 | /*
|
---|
72 | * I have tried here to define data structures which can be used
|
---|
73 | * while the catalog is on disk, and at runtime.
|
---|
74 | * This is rather dangerous of course, but I think it can be done without
|
---|
75 | * overly increasing the memory usage, and it makes loading and storing
|
---|
76 | * somewhat simpler and less prone to accidents. I have also tried to
|
---|
77 | * define on disk data structures which can be updated in place, so that
|
---|
78 | * with a very large catalog (e.g. all system errors) you don't have to
|
---|
79 | * load everything in memory in order to add or update one set. With
|
---|
80 | * this in mind there are "invalid" flags which allow items to be
|
---|
81 | * invalidated and thus not loaded at runtime. Note however that although
|
---|
82 | * I pay attention to these when I load the DB, I do not currently use
|
---|
83 | * them in gencat (it just reads everything into memory), so there is
|
---|
84 | * no guarantee that this will all work.
|
---|
85 | */
|
---|
86 |
|
---|
87 | /* These should be publicly available */
|
---|
88 |
|
---|
89 | #define MCLoadBySet 0 /* Load entire sets as they are used */
|
---|
90 | #define MCLoadAll 1 /* Load entire DB on catopen */
|
---|
91 |
|
---|
92 | /*
|
---|
93 | * MCOffsetT - Union to handle both disk and runtime pointers
|
---|
94 | */
|
---|
95 | typedef union {
|
---|
96 | off_t off;
|
---|
97 | char *str;
|
---|
98 | void *ptr;
|
---|
99 | struct _MCMsgT *msg;
|
---|
100 | struct _MCSetT *set;
|
---|
101 | } MCOffsetT;
|
---|
102 |
|
---|
103 | /*
|
---|
104 | * MCMsgT - Message structure (disk and runtime)
|
---|
105 | */
|
---|
106 | typedef struct _MCMsgT {
|
---|
107 | long msgId; /* Id of this message */
|
---|
108 | MCOffsetT msg; /* Relative offset on disk or pointer in memory */
|
---|
109 | long invalid; /* Valid on disk, loaded in memory */
|
---|
110 | } MCMsgT;
|
---|
111 |
|
---|
112 | /*
|
---|
113 | * MCSetT - Set structure (disk and runtime)
|
---|
114 | */
|
---|
115 | typedef struct _MCSetT {
|
---|
116 | long setId; /* Id of this set */
|
---|
117 | off_t nextSet; /* Offset of next set on disk */
|
---|
118 | union {
|
---|
119 | off_t firstMsg; /* Offset to first Msg (while on disk) */
|
---|
120 | MCMsgT *msgs; /* Pointer to array of msgs (in mem, loaded) */
|
---|
121 | } u;
|
---|
122 | MCOffsetT data; /* Offset to data, or pointer to data */
|
---|
123 | long dataLen; /* Length of data area on disk */
|
---|
124 | long numMsgs; /* Number of messages */
|
---|
125 | long invalid; /* Valid on disk, loaded in memory */
|
---|
126 | } MCSetT;
|
---|
127 |
|
---|
128 | /*
|
---|
129 | * MCCatT - Runtime catalog pointer
|
---|
130 | */
|
---|
131 | typedef struct {
|
---|
132 | long loadType; /* How to load the messages (see MSLoadType) */
|
---|
133 | FILE *fp; /* File descriptor of catalog (if load-on-demand) */
|
---|
134 | long numSets; /* Number of sets */
|
---|
135 | MCSetT *sets; /* Pointer to the sets */
|
---|
136 | off_t firstSet; /* Offset of first set on disk */
|
---|
137 | } MCCatT;
|
---|
138 |
|
---|
139 | /*
|
---|
140 | * MCHeaderT - Disk file header
|
---|
141 | */
|
---|
142 | typedef struct {
|
---|
143 | char magic[MCMagicLen]; /* Magic cookie "*nazgul*" */
|
---|
144 | long majorVer; /* ++ on incompatible changes */
|
---|
145 | long minorVer; /* ++ on compatible changes */
|
---|
146 | long flags; /* Informational flags */
|
---|
147 | long numSets; /* Number of valid Sets */
|
---|
148 | off_t firstSet; /* Offset of first set on disk */
|
---|
149 | } MCHeaderT;
|
---|
150 |
|
---|
151 | /* Some flags */
|
---|
152 | #define MC68KByteOrder 0x01
|
---|
153 | #define MCn86ByteOrder 0x02
|
---|
154 |
|
---|
155 | #endif /* !_MSGCAT_H_ */
|
---|