// PercentPrinter.cpp #include "StdAfx.h" #include "../../../Common/Defs.h" #include "../../../Common/IntToString.h" #include "PercentPrinter.h" static const unsigned kPaddingSize = 2; static const unsigned kPercentsSize = 4; static const unsigned kMaxExtraSize = kPaddingSize + 32 + kPercentsSize; static void ClearPrev(char *p, unsigned num) { unsigned i; for (i = 0; i < num; i++) *p++ = '\b'; for (i = 0; i < num; i++) *p++ = ' '; for (i = 0; i < num; i++) *p++ = '\b'; *p = '\0'; } void CPercentPrinter::ClosePrint() { if (m_NumExtraChars == 0) return; char s[kMaxExtraSize * 3 + 1]; ClearPrev(s, m_NumExtraChars); (*OutStream) << s; m_NumExtraChars = 0; } void CPercentPrinter::PrintString(const char *s) { ClosePrint(); (*OutStream) << s; } void CPercentPrinter::PrintString(const wchar_t *s) { ClosePrint(); (*OutStream) << s; } void CPercentPrinter::PrintNewLine() { ClosePrint(); (*OutStream) << "\n"; } void CPercentPrinter::RePrintRatio() { char s[32]; unsigned size; { char c = '%'; UInt64 value = 0; if (m_Total == (UInt64)(Int64)-1) { value = m_CurValue >> 20; c = 'M'; } else if (m_Total != 0) value = m_CurValue * 100 / m_Total; ConvertUInt64ToString(value, s); size = (unsigned)strlen(s); s[size++] = c; s[size] = '\0'; } unsigned extraSize = kPaddingSize + MyMax(size, kPercentsSize); if (extraSize < m_NumExtraChars) extraSize = m_NumExtraChars; char fullString[kMaxExtraSize * 3]; char *p = fullString; unsigned i; if (m_NumExtraChars == 0) { for (i = 0; i < extraSize; i++) *p++ = ' '; m_NumExtraChars = extraSize; } for (i = 0; i < m_NumExtraChars; i++) *p++ = '\b'; m_NumExtraChars = extraSize; for (; size < extraSize; size++) *p++ = ' '; MyStringCopy(p, s); (*OutStream) << fullString; OutStream->Flush(); m_PrevValue = m_CurValue; } void CPercentPrinter::PrintRatio() { if (m_CurValue < m_PrevValue + m_MinStepSize && m_CurValue + m_MinStepSize > m_PrevValue && m_NumExtraChars != 0) return; RePrintRatio(); }