// PercentPrinter.cpp | |
#include "StdAfx.h" | |
#include "../../../Common/Defs.h" | |
#include "../../../Common/IntToString.h" | |
#include "PercentPrinter.h" | |
static const unsigned kPaddingSize = 2; | |
static const unsigned kPercentsSize = 4; | |
static const unsigned kMaxExtraSize = kPaddingSize + 32 + kPercentsSize; | |
static void ClearPrev(char *p, unsigned num) | |
{ | |
unsigned i; | |
for (i = 0; i < num; i++) *p++ = '\b'; | |
for (i = 0; i < num; i++) *p++ = ' '; | |
for (i = 0; i < num; i++) *p++ = '\b'; | |
*p = '\0'; | |
} | |
void CPercentPrinter::ClosePrint() | |
{ | |
if (m_NumExtraChars == 0) | |
return; | |
char s[kMaxExtraSize * 3 + 1]; | |
ClearPrev(s, m_NumExtraChars); | |
(*OutStream) << s; | |
m_NumExtraChars = 0; | |
} | |
void CPercentPrinter::PrintString(const char *s) | |
{ | |
ClosePrint(); | |
(*OutStream) << s; | |
} | |
void CPercentPrinter::PrintString(const wchar_t *s) | |
{ | |
ClosePrint(); | |
(*OutStream) << s; | |
} | |
void CPercentPrinter::PrintNewLine() | |
{ | |
ClosePrint(); | |
(*OutStream) << "\n"; | |
} | |
void CPercentPrinter::RePrintRatio() | |
{ | |
char s[32]; | |
unsigned size; | |
{ | |
char c = '%'; | |
UInt64 value = 0; | |
if (m_Total == (UInt64)(Int64)-1) | |
{ | |
value = m_CurValue >> 20; | |
c = 'M'; | |
} | |
else if (m_Total != 0) | |
value = m_CurValue * 100 / m_Total; | |
ConvertUInt64ToString(value, s); | |
size = (unsigned)strlen(s); | |
s[size++] = c; | |
s[size] = '\0'; | |
} | |
unsigned extraSize = kPaddingSize + MyMax(size, kPercentsSize); | |
if (extraSize < m_NumExtraChars) | |
extraSize = m_NumExtraChars; | |
char fullString[kMaxExtraSize * 3]; | |
char *p = fullString; | |
unsigned i; | |
if (m_NumExtraChars == 0) | |
{ | |
for (i = 0; i < extraSize; i++) | |
*p++ = ' '; | |
m_NumExtraChars = extraSize; | |
} | |
for (i = 0; i < m_NumExtraChars; i++) | |
*p++ = '\b'; | |
m_NumExtraChars = extraSize; | |
for (; size < extraSize; size++) | |
*p++ = ' '; | |
MyStringCopy(p, s); | |
(*OutStream) << fullString; | |
OutStream->Flush(); | |
m_PrevValue = m_CurValue; | |
} | |
void CPercentPrinter::PrintRatio() | |
{ | |
if (m_CurValue < m_PrevValue + m_MinStepSize && | |
m_CurValue + m_MinStepSize > m_PrevValue && m_NumExtraChars != 0) | |
return; | |
RePrintRatio(); | |
} |