| #ifndef __INDENT_PRINTER_H | |
| #define __INDENT_PRINTER_H | |
| class IndentPrinter { | |
| public: | |
| explicit IndentPrinter(FILE* stream, int indentSize=2) | |
| : mStream(stream) | |
| , mIndentSize(indentSize) | |
| , mIndent(0) | |
| , mNeedsIndent(true) { | |
| } | |
| void indent(int amount = 1) { | |
| mIndent += amount; | |
| if (mIndent < 0) { | |
| mIndent = 0; | |
| } | |
| } | |
| void print(const char* fmt, ...) { | |
| doIndent(); | |
| va_list args; | |
| va_start(args, fmt); | |
| vfprintf(mStream, fmt, args); | |
| va_end(args); | |
| } | |
| void println(const char* fmt, ...) { | |
| doIndent(); | |
| va_list args; | |
| va_start(args, fmt); | |
| vfprintf(mStream, fmt, args); | |
| va_end(args); | |
| fputs("\n", mStream); | |
| mNeedsIndent = true; | |
| } | |
| void println() { | |
| doIndent(); | |
| fputs("\n", mStream); | |
| mNeedsIndent = true; | |
| } | |
| private: | |
| void doIndent() { | |
| if (mNeedsIndent) { | |
| int numSpaces = mIndent * mIndentSize; | |
| while (numSpaces > 0) { | |
| fputs(" ", mStream); | |
| numSpaces--; | |
| } | |
| mNeedsIndent = false; | |
| } | |
| } | |
| FILE* mStream; | |
| const int mIndentSize; | |
| int mIndent; | |
| bool mNeedsIndent; | |
| }; | |
| #endif // __INDENT_PRINTER_H | |