summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorphantom <phantom@FreeBSD.org>2001-02-12 08:53:33 +0000
committerphantom <phantom@FreeBSD.org>2001-02-12 08:53:33 +0000
commit2c5a71ca7676a5e1691dce10895c67b0e0b0ad56 (patch)
treea6fec6baa04139af38f4fb5485906cac4c625f98 /lib
parent5f22417d4293d75bdef7ee3c32f1a6436b9c84ea (diff)
downloadFreeBSD-src-2c5a71ca7676a5e1691dce10895c67b0e0b0ad56.zip
FreeBSD-src-2c5a71ca7676a5e1691dce10895c67b0e0b0ad56.tar.gz
Rewrite __time_load_locale() using ldpart.c::__part_load_locale()
Reviewed by: ache
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/stdtime/Makefile.inc2
-rw-r--r--lib/libc/stdtime/timelocal.c166
2 files changed, 15 insertions, 153 deletions
diff --git a/lib/libc/stdtime/Makefile.inc b/lib/libc/stdtime/Makefile.inc
index 1669b1f..fbb6ab9 100644
--- a/lib/libc/stdtime/Makefile.inc
+++ b/lib/libc/stdtime/Makefile.inc
@@ -1,7 +1,7 @@
# Makefile.inc,v 1.2 1994/09/13 21:26:01 wollman Exp
# $FreeBSD$
-.PATH: ${.CURDIR}/../libc/stdtime
+.PATH: ${.CURDIR}/../libc/stdtime ${.CURDIR}/../locale
SRCS+= asctime.c difftime.c localtime.c strftime.c strptime.c timelocal.c
diff --git a/lib/libc/stdtime/timelocal.c b/lib/libc/stdtime/timelocal.c
index 81e579a..27982a3 100644
--- a/lib/libc/stdtime/timelocal.c
+++ b/lib/libc/stdtime/timelocal.c
@@ -1,4 +1,5 @@
/*-
+ * Copyright (c) 2001 Alexey Zelkin
* Copyright (c) 1997 FreeBSD Inc.
* All rights reserved.
*
@@ -26,32 +27,14 @@
* $FreeBSD$
*/
-#include "namespace.h"
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/syslimits.h>
-#include <fcntl.h>
-#include <locale.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include "un-namespace.h"
-
-#include "setlocale.h"
+#include "ldpart.h"
#include "timelocal.h"
-static int split_lines(char *, const char *);
-static void set_from_buf(const char *, int);
-
-static struct lc_time_T _time_localebuf;
+static struct lc_time_T _time_locale;
static int _time_using_locale;
+static char * time_locale_buf;
-#define LCTIME_SIZE_FULL (sizeof(struct lc_time_T) / sizeof(char *))
-#define LCTIME_SIZE_1 \
- (offsetof(struct lc_time_T, alt_month[0]) / sizeof(char *))
-#define LCTIME_SIZE_2 \
- (offsetof(struct lc_time_T, Ef_fmt) / sizeof(char *))
+#define LCTIME_SIZE (sizeof(struct lc_time_T) / sizeof(char *))
static const struct lc_time_T _C_time_locale = {
{
@@ -113,142 +96,21 @@ static const struct lc_time_T _C_time_locale = {
struct lc_time_T *
__get_current_time_locale(void) {
return (_time_using_locale
- ? &_time_localebuf
+ ? &_time_locale
: (struct lc_time_T *)&_C_time_locale);
}
int
-__time_load_locale(const char *name)
-{
- static char * locale_buf;
- static char locale_buf_C[] = "C";
- static int num_lines;
-
- int fd;
- char * lbuf;
- char * p;
- const char * plim;
- char filename[PATH_MAX];
- struct stat st;
- size_t namesize;
- size_t bufsize;
- int save_using_locale;
-
- save_using_locale = _time_using_locale;
- _time_using_locale = 0;
-
- if (name == NULL)
- goto no_locale;
-
- if (!strcmp(name, "C") || !strcmp(name, "POSIX"))
- return 0;
-
- /*
- ** If the locale name is the same as our cache, use the cache.
- */
- lbuf = locale_buf;
- if (lbuf != NULL && strcmp(name, lbuf) == 0) {
- set_from_buf(lbuf, num_lines);
- _time_using_locale = 1;
- return 0;
- }
- /*
- ** Slurp the locale file into the cache.
- */
- namesize = strlen(name) + 1;
-
- if (!_PathLocale)
- goto no_locale;
- /* Range checking not needed, 'name' size is limited */
- strcpy(filename, _PathLocale);
- strcat(filename, "/");
- strcat(filename, name);
- strcat(filename, "/LC_TIME");
- fd = _open(filename, O_RDONLY);
- if (fd < 0)
- goto no_locale;
- if (_fstat(fd, &st) != 0)
- goto bad_locale;
- if (st.st_size <= 0)
- goto bad_locale;
- bufsize = namesize + st.st_size;
- locale_buf = NULL;
- lbuf = (lbuf == NULL || lbuf == locale_buf_C) ?
- malloc(bufsize) : reallocf(lbuf, bufsize);
- if (lbuf == NULL)
- goto bad_locale;
- (void) strcpy(lbuf, name);
- p = lbuf + namesize;
- plim = p + st.st_size;
- if (_read(fd, p, (size_t) st.st_size) != st.st_size)
- goto bad_lbuf;
- if (_close(fd) != 0)
- goto bad_lbuf;
- /*
- ** Parse the locale file into localebuf.
- */
- if (plim[-1] != '\n')
- goto bad_lbuf;
- num_lines = split_lines(p, plim);
- if (num_lines >= LCTIME_SIZE_FULL)
- num_lines = LCTIME_SIZE_FULL;
- else if (num_lines >= LCTIME_SIZE_2)
- num_lines = LCTIME_SIZE_2;
- else if (num_lines >= LCTIME_SIZE_1)
- num_lines = LCTIME_SIZE_1;
- else
- goto reset_locale;
- set_from_buf(lbuf, num_lines);
- /*
- ** Record the successful parse in the cache.
- */
- locale_buf = lbuf;
-
- _time_using_locale = 1;
- return 0;
-
-reset_locale:
- /*
- * XXX - This may not be the correct thing to do in this case.
- * setlocale() assumes that we left the old locale alone.
- */
- locale_buf = locale_buf_C;
- _time_localebuf = _C_time_locale;
- save_using_locale = 0;
-bad_lbuf:
- free(lbuf);
-bad_locale:
- (void)_close(fd);
-no_locale:
- _time_using_locale = save_using_locale;
- return -1;
-}
+__time_load_locale(const char *name) {
-static int
-split_lines(char *p, const char *plim)
-{
- int i;
-
- for (i = 0; p < plim; i++) {
- p = strchr(p, '\n');
- *p++ = '\0';
- }
- return i;
-}
+ int ret;
-static void
-set_from_buf(const char *p, int num_lines)
-{
- const char **ap;
- int i;
+ ret = __part_load_locale(name, &_time_using_locale,
+ time_locale_buf, "LC_TIME", LCTIME_SIZE,
+ (const char **)&_time_locale);
- for (ap = (const char **) &_time_localebuf, i = 0;
- i < num_lines; ++ap, ++i)
- *ap = p += strlen(p) + 1;
/* XXX: always overwrite for ctime format parsing compatibility */
- _time_localebuf.c_fmt = _C_time_locale.c_fmt;
- if (num_lines >= LCTIME_SIZE_2)
- return;
- for (i = 0; i < 12; i++)
- _time_localebuf.alt_month[i] = _time_localebuf.month[i];
+ if (ret == 0 && _time_using_locale)
+ _time_locale.c_fmt = _C_time_locale.c_fmt;
+ return (ret);
}
OpenPOWER on IntegriCloud