[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH] pas-tar: ExtractString



+ pas-tar: Neue Funktion ExtractString, die die aktuelle Datei in einen String entpackt.
---
 trunk/src/modules/pas/lib/tar/tar.pas |   54 +++++++++++++++++++++++++++++++++
 1 files changed, 54 insertions(+), 0 deletions(-)

diff --git a/trunk/src/modules/pas/lib/tar/tar.pas b/trunk/src/modules/pas/lib/tar/tar.pas
index e673d53..149ffbb 100644
--- a/trunk/src/modules/pas/lib/tar/tar.pas
+++ b/trunk/src/modules/pas/lib/tar/tar.pas
@@ -16,6 +16,7 @@ type
         function HasNext: boolean;
         function NextFilename: String;
         function NextSize: dword;
+        function ExtractString(silent: boolean = false): String;
 
         procedure ExtractFile(var outfile: file);
         procedure SkipFile;
@@ -148,6 +149,59 @@ begin
     NextSize := OctalToInt(PTarFileHeader(@buffer)^.size);
 end;
 
+function TTarArchive.ExtractString(silent: boolean = false): string;
+var
+    filename: String;
+    size: dword;
+    i: dword;
+    buffer_pos: dword;
+    temp, target: String;
+begin
+    size := NextSize;
+    filename := NextFilename;
+
+    target := '';
+
+    if not silent then begin
+        Write('[', filename, '] Entpacken...');
+    end;
+    for i := 1 to size div TAR_BUFFER_SIZE do begin
+        buffer_pos := 0;
+        repeat
+            ReadNextBlock(buffer_pos);
+            Inc(buffer_pos, 512);
+        until buffer_pos = TAR_BUFFER_SIZE;
+
+        SetString(temp, PChar(@buffer), TAR_BUFFER_SIZE);
+        target := target + temp;
+        if not silent then begin
+            Write(#13, '[', filename, '] ', i * TAR_BUFFER_SIZE, '/', size, ' Bytes entpackt');
+        end;
+    end;
+
+    if (size mod TAR_BUFFER_SIZE) > 0 then begin
+        for i := 0 to ((size mod TAR_BUFFER_SIZE) div 512) do begin
+            ReadNextBlock(i * 512);
+        end;
+        SetString(temp, PChar(@buffer), size);
+        target := target + temp;
+    end;
+    if not silent then begin
+        WriteLn(#13, '[', filename, '] ', size, '/', size, ' Bytes entpackt');
+    end;
+
+    ReadNextBlock(0);
+
+    if not end_of_archive and BufferIsZero() then begin
+        ReadNextBlock(0);
+        if not end_of_archive and BufferIsZero() then begin
+            end_of_archive := true;
+        end;
+    end;
+
+    ExtractString := target;
+end;
+
 procedure TTarArchive.ExtractFile(var outfile: File);
 var
     filename: String;
-- 
1.5.6.3