6 #include "fitz-stream.h"
9 fz_makedata(fz_stream
*stm
)
11 fz_buffer
*buf
= stm
->buffer
;
20 if (stm
->mode
!= FZ_SREAD
)
26 error
= fz_rewindbuffer(buf
);
30 if (buf
->ep
- buf
->wp
== 0)
32 error
= fz_growbuffer(buf
);
41 n
= read(stm
->file
, buf
->wp
, buf
->ep
- buf
->wp
);
44 stm
->error
= fz_throw("ioerror: read: %s", strerror(errno
));
58 reason
= fz_process(stm
->filter
, stm
->chain
->buffer
, buf
);
60 if (stm
->filter
->produced
)
63 if (reason
== fz_ioneedin
)
65 if (fz_makedata(stm
->chain
) < 0)
72 else if (reason
== fz_ioneedout
)
77 if (buf
->rp
> buf
->bp
)
79 error
= fz_rewindbuffer(buf
);
85 error
= fz_growbuffer(buf
);
91 else if (reason
== fz_iodone
)
115 int fz_rtell(fz_stream
*stm
)
117 fz_buffer
*buf
= stm
->buffer
;
123 if (stm
->mode
!= FZ_SREAD
)
129 t
= lseek(stm
->file
, 0, 1);
135 return t
- (buf
->wp
- buf
->rp
);
138 return stm
->filter
->count
- (buf
->wp
- buf
->rp
);
141 return buf
->rp
- buf
->bp
;
147 int fz_rseek(fz_stream
*stm
, int offset
, int whence
)
149 fz_buffer
*buf
= stm
->buffer
;
155 if (stm
->mode
!= FZ_SREAD
)
160 int cur
= fz_rtell(stm
);
163 offset
= cur
+ offset
;
172 t
= lseek(stm
->file
, offset
, whence
);
175 stm
->error
= fz_throw("ioerror: lseek: %s", strerror(errno
));
188 if (offset
< fz_tell(stm
))
190 stm
->error
= fz_throw("ioerror: cannot seek back in filter");
194 while (fz_tell(stm
) < offset
)
196 c
= fz_readbyte(stm
);
210 buf
->rp
= CLAMP(buf
->bp
+ offset
, buf
->bp
, buf
->ep
);
212 buf
->rp
= CLAMP(buf
->ep
+ offset
, buf
->bp
, buf
->ep
);
213 return buf
->rp
- buf
->bp
;
219 int fz_readbytex(fz_stream
*stm
)
221 fz_buffer
*buf
= stm
->buffer
;
222 if (buf
->rp
== buf
->wp
)
224 if (buf
->eof
) return EOF
;
225 if (fz_makedata(stm
) < 0) return EOF
;
227 if (buf
->rp
< buf
->wp
)
232 int fz_peekbytex(fz_stream
*stm
)
234 fz_buffer
*buf
= stm
->buffer
;
235 if (buf
->rp
== buf
->wp
)
237 if (buf
->eof
) return EOF
;
238 if (fz_makedata(stm
) < 0) return EOF
;
240 if (buf
->rp
< buf
->wp
)
245 int fz_read(fz_stream
*stm
, unsigned char *mem
, int n
)
247 fz_buffer
*buf
= stm
->buffer
;
252 while (buf
->rp
< buf
->wp
&& i
< n
)
253 mem
[i
++] = *buf
->rp
++;
254 if (buf
->rp
== buf
->wp
)
256 if (buf
->eof
) return i
;
257 if (fz_makedata(stm
) < 0) return -1;