Deleted Added
full compact
rune.c (10026) rune.c (11695)
1/*-
2 * Copyright (c) 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Paul Borman at Krystal Technologies.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 24 unchanged lines hidden (view full) ---

33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 */
36
37#if defined(LIBC_SCCS) && !defined(lint)
38static char sccsid[] = "@(#)rune.c 8.1 (Berkeley) 6/4/93";
39#endif /* LIBC_SCCS and not lint */
40
1/*-
2 * Copyright (c) 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Paul Borman at Krystal Technologies.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 24 unchanged lines hidden (view full) ---

33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 */
36
37#if defined(LIBC_SCCS) && !defined(lint)
38static char sccsid[] = "@(#)rune.c 8.1 (Berkeley) 6/4/93";
39#endif /* LIBC_SCCS and not lint */
40
41#include <ctype.h>
42#include <errno.h>
43#include <limits.h>
44#include <rune.h>
45#include <stdio.h>
41#include <rune.h>
42#include <stdio.h>
43#include <string.h>
46#include <stdlib.h>
44#include <stdlib.h>
47#include "common_rune.h"
45#include <sys/types.h>
46#include <sys/stat.h>
48
47
49char *_PathLocale;
50
51extern int _none_init __P((_RuneLocale *));
52extern int _UTF2_init __P((_RuneLocale *));
53extern int _EUC_init __P((_RuneLocale *));
54
55int
56setrunelocale(encoding)
57 char *encoding;
48void
49setinvalidrune(ir)
50 rune_t ir;
58{
51{
52 _INVALID_RUNE = ir;
53}
54
55_RuneLocale *
56_Read_RuneMagi(fp)
59 FILE *fp;
57 FILE *fp;
60 char name[PATH_MAX];
58{
59 char *data;
60 void *lastp;
61 _RuneLocale *rl;
61 _RuneLocale *rl;
62 _RuneEntry *rr;
63 struct stat sb;
64 int x;
62
65
63 if (!encoding)
64 return(EFAULT);
66 if (fstat(fileno(fp), &sb) < 0)
67 return(0);
65
68
66 /*
67 * The "C" and "POSIX" locale are always here.
68 */
69 if (!strcmp(encoding, "C") || !strcmp(encoding, "POSIX")) {
70 _CurrentRuneLocale = &_DefaultRuneLocale;
69 if (sb.st_size < sizeof(_RuneLocale))
71 return(0);
70 return(0);
71
72 if ((data = malloc(sb.st_size)) == NULL)
73 return(0);
74
75 rewind(fp); /* Someone might have read the magic number once already */
76
77 if (fread(data, sb.st_size, 1, fp) != 1) {
78 free(data);
79 return(0);
72 }
73
80 }
81
74 if (!PathLocale && !(PathLocale = getenv("PATH_LOCALE")))
75 PathLocale = _PATH_LOCALE;
82 rl = (_RuneLocale *)data;
83 lastp = data + sb.st_size;
76
84
77 (void) strcpy(name, PathLocale);
78 (void) strcat(name, "/");
79 (void) strcat(name, encoding);
80 (void) strcat(name, "/LC_CTYPE");
85 rl->variable = rl + 1;
81
86
82 if ((fp = fopen(name, "r")) == NULL)
83 return(ENOENT);
87 if (memcmp(rl->magic, _RUNE_MAGIC_1, sizeof(rl->magic))) {
88 free(data);
89 return(0);
90 }
84
91
85 if ((rl = _Read_RuneMagi(fp)) == 0) {
86 fclose(fp);
87 return(EFTYPE);
92 rl->invalid_rune = ntohl(rl->invalid_rune);
93 rl->variable_len = ntohl(rl->variable_len);
94 rl->runetype_ext.nranges = ntohl(rl->runetype_ext.nranges);
95 rl->maplower_ext.nranges = ntohl(rl->maplower_ext.nranges);
96 rl->mapupper_ext.nranges = ntohl(rl->mapupper_ext.nranges);
97
98 for (x = 0; x < _CACHED_RUNES; ++x) {
99 rl->runetype[x] = ntohl(rl->runetype[x]);
100 rl->maplower[x] = ntohl(rl->maplower[x]);
101 rl->mapupper[x] = ntohl(rl->mapupper[x]);
88 }
102 }
89 fclose(fp);
90
103
91 if (!rl->encoding[0] || !strcmp(rl->encoding, "UTF2")) {
92 return(_UTF2_init(rl));
93 } else if (!strcmp(rl->encoding, "NONE")) {
94 return(_none_init(rl));
95 } else if (!strcmp(rl->encoding, "EUC")) {
96 return(_EUC_init(rl));
97 } else
98 return(EINVAL);
99}
104 rl->runetype_ext.ranges = (_RuneEntry *)rl->variable;
105 rl->variable = rl->runetype_ext.ranges + rl->runetype_ext.nranges;
106 if (rl->variable > lastp) {
107 free(data);
108 return(0);
109 }
100
110
101void
102setinvalidrune(ir)
103 rune_t ir;
104{
105 _INVALID_RUNE = ir;
106}
111 rl->maplower_ext.ranges = (_RuneEntry *)rl->variable;
112 rl->variable = rl->maplower_ext.ranges + rl->maplower_ext.nranges;
113 if (rl->variable > lastp) {
114 free(data);
115 return(0);
116 }
107
117
118 rl->mapupper_ext.ranges = (_RuneEntry *)rl->variable;
119 rl->variable = rl->mapupper_ext.ranges + rl->mapupper_ext.nranges;
120 if (rl->variable > lastp) {
121 free(data);
122 return(0);
123 }
124
125 for (x = 0; x < rl->runetype_ext.nranges; ++x) {
126 rr = rl->runetype_ext.ranges;
127
128 rr[x].min = ntohl(rr[x].min);
129 rr[x].max = ntohl(rr[x].max);
130 if ((rr[x].map = ntohl(rr[x].map)) == 0) {
131 int len = rr[x].max - rr[x].min + 1;
132 rr[x].types = rl->variable;
133 rl->variable = rr[x].types + len;
134 if (rl->variable > lastp) {
135 free(data);
136 return(0);
137 }
138 while (len-- > 0)
139 rr[x].types[len] = ntohl(rr[x].types[len]);
140 } else
141 rr[x].types = 0;
142 }
143
144 for (x = 0; x < rl->maplower_ext.nranges; ++x) {
145 rr = rl->maplower_ext.ranges;
146
147 rr[x].min = ntohl(rr[x].min);
148 rr[x].max = ntohl(rr[x].max);
149 rr[x].map = ntohl(rr[x].map);
150 }
151
152 for (x = 0; x < rl->mapupper_ext.nranges; ++x) {
153 rr = rl->mapupper_ext.ranges;
154
155 rr[x].min = ntohl(rr[x].min);
156 rr[x].max = ntohl(rr[x].max);
157 rr[x].map = ntohl(rr[x].map);
158 }
159 if (((char *)rl->variable) + rl->variable_len > (char *)lastp) {
160 free(data);
161 return(0);
162 }
163
164 /*
165 * Go out and zero pointers that should be zero.
166 */
167 if (!rl->variable_len)
168 rl->variable = 0;
169
170 if (!rl->runetype_ext.nranges)
171 rl->runetype_ext.ranges = 0;
172
173 if (!rl->maplower_ext.nranges)
174 rl->maplower_ext.ranges = 0;
175
176 if (!rl->mapupper_ext.nranges)
177 rl->mapupper_ext.ranges = 0;
178
179 return(rl);
180}