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