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