diff options
author | David Robillard <d@drobilla.net> | 2016-03-15 14:52:47 -0400 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2016-03-15 14:52:47 -0400 |
commit | ce981fefe0c4d4f9c871b574a92eec06e3149e3e (patch) | |
tree | 92d7bf7e914cc3b9effc82de64350f0d1bc2bc6e | |
parent | 19cd4c95e10ec83f8fbf41809e9d3688c64bd2d8 (diff) | |
download | sord-ce981fefe0c4d4f9c871b574a92eec06e3149e3e.tar.gz sord-ce981fefe0c4d4f9c871b574a92eec06e3149e3e.tar.bz2 sord-ce981fefe0c4d4f9c871b574a92eec06e3149e3e.zip |
Make sord_node_get_counted return byte count
Also clarify formerly ambiguous documentation, and add
sord_node_get_string_measured to get both byte and character counts.
Technically, this breaks behaviour, but most (if not all) existing code
that uses this function was actually expecting a byte count. This is
unsurprising since a UTF-8 character count is almost always useless.
This approach causes less problems in reality, since it fixes broken
behaviour in the wild without requiring any changes in user code.
-rw-r--r-- | NEWS | 6 | ||||
-rw-r--r-- | sord/sord.h | 14 | ||||
-rw-r--r-- | src/sord.c | 14 | ||||
-rw-r--r-- | src/sord_test.c | 31 | ||||
-rw-r--r-- | wscript | 2 |
5 files changed, 53 insertions, 14 deletions
@@ -1,10 +1,12 @@ -sord (0.14.1) unstable; +sord (0.15.1) unstable; * Fix documentation generation * Return error from sord_inserter_write_statement() if a node can not be written (e.g. undefined prefix) + * Make sord_node_get_counted return byte count, and clarify documentation + * Add sord_node_get_string_measured to get both byte and character counts - -- David Robillard <d@drobilla.net> Fri, 04 Dec 2015 21:23:36 -0500 + -- David Robillard <d@drobilla.net> Tue, 15 Mar 2016 14:51:35 -0400 sord (0.14.0) stable; diff --git a/sord/sord.h b/sord/sord.h index dd671de..e93cff8 100644 --- a/sord/sord.h +++ b/sord/sord.h @@ -248,11 +248,21 @@ const uint8_t* sord_node_get_string(const SordNode* node); /** - Return the string value of a node, and set `len` to its length. + Return the string value of a node, and set `bytes` to its length in bytes. */ SORD_API const uint8_t* -sord_node_get_string_counted(const SordNode* node, size_t* len); +sord_node_get_string_counted(const SordNode* node, size_t* bytes); + +/** + Return the string value of a node, and set `bytes` to its length in bytes, + and `count` to its length in characters. +*/ +SORD_API +const uint8_t* +sord_node_get_string_measured(const SordNode* node, + size_t* bytes, + size_t* chars); /** Return the language of a literal node (or NULL). @@ -919,9 +919,19 @@ sord_node_get_string(const SordNode* node) } const uint8_t* -sord_node_get_string_counted(const SordNode* node, size_t* len) +sord_node_get_string_counted(const SordNode* node, size_t* bytes) { - *len = node->node.n_chars; + *bytes = node->node.n_bytes; + return node->node.buf; +} + +const uint8_t* +sord_node_get_string_measured(const SordNode* node, + size_t* bytes, + size_t* chars) +{ + *bytes = node->node.n_bytes; + *chars = node->node.n_chars; return node->node.buf; } diff --git a/src/sord_test.c b/src/sord_test.c index ea258b0..c6e6a5b 100644 --- a/src/sord_test.c +++ b/src/sord_test.c @@ -515,17 +515,34 @@ main(int argc, char** argv) goto fail; } - size_t len; - const uint8_t* str = sord_node_get_string_counted(lit_id2, &len); + if (sord_num_nodes(world) != initial_num_nodes) { + return test_fail("Num nodes %zu != %zu\n", + sord_num_nodes(world), initial_num_nodes); + } + + const uint8_t ni_hao[] = { 0xE4, 0xBD, 0xA0, 0xE5, 0xA5, 0xBD }; + SordNode* chello = sord_new_literal(world, NULL, ni_hao, "cmn"); + + // Test literal length + size_t n_bytes; + size_t n_chars; + const uint8_t* str = sord_node_get_string_counted(lit_id2, &n_bytes); if (strcmp((const char*)str, "hello")) { return test_fail("Literal node corrupt\n"); - } else if (len != strlen("hello")) { - return test_fail("Literal length incorrect\n"); + } else if (n_bytes != strlen("hello")) { + return test_fail("ASCII literal byte count incorrect\n"); } - if (sord_num_nodes(world) != initial_num_nodes) { - return test_fail("Num nodes %zu != %zu\n", - sord_num_nodes(world), initial_num_nodes); + str = sord_node_get_string_measured(lit_id2, &n_bytes, &n_chars); + if (n_bytes != strlen("hello") || n_chars != strlen("hello")) { + return test_fail("ASCII literal measured length incorrect\n"); + } + + str = sord_node_get_string_measured(chello, &n_bytes, &n_chars); + if (n_bytes != 6) { + return test_fail("Multi-byte literal byte count incorrect\n"); + } else if (n_chars != 2) { + return test_fail("Multi-byte literal character count incorrect\n"); } // Check interning doesn't clash non-equivalent values @@ -11,7 +11,7 @@ import waflib.extras.autowaf as autowaf # major increment <=> incompatible changes # minor increment <=> compatible changes (additions) # micro increment <=> no interface changes -SORD_VERSION = '0.14.1' +SORD_VERSION = '0.15.1' SORD_MAJOR_VERSION = '0' # Mandatory waf variables |