Software / code / prosody
Comparison
util/dbuffer.lua @ 10980:eaee72c7afbd
util.dbuffer: If no bytes parameter passed to read, return remainder of frontmost chunk
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Mon, 29 Jun 2020 12:51:28 +0100 |
| parent | 10973:39991e40d1dc |
| child | 11028:d7a403060946 |
comparison
equal
deleted
inserted
replaced
| 10979:5671d51df26c | 10980:eaee72c7afbd |
|---|---|
| 22 function dbuffer_methods:read_chunk(requested_bytes) | 22 function dbuffer_methods:read_chunk(requested_bytes) |
| 23 local chunk, consumed = self.items:peek(), self.front_consumed; | 23 local chunk, consumed = self.items:peek(), self.front_consumed; |
| 24 if not chunk then return; end | 24 if not chunk then return; end |
| 25 local chunk_length = #chunk; | 25 local chunk_length = #chunk; |
| 26 local remaining_chunk_length = chunk_length - consumed; | 26 local remaining_chunk_length = chunk_length - consumed; |
| 27 if not requested_bytes then | |
| 28 requested_bytes = remaining_chunk_length; | |
| 29 end | |
| 27 if remaining_chunk_length <= requested_bytes then | 30 if remaining_chunk_length <= requested_bytes then |
| 28 self.front_consumed = 0; | 31 self.front_consumed = 0; |
| 29 self._length = self._length - remaining_chunk_length; | 32 self._length = self._length - remaining_chunk_length; |
| 30 self.items:pop(); | 33 self.items:pop(); |
| 31 assert(#chunk:sub(consumed + 1, -1) == remaining_chunk_length); | 34 assert(#chunk:sub(consumed + 1, -1) == remaining_chunk_length); |
| 39 end | 42 end |
| 40 | 43 |
| 41 function dbuffer_methods:read(requested_bytes) | 44 function dbuffer_methods:read(requested_bytes) |
| 42 local chunks; | 45 local chunks; |
| 43 | 46 |
| 44 if requested_bytes > self._length then | 47 if requested_bytes and requested_bytes > self._length then |
| 45 return nil; | 48 return nil; |
| 46 end | 49 end |
| 47 | 50 |
| 48 local chunk, read_bytes = self:read_chunk(requested_bytes); | 51 local chunk, read_bytes = self:read_chunk(requested_bytes); |
| 49 if chunk then | 52 if not requested_bytes then |
| 53 return chunk; | |
| 54 elseif chunk then | |
| 50 requested_bytes = requested_bytes - read_bytes; | 55 requested_bytes = requested_bytes - read_bytes; |
| 51 if requested_bytes == 0 then -- Already read everything we need | 56 if requested_bytes == 0 then -- Already read everything we need |
| 52 return chunk; | 57 return chunk; |
| 53 end | 58 end |
| 54 chunks = {}; | 59 chunks = {}; |