summaryrefslogtreecommitdiffstats
path: root/lib/libc/locale/euc.c
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>2002-08-08 05:51:54 +0000
committerache <ache@FreeBSD.org>2002-08-08 05:51:54 +0000
commit3b0ddae36e14f345ddbfb571d2838b236c78d073 (patch)
tree92e69228cb60dc54efe523b4a60905762797b926 /lib/libc/locale/euc.c
parenta72d8585b7d6c0e0b3cd0824b229a07724c33288 (diff)
downloadFreeBSD-src-3b0ddae36e14f345ddbfb571d2838b236c78d073.zip
FreeBSD-src-3b0ddae36e14f345ddbfb571d2838b236c78d073.tar.gz
Rewrite locale loading procedures, so any load failure will not affect
currently cached data. It allows a number of nice things, like: removing fallback code from single locale loading, remove memory leak when LC_CTYPE data loaded again and again, efficient cache use, not only for setlocale(locale1); setlocale(locale1), but for setlocale(locale1); setlocale("C"); setlocale(locale1) too (i.e. data file loaded only once).
Diffstat (limited to 'lib/libc/locale/euc.c')
-rw-r--r--lib/libc/locale/euc.c35
1 files changed, 13 insertions, 22 deletions
diff --git a/lib/libc/locale/euc.c b/lib/libc/locale/euc.c
index 9008a91..43194fa 100644
--- a/lib/libc/locale/euc.c
+++ b/lib/libc/locale/euc.c
@@ -63,40 +63,36 @@ _EUC_init(rl)
_RuneLocale *rl;
{
_EucInfo *ei;
- int x;
+ int x, new__mb_cur_max;
char *v, *e;
rl->sgetrune = _EUC_sgetrune;
rl->sputrune = _EUC_sputrune;
- if (!rl->variable) {
- free(rl);
+ if (rl->variable == NULL)
return (EFTYPE);
- }
- v = (char *) rl->variable;
+
+ v = (char *)rl->variable;
while (*v == ' ' || *v == '\t')
++v;
- if ((ei = malloc(sizeof(_EucInfo))) == NULL) {
- free(rl);
+ if ((ei = malloc(sizeof(_EucInfo))) == NULL)
return (ENOMEM);
- }
- __mb_cur_max = 0;
+
+ new__mb_cur_max = 0;
for (x = 0; x < 4; ++x) {
- ei->count[x] = (int) strtol(v, &e, 0);
+ ei->count[x] = (int)strtol(v, &e, 0);
if (v == e || !(v = e)) {
- free(rl);
free(ei);
return (EFTYPE);
}
- if (__mb_cur_max < ei->count[x])
- __mb_cur_max = ei->count[x];
+ if (new__mb_cur_max < ei->count[x])
+ new__mb_cur_max = ei->count[x];
while (*v == ' ' || *v == '\t')
++v;
- ei->bits[x] = (int) strtol(v, &e, 0);
+ ei->bits[x] = (int)strtol(v, &e, 0);
if (v == e || !(v = e)) {
- free(rl);
free(ei);
return (EFTYPE);
}
@@ -105,18 +101,13 @@ _EUC_init(rl)
}
ei->mask = (int)strtol(v, &e, 0);
if (v == e || !(v = e)) {
- free(rl);
free(ei);
return (EFTYPE);
}
- if (sizeof(_EucInfo) <= rl->variable_len) {
- memcpy(rl->variable, ei, sizeof(_EucInfo));
- free(ei);
- } else {
- rl->variable = ei;
- }
+ rl->variable = ei;
rl->variable_len = sizeof(_EucInfo);
_CurrentRuneLocale = rl;
+ __mb_cur_max = new__mb_cur_max;
return (0);
}
OpenPOWER on IntegriCloud