1 #ifndef __INDENT_PRINTER_H 2 #define __INDENT_PRINTER_H 3 4 class IndentPrinter { 5 public: 6 explicit IndentPrinter(FILE* stream, int indentSize=2) mStream(stream)7 : mStream(stream) 8 , mIndentSize(indentSize) 9 , mIndent(0) 10 , mNeedsIndent(true) { 11 } 12 13 void indent(int amount = 1) { 14 mIndent += amount; 15 if (mIndent < 0) { 16 mIndent = 0; 17 } 18 } 19 print(const char * fmt,...)20 void print(const char* fmt, ...) { 21 doIndent(); 22 va_list args; 23 va_start(args, fmt); 24 vfprintf(mStream, fmt, args); 25 va_end(args); 26 } 27 println(const char * fmt,...)28 void println(const char* fmt, ...) { 29 doIndent(); 30 va_list args; 31 va_start(args, fmt); 32 vfprintf(mStream, fmt, args); 33 va_end(args); 34 fputs("\n", mStream); 35 mNeedsIndent = true; 36 } 37 println()38 void println() { 39 doIndent(); 40 fputs("\n", mStream); 41 mNeedsIndent = true; 42 } 43 44 private: doIndent()45 void doIndent() { 46 if (mNeedsIndent) { 47 int numSpaces = mIndent * mIndentSize; 48 while (numSpaces > 0) { 49 fputs(" ", mStream); 50 numSpaces--; 51 } 52 mNeedsIndent = false; 53 } 54 } 55 56 FILE* mStream; 57 const int mIndentSize; 58 int mIndent; 59 bool mNeedsIndent; 60 }; 61 62 #endif // __INDENT_PRINTER_H 63 64