+}
+
+const char *hexa_str(unsigned char *data, int size, int downside)
+{
+ static char *buff = NULL;
+ static int buffsize = 0;
+ int i, pos = 0;
+ int begin, increment;
+
+ if (buffsize < 5 * (size + 1)) {
+ free(buff);
+ buffsize = 5 * (size + 1);
+ buff = xbt_malloc(buffsize);
+ }
+
+
+ if (downside) {
+ begin = size - 1;
+ increment = -1;
+ } else {
+ begin = 0;
+ increment = 1;
+ }
+
+ for (i = begin; 0 <= i && i < size; i += increment) {
+ if (data[i] < 32 || data[i] > 126)
+ sprintf(buff + pos, ".");
+ else
+ sprintf(buff + pos, "%c", data[i]);
+ while (buff[++pos]);
+ }
+ sprintf(buff + pos, "(");
+ while (buff[++pos]);
+ for (i = begin; 0 <= i && i < size; i += increment) {
+ sprintf(buff + pos, "%02x", data[i]);
+ while (buff[++pos]);
+ }
+ sprintf(buff + pos, ")");
+ while (buff[++pos]);
+ buff[pos] = '\0';
+ return buff;
+}
+
+void hexa_print(const char *name, unsigned char *data, int size)
+{
+ printf("%s: %s\n", name, hexa_str(data, size, 0));