%%%------------------------------------------------------------------- %%% File : uuencode.erl %%% Author : Per Gustafsson %%% Description : %%% %%% Created : 10 Oct 2005 by Per Gustafsson %%%------------------------------------------------------------------- -module(uuencode). -include_lib("kernel/include/file.hrl"). -export([test/1,main/3]). %%-------- Code for the benchmark ------------------------------- encode_all(Input, Access, Bin) -> list_to_binary([prefix(Input,Access),encode(Bin,[]),suffix()]). prefix(Name, Access) -> <<_:7,U:3,G:3,A:3>> = <>, <<"begin ", (U+48), (G+48), (A+48), $ , (list_to_binary(Name))/binary, $ ,10>>. encode(<>,Acc) -> encode(Rest,[10,encode_aligned(Line),77|Acc]); encode(<>,Acc) -> encode_unaligned(Bin,Acc). encode_unaligned(Bin,Acc) -> Size = size(Bin), BigSize = (Size div 3) * 3, OutBin = case Bin of <> -> <<(Size+32),(encode_aligned(BigPart))/binary, 10>>; <> -> <<(Size+32),(encode_aligned(BigPart))/binary, (Bit1+32),(Bit2+2):4,0:4,$=,$=,10>>; <> -> <<(Size+32),(encode_aligned(BigPart))/binary, (Bit1+32),(Bit2+32),(Bit3+8):6,0:2,$=,10>> end, lists:reverse([OutBin|Acc]). encode_aligned(Bin) -> << <<(X+32),(Y+32),(Z+32),(W+32)>> || <> <= Bin>>. suffix() -> <<" \nend">>. %%---------- Stuff for benchmarking --------------------------------- -define(ITER,100). test([FileName]) -> {ok,Bin}=file:read_file(FileName), {ok,FileInfo} = file:read_file_info(FileName), erlang:spawn_opt(?MODULE,main,[Bin,FileInfo,FileName], [{min_heap_size, 8000000}]). iter(1,F) -> F(); iter(N,F) -> F(),iter(N-1,F). main(Bin,FileInfo,FileName) -> statistics(runtime), Res = iter(?ITER,fun() -> encode_all(FileName, FileInfo#file_info.mode, Bin) end), {_,X} = statistics(runtime), file:write_file(FileName++".uuenc.erlang",Res), io:format("~.3f", [X/1000]), halt().