Changeset: 41dd7a96f230 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/41dd7a96f230
Branch: ascii-flag
Log Message:
Merge with default branch.
diffs (truncated from 641 to 300 lines):
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -802,8 +802,8 @@ void TABLETdestroy_format(Tablet *as);
int TABLEToutput_file(Tablet *as, BAT *order, stream *s, bstream *in);
int TRACEtable(Client cntxt, BAT **r);
int TYPE_xml;
-int UTF8_strlen(const char *restrict s);
-int UTF8_strwidth(const char *restrict s);
+int UTF8_strlen(const char *s);
+int UTF8_strwidth(const char *s);
void addMalException(MalBlkPtr mb, str msg);
str addOptimizerPipe(Client cntxt, MalBlkPtr mb, const char *name);
str addPipeDefinition(Client cntxt, const char *name, const char *pipe);
@@ -1253,7 +1253,7 @@ const char *stoptraceRef;
void strAfterCall(ValPtr v, ValPtr bak);
void strBeforeCall(ValPtr v, ValPtr bak);
const char *strRef;
-int str_strlen(const char *restrict s);
+int str_strlen(const char *s);
const char *streamsRef;
const char *strimpsRef;
const char *subavgRef;
diff --git a/clients/mapiclient/mclient.c b/clients/mapiclient/mclient.c
--- a/clients/mapiclient/mclient.c
+++ b/clients/mapiclient/mclient.c
@@ -47,6 +47,10 @@
#include <locale.h>
+#ifdef HAVE_WCWIDTH
+#include <wchar.h>
+#endif
+
#ifdef HAVE_ICONV
#include <iconv.h>
#ifdef HAVE_NL_LANGINFO
@@ -413,6 +417,14 @@ utf8strlenmax(char *s, char *e, size_t m
c = (c << 6) | (*s & 0x3F);
if (--n == 0) {
/* last byte of a multi-byte character */
+#ifdef HAVE_WCWIDTH
+ n = wcwidth(c);
+ if (n >= 0)
+ len += n;
+ else
+ len++; /* assume width 1 if
unprintable */
+ n = 0;
+#else
len++;
/* this list was created by combining
* the code points marked as
@@ -546,7 +558,7 @@ utf8strlenmax(char *s, char *e, size_t m
len++;
else if (0x0080 <= c && c <= 0x009F)
len += 5;
-
+#endif
}
} else if ((*s & 0xE0) == 0xC0) {
assert(n == 0);
diff --git a/cmake/monetdb-defines.cmake b/cmake/monetdb-defines.cmake
--- a/cmake/monetdb-defines.cmake
+++ b/cmake/monetdb-defines.cmake
@@ -118,6 +118,7 @@ function(monetdb_configure_defines)
check_function_exists("task_info" HAVE_TASK_INFO)
check_function_exists("times" HAVE_TIMES)
check_function_exists("uname" HAVE_UNAME)
+ check_symbol_exists("wcwidth" "wchar.h" HAVE_WCWIDTH)
# Some libc versions on Linux distributions don't have it
check_symbol_exists("semtimedop" "sys/types.h;sys/ipc.h;sys/sem.h"
HAVE_SEMTIMEDOP)
cmake_push_check_state()
diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -774,13 +774,14 @@ HEAPincref(Heap *h)
*
* If we find file X.new, we move it over X (if present) and open it.
*/
-static gdk_return
-HEAPload_intern(Heap *h, const char *nme, const char *ext, const char *suffix,
bool trunc)
+gdk_return
+HEAPload(Heap *h, const char *nme, const char *ext, bool trunc)
{
size_t minsize;
int ret = 0;
char *srcpath, *dstpath;
lng t0;
+ const char suffix[] = ".new";
if (h->storage == STORE_INVALID || h->newstorage == STORE_INVALID) {
size_t allocated;
@@ -889,12 +890,6 @@ HEAPload_intern(Heap *h, const char *nme
return GDK_SUCCEED;
}
-gdk_return
-HEAPload(Heap *h, const char *nme, const char *ext, bool trunc)
-{
- return HEAPload_intern(h, nme, ext, ".new", trunc);
-}
-
/*
* @- HEAPsave
*
@@ -910,12 +905,13 @@ HEAPload(Heap *h, const char *nme, const
* After GDKsave returns successfully (>=0), we assume the heaps are
* safe on stable storage.
*/
-static gdk_return
-HEAPsave_intern(Heap *h, const char *nme, const char *ext, const char *suffix,
bool dosync, BUN free, MT_Lock *lock)
+gdk_return
+HEAPsave(Heap *h, const char *nme, const char *ext, bool dosync, BUN free,
MT_Lock *lock)
{
storage_t store = h->newstorage;
long_str extension;
gdk_return rc;
+ const char suffix[] = ".new";
if (h->base == NULL) {
GDKerror("no heap to save\n");
@@ -965,12 +961,6 @@ HEAPsave_intern(Heap *h, const char *nme
return rc;
}
-gdk_return
-HEAPsave(Heap *h, const char *nme, const char *ext, bool dosync, BUN free,
MT_Lock *lock)
-{
- return HEAPsave_intern(h, nme, ext, ".new", dosync, free, lock);
-}
-
int
HEAPwarm(Heap *h)
{
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -206,8 +206,10 @@ logbat_new(int tt, BUN size, role_t role
if (nb) {
BBP_pid(nb->batCacheid) = 0;
- if (role == PERSISTENT)
+ if (role == PERSISTENT) {
BATmode(nb, false);
+ nb = BATsetaccess(nb, BAT_READ);
+ }
} else {
TRC_CRITICAL(GDK, "creating new BAT[%s]#" BUNFMT " failed\n",
ATOMname(tt), size);
}
@@ -1661,14 +1663,14 @@ cleanup_and_swap(logger *lg, int *r, con
if (lid == -1)
continue; /* remove */
- if (BUNappend(nbids, &col, false) != GDK_SUCCEED ||
- BUNappend(noids, &nid, false) != GDK_SUCCEED ||
+ if (BUNappend(nbids, &col, true) != GDK_SUCCEED ||
+ BUNappend(noids, &nid, true) != GDK_SUCCEED ||
BUNappend(nlids, &lid, false) != GDK_SUCCEED ||
BUNappend(ncnts, &cnt, false) != GDK_SUCCEED)
err = 1;
if (BUNfnd(lg->dcatalog, &pos) != BUN_NONE) {
pos = (oid) (BATcount(nbids) - 1);
- if (BUNappend(ndels, &pos, false) != GDK_SUCCEED)
+ if (BUNappend(ndels, &pos, true) != GDK_SUCCEED)
err = 1;
}
}
@@ -1684,10 +1686,7 @@ cleanup_and_swap(logger *lg, int *r, con
/* point of no return */
if (log_switch_bat(catalog_bid, nbids, lg->fn, "catalog_bid") !=
GDK_SUCCEED ||
log_switch_bat(catalog_id, noids, lg->fn, "catalog_id") !=
GDK_SUCCEED ||
- log_switch_bat(dcatalog, ndels, lg->fn, "dcatalog") != GDK_SUCCEED
||
- (nbids = BATsetaccess(nbids, BAT_READ)) == NULL ||
- (noids = BATsetaccess(noids, BAT_READ)) == NULL ||
- (ndels = BATsetaccess(ndels, BAT_READ)) == NULL) {
+ log_switch_bat(dcatalog, ndels, lg->fn, "dcatalog") != GDK_SUCCEED)
{
logbat_destroy(nbids);
logbat_destroy(noids);
logbat_destroy(ndels);
@@ -1869,9 +1868,7 @@ bm_subcommit(logger *lg, logged_range *p
BATclear(lg->dseqs, true);
if (log_switch_bat(lg->seqs_id, ids, lg->fn, "seqs_id") !=
GDK_SUCCEED ||
- log_switch_bat(lg->seqs_val, vals, lg->fn, "seqs_val") !=
GDK_SUCCEED ||
- (ids = BATsetaccess(ids, BAT_READ)) == NULL ||
- (vals = BATsetaccess(vals, BAT_READ)) == NULL) {
+ log_switch_bat(lg->seqs_val, vals, lg->fn, "seqs_val") !=
GDK_SUCCEED) {
logbat_destroy(ids);
logbat_destroy(vals);
GDKfree(n);
@@ -2056,11 +2053,6 @@ log_load(const char *fn, const char *log
GDKerror("cannot create catalog bats");
goto error;
}
- if ((lg->catalog_bid = BATsetaccess(lg->catalog_bid, BAT_READ))
== NULL ||
- (lg->catalog_id = BATsetaccess(lg->catalog_id, BAT_READ))
== NULL ||
- (lg->dcatalog = BATsetaccess(lg->dcatalog, BAT_READ)) ==
NULL) {
- goto error;
- }
TRC_INFO(WAL, "create %s catalog\n", fn);
/* give the catalog bats names so we can find them
@@ -2211,6 +2203,11 @@ log_load(const char *fn, const char *log
GDKerror("Logger_new: cannot load seqs bats");
goto error;
}
+ if ((lg->seqs_val = BATsetaccess(lg->seqs_val, BAT_READ)) ==
NULL ||
+ (lg->seqs_id = BATsetaccess(lg->seqs_id, BAT_READ)) == NULL
||
+ (lg->dseqs = BATsetaccess(lg->dseqs, BAT_READ)) == NULL) {
+ goto error;
+ }
} else {
lg->seqs_id = logbat_new(TYPE_int, 1, PERSISTENT);
lg->seqs_val = logbat_new(TYPE_lng, 1, PERSISTENT);
@@ -2238,11 +2235,6 @@ log_load(const char *fn, const char *log
}
needcommit = true;
}
- if ((lg->seqs_val = BATsetaccess(lg->seqs_val, BAT_READ)) == NULL ||
- (lg->seqs_id = BATsetaccess(lg->seqs_id, BAT_READ)) == NULL ||
- (lg->dseqs = BATsetaccess(lg->dseqs, BAT_READ)) == NULL) {
- goto error;
- }
dbg = ATOMIC_GET(&GDKdebug);
ATOMIC_AND(&GDKdebug, ~CHECKMASK);
if (needcommit && bm_commit(lg, NULL, NULL, 0) != GDK_SUCCEED) {
diff --git a/monetdb5/modules/atoms/str.c b/monetdb5/modules/atoms/str.c
--- a/monetdb5/modules/atoms/str.c
+++ b/monetdb5/modules/atoms/str.c
@@ -69,6 +69,9 @@
#include <iconv.h>
#include <locale.h>
#endif
+#ifdef HAVE_WCWIDTH
+#include <wchar.h>
+#endif
#include "mal_interpreter.h"
#include "utf8.h"
@@ -3022,55 +3025,29 @@ STRepilogue(void *ret)
}
#ifndef NDEBUG
-static void
-UTF8_assert(const char *restrict s)
+static inline void
+UTF8_assert(const char *s)
{
- int c;
-
- if (s == NULL)
- return;
- if (*s == '\200' && s[1] == '\0')
- return; /* str_nil */
- while ((c = *s++) != '\0') {
- if ((c & 0x80) == 0)
- continue;
- if ((*s++ & 0xC0) != 0x80)
- assert(0);
- if ((c & 0xE0) == 0xC0)
- continue;
- if ((*s++ & 0xC0) != 0x80)
- assert(0);
- if ((c & 0xF0) == 0xE0)
- continue;
- if ((*s++ & 0xC0) != 0x80)
- assert(0);
- if ((c & 0xF8) == 0xF0)
- continue;
- assert(0);
- }
+ assert(strNil(s) || utf8valid(s) == 0);
}
#else
#define UTF8_assert(s) ((void) 0)
#endif
+/* return how many codepoints in the substring end in s starts */
static inline int
UTF8_strpos(const char *s, const char *end)
{
- int pos = 0;
-
UTF8_assert(s);
if (s > end) {
return -1;
}
- while (s < end) {
- /* just count leading bytes of encoded code points; only works
- * for correctly encoded UTF-8 */
- pos += (*s++ & 0xC0) != 0x80;
- }
- return pos;
+ return (int) utf8nlen(s, (size_t) (end - s));
}
+/* return a pointer to the byte that starts the pos'th (0-based)
+ * codepoint in s */
static inline str
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]