1 /* 7zStream.c -- 7z Stream functions
2 2013-11-12 : Igor Pavlov : Public domain */
10 SRes
SeqInStream_Read2(ISeqInStream
*stream
, void *buf
, size_t size
, SRes errorType
)
14 size_t processed
= size
;
15 RINOK(stream
->Read(stream
, buf
, &processed
));
18 buf
= (void *)((Byte
*)buf
+ processed
);
24 SRes
SeqInStream_Read(ISeqInStream
*stream
, void *buf
, size_t size
)
26 return SeqInStream_Read2(stream
, buf
, size
, SZ_ERROR_INPUT_EOF
);
29 SRes
SeqInStream_ReadByte(ISeqInStream
*stream
, Byte
*buf
)
32 RINOK(stream
->Read(stream
, buf
, &processed
));
33 return (processed
== 1) ? SZ_OK
: SZ_ERROR_INPUT_EOF
;
36 SRes
LookInStream_SeekTo(ILookInStream
*stream
, UInt64 offset
)
39 return stream
->Seek(stream
, &t
, SZ_SEEK_SET
);
42 SRes
LookInStream_LookRead(ILookInStream
*stream
, void *buf
, size_t *size
)
47 RINOK(stream
->Look(stream
, &lookBuf
, size
));
48 memcpy(buf
, lookBuf
, *size
);
49 return stream
->Skip(stream
, *size
);
52 SRes
LookInStream_Read2(ILookInStream
*stream
, void *buf
, size_t size
, SRes errorType
)
56 size_t processed
= size
;
57 RINOK(stream
->Read(stream
, buf
, &processed
));
60 buf
= (void *)((Byte
*)buf
+ processed
);
66 SRes
LookInStream_Read(ILookInStream
*stream
, void *buf
, size_t size
)
68 return LookInStream_Read2(stream
, buf
, size
, SZ_ERROR_INPUT_EOF
);
71 static SRes
LookToRead_Look_Lookahead(void *pp
, const void **buf
, size_t *size
)
74 CLookToRead
*p
= (CLookToRead
*)pp
;
75 size_t size2
= p
->size
- p
->pos
;
76 if (size2
== 0 && *size
> 0)
79 size2
= LookToRead_BUF_SIZE
;
80 res
= p
->realStream
->Read(p
->realStream
, p
->buf
, &size2
);
85 *buf
= p
->buf
+ p
->pos
;
89 static SRes
LookToRead_Look_Exact(void *pp
, const void **buf
, size_t *size
)
92 CLookToRead
*p
= (CLookToRead
*)pp
;
93 size_t size2
= p
->size
- p
->pos
;
94 if (size2
== 0 && *size
> 0)
97 if (*size
> LookToRead_BUF_SIZE
)
98 *size
= LookToRead_BUF_SIZE
;
99 res
= p
->realStream
->Read(p
->realStream
, p
->buf
, size
);
100 size2
= p
->size
= *size
;
104 *buf
= p
->buf
+ p
->pos
;
108 static SRes
LookToRead_Skip(void *pp
, size_t offset
)
110 CLookToRead
*p
= (CLookToRead
*)pp
;
115 static SRes
LookToRead_Read(void *pp
, void *buf
, size_t *size
)
117 CLookToRead
*p
= (CLookToRead
*)pp
;
118 size_t rem
= p
->size
- p
->pos
;
120 return p
->realStream
->Read(p
->realStream
, buf
, size
);
123 memcpy(buf
, p
->buf
+ p
->pos
, rem
);
129 static SRes
LookToRead_Seek(void *pp
, Int64
*pos
, ESzSeek origin
)
131 CLookToRead
*p
= (CLookToRead
*)pp
;
132 p
->pos
= p
->size
= 0;
133 return p
->realStream
->Seek(p
->realStream
, pos
, origin
);
136 void LookToRead_CreateVTable(CLookToRead
*p
, int lookahead
)
138 p
->s
.Look
= lookahead
?
139 LookToRead_Look_Lookahead
:
140 LookToRead_Look_Exact
;
141 p
->s
.Skip
= LookToRead_Skip
;
142 p
->s
.Read
= LookToRead_Read
;
143 p
->s
.Seek
= LookToRead_Seek
;
146 void LookToRead_Init(CLookToRead
*p
)
148 p
->pos
= p
->size
= 0;
151 static SRes
SecToLook_Read(void *pp
, void *buf
, size_t *size
)
153 CSecToLook
*p
= (CSecToLook
*)pp
;
154 return LookInStream_LookRead(p
->realStream
, buf
, size
);
157 void SecToLook_CreateVTable(CSecToLook
*p
)
159 p
->s
.Read
= SecToLook_Read
;
162 static SRes
SecToRead_Read(void *pp
, void *buf
, size_t *size
)
164 CSecToRead
*p
= (CSecToRead
*)pp
;
165 return p
->realStream
->Read(p
->realStream
, buf
, size
);
168 void SecToRead_CreateVTable(CSecToRead
*p
)
170 p
->s
.Read
= SecToRead_Read
;