%%%------------------------------------------------------------------- %%% File : uudecode.erl %%% Author : Per Gustafsson %%% Description : %%% %%% Created : 1 Mar 2006 by Per Gustafsson %%%------------------------------------------------------------------- -module(uudecode). -export([test/1,main/1]). %%-------- Code for the benchmark ------------------------------- decode(<<"begin ", U, G, A, 32, Rest0/binary>>) -> %1 {Name,Rest1}=get_name(Rest0,[]), %2 {Name,get_binary(Rest1,[])}. %3 get_binary(<<" \nend">>,Acc) -> %4 list_to_binary(lists:reverse(Acc)); %5 get_binary(<>,Acc) -> %6 decode_line((N-32),Rest,Acc). %7 decode_line(Octets,Bin,Acc) -> %8 Bytes = ((Octets+2) div 3) * 4, %9 <> = Bin, %10 <>=decode_binary(Line), %11 get_binary(skip_to_newline(Rest),[BinRes|Acc]). %12 decode_binary(Bin) -> %13 << <<(X-32):6,(Y-32):6,(Z-32):6,(W-32):6>> || <> <= Bin>>.%14 skip_to_newline(<<"\n",Rest/binary>>) -> Rest; %15 skip_to_newline(<<_,Rest/binary>>) -> skip_to_newline(Rest). %16 get_name(<<" \n",Rest/binary>>, Acc) -> %17 {lists:reverse(Acc),Rest}; %18 get_name(<>, Acc) -> %19 get_name(Rest,[X|Acc]). %20 %%---------- Stuff for benchmarking --------------------------------- -define(ITER,100). iter(1,F) -> F(); iter(N,F) -> F(),iter(N-1,F). test([InName]) -> {ok,Bin}=file:read_file(InName), erlang:spawn_opt(?MODULE,main,[Bin],[{min_heap_size, 1000000}]). main(Bin) -> statistics(runtime), {Name,Res} = iter(?ITER, fun() -> decode(Bin) end), {_,X} = statistics(runtime), file:write_file(Name,Res), io:format("~.3f",[X/1000]), halt().