Serd  0.14.0
serd.h
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 */