00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00021 #ifndef SERD_SERD_H
00022 #define SERD_SERD_H
00023
00024 #include <stddef.h>
00025 #include <stdint.h>
00026 #include <stdio.h>
00027
00028 #ifdef SERD_SHARED
00029 # ifdef _WIN32
00030 # define SERD_LIB_IMPORT __declspec(dllimport)
00031 # define SERD_LIB_EXPORT __declspec(dllexport)
00032 # else
00033 # define SERD_LIB_IMPORT __attribute__((visibility("default")))
00034 # define SERD_LIB_EXPORT __attribute__((visibility("default")))
00035 # endif
00036 # ifdef SERD_INTERNAL
00037 # define SERD_API SERD_LIB_EXPORT
00038 # else
00039 # define SERD_API SERD_LIB_IMPORT
00040 # endif
00041 #else
00042 # define SERD_API
00043 #endif
00044
00045 #ifdef __cplusplus
00046 extern "C" {
00047 #else
00048 # include <stdbool.h>
00049 #endif
00050
00063 typedef struct SerdEnvImpl SerdEnv;
00064
00071 typedef struct SerdReaderImpl SerdReader;
00072
00081 typedef struct SerdWriterImpl SerdWriter;
00082
00086 typedef enum {
00087 SERD_SUCCESS,
00088 SERD_FAILURE,
00089 SERD_ERR_UNKNOWN,
00090 SERD_ERR_BAD_SYNTAX,
00091 SERD_ERR_BAD_ARG,
00092 SERD_ERR_NOT_FOUND
00093 } SerdStatus;
00094
00098 typedef enum {
00103 SERD_TURTLE = 1,
00104
00109 SERD_NTRIPLES = 2
00110 } SerdSyntax;
00111
00115 typedef enum {
00116 SERD_EMPTY_S = 1 << 1,
00117 SERD_EMPTY_O = 1 << 2,
00118 SERD_ANON_S_BEGIN = 1 << 3,
00119 SERD_ANON_O_BEGIN = 1 << 4,
00120 SERD_ANON_CONT = 1 << 5,
00121 SERD_LIST_S_BEGIN = 1 << 6,
00122 SERD_LIST_O_BEGIN = 1 << 7,
00123 SERD_LIST_CONT = 1 << 8
00124 } SerdStatementFlag;
00125
00129 typedef uint32_t SerdStatementFlags;
00130
00140 typedef enum {
00146 SERD_NOTHING = 0,
00147
00153 SERD_LITERAL = 1,
00154
00163 SERD_URI = 2,
00164
00172 SERD_CURIE = 3,
00173
00182 SERD_BLANK = 4,
00183
00184 } SerdType;
00185
00189 typedef enum {
00190 SERD_HAS_NEWLINE = 1,
00191 SERD_HAS_QUOTE = 1 << 1
00192 } SerdNodeFlag;
00193
00197 typedef uint32_t SerdNodeFlags;
00198
00202 typedef struct {
00203 const uint8_t* buf;
00204 size_t n_bytes;
00205 size_t n_chars;
00206 SerdNodeFlags flags;
00207 SerdType type;
00208 } SerdNode;
00209
00213 typedef struct {
00214 const uint8_t* buf;
00215 size_t len;
00216 } SerdChunk;
00217
00225 typedef struct {
00226 SerdChunk scheme;
00227 SerdChunk authority;
00228 SerdChunk path_base;
00229 SerdChunk path;
00230 SerdChunk query;
00231 SerdChunk fragment;
00232 } SerdURI;
00233
00242 typedef enum {
00243 SERD_STYLE_ABBREVIATED = 1,
00244 SERD_STYLE_ASCII = 1 << 1,
00245 SERD_STYLE_RESOLVED = 1 << 2,
00246 SERD_STYLE_CURIED = 1 << 3,
00247 SERD_STYLE_BULK = 1 << 4
00248 } SerdStyle;
00249
00258 SERD_API
00259 const uint8_t*
00260 serd_strerror(SerdStatus status);
00261
00269 SERD_API
00270 size_t
00271 serd_strlen(const uint8_t* str, size_t* n_bytes, SerdNodeFlags* flags);
00272
00280 SERD_API
00281 double
00282 serd_strtod(const char* str, char** endptr);
00283
00294 SERD_API
00295 void*
00296 serd_base64_decode(const uint8_t* str, size_t len, size_t* size);
00297
00304 static const SerdURI SERD_URI_NULL = {{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}};
00305
00313 SERD_API
00314 const uint8_t*
00315 serd_uri_to_path(const uint8_t* uri);
00316
00326 SERD_API
00327 uint8_t*
00328 serd_file_uri_parse(const uint8_t* uri, uint8_t** hostname);
00329
00333 SERD_API
00334 bool
00335 serd_uri_string_has_scheme(const uint8_t* utf8);
00336
00340 SERD_API
00341 SerdStatus
00342 serd_uri_parse(const uint8_t* utf8, SerdURI* out);
00343
00347 SERD_API
00348 void
00349 serd_uri_resolve(const SerdURI* uri, const SerdURI* base, SerdURI* out);
00350
00354 typedef size_t (*SerdSink)(const void* buf, size_t len, void* stream);
00355
00359 SERD_API
00360 size_t
00361 serd_uri_serialise(const SerdURI* uri, SerdSink sink, void* stream);
00362
00370 SERD_API
00371 size_t
00372 serd_uri_serialise_relative(const SerdURI* uri,
00373 const SerdURI* base,
00374 const SerdURI* root,
00375 SerdSink sink,
00376 void* stream);
00377
00384 static const SerdNode SERD_NODE_NULL = { 0, 0, 0, 0, SERD_NOTHING };
00385
00391 SERD_API
00392 SerdNode
00393 serd_node_from_string(SerdType type, const uint8_t* str);
00394
00400 SERD_API
00401 SerdNode
00402 serd_node_copy(const SerdNode* node);
00403
00407 SERD_API
00408 bool
00409 serd_node_equals(const SerdNode* a, const SerdNode* b);
00410
00414 SERD_API
00415 SerdNode
00416 serd_node_new_uri_from_node(const SerdNode* uri_node,
00417 const SerdURI* base,
00418 SerdURI* out);
00419
00423 SERD_API
00424 SerdNode
00425 serd_node_new_uri_from_string(const uint8_t* str,
00426 const SerdURI* base,
00427 SerdURI* out);
00428
00439 SERD_API
00440 SerdNode
00441 serd_node_new_file_uri(const uint8_t* path,
00442 const uint8_t* hostname,
00443 SerdURI* out,
00444 bool escape);
00445
00456 SERD_API
00457 SerdNode
00458 serd_node_new_uri(const SerdURI* uri, const SerdURI* base, SerdURI* out);
00459
00475 SERD_API
00476 SerdNode
00477 serd_node_new_decimal(double d, unsigned frac_digits);
00478
00482 SERD_API
00483 SerdNode
00484 serd_node_new_integer(int64_t i);
00485
00495 SERD_API
00496 SerdNode
00497 serd_node_new_blob(const void* buf, size_t size, bool wrap_lines);
00498
00505 SERD_API
00506 void
00507 serd_node_free(SerdNode* node);
00508
00520 typedef SerdStatus (*SerdBaseSink)(void* handle,
00521 const SerdNode* uri);
00522
00528 typedef SerdStatus (*SerdPrefixSink)(void* handle,
00529 const SerdNode* name,
00530 const SerdNode* uri);
00531
00537 typedef SerdStatus (*SerdStatementSink)(void* handle,
00538 SerdStatementFlags flags,
00539 const SerdNode* graph,
00540 const SerdNode* subject,
00541 const SerdNode* predicate,
00542 const SerdNode* object,
00543 const SerdNode* object_datatype,
00544 const SerdNode* object_lang);
00545
00553 typedef SerdStatus (*SerdEndSink)(void* handle,
00554 const SerdNode* node);
00555
00565 SERD_API
00566 SerdEnv*
00567 serd_env_new(const SerdNode* base_uri);
00568
00572 SERD_API
00573 void
00574 serd_env_free(SerdEnv* env);
00575
00579 SERD_API
00580 const SerdNode*
00581 serd_env_get_base_uri(const SerdEnv* env,
00582 SerdURI* out);
00583
00587 SERD_API
00588 SerdStatus
00589 serd_env_set_base_uri(SerdEnv* env,
00590 const SerdNode* uri);
00591
00595 SERD_API
00596 SerdStatus
00597 serd_env_set_prefix(SerdEnv* env,
00598 const SerdNode* name,
00599 const SerdNode* uri);
00600
00604 SERD_API
00605 SerdStatus
00606 serd_env_set_prefix_from_strings(SerdEnv* env,
00607 const uint8_t* name,
00608 const uint8_t* uri);
00609
00613 SERD_API
00614 bool
00615 serd_env_qualify(const SerdEnv* env,
00616 const SerdNode* uri,
00617 SerdNode* prefix,
00618 SerdChunk* suffix);
00619
00623 SERD_API
00624 SerdStatus
00625 serd_env_expand(const SerdEnv* env,
00626 const SerdNode* curie,
00627 SerdChunk* uri_prefix,
00628 SerdChunk* uri_suffix);
00629
00633 SERD_API
00634 SerdNode
00635 serd_env_expand_node(const SerdEnv* env,
00636 const SerdNode* node);
00637
00641 SERD_API
00642 void
00643 serd_env_foreach(const SerdEnv* env,
00644 SerdPrefixSink func,
00645 void* handle);
00646
00656 SERD_API
00657 SerdReader*
00658 serd_reader_new(SerdSyntax syntax,
00659 void* handle,
00660 void (*free_handle)(void*),
00661 SerdBaseSink base_sink,
00662 SerdPrefixSink prefix_sink,
00663 SerdStatementSink statement_sink,
00664 SerdEndSink end_sink);
00665
00669 SERD_API
00670 void*
00671 serd_reader_get_handle(const SerdReader* reader);
00672
00682 SERD_API
00683 void
00684 serd_reader_add_blank_prefix(SerdReader* reader,
00685 const uint8_t* prefix);
00686
00694 SERD_API
00695 void
00696 serd_reader_set_default_graph(SerdReader* reader,
00697 const SerdNode* graph);
00698
00702 SERD_API
00703 SerdStatus
00704 serd_reader_read_file(SerdReader* reader,
00705 const uint8_t* uri);
00706
00710 SERD_API
00711 SerdStatus
00712 serd_reader_read_file_handle(SerdReader* reader,
00713 FILE* file,
00714 const uint8_t* name);
00715
00719 SERD_API
00720 SerdStatus
00721 serd_reader_read_string(SerdReader* me, const uint8_t* utf8);
00722
00726 SERD_API
00727 void
00728 serd_reader_free(SerdReader* reader);
00729
00739 SERD_API
00740 SerdWriter*
00741 serd_writer_new(SerdSyntax syntax,
00742 SerdStyle style,
00743 SerdEnv* env,
00744 const SerdURI* base_uri,
00745 SerdSink sink,
00746 void* stream);
00747
00751 SERD_API
00752 void
00753 serd_writer_free(SerdWriter* writer);
00754
00758 SERD_API
00759 SerdEnv*
00760 serd_writer_get_env(SerdWriter* writer);
00761
00768 SERD_API
00769 size_t
00770 serd_file_sink(const void* buf, size_t len, void* stream);
00771
00780 SERD_API
00781 size_t
00782 serd_chunk_sink(const void* buf, size_t len, void* stream);
00783
00790 SERD_API
00791 uint8_t*
00792 serd_chunk_sink_finish(SerdChunk* stream);
00793
00797 SERD_API
00798 void
00799 serd_writer_chop_blank_prefix(SerdWriter* writer,
00800 const uint8_t* prefix);
00801
00807 SERD_API
00808 SerdStatus
00809 serd_writer_set_base_uri(SerdWriter* writer,
00810 const SerdNode* uri);
00811
00822 SERD_API
00823 SerdStatus
00824 serd_writer_set_root_uri(SerdWriter* writer,
00825 const SerdNode* uri);
00826
00832 SERD_API
00833 SerdStatus
00834 serd_writer_set_prefix(SerdWriter* writer,
00835 const SerdNode* name,
00836 const SerdNode* uri);
00837
00843 SERD_API
00844 SerdStatus
00845 serd_writer_write_statement(SerdWriter* writer,
00846 SerdStatementFlags flags,
00847 const SerdNode* graph,
00848 const SerdNode* subject,
00849 const SerdNode* predicate,
00850 const SerdNode* object,
00851 const SerdNode* object_datatype,
00852 const SerdNode* object_lang);
00853
00859 SERD_API
00860 SerdStatus
00861 serd_writer_end_anon(SerdWriter* writer,
00862 const SerdNode* node);
00863
00867 SERD_API
00868 SerdStatus
00869 serd_writer_finish(SerdWriter* writer);
00870
00876 #ifdef __cplusplus
00877 }
00878 #endif
00879
00880 #endif