diff options
Diffstat (limited to 'erts/preloaded/src/prim_zip.erl')
-rw-r--r-- | erts/preloaded/src/prim_zip.erl | 57 |
1 files changed, 42 insertions, 15 deletions
diff --git a/erts/preloaded/src/prim_zip.erl b/erts/preloaded/src/prim_zip.erl index 17ef8c6c43..3f5a5b9721 100644 --- a/erts/preloaded/src/prim_zip.erl +++ b/erts/preloaded/src/prim_zip.erl @@ -1,19 +1,19 @@ %% %% %CopyrightBegin% -%% -%% Copyright Ericsson AB 2008-2009. All Rights Reserved. -%% +%% +%% Copyright Ericsson AB 2008-2010. All Rights Reserved. +%% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in %% compliance with the License. You should have received a copy of the %% Erlang Public License along with this software. If not, it can be %% retrieved online at http://www.erlang.org/. -%% +%% %% Software distributed under the License is distributed on an "AS IS" %% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See %% the License for the specific language governing rights and limitations %% under the License. -%% +%% %% %CopyrightEnd% %% @@ -94,12 +94,7 @@ do_foldl(FilterFun, FilterAcc, [PF | Tail], Acc0, PrimZip, PrimZipOrig) -> #primzip_file{name = F, get_info = GetInfo, get_bin = GetBin} = PF, case FilterFun({F, GetInfo, GetBin}, FilterAcc) of {Continue, Include, FilterAcc2} -> - Acc1 = - case Include of - false -> Acc0; - true -> [PF | Acc0]; - {true, Nick} -> [PF#primzip_file{name = Nick} | Acc0] - end, + Acc1 = include_acc(Include, PF, Acc0), case Continue of true -> do_foldl(FilterFun, FilterAcc2, Tail, Acc1, PrimZip, PrimZipOrig); @@ -112,6 +107,28 @@ do_foldl(FilterFun, FilterAcc, [PF | Tail], Acc0, PrimZip, PrimZipOrig) -> do_foldl(_FilterFun, FilterAcc, [], Acc, PrimZip, _PrimZipOrig) -> {ok, FilterAcc, PrimZip#primzip{files = reverse(Acc)}}. +include_acc(Include, PF, Acc) -> + case Include of + false -> + Acc; + true -> + [PF | Acc]; + {true, Nick} -> + [PF#primzip_file{name = Nick} | Acc]; + {true, Nick, GetInfo, GetBin} -> + PF2 = #primzip_file{name = Nick, get_info = GetInfo, get_bin = GetBin}, + [PF2 | Acc]; + List when is_list(List) -> + %% Add new entries + Fun = fun(I, A) -> include_acc(I, PF, A) end, + lists_foldl(Fun, Acc, List) + end. + +lists_foldl(F, Accu, [Hd|Tail]) -> + lists_foldl(F, F(Hd, Accu), Tail); +lists_foldl(F, Accu, []) when is_function(F, 2) -> + Accu. + %% close a zip archive close(#primzip{in = In0, input = Input, zlib = Z}) -> Input(close, In0), @@ -199,15 +216,25 @@ get_cd_loop(N, BCD, Acc0, PrimZip, FileName, Offset, CFH, EndOffset, FilterFun, end, %% erlang:display({FileName, N, Offset, Size, NextPF}), GetInfo = fun() -> cd_file_header_to_file_info(FileName, CFH, <<>>) end, - GetBin = fun() -> get_z_file(FileName, Offset, Size, PrimZip) end, + GetBin = fun() -> get_z_file(FileName, Offset, Size, PrimZip) end, PF = #primzip_file{name = FileName, get_info = GetInfo, get_bin = GetBin}, case FilterFun({FileName, GetInfo, GetBin}, FilterAcc) of {Continue, Include, FilterAcc2} -> Acc1 = case Include of - false -> Acc0; - true -> [PF | Acc0]; - {true, Nick} -> [PF#primzip_file{name = Nick} | Acc0] + false -> + Acc0; + true -> + [PF | Acc0]; + {true, Nick} -> + [PF#primzip_file{name = Nick} | Acc0]; + {true, Nick, GI, GB} -> + PF2 = #primzip_file{name = Nick, get_info = GI, get_bin = GB}, + [PF2 | Acc0]; + List when is_list(List) -> + %% Add new entries + Fun = fun(I, A) -> include_acc(I, PF, A) end, + lists_foldl(Fun, Acc0, List) end, case Continue of true when N > 1 -> |