PercentPrinter.cpp 1.8 KB

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