diff options
author | ache <ache@FreeBSD.org> | 2002-08-08 05:51:54 +0000 |
---|---|---|
committer | ache <ache@FreeBSD.org> | 2002-08-08 05:51:54 +0000 |
commit | 3b0ddae36e14f345ddbfb571d2838b236c78d073 (patch) | |
tree | 92e69228cb60dc54efe523b4a60905762797b926 /lib/libc/locale/euc.c | |
parent | a72d8585b7d6c0e0b3cd0824b229a07724c33288 (diff) | |
download | FreeBSD-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.c | 35 |
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); } |