From 97c75543c8dcfa3f0fe8fdf30bf07d2a002edf29 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Fri, 30 Jun 2017 23:37:49 +0300 Subject: [PATCH] Extracted code for processing one stream, added multiUnarchive function to XZ. --- Sources/XZArchive.swift | 70 ++++++++++++++++++++++++++--------------- 1 file changed, 44 insertions(+), 26 deletions(-) diff --git a/Sources/XZArchive.swift b/Sources/XZArchive.swift index c6dc2a80..86f3f40d 100644 --- a/Sources/XZArchive.swift +++ b/Sources/XZArchive.swift @@ -67,7 +67,6 @@ public class XZArchive: Archive { public static func unarchive(archive data: Data) throws -> Data { /// Object with input data which supports convenient work with bit shifts. var pointerData = DataWithPointer(data: data, bitOrder: .reversed) - var out: [UInt8] = [] // First, we should check footer magic bytes. // If they are wrong, then file cannot be 'undamaged'. @@ -94,6 +93,50 @@ public class XZArchive: Archive { pointerData.index = 0 // streamLoop: while !pointerData.isAtTheEnd { + return try processStream(&pointerData) + +// guard !pointerData.isAtTheEnd else { break streamLoop } +// +// // STREAM PADDING +// paddingBytes = 0 +// while true { +// let byte = pointerData.alignedByte() +// if byte != 0 { +// if paddingBytes % 4 != 0 { +// throw XZError.wrongPadding +// } else { +// break +// } +// } +// if pointerData.isAtTheEnd { +// if byte != 0 || paddingBytes % 4 != 3 { +// throw XZError.wrongPadding +// } else { +// break streamLoop +// } +// } +// paddingBytes += 1 +// } +// pointerData.index -= 1 +// } + + } + + public static func multiUnarchive(archive data: Data) throws -> [Data] { + /// Object with input data which supports convenient work with bit shifts. + var pointerData = DataWithPointer(data: data, bitOrder: .reversed) + + var result = [Data]() + while !pointerData.isAtTheEnd { + result.append(try processStream(&pointerData)) + } + + return result + } + + private static func processStream(_ pointerData: inout DataWithPointer) throws -> Data { + var out: [UInt8] = [] + // STREAM HEADER let streamHeader = try processStreamHeader(&pointerData) @@ -136,31 +179,6 @@ public class XZArchive: Archive { // STREAM FOOTER try processFooter(streamHeader, indexSize, &pointerData) -// guard !pointerData.isAtTheEnd else { break streamLoop } -// -// // STREAM PADDING -// paddingBytes = 0 -// while true { -// let byte = pointerData.alignedByte() -// if byte != 0 { -// if paddingBytes % 4 != 0 { -// throw XZError.wrongPadding -// } else { -// break -// } -// } -// if pointerData.isAtTheEnd { -// if byte != 0 || paddingBytes % 4 != 3 { -// throw XZError.wrongPadding -// } else { -// break streamLoop -// } -// } -// paddingBytes += 1 -// } -// pointerData.index -= 1 -// } - return Data(bytes: out) }