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