#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 | |