-module(endsrename).
-author('Eduard Bondarenko <edbond@gmail.com>').
-compile(export_all).
cleanup_title(C,A) when (C>64) and (C<123) -> A++[C];
cleanup_title(C,A) when (C>47) and (C<58) -> A++[C];
cleanup_title(_C, A) ->
%% squeeze
L=lists:last(A),
case L of
$_ -> A;
_ -> A++[$_]
end.
matches(Romname, Save) ->
Regexp = ".*"++string:to_lower(Romname)++".*",
case regexp:first_match(Save, Regexp) of
{match, _Start, _Length} -> true;
_ -> false
end.
rename_save(Romname, CleanRomname) ->
Saves = lists:map(fun(F) -> string:to_lower(filename:basename(F)) end, filelib:wildcard("../SAVE/*.*")),
%% find savename that matches original romname
Savename = lists:filter(fun(S) -> matches(Romname, S) end, Saves),
case length(Savename) of
0 -> Cmd = void;
_ -> Cmd = "mv '../SAVE/"++hd(Savename)++"' '../SAVE/"++CleanRomname++".sav'"
end,
Cmd.
rename_rom(Filename) ->
Romname = filename:rootname(Filename),
{ok, FH}=file:open(Filename, [read,binary]),
{ok, <<Offset:32/little>>}=file:pread(FH, 16#68, 4),
{ok, <<UCSTitle/binary>>}=file:pread(FH, Offset+4+28+512+32+256, 256),
Title = lists:filter(fun(X) -> X /= 0 end, binary_to_list(UCSTitle)),
CleanRomname = lists:foldl(fun(X, A) -> cleanup_title(X,A) end, [], Title),
if Romname /= CleanRomname ->
Cmd = "mv '"++Romname++".nds' '"++CleanRomname++".nds'",
SaveCmd = rename_save(Romname,CleanRomname);
true ->
Cmd = void,
SaveCmd = void
end,
[Cmd, SaveCmd].
output(void) -> true;
output(Cmd) -> io:format("~s~n", [Cmd]).
init() ->
Roms = filelib:wildcard("*.nds"),
%% TODO: spawn process for each file?
Cmds = lists:flatmap(fun(X) -> rename_rom(X) end, Roms),
%% output
lists:map(fun(C) -> output(C) end, Cmds),
halt().
Refactorings
No refactoring yet !
Nintendo DS roms and saves rename utility.
I hope someone give general erlang ideas about code. I'm a new erlanger.
Best regards.