Browse Source

Add sratom_set_env() for setting prefixes

zrythm_meson
David Robillard 6 years ago
parent
commit
b0339e5350
  1. 5
      NEWS
  2. 13
      sratom/sratom.h
  3. 72
      src/sratom.c
  4. 33
      tests/sratom_test.c
  5. 2
      wscript

5
NEWS

@ -1,12 +1,13 @@ @@ -1,12 +1,13 @@
sratom (0.4.10) unstable;
sratom (0.5.1) unstable;
* Add sratom_set_env() for setting prefixes
* Fix padding of constructed vectors (thanks Hanspeter Portner)
* Support round-trip serialisation of relative paths
* Support sequences with beat time stamps
* Fix warnings when building with ISO C++ compilers
* Upgrade to waf 1.8.14
-- David Robillard <d@drobilla.net> Sun, 24 Jul 2016 09:50:32 -0400
-- David Robillard <d@drobilla.net> Sun, 31 Jul 2016 02:31:55 -0400
sratom (0.4.6) stable;

13
sratom/sratom.h

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
Copyright 2012 David Robillard <http://drobilla.net>
Copyright 2012-2016 David Robillard <http://drobilla.net>
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
@ -100,6 +100,17 @@ SRATOM_API @@ -100,6 +100,17 @@ SRATOM_API
void
sratom_free(Sratom* sratom);
/**
Set the environment for reading or writing Turtle.
This can be used to set namespace prefixes and a base URI for
sratom_to_turtle() and sratom_from_turtle().
*/
SRATOM_API
void
sratom_set_env(Sratom* sratom,
SerdEnv* env);
/**
Set the sink(s) where sratom will write its output.

72
src/sratom.c

@ -31,6 +31,9 @@ @@ -31,6 +31,9 @@
#define USTR(str) ((const uint8_t*)(str))
static const SerdStyle style = (SerdStyle)(
SERD_STYLE_ABBREVIATED|SERD_STYLE_RESOLVED|SERD_STYLE_CURIED);
typedef enum {
MODE_SUBJECT,
MODE_BODY,
@ -45,6 +48,7 @@ struct SratomImpl { @@ -45,6 +48,7 @@ struct SratomImpl {
LV2_URID atom_beatTime;
LV2_URID midi_MidiEvent;
unsigned next_id;
SerdEnv* env;
SerdNode base_uri;
SerdURI base;
SerdStatementSink write_statement;
@ -77,19 +81,16 @@ SRATOM_API @@ -77,19 +81,16 @@ SRATOM_API
Sratom*
sratom_new(LV2_URID_Map* map)
{
Sratom* sratom = (Sratom*)malloc(sizeof(Sratom));
sratom->map = map;
sratom->atom_Event = map->map(map->handle, LV2_ATOM__Event);
sratom->atom_frameTime = map->map(map->handle, LV2_ATOM__frameTime);
sratom->atom_beatTime = map->map(map->handle, LV2_ATOM__beatTime);
sratom->midi_MidiEvent = map->map(map->handle, LV2_MIDI__MidiEvent);
sratom->next_id = 0;
sratom->base_uri = SERD_NODE_NULL;
sratom->base = SERD_URI_NULL;
sratom->object_mode = SRATOM_OBJECT_MODE_BLANK;
sratom->pretty_numbers = false;
memset(&sratom->nodes, 0, sizeof(sratom->nodes));
lv2_atom_forge_init(&sratom->forge, map);
Sratom* sratom = (Sratom*)calloc(1, sizeof(Sratom));
if (sratom) {
sratom->map = map;
sratom->atom_Event = map->map(map->handle, LV2_ATOM__Event);
sratom->atom_frameTime = map->map(map->handle, LV2_ATOM__frameTime);
sratom->atom_beatTime = map->map(map->handle, LV2_ATOM__beatTime);
sratom->midi_MidiEvent = map->map(map->handle, LV2_MIDI__MidiEvent);
sratom->object_mode = SRATOM_OBJECT_MODE_BLANK;
lv2_atom_forge_init(&sratom->forge, map);
}
return sratom;
}
@ -101,6 +102,13 @@ sratom_free(Sratom* sratom) @@ -101,6 +102,13 @@ sratom_free(Sratom* sratom)
free(sratom);
}
SRATOM_API
void
sratom_set_env(Sratom* sratom, SerdEnv* env)
{
sratom->env = env;
}
SRATOM_API
void
sratom_set_sink(Sratom* sratom,
@ -476,30 +484,14 @@ sratom_to_turtle(Sratom* sratom, @@ -476,30 +484,14 @@ sratom_to_turtle(Sratom* sratom,
uint32_t size,
const void* body)
{
SerdURI buri = SERD_URI_NULL;
SerdNode base = serd_node_new_uri_from_string(USTR(base_uri), &sratom->base, &buri);
SerdEnv* env = serd_env_new(&base);
SerdChunk str = { NULL, 0 };
serd_env_set_prefix_from_strings(env, USTR("midi"),
USTR(LV2_MIDI_PREFIX));
serd_env_set_prefix_from_strings(env, USTR("atom"),
USTR(LV2_ATOM_URI "#"));
serd_env_set_prefix_from_strings(env, USTR("rdf"), NS_RDF);
serd_env_set_prefix_from_strings(env, USTR("xsd"), NS_XSD);
SerdURI buri = SERD_URI_NULL;
SerdNode base = serd_node_new_uri_from_string(USTR(base_uri), &sratom->base, &buri);
SerdEnv* env = sratom->env ? sratom->env : serd_env_new(NULL);
SerdChunk str = { NULL, 0 };
SerdWriter* writer = serd_writer_new(
SERD_TURTLE,
(SerdStyle)(SERD_STYLE_ABBREVIATED |
SERD_STYLE_RESOLVED |
SERD_STYLE_CURIED),
env, &buri, serd_chunk_sink, &str);
// Write @prefix directives
serd_env_foreach(env,
(SerdPrefixSink)serd_writer_set_prefix,
writer);
SERD_TURTLE, style, env, &buri, serd_chunk_sink, &str);
serd_env_set_base_uri(env, &base);
sratom_set_sink(sratom, base_uri,
(SerdStatementSink)serd_writer_write_statement,
(SerdEndSink)serd_writer_end_anon,
@ -509,7 +501,9 @@ sratom_to_turtle(Sratom* sratom, @@ -509,7 +501,9 @@ sratom_to_turtle(Sratom* sratom,
serd_writer_finish(writer);
serd_writer_free(writer);
serd_env_free(env);
if (!sratom->env) {
serd_env_free(env);
}
serd_node_free(&base);
return (char*)serd_chunk_sink_finish(&str);
}
@ -806,7 +800,7 @@ sratom_from_turtle(Sratom* sratom, @@ -806,7 +800,7 @@ sratom_from_turtle(Sratom* sratom,
SerdNode base = serd_node_new_uri_from_string(USTR(base_uri), &sratom->base, NULL);
SordWorld* world = sord_world_new();
SordModel* model = sord_new(world, SORD_SPO, false);
SerdEnv* env = serd_env_new(&base);
SerdEnv* env = sratom->env ? sratom->env : serd_env_new(&base);
SerdReader* reader = sord_new_reader(model, env, SERD_TURTLE, NULL);
if (!serd_reader_read_string(reader, (const uint8_t*)str)) {
@ -830,7 +824,9 @@ sratom_from_turtle(Sratom* sratom, @@ -830,7 +824,9 @@ sratom_from_turtle(Sratom* sratom,
}
serd_reader_free(reader);
serd_env_free(env);
if (!sratom->env) {
serd_env_free(env);
}
sord_free(model);
sord_world_free(world);
serd_node_free(&base);

33
tests/sratom_test.c

@ -76,7 +76,7 @@ test_fail(const char* fmt, ...) @@ -76,7 +76,7 @@ test_fail(const char* fmt, ...)
}
static int
test(bool top_level, bool pretty_numbers)
test(SerdEnv* env, bool top_level, bool pretty_numbers)
{
LV2_URID_Map map = { NULL, urid_map };
LV2_URID_Unmap unmap = { NULL, urid_unmap };
@ -84,6 +84,7 @@ test(bool top_level, bool pretty_numbers) @@ -84,6 +84,7 @@ test(bool top_level, bool pretty_numbers)
lv2_atom_forge_init(&forge, &map);
Sratom* sratom = sratom_new(&map);
sratom_set_env(sratom, env);
sratom_set_pretty_numbers(sratom, pretty_numbers);
sratom_set_object_mode(
sratom,
@ -357,18 +358,36 @@ test(bool top_level, bool pretty_numbers) @@ -357,18 +358,36 @@ test(bool top_level, bool pretty_numbers)
return 0;
}
int
main(void)
static int
test_env(SerdEnv* env)
{
if (test(false, false)) {
if (test(env, false, false)) {
return 1;
} else if (test(true, false)) {
} else if (test(env, true, false)) {
return 1;
} else if (test(false, true)) {
} else if (test(env, false, true)) {
return 1;
} else if (test(true, true)) {
} else if (test(env, true, true)) {
return 1;
}
return 0;
}
int
main(void)
{
// Test with no environment
if (test_env(NULL)) {
return 1;
}
// Test with a prefix defined
SerdEnv* env = serd_env_new(NULL);
serd_env_set_prefix_from_strings(
env, (const uint8_t*)"eg", (const uint8_t*)"http://example.org/");
test_env(env);
serd_env_free(env);
return 0;
}

2
wscript

@ -9,7 +9,7 @@ import waflib.extras.autowaf as autowaf @@ -9,7 +9,7 @@ import waflib.extras.autowaf as autowaf
# major increment <=> incompatible changes
# minor increment <=> compatible changes (additions)
# micro increment <=> no interface changes
SRATOM_VERSION = '0.4.10'
SRATOM_VERSION = '0.5.1'
SRATOM_MAJOR_VERSION = '0'
# Mandatory waf variables

Loading…
Cancel
Save