1 // PercentPrinter.cpp 2 3 #include "StdAfx.h" 4 5 #include "../../../Common/Defs.h" 6 #include "../../../Common/IntToString.h" 7 8 #include "PercentPrinter.h" 9 10 static const unsigned kPaddingSize = 2; 11 static const unsigned kPercentsSize = 4; 12 static const unsigned kMaxExtraSize = kPaddingSize + 32 + kPercentsSize; 13 14 static void ClearPrev(char *p, unsigned num) 15 { 16 unsigned i; 17 for (i = 0; i < num; i++) *p++ = '\b'; 18 for (i = 0; i < num; i++) *p++ = ' '; 19 for (i = 0; i < num; i++) *p++ = '\b'; 20 *p = '\0'; 21 } 22 23 void CPercentPrinter::ClosePrint() 24 { 25 if (m_NumExtraChars == 0) 26 return; 27 char s[kMaxExtraSize * 3 + 1]; 28 ClearPrev(s, m_NumExtraChars); 29 (*OutStream) << s; 30 m_NumExtraChars = 0; 31 } 32 33 void CPercentPrinter::PrintString(const char *s) 34 { 35 ClosePrint(); 36 (*OutStream) << s; 37 } 38 39 void CPercentPrinter::PrintString(const wchar_t *s) 40 { 41 ClosePrint(); 42 (*OutStream) << s; 43 } 44 45 void CPercentPrinter::PrintNewLine() 46 { 47 ClosePrint(); 48 (*OutStream) << "\n"; 49 } 50 51 void CPercentPrinter::RePrintRatio() 52 { 53 char s[32]; 54 unsigned size; 55 { 56 char c = '%'; 57 UInt64 value = 0; 58 if (m_Total == (UInt64)(Int64)-1) 59 { 60 value = m_CurValue >> 20; 61 c = 'M'; 62 } 63 else if (m_Total != 0) 64 value = m_CurValue * 100 / m_Total; 65 ConvertUInt64ToString(value, s); 66 size = (unsigned)strlen(s); 67 s[size++] = c; 68 s[size] = '\0'; 69 } 70 71 unsigned extraSize = kPaddingSize + MyMax(size, kPercentsSize); 72 if (extraSize < m_NumExtraChars) 73 extraSize = m_NumExtraChars; 74 75 char fullString[kMaxExtraSize * 3]; 76 char *p = fullString; 77 unsigned i; 78 if (m_NumExtraChars == 0) 79 { 80 for (i = 0; i < extraSize; i++) 81 *p++ = ' '; 82 m_NumExtraChars = extraSize; 83 } 84 85 for (i = 0; i < m_NumExtraChars; i++) 86 *p++ = '\b'; 87 m_NumExtraChars = extraSize; 88 for (; size < extraSize; size++) 89 *p++ = ' '; 90 MyStringCopy(p, s); 91 (*OutStream) << fullString; 92 OutStream->Flush(); 93 m_PrevValue = m_CurValue; 94 } 95 96 void CPercentPrinter::PrintRatio() 97 { 98 if (m_CurValue < m_PrevValue + m_MinStepSize && 99 m_CurValue + m_MinStepSize > m_PrevValue && m_NumExtraChars != 0) 100 return; 101 RePrintRatio(); 102 } 103