11e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski#ifndef __INDENT_PRINTER_H 21e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski#define __INDENT_PRINTER_H 31e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski 41e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinskiclass IndentPrinter { 51e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinskipublic: 69b8528fee4eed35b8e887ded0851d08eb2b10db6Chih-Hung Hsieh explicit IndentPrinter(FILE* stream, int indentSize=2) 71e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski : mStream(stream) 81e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski , mIndentSize(indentSize) 91e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski , mIndent(0) 101e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski , mNeedsIndent(true) { 111e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski } 121e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski 131e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski void indent(int amount = 1) { 141e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski mIndent += amount; 151e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski if (mIndent < 0) { 161e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski mIndent = 0; 171e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski } 181e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski } 191e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski 201e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski void print(const char* fmt, ...) { 211e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski doIndent(); 221e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski va_list args; 231e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski va_start(args, fmt); 241e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski vfprintf(mStream, fmt, args); 251e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski va_end(args); 261e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski } 271e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski 281e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski void println(const char* fmt, ...) { 291e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski doIndent(); 301e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski va_list args; 311e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski va_start(args, fmt); 321e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski vfprintf(mStream, fmt, args); 331e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski va_end(args); 341e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski fputs("\n", mStream); 351e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski mNeedsIndent = true; 361e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski } 371e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski 381e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski void println() { 391e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski doIndent(); 401e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski fputs("\n", mStream); 411e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski mNeedsIndent = true; 421e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski } 431e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski 441e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinskiprivate: 451e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski void doIndent() { 461e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski if (mNeedsIndent) { 471e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski int numSpaces = mIndent * mIndentSize; 481e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski while (numSpaces > 0) { 491e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski fputs(" ", mStream); 501e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski numSpaces--; 511e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski } 521e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski mNeedsIndent = false; 531e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski } 541e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski } 551e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski 561e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski FILE* mStream; 571e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski const int mIndentSize; 581e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski int mIndent; 591e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski bool mNeedsIndent; 601e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski}; 611e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski 621e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski#endif // __INDENT_PRINTER_H 631e466385d4a4f1acee080fa0fdf16cc8fd8ce7caAdam Lesinski 64