| 
							- From 9d5ddba1337babab9e684b770eed923f96208e19 Mon Sep 17 00:00:00 2001
 - From: Hanspeter Portner <dev@open-music-kontrollers.ch>
 - Date: Thu, 11 Feb 2016 20:21:11 +0100
 - Subject: [PATCH] Fix UTF-8 string size in 'read_node'
 - 
 - 'sord_node_get_string_counted' returns character count, which then is used
 - to forge strings and literals. But the character count is different from
 - raw string size for strings containing multi-byte UTF-8 characters. Better
 - use 'strlen' to get the raw byte size of the strings to be forged,
 - if not, strings with multi-byte UTF-8 characters are truncatedly forged.
 - ---
 -  src/sratom.c        | 12 ++++++++----
 -  tests/sratom_test.c | 28 ++++++++++++++++++++++++++--
 -  2 files changed, 34 insertions(+), 6 deletions(-)
 - 
 - diff --git a/src/sratom.c b/src/sratom.c
 - index e0996c4..fdb4893 100644
 - --- a/src/sratom.c
 - +++ b/src/sratom.c
 - @@ -591,7 +591,8 @@ read_node(Sratom*         sratom,
 -  				lv2_atom_forge_write(forge, body, size);
 -  				free(body);
 -  			} else if (!strcmp(type_uri, LV2_ATOM__Path)) {
 - -				lv2_atom_forge_path(forge, str, len);
 - +				const size_t str_len = str ? strlen(str) : 0;
 - +				lv2_atom_forge_path(forge, str, str_len);
 -  			} else if (!strcmp(type_uri, LV2_MIDI__MidiEvent)) {
 -  				lv2_atom_forge_atom(forge, len / 2, sratom->midi_MidiEvent);
 -  				for (const char* s = str; s < str + len; s += 2) {
 - @@ -602,8 +603,9 @@ read_node(Sratom*         sratom,
 -  				}
 -  				lv2_atom_forge_pad(forge, len / 2);
 -  			} else {
 - +				const size_t str_len = str ? strlen(str) : 0;
 -  				lv2_atom_forge_literal(
 - -					forge, str, len,
 - +					forge, str, str_len,
 -  					sratom->map->map(sratom->map->handle, type_uri),
 -  					0);
 -  			}
 - @@ -611,13 +613,15 @@ read_node(Sratom*         sratom,
 -  			const char*  prefix   = "http://lexvo.org/id/iso639-3/";
 -  			const size_t lang_len = strlen(prefix) + strlen(language);
 -  			char*        lang_uri = (char*)calloc(lang_len + 1, 1);
 - +			const size_t str_len = str ? strlen(str) : 0;
 -  			snprintf(lang_uri, lang_len + 1, "%s%s", prefix, language);
 -  			lv2_atom_forge_literal(
 - -				forge, str, len, 0,
 - +				forge, str, str_len, 0,
 -  				sratom->map->map(sratom->map->handle, lang_uri));
 -  			free(lang_uri);
 -  		} else {
 - -			lv2_atom_forge_string(forge, str, len);
 - +			const size_t str_len = str ? strlen(str) : 0;
 - +			lv2_atom_forge_string(forge, str, str_len);
 -  		}
 -  	} else if (sord_node_get_type(node) == SORD_URI &&
 -  	           !(sratom->object_mode == SRATOM_OBJECT_MODE_BLANK_SUBJECT
 
 
  |