X-Git-Url: https://git.saurik.com/apple/libc.git/blobdiff_plain/9385eb3d10ebe5eb398c52040ec3dbfba9b0cdcf..15de9d6b4ab2de27ae24b13b7b6c4d55fffe4aef:/locale/FreeBSD/ldpart.c diff --git a/locale/FreeBSD/ldpart.c b/locale/FreeBSD/ldpart.c index fc60b19..6a08e15 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,26 +62,13 @@ __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, "/"); @@ -114,9 +103,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 +111,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 +139,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); +}