| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- // PercentPrinter.cpp
- #include "StdAfx.h"
- #include "Common/IntToString.h"
- #include "Common/MyString.h"
- #include "PercentPrinter.h"
- const int kPaddingSize = 2;
- const int kPercentsSize = 4;
- const int kMaxExtraSize = kPaddingSize + 32 + kPercentsSize;
- static void ClearPrev(char *p, int num)
- {
- int 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];
- ConvertUInt64ToString(((m_Total == 0) ? 0 : (m_CurValue * 100 / m_Total)), s);
- int size = (int)strlen(s);
- s[size++] = '%';
- s[size] = '\0';
- int extraSize = kPaddingSize + MyMax(size, kPercentsSize);
- if (extraSize < m_NumExtraChars)
- extraSize = m_NumExtraChars;
- char fullString[kMaxExtraSize * 3];
- char *p = fullString;
- int 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 < m_NumExtraChars; 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();
- }
|