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