-
Notifications
You must be signed in to change notification settings - Fork 59
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Showing
138 changed files
with
10,557 additions
and
44 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
/* 7zAlloc.h -- Allocation functions | ||
2010-10-29 : Igor Pavlov : Public domain */ | ||
|
||
#ifndef __7Z_ALLOC_H | ||
#define __7Z_ALLOC_H | ||
|
||
#include <stdlib.h> | ||
|
||
void *SzAlloc(void *p, size_t size); | ||
void SzFree(void *p, void *address); | ||
|
||
void *SzAllocTemp(void *p, size_t size); | ||
void SzFreeTemp(void *p, void *address); | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
/* 7zFile.h -- File IO | ||
2009-11-24 : Igor Pavlov : P ublic domain */ | ||
|
||
#ifndef __7Z_FILE_H | ||
#define __7Z_FILE_H | ||
|
||
#ifdef _WIN32 | ||
#define USE_WINDOWS_FILE | ||
#endif | ||
|
||
#ifdef USE_WINDOWS_FILE | ||
#include <windows.h> | ||
#else | ||
#include <stdio.h> | ||
#endif | ||
|
||
#include "Types2.h" | ||
|
||
EXTERN_C_BEGIN | ||
|
||
/* ---------- File ---------- */ | ||
|
||
typedef struct | ||
{ | ||
#ifdef USE_WINDOWS_FILE | ||
HANDLE handle; | ||
#else | ||
FILE *file; | ||
#endif | ||
} CSzFile; | ||
|
||
void File_Construct(CSzFile *p); | ||
#if !defined(UNDER_CE) || !defined(USE_WINDOWS_FILE) | ||
WRes InFile_Open(CSzFile *p, const char *name); | ||
WRes OutFile_Open(CSzFile *p, const char *name); | ||
#endif | ||
#ifdef USE_WINDOWS_FILE | ||
WRes InFile_OpenW(CSzFile *p, const WCHAR *name); | ||
WRes OutFile_OpenW(CSzFile *p, const WCHAR *name); | ||
#endif | ||
WRes File_Close(CSzFile *p); | ||
|
||
/* reads max(*size, remain file's size) bytes */ | ||
WRes File_Read(CSzFile *p, void *data, size_t *size); | ||
|
||
/* writes *size bytes */ | ||
WRes File_Write(CSzFile *p, const void *data, size_t *size); | ||
|
||
WRes File_Seek(CSzFile *p, Int64 *pos, ESzSeek origin); | ||
WRes File_GetLength(CSzFile *p, UInt64 *length); | ||
|
||
|
||
/* ---------- FileInStream ---------- */ | ||
|
||
typedef struct | ||
{ | ||
ISeqInStream s; | ||
CSzFile file; | ||
} CFileSeqInStream; | ||
|
||
void FileSeqInStream_CreateVTable(CFileSeqInStream *p); | ||
|
||
|
||
typedef struct | ||
{ | ||
ISeekInStream s; | ||
CSzFile file; | ||
} CFileInStream; | ||
|
||
void FileInStream_CreateVTable(CFileInStream *p); | ||
|
||
|
||
typedef struct | ||
{ | ||
ISeqOutStream s; | ||
CSzFile file; | ||
} CFileOutStream; | ||
|
||
void FileOutStream_CreateVTable(CFileOutStream *p); | ||
|
||
EXTERN_C_END | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,169 @@ | ||
/* 7zStream.c -- 7z Stream functions | ||
2010-03-11 : Igor Pavlov : Public domain */ | ||
|
||
#include <string.h> | ||
|
||
#include "Types2.h" | ||
|
||
SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType) | ||
{ | ||
while (size != 0) | ||
{ | ||
size_t processed = size; | ||
RINOK(stream->Read(stream, buf, &processed)); | ||
if (processed == 0) | ||
return errorType; | ||
buf = (void *)((Byte *)buf + processed); | ||
size -= processed; | ||
} | ||
return SZ_OK; | ||
} | ||
|
||
SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size) | ||
{ | ||
return SeqInStream_Read2(stream, buf, size, SZ_ERROR_INPUT_EOF); | ||
} | ||
|
||
SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf) | ||
{ | ||
size_t processed = 1; | ||
RINOK(stream->Read(stream, buf, &processed)); | ||
return (processed == 1) ? SZ_OK : SZ_ERROR_INPUT_EOF; | ||
} | ||
|
||
SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset) | ||
{ | ||
Int64 t = offset; | ||
return stream->Seek(stream, &t, SZ_SEEK_SET); | ||
} | ||
|
||
SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size) | ||
{ | ||
const void *lookBuf; | ||
if (*size == 0) | ||
return SZ_OK; | ||
RINOK(stream->Look(stream, &lookBuf, size)); | ||
memcpy(buf, lookBuf, *size); | ||
return stream->Skip(stream, *size); | ||
} | ||
|
||
SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType) | ||
{ | ||
while (size != 0) | ||
{ | ||
size_t processed = size; | ||
RINOK(stream->Read(stream, buf, &processed)); | ||
if (processed == 0) | ||
return errorType; | ||
buf = (void *)((Byte *)buf + processed); | ||
size -= processed; | ||
} | ||
return SZ_OK; | ||
} | ||
|
||
SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size) | ||
{ | ||
return LookInStream_Read2(stream, buf, size, SZ_ERROR_INPUT_EOF); | ||
} | ||
|
||
static SRes LookToRead_Look_Lookahead(void *pp, const void **buf, size_t *size) | ||
{ | ||
SRes res = SZ_OK; | ||
CLookToRead *p = (CLookToRead *)pp; | ||
size_t size2 = p->size - p->pos; | ||
if (size2 == 0 && *size > 0) | ||
{ | ||
p->pos = 0; | ||
size2 = LookToRead_BUF_SIZE; | ||
res = p->realStream->Read(p->realStream, p->buf, &size2); | ||
p->size = size2; | ||
} | ||
if (size2 < *size) | ||
*size = size2; | ||
*buf = p->buf + p->pos; | ||
return res; | ||
} | ||
|
||
static SRes LookToRead_Look_Exact(void *pp, const void **buf, size_t *size) | ||
{ | ||
SRes res = SZ_OK; | ||
CLookToRead *p = (CLookToRead *)pp; | ||
size_t size2 = p->size - p->pos; | ||
if (size2 == 0 && *size > 0) | ||
{ | ||
p->pos = 0; | ||
if (*size > LookToRead_BUF_SIZE) | ||
*size = LookToRead_BUF_SIZE; | ||
res = p->realStream->Read(p->realStream, p->buf, size); | ||
size2 = p->size = *size; | ||
} | ||
if (size2 < *size) | ||
*size = size2; | ||
*buf = p->buf + p->pos; | ||
return res; | ||
} | ||
|
||
static SRes LookToRead_Skip(void *pp, size_t offset) | ||
{ | ||
CLookToRead *p = (CLookToRead *)pp; | ||
p->pos += offset; | ||
return SZ_OK; | ||
} | ||
|
||
static SRes LookToRead_Read(void *pp, void *buf, size_t *size) | ||
{ | ||
CLookToRead *p = (CLookToRead *)pp; | ||
size_t rem = p->size - p->pos; | ||
if (rem == 0) | ||
return p->realStream->Read(p->realStream, buf, size); | ||
if (rem > *size) | ||
rem = *size; | ||
memcpy(buf, p->buf + p->pos, rem); | ||
p->pos += rem; | ||
*size = rem; | ||
return SZ_OK; | ||
} | ||
|
||
static SRes LookToRead_Seek(void *pp, Int64 *pos, ESzSeek origin) | ||
{ | ||
CLookToRead *p = (CLookToRead *)pp; | ||
p->pos = p->size = 0; | ||
return p->realStream->Seek(p->realStream, pos, origin); | ||
} | ||
|
||
void LookToRead_CreateVTable(CLookToRead *p, int lookahead) | ||
{ | ||
p->s.Look = lookahead ? | ||
LookToRead_Look_Lookahead : | ||
LookToRead_Look_Exact; | ||
p->s.Skip = LookToRead_Skip; | ||
p->s.Read = LookToRead_Read; | ||
p->s.Seek = LookToRead_Seek; | ||
} | ||
|
||
void LookToRead_Init(CLookToRead *p) | ||
{ | ||
p->pos = p->size = 0; | ||
} | ||
|
||
static SRes SecToLook_Read(void *pp, void *buf, size_t *size) | ||
{ | ||
CSecToLook *p = (CSecToLook *)pp; | ||
return LookInStream_LookRead(p->realStream, buf, size); | ||
} | ||
|
||
void SecToLook_CreateVTable(CSecToLook *p) | ||
{ | ||
p->s.Read = SecToLook_Read; | ||
} | ||
|
||
static SRes SecToRead_Read(void *pp, void *buf, size_t *size) | ||
{ | ||
CSecToRead *p = (CSecToRead *)pp; | ||
return p->realStream->Read(p->realStream, buf, size); | ||
} | ||
|
||
void SecToRead_CreateVTable(CSecToRead *p) | ||
{ | ||
p->s.Read = SecToRead_Read; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,127 @@ | ||
/* Alloc.c -- Memory allocation functions | ||
2008-09-24 | ||
Igor Pavlov | ||
Public domain */ | ||
|
||
#ifdef _WIN32 | ||
#include <windows.h> | ||
#endif | ||
#include <stdlib.h> | ||
|
||
#include "Alloc.h" | ||
|
||
/* #define _SZ_ALLOC_DEBUG */ | ||
|
||
/* use _SZ_ALLOC_DEBUG to debug alloc/free operations */ | ||
#ifdef _SZ_ALLOC_DEBUG | ||
#include <stdio.h> | ||
int g_allocCount = 0; | ||
int g_allocCountMid = 0; | ||
int g_allocCountBig = 0; | ||
#endif | ||
|
||
void *MyAlloc(size_t size) | ||
{ | ||
if (size == 0) | ||
return 0; | ||
#ifdef _SZ_ALLOC_DEBUG | ||
{ | ||
void *p = malloc(size); | ||
fprintf(stderr, "\nAlloc %10d bytes, count = %10d, addr = %8X", size, g_allocCount++, (unsigned)p); | ||
return p; | ||
} | ||
#else | ||
return malloc(size); | ||
#endif | ||
} | ||
|
||
void MyFree(void *address) | ||
{ | ||
#ifdef _SZ_ALLOC_DEBUG | ||
if (address != 0) | ||
fprintf(stderr, "\nFree; count = %10d, addr = %8X", --g_allocCount, (unsigned)address); | ||
#endif | ||
free(address); | ||
} | ||
|
||
#ifdef _WIN32 | ||
|
||
void *MidAlloc(size_t size) | ||
{ | ||
if (size == 0) | ||
return 0; | ||
#ifdef _SZ_ALLOC_DEBUG | ||
fprintf(stderr, "\nAlloc_Mid %10d bytes; count = %10d", size, g_allocCountMid++); | ||
#endif | ||
return VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE); | ||
} | ||
|
||
void MidFree(void *address) | ||
{ | ||
#ifdef _SZ_ALLOC_DEBUG | ||
if (address != 0) | ||
fprintf(stderr, "\nFree_Mid; count = %10d", --g_allocCountMid); | ||
#endif | ||
if (address == 0) | ||
return; | ||
VirtualFree(address, 0, MEM_RELEASE); | ||
} | ||
|
||
#ifndef MEM_LARGE_PAGES | ||
#undef _7ZIP_LARGE_PAGES | ||
#endif | ||
|
||
#ifdef _7ZIP_LARGE_PAGES | ||
SIZE_T g_LargePageSize = 0; | ||
typedef SIZE_T (WINAPI *GetLargePageMinimumP)(); | ||
#endif | ||
|
||
void SetLargePageSize() | ||
{ | ||
#ifdef _7ZIP_LARGE_PAGES | ||
SIZE_T size = 0; | ||
GetLargePageMinimumP largePageMinimum = (GetLargePageMinimumP) | ||
GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetLargePageMinimum"); | ||
if (largePageMinimum == 0) | ||
return; | ||
size = largePageMinimum(); | ||
if (size == 0 || (size & (size - 1)) != 0) | ||
return; | ||
g_LargePageSize = size; | ||
#endif | ||
} | ||
|
||
|
||
void *BigAlloc(size_t size) | ||
{ | ||
if (size == 0) | ||
return 0; | ||
#ifdef _SZ_ALLOC_DEBUG | ||
fprintf(stderr, "\nAlloc_Big %10d bytes; count = %10d", size, g_allocCountBig++); | ||
#endif | ||
|
||
#ifdef _7ZIP_LARGE_PAGES | ||
if (g_LargePageSize != 0 && g_LargePageSize <= (1 << 30) && size >= (1 << 18)) | ||
{ | ||
void *res = VirtualAlloc(0, (size + g_LargePageSize - 1) & (~(g_LargePageSize - 1)), | ||
MEM_COMMIT | MEM_LARGE_PAGES, PAGE_READWRITE); | ||
if (res != 0) | ||
return res; | ||
} | ||
#endif | ||
return VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE); | ||
} | ||
|
||
void BigFree(void *address) | ||
{ | ||
#ifdef _SZ_ALLOC_DEBUG | ||
if (address != 0) | ||
fprintf(stderr, "\nFree_Big; count = %10d", --g_allocCountBig); | ||
#endif | ||
|
||
if (address == 0) | ||
return; | ||
VirtualFree(address, 0, MEM_RELEASE); | ||
} | ||
|
||
#endif |
Oops, something went wrong.