#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