endsrename.erl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
-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.