]>
git.saurik.com Git - apple/libc.git/blob - locale/FreeBSD/rune.c
b67d9e9f270615952f2db33a299ee083b934ced3
3 * The Regents of the University of California. All rights reserved.
5 * This code is derived from software contributed to Berkeley by
6 * Paul Borman at Krystal Technologies.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by the University of
19 * California, Berkeley and its contributors.
20 * 4. Neither the name of the University nor the names of its contributors
21 * may be used to endorse or promote products derived from this software
22 * without specific prior written permission.
24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37 #if defined(LIBC_SCCS) && !defined(lint)
38 static char sccsid
[] = "@(#)rune.c 8.1 (Berkeley) 6/4/93";
39 #endif /* LIBC_SCCS and not lint */
40 #include <sys/cdefs.h>
41 __FBSDID("$FreeBSD: src/lib/libc/locale/rune.c,v 1.10 2002/08/09 08:22:29 ache Exp $");
43 #include "namespace.h"
44 #include <arpa/inet.h>
50 #include <sys/types.h>
52 #include "un-namespace.h"
65 if (_fstat(fileno(fp
), &sb
) < 0)
68 if (sb
.st_size
< sizeof(_RuneLocale
)) {
73 if ((data
= malloc(sb
.st_size
)) == NULL
)
77 rewind(fp
); /* Someone might have read the magic number once already */
85 if (fread(data
, sb
.st_size
, 1, fp
) != 1) {
92 rl
= (_RuneLocale
*)data
;
93 lastp
= data
+ sb
.st_size
;
95 rl
->variable
= rl
+ 1;
97 if (memcmp(rl
->magic
, _RUNE_MAGIC_1
, sizeof(rl
->magic
))) {
103 rl
->invalid_rune
= ntohl(rl
->invalid_rune
);
104 rl
->variable_len
= ntohl(rl
->variable_len
);
105 rl
->runetype_ext
.nranges
= ntohl(rl
->runetype_ext
.nranges
);
106 rl
->maplower_ext
.nranges
= ntohl(rl
->maplower_ext
.nranges
);
107 rl
->mapupper_ext
.nranges
= ntohl(rl
->mapupper_ext
.nranges
);
109 for (x
= 0; x
< _CACHED_RUNES
; ++x
) {
110 rl
->runetype
[x
] = ntohl(rl
->runetype
[x
]);
111 rl
->maplower
[x
] = ntohl(rl
->maplower
[x
]);
112 rl
->mapupper
[x
] = ntohl(rl
->mapupper
[x
]);
115 rl
->runetype_ext
.ranges
= (_RuneEntry
*)rl
->variable
;
116 rl
->variable
= rl
->runetype_ext
.ranges
+ rl
->runetype_ext
.nranges
;
117 if (rl
->variable
> lastp
) {
123 rl
->maplower_ext
.ranges
= (_RuneEntry
*)rl
->variable
;
124 rl
->variable
= rl
->maplower_ext
.ranges
+ rl
->maplower_ext
.nranges
;
125 if (rl
->variable
> lastp
) {
131 rl
->mapupper_ext
.ranges
= (_RuneEntry
*)rl
->variable
;
132 rl
->variable
= rl
->mapupper_ext
.ranges
+ rl
->mapupper_ext
.nranges
;
133 if (rl
->variable
> lastp
) {
139 for (x
= 0; x
< rl
->runetype_ext
.nranges
; ++x
) {
140 rr
= rl
->runetype_ext
.ranges
;
142 rr
[x
].min
= ntohl(rr
[x
].min
);
143 rr
[x
].max
= ntohl(rr
[x
].max
);
144 if ((rr
[x
].map
= ntohl(rr
[x
].map
)) == 0) {
145 int len
= rr
[x
].max
- rr
[x
].min
+ 1;
146 rr
[x
].types
= rl
->variable
;
147 rl
->variable
= rr
[x
].types
+ len
;
148 if (rl
->variable
> lastp
) {
154 rr
[x
].types
[len
] = ntohl(rr
[x
].types
[len
]);
159 for (x
= 0; x
< rl
->maplower_ext
.nranges
; ++x
) {
160 rr
= rl
->maplower_ext
.ranges
;
162 rr
[x
].min
= ntohl(rr
[x
].min
);
163 rr
[x
].max
= ntohl(rr
[x
].max
);
164 rr
[x
].map
= ntohl(rr
[x
].map
);
167 for (x
= 0; x
< rl
->mapupper_ext
.nranges
; ++x
) {
168 rr
= rl
->mapupper_ext
.ranges
;
170 rr
[x
].min
= ntohl(rr
[x
].min
);
171 rr
[x
].max
= ntohl(rr
[x
].max
);
172 rr
[x
].map
= ntohl(rr
[x
].map
);
174 if (((char *)rl
->variable
) + rl
->variable_len
> (char *)lastp
) {
181 * Go out and zero pointers that should be zero.
183 if (!rl
->variable_len
)
186 if (!rl
->runetype_ext
.nranges
)
187 rl
->runetype_ext
.ranges
= 0;
189 if (!rl
->maplower_ext
.nranges
)
190 rl
->maplower_ext
.ranges
= 0;
192 if (!rl
->mapupper_ext
.nranges
)
193 rl
->mapupper_ext
.ranges
= 0;