extract-progress.h 888 B

1234567891011121314151617181920212223242526
  1. // 7-Zip emits an ASCII percentage at the start of each refreshed progress line.
  2. #pragma once
  3. #include <cstddef>
  4. struct ExtractionProgress {
  5. unsigned value = 0;
  6. unsigned number = 0;
  7. unsigned digits = 0;
  8. bool start = true;
  9. void Read(const char* data, std::size_t length) {
  10. for (std::size_t i = 0; i < length; ++i) {
  11. const char c = data[i];
  12. if (c == '\r' || c == '\n' || c == '\b') {
  13. start = true; number = 0; digits = 0;
  14. } else if (start && c == ' ' && digits == 0) {
  15. continue;
  16. } else if (start && c >= '0' && c <= '9' && digits < 3) {
  17. number = number * 10 + c - '0'; ++digits;
  18. } else {
  19. if (start && c == '%' && digits && number <= 100 && number > value) value = number;
  20. start = false;
  21. }
  22. }
  23. }
  24. };