misc/libphysfs/lzma/CPP/7zip/UI/Console/PercentPrinter.cpp
branchui-scaling
changeset 15283 c4fd2813b127
parent 13390 0135e64c6c66
parent 15279 7ab5cf405686
child 15663 d92eeb468dad
equal deleted inserted replaced
13390:0135e64c6c66 15283:c4fd2813b127
     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 }