diff options
author | ache <ache@FreeBSD.org> | 1995-10-23 01:34:17 +0000 |
---|---|---|
committer | ache <ache@FreeBSD.org> | 1995-10-23 01:34:17 +0000 |
commit | 6ee0412bd842c62fa5a2d0cc7b5d9a09ea7305b1 (patch) | |
tree | df3d9138c260a0dd995cf571fe1f86075fc381a2 /lib/libc/locale/rune.c | |
parent | 7bae034de0c258030d15c9a5c797a7cbf0363b89 (diff) | |
download | FreeBSD-src-6ee0412bd842c62fa5a2d0cc7b5d9a09ea7305b1.zip FreeBSD-src-6ee0412bd842c62fa5a2d0cc7b5d9a09ea7305b1.tar.gz |
Migrate from XPG4 to XPG3 (libxpg4 will be added soon)
Remove big part of my startup_setlocale hack.
Add missing manpage links.
Diffstat (limited to 'lib/libc/locale/rune.c')
-rw-r--r-- | lib/libc/locale/rune.c | 171 |
1 files changed, 122 insertions, 49 deletions
diff --git a/lib/libc/locale/rune.c b/lib/libc/locale/rune.c index 8075825..2c9c7a7 100644 --- a/lib/libc/locale/rune.c +++ b/lib/libc/locale/rune.c @@ -38,70 +38,143 @@ static char sccsid[] = "@(#)rune.c 8.1 (Berkeley) 6/4/93"; #endif /* LIBC_SCCS and not lint */ -#include <ctype.h> -#include <errno.h> -#include <limits.h> #include <rune.h> #include <stdio.h> +#include <string.h> #include <stdlib.h> -#include "common_rune.h" +#include <sys/types.h> +#include <sys/stat.h> -char *_PathLocale; - -extern int _none_init __P((_RuneLocale *)); -extern int _UTF2_init __P((_RuneLocale *)); -extern int _EUC_init __P((_RuneLocale *)); - -int -setrunelocale(encoding) - char *encoding; +void +setinvalidrune(ir) + rune_t ir; { + _INVALID_RUNE = ir; +} + +_RuneLocale * +_Read_RuneMagi(fp) FILE *fp; - char name[PATH_MAX]; +{ + char *data; + void *lastp; _RuneLocale *rl; + _RuneEntry *rr; + struct stat sb; + int x; - if (!encoding) - return(EFAULT); + if (fstat(fileno(fp), &sb) < 0) + return(0); - /* - * The "C" and "POSIX" locale are always here. - */ - if (!strcmp(encoding, "C") || !strcmp(encoding, "POSIX")) { - _CurrentRuneLocale = &_DefaultRuneLocale; + if (sb.st_size < sizeof(_RuneLocale)) + return(0); + + if ((data = malloc(sb.st_size)) == NULL) + return(0); + + rewind(fp); /* Someone might have read the magic number once already */ + + if (fread(data, sb.st_size, 1, fp) != 1) { + free(data); return(0); } - if (!PathLocale && !(PathLocale = getenv("PATH_LOCALE"))) - PathLocale = _PATH_LOCALE; + rl = (_RuneLocale *)data; + lastp = data + sb.st_size; - (void) strcpy(name, PathLocale); - (void) strcat(name, "/"); - (void) strcat(name, encoding); - (void) strcat(name, "/LC_CTYPE"); + rl->variable = rl + 1; - if ((fp = fopen(name, "r")) == NULL) - return(ENOENT); + if (memcmp(rl->magic, _RUNE_MAGIC_1, sizeof(rl->magic))) { + free(data); + return(0); + } + + 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); - if ((rl = _Read_RuneMagi(fp)) == 0) { - fclose(fp); - return(EFTYPE); + 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]); } - fclose(fp); - - if (!rl->encoding[0] || !strcmp(rl->encoding, "UTF2")) { - return(_UTF2_init(rl)); - } else if (!strcmp(rl->encoding, "NONE")) { - return(_none_init(rl)); - } else if (!strcmp(rl->encoding, "EUC")) { - return(_EUC_init(rl)); - } else - return(EINVAL); -} -void -setinvalidrune(ir) - rune_t ir; -{ - _INVALID_RUNE = ir; -} + rl->runetype_ext.ranges = (_RuneEntry *)rl->variable; + rl->variable = rl->runetype_ext.ranges + rl->runetype_ext.nranges; + if (rl->variable > lastp) { + free(data); + return(0); + } + + rl->maplower_ext.ranges = (_RuneEntry *)rl->variable; + rl->variable = rl->maplower_ext.ranges + rl->maplower_ext.nranges; + if (rl->variable > lastp) { + free(data); + return(0); + } + + rl->mapupper_ext.ranges = (_RuneEntry *)rl->variable; + rl->variable = rl->mapupper_ext.ranges + rl->mapupper_ext.nranges; + if (rl->variable > lastp) { + free(data); + return(0); + } + + 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) { + free(data); + return(0); + } + while (len-- > 0) + rr[x].types[len] = ntohl(rr[x].types[len]); + } else + rr[x].types = 0; + } + + 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) { + free(data); + return(0); + } + + /* + * Go out and zero pointers that should be zero. + */ + if (!rl->variable_len) + rl->variable = 0; + + 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; + + return(rl); +} |