#include <ostream>
#include <iostream>
#include <locale>
using namespace std;
inline int geti() {
static int i = ios_base::xalloc();
return i;
}
// rename it to something better
struct my_num_put : num_put<char> {
static const std::ios_base::fmtflags reqFlags
= (std::ios_base::showbase | std::ios_base::hex);
iter_type
do_put(iter_type s, ios_base& f, char_type fill, long v) const {
if (v == 0 && ((f.flags() & reqFlags) == reqFlags)) {
*(s++) = '0';
*(s++) = 'x';
}
return num_put<char>::do_put(s, f, fill, v);
}
iter_type
do_put(iter_type s, ios_base& f, char_type fill, unsigned long v) const {
if (v == 0 && ((f.flags() & reqFlags) == reqFlags)) {
*(s++) = '0';
*(s++) = 'x';
}
return num_put<char>::do_put(s, f, fill, v);
}
};
int main() {
// wrong
std::cout << std::showbase << std::hex << 0 << ' ' << 11 << std::endl;
// fixed by workaround
std::cout.imbue(std::locale(std::locale(), new my_num_put));
std::cout << std::showbase << std::hex << 0 << ' ' << 11 << std::endl;
// sanity check
std::cout.unsetf(my_num_put::reqFlags);
std::cout << 0 << ' ' << 11 << std::endl;
return 0;
}
I2luY2x1ZGUgPG9zdHJlYW0+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGxvY2FsZT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbmxpbmUgaW50IGdldGkoKSB7IAogICAgc3RhdGljIGludCBpID0gaW9zX2Jhc2U6OnhhbGxvYygpOwogICAgcmV0dXJuIGk7Cn0KCi8vIHJlbmFtZSBpdCB0byBzb21ldGhpbmcgYmV0dGVyCnN0cnVjdCBteV9udW1fcHV0IDogbnVtX3B1dDxjaGFyPiB7CiAgICBzdGF0aWMgY29uc3Qgc3RkOjppb3NfYmFzZTo6Zm10ZmxhZ3MgcmVxRmxhZ3MKICAgIAk9IChzdGQ6Omlvc19iYXNlOjpzaG93YmFzZSB8IHN0ZDo6aW9zX2Jhc2U6OmhleCk7CgogICAgaXRlcl90eXBlIAogICAgZG9fcHV0KGl0ZXJfdHlwZSBzLCBpb3NfYmFzZSYgZiwgY2hhcl90eXBlIGZpbGwsIGxvbmcgdikgY29uc3QgewogICAgICAgIGlmICh2ID09IDAgJiYgKChmLmZsYWdzKCkgJiByZXFGbGFncykgPT0gcmVxRmxhZ3MpKSB7CiAgICAgICAgICAgICoocysrKSA9ICcwJzsKICAgICAgICAgICAgKihzKyspID0gJ3gnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVtX3B1dDxjaGFyPjo6ZG9fcHV0KHMsIGYsIGZpbGwsIHYpOwogICAgfSAKCiAgICBpdGVyX3R5cGUgCiAgICBkb19wdXQoaXRlcl90eXBlIHMsIGlvc19iYXNlJiBmLCBjaGFyX3R5cGUgZmlsbCwgdW5zaWduZWQgbG9uZyB2KSBjb25zdCB7IAogICAgICAgICAgaWYgKHYgPT0gMCAmJiAoKGYuZmxhZ3MoKSAmIHJlcUZsYWdzKSA9PSByZXFGbGFncykpIHsKICAgICAgICAgICAgKihzKyspID0gJzAnOwogICAgICAgICAgICAqKHMrKykgPSAneCc7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudW1fcHV0PGNoYXI+Ojpkb19wdXQocywgZiwgZmlsbCwgdik7CiAgICB9IAp9OyAKCmludCBtYWluKCkgewoJLy8gd3JvbmcKICAgIHN0ZDo6Y291dCA8PCBzdGQ6OnNob3diYXNlIDw8IHN0ZDo6aGV4IDw8IDAgPDwgJyAnIDw8IDExIDw8IHN0ZDo6ZW5kbDsKICAgIAogICAgLy8gZml4ZWQgYnkgd29ya2Fyb3VuZAogICAgc3RkOjpjb3V0LmltYnVlKHN0ZDo6bG9jYWxlKHN0ZDo6bG9jYWxlKCksIG5ldyBteV9udW1fcHV0KSk7CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjpzaG93YmFzZSA8PCBzdGQ6OmhleCA8PCAwIDw8ICcgJyA8PCAxMSA8PCBzdGQ6OmVuZGw7CiAgICAKICAgIC8vIHNhbml0eSBjaGVjawogICAgc3RkOjpjb3V0LnVuc2V0ZihteV9udW1fcHV0OjpyZXFGbGFncyk7CglzdGQ6OmNvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAwIDw8ICcgJyA8PCAxMSA8PCBzdGQ6OmVuZGw7CgoJcmV0dXJuIDA7Cn0=