Print this page
2964 need POSIX 2008 locale object support
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Approved by: TBD
@@ -1,6 +1,7 @@
/*
+ * Copyright 2013 Garrett D'Amore <garrett@damore.org>
* Copyright 2010 Nexenta Systems, Inc. All rights reserved.
* Copyright (c) 2000, 2001 Alexey Zelkin <phantom@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -35,17 +36,18 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
+#include "libc.h"
#include "ldpart.h"
#include "setlocale.h"
static int split_lines(char *, const char *);
int
-__part_load_locale(const char *name, int *using_locale,
+__part_load_locale(const char *name,
char **locale_buf, const char *category_filename,
int locale_buf_size_max, int locale_buf_size_min,
const char **dst_localebuf)
{
int saverr, fd, i, num_lines;
@@ -53,25 +55,11 @@
const char *plim;
char filename[PATH_MAX];
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. */
@@ -86,11 +74,11 @@
if (st.st_size <= 0) {
errno = EINVAL;
goto bad_locale;
}
bufsize = namesize + st.st_size;
- if ((lbuf = malloc(bufsize)) == NULL) {
+ if ((lbuf = libc_malloc(bufsize)) == NULL) {
errno = ENOMEM;
goto bad_locale;
}
(void) strcpy(lbuf, name);
p = lbuf + namesize;
@@ -115,18 +103,15 @@
}
(void) close(fd);
/*
* 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++)
dst_localebuf[i] = (p += strlen(p) + 1);
for (i = num_lines; i < locale_buf_size_max; i++)
dst_localebuf[i] = NULL;
- *using_locale = 1;
return (_LDP_LOADED);
bad_lbuf:
saverr = errno;