aboutsummaryrefslogtreecommitdiffstats
path: root/src/serdi.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2021-01-13 19:34:11 +0100
committerDavid Robillard <d@drobilla.net>2021-03-08 23:23:05 -0500
commit2e25fe1e64f487fd91ff6f636bf3249b761ffcdc (patch)
tree73dc6d1731442acd26ea5b1f11de000c8dd31967 /src/serdi.c
parente6abc21f9bde66d8f60078493354ba3713f9fcd8 (diff)
downloadserd-2e25fe1e64f487fd91ff6f636bf3249b761ffcdc.tar.gz
serd-2e25fe1e64f487fd91ff6f636bf3249b761ffcdc.tar.bz2
serd-2e25fe1e64f487fd91ff6f636bf3249b761ffcdc.zip
Use a fixed-size reader stack
This improves performance, and makes the reader more suitable for embedded or network-facing applications, at the cost of requiring the user to specify a maximum stack size.
Diffstat (limited to 'src/serdi.c')
-rw-r--r--src/serdi.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/serdi.c b/src/serdi.c
index 6049c31b..d2828ea2 100644
--- a/src/serdi.c
+++ b/src/serdi.c
@@ -28,8 +28,10 @@
# include <io.h>
#endif
+#include <limits.h>
#include <stdbool.h>
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#define SERDI_ERROR(msg) fprintf(stderr, "serdi: " msg)
@@ -102,6 +104,7 @@ print_usage(const char* name, bool error)
fprintf(os, " -f Keep full URIs in input (don't qualify).\n");
fprintf(os, " -h Display this help and exit.\n");
fprintf(os, " -i SYNTAX Input syntax: turtle/ntriples/trig/nquads.\n");
+ fprintf(os, " -k BYTES Parser stack size.\n");
fprintf(os, " -l Lax (non-strict) parsing.\n");
fprintf(os, " -o SYNTAX Output syntax: turtle/ntriples/nquads.\n");
fprintf(os, " -p PREFIX Add PREFIX to blank node IDs.\n");
@@ -174,6 +177,7 @@ main(int argc, char** argv)
bool full_uris = false;
bool lax = false;
bool quiet = false;
+ size_t stack_size = 4194304;
const char* add_prefix = NULL;
const char* chop_prefix = NULL;
const char* root_uri = NULL;
@@ -212,6 +216,17 @@ main(int argc, char** argv)
if (!(input_syntax = get_syntax(argv[a]))) {
return print_usage(argv[0], true);
}
+ } else if (argv[a][1] == 'k') {
+ if (++a == argc) {
+ return missing_arg(argv[0], 'k');
+ }
+ char* endptr = NULL;
+ const long size = strtol(argv[a], &endptr, 10);
+ if (size <= 0 || size == LONG_MAX || *endptr != '\0') {
+ SERDI_ERRORF("invalid stack size `%s'\n", argv[a]);
+ return 1;
+ }
+ stack_size = (size_t)size;
} else if (argv[a][1] == 'o') {
if (++a == argc) {
return missing_arg(argv[0], 'o');
@@ -284,7 +299,7 @@ main(int argc, char** argv)
output_syntax, writer_flags, env, (SerdWriteFunc)fwrite, out_fd);
SerdReader* const reader =
- serd_reader_new(input_syntax, serd_writer_sink(writer));
+ serd_reader_new(input_syntax, serd_writer_sink(writer), stack_size);
serd_reader_set_strict(reader, !lax);
if (quiet) {