/* ** OSSP xds - Extensible Data Serialization ** Copyright (c) 2001-2005 Ralf S. Engelschall ** Copyright (c) 2001-2005 The OSSP Project ** Copyright (c) 2001-2005 Cable & Wireless ** ** This file is part of OSSP xds, an extensible data serialization ** library which can be found at http://www.ossp.org/pkg/lib/xds/. ** ** Permission to use, copy, modify, and distribute this software for ** any purpose with or without fee is hereby granted, provided that ** the above copyright notice and this permission notice appear in all ** copies. ** ** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED ** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF ** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR ** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF ** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ** SUCH DAMAGE. ** ** xds.h: XDS library API */ #ifndef __XDS_H__ #define __XDS_H__ #include #include #include #include #define XDS_TRUE (1==1) #define XDS_FALSE (1!=1) @have_64_bit_support@ typedef @xds_uint8_t@ xds_uint8_t; typedef @xds_int8_t@ xds_int8_t; typedef @xds_uint16_t@ xds_uint16_t; typedef @xds_int16_t@ xds_int16_t; typedef @xds_uint32_t@ xds_uint32_t; typedef @xds_int32_t@ xds_int32_t; #ifdef XDS_HAVE_64_BIT_SUPPORT typedef @xds_uint64_t@ xds_uint64_t; typedef @xds_int64_t@ xds_int64_t; #endif typedef float xds_float_t; typedef double xds_double_t; enum { XDS_OK = 0, XDS_ERR_NO_MEM = -1, XDS_ERR_OVERFLOW = -2, XDS_ERR_INVALID_ARG = -3, XDS_ERR_TYPE_MISMATCH = -4, XDS_ERR_UNKNOWN_ENGINE = -5, XDS_ERR_INVALID_MODE = -6, XDS_ERR_UNDERFLOW = -7, XDS_ERR_UNKNOWN = -8, XDS_ERR_SYSTEM = -9 }; typedef enum { XDS_ENCODE, XDS_DECODE } xds_mode_t; typedef enum { XDS_LOAN, XDS_GIFT } xds_scope_t; struct xds_context; typedef struct xds_context xds_t; typedef int (*xds_engine_t)(xds_t *xds, void *engine_context, void *buffer, size_t buffer_size, size_t *used_buffer_size, va_list *args); int xds_init (xds_t **xds, xds_mode_t); int xds_destroy (xds_t *xds); int xds_register (xds_t *xds, const char *name, xds_engine_t engine, void *engine_context); int xds_unregister(xds_t *xds, const char *name); int xds_setbuffer (xds_t *xds, xds_scope_t flag, void *buffer, size_t buffer_len); int xds_getbuffer (xds_t *xds, xds_scope_t flag, void **buffer, size_t *buffer_len); int xds_encode (xds_t *xds, const char *fmt, ...); int xds_decode (xds_t *xds, const char *fmt, ...); int xds_vencode (xds_t *xds, const char *fmt, va_list args); int xds_vdecode (xds_t *xds, const char *fmt, va_list args); #define xds_check_parameter(condition) \ do { \ assert(condition); \ if (!(condition)) \ return XDS_ERR_INVALID_ARG; \ } while (XDS_FALSE) #define xds_init_encoding_engine(size) \ do { \ xds_check_parameter(xds != NULL); \ xds_check_parameter(buffer != NULL); \ xds_check_parameter(buffer_size != 0); \ xds_check_parameter(used_buffer_size != NULL && *used_buffer_size == 0); \ xds_check_parameter(args != NULL); \ *used_buffer_size = (size); \ if (buffer_size < (size)) \ return XDS_ERR_OVERFLOW; \ } while (XDS_FALSE) #define xds_init_decoding_engine(size) \ do { \ xds_check_parameter(xds != NULL); \ xds_check_parameter(buffer != NULL); \ xds_check_parameter(buffer_size != 0); \ xds_check_parameter(used_buffer_size != NULL && *used_buffer_size == 0); \ xds_check_parameter(args != NULL); \ *used_buffer_size = (size); \ if (buffer_size < (size)) \ return XDS_ERR_UNDERFLOW; \ } while (XDS_FALSE) #define xds_declare_formatting_engine(func) \ int func(xds_t *, void *, void *, size_t, size_t *, va_list *) xds_declare_formatting_engine(xdr_encode_uint32); xds_declare_formatting_engine(xdr_decode_uint32); xds_declare_formatting_engine(xdr_encode_int32); xds_declare_formatting_engine(xdr_decode_int32); #ifdef XDS_HAVE_64_BIT_SUPPORT xds_declare_formatting_engine(xdr_encode_uint64); xds_declare_formatting_engine(xdr_decode_uint64); xds_declare_formatting_engine(xdr_encode_int64); xds_declare_formatting_engine(xdr_decode_int64); #endif xds_declare_formatting_engine(xdr_encode_float); xds_declare_formatting_engine(xdr_decode_float); xds_declare_formatting_engine(xdr_encode_double); xds_declare_formatting_engine(xdr_decode_double); xds_declare_formatting_engine(xdr_encode_octetstream); xds_declare_formatting_engine(xdr_decode_octetstream); xds_declare_formatting_engine(xdr_encode_string); xds_declare_formatting_engine(xdr_decode_string); xds_declare_formatting_engine(xml_encode_begin); xds_declare_formatting_engine(xml_decode_begin); xds_declare_formatting_engine(xml_encode_end); xds_declare_formatting_engine(xml_decode_end); xds_declare_formatting_engine(xml_encode_uint32); xds_declare_formatting_engine(xml_decode_uint32); xds_declare_formatting_engine(xml_encode_int32); xds_declare_formatting_engine(xml_decode_int32); #ifdef XDS_HAVE_64_BIT_SUPPORT xds_declare_formatting_engine(xml_encode_uint64); xds_declare_formatting_engine(xml_decode_uint64); xds_declare_formatting_engine(xml_encode_int64); xds_declare_formatting_engine(xml_decode_int64); #endif xds_declare_formatting_engine(xml_encode_float); xds_declare_formatting_engine(xml_decode_float); xds_declare_formatting_engine(xml_encode_double); xds_declare_formatting_engine(xml_decode_double); xds_declare_formatting_engine(xml_encode_octetstream); xds_declare_formatting_engine(xml_decode_octetstream); xds_declare_formatting_engine(xml_encode_string); xds_declare_formatting_engine(xml_decode_string); #endif /* __XDS_H__ */