return s;
}
+u8 *
+format_duration (u8 *s, va_list *args)
+{
+ f64 t = va_arg (*args, f64);
+ s = format (s, "");
+
+ const f64 seconds_per_minute = 60;
+ const f64 seconds_per_hour = 60 * seconds_per_minute;
+ const f64 seconds_per_day = 24 * seconds_per_hour;
+ uword days, hours, minutes, secs, msecs, usecs;
+
+ days = t / seconds_per_day;
+ t -= days * seconds_per_day;
+
+ hours = t / seconds_per_hour;
+ t -= hours * seconds_per_hour;
+
+ minutes = t / seconds_per_minute;
+ t -= minutes * seconds_per_minute;
+
+ secs = t;
+ t -= secs;
+
+ msecs = 1e3 * t;
+
+ usecs = 1e6 * t;
+ usecs = usecs % 1000;
+
+ if (t == 0.)
+ s = format (s, "0");
+ if (days)
+ s = format (s, "%ddays ", days);
+ if (hours)
+ s = format (s, "%dh ", hours);
+ if (minutes)
+ s = format (s, "%dmin ", minutes);
+ if (secs)
+ s = format (s, "%ds ", secs);
+ if (msecs)
+ s = format (s, "%dms ", msecs);
+ if (usecs)
+ s = format (s, "%dus", usecs);
+
+ return (s);
+}
+
u8 *
format_time_interval (u8 * s, va_list * args)
{
return s;
}
+__clib_export u8 *
+format_u64_bitmap (u8 *s, va_list *args)
+{
+ u64 *bitmap = va_arg (*args, u64 *);
+ int n_uword = va_arg (*args, int);
+ u32 indent = format_get_indent (s);
+
+ s = format (s, "%6s", "");
+
+ for (int i = 60; i >= 0; i -= 4)
+ s = format (s, "%5d", i);
+
+ vec_add1 (s, '\n');
+
+ for (int j = n_uword - 1; j >= 0; j--)
+ {
+ s = format (s, "%U0x%04x ", format_white_space, indent, j * 8);
+ for (int i = 63; i >= 0; i--)
+ {
+ vec_add1 (s, (1ULL << i) & bitmap[j] ? '1' : '.');
+ if (i % 4 == 0)
+ vec_add1 (s, ' ');
+ }
+ s = format (s, "0x%016lx", bitmap[j]);
+ if (j)
+ vec_add1 (s, '\n');
+ }
+
+ return s;
+}
+
/*
* fd.io coding-style-patch-verification: ON
*