Files
golib/archive/compress/types.go
Salim Amine Bou Aram cd083bb53f Package archive/helper
- adding package to compress/uncompress with reader or writer
- refactor to allowing to use same source of io as result: io.reader or io.writer
- optimize code & buf to limit mem use
- rework variable to be thread safe

Package archive/compress
- add function DetectOnly to detect algo and return an updated reader but not the decompressor reader
- update function Detect to use DetectOnly to limit duplication code

Other
- bump dependencies
2024-11-27 17:23:14 +01:00

118 lines
2.5 KiB
Go

/*
* MIT License
*
* Copyright (c) 2020 Nicolas JUHEL
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
*/
package compress
import "bytes"
type Algorithm uint8
const (
None Algorithm = iota
Bzip2
Gzip
LZ4
XZ
)
func List() []Algorithm {
return []Algorithm{
None,
Bzip2,
Gzip,
LZ4,
XZ,
}
}
func ListString() []string {
var (
lst = List()
res = make([]string, len(lst))
)
for i := range lst {
res[i] = lst[i].String()
}
return res
}
func (a Algorithm) IsNone() bool {
return a == None
}
func (a Algorithm) String() string {
switch a {
case Gzip:
return "gzip"
case Bzip2:
return "bzip2"
case LZ4:
return "lz4"
case XZ:
return "xz"
default:
return "none"
}
}
func (a Algorithm) Extension() string {
switch a {
case Gzip:
return ".gz"
case Bzip2:
return ".bz2"
case LZ4:
return ".lz4"
case XZ:
return ".xz"
default:
return ""
}
}
func (a Algorithm) DetectHeader(h []byte) bool {
if len(h) < 6 {
return false
}
switch a {
case Gzip:
exp := []byte{31, 139}
return bytes.Equal(h[0:2], exp)
case Bzip2:
exp := []byte{'B', 'Z', 'h'}
return bytes.Equal(h[0:3], exp) && h[3] >= '0' && h[3] <= '9'
case LZ4:
exp := []byte{0x04, 0x22, 0x4D, 0x18}
return bytes.Equal(h[0:4], exp)
case XZ:
exp := []byte{0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00}
alt := []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}
return bytes.Equal(h[0:6], exp) || bytes.Equal(h[0:6], alt)
default:
return false
}
}