PercentPrinter.cpp revision baa3858d3f5d128a5c8466b700098109edcad5f2
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