summaryrefslogtreecommitdiffstats
path: root/lib/libc/locale/rune.c
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>1995-10-23 01:34:17 +0000
committerache <ache@FreeBSD.org>1995-10-23 01:34:17 +0000
commit6ee0412bd842c62fa5a2d0cc7b5d9a09ea7305b1 (patch)
treedf3d9138c260a0dd995cf571fe1f86075fc381a2 /lib/libc/locale/rune.c
parent7bae034de0c258030d15c9a5c797a7cbf0363b89 (diff)
downloadFreeBSD-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.c171
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);
+}
OpenPOWER on IntegriCloud