00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "xrb_indentformatter.hpp"
00012
00013 #include "xrb_util.hpp"
00014
00015 namespace Xrb
00016 {
00017
00018 IndentFormatter::IndentFormatter (
00019 FILE *const fptr,
00020 char const *const indent_string)
00021 {
00022 ASSERT1(fptr != NULL);
00023 ASSERT1(indent_string != NULL);
00024 m_fptr = fptr;
00025 m_state = FRESH_LINE;
00026 m_indent_string = indent_string;
00027 m_indent_level = 0;
00028
00029 UpdateNewlineReplacement();
00030 }
00031
00032 void IndentFormatter::PrintLine (char const *const format, ...)
00033 {
00034 ASSERT1(m_state == FRESH_LINE);
00035
00036 va_list list;
00037 va_start(list, format);
00038 InternalPrintf(format, list, true, true);
00039 va_end(list);
00040 }
00041
00042 void IndentFormatter::BeginLine (char const *const format, ...)
00043 {
00044 bool indent = m_state == FRESH_LINE;
00045
00046 va_list list;
00047 va_start(list, format);
00048 InternalPrintf(format, list, indent, false);
00049 va_end(list);
00050
00051 m_state = CONTINUING_LINE;
00052 }
00053
00054 void IndentFormatter::ContinueLine (char const *const format, ...)
00055 {
00056 ASSERT1(m_state == CONTINUING_LINE);
00057
00058 va_list list;
00059 va_start(list, format);
00060 InternalPrintf(format, list, false, false);
00061 va_end(list);
00062 }
00063
00064 void IndentFormatter::EndLine (char const *const format, ...)
00065 {
00066 bool indent = m_state != CONTINUING_LINE;
00067
00068 va_list list;
00069 va_start(list, format);
00070 InternalPrintf(format, list, indent, true);
00071 va_end(list);
00072
00073 m_state = FRESH_LINE;
00074 }
00075
00076 void IndentFormatter::Indent ()
00077 {
00078 ASSERT1(m_indent_level < UINT32_UPPER_BOUND);
00079 ++m_indent_level;
00080 UpdateNewlineReplacement();
00081 }
00082
00083 void IndentFormatter::Unindent ()
00084 {
00085 ASSERT1(m_indent_level > 0);
00086 --m_indent_level;
00087 UpdateNewlineReplacement();
00088 }
00089
00090 void IndentFormatter::InternalPrintf (
00091 char const *const format,
00092 va_list list,
00093 bool const prepend_indentation,
00094 bool const append_newline)
00095 {
00096 m_reformat.clear();
00097
00098 if (prepend_indentation)
00099 for (Uint32 i = 0; i < m_indent_level; ++i)
00100 m_reformat += m_indent_string;
00101
00102 m_reformat += format;
00103 Util::ReplaceAllInString(&m_reformat, "\n", m_newline_replacement);
00104
00105 if (append_newline)
00106 m_reformat += '\n';
00107
00108 ASSERT1(m_fptr != NULL);
00109 vfprintf(m_fptr, m_reformat.c_str(), list);
00110 }
00111
00112 void IndentFormatter::UpdateNewlineReplacement ()
00113 {
00114 m_newline_replacement.clear();
00115 m_newline_replacement += '\n';
00116 for (Uint32 i = 0; i < m_indent_level; ++i)
00117 m_newline_replacement += m_indent_string;
00118 }
00119
00120 }
00121