Index: ossp-pkg/xds/docs/extended.c RCS File: /v/ossp/cvs/ossp-pkg/xds/docs/extended.c,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/xds/docs/extended.c,v' | diff -u /dev/null - -L'ossp-pkg/xds/docs/extended.c' 2>/dev/null --- ossp-pkg/xds/docs/extended.c +++ - 2025-04-05 01:38:25.854708752 +0200 @@ -0,0 +1,124 @@ +#include +#include +#include + +struct mystruct + { + xds_int32_t small; + xds_int64_t big; + xds_uint32_t positive; + char text[16]; + }; + +static int encode_mystruct(xds_t* xds, void* engine_context, + void* buffer, size_t buffer_size, size_t* used_buffer_size, + va_list* args) + { + struct mystruct* ms; + ms = va_arg(*args, struct mystruct*); + return xds_encode(xds, "int32 int64 uint32 octetstream", + ms->small, ms->big, ms->positive, + ms->text, sizeof(ms->text)); + } + +static int decode_mystruct(xds_t* xds, void* engine_context, + void* buffer, size_t buffer_size, size_t* used_buffer_size, + va_list* args) + { + struct mystruct* ms; + size_t i; + char* tmp; + int rc; + ms = va_arg(*args, struct mystruct*); + rc = xds_decode(xds, "int32 int64 uint32 octetstream", + &(ms->small), &(ms->big), &(ms->positive), + &tmp, &i); + if (rc == XDS_OK) + { + assert(i == sizeof(ms->text)); + memmove(ms->text, tmp, i); + free(tmp); + } + return rc; + } + +static void error_exit(int rc, const char* msg, ...) + { + va_list args; + va_start(args, msg); + vfprintf(stderr, msg, args); + va_end(args); + exit(rc); + } + +int main() + { + xds_t* xds; + char* buffer; + size_t buffer_size; + + struct mystruct ms, new_ms; + ms.small = -0x1234567; + ms.big = -0x1234567890abcdeLL; + ms.positive = 42; + strcpy(ms.text, "Hallo World"); + + /* Encode our copy of mystruct using our encoding callback. */ + + xds = xds_init(XDS_ENCODE); + if (xds == NULL) + error_exit(1, "Failed to initialize XDS context.\n"); + + if (xds_register(xds, "mystruct", &encode_mystruct, NULL) != XDS_OK || + xds_register(xds, "int32", &xdr_encode_int32, NULL) != XDS_OK || + xds_register(xds, "int64", &xdr_encode_int64, NULL) != XDS_OK || + xds_register(xds, "octetstream", &xdr_encode_octetstream, NULL) != XDS_OK || + xds_register(xds, "uint32", &xdr_encode_uint32, NULL) != XDS_OK) + { + error_exit(1, "Failed to register my encoding engines.\n"); + } + + if (xds_encode(xds, "mystruct", &ms) != XDS_OK) + error_exit(1, "xds_encode() failed!\n"); + + if (xds_getbuffer(xds, XDS_GIFT, (void**)&buffer, &buffer_size) != XDS_OK) + error_exit(1, "xds_getbuffer() failed!\n"); + + xds_destroy(xds); + + /* Now create a decoding context and decode the whole thing again. */ + + xds = xds_init(XDS_DECODE); + if (xds == NULL) + error_exit(1, "Failed to initialize XDS context.\n"); + + if (xds_register(xds, "mystruct", &decode_mystruct, NULL) != XDS_OK || + xds_register(xds, "int32", &xdr_decode_int32, NULL) != XDS_OK || + xds_register(xds, "int64", &xdr_decode_int64, NULL) != XDS_OK || + xds_register(xds, "uint32", &xdr_decode_uint32, NULL) != XDS_OK || + xds_register(xds, "octetstream", &xdr_decode_octetstream, NULL) != XDS_OK) + { + error_exit(1, "Failed to register my decoding engines.\n"); + } + + if (xds_setbuffer(xds, XDS_GIFT, buffer, buffer_size) != XDS_OK) + error_exit(1, "xds_setbuffer() failed!\n"); + + if (xds_decode(xds, "mystruct", &new_ms) != XDS_OK) + error_exit(1, "xds_decode() failed!\n"); + + xds_destroy(xds); + + /* Both structures must be identical. */ + + if (ms.small != new_ms.small || ms.big != new_ms.big || + ms.positive != new_ms.positive || + memcmp(&ms.text, &new_ms.text, sizeof(ms.text)) != 0) + { + error_exit(1, "Decoded data does not match the original!\n"); + } + + /* Everything went fine. */ + + return 0; + }