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 |
|
10 const int kPaddingSize = 2; |
|
11 const int kPercentsSize = 4; |
|
12 const int kMaxExtraSize = kPaddingSize + 32 + kPercentsSize; |
|
13 |
|
14 static 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 |
|
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 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 |
|
84 void 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 } |
|