Module Name: src
Committed By: tnozaki
Date: Tue Jun 1 18:00:28 UTC 2010
Modified Files:
src/lib/libc/locale: Makefile.inc bsdctype.c bsdctype.h iswctype_sb.c
localeio_lc_ctype.c
Removed Files:
src/lib/libc/locale: ctypeio.c ctypeio.h
Log Message:
refactoring old locale-db(BSDCTYPE) loading method with mmap(2).
To generate a diff of this commit:
cvs rdiff -u -r1.55 -r1.56 src/lib/libc/locale/Makefile.inc
cvs rdiff -u -r1.4 -r1.5 src/lib/libc/locale/bsdctype.c
cvs rdiff -u -r1.3 -r1.4 src/lib/libc/locale/bsdctype.h \
src/lib/libc/locale/localeio_lc_ctype.c
cvs rdiff -u -r1.13 -r0 src/lib/libc/locale/ctypeio.c
cvs rdiff -u -r1.4 -r0 src/lib/libc/locale/ctypeio.h
cvs rdiff -u -r1.10 -r1.11 src/lib/libc/locale/iswctype_sb.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/libc/locale/Makefile.inc
diff -u src/lib/libc/locale/Makefile.inc:1.55 src/lib/libc/locale/Makefile.inc:1.56
--- src/lib/libc/locale/Makefile.inc:1.55 Sun May 30 08:28:53 2010
+++ src/lib/libc/locale/Makefile.inc Tue Jun 1 18:00:28 2010
@@ -1,5 +1,5 @@
# from: @(#)Makefile.inc 5.1 (Berkeley) 2/18/91
-# $NetBSD: Makefile.inc,v 1.55 2010/05/30 08:28:53 tnozaki Exp $
+# $NetBSD: Makefile.inc,v 1.56 2010/06/01 18:00:28 tnozaki Exp $
# locale sources
.PATH: ${ARCHDIR}/locale ${.CURDIR}/locale
@@ -29,7 +29,7 @@
SRCS+= aliasname.c bsdctype.c localeio.c \
multibyte_sb.c iswctype_sb.c \
localeio_lc_ctype.c localeio_lc_monetary.c \
- localeio_lc_numeric.c localeio_lc_time.c
+ localeio_lc_numeric.c localeio_lc_time.c localeio_lc_messages.c
.endif
MAN+= setlocale.3 nl_langinfo.3
Index: src/lib/libc/locale/bsdctype.c
diff -u src/lib/libc/locale/bsdctype.c:1.4 src/lib/libc/locale/bsdctype.c:1.5
--- src/lib/libc/locale/bsdctype.c:1.4 Sun May 30 08:28:53 2010
+++ src/lib/libc/locale/bsdctype.c Tue Jun 1 18:00:28 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: bsdctype.c,v 1.4 2010/05/30 08:28:53 tnozaki Exp $ */
+/* $NetBSD: bsdctype.c,v 1.5 2010/06/01 18:00:28 tnozaki Exp $ */
/*-
* Copyright (c)2008 Citrus Project,
@@ -28,9 +28,19 @@
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: bsdctype.c,v 1.4 2010/05/30 08:28:53 tnozaki Exp $");
+__RCSID("$NetBSD: bsdctype.c,v 1.5 2010/06/01 18:00:28 tnozaki Exp $");
#endif /* LIBC_SCCS and not lint */
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <assert.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
#include "bsdctype.h"
const _BSDCTypeLocale _DefaultBSDCTypeLocale = {
@@ -40,3 +50,130 @@
};
const _BSDCTypeLocale *_CurrentBSDCTypeLocale = &_DefaultBSDCTypeLocale;
+
+typedef struct {
+ _BSDCTypeLocale bl;
+ uint8_t blp_ctype_tab [_CTYPE_NUM_CHARS + 1];
+ int16_t blp_tolower_tab[_CTYPE_NUM_CHARS + 1];
+ int16_t blp_toupper_tab[_CTYPE_NUM_CHARS + 1];
+} _BSDCTypeLocalePriv;
+
+static __inline void
+_bsdctype_init_priv(_BSDCTypeLocalePriv *blp)
+{
+ blp->blp_ctype_tab [0] = (uint8_t)0;
+ blp->blp_tolower_tab[0] = (int16_t)EOF;
+ blp->blp_toupper_tab[0] = (int16_t)EOF;
+ blp->bl.bl_ctype_tab = &blp->blp_ctype_tab [0];
+ blp->bl.bl_tolower_tab = &blp->blp_tolower_tab[0];
+ blp->bl.bl_toupper_tab = &blp->blp_toupper_tab[0];
+}
+
+static __inline int
+_bsdctype_read_file(const char * __restrict var, size_t lenvar,
+ _BSDCTypeLocalePriv * __restrict blp)
+{
+ const _FileBSDCTypeLocale *fbl;
+ uint32_t value;
+ int i;
+
+ if (lenvar < sizeof(*fbl))
+ return EFTYPE;
+ fbl = (const _FileBSDCTypeLocale *)(const void *)var;
+ if (memcmp(&fbl->fbl_id[0], _CTYPE_ID, sizeof(fbl->fbl_id)))
+ return EFTYPE;
+ value = ntohl(fbl->fbl_rev);
+ if (value != _CTYPE_REV)
+ return EFTYPE;
+ value = ntohl(fbl->fbl_num_chars);
+ if (value != _CTYPE_CACHE_SIZE)
+ return EFTYPE;
+ for (i = 0; i < _CTYPE_CACHE_SIZE; ++i) {
+ blp->blp_ctype_tab [i + 1] = fbl->fbl_ctype_tab[i];
+ blp->blp_tolower_tab[i + 1] = ntohs(fbl->fbl_tolower_tab[i]);
+ blp->blp_toupper_tab[i + 1] = ntohs(fbl->fbl_toupper_tab[i]);
+ }
+#if _CTYPE_CACHE_SIZE != _CTYPE_NUM_CHARS
+ for (i = _CTYPE_CACHE_SIZE; i < _CTYPE_NUM_CHARS; ++i) {
+ blp->blp_ctype_tab [i + 1] = 0;
+ blp->blp_tolower_tab[i + 1] = i;
+ blp->blp_toupper_tab[i + 1] = i;
+ }
+#endif
+ return 0;
+}
+
+static __inline int
+_bsdctype_load_priv(const char * __restrict path,
+ _BSDCTypeLocalePriv * __restrict blp)
+{
+ int fd, ret;
+ struct stat st;
+ size_t lenvar;
+ char *var;
+
+ fd = open(path, O_RDONLY);
+ if (fd == -1)
+ goto err;
+ if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1)
+ goto err;
+ if (fstat(fd, &st) == -1)
+ goto err;
+ if (!S_ISREG(st.st_mode)) {
+ close(fd);
+ return EBADF;
+ }
+ lenvar = (size_t)st.st_size;
+ if (lenvar < 1) {
+ close(fd);
+ return EFTYPE;
+ }
+ var = mmap(NULL, lenvar, PROT_READ,
+ MAP_FILE|MAP_PRIVATE, fd, (off_t)0);
+ if (var == MAP_FAILED)
+ goto err;
+ if (close(fd) == -1) {
+ ret = errno;
+ munmap(var, lenvar);
+ return ret;
+ }
+ switch (*var) {
+ case 'B':
+ ret = _bsdctype_read_file(var, lenvar, blp);
+ break;
+ default:
+ ret = EFTYPE;
+ }
+ munmap(var, lenvar);
+ return ret;
+err:
+ ret = errno;
+ close(fd);
+ return ret;
+}
+
+int
+_bsdctype_load(const char * __restrict path,
+ _BSDCTypeLocale ** __restrict pbl)
+{
+ int sverr, ret;
+ _BSDCTypeLocalePriv *blp;
+
+ sverr = errno;
+ errno = 0;
+ blp = malloc(sizeof(*blp));
+ if (blp == NULL) {
+ ret = errno;
+ errno = sverr;
+ return ret;
+ }
+ _bsdctype_init_priv(blp);
+ ret = _bsdctype_load_priv(path, blp);
+ if (ret) {
+ free(blp);
+ errno = sverr;
+ return ret;
+ }
+ *pbl = &blp->bl;
+ return 0;
+}
Index: src/lib/libc/locale/bsdctype.h
diff -u src/lib/libc/locale/bsdctype.h:1.3 src/lib/libc/locale/bsdctype.h:1.4
--- src/lib/libc/locale/bsdctype.h:1.3 Sun May 30 08:28:53 2010
+++ src/lib/libc/locale/bsdctype.h Tue Jun 1 18:00:28 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: bsdctype.h,v 1.3 2010/05/30 08:28:53 tnozaki Exp $ */
+/* $NetBSD: bsdctype.h,v 1.4 2010/06/01 18:00:28 tnozaki Exp $ */
/*-
* Copyright (c)2008 Citrus Project,
@@ -31,13 +31,26 @@
#include "ctype_local.h"
-typedef struct _BSDCTypeLocale {
- const unsigned char *ctype_tab;
- const short *tolower_tab;
- const short *toupper_tab;
+typedef struct {
+ char fbl_id[8];
+ uint32_t fbl_rev;
+ uint32_t fbl_num_chars;
+ uint8_t fbl_ctype_tab [_CTYPE_NUM_CHARS];
+ int16_t fbl_tolower_tab[_CTYPE_NUM_CHARS];
+ int16_t fbl_toupper_tab[_CTYPE_NUM_CHARS];
+} __packed _FileBSDCTypeLocale;
+
+typedef struct {
+ const unsigned char *bl_ctype_tab;
+ const short *bl_tolower_tab;
+ const short *bl_toupper_tab;
} _BSDCTypeLocale;
extern const _BSDCTypeLocale _DefaultBSDCTypeLocale;
extern const _BSDCTypeLocale *_CurrentBSDCTypeLocale;
+__BEGIN_DECLS
+int _bsdctype_load(const char * __restrict, _BSDCTypeLocale ** __restrict);
+__END_DECLS
+
#endif /*_BSDCTYPE_H_*/
Index: src/lib/libc/locale/localeio_lc_ctype.c
diff -u src/lib/libc/locale/localeio_lc_ctype.c:1.3 src/lib/libc/locale/localeio_lc_ctype.c:1.4
--- src/lib/libc/locale/localeio_lc_ctype.c:1.3 Tue Jun 1 13:52:08 2010
+++ src/lib/libc/locale/localeio_lc_ctype.c Tue Jun 1 18:00:28 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: localeio_lc_ctype.c,v 1.3 2010/06/01 13:52:08 tnozaki Exp $ */
+/* $NetBSD: localeio_lc_ctype.c,v 1.4 2010/06/01 18:00:28 tnozaki Exp $ */
/*-
* Copyright (c)2008 Citrus Project,
@@ -28,7 +28,7 @@
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: localeio_lc_ctype.c,v 1.3 2010/06/01 13:52:08 tnozaki Exp $");
+__RCSID("$NetBSD: localeio_lc_ctype.c,v 1.4 2010/06/01 18:00:28 tnozaki Exp $");
#endif /* LIBC_SCCS and not lint */
#include "reentrant.h"
@@ -49,7 +49,6 @@
#include "aliasname_local.h"
#include "bsdctype.h"
-#include "ctypeio.h"
/*
* macro required by all template headers
@@ -76,7 +75,7 @@
snprintf(path, sizeof(path),
"%s/%s/LC_CTYPE", root, name);
- return __loadctype(path, pdata);
+ return _bsdctype_load(path, pdata);
}
static __inline void
@@ -86,10 +85,10 @@
_DIAGASSERT(cache != NULL);
_DIAGASSERT(data != NULL);
- cache->ctype_tab = data->ctype_tab;
- cache->tolower_tab = data->tolower_tab;
- cache->toupper_tab = data->toupper_tab;
- cache->mb_cur_max = (size_t)1;
+ cache->ctype_tab = data->bl_ctype_tab;
+ cache->tolower_tab = data->bl_tolower_tab;
+ cache->toupper_tab = data->bl_toupper_tab;
+ cache->mb_cur_max = (size_t)1;
}
static __inline void
@@ -97,9 +96,9 @@
{
_DIAGASSERT(data != NULL);
- _ctype_ = data->ctype_tab;
- _tolower_tab_ = data->tolower_tab;
- _toupper_tab_ = data->toupper_tab;
+ _ctype_ = data->bl_ctype_tab;
+ _tolower_tab_ = data->bl_tolower_tab;
+ _toupper_tab_ = data->bl_toupper_tab;
}
/*
Index: src/lib/libc/locale/iswctype_sb.c
diff -u src/lib/libc/locale/iswctype_sb.c:1.10 src/lib/libc/locale/iswctype_sb.c:1.11
--- src/lib/libc/locale/iswctype_sb.c:1.10 Tue Jun 1 13:52:08 2010
+++ src/lib/libc/locale/iswctype_sb.c Tue Jun 1 18:00:28 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: iswctype_sb.c,v 1.10 2010/06/01 13:52:08 tnozaki Exp $ */
+/* $NetBSD: iswctype_sb.c,v 1.11 2010/06/01 18:00:28 tnozaki Exp $ */
/*-
* Copyright (c)2008 Citrus Project,
@@ -28,7 +28,7 @@
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: iswctype_sb.c,v 1.10 2010/06/01 13:52:08 tnozaki Exp $");
+__RCSID("$NetBSD: iswctype_sb.c,v 1.11 2010/06/01 18:00:28 tnozaki Exp $");
#endif /* LIBC_SCCS and not lint */
#include "namespace.h"
@@ -36,7 +36,9 @@
#define _CTYPE_NOINLINE
#include <ctype.h>
#include <errno.h>
+#include <stdio.h>
#include <string.h>
+#include <wchar.h>
#include <wctype.h>
#define _ISWCTYPE_FUNC(name) \