2014-05-30 05:40:33 +00:00
|
|
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
2013-10-18 18:25:30 +00:00
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
|
|
|
|
#include "mozilla/Compression.h"
|
|
|
|
#include "mozilla/CheckedInt.h"
|
2014-05-30 05:40:33 +00:00
|
|
|
|
2015-08-21 07:05:40 +00:00
|
|
|
// Without including <string>, MSVC 2015 complains about e.g. the impossibility
|
|
|
|
// to convert `const void* const` to `void*` when calling memchr from
|
|
|
|
// corecrt_memory.h.
|
|
|
|
#include <string>
|
|
|
|
|
2017-03-09 02:11:15 +00:00
|
|
|
// Because we wrap lz4.c in an anonymous namespace, all of its #includes
|
|
|
|
// go in the anonymous namespace too. This would create conflicting
|
|
|
|
// declarations for intrinsic functions that are internally defined
|
|
|
|
// at top-level. Including intrin.h here prevents it from being included
|
|
|
|
// later within the anonymous namespace.
|
|
|
|
#ifdef _MSC_VER
|
|
|
|
#include <intrin.h>
|
|
|
|
#endif
|
|
|
|
|
2013-10-18 18:25:30 +00:00
|
|
|
using namespace mozilla::Compression;
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
#include "lz4.c"
|
|
|
|
|
|
|
|
}/* anonymous namespace */
|
|
|
|
|
|
|
|
/* Our wrappers */
|
|
|
|
|
|
|
|
size_t
|
2014-05-30 05:40:33 +00:00
|
|
|
LZ4::compress(const char* aSource, size_t aInputSize, char* aDest)
|
2013-10-18 18:25:30 +00:00
|
|
|
{
|
2014-05-30 05:40:33 +00:00
|
|
|
CheckedInt<int> inputSizeChecked = aInputSize;
|
|
|
|
MOZ_ASSERT(inputSizeChecked.isValid());
|
|
|
|
return LZ4_compress(aSource, aDest, inputSizeChecked.value());
|
2013-10-18 18:25:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
size_t
|
2014-05-30 05:40:33 +00:00
|
|
|
LZ4::compressLimitedOutput(const char* aSource, size_t aInputSize, char* aDest,
|
|
|
|
size_t aMaxOutputSize)
|
2013-10-18 18:25:30 +00:00
|
|
|
{
|
2014-05-30 05:40:33 +00:00
|
|
|
CheckedInt<int> inputSizeChecked = aInputSize;
|
|
|
|
MOZ_ASSERT(inputSizeChecked.isValid());
|
|
|
|
CheckedInt<int> maxOutputSizeChecked = aMaxOutputSize;
|
|
|
|
MOZ_ASSERT(maxOutputSizeChecked.isValid());
|
|
|
|
return LZ4_compress_limitedOutput(aSource, aDest, inputSizeChecked.value(),
|
|
|
|
maxOutputSizeChecked.value());
|
2013-10-18 18:25:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2014-05-30 05:40:33 +00:00
|
|
|
LZ4::decompress(const char* aSource, char* aDest, size_t aOutputSize)
|
2013-10-18 18:25:30 +00:00
|
|
|
{
|
2014-05-30 05:40:33 +00:00
|
|
|
CheckedInt<int> outputSizeChecked = aOutputSize;
|
|
|
|
MOZ_ASSERT(outputSizeChecked.isValid());
|
|
|
|
int ret = LZ4_decompress_fast(aSource, aDest, outputSizeChecked.value());
|
|
|
|
return ret >= 0;
|
2013-10-18 18:25:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2014-05-30 05:40:33 +00:00
|
|
|
LZ4::decompress(const char* aSource, size_t aInputSize, char* aDest,
|
2014-07-11 02:10:17 +00:00
|
|
|
size_t aMaxOutputSize, size_t* aOutputSize)
|
2013-10-18 18:25:30 +00:00
|
|
|
{
|
2014-05-30 05:40:33 +00:00
|
|
|
CheckedInt<int> maxOutputSizeChecked = aMaxOutputSize;
|
|
|
|
MOZ_ASSERT(maxOutputSizeChecked.isValid());
|
|
|
|
CheckedInt<int> inputSizeChecked = aInputSize;
|
|
|
|
MOZ_ASSERT(inputSizeChecked.isValid());
|
|
|
|
|
|
|
|
int ret = LZ4_decompress_safe(aSource, aDest, inputSizeChecked.value(),
|
|
|
|
maxOutputSizeChecked.value());
|
|
|
|
if (ret >= 0) {
|
|
|
|
*aOutputSize = ret;
|
|
|
|
return true;
|
|
|
|
}
|
2013-10-18 18:25:30 +00:00
|
|
|
|
2014-05-30 05:40:33 +00:00
|
|
|
*aOutputSize = 0;
|
|
|
|
return false;
|
2013-10-18 18:25:30 +00:00
|
|
|
}
|
|
|
|
|