-module(cc). -export([epp/1, epp/2, dbg/1, dbg/2, cvr/1, cvr/2]). -export([p/2, pp/2]). %% epp(Module) - Creates Module.epp which contains all forms of Module %% as obtained by using epp. %% %% dbg(Module) - Creates Module.dbg which contains all forms of Module %% as obtained by using beam_lib:chunks/2. %% %% cvr(Module) - Creates Module.cvr which contains all forms of Module %% as obtained by using cover:transform/3. %% epp(Module) -> epp(Module, p). epp(Module, P) -> File = atom_to_list(Module)++".erl", {ok,Cwd} = file:get_cwd(), {ok, Fd1} = epp:open(File, [Cwd], []), {ok, Fd2} = file:open(atom_to_list(Module)++".epp", write), epp(Fd1, Fd2, P), epp:close(Fd1), file:close(Fd2), ok. epp(Fd1, Fd2, P) -> case epp:parse_erl_form(Fd1) of {ok, {attribute,Line,Attr,Data}} -> epp(Fd1, Fd2, P); {ok, Form} when P==p -> io:format(Fd2, "~p.~n", [Form]), epp(Fd1, Fd2, P); {ok, Form} when P==pp -> io:format(Fd2, "~p.~n", [erl_pp:form(Form)]), epp(Fd1, Fd2, P); {eof, Line} -> ok end. cvr(Module) -> cvr(Module, p). cvr(Module, P) -> case beam_lib:chunks(Module, [abstract_code]) of {ok, {Module, [{abstract_code, no_abstract_code}]}} -> {error, {no_debug_info,Module}}; {ok, {Module, [{abstract_code, {Vsn, Forms}}]}} -> Vars = {vars,Module,Vsn, [], undefined, undefined, undefined, undefined, undefined, undefined, false}, {ok, TForms, _Vars2} = cover:transform(Forms, [], Vars), File = atom_to_list(Module)++".cvr", apply(?MODULE, P, [File, TForms]); Error -> Error end. dbg(Module) -> dbg(Module, p). dbg(Module, P) -> case beam_lib:chunks(Module, [abstract_code]) of {ok, {Module, [{abstract_code, no_abstract_code}]}} -> {error, {no_debug_info,Module}}; {ok, {Module, [{abstract_code, {Vsn, Forms}}]}} -> File = atom_to_list(Module)++".dbg", apply(?MODULE, P, [File, Forms]); Error -> Error end. p(File, Forms) -> {ok, Fd} = file:open(File, write), lists:foreach(fun(Form) -> io:format(Fd, "~p.~n", [Form]) end, Forms), file:close(Fd). pp(File, Forms) -> {ok, Fd} = file:open(File, write), lists:foreach(fun(Form) -> io:format(Fd, "~s", [erl_pp:form(Form)]) end, Forms), file:close(Fd).