multi.cpp 936 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #include "null.h"
  2. #include "multi.h"
  3. TMultiInput::TMultiInput(IInputStream* f, IInputStream* s) noexcept
  4. : C_(f)
  5. , N_(s)
  6. {
  7. }
  8. TMultiInput::~TMultiInput() = default;
  9. size_t TMultiInput::DoRead(void* buf, size_t len) {
  10. const size_t ret = C_->Read(buf, len);
  11. if (ret) {
  12. return ret;
  13. }
  14. C_ = N_;
  15. N_ = &Cnull;
  16. return C_->Read(buf, len);
  17. }
  18. size_t TMultiInput::DoReadTo(TString& st, char ch) {
  19. size_t ret = C_->ReadTo(st, ch);
  20. if (ret == st.size() + 1) { // found a symbol, not eof
  21. return ret;
  22. }
  23. C_ = N_;
  24. N_ = &Cnull;
  25. if (ret == 0) {
  26. ret += C_->ReadTo(st, ch);
  27. } else {
  28. TString tmp;
  29. ret += C_->ReadTo(tmp, ch);
  30. st += tmp;
  31. }
  32. return ret;
  33. }
  34. size_t TMultiInput::DoSkip(size_t len) {
  35. const size_t ret = C_->Skip(len);
  36. if (ret) {
  37. return ret;
  38. }
  39. C_ = N_;
  40. N_ = &Cnull;
  41. return C_->Skip(len);
  42. }