.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 \
+ .duplicate = fres_block_duplicate_default, \
+ .to_string = fres_block_##type##_to_string \
}
+int fres_block_label_to_string(char *dest, size_t size, enum fres_block_type type,
+ const void *block_data)
+{
+ const fres_block_label *b = block_data;
+ return snprintf(dest, size, "%s\n", b->label); /* FIXME: do not print more that 32 characters */
+}
+
+int fres_block_resource_to_string(char *dest, size_t size, enum fres_block_type type,
+ const void *block_data)
+{
+ const fres_block_resource *b = block_data;
+ return snprintf(dest, size, "%d.%d\n", b->resource_type, b->resource_id);
+}
+
+int fres_block_basic_to_string(char *dest, size_t size, enum fres_block_type type,
+ const void *block_data)
+{
+ const fres_block_basic *b = block_data;
+ return snprintf(dest, size,
+ "budget: %ld.%09ld s\n"
+ "period: %ld.%09ld s\n"
+ "workload: %d\n"
+ "type: %d\n",
+ (long)b->budget.tv_sec, (long)b->budget.tv_nsec,
+ (long)b->period.tv_sec, (long)b->period.tv_nsec,
+ b->workload,
+ b->contract_type
+ );
+ return 0;
+}
+
+int fres_block_timing_reqs_to_string(char *dest, size_t size, enum fres_block_type type,
+ const void *block_data)
+{
+ const fres_block_timing_reqs *b = block_data;
+ return snprintf(dest, size,
+ "D=T: %s\n"
+ "deadline: %ld.%09ld s\n",
+ b->d_equals_t ? "true" : "false",
+ (long)b->deadline.tv_sec, (long)b->deadline.tv_nsec
+ );
+}
+
static const desc_default(label);
static const desc_default(resource);
static const desc_default(basic);
if (ret < size) {
written += ret;
size -= ret;
+ dest += ret;
+ }
+ if (block_registry[type]->to_string) {
+ char tmp[1000];
+ char *p = tmp;;
+ ret = block_registry[type]->to_string(tmp, sizeof(tmp), type, b->u.data);
+ while (*p) {
+ if (p == tmp || *(p-1) == '\n') { /* indent */
+ int i;
+ for (i=0; i<2; i++) {
+ *dest++ = ' ';
+ written++;
+ size--;
+ }
+ }
+ *dest++ = *p++;
+ written++;
+ size--;
+ }
}
break;
case FRES_BLOCK_STREAM:
if (ret < size) {
written += ret;
size -= ret;
+ dest += ret;
}
break;
}