mirror of
https://github.com/tsolomko/SWCompression.git
synced 2026-06-23 14:56:41 +00:00
Move tar long names parsing from entry to container
This commit is contained in:
+28
-10
@@ -45,6 +45,30 @@ public class TarContainer: Container {
|
||||
} else {
|
||||
pointerData.index -= 1024
|
||||
}
|
||||
pointerData.index += 156
|
||||
let fileTypeIndicator = String(Character(UnicodeScalar(pointerData.byte())))
|
||||
if fileTypeIndicator == "K" || fileTypeIndicator == "L" {
|
||||
pointerData.index -= 33
|
||||
|
||||
guard let octalSize = Int(try pointerData.nullSpaceEndedAsciiString(cutoff: 12))
|
||||
else { throw TarError.fieldIsNotNumber }
|
||||
let size = octalSize.octalToDecimal()
|
||||
pointerData.index += 376
|
||||
|
||||
let dataStartIndex = pointerData.index
|
||||
let longPath = try pointerData.nullEndedAsciiString(cutoff: size)
|
||||
|
||||
if fileTypeIndicator == "K" {
|
||||
longLinkName = longPath
|
||||
} else {
|
||||
longName = longPath
|
||||
}
|
||||
pointerData.index = dataStartIndex
|
||||
pointerData.index += size.roundTo512()
|
||||
continue
|
||||
}
|
||||
pointerData.index -= 157
|
||||
|
||||
let entry = try TarEntry(pointerData, lastGlobalExtendedHeader, lastLocalExtendedHeader,
|
||||
longName, longLinkName)
|
||||
switch entry.type {
|
||||
@@ -53,16 +77,10 @@ public class TarContainer: Container {
|
||||
case .localExtendedHeader:
|
||||
lastLocalExtendedHeader = String(data: entry.data(), encoding: .utf8)
|
||||
default:
|
||||
if entry.isLongName {
|
||||
longName = try DataWithPointer(data: entry.data()).nullEndedAsciiString(cutoff: entry.size)
|
||||
} else if entry.isLongLinkName {
|
||||
longLinkName = try DataWithPointer(data: entry.data()).nullEndedAsciiString(cutoff: entry.size)
|
||||
} else {
|
||||
output.append(entry)
|
||||
lastLocalExtendedHeader = nil
|
||||
longName = nil
|
||||
longLinkName = nil
|
||||
}
|
||||
output.append(entry)
|
||||
lastLocalExtendedHeader = nil
|
||||
longName = nil
|
||||
longLinkName = nil
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -165,9 +165,6 @@ public class TarEntry: ContainerEntry {
|
||||
|
||||
private let dataObject: Data
|
||||
|
||||
let isLongName: Bool
|
||||
let isLongLinkName: Bool
|
||||
|
||||
private let gnuLongName: String?
|
||||
private let gnuLongLinkName: String?
|
||||
|
||||
@@ -249,8 +246,6 @@ public class TarEntry: ContainerEntry {
|
||||
|
||||
// File type
|
||||
let fileTypeIndicator = String(Character(UnicodeScalar(pointerData.byte())))
|
||||
isLongLinkName = fileTypeIndicator == "K"
|
||||
isLongName = fileTypeIndicator == "L"
|
||||
let fileType = EntryType(rawValue: fileTypeIndicator) ?? .vendorUnknownOrReserved
|
||||
type = fileType
|
||||
switch fileType {
|
||||
@@ -432,9 +427,9 @@ extension DataWithPointer {
|
||||
|
||||
}
|
||||
|
||||
fileprivate extension Int {
|
||||
extension Int {
|
||||
|
||||
fileprivate func octalToDecimal() -> Int {
|
||||
func octalToDecimal() -> Int {
|
||||
var octal = self
|
||||
var decimal = 0, i = 0
|
||||
while octal != 0 {
|
||||
@@ -446,7 +441,7 @@ fileprivate extension Int {
|
||||
return decimal
|
||||
}
|
||||
|
||||
fileprivate func roundTo512() -> Int {
|
||||
func roundTo512() -> Int {
|
||||
let fractionNum = Double(self) / 512
|
||||
let roundedNum = Int(ceil(fractionNum))
|
||||
return roundedNum * 512
|
||||
|
||||
Reference in New Issue
Block a user