X-Git-Url: https://git.saurik.com/apple/libc.git/blobdiff_plain/9385eb3d10ebe5eb398c52040ec3dbfba9b0cdcf..HEAD:/locale/FreeBSD/ldpart.c diff --git a/locale/FreeBSD/ldpart.c b/locale/FreeBSD/ldpart.c index fc60b19..10172af 100644 --- a/locale/FreeBSD/ldpart.c +++ b/locale/FreeBSD/ldpart.c @@ -25,7 +25,9 @@ */ #include -__FBSDID("$FreeBSD: src/lib/libc/locale/ldpart.c,v 1.12 2002/10/27 17:44:33 wollman Exp $"); +__FBSDID("$FreeBSD: src/lib/libc/locale/ldpart.c,v 1.15 2004/04/25 19:56:50 ache Exp $"); + +#include "xlocale_private.h" #include "namespace.h" #include @@ -39,15 +41,15 @@ __FBSDID("$FreeBSD: src/lib/libc/locale/ldpart.c,v 1.12 2002/10/27 17:44:33 woll #include #include "un-namespace.h" -#include "setlocale.h" #include "ldpart.h" +#include "setlocale.h" static int split_lines(char *, const char *); -int +__private_extern__ int __part_load_locale(const char *name, - int *using_locale, - char *locale_buf, + unsigned char *using_locale, + char **locale_buf, const char *category_filename, int locale_buf_size_max, int locale_buf_size_min, @@ -60,33 +62,18 @@ __part_load_locale(const char *name, struct stat st; size_t namesize, bufsize; - /* 'name' must be already checked. */ - if (strcmp(name, "C") == 0 || strcmp(name, "POSIX") == 0) { - *using_locale = 0; - return (_LDP_CACHE); - } - - /* - * If the locale name is the same as our cache, use the cache. - */ - if (locale_buf != NULL && strcmp(name, locale_buf) == 0) { - *using_locale = 1; - return (_LDP_CACHE); - } - /* * Slurp the locale file into the cache. */ namesize = strlen(name) + 1; /* 'PathLocale' must be already set & checked. */ + /* Range checking not needed, 'name' size is limited */ - strcpy(filename, _PathLocale); - strcat(filename, "/"); - strcat(filename, name); + strcpy(filename, name); strcat(filename, "/"); strcat(filename, category_filename); - if ((fd = _open(filename, O_RDONLY)) < 0) + if ((fd = __open_path_locale(filename)) < 0) return (_LDP_ERROR); if (_fstat(fd, &st) != 0) goto bad_locale; @@ -114,9 +101,7 @@ __part_load_locale(const char *name, num_lines = split_lines(p, plim); if (num_lines >= locale_buf_size_max) num_lines = locale_buf_size_max; - else if (num_lines >= locale_buf_size_min) - num_lines = locale_buf_size_min; - else { + else if (num_lines < locale_buf_size_min) { errno = EFTYPE; goto bad_lbuf; } @@ -124,10 +109,10 @@ __part_load_locale(const char *name, /* * Record the successful parse in the cache. */ - if (locale_buf != NULL) - free(locale_buf); - locale_buf = lbuf; - for (p = locale_buf, i = 0; i < num_lines; i++) + if (*locale_buf != NULL) + free(*locale_buf); + *locale_buf = lbuf; + for (p = *locale_buf, i = 0; i < num_lines; i++) dst_localebuf[i] = (p += strlen(p) + 1); for (i = num_lines; i < locale_buf_size_max; i++) dst_localebuf[i] = NULL; @@ -152,10 +137,20 @@ split_lines(char *p, const char *plim) { int i; - for (i = 0; p < plim; i++) { - p = strchr(p, '\n'); - *p++ = '\0'; + i = 0; + while (p < plim) { + if (*p == '\n') { + *p = '\0'; + i++; + } + p++; } return (i); } +__private_extern__ void +__ldpart_free_extra(struct __xlocale_st_ldpart *lp) +{ + if (lp) + free(lp->_locale_buf); +}