Date: Thu, 14 Aug 2014 22:32:44 GMT From: ghostmansd@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r272446 - soc2014/ghostmansd/head/lib/libc/locale Message-ID: <201408142232.s7EMWiZQ035965@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: ghostmansd Date: Thu Aug 14 22:32:43 2014 New Revision: 272446 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=272446 Log: source code reorganization due to namespace collision Modified: soc2014/ghostmansd/head/lib/libc/locale/collate.c soc2014/ghostmansd/head/lib/libc/locale/xlocale.c Modified: soc2014/ghostmansd/head/lib/libc/locale/collate.c ============================================================================== --- soc2014/ghostmansd/head/lib/libc/locale/collate.c Thu Aug 14 22:23:54 2014 (r272445) +++ soc2014/ghostmansd/head/lib/libc/locale/collate.c Thu Aug 14 22:32:43 2014 (r272446) @@ -42,11 +42,6 @@ #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" @@ -56,291 +51,6 @@ #include "libc_private.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 error = 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 = 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) { - error = errno; - free(keybuf); - errno = error; - return (state); - } - - weights = dbvalue.data; - if ((dbvalue.size / sizeof(*weights)) > value->count) { - 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); - } - 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); - } - - valuebuf = value->weights; - 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 (state != 0) { - error = errno; - free(keybuf); - free(valuebuf); - errno = error; - } - return state; -} - - /* * To avoid modifying the original (single-threaded) code too much, we'll just * define the old globals as fields inside the table. Modified: soc2014/ghostmansd/head/lib/libc/locale/xlocale.c ============================================================================== --- soc2014/ghostmansd/head/lib/libc/locale/xlocale.c Thu Aug 14 22:23:54 2014 (r272445) +++ soc2014/ghostmansd/head/lib/libc/locale/xlocale.c Thu Aug 14 22:32:43 2014 (r272446) @@ -33,11 +33,15 @@ #include <stdio.h> #include <string.h> #include <runetype.h> +#include <sys/types.h> +#include <db.h> +#include <fcntl.h> +#include <limits.h> #include "libc_private.h" #include "xlocale_private.h" -/* Collation Database implementation. */ +/* Collation Database. */ static void *colldb_root_handle = NULL; static pthread_once_t colldb_root_once = PTHREAD_ONCE_INIT; @@ -53,6 +57,284 @@ return (colldb_root_handle); } +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 error = 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 = 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) { + error = errno; + free(keybuf); + errno = error; + return (state); + } + + weights = dbvalue.data; + if ((dbvalue.size / sizeof(*weights)) > value->count) { + 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); + } + 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); + } + + valuebuf = value->weights; + 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 (state != 0) { + error = errno; + free(keybuf); + free(valuebuf); + errno = error; + } + return state; +} + /** * Each locale loader declares a global component. This is used by setlocale()
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201408142232.s7EMWiZQ035965>