socsvn commit: r272445 - in soc2014/ghostmansd/head: contrib/colldb lib/libc lib/libc/locale lib/libc/string lib/libc/unicode lib/libcolldb
ghostmansd at FreeBSD.org
ghostmansd at FreeBSD.org
Thu Aug 14 22:23:58 UTC 2014
Author: ghostmansd
Date: Thu Aug 14 22:23:54 2014
New Revision: 272445
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=272445
Log:
changing fallback behaviour; deprecating _UNICODE_SOURCE
Added:
soc2014/ghostmansd/head/lib/libcolldb/colldb
- copied, changed from r272296, soc2014/ghostmansd/head/contrib/colldb/colldb
soc2014/ghostmansd/head/lib/libcolldb/colldb.c
- copied unchanged from r272296, soc2014/ghostmansd/head/contrib/colldb/colldb.c
soc2014/ghostmansd/head/lib/libcolldb/colldb.h
- copied unchanged from r272296, soc2014/ghostmansd/head/contrib/colldb/colldb.h
Deleted:
soc2014/ghostmansd/head/contrib/colldb/
Modified:
soc2014/ghostmansd/head/lib/libc/Makefile
soc2014/ghostmansd/head/lib/libc/locale/collate.c
soc2014/ghostmansd/head/lib/libc/locale/xlocale.c
soc2014/ghostmansd/head/lib/libc/locale/xlocale_private.h
soc2014/ghostmansd/head/lib/libc/string/wcscoll.c
soc2014/ghostmansd/head/lib/libc/string/wcsxfrm.c
soc2014/ghostmansd/head/lib/libc/unicode/ucscoll.c
soc2014/ghostmansd/head/lib/libcolldb/Makefile
Modified: soc2014/ghostmansd/head/lib/libc/Makefile
==============================================================================
--- soc2014/ghostmansd/head/lib/libc/Makefile Thu Aug 14 21:43:20 2014 (r272444)
+++ soc2014/ghostmansd/head/lib/libc/Makefile Thu Aug 14 22:23:54 2014 (r272445)
@@ -94,10 +94,7 @@
.include "${LIBC_SRCTOP}/stdlib/jemalloc/Makefile.inc"
.include "${LIBC_SRCTOP}/stdtime/Makefile.inc"
.include "${LIBC_SRCTOP}/string/Makefile.inc"
-.ifdef UNICODE
-CFLAGS+= -D_UNICODE_SOURCE
.include "${LIBC_SRCTOP}/unicode/Makefile.inc"
-.endif
.include "${LIBC_SRCTOP}/sys/Makefile.inc"
.include "${LIBC_SRCTOP}/rpc/Makefile.inc"
.include "${LIBC_SRCTOP}/uuid/Makefile.inc"
Modified: soc2014/ghostmansd/head/lib/libc/locale/collate.c
==============================================================================
--- soc2014/ghostmansd/head/lib/libc/locale/collate.c Thu Aug 14 21:43:20 2014 (r272444)
+++ soc2014/ghostmansd/head/lib/libc/locale/collate.c Thu Aug 14 22:23:54 2014 (r272445)
@@ -41,6 +41,12 @@
#include <errno.h>
#include <unistd.h>
#include <sysexits.h>
+
+#include <sys/types.h>
+#include <db.h>
+#include <fcntl.h>
+#include <limits.h>
+
#include "un-namespace.h"
#include "collate.h"
@@ -50,39 +56,12 @@
#include "libc_private.h"
-#ifdef _UNICODE_SOURCE
-#include <sys/types.h>
-#include <db.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <pthread.h>
-
-
struct __colldb {
uint32_t version;
void *handle;
};
-static void *handle = NULL;
-static pthread_once_t once = PTHREAD_ONCE_INIT;
-
-
-static void
-__colldb_root_init(void)
-{
- handle = __colldb_open("/usr/share/colldb/root.db");
-}
-
-
-void *
-__colldb_root_handle(void)
-{
- pthread_once(&once, &__colldb_root_init);
- return (handle);
-}
-
-
void *
__colldb_create(const char *path, int mode)
{
@@ -360,7 +339,6 @@
}
return state;
}
-#endif
/*
Modified: soc2014/ghostmansd/head/lib/libc/locale/xlocale.c
==============================================================================
--- soc2014/ghostmansd/head/lib/libc/locale/xlocale.c Thu Aug 14 21:43:20 2014 (r272444)
+++ soc2014/ghostmansd/head/lib/libc/locale/xlocale.c Thu Aug 14 22:23:54 2014 (r272445)
@@ -36,6 +36,24 @@
#include "libc_private.h"
#include "xlocale_private.h"
+
+/* Collation Database implementation. */
+static void *colldb_root_handle = NULL;
+static pthread_once_t colldb_root_once = PTHREAD_ONCE_INIT;
+
+static void colldb_root_init(void)
+{
+ colldb_root_handle =
+ __colldb_open("/usr/share/locale/UTF-8/LC_COLLATE");
+}
+
+void *__colldb_root_handle(void)
+{
+ _once(&colldb_root_once, &colldb_root_init);
+ return (colldb_root_handle);
+}
+
+
/**
* Each locale loader declares a global component. This is used by setlocale()
* and also by xlocale with LC_GLOBAL_LOCALE..
@@ -81,9 +99,7 @@
&__xlocale_global_time,
&__xlocale_global_messages
},
-#ifdef _UNICODE_SOURCE
NULL,
-#endif
1,
0,
1,
@@ -97,9 +113,7 @@
&__xlocale_C_ctype,
0, 0, 0, 0
},
-#ifdef _UNICODE_SOURCE
NULL,
-#endif
1,
0,
1,
Modified: soc2014/ghostmansd/head/lib/libc/locale/xlocale_private.h
==============================================================================
--- soc2014/ghostmansd/head/lib/libc/locale/xlocale_private.h Thu Aug 14 21:43:20 2014 (r272444)
+++ soc2014/ghostmansd/head/lib/libc/locale/xlocale_private.h Thu Aug 14 22:23:54 2014 (r272445)
@@ -38,12 +38,8 @@
#include <stdint.h>
#include <sys/types.h>
#include <machine/atomic.h>
-#include "setlocale.h"
-
-
-#ifdef _UNICODE_SOURCE
-#include <stdint.h>
#include <unistd.h>
+#include "setlocale.h"
/* Unicode canonicalization. */
int __uccclass(uint32_t);
@@ -89,7 +85,6 @@
size_t __ucsxfrm(uint32_t*, const uint32_t*, size_t, void*);
int __ucscoll(const uint32_t*, const uint32_t*, void*);
-#endif
enum {
@@ -137,10 +132,8 @@
struct xlocale_refcounted header;
/** Components for the locale. */
struct xlocale_component *components[XLC_LAST];
-#ifdef _UNICODE_SOURCE
/** Collation Database handle. */
void *colldb;
-#endif
/** Flag indicating if components[XLC_MONETARY] has changed since the
* last call to localeconv_l() with this locale. */
int monetary_locale_changed;
Modified: soc2014/ghostmansd/head/lib/libc/string/wcscoll.c
==============================================================================
--- soc2014/ghostmansd/head/lib/libc/string/wcscoll.c Thu Aug 14 21:43:20 2014 (r272444)
+++ soc2014/ghostmansd/head/lib/libc/string/wcscoll.c Thu Aug 14 22:23:54 2014 (r272445)
@@ -41,7 +41,9 @@
#include <wchar.h>
#include "collate.h"
-#ifndef _UNICODE_SOURCE
+#include <stdio.h>
+
+
static char *
__mbsdup(const wchar_t *ws)
{
@@ -62,24 +64,24 @@
return (mbs);
}
-#endif
+
int
wcscoll_l(const wchar_t *ws1, const wchar_t *ws2, locale_t locale)
{
-#ifdef _UNICODE_SOURCE
- const uint32_t *ucs1 = (const uint32_t*)ws1;
- const uint32_t *ucs2 = (const uint32_t*)ws2;
-
- return __ucscoll(ucs1, ucs2, locale->colldb);
-
-#else /* !_UNICODE_SOURCE */
char *mbs1, *mbs2;
int diff, sverrno;
FIX_LOCALE(locale);
+ const int init_error = errno;
+ const uint32_t *ucs1 = (const uint32_t*)ws1;
+ const uint32_t *ucs2 = (const uint32_t*)ws2;
struct xlocale_collate *table =
(struct xlocale_collate*)locale->components[XLC_COLLATE];
+ diff = __ucscoll(ucs1, ucs2, locale->colldb);
+ if (errno == init_error)
+ return diff;
+
if (table->__collate_load_error || MB_CUR_MAX > 1)
/*
* Locale has no special collating order, could not be
@@ -108,7 +110,6 @@
errno = sverrno;
return (diff);
-#endif
}
int
Modified: soc2014/ghostmansd/head/lib/libc/string/wcsxfrm.c
==============================================================================
--- soc2014/ghostmansd/head/lib/libc/string/wcsxfrm.c Thu Aug 14 21:43:20 2014 (r272444)
+++ soc2014/ghostmansd/head/lib/libc/string/wcsxfrm.c Thu Aug 14 22:23:54 2014 (r272445)
@@ -47,19 +47,21 @@
size_t
wcsxfrm_l(wchar_t * __restrict dest, const wchar_t * __restrict src, size_t len, locale_t locale)
{
-#ifdef _UNICODE_SOURCE
- uint32_t *udst = (uint32_t*)dest;
- const uint32_t *usrc = (const uint32_t*)src;
-
- return __ucsxfrm(udst, usrc, len, locale->colldb);
-#else
int prim, sec, l;
size_t slen;
char *mbsrc, *s, *ss;
FIX_LOCALE(locale);
+ uint32_t *udst = NULL;
+ size_t ulen = 0;
+ const int init_error = errno;
+ const uint32_t *usrc = (const uint32_t*)src;
struct xlocale_collate *table =
(struct xlocale_collate*)locale->components[XLC_COLLATE];
+ ulen = __ucsxfrm(udst, usrc, len, locale->colldb);
+ if (errno == init_errno)
+ return (ulen);
+
if (*src == L'\0') {
if (len != 0)
*dest = L'\0';
@@ -103,7 +105,6 @@
*dest = L'\0';
return (slen);
-#endif
}
size_t
Modified: soc2014/ghostmansd/head/lib/libc/unicode/ucscoll.c
==============================================================================
--- soc2014/ghostmansd/head/lib/libc/unicode/ucscoll.c Thu Aug 14 21:43:20 2014 (r272444)
+++ soc2014/ghostmansd/head/lib/libc/unicode/ucscoll.c Thu Aug 14 22:23:54 2014 (r272445)
@@ -30,6 +30,8 @@
#include "xlocale_private.h"
#include "coll.h"
+#include <stdio.h>
+
int
__ucscoll(const uint32_t *lstr, const uint32_t *rstr, void *colldb)
@@ -48,12 +50,14 @@
struct __colldb_weight weights[2][__COLLDB_WEIGHTS_MAX];
const int init_error = errno;
+ fprintf(stderr, "ucscoll\n");
if ((lstr == NULL) || (rstr == NULL)) {
errno = EINVAL;
return (0);
}
if (colldb == NULL)
colldb = __colldb_root;
+ fprintf(stderr, "root=%p\n", colldb);
for (i = 0; i < 2; ++i) {
size[i] = __ucsnorm(NULL, str[i], 0, __UC_NFD);
norm[i] = malloc(size[i] * sizeof(uint32_t));
Modified: soc2014/ghostmansd/head/lib/libcolldb/Makefile
==============================================================================
--- soc2014/ghostmansd/head/lib/libcolldb/Makefile Thu Aug 14 21:43:20 2014 (r272444)
+++ soc2014/ghostmansd/head/lib/libcolldb/Makefile Thu Aug 14 22:23:54 2014 (r272445)
@@ -1,6 +1,4 @@
-COLLDB= $(.CURDIR}/../../contrib/colldb
-.PATH: ${COLLDB}
-
+SHLIBDIR?= /usr/lib
LIB= colldb
SRCS= colldb.c
INCS= colldb.h
Copied and modified: soc2014/ghostmansd/head/lib/libcolldb/colldb (from r272296, soc2014/ghostmansd/head/contrib/colldb/colldb)
==============================================================================
--- soc2014/ghostmansd/head/contrib/colldb/colldb Tue Aug 12 17:29:20 2014 (r272296, copy source)
+++ soc2014/ghostmansd/head/lib/libcolldb/colldb Thu Aug 14 22:23:54 2014 (r272445)
@@ -15,8 +15,7 @@
__maintainer__ = "Dmitry Selyutin"
-#_dll_ = ctypes.CDLL("libcolldb.so")
-_dll_ = ctypes.CDLL("./colldb.so")
+_dll_ = ctypes.CDLL("libcolldb.so")
class _CollDB_Weight_(ctypes.Structure):
Copied: soc2014/ghostmansd/head/lib/libcolldb/colldb.c (from r272296, soc2014/ghostmansd/head/contrib/colldb/colldb.c)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ soc2014/ghostmansd/head/lib/libcolldb/colldb.c Thu Aug 14 22:23:54 2014 (r272445, copy of r272296, soc2014/ghostmansd/head/contrib/colldb/colldb.c)
@@ -0,0 +1,345 @@
+/*-
+ * Copyright (c) 2014 Dmitry Selyutin.
+ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ */
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <arpa/inet.h>
+#include "colldb.h"
+
+
+struct colldb {
+ uint32_t version;
+ void *handle;
+};
+
+
+void *
+colldb_create(const char *path, int mode)
+{
+ DBT key;
+ DBT value;
+ DB *db = NULL;
+ int error = 0;
+ void *colldb = NULL;
+ uint32_t version = 0;
+ int flags = (O_RDWR | O_CREAT | O_TRUNC);
+
+ colldb = calloc(1, sizeof(struct colldb));
+ if (colldb == NULL)
+ {
+ errno = ENOMEM;
+ return (NULL);
+ }
+ db = dbopen(path, flags, mode, DB_HASH, NULL);
+ if (db == NULL)
+ {
+ error = errno;
+ free(colldb);
+ errno = error;
+ return (NULL);
+ }
+ ((struct colldb*)colldb)->version = COLLDB_VERSION;
+
+ key.data = "TYPE";
+ value.data = "COLLATION";
+ key.size = (strlen("TYPE") + 1);
+ value.size = (strlen("COLLATION") + 1);
+ if (db->put(db, &key, &value, 0) == -1)
+ {
+ error = errno;
+ goto failure;
+ }
+
+ key.data = "VERSION";
+ version = htonl(((struct colldb*)colldb)->version);
+ value.data = &version;
+ key.size = (strlen("VERSION") + 1);
+ value.size = sizeof(((struct colldb*)colldb)->version);
+ if (db->put(db, &key, &value, 0) == -1)
+ {
+ error = errno;
+ goto failure;
+ }
+
+ ((struct colldb*)colldb)->handle = db;
+ return (colldb);
+
+failure:
+ (void) db->close(db);
+ free(colldb);
+ errno = error;
+ return (NULL);
+}
+
+
+void *
+colldb_open(const char *path)
+{
+ DBT key;
+ DBT value;
+ DB *db = NULL;
+ int error = 0;
+ int state = 0;
+ void *colldb = NULL;
+ int flags = O_RDONLY;
+
+ colldb = calloc(1, sizeof(struct colldb));
+ if (colldb == NULL)
+ {
+ errno = ENOMEM;
+ return (NULL);
+ }
+ db = dbopen(path, flags, 0, DB_HASH, NULL);
+ if (db == NULL)
+ {
+ error = errno;
+ free(colldb);
+ errno = error;
+ return (NULL);
+ }
+
+ key.data = "TYPE";
+ key.size = (strlen("TYPE") + 1);
+ state = db->get(db, &key, &value, 0);
+ if (state != 0)
+ {
+ if (state < 0)
+ error = errno;
+ else
+ error = EFTYPE;
+ goto failure;
+ }
+ if (strcmp(value.data, "COLLATION") != 0)
+ {
+ error = EFTYPE;
+ goto failure;
+ }
+
+ key.data = "VERSION";
+ key.size = (strlen("VERSION") + 1);
+ state = db->get(db, &key, &value, 0);
+ if (state != 0)
+ {
+ if (state < 0)
+ error = errno;
+ else
+ error = EFTYPE;
+ goto failure;
+ }
+ ((struct colldb*)colldb)->version =
+ ntohl(*(const uint32_t*)value.data);
+
+ ((struct colldb*)colldb)->handle = db;
+ return (colldb);
+
+failure:
+ (void) db->close(db);
+ free(colldb);
+ errno = error;
+ return (NULL);
+}
+
+
+int
+colldb_close(void *colldb)
+{
+ DB *db = NULL;
+ int error = 0;
+
+ if (colldb == NULL)
+ {
+ errno = EINVAL;
+ return (-1);
+ }
+ db = ((struct colldb*)colldb)->handle;
+ if (db == NULL)
+ {
+ errno = EINVAL;
+ return (-1);
+ }
+ if (db->close(db) == -1)
+ {
+ error = errno;
+ free(colldb);
+ errno = error;
+ return (-1);
+ }
+ free(colldb);
+ return (0);
+}
+
+
+int
+colldb_sync(void *colldb)
+{
+ DB *db = NULL;
+
+ if (colldb == NULL)
+ {
+ errno = EINVAL;
+ return (-1);
+ }
+ db = ((struct colldb*)colldb)->handle;
+ if (db == NULL)
+ {
+ errno = EINVAL;
+ return (-1);
+ }
+ return db->sync(db, 0);
+}
+
+
+int
+colldb_get(void *colldb,
+ struct colldb_key *key,
+ struct colldb_value *value)
+{
+ DBT dbkey;
+ DBT dbvalue;
+ DB *db = NULL;
+ size_t i = 0;
+ int state = 0;
+ uint32_t *keybuf = NULL;
+ struct colldb_weight *weights = NULL;
+
+ if ((colldb == NULL) || (key == NULL) || (value == NULL))
+ {
+ errno = EINVAL;
+ return (-1);
+ }
+ db = ((struct colldb*)colldb)->handle;
+ if ((db == NULL) || (key->chars == NULL) || (key->count == 0))
+ {
+ errno = EINVAL;
+ return (-1);
+ }
+
+ keybuf = key->chars;
+ if (__BYTE_ORDER__ != __ORDER_BIG_ENDIAN__)
+ {
+ keybuf = malloc(key->count * sizeof(*key->chars));
+ if (keybuf == NULL)
+ {
+ errno = ENOMEM;
+ return (-1);
+ }
+ for (i = 0; i < key->count; ++i)
+ keybuf[i] = htonl(key->chars[i]);
+ }
+
+ dbkey.data = keybuf;
+ dbkey.size = (key->count * sizeof(*key->chars));
+ state = db->get(db, &dbkey, &dbvalue, 0);
+ if (state != 0)
+ return (state);
+
+ weights = dbvalue.data;
+ if ((dbvalue.size / sizeof(*weights)) > value->count)
+ {
+ if (__BYTE_ORDER__ != __ORDER_BIG_ENDIAN__)
+ free(keybuf);
+ errno = ERANGE;
+ return (-1);
+ }
+ value->count = (dbvalue.size / sizeof(*weights));
+ for (i = 0; i < value->count; ++i)
+ {
+ value->weights[i].alternate = weights[i].alternate;
+ value->weights[i].level1 = ntohl(weights[i].level1);
+ value->weights[i].level2 = ntohl(weights[i].level2);
+ value->weights[i].level3 = ntohl(weights[i].level3);
+ value->weights[i].level4 = ntohl(weights[i].level4);
+ }
+ if (__BYTE_ORDER__ != __ORDER_BIG_ENDIAN__)
+ free(keybuf);
+ return (0);
+}
+
+
+int
+colldb_put(void *colldb,
+ struct colldb_key *key,
+ struct colldb_value *value)
+{
+ DBT dbkey;
+ DBT dbvalue;
+ DB *db = NULL;
+ size_t i = 0;
+ int state = 0;
+ int error = 0;
+ uint32_t *keybuf = NULL;
+ struct colldb_weight *valuebuf = NULL;
+
+ if ((colldb == NULL) || (key == NULL) || (value == NULL))
+ {
+ errno = EINVAL;
+ return (-1);
+ }
+ db = ((struct colldb*)colldb)->handle;
+ if ((db == NULL) || (key->chars == NULL) || (key->count == 0))
+ {
+ errno = EINVAL;
+ return (-1);
+ }
+
+ keybuf = key->chars;
+ valuebuf = value->weights;
+ if (__BYTE_ORDER__ != __ORDER_BIG_ENDIAN__)
+ {
+ keybuf = malloc(key->count * sizeof(*key->chars));
+ valuebuf = malloc(value->count * sizeof(*value->weights));
+ if ((keybuf == NULL) || (valuebuf == NULL))
+ {
+ errno = ENOMEM;
+ return (-1);
+ }
+ for (i = 0; i < key->count; ++i)
+ keybuf[i] = htonl(key->chars[i]);
+ for (i = 0; i < value->count; ++i)
+ {
+ valuebuf[i].alternate = value->weights[i].alternate;
+ valuebuf[i].level1 = htonl(value->weights[i].level1);
+ valuebuf[i].level2 = htonl(value->weights[i].level2);
+ valuebuf[i].level3 = htonl(value->weights[i].level3);
+ valuebuf[i].level4 = htonl(value->weights[i].level4);
+ }
+ }
+
+ dbkey.data = keybuf;
+ dbvalue.data = valuebuf;
+ dbkey.size = (key->count * sizeof(*key->chars));
+ dbvalue.size = (value->count * sizeof(*value->weights));
+ state = db->put(db, &dbkey, &dbvalue, 0);
+ if (__BYTE_ORDER__ != __ORDER_BIG_ENDIAN__)
+ {
+ error = errno;
+ free(keybuf);
+ free(valuebuf);
+ errno = error;
+ }
+ return state;
+}
Copied: soc2014/ghostmansd/head/lib/libcolldb/colldb.h (from r272296, soc2014/ghostmansd/head/contrib/colldb/colldb.h)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ soc2014/ghostmansd/head/lib/libcolldb/colldb.h Thu Aug 14 22:23:54 2014 (r272445, copy of r272296, soc2014/ghostmansd/head/contrib/colldb/colldb.h)
@@ -0,0 +1,94 @@
+/*-
+ * Copyright (c) 2014 Dmitry Selyutin.
+ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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, DECOMPOSITION, 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 _COLLDB_H_
+#define _COLLDB_H_
+
+
+/*
+ * Unicode Collation Database
+ * Database is a map of struct colldb_key and struct colldb_value pairs,
+ * where each uint32_t integer is stored in network byte order. Conversion
+ * between host and network byte order is done implicitly.
+ * Each database must contain at least "TYPE" and "VERSION" keys, where
+ * the first one must always be "COLLATION", the last one must be a version
+ * as unsigned 32-bit integer. When use creates a new collation database,
+ * these keys are initialized automatically.
+ *
+ * colldb_put() accepts database, key and value. If necessary, it converts
+ * key and value into the network byte order before writing.
+ *
+ * colldb_get() accepts database, key and value. Key is converted to network
+ * byte order if necessary. Fields of struct colldb_value must be already
+ * correctly initialized, since value from database is written directly to it.
+ * Usually it is enough to allocate COLLDB_WEIGHTS_MAX weights. However,
+ * in order to support exotic databases, colldb_get() may return -1 and set
+ * errno to ERANGE to indicate that struct colldb_value must allocate
+ * a larger weights buffer.
+ */
+
+#include <stdint.h>
+#include <sys/types.h>
+#include <db.h>
+#include <fcntl.h>
+#include <limits.h>
+
+
+#define COLLDB_VERSION 0x00000001
+#define COLLDB_WEIGHTS_MAX 10
+
+struct colldb_weight {
+ uint8_t alternate;
+ uint32_t level1;
+ uint32_t level2;
+ uint32_t level3;
+ uint32_t level4;
+};
+
+struct colldb_key {
+ size_t count;
+ uint32_t *chars;
+};
+
+struct colldb_value {
+ size_t count;
+ struct colldb_weight *weights;
+};
+
+
+void* colldb_create(const char*, int mode);
+void* colldb_open(const char*);
+int colldb_close(void*);
+int colldb_sync(void*);
+int colldb_get(void*,
+ struct colldb_key*,
+ struct colldb_value*);
+int colldb_put(void*,
+ struct colldb_key*,
+ struct colldb_value*);
+
+
+#endif
More information about the svn-soc-all
mailing list