Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- iterator runes*(s: Stream, buffSize=64000): Rune =
- ## reads runes from a stream. Resuming is not supported.
- ## It must be ran until completion, otherwise it
- ## may've consumed more than what was yielded. Raises
- ## `EIO` if an error occurred.
- var buff = newString(buffSize)
- var rune: Rune
- var n = 0
- var safeBoundary = buffSize - 4
- while not s.atEnd:
- let read = readData(s, addr(buff[n]), buff.len - n)
- if read != buff.len - n:
- assert s.atEnd
- buff.setLen(read + n)
- safeBoundary = buff.len
- n = 0
- while n < safeBoundary:
- fastRuneAt(buff, n, rune, true)
- yield rune
- copyMem(addr(buff[0]), addr(buff[n]), buff.len - n)
- n = buff.len - n
Add Comment
Please, Sign In to add comment