| 97 | return str; |
| 98 | } |
| 99 | static NO_INLINE char *e9write_format(char *str, const char *msg, va_list ap) |
| 100 | { |
| 101 | char c; |
| 102 | while ((c = *msg++) != '\0') |
| 103 | { |
| 104 | if (c == '%') |
| 105 | { |
| 106 | c = *msg++; |
| 107 | const char *s; |
| 108 | const wchar_t *S; |
| 109 | uint64_t x; |
| 110 | int64_t i; |
| 111 | switch (c) |
| 112 | { |
| 113 | case '%': |
| 114 | str = e9write_char(str, '%'); |
| 115 | break; |
| 116 | case 'c': |
| 117 | c = (char)va_arg(ap, int); |
| 118 | str = e9write_char(str, c); |
| 119 | break; |
| 120 | case 's': |
| 121 | s = va_arg(ap, const char *); |
| 122 | str = e9write_str(str, s); |
| 123 | break; |
| 124 | case 'S': |
| 125 | S = va_arg(ap, const wchar_t *); |
| 126 | for (; *S != L'\0'; S++) |
| 127 | str = e9write_char(str, (*S < L'~'? (char)*S: '?')); |
| 128 | break; |
| 129 | case 'p': |
| 130 | str = e9write_str(str, "0x"); |
| 131 | // Fallthrough |
| 132 | case 'x': case 'X': |
| 133 | x = (c == 'x'? va_arg(ap, unsigned): va_arg(ap, uint64_t)); |
| 134 | str = e9write_hex(str, x); |
| 135 | break; |
| 136 | case 'u': case 'U': |
| 137 | x = (c == 'u'? va_arg(ap, unsigned): va_arg(ap, uint64_t)); |
| 138 | str = e9write_num(str, x); |
| 139 | break; |
| 140 | case 'd': case 'D': |
| 141 | i = (c == 'd'? va_arg(ap, unsigned): va_arg(ap, uint64_t)); |
| 142 | if (i < 0) |
| 143 | str = e9write_char(str, '-'); |
| 144 | str = e9write_num(str, (uint64_t)(i < 0? -i: i)); |
| 145 | break; |
| 146 | } |
| 147 | continue; |
| 148 | } |
| 149 | str = e9write_char(str, c); |
| 150 | } |
| 151 | return str; |
| 152 | } |
| 153 | static char *e9write_format(char *str, const char *msg, ...) |
| 154 | { |
| 155 | va_list ap; |
no test coverage detected