* The Regents of the University of California. All rights reserved.
* This code is derived from software contributed to Berkeley by
* Paul Borman at Krystal Technologies.
* %sccs.include.redist.c%
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid
[] = "@(#)rune.c 8.1 (Berkeley) %G%";
#endif /* LIBC_SCCS and not lint */
extern int _none_init
__P((_RuneLocale
*));
extern int _UTF2_init
__P((_RuneLocale
*));
extern int _EUC_init
__P((_RuneLocale
*));
static _RuneLocale
*_Read_RuneMagi
__P((FILE *));
static char *PathLocale
= 0;
* The "C" and "POSIX" locale are always here.
if (!strcmp(encoding
, "C") || !strcmp(encoding
, "POSIX")) {
_CurrentRuneLocale
= &_DefaultRuneLocale
;
if (!PathLocale
&& !(PathLocale
= getenv("PATH_LOCALE")))
PathLocale
= _PATH_LOCALE
;
sprintf(name
, "%s/%s/LC_CTYPE", PathLocale
, encoding
);
if ((fp
= fopen(name
, "r")) == NULL
)
if ((rl
= _Read_RuneMagi(fp
)) == 0) {
if (!rl
->encoding
[0] || !strcmp(rl
->encoding
, "UTF2")) {
} else if (!strcmp(rl
->encoding
, "NONE")) {
} else if (!strcmp(rl
->encoding
, "EUC")) {
if (fstat(fileno(fp
), &sb
) < 0)
if (sb
.st_size
< sizeof(_RuneLocale
))
if ((data
= malloc(sb
.st_size
)) == NULL
)
rewind(fp
); /* Someone might have read the magic number once already */
if (fread(data
, sb
.st_size
, 1, fp
) != 1) {
rl
= (_RuneLocale
*)data
;
lastp
= data
+ sb
.st_size
;
if (memcmp(rl
->magic
, _RUNE_MAGIC_1
, sizeof(rl
->magic
))) {
rl
->invalid_rune
= ntohl(rl
->invalid_rune
);
rl
->variable_len
= ntohl(rl
->variable_len
);
rl
->runetype_ext
.nranges
= ntohl(rl
->runetype_ext
.nranges
);
rl
->maplower_ext
.nranges
= ntohl(rl
->maplower_ext
.nranges
);
rl
->mapupper_ext
.nranges
= ntohl(rl
->mapupper_ext
.nranges
);
for (x
= 0; x
< _CACHED_RUNES
; ++x
) {
rl
->runetype
[x
] = ntohl(rl
->runetype
[x
]);
rl
->maplower
[x
] = ntohl(rl
->maplower
[x
]);
rl
->mapupper
[x
] = ntohl(rl
->mapupper
[x
]);
rl
->runetype_ext
.ranges
= (_RuneEntry
*)rl
->variable
;
rl
->variable
= rl
->runetype_ext
.ranges
+ rl
->runetype_ext
.nranges
;
if (rl
->variable
> lastp
) {
rl
->maplower_ext
.ranges
= (_RuneEntry
*)rl
->variable
;
rl
->variable
= rl
->maplower_ext
.ranges
+ rl
->maplower_ext
.nranges
;
if (rl
->variable
> lastp
) {
rl
->mapupper_ext
.ranges
= (_RuneEntry
*)rl
->variable
;
rl
->variable
= rl
->mapupper_ext
.ranges
+ rl
->mapupper_ext
.nranges
;
if (rl
->variable
> lastp
) {
for (x
= 0; x
< rl
->runetype_ext
.nranges
; ++x
) {
rr
= rl
->runetype_ext
.ranges
;
rr
[x
].min
= ntohl(rr
[x
].min
);
rr
[x
].max
= ntohl(rr
[x
].max
);
if ((rr
[x
].map
= ntohl(rr
[x
].map
)) == 0) {
int len
= rr
[x
].max
- rr
[x
].min
+ 1;
rr
[x
].types
= rl
->variable
;
rl
->variable
= rr
[x
].types
+ len
;
if (rl
->variable
> lastp
) {
rr
[x
].types
[len
] = ntohl(rr
[x
].types
[len
]);
for (x
= 0; x
< rl
->maplower_ext
.nranges
; ++x
) {
rr
= rl
->maplower_ext
.ranges
;
rr
[x
].min
= ntohl(rr
[x
].min
);
rr
[x
].max
= ntohl(rr
[x
].max
);
rr
[x
].map
= ntohl(rr
[x
].map
);
for (x
= 0; x
< rl
->mapupper_ext
.nranges
; ++x
) {
rr
= rl
->mapupper_ext
.ranges
;
rr
[x
].min
= ntohl(rr
[x
].min
);
rr
[x
].max
= ntohl(rr
[x
].max
);
rr
[x
].map
= ntohl(rr
[x
].map
);
if (((char *)rl
->variable
) + rl
->variable_len
> (char *)lastp
) {
* Go out and zero pointers that should be zero.
if (!rl
->runetype_ext
.nranges
)
rl
->runetype_ext
.ranges
= 0;
if (!rl
->maplower_ext
.nranges
)
rl
->maplower_ext
.ranges
= 0;
if (!rl
->mapupper_ext
.nranges
)
rl
->mapupper_ext
.ranges
= 0;
_RuneRange
*rr
= &_CurrentRuneLocale
->runetype_ext
;
_RuneEntry
*re
= rr
->ranges
;
for (x
= 0; x
< rr
->nranges
; ++x
, ++re
) {
return(re
->types
[c
- re
->min
]);
_RuneRange
*rr
= &_CurrentRuneLocale
->mapupper_ext
;
_RuneEntry
*re
= rr
->ranges
;
for (x
= 0; x
< rr
->nranges
; ++x
, ++re
) {
return(re
->map
+ c
- re
->min
);
_RuneRange
*rr
= &_CurrentRuneLocale
->maplower_ext
;
_RuneEntry
*re
= rr
->ranges
;
for (x
= 0; x
< rr
->nranges
; ++x
, ++re
) {
return(re
->map
+ c
- re
->min
);
#if !defined(_USE_CTYPE_INLINE_) && !defined(_USE_CTYPE_MACROS_)
* See comments in <machine/ansi.h>
return ((((c
& _CRMASK
) ? ___runetype(c
)
: _CurrentRuneLocale
->runetype
[c
]) & f
) ? 1 : 0);
__isctype(_BSD_RUNE_T_ c
, unsigned long f
)
return ((((c
& _CRMASK
) ? 0
: _DefaultRuneLocale
.runetype
[c
]) & f
) ? 1 : 0);
___toupper(c
) : _CurrentRuneLocale
->mapupper
[c
]);
___tolower(c
) : _CurrentRuneLocale
->maplower
[c
]);