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)				\

Reply via email to