Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Setting flexi-stream-position has no effect on the next byte read #35

Open
andrei-dubovik opened this issue Apr 10, 2020 · 5 comments
Open

Comments

@andrei-dubovik
Copy link

Running

(with-open-file (in "2-byte-file" :element-type '(unsigned-byte 8))
  (setq in (make-flexi-stream in))
  (setf (flexi-stream-position in) 1)
  (read-byte in))

returns the first byte, while I would expect the second byte. This happens on SBCL for me. I don't know if it's a bug or intended behavior, however in the latter case might be good to update the documentation.

@stassats
Copy link
Member

The behavior of (setf flexi-stream-position) isn't documented anywhere. You should use FILE-POSITION.

@andrei-dubovik
Copy link
Author

andrei-dubovik commented Apr 10, 2020

Hi. Thanks for a quick response. file-position does not report correct flexi-stream position after peek-byte, nor does it set the correct position. This is per documentation, I think, "FILE-POSITION for flexi streams will work as if the function had been applied to the underlying stream." Suppose I'm reading in a file, use peek-byte at times, and then I want to shift the position in the flexi-stream. Neither flexi-stream-position nor file-position can currently do it, I think.

@stassats
Copy link
Member

Is the issue with double buffering? I.e. file-position should clear the flexi-stream buffer of unread bytes?

@andrei-dubovik
Copy link
Author

Suppose I am reading a stream, using peek-byte sometimes, and now I want to jump back a number of bytes. If file-position would clear the buffer of unread bytes, I can do that, but the code will look counterintuitive. First, read the current position with flexi-stream-position. Second, set the new position with file-position. Would it not be more intuitive to use (setf (flexi-stream-position) ...) for that?

I'm not at all familiar with flexi-stream, just started playing with it this week. What I was looking for is to have peek-byte functionality and the ability to move back and forth within the stream, like it exists with file-position in standard streams. Well, (setf (flexi-stream-position) ...) is at least listed in the documentation, so I gave it a spin, but it does something different. I don't have a strong opinion on how best to implement the functionality I discuss.

@stassats
Copy link
Member

flexi-stream-position is not really properly documented, so the most intuitive thing would be not to have it and only rely on file-position. Which, at the moment, doesn't play well with the buffering that flexi-streams is performing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants