summaryrefslogtreecommitdiff
path: root/usr/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib')
-rw-r--r--usr/src/lib/libc/port/locale/collate.c7
-rw-r--r--usr/src/lib/libc/port/locale/collate.h67
-rw-r--r--usr/src/lib/libc/port/locale/collatefile.h108
-rw-r--r--usr/src/lib/libc/port/locale/localeimpl.c1
-rw-r--r--usr/src/lib/libc/port/locale/localeimpl.h3
-rw-r--r--usr/src/lib/libc/port/locale/runetype.h6
-rw-r--r--usr/src/lib/libc/port/locale/setlocale.c1
7 files changed, 127 insertions, 66 deletions
diff --git a/usr/src/lib/libc/port/locale/collate.c b/usr/src/lib/libc/port/locale/collate.c
index 75814a9a9f..4dead90973 100644
--- a/usr/src/lib/libc/port/locale/collate.c
+++ b/usr/src/lib/libc/port/locale/collate.c
@@ -44,7 +44,12 @@
#include <sys/mman.h>
#include "collate.h"
-#include "setlocale.h"
+#include "localeimpl.h"
+
+/* Check file format vs libc runtime. (See collatefile.h) */
+#if COLL_WEIGHTS_MAX != COLLATE_WEIGHTS_MAX
+#error "COLL_WEIGHTS_MAX != COLLATE_WEIGHTS_MAX"
+#endif
/*
* See the comments in usr/src/cmd/localedef/collate.c for further
diff --git a/usr/src/lib/libc/port/locale/collate.h b/usr/src/lib/libc/port/locale/collate.h
index d3496be7cf..e9b3cbd2b0 100644
--- a/usr/src/lib/libc/port/locale/collate.h
+++ b/usr/src/lib/libc/port/locale/collate.h
@@ -1,6 +1,6 @@
/*
+ * Copyright 2015 Nexenta Systmes, Inc. All rights reserved.
* Copyright 2013 Garrett D'Amore <garrett@damore.org>
- * Copyright 2010 Nexenta Systmes, Inc. All rights reserved.
* Copyright (c) 1995 Alex Tatmanjants <alex@elvisti.kiev.ua>
* at Electronni Visti IA, Kiev, Ukraine.
* All rights reserved.
@@ -30,71 +30,18 @@
#ifndef _COLLATE_H_
#define _COLLATE_H_
+/*
+ * This file defines the libc interface to LC_COLLATE data.
+ */
+
#include <sys/types.h>
#include <limits.h>
-#include <locale.h>
+#include "collatefile.h"
#include "localeimpl.h"
-#define COLLATE_STR_LEN 24 /* should be 64-bit multiple */
-#define COLLATE_VERSION "IllumosCollate2\n"
-
-#define COLLATE_MAX_PRIORITY (0x7fffffff) /* max signed value */
-#define COLLATE_SUBST_PRIORITY (0x40000000) /* bit indicates subst table */
-
-#define DIRECTIVE_UNDEF 0x00
-#define DIRECTIVE_FORWARD 0x01
-#define DIRECTIVE_BACKWARD 0x02
-#define DIRECTIVE_POSITION 0x04
-#define DIRECTIVE_UNDEFINED 0x08 /* special last weight for UNDEFINED */
-
-#define DIRECTIVE_DIRECTION_MASK (DIRECTIVE_FORWARD | DIRECTIVE_BACKWARD)
-
/*
- * The collate file format is as follows:
- *
- * char version[COLLATE_STR_LEN]; // must be COLLATE_VERSION
- * collate_info_t info; // see below, includes padding
- * collate_char_pri_t char_data[256]; // 8 bit char values
- * collate_subst_t subst[*]; // 0 or more substitutions
- * collate_chain_pri_t chains[*]; // 0 or more chains
- * collate_large_pri_t large[*]; // extended char priorities
- *
- * Note that all structures must be 32-bit aligned, as each structure
- * contains 32-bit member fields. The entire file is mmap'd, so its
- * critical that alignment be observed. It is not generally safe to
- * use any 64-bit values in the structures.
+ * This is the run-time (in-memory) form of LC_COLLATE data.
*/
-
-typedef struct collate_info {
- uint8_t directive_count;
- uint8_t directive[COLL_WEIGHTS_MAX];
- int32_t pri_count[COLL_WEIGHTS_MAX];
- int32_t flags;
- int32_t chain_count;
- int32_t large_count;
- int32_t subst_count[COLL_WEIGHTS_MAX];
- int32_t undef_pri[COLL_WEIGHTS_MAX];
-} collate_info_t;
-
-typedef struct collate_char {
- int32_t pri[COLL_WEIGHTS_MAX];
-} collate_char_t;
-
-typedef struct collate_chain {
- wchar_t str[COLLATE_STR_LEN];
- int32_t pri[COLL_WEIGHTS_MAX];
-} collate_chain_t;
-
-typedef struct collate_large {
- int32_t val;
- collate_char_t pri;
-} collate_large_t;
-
-typedef struct collate_subst {
- int32_t key;
- int32_t pri[COLLATE_STR_LEN];
-} collate_subst_t;
-
struct lc_collate {
int lc_is_posix;
diff --git a/usr/src/lib/libc/port/locale/collatefile.h b/usr/src/lib/libc/port/locale/collatefile.h
new file mode 100644
index 0000000000..a6d7fdf0f4
--- /dev/null
+++ b/usr/src/lib/libc/port/locale/collatefile.h
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2015 Nexenta Systmes, Inc. All rights reserved.
+ * Copyright 2013 Garrett D'Amore <garrett@damore.org>
+ * Copyright (c) 1995 Alex Tatmanjants <alex@elvisti.kiev.ua>
+ * at Electronni Visti IA, Kiev, Ukraine.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _COLLATEFILE_H_
+#define _COLLATEFILE_H_
+
+/*
+ * This file defines the format of collation data files.
+ * These are the files loaded to support LC_COLLATE category
+ * locale data. Please note that this must define the file
+ * format in a way that allows localedef to build such files
+ * without assuming that the build system has all the same
+ * locale.h defines and structures, which means this should
+ * remain independent of things like limits.h values.
+ */
+
+#include <sys/types.h>
+
+/* NB: libc build ensure this is == COLL_WEIGHTS_MAX (from limits.h) */
+#define COLLATE_WEIGHTS_MAX 10
+
+#define COLLATE_STR_LEN 24 /* should be 64-bit multiple */
+#define COLLATE_VERSION "IllumosCollate2\n"
+
+#define COLLATE_MAX_PRIORITY (0x7fffffff) /* max signed value */
+#define COLLATE_SUBST_PRIORITY (0x40000000) /* bit indicates subst table */
+
+#define DIRECTIVE_UNDEF 0x00
+#define DIRECTIVE_FORWARD 0x01
+#define DIRECTIVE_BACKWARD 0x02
+#define DIRECTIVE_POSITION 0x04
+#define DIRECTIVE_UNDEFINED 0x08 /* special last weight for UNDEFINED */
+
+#define DIRECTIVE_DIRECTION_MASK (DIRECTIVE_FORWARD | DIRECTIVE_BACKWARD)
+
+/*
+ * The collate file format is as follows:
+ *
+ * char version[COLLATE_STR_LEN]; // must be COLLATE_VERSION
+ * collate_info_t info; // see below, includes padding
+ * collate_char_pri_t char_data[256]; // 8 bit char values
+ * collate_subst_t subst[*]; // 0 or more substitutions
+ * collate_chain_pri_t chains[*]; // 0 or more chains
+ * collate_large_pri_t large[*]; // extended char priorities
+ *
+ * Note that all structures must be 32-bit aligned, as each structure
+ * contains 32-bit member fields. The entire file is mmap'd, so its
+ * critical that alignment be observed. It is not generally safe to
+ * use any 64-bit values in the structures.
+ */
+
+typedef struct collate_info {
+ uint8_t directive_count;
+ uint8_t directive[COLLATE_WEIGHTS_MAX];
+ int32_t pri_count[COLLATE_WEIGHTS_MAX];
+ int32_t flags;
+ int32_t chain_count;
+ int32_t large_count;
+ int32_t subst_count[COLLATE_WEIGHTS_MAX];
+ int32_t undef_pri[COLLATE_WEIGHTS_MAX];
+} collate_info_t;
+
+typedef struct collate_char {
+ int32_t pri[COLLATE_WEIGHTS_MAX];
+} collate_char_t;
+
+typedef struct collate_chain {
+ wchar_t str[COLLATE_STR_LEN];
+ int32_t pri[COLLATE_WEIGHTS_MAX];
+} collate_chain_t;
+
+typedef struct collate_large {
+ int32_t val;
+ collate_char_t pri;
+} collate_large_t;
+
+typedef struct collate_subst {
+ int32_t key;
+ int32_t pri[COLLATE_STR_LEN];
+} collate_subst_t;
+
+#endif /* !_COLLATEFILE_H_ */
diff --git a/usr/src/lib/libc/port/locale/localeimpl.c b/usr/src/lib/libc/port/locale/localeimpl.c
index c1817060bc..f7e3ab240f 100644
--- a/usr/src/lib/libc/port/locale/localeimpl.c
+++ b/usr/src/lib/libc/port/locale/localeimpl.c
@@ -97,6 +97,7 @@ extern struct lc_messages lc_messages_posix;
extern struct lc_time lc_time_posix;
extern struct lc_ctype lc_ctype_posix;
extern struct lc_collate lc_collate_posix;
+extern struct _RuneLocale _DefaultRuneLocale;
static struct _locale posix_locale = {
/* locdata */
diff --git a/usr/src/lib/libc/port/locale/localeimpl.h b/usr/src/lib/libc/port/locale/localeimpl.h
index 857666bf14..5d1eb9c451 100644
--- a/usr/src/lib/libc/port/locale/localeimpl.h
+++ b/usr/src/lib/libc/port/locale/localeimpl.h
@@ -28,7 +28,6 @@
#include <locale.h>
#include <xlocale.h>
#include "setlocale.h"
-#include "runetype.h"
/* private locale structures */
@@ -70,7 +69,7 @@ struct _locale {
const struct lc_monetary *monetary;
const struct lc_numeric *numeric;
const struct lc_time *time;
- const _RuneLocale *runelocale;
+ const struct _RuneLocale *runelocale;
/*
* The loaded value is used for localeconv. In paticular, when
diff --git a/usr/src/lib/libc/port/locale/runetype.h b/usr/src/lib/libc/port/locale/runetype.h
index 3abdd1afa9..467a47ba8e 100644
--- a/usr/src/lib/libc/port/locale/runetype.h
+++ b/usr/src/lib/libc/port/locale/runetype.h
@@ -97,19 +97,19 @@ typedef int __rune_t; /* rune_t (see above) */
/*
* The lower 8 bits of runetype[] contain the digit value of the rune.
*/
-typedef struct {
+typedef struct _RuneEntry {
__rune_t __min; /* First rune of the range */
__rune_t __max; /* Last rune (inclusive) of the range */
__rune_t __map; /* What first maps to in maps */
unsigned *__types; /* Array of types in range */
} _RuneEntry;
-typedef struct {
+typedef struct _RuneRange {
int __nranges; /* Number of ranges stored */
_RuneEntry *__ranges; /* Pointer to the ranges */
} _RuneRange;
-typedef struct {
+typedef struct _RuneLocale {
char __magic[8]; /* Magic saying what version we are */
char __encoding[32]; /* ASCII name of encoding */
diff --git a/usr/src/lib/libc/port/locale/setlocale.c b/usr/src/lib/libc/port/locale/setlocale.c
index 18628a3135..d2b308565d 100644
--- a/usr/src/lib/libc/port/locale/setlocale.c
+++ b/usr/src/lib/libc/port/locale/setlocale.c
@@ -47,6 +47,7 @@
#include "collate.h"
#include "lnumeric.h" /* for struct lc_numeric */
#include "lctype.h" /* for struct lc_ctype */
+#include "runetype.h"
#include "setlocale.h"
#include "../i18n/_loc_path.h"
#include "localeimpl.h"