示例#1
0
文件: XzIn.c 项目: 0xe7/hashcat
SRes Xzs_ReadBackward(CXzs *p, ILookInStream *stream, Int64 *startOffset, ICompressProgress *progress, ISzAllocPtr alloc)
{
  Int64 endOffset = 0;
  RINOK(ILookInStream_Seek(stream, &endOffset, SZ_SEEK_END));
  *startOffset = endOffset;
  for (;;)
  {
    CXzStream st;
    SRes res;
    Xz_Construct(&st);
    res = Xz_ReadBackward(&st, stream, startOffset, alloc);
    st.startOffset = *startOffset;
    RINOK(res);
    if (p->num == p->numAllocated)
    {
      size_t newNum = p->num + p->num / 4 + 1;
      Byte *data = (Byte *)ISzAlloc_Alloc(alloc, newNum * sizeof(CXzStream));
      if (!data)
        return SZ_ERROR_MEM;
      p->numAllocated = newNum;
      if (p->num != 0)
        memcpy(data, p->streams, p->num * sizeof(CXzStream));
      ISzAlloc_Free(alloc, p->streams);
      p->streams = (CXzStream *)data;
    }
    p->streams[p->num++] = st;
    if (*startOffset == 0)
      break;
    RINOK(LookInStream_SeekTo(stream, *startOffset));
    if (progress && ICompressProgress_Progress(progress, endOffset - *startOffset, (UInt64)(Int64)-1) != SZ_OK)
      return SZ_ERROR_PROGRESS;
  }
  return SZ_OK;
}
示例#2
0
SRes Xz_EncodeEmpty(ISeqOutStream *outStream)
{
	SRes res;
	CXzStream xz;
	Xz_Construct(&xz);
	res = Xz_WriteHeader(xz.flags, outStream);
	if (res == SZ_OK)
	res = Xz_WriteFooter(&xz, outStream);
	Xz_Free(&xz, &g_Alloc);
	return res;
}
示例#3
0
SRes Xz_Encode(ISeqOutStream *outStream, ISeqInStream *inStream,
	const CXzProps *props, ICompressProgress *progress)
{
	SRes res;
	CXzStream xz;
	CLzma2WithFilters lzmaf;
	Xz_Construct(&xz);
	Lzma2WithFilters_Construct(&lzmaf, &g_Alloc, &g_BigAlloc);
	res = Lzma2WithFilters_Create(&lzmaf);
	if (res == SZ_OK)
	res = Xz_Compress(&xz, &lzmaf, outStream, inStream, props, progress);
	Lzma2WithFilters_Free(&lzmaf);
	Xz_Free(&xz, &g_Alloc);
	return res;
}