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} |
|