Serd 0.4.2
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        = 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 */