aboutsummaryrefslogtreecommitdiffstats
path: root/tools/serd-filter.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/serd-filter.c')
-rw-r--r--tools/serd-filter.c34
1 files changed, 21 insertions, 13 deletions
diff --git a/tools/serd-filter.c b/tools/serd-filter.c
index a6f9b484..147bf51d 100644
--- a/tools/serd-filter.c
+++ b/tools/serd-filter.c
@@ -66,10 +66,10 @@ on_pattern_event(void* const handle, const SerdEvent* const event)
// Parse a pattern from some input and return a new filter for it
static SerdSink*
-parse_pattern(SerdWorld* const world,
- const SerdSink* const sink,
- SerdByteSource* const byte_source,
- const bool inclusive)
+parse_pattern(SerdWorld* const world,
+ const SerdSink* const sink,
+ SerdInputStream* const in,
+ const bool inclusive)
{
SerdEnv* const env = serd_env_new(SERD_EMPTY_STRING());
FilterPattern pat = {NULL, NULL, NULL, NULL};
@@ -77,11 +77,15 @@ parse_pattern(SerdWorld* const world,
SerdReader* reader = serd_reader_new(
world, SERD_NQUADS, SERD_READ_VARIABLES, env, in_sink, 4096);
- SerdStatus st = serd_reader_start(reader, byte_source);
+ const SerdNode* pattern_name =
+ serd_nodes_string(serd_world_nodes(world), SERD_STRING("pattern"));
+
+ SerdStatus st = serd_reader_start(reader, in, pattern_name, 1);
if (!st) {
st = serd_reader_read_document(reader);
}
+ serd_close_input(in);
serd_reader_free(reader);
serd_env_free(env);
serd_sink_free(in_sink);
@@ -135,24 +139,29 @@ run(Options opts)
const SerdSink* const target = serd_writer_sink(app.writer);
// Open the pattern input (either a string or filename)
- SerdByteSource* const pattern =
- opts.pattern ? serd_byte_source_new_string(opts.pattern, NULL)
- : opts.pattern_file
- ? serd_byte_source_new_filename(opts.pattern_file, opts.common.block_size)
- : NULL;
- if (!pattern) {
+ SerdInputStream pattern = {NULL, NULL, NULL, NULL};
+ const char* position = opts.pattern;
+ if (opts.pattern) {
+ pattern = serd_open_input_string(&position);
+ } else if (opts.pattern_file) {
+ pattern = serd_open_input_file(opts.pattern_file);
+ }
+
+ if (!pattern.stream) {
log_error(app.world, "failed to open pattern");
return SERD_ERR_UNKNOWN;
}
// Set up the output pipeline: filter -> writer
SerdSink* const filter =
- parse_pattern(app.world, target, pattern, !opts.invert);
+ parse_pattern(app.world, target, &pattern, !opts.invert);
if (!filter) {
log_error(app.world, "failed to set up filter");
return SERD_ERR_UNKNOWN;
}
+ serd_close_input(&pattern);
+
// Read all the inputs, which drives the writer to emit the output
if (!(st = serd_read_inputs(app.world,
opts.common,
@@ -168,7 +177,6 @@ run(Options opts)
}
serd_sink_free(filter);
- serd_byte_source_free(pattern);
const SerdStatus cst = serd_tool_cleanup(app);
return st ? st : cst;