aboutsummaryrefslogtreecommitdiffstats
path: root/src/reader.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2021-01-13 23:47:44 +0100
committerDavid Robillard <d@drobilla.net>2022-01-13 23:03:33 -0500
commiteada1e129cfcd931583ae0ca3a5c7d55e38d6720 (patch)
tree1e0032084ae14a375bc316f5e3c4cc0f684320e7 /src/reader.c
parentf3d7f3079a954d7c88c0af615bf0308fa40a062c (diff)
downloadserd-eada1e129cfcd931583ae0ca3a5c7d55e38d6720.tar.gz
serd-eada1e129cfcd931583ae0ca3a5c7d55e38d6720.tar.bz2
serd-eada1e129cfcd931583ae0ca3a5c7d55e38d6720.zip
Simplify stack management by popping in bulk at higher levels
Since all memory used by the reader is POD in the stack, there is no benefit to forcing code to explicitly pop everything pushed to the stack, since any function can record an offset and pop back down to it regardless of what its callers pushed if it knows that it does not need those items.
Diffstat (limited to 'src/reader.c')
-rw-r--r--src/reader.c34
1 files changed, 7 insertions, 27 deletions
diff --git a/src/reader.c b/src/reader.c
index d89ea197..04c7f372 100644
--- a/src/reader.c
+++ b/src/reader.c
@@ -79,6 +79,13 @@ push_node_padded(SerdReader* const reader,
const char* const str,
const size_t length)
{
+ // Push a null byte to ensure the previous node was null terminated
+ char* terminator = (char*)serd_stack_push(&reader->stack, 1);
+ if (!terminator) {
+ return NULL;
+ }
+ *terminator = 0;
+
void* mem = serd_stack_push_aligned(
&reader->stack, sizeof(SerdNode) + maxlen + 1, sizeof(SerdNode));
@@ -95,12 +102,6 @@ push_node_padded(SerdReader* const reader,
char* buf = (char*)(node + 1);
memcpy(buf, str, length + 1);
-#ifdef SERD_STACK_CHECK
- reader->allocs = (SerdNode**)realloc(
- reader->allocs, sizeof(reader->allocs) * (++reader->n_allocs));
- reader->allocs[reader->n_allocs - 1] =
- (SerdNode*)((char*)mem - reader->stack.buf);
-#endif
return node;
}
@@ -113,21 +114,6 @@ push_node(SerdReader* const reader,
return push_node_padded(reader, length, type, str, length);
}
-SerdNode*
-pop_node(SerdReader* const reader, const SerdNode* const node)
-{
- if (node && node != reader->rdf_first && node != reader->rdf_rest &&
- node != reader->rdf_nil) {
-#ifdef SERD_STACK_CHECK
- SERD_STACK_ASSERT_TOP(reader, node);
- --reader->n_allocs;
-#endif
- char* const top = reader->stack.buf + reader->stack.size;
- serd_stack_pop_aligned(&reader->stack, (size_t)(top - (char*)node));
- }
- return NULL;
-}
-
SerdStatus
emit_statement(SerdReader* const reader,
const ReadContext ctx,
@@ -220,15 +206,9 @@ serd_reader_free(SerdReader* const reader)
return;
}
- pop_node(reader, reader->rdf_nil);
- pop_node(reader, reader->rdf_rest);
- pop_node(reader, reader->rdf_first);
serd_reader_finish(reader);
serd_node_free(reader->default_graph);
-#ifdef SERD_STACK_CHECK
- free(reader->allocs);
-#endif
free(reader->stack.buf);
free(reader->bprefix);
free(reader);