posix_iov_cut_prefix.cpp 782 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. //
  2. // $Id$
  3. //
  4. #include<__vic/posix/iov.h>
  5. #include<cassert>
  6. namespace __vic { namespace posix {
  7. //----------------------------------------------------------------------------
  8. void cut_prefix(::iovec *&vec, unsigned &vec_len, size_t n)
  9. {
  10. ::iovec *v = vec;
  11. unsigned len = vec_len;
  12. for(; len != 0 && v->iov_len <= n; len--)
  13. {
  14. n -= v->iov_len;
  15. v++;
  16. }
  17. if(len == 0 || v->iov_len <= n)
  18. {
  19. vec_len = 0;
  20. return; // n >= total(vec, vec_len)
  21. }
  22. assert(len > 0 && v->iov_len > n);
  23. if(n != 0)
  24. {
  25. v->iov_base = static_cast<char *>(v->iov_base) + n;
  26. v->iov_len -= n;
  27. }
  28. vec = v;
  29. vec_len = len;
  30. }
  31. //----------------------------------------------------------------------------
  32. }} // namespace