#include <ul_log.h>
#include <string.h>
#include <forb/cdr.h>
+#include <stdio.h>
UL_LOG_CUST(ulogd_fres_container);
ul_log_domain_t ulogd_fres_container = {UL_LOGL_ERR, "fres_container"};
#define desc_default(type) \
struct fres_block_desc desc_default_##type = { \
- .size = sizeof(fres_block_##type), \
+ .name = #type, \
+ .size = sizeof(fres_block_##type), \
.serialize = (fres_block_serialize_fnc_t*)fres_block_##type##_serialize, \
.deserialize = (fres_block_deserialize_fnc_t*)fres_block_##type##_deserialize, \
.duplicate = fres_block_duplicate_default \
err:
return CORBA_FALSE;
}
+
+int
+fres_container_to_string(char *dest, size_t size, const struct fres_container *c)
+{
+ int ret, written = 0;
+ enum fres_block_type type;
+
+ for (type=0; type<FRES_NUM_BLOCKS; type++) {
+ const struct fres_block *b = &c->blocks[type];
+ switch (b->state) {
+ case FRES_BLOCK_EMPTY:
+ /* nothing to do */
+ break;
+ case FRES_BLOCK_DATA:
+ ret = snprintf(dest, size, "block %s (%d)\n",
+ block_registry[type]->name, type);
+ if (ret < 0) goto err;
+ if (ret < size) {
+ written += ret;
+ size -= ret;
+ }
+ break;
+ case FRES_BLOCK_STREAM:
+ ret = snprintf(dest, size, "unknown block (%d)\n",
+ type);
+ if (ret < 0) goto err;
+ if (ret < size) {
+ written += ret;
+ size -= ret;
+ }
+ break;
+ }
+ }
+ ret = written;
+err:
+ return ret;
+}
typedef CORBA_boolean (fres_block_deserialize_fnc_t)(CDR_Codec *codec, void **block_data);
struct fres_block_desc {
+ const char *name; /**< Name of the block for use fres_container_to_string() */
size_t size; /**< Size of the block (used by fres_block_duplicate_default() and fres_container_ptr_deserialize()) */
fres_block_serialize_fnc_t *serialize;
fres_block_deserialize_fnc_t *deserialize;
void *
fres_block_duplicate_default(enum fres_block_type type, const void *block_data);
+int
+fres_container_to_string(char *dest, size_t size, const struct fres_container *c);
+
#endif
#include <fres_contract.h>
#include <fres_container_internal.h>
#include <string.h>
+#include <stdio.h>
/**
* Allocates new fres_contract structure. Use fres_contract_destroy to
{
fres_contract_destroy(contract);
}
+
+int
+fres_contract_to_string(char *dest, size_t size, const struct fres_contract *c)
+{
+ int ret, ret2;
+ char id[30];
+ fres_contract_id_to_string(id, &c->id, sizeof(id));
+ ret = snprintf(dest, size, "id: %s\n", id);
+ if (ret>=0 && ret < size) {
+ dest += ret;
+ size -= ret;
+ ret2 = fres_container_to_string(dest, size, c->container);
+ if (ret2 < 0) ret = ret2;
+ else ret += ret2;
+ }
+ return ret;
+}
+
+void
+fres_contract_print(char *prefix, const struct fres_contract *c)
+{
+ char contract[1000];
+ fres_contract_to_string(contract, sizeof(contract)-1, c);
+ contract[sizeof(contract)-1] = 0;
+ printf("%s %s", prefix, contract);
+}
return fres_container_get_block(contract->container, type);
}
+int
+fres_contract_to_string(char *dest, size_t size, const struct fres_contract *c);
+
+void
+fres_contract_print(char *prefix, const struct fres_contract *c);
+
#define FRES_CONTRACT_ACCESSOR(type) \
static inline int \
fres_contract_add_##type(struct fres_contract *contract, \
#include <fres_container.h>
static const struct fres_block_desc dummy_block_desc = {
+ .name = "dummy_sched",
.size = sizeof(fres_block_dummy_sched),
.serialize = (fres_block_serialize_fnc_t*)fres_block_dummy_sched_serialize,
.deserialize = (fres_block_deserialize_fnc_t*)fres_block_dummy_sched_deserialize,