ossp-pkg/xds/docs/extended.c
#include <stdio.h>
#include <string.h>
#include <xds.h>
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)
{
if (i == sizeof(ms->text))
memmove(ms->text, tmp, i);
else
rc = XDS_ERR_TYPE_MISMATCH;
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;
}