Serd
0.5.0
|
00001 /* 00002 Copyright 2011 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 <stdbool.h> 00025 #include <stddef.h> 00026 #include <stdint.h> 00027 #include <stdio.h> 00028 00029 #ifdef SERD_SHARED 00030 # ifdef __WIN32__ 00031 # define SERD_LIB_IMPORT __declspec(dllimport) 00032 # define SERD_LIB_EXPORT __declspec(dllexport) 00033 # else 00034 # define SERD_LIB_IMPORT __attribute__((visibility("default"))) 00035 # define SERD_LIB_EXPORT __attribute__((visibility("default"))) 00036 # endif 00037 # ifdef SERD_INTERNAL 00038 # define SERD_API SERD_LIB_EXPORT 00039 # else 00040 # define SERD_API SERD_LIB_IMPORT 00041 # endif 00042 #else 00043 # define SERD_API 00044 #endif 00045 00046 #ifdef __cplusplus 00047 extern "C" { 00048 #endif 00049 00062 typedef struct SerdEnvImpl SerdEnv; 00063 00070 typedef struct SerdReaderImpl SerdReader; 00071 00080 typedef struct SerdWriterImpl SerdWriter; 00081 00085 typedef enum { 00086 SERD_SUCCESS, 00087 SERD_FAILURE, 00088 SERD_ERR_UNKNOWN, 00089 SERD_ERR_BAD_SYNTAX, 00090 SERD_ERR_BAD_ARG, 00091 SERD_ERR_NOT_FOUND 00092 } SerdStatus; 00093 00094 SERD_API 00095 const uint8_t* 00096 serd_strerror(SerdStatus status); 00097 00101 typedef enum { 00106 SERD_TURTLE = 1, 00107 00112 SERD_NTRIPLES = 2 00113 } SerdSyntax; 00114 00118 typedef enum { 00119 SERD_EMPTY_S = 1 << 1, 00120 SERD_EMPTY_O = 1 << 2, 00121 SERD_ANON_S_BEGIN = 1 << 3, 00122 SERD_ANON_O_BEGIN = 1 << 4, 00123 SERD_ANON_CONT = 1 << 5 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 } SerdStyle; 00248 00256 SERD_API 00257 size_t 00258 serd_strlen(const uint8_t* str, size_t* n_bytes, SerdNodeFlags* flags); 00259 00265 static const SerdURI SERD_URI_NULL = {{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}}; 00266 00270 SERD_API 00271 const uint8_t* 00272 serd_uri_to_path(const uint8_t* uri); 00273 00277 SERD_API 00278 bool 00279 serd_uri_string_has_scheme(const uint8_t* utf8); 00280 00284 SERD_API 00285 SerdStatus 00286 serd_uri_parse(const uint8_t* utf8, SerdURI* out); 00287 00291 SERD_API 00292 void 00293 serd_uri_resolve(const SerdURI* uri, const SerdURI* base, SerdURI* out); 00294 00298 typedef size_t (*SerdSink)(const void* buf, size_t len, void* stream); 00299 00303 SERD_API 00304 size_t 00305 serd_uri_serialise(const SerdURI* uri, SerdSink sink, void* stream); 00306 00313 static const SerdNode SERD_NODE_NULL = { 0, 0, 0, 0, SERD_NOTHING }; 00314 00320 SERD_API 00321 SerdNode 00322 serd_node_from_string(SerdType type, const uint8_t* str); 00323 00329 SERD_API 00330 SerdNode 00331 serd_node_copy(const SerdNode* node); 00332 00336 SERD_API 00337 bool 00338 serd_node_equals(const SerdNode* a, const SerdNode* b); 00339 00343 SERD_API 00344 SerdNode 00345 serd_node_new_uri_from_node(const SerdNode* uri_node, 00346 const SerdURI* base, 00347 SerdURI* out); 00348 00352 SERD_API 00353 SerdNode 00354 serd_node_new_uri_from_string(const uint8_t* str, 00355 const SerdURI* base, 00356 SerdURI* out); 00357 00368 SERD_API 00369 SerdNode 00370 serd_node_new_uri(const SerdURI* uri, const SerdURI* base, SerdURI* out); 00371 00378 SERD_API 00379 void 00380 serd_node_free(SerdNode* node); 00381 00393 typedef SerdStatus (*SerdBaseSink)(void* handle, 00394 const SerdNode* uri); 00395 00401 typedef SerdStatus (*SerdPrefixSink)(void* handle, 00402 const SerdNode* name, 00403 const SerdNode* uri); 00404 00410 typedef SerdStatus (*SerdStatementSink)(void* handle, 00411 SerdStatementFlags flags, 00412 const SerdNode* graph, 00413 const SerdNode* subject, 00414 const SerdNode* predicate, 00415 const SerdNode* object, 00416 const SerdNode* object_datatype, 00417 const SerdNode* object_lang); 00418 00426 typedef SerdStatus (*SerdEndSink)(void* handle, 00427 const SerdNode* node); 00428 00438 SERD_API 00439 SerdEnv* 00440 serd_env_new(const SerdNode* base_uri); 00441 00445 SERD_API 00446 void 00447 serd_env_free(SerdEnv* env); 00448 00452 SERD_API 00453 const SerdNode* 00454 serd_env_get_base_uri(const SerdEnv* env, 00455 SerdURI* out); 00456 00460 SERD_API 00461 SerdStatus 00462 serd_env_set_base_uri(SerdEnv* env, 00463 const SerdNode* uri); 00464 00468 SERD_API 00469 SerdStatus 00470 serd_env_set_prefix(SerdEnv* env, 00471 const SerdNode* name, 00472 const SerdNode* uri); 00473 00477 SERD_API 00478 SerdStatus 00479 serd_env_set_prefix_from_strings(SerdEnv* env, 00480 const uint8_t* name, 00481 const uint8_t* uri); 00482 00486 SERD_API 00487 bool 00488 serd_env_qualify(const SerdEnv* env, 00489 const SerdNode* uri, 00490 SerdNode* prefix, 00491 SerdChunk* suffix); 00492 00496 SERD_API 00497 SerdStatus 00498 serd_env_expand(const SerdEnv* env, 00499 const SerdNode* curie, 00500 SerdChunk* uri_prefix, 00501 SerdChunk* uri_suffix); 00502 00506 SERD_API 00507 SerdNode 00508 serd_env_expand_node(const SerdEnv* env, 00509 const SerdNode* node); 00510 00514 SERD_API 00515 void 00516 serd_env_foreach(const SerdEnv* env, 00517 SerdPrefixSink func, 00518 void* handle); 00519 00529 SERD_API 00530 SerdReader* 00531 serd_reader_new(SerdSyntax syntax, 00532 void* handle, 00533 void (*free_handle)(void*), 00534 SerdBaseSink base_sink, 00535 SerdPrefixSink prefix_sink, 00536 SerdStatementSink statement_sink, 00537 SerdEndSink end_sink); 00538 00542 SERD_API 00543 void* 00544 serd_reader_get_handle(const SerdReader* reader); 00545 00555 SERD_API 00556 void 00557 serd_reader_add_blank_prefix(SerdReader* reader, 00558 const uint8_t* prefix); 00559 00563 SERD_API 00564 SerdStatus 00565 serd_reader_read_file(SerdReader* reader, 00566 const uint8_t* uri); 00567 00571 SERD_API 00572 SerdStatus 00573 serd_reader_read_file_handle(SerdReader* reader, 00574 FILE* file, 00575 const uint8_t* name); 00576 00580 SERD_API 00581 SerdStatus 00582 serd_reader_read_string(SerdReader* me, const uint8_t* utf8); 00583 00587 SERD_API 00588 void 00589 serd_reader_free(SerdReader* reader); 00590 00600 SERD_API 00601 SerdWriter* 00602 serd_writer_new(SerdSyntax syntax, 00603 SerdStyle style, 00604 SerdEnv* env, 00605 const SerdURI* base_uri, 00606 SerdSink sink, 00607 void* stream); 00608 00612 SERD_API 00613 void 00614 serd_writer_free(SerdWriter* writer); 00615 00619 SERD_API 00620 void 00621 serd_writer_chop_blank_prefix(SerdWriter* writer, 00622 const uint8_t* prefix); 00623 00629 SERD_API 00630 SerdStatus 00631 serd_writer_set_base_uri(SerdWriter* writer, 00632 const SerdNode* uri); 00633 00639 SERD_API 00640 SerdStatus 00641 serd_writer_set_prefix(SerdWriter* writer, 00642 const SerdNode* name, 00643 const SerdNode* uri); 00644 00650 SERD_API 00651 SerdStatus 00652 serd_writer_write_statement(SerdWriter* writer, 00653 SerdStatementFlags flags, 00654 const SerdNode* graph, 00655 const SerdNode* subject, 00656 const SerdNode* predicate, 00657 const SerdNode* object, 00658 const SerdNode* object_datatype, 00659 const SerdNode* object_lang); 00660 00666 SERD_API 00667 SerdStatus 00668 serd_writer_end_anon(SerdWriter* writer, 00669 const SerdNode* node); 00670 00674 SERD_API 00675 SerdStatus 00676 serd_writer_finish(SerdWriter* writer); 00677 00683 #ifdef __cplusplus 00684 } /* extern "C" */ 00685 #endif 00686 00687 #endif /* SERD_SERD_H */