Serd
0.14.0
|
00001 /* 00002 Copyright 2011-2012 David Robillard <http://drobilla.net> 00003 00004 Permission to use, copy, modify, and/or distribute this software for any 00005 purpose with or without fee is hereby granted, provided that the above 00006 copyright notice and this permission notice appear in all copies. 00007 00008 THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 00009 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 00010 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 00011 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 00012 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 00013 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 00014 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 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 } /* extern "C" */ 00878 #endif 00879 00880 #endif /* SERD_SERD_H */