1 #include "lz4.h"
2 
3 namespace Upp {
4 
5 void sCompressStreamCopy_(Stream& out, Stream& in, Gate<int64, int64> progress, Stream& orig_in, int64 insz);
6 
sLZ4Compress(Stream & out,Stream & in,int64 size,Gate<int64,int64> progress,bool co)7 static int64 sLZ4Compress(Stream& out, Stream& in, int64 size, Gate<int64, int64> progress, bool co)
8 {
9 	LZ4CompressStream outs(out);
10 	if(co)
11 		outs.Co();
12 	sCompressStreamCopy_(outs, in, progress, in, size);
13 	outs.Close();
14 	if(!out.IsError() && !outs.IsError())
15 		return out.GetSize();
16 	return -1;
17 }
18 
sLZ4Decompress(Stream & out,Stream & in,int64 size,Gate<int64,int64> progress,bool co)19 static int64 sLZ4Decompress(Stream& out, Stream& in, int64 size, Gate<int64, int64> progress, bool co)
20 {
21 	LZ4DecompressStream ins(in);
22 	if(co)
23 		ins.Co();
24 	sCompressStreamCopy_(out, ins, progress, in, size);
25 	ins.Close();
26 	if(!out.IsError() && !ins.IsError())
27 		return out.GetSize();
28 	return -1;
29 }
30 
LZ4Compress(Stream & out,Stream & in,Gate<int64,int64> progress)31 int64 LZ4Compress(Stream& out, Stream& in, Gate<int64, int64> progress)
32 {
33 	return sLZ4Compress(out, in, in.GetLeft(), progress, false);
34 }
35 
LZ4Decompress(Stream & out,Stream & in,Gate<int64,int64> progress)36 int64 LZ4Decompress(Stream& out, Stream& in, Gate<int64, int64> progress)
37 {
38 	return sLZ4Decompress(out, in, in.GetLeft(), progress, false);
39 }
40 
LZ4Compress(Stream & in,Gate<int64,int64> progress)41 String LZ4Compress(Stream& in, Gate<int64, int64> progress)
42 {
43 	StringStream out;
44 	return LZ4Compress(out, in, progress) < 0 ? String::GetVoid() : out.GetResult();
45 }
46 
LZ4Decompress(Stream & in,Gate<int64,int64> progress)47 String LZ4Decompress(Stream& in, Gate<int64, int64> progress)
48 {
49 	StringStream out;
50 	return LZ4Decompress(out, in, progress) < 0 ? String::GetVoid() : out.GetResult();
51 }
52 
LZ4Compress(const void * data,int64 len,Gate<int64,int64> progress)53 String LZ4Compress(const void *data, int64 len, Gate<int64, int64> progress)
54 {
55 	MemReadStream in(data, len);
56 	return LZ4Compress(in, progress);
57 }
58 
LZ4Compress(const String & s,Gate<int64,int64> progress)59 String LZ4Compress(const String& s, Gate<int64, int64> progress)
60 {
61 	return LZ4Compress(~s, s.GetLength(), progress);
62 }
63 
LZ4Decompress(const void * data,int64 len,Gate<int64,int64> progress)64 String LZ4Decompress(const void *data, int64 len, Gate<int64, int64> progress)
65 {
66 	MemReadStream in(data, len);
67 	return LZ4Decompress(in, progress);
68 }
69 
LZ4Decompress(const String & s,Gate<int64,int64> progress)70 String LZ4Decompress(const String& s, Gate<int64, int64> progress)
71 {
72 	return LZ4Decompress(~s, s.GetLength(), progress);
73 }
74 
CoLZ4Compress(Stream & out,Stream & in,Gate<int64,int64> progress)75 int64 CoLZ4Compress(Stream& out, Stream& in, Gate<int64, int64> progress)
76 {
77 	return sLZ4Compress(out, in, in.GetLeft(), progress, true);
78 }
79 
CoLZ4Decompress(Stream & out,Stream & in,Gate<int64,int64> progress)80 int64 CoLZ4Decompress(Stream& out, Stream& in, Gate<int64, int64> progress)
81 {
82 	return sLZ4Decompress(out, in, in.GetLeft(), progress, true);
83 }
84 
CoLZ4Compress(Stream & in,Gate<int64,int64> progress)85 String CoLZ4Compress(Stream& in, Gate<int64, int64> progress)
86 {
87 	StringStream out;
88 	return CoLZ4Compress(out, in, progress) < 0 ? String::GetVoid() : out.GetResult();
89 }
90 
CoLZ4Decompress(Stream & in,Gate<int64,int64> progress)91 String CoLZ4Decompress(Stream& in, Gate<int64, int64> progress)
92 {
93 	StringStream out;
94 	return CoLZ4Decompress(out, in, progress) < 0 ? String::GetVoid() : out.GetResult();
95 }
96 
CoLZ4Compress(const void * data,int64 len,Gate<int64,int64> progress)97 String CoLZ4Compress(const void *data, int64 len, Gate<int64, int64> progress)
98 {
99 	StringStream out;
100 	MemReadStream in(data, len);
101 	return CoLZ4Compress(out, in, progress) < 0 ? String::GetVoid() : out.GetResult();
102 }
103 
CoLZ4Compress(const String & s,Gate<int64,int64> progress)104 String CoLZ4Compress(const String& s, Gate<int64, int64> progress)
105 {
106 	return CoLZ4Compress(~s, s.GetLength(), progress);
107 }
108 
CoLZ4Decompress(const void * data,int64 len,Gate<int64,int64> progress)109 String CoLZ4Decompress(const void *data, int64 len, Gate<int64, int64> progress)
110 {
111 	StringStream out;
112 	MemReadStream in(data, len);
113 	return CoLZ4Decompress(out, in, progress) < 0 ? String::GetVoid() : out.GetResult();
114 }
115 
CoLZ4Decompress(const String & s,Gate<int64,int64> progress)116 String CoLZ4Decompress(const String& s, Gate<int64, int64> progress)
117 {
118 	return CoLZ4Decompress(~s, s.GetLength(), progress);
119 }
120 
121 };