Guest User

Untitled

a guest
Nov 18th, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.68 KB | None | 0 0
  1. iterator runes*(s: Stream, buffSize=64000): Rune =
  2. ## reads runes from a stream. Resuming is not supported.
  3. ## It must be ran until completion, otherwise it
  4. ## may've consumed more than what was yielded. Raises
  5. ## `EIO` if an error occurred.
  6. var buff = newString(buffSize)
  7. var rune: Rune
  8. var n = 0
  9. var safeBoundary = buffSize - 4
  10. while not s.atEnd:
  11. let read = readData(s, addr(buff[n]), buff.len - n)
  12. if read != buff.len - n:
  13. assert s.atEnd
  14. buff.setLen(read + n)
  15. safeBoundary = buff.len
  16. n = 0
  17. while n < safeBoundary:
  18. fastRuneAt(buff, n, rune, true)
  19. yield rune
  20. copyMem(addr(buff[0]), addr(buff[n]), buff.len - n)
  21. n = buff.len - n
Add Comment
Please, Sign In to add comment