1// PercentPrinter.cpp 2 3#include "StdAfx.h" 4 5#include "Common/IntToString.h" 6#include "Common/MyString.h" 7 8#include "PercentPrinter.h" 9 10const int kPaddingSize = 2; 11const int kPercentsSize = 4; 12const int kMaxExtraSize = kPaddingSize + 32 + kPercentsSize; 13 14static void ClearPrev(char *p, int num) 15{ 16 int 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 23void 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 33void CPercentPrinter::PrintString(const char *s) 34{ 35 ClosePrint(); 36 (*OutStream) << s; 37} 38 39void CPercentPrinter::PrintString(const wchar_t *s) 40{ 41 ClosePrint(); 42 (*OutStream) << s; 43} 44 45void CPercentPrinter::PrintNewLine() 46{ 47 ClosePrint(); 48 (*OutStream) << "\n"; 49} 50 51void CPercentPrinter::RePrintRatio() 52{ 53 char s[32]; 54 ConvertUInt64ToString(((m_Total == 0) ? 0 : (m_CurValue * 100 / m_Total)), s); 55 int size = (int)strlen(s); 56 s[size++] = '%'; 57 s[size] = '\0'; 58 59 int extraSize = kPaddingSize + MyMax(size, kPercentsSize); 60 if (extraSize < m_NumExtraChars) 61 extraSize = m_NumExtraChars; 62 63 char fullString[kMaxExtraSize * 3]; 64 char *p = fullString; 65 int i; 66 if (m_NumExtraChars == 0) 67 { 68 for (i = 0; i < extraSize; i++) 69 *p++ = ' '; 70 m_NumExtraChars = extraSize; 71 } 72 73 for (i = 0; i < m_NumExtraChars; i++) 74 *p++ = '\b'; 75 m_NumExtraChars = extraSize; 76 for (; size < m_NumExtraChars; size++) 77 *p++ = ' '; 78 MyStringCopy(p, s); 79 (*OutStream) << fullString; 80 OutStream->Flush(); 81 m_PrevValue = m_CurValue; 82} 83 84void CPercentPrinter::PrintRatio() 85{ 86 if (m_CurValue < m_PrevValue + m_MinStepSize && 87 m_CurValue + m_MinStepSize > m_PrevValue && m_NumExtraChars != 0) 88 return; 89 RePrintRatio(); 90} 91