Compression.cpp 3.2 KB

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