Compression.cpp revision ee03c949b85036b68c261dcc27dca064ee7e525d
1ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov//===--- Compression.cpp - Compression implementation ---------------------===// 2ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov// 3ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov// The LLVM Compiler Infrastructure 4ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov// 5ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov// This file is distributed under the University of Illinois Open Source 6ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov// License. See LICENSE.TXT for details. 7ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov// 8ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov//===----------------------------------------------------------------------===// 9ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov// 10ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov// This file implements compression functions. 11ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov// 12ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov//===----------------------------------------------------------------------===// 13ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov 14ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov#include "llvm/Support/Compression.h" 15ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov#include "llvm/ADT/OwningPtr.h" 16ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov#include "llvm/ADT/StringRef.h" 17ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov#include "llvm/Config/config.h" 18ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov#include "llvm/Support/ErrorHandling.h" 19ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov#include "llvm/Support/MemoryBuffer.h" 20ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov#if LLVM_ENABLE_ZLIB == 1 && HAVE_ZLIB_H 21ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov#include <zlib.h> 22ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov#endif 23ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov 24ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonovusing namespace llvm; 25ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov 26ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov#if LLVM_ENABLE_ZLIB == 1 27ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonovstatic int encodeZlibCompressionLevel(zlib::CompressionLevel Level) { 28ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov switch (Level) { 29ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov case zlib::NoCompression: return 0; 30ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov case zlib::BestSpeedCompression: return 1; 31ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov case zlib::DefaultCompression: return Z_DEFAULT_COMPRESSION; 32ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov case zlib::BestSizeCompression: return 9; 33ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov } 34ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov} 35ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov 36ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonovstatic zlib::Status encodeZlibReturnValue(int ReturnValue) { 37ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov switch (ReturnValue) { 38ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov case Z_OK: return zlib::StatusOK; 39ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov case Z_MEM_ERROR: return zlib::StatusOutOfMemory; 40ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov case Z_BUF_ERROR: return zlib::StatusBufferTooShort; 41ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov case Z_STREAM_ERROR: return zlib::StatusInvalidArg; 42ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov case Z_DATA_ERROR: return zlib::StatusInvalidData; 43ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov default: llvm_unreachable("unknown zlib return status!"); 44ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov } 45ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov} 46ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov 47ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonovbool zlib::isAvailable() { return true; } 48ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonovzlib::Status zlib::compress(StringRef InputBuffer, 49ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov OwningPtr<MemoryBuffer> &CompressedBuffer, 50ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov CompressionLevel Level) { 51ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov unsigned long CompressedSize = ::compressBound(InputBuffer.size()); 52ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov OwningArrayPtr<char> TmpBuffer(new char[CompressedSize]); 53ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov int CLevel = encodeZlibCompressionLevel(Level); 54ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov Status Res = encodeZlibReturnValue(::compress2( 55ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov (Bytef *)TmpBuffer.get(), &CompressedSize, 56ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov (const Bytef *)InputBuffer.data(), InputBuffer.size(), CLevel)); 57ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov if (Res == StatusOK) 58ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov CompressedBuffer.reset(MemoryBuffer::getMemBufferCopy( 59ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov StringRef(TmpBuffer.get(), CompressedSize))); 60ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov return Res; 61ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov} 62ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov 63ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonovzlib::Status zlib::uncompress(StringRef InputBuffer, 64ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov OwningPtr<MemoryBuffer> &UncompressedBuffer, 65ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov size_t UncompressedSize) { 66ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov OwningArrayPtr<char> TmpBuffer(new char[UncompressedSize]); 67ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov Status Res = encodeZlibReturnValue( 68ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov ::uncompress((Bytef *)TmpBuffer.get(), (uLongf *)&UncompressedSize, 69ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov (const Bytef *)InputBuffer.data(), InputBuffer.size())); 70ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov if (Res == StatusOK) 71ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov UncompressedBuffer.reset(MemoryBuffer::getMemBufferCopy( 72ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov StringRef(TmpBuffer.get(), UncompressedSize))); 73ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov return Res; 74ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov} 75ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov 76ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov#else 77ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonovbool zlib::isAvailable() { return false; } 78ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonovzlib::Status zlib::compress(StringRef InputBuffer, 79ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov OwningPtr<MemoryBuffer> &CompressedBuffer, 80ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov CompressionLevel Level) { 81ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov return zlib::StatusUnsupported; 82ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov} 83ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonovzlib::Status zlib::uncompress(StringRef InputBuffer, 84ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov OwningPtr<MemoryBuffer> &UncompressedBuffer, 85ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov size_t UncompressedSize) { 86ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov return zlib::StatusUnsupported; 87ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov} 88ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov#endif 89ee03c949b85036b68c261dcc27dca064ee7e525dAlexey Samsonov 90