Upload 2.0.2
[physicsfs] / lzma / CPP / 7zip / UI / Console / PercentPrinter.cpp
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 }