Serd 0.4.2
|
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 = 0, 00087 SERD_FAILURE = 1, 00088 SERD_ERR_UNKNOWN = 2, 00089 SERD_ERR_BAD_SYNTAX = 3, 00090 SERD_ERR_BAD_ARG = 3, 00091 SERD_ERR_NOT_FOUND = 4 00092 } SerdStatus; 00093 00097 typedef enum { 00102 SERD_TURTLE = 1, 00103 00108 SERD_NTRIPLES = 2 00109 } SerdSyntax; 00110 00114 typedef enum { 00115 SERD_EMPTY_S = 1 << 1, 00116 SERD_EMPTY_O = 1 << 2, 00117 SERD_ANON_S_BEGIN = 1 << 3, 00118 SERD_ANON_O_BEGIN = 1 << 4, 00119 SERD_ANON_CONT = 1 << 5 00120 } SerdStatementFlag; 00121 00125 typedef uint32_t SerdStatementFlags; 00126 00136 typedef enum { 00142 SERD_NOTHING = 0, 00143 00149 SERD_LITERAL = 1, 00150 00159 SERD_URI = 2, 00160 00168 SERD_CURIE = 3, 00169 00178 SERD_BLANK = 4, 00179 00180 } SerdType; 00181 00185 typedef enum { 00186 SERD_HAS_NEWLINE = 1, 00187 SERD_HAS_QUOTE = 1 << 1 00188 } SerdNodeFlag; 00189 00193 typedef uint32_t SerdNodeFlags; 00194 00198 typedef struct { 00199 const uint8_t* buf; 00200 size_t n_bytes; 00201 size_t n_chars; 00202 SerdNodeFlags flags; 00203 SerdType type; 00204 } SerdNode; 00205 00209 typedef struct { 00210 const uint8_t* buf; 00211 size_t len; 00212 } SerdChunk; 00213 00221 typedef struct { 00222 SerdChunk scheme; 00223 SerdChunk authority; 00224 SerdChunk path_base; 00225 SerdChunk path; 00226 SerdChunk query; 00227 SerdChunk fragment; 00228 } SerdURI; 00229 00238 typedef enum { 00239 SERD_STYLE_ABBREVIATED = 1, 00240 SERD_STYLE_ASCII = 1 << 1, 00241 SERD_STYLE_RESOLVED = 1 << 2, 00242 SERD_STYLE_CURIED = 1 << 3 00243 } SerdStyle; 00244 00252 SERD_API 00253 size_t 00254 serd_strlen(const uint8_t* str, size_t* n_bytes, SerdNodeFlags* flags); 00255 00261 static const SerdURI SERD_URI_NULL = {{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}}; 00262 00266 SERD_API 00267 const uint8_t* 00268 serd_uri_to_path(const uint8_t* uri); 00269 00273 SERD_API 00274 bool 00275 serd_uri_string_has_scheme(const uint8_t* utf8); 00276 00280 SERD_API 00281 SerdStatus 00282 serd_uri_parse(const uint8_t* utf8, SerdURI* out); 00283 00287 SERD_API 00288 void 00289 serd_uri_resolve(const SerdURI* uri, const SerdURI* base, SerdURI* out); 00290 00294 typedef size_t (*SerdSink)(const void* buf, size_t len, void* stream); 00295 00299 SERD_API 00300 size_t 00301 serd_uri_serialise(const SerdURI* uri, SerdSink sink, void* stream); 00302 00309 static const SerdNode SERD_NODE_NULL = { 0, 0, 0, 0, SERD_NOTHING }; 00310 00316 SERD_API 00317 SerdNode 00318 serd_node_from_string(SerdType type, const uint8_t* str); 00319 00325 SERD_API 00326 SerdNode 00327 serd_node_copy(const SerdNode* node); 00328 00332 SERD_API 00333 bool 00334 serd_node_equals(const SerdNode* a, const SerdNode* b); 00335 00339 SERD_API 00340 SerdNode 00341 serd_node_new_uri_from_node(const SerdNode* uri_node, 00342 const SerdURI* base, 00343 SerdURI* out); 00344 00348 SERD_API 00349 SerdNode 00350 serd_node_new_uri_from_string(const uint8_t* str, 00351 const SerdURI* base, 00352 SerdURI* out); 00353 00364 SERD_API 00365 SerdNode 00366 serd_node_new_uri(const SerdURI* uri, const SerdURI* base, SerdURI* out); 00367 00374 SERD_API 00375 void 00376 serd_node_free(SerdNode* node); 00377 00389 typedef SerdStatus (*SerdBaseSink)(void* handle, 00390 const SerdNode* uri); 00391 00397 typedef SerdStatus (*SerdPrefixSink)(void* handle, 00398 const SerdNode* name, 00399 const SerdNode* uri); 00400 00406 typedef SerdStatus (*SerdStatementSink)(void* handle, 00407 SerdStatementFlags flags, 00408 const SerdNode* graph, 00409 const SerdNode* subject, 00410 const SerdNode* predicate, 00411 const SerdNode* object, 00412 const SerdNode* object_datatype, 00413 const SerdNode* object_lang); 00414 00422 typedef SerdStatus (*SerdEndSink)(void* handle, 00423 const SerdNode* node); 00424 00434 SERD_API 00435 SerdEnv* 00436 serd_env_new(const SerdNode* base_uri); 00437 00441 SERD_API 00442 void 00443 serd_env_free(SerdEnv* env); 00444 00448 SERD_API 00449 const SerdNode* 00450 serd_env_get_base_uri(const SerdEnv* env, 00451 SerdURI* out); 00452 00456 SERD_API 00457 SerdStatus 00458 serd_env_set_base_uri(SerdEnv* env, 00459 const SerdNode* uri); 00460 00464 SERD_API 00465 SerdStatus 00466 serd_env_set_prefix(SerdEnv* env, 00467 const SerdNode* name, 00468 const SerdNode* uri); 00469 00473 SERD_API 00474 bool 00475 serd_env_qualify(const SerdEnv* env, 00476 const SerdNode* uri, 00477 SerdNode* prefix, 00478 SerdChunk* suffix); 00479 00483 SERD_API 00484 SerdStatus 00485 serd_env_expand(const SerdEnv* env, 00486 const SerdNode* curie, 00487 SerdChunk* uri_prefix, 00488 SerdChunk* uri_suffix); 00489 00493 SERD_API 00494 SerdNode 00495 serd_env_expand_node(const SerdEnv* env, 00496 const SerdNode* node); 00497 00501 SERD_API 00502 void 00503 serd_env_foreach(const SerdEnv* env, 00504 SerdPrefixSink func, 00505 void* handle); 00506 00516 SERD_API 00517 SerdReader* 00518 serd_reader_new(SerdSyntax syntax, 00519 void* handle, 00520 void (*free_handle)(void*), 00521 SerdBaseSink base_sink, 00522 SerdPrefixSink prefix_sink, 00523 SerdStatementSink statement_sink, 00524 SerdEndSink end_sink); 00525 00529 SERD_API 00530 void* 00531 serd_reader_get_handle(const SerdReader* reader); 00532 00542 SERD_API 00543 void 00544 serd_reader_add_blank_prefix(SerdReader* reader, 00545 const uint8_t* prefix); 00546 00550 SERD_API 00551 SerdStatus 00552 serd_reader_read_file(SerdReader* reader, 00553 const uint8_t* uri); 00554 00558 SERD_API 00559 SerdStatus 00560 serd_reader_read_file_handle(SerdReader* reader, 00561 FILE* file, 00562 const uint8_t* name); 00563 00567 SERD_API 00568 SerdStatus 00569 serd_reader_read_string(SerdReader* me, const uint8_t* utf8); 00570 00574 SERD_API 00575 void 00576 serd_reader_free(SerdReader* reader); 00577 00587 SERD_API 00588 SerdWriter* 00589 serd_writer_new(SerdSyntax syntax, 00590 SerdStyle style, 00591 SerdEnv* env, 00592 const SerdURI* base_uri, 00593 SerdSink sink, 00594 void* stream); 00595 00599 SERD_API 00600 void 00601 serd_writer_free(SerdWriter* writer); 00602 00606 SERD_API 00607 void 00608 serd_writer_chop_blank_prefix(SerdWriter* writer, 00609 const uint8_t* prefix); 00610 00616 SERD_API 00617 SerdStatus 00618 serd_writer_set_base_uri(SerdWriter* writer, 00619 const SerdNode* uri); 00620 00626 SERD_API 00627 SerdStatus 00628 serd_writer_set_prefix(SerdWriter* writer, 00629 const SerdNode* name, 00630 const SerdNode* uri); 00631 00637 SERD_API 00638 SerdStatus 00639 serd_writer_write_statement(SerdWriter* writer, 00640 SerdStatementFlags flags, 00641 const SerdNode* graph, 00642 const SerdNode* subject, 00643 const SerdNode* predicate, 00644 const SerdNode* object, 00645 const SerdNode* object_datatype, 00646 const SerdNode* object_lang); 00647 00653 SERD_API 00654 SerdStatus 00655 serd_writer_end_anon(SerdWriter* writer, 00656 const SerdNode* node); 00657 00661 SERD_API 00662 SerdStatus 00663 serd_writer_finish(SerdWriter* writer); 00664 00670 #ifdef __cplusplus 00671 } /* extern "C" */ 00672 #endif 00673 00674 #endif /* SERD_SERD_H */