| 29 | } |
| 30 | |
| 31 | void parseFormat(std::ostream & stream, const char * & format) |
| 32 | { |
| 33 | std::locale loc; |
| 34 | |
| 35 | static std::set<char> alignmentFlags = { 'l', 'r', 'i' }; |
| 36 | while (alignmentFlags.find(*format) != alignmentFlags.end()) |
| 37 | { |
| 38 | char alignment = *format++; |
| 39 | |
| 40 | switch (alignment) |
| 41 | { |
| 42 | case 'l': |
| 43 | stream << std::left; |
| 44 | break; |
| 45 | case 'r': |
| 46 | stream << std::right; |
| 47 | break; |
| 48 | case 'i': |
| 49 | stream << std::internal; |
| 50 | break; |
| 51 | default: |
| 52 | break; |
| 53 | } |
| 54 | } |
| 55 | |
| 56 | static std::set<char> flags = { 'a', '+', ' ', '#', 'u', 'p', '0' }; |
| 57 | while (flags.find(std::tolower(*format, loc)) != flags.end()) |
| 58 | { |
| 59 | char flag = *format++; |
| 60 | |
| 61 | switch (flag) |
| 62 | { |
| 63 | case 'a': |
| 64 | stream << std::boolalpha; |
| 65 | break; |
| 66 | case '+': |
| 67 | stream << std::showpos; |
| 68 | break; |
| 69 | case ' ': |
| 70 | stream << std::skipws; |
| 71 | break; |
| 72 | case '#': |
| 73 | stream << std::showbase; |
| 74 | break; |
| 75 | case 'u': |
| 76 | stream << std::uppercase; |
| 77 | break; |
| 78 | case 'p': |
| 79 | stream << std::showpoint; |
| 80 | break; |
| 81 | case '0': |
| 82 | stream << std::setfill('0'); |
| 83 | break; |
| 84 | default: |
| 85 | break; |
| 86 | } |
| 87 | } |
| 88 | |