From 583af959cc8b804914c887b9dc2b1c821bdf41ab Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 11 May 2018 11:09:23 +0200 Subject: Move system utilities to separate source files --- src/byte_sink.h | 4 +++- src/byte_source.c | 6 +++++- src/n3.c | 1 - src/reader.c | 2 ++ src/serd_internal.h | 43 ------------------------------------------- src/serdi.c | 1 + src/string.c | 1 + src/string_utils.h | 1 + src/system.c | 36 ++++++++++++++++++++++++++++++++++++ src/system.h | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/world.c | 5 ++++- src/writer.c | 1 + wscript | 1 + 13 files changed, 99 insertions(+), 47 deletions(-) create mode 100644 src/system.c create mode 100644 src/system.h diff --git a/src/byte_sink.h b/src/byte_sink.h index cd9cbce6..0d825020 100644 --- a/src/byte_sink.h +++ b/src/byte_sink.h @@ -22,6 +22,8 @@ #include "serd/serd.h" +#include "system.h" + typedef struct SerdByteSinkImpl { SerdWriteFunc sink; void* stream; @@ -39,7 +41,7 @@ serd_byte_sink_new(SerdWriteFunc sink, void* stream, size_t block_size) bsink.size = 0; bsink.block_size = block_size; bsink.buf = ((block_size > 1) - ? (char*)serd_bufalloc(block_size) + ? (char*)serd_allocate_buffer(block_size) : NULL); return bsink; } diff --git a/src/byte_source.c b/src/byte_source.c index 2d79e161..19e942a5 100644 --- a/src/byte_source.c +++ b/src/byte_source.c @@ -15,9 +15,13 @@ */ #include "byte_source.h" +#include "system.h" #include "serd_internal.h" +#include +#include + SerdStatus serd_byte_source_page(SerdByteSource* source) { @@ -56,7 +60,7 @@ serd_byte_source_open_source(SerdByteSource* source, source->from_stream = true; if (page_size > 1) { - source->file_buf = (uint8_t*)serd_bufalloc(page_size); + source->file_buf = (uint8_t*)serd_allocate_buffer(page_size); source->read_buf = source->file_buf; memset(source->file_buf, '\0', page_size); } else { diff --git a/src/n3.c b/src/n3.c index e200f323..1d43572b 100644 --- a/src/n3.c +++ b/src/n3.c @@ -18,7 +18,6 @@ #include #include -#include #include #include #include diff --git a/src/reader.c b/src/reader.c index f8459e45..c50b4865 100644 --- a/src/reader.c +++ b/src/reader.c @@ -25,6 +25,8 @@ #include #include "reader.h" +#include "system.h" +#include "world.h" static SerdStatus serd_reader_prepare(SerdReader* reader); diff --git a/src/serd_internal.h b/src/serd_internal.h index f06c7051..911d296f 100644 --- a/src/serd_internal.h +++ b/src/serd_internal.h @@ -17,57 +17,14 @@ #ifndef SERD_INTERNAL_H #define SERD_INTERNAL_H -#define _POSIX_C_SOURCE 200809L /* for posix_memalign and posix_fadvise */ - -#include -#include -#include -#include - #include "serd/serd.h" #include "serd_config.h" -#include "world.h" - -#if defined(HAVE_FILENO) -# include -#endif - #define NS_XSD "http://www.w3.org/2001/XMLSchema#" #define NS_RDF "http://www.w3.org/1999/02/22-rdf-syntax-ns#" -#define SERD_PAGE_SIZE 4096 - #ifndef MIN # define MIN(a, b) (((a) < (b)) ? (a) : (b)) #endif -/** fread-like wrapper for getc (which is faster). */ -static inline size_t -serd_file_read_byte(void* buf, size_t size, size_t nmemb, void* stream) -{ - (void)size; - (void)nmemb; - - const int c = getc((FILE*)stream); - if (c == EOF) { - *((uint8_t*)buf) = 0; - return 0; - } - *((uint8_t*)buf) = (uint8_t)c; - return 1; -} - -static inline void* -serd_bufalloc(size_t size) -{ -#ifdef HAVE_POSIX_MEMALIGN - void* ptr; - const int ret = posix_memalign(&ptr, SERD_PAGE_SIZE, size); - return ret ? NULL : ptr; -#else - return malloc(size); -#endif -} - #endif // SERD_INTERNAL_H diff --git a/src/serdi.c b/src/serdi.c index 0d0bce04..1272a70b 100644 --- a/src/serdi.c +++ b/src/serdi.c @@ -27,6 +27,7 @@ #include #include "string_utils.h" +#include "system.h" #include "world.h" #define SERDI_ERROR(msg) fprintf(stderr, "serdi: " msg); diff --git a/src/string.c b/src/string.c index 6e0edcd8..83f94fd9 100644 --- a/src/string.c +++ b/src/string.c @@ -18,6 +18,7 @@ #include "string_utils.h" #include +#include void serd_free(void* ptr) diff --git a/src/string_utils.h b/src/string_utils.h index f4620859..0c5ae557 100644 --- a/src/string_utils.h +++ b/src/string_utils.h @@ -18,6 +18,7 @@ #define SERD_STRING_UTILS_H #include +#include /** Unicode replacement character in UTF-8 */ static const uint8_t replacement_char[] = { 0xEF, 0xBF, 0xBD }; diff --git a/src/system.c b/src/system.c new file mode 100644 index 00000000..cf26bb37 --- /dev/null +++ b/src/system.c @@ -0,0 +1,36 @@ +/* + Copyright 2011-2018 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#define _POSIX_C_SOURCE 200809L /* for posix_memalign */ + +#include "system.h" + +#include "serd_config.h" +#include "serd_internal.h" + +#include + +void* +serd_allocate_buffer(size_t size) +{ +#ifdef HAVE_POSIX_MEMALIGN + void* ptr; + const int ret = posix_memalign(&ptr, SERD_PAGE_SIZE, size); + return ret ? NULL : ptr; +#else + return malloc(size); +#endif +} diff --git a/src/system.h b/src/system.h new file mode 100644 index 00000000..f17eb278 --- /dev/null +++ b/src/system.h @@ -0,0 +1,44 @@ +/* + Copyright 2011-2018 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef SERD_SYSTEM_H +#define SERD_SYSTEM_H + +#include +#include + +#define SERD_PAGE_SIZE 4096 + +/** Faster fread-like wrapper for getc. */ +static inline size_t +serd_file_read_byte(void* buf, size_t size, size_t nmemb, void* stream) +{ + (void)size; + (void)nmemb; + + const int c = getc((FILE*)stream); + if (c == EOF) { + *((uint8_t*)buf) = 0; + return 0; + } + *((uint8_t*)buf) = (uint8_t)c; + return 1; +} + +/** Allocate an aligned buffer for I/O. */ +void* serd_allocate_buffer(size_t size); + +#endif // SERD_SYSTEM_H diff --git a/src/world.c b/src/world.c index 7ec483e8..49a84d42 100644 --- a/src/world.c +++ b/src/world.c @@ -19,9 +19,12 @@ #include "serd_internal.h" #include "serd_config.h" +#include #include #include -#if defined(HAVE_POSIX_FADVISE) +#include +#include +#if defined(HAVE_POSIX_FADVISE) || defined(HAVE_FILENO) # include #endif diff --git a/src/writer.c b/src/writer.c index ed8ab0c3..796780ee 100644 --- a/src/writer.c +++ b/src/writer.c @@ -26,6 +26,7 @@ #include "stack.h" #include "string_utils.h" #include "uri_utils.h" +#include "world.h" typedef struct { SerdNode* graph; diff --git a/wscript b/wscript index 49cc37f9..d5b4b0e4 100644 --- a/wscript +++ b/wscript @@ -78,6 +78,7 @@ lib_source = ['src/byte_source.c', 'src/node.c', 'src/reader.c', 'src/string.c', + 'src/system.c', 'src/uri.c', 'src/world.c', 'src/writer.c'] -- cgit v1.2.1