-#define XBT_LOG_BUFF_SIZE (ev->buffer_size)
-
-#undef check_overflow
-#define check_overflow \
- if (p - ev->buffer >= XBT_LOG_BUFF_SIZE) { /* buffer overflow */ \
- return 0; \
- } else ((void)0)
-
-#define show_it(data,letter) \
- do { \
- if (precision == -1 && length == -1) { \
- p += snprintf(p, XBT_LOG_BUFF_SIZE - (p - ev->buffer), "%" letter, data); \
- } else if (precision == -1) { \
- sprintf(tmpfmt,"%%%d" letter,length); \
- p += snprintf(p, XBT_LOG_BUFF_SIZE - (p - ev->buffer), tmpfmt, data); \
- length = -1; \
- } else if (length == -1) { \
- p += sprintf(p, "%.*" letter, \
- (int) MIN(XBT_LOG_BUFF_SIZE - (p - ev->buffer), precision), \
- data);\
- precision = -1; \
- } else { \
- sprintf(tmpfmt,"%%%d.%d" letter,length, \
- (int) MIN(XBT_LOG_BUFF_SIZE - (p - ev->buffer), precision));\
- p += sprintf(p, tmpfmt, data);\
- length = precision = -1; \
- } \
- check_overflow; \
- } while (0)
-
-#define show_string(data) show_it(data, "s")
+#define check_overflow(len) \
+ if ((rem_size -= (len)) > 0) { \
+ p += (len); \
+ } else \
+ return 0
+
+#define set_sz_from_precision() \
+ if (1) { \
+ sz = rem_size; \
+ if (precision != -1) { \
+ if (precision < sz) \
+ sz = precision + 1; /* +1 for the final '\0' */ \
+ precision = -1; \
+ } \
+ } else (void)0
+
+#define show_it(data, letter) \
+ if (1) { \
+ int len, wd; \
+ if (length == -1) { \
+ wd = 0; \
+ } else { \
+ wd = length; \
+ length = -1; \
+ } \
+ if (precision == -1) { \
+ len = snprintf(p, rem_size, "%*" letter, wd, data); \
+ } else { \
+ len = snprintf(p, rem_size, "%*.*" letter, wd, precision, data); \
+ precision = -1; \
+ } \
+ check_overflow(len); \
+ } else (void)0
+
+#define show_string(data) \
+ if (1) { \
+ const char *show_string_data = (data); \
+ show_it(show_string_data ? show_string_data : "(null)", "s"); \
+ } else (void)0