]> git.saurik.com Git - apple/libc.git/blame - nls/FreeBSD/msgcat.h
Libc-594.1.4.tar.gz
[apple/libc.git] / nls / FreeBSD / msgcat.h
CommitLineData
9385eb3d
A
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/***********************************************************
8Copyright 1990, by Alfalfa Software Incorporated, Cambridge, Massachusetts.
9
10 All Rights Reserved
11
12Permission to use, copy, modify, and distribute this software and its
13documentation for any purpose and without fee is hereby granted,
14provided that the above copyright notice appear in all copies and that
15both that copyright notice and this permission notice appear in
16supporting documentation, and that Alfalfa's name not be used in
17advertising or publicity pertaining to distribution of the software
18without specific, written prior permission.
19
20ALPHALPHA DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
21ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
22ALPHALPHA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
23ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
24WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
25ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
26SOFTWARE.
27
28If you make any modifications, bugfixes or other changes to this software
29we'd appreciate it if you could send a copy to us so we can keep things
30up-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 */
95typedef 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 */
106typedef 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 */
115typedef 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 */
131typedef 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 */
142typedef 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_ */