if (*f == '%') {
++f;
- bool extended = false;
- if (*f == '#') {
- extended = true;
+ bool extended = false;
+ bool flag_zero = false;
+ for (;; ++f) {
+ switch (*f) {
+ case '#': extended = true; break;
+ case '0': flag_zero = true; break;
+ default: goto done_flags;
+ }
+ }
+done_flags:;
+
+ int field_width = 0;
+ if (*f == '*') {
++f;
+ field_width = va_arg(ap, int);
}
switch (*f) {
break;
}
+ case 'X': {
+ unsigned int const val = va_arg(ap, unsigned int);
+ char const *const fmt = flag_zero ? "%0*X" : "%*X";
+ fprintf(stderr, fmt, field_width, val);
+ break;
+ }
+
case 'Y': {
const symbol_t *const symbol = va_arg(ap, const symbol_t*);
if (symbol == NULL)