]>
git.saurik.com Git - apple/libc.git/blob - locale/rune.c
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
36 * $FreeBSD: src/lib/libc/locale/rune.c,v 1.5.8.1 2001/03/05 10:26:02 obrien Exp $
39 #if defined(LIBC_SCCS) && !defined(lint)
40 static char sccsid
[] = "@(#)rune.c 8.1 (Berkeley) 6/4/93";
41 #endif /* LIBC_SCCS and not lint */
47 #include <sys/types.h>
61 if (fstat(fileno(fp
), &sb
) < 0)
64 if (sb
.st_size
< sizeof(_RuneLocale
))
67 if ((data
= malloc(sb
.st_size
)) == NULL
)
70 rewind(fp
); /* Someone might have read the magic number once already */
72 if (fread(data
, sb
.st_size
, 1, fp
) != 1) {
77 rl
= (_RuneLocale
*)data
;
78 lastp
= data
+ sb
.st_size
;
80 rl
->variable
= rl
+ 1;
82 if (memcmp(rl
->magic
, _RUNE_MAGIC_1
, sizeof(rl
->magic
))) {
87 rl
->invalid_rune
= ntohl(rl
->invalid_rune
);
88 rl
->variable_len
= ntohl(rl
->variable_len
);
89 rl
->runetype_ext
.nranges
= ntohl(rl
->runetype_ext
.nranges
);
90 rl
->maplower_ext
.nranges
= ntohl(rl
->maplower_ext
.nranges
);
91 rl
->mapupper_ext
.nranges
= ntohl(rl
->mapupper_ext
.nranges
);
93 for (x
= 0; x
< _CACHED_RUNES
; ++x
) {
94 rl
->runetype
[x
] = ntohl(rl
->runetype
[x
]);
95 rl
->maplower
[x
] = ntohl(rl
->maplower
[x
]);
96 rl
->mapupper
[x
] = ntohl(rl
->mapupper
[x
]);
99 rl
->runetype_ext
.ranges
= (_RuneEntry
*)rl
->variable
;
100 rl
->variable
= rl
->runetype_ext
.ranges
+ rl
->runetype_ext
.nranges
;
101 if (rl
->variable
> lastp
) {
106 rl
->maplower_ext
.ranges
= (_RuneEntry
*)rl
->variable
;
107 rl
->variable
= rl
->maplower_ext
.ranges
+ rl
->maplower_ext
.nranges
;
108 if (rl
->variable
> lastp
) {
113 rl
->mapupper_ext
.ranges
= (_RuneEntry
*)rl
->variable
;
114 rl
->variable
= rl
->mapupper_ext
.ranges
+ rl
->mapupper_ext
.nranges
;
115 if (rl
->variable
> lastp
) {
120 for (x
= 0; x
< rl
->runetype_ext
.nranges
; ++x
) {
121 rr
= rl
->runetype_ext
.ranges
;
123 rr
[x
].min
= ntohl(rr
[x
].min
);
124 rr
[x
].max
= ntohl(rr
[x
].max
);
125 if ((rr
[x
].map
= ntohl(rr
[x
].map
)) == 0) {
126 int len
= rr
[x
].max
- rr
[x
].min
+ 1;
127 rr
[x
].types
= rl
->variable
;
128 rl
->variable
= rr
[x
].types
+ len
;
129 if (rl
->variable
> lastp
) {
134 rr
[x
].types
[len
] = ntohl(rr
[x
].types
[len
]);
139 for (x
= 0; x
< rl
->maplower_ext
.nranges
; ++x
) {
140 rr
= rl
->maplower_ext
.ranges
;
142 rr
[x
].min
= ntohl(rr
[x
].min
);
143 rr
[x
].max
= ntohl(rr
[x
].max
);
144 rr
[x
].map
= ntohl(rr
[x
].map
);
147 for (x
= 0; x
< rl
->mapupper_ext
.nranges
; ++x
) {
148 rr
= rl
->mapupper_ext
.ranges
;
150 rr
[x
].min
= ntohl(rr
[x
].min
);
151 rr
[x
].max
= ntohl(rr
[x
].max
);
152 rr
[x
].map
= ntohl(rr
[x
].map
);
154 if (((char *)rl
->variable
) + rl
->variable_len
> (char *)lastp
) {
160 * Go out and zero pointers that should be zero.
162 if (!rl
->variable_len
)
165 if (!rl
->runetype_ext
.nranges
)
166 rl
->runetype_ext
.ranges
= 0;
168 if (!rl
->maplower_ext
.nranges
)
169 rl
->maplower_ext
.ranges
= 0;
171 if (!rl
->mapupper_ext
.nranges
)
172 rl
->mapupper_ext
.ranges
= 0;