diff options
Diffstat (limited to 'lib/wx/api_gen/gen_util.erl')
-rw-r--r-- | lib/wx/api_gen/gen_util.erl | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/lib/wx/api_gen/gen_util.erl b/lib/wx/api_gen/gen_util.erl new file mode 100644 index 0000000000..d47fd579a5 --- /dev/null +++ b/lib/wx/api_gen/gen_util.erl @@ -0,0 +1,246 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%% Some utilities + +-module(gen_util). +-compile(export_all). + +lowercase([F|R]) when F >= $A, F =< $Z -> [F+($a-$A)|R]; +lowercase(Str) when is_list(Str) -> Str. + +lowercase_all([F|R]) when F >= $A, F =< $Z -> [F+($a-$A)|lowercase_all(R)]; +lowercase_all([F|R]) -> [F|lowercase_all(R)]; +lowercase_all([]) -> []. + +uppercase([F|R]) when F >= $a, F =< $z -> [F+($A-$a)|R]; +uppercase(Str) when is_list(Str) -> Str. + +uppercase_all([F|R]) when F >= $a, F =< $z -> [F+($A-$a)|uppercase_all(R)]; +uppercase_all([A|R]) -> [A|uppercase_all(R)]; +uppercase_all([]) -> []. + + +strip_name([H|R1],[H|R2]) -> + strip_name(R1,R2); +strip_name(String,[]) -> String. + +open_write(File) -> + %% io:format("Generating ~s~n",[File]), + {ok, Fd} = file:open(File++".temp", [write]), + put(current_file, {Fd,File}). + + +close() -> + case get(current_file) of + undefined -> + ok; + {closed, File} -> + io:format("Closing twice ~s~n",[File]); + {Fd,File} -> + file:close(Fd), + case os:cmd("diff " ++ File ++ " " ++ File ++ ".temp" ++ "| head -30") of + [] -> + ok = file:delete(File ++ ".temp"), + %% So that make understands that we have made this + case os:getenv("CLEARCASE_ROOT") of + false -> os:cmd("touch " ++ File); + _ -> ignore + end, + ok; + Diff -> + case check_diff(Diff) of + copyright -> %% We ignore copyright changes only + ok = file:delete(File ++ ".temp"); + _ -> + io:format("Diff in ~s~n~s ~n", [File, Diff]), + case file:rename(File ++ ".temp", File) of + ok -> ok; + _ -> + io:format("***** Failed to save file ~p ~n",[File]) + end + end + end, + put(current_file, {closed, File}) + end. + + +check_diff(Diff) -> + try + [_,D1,_,D2|Tail] = re:split(Diff, "\n"), + case Tail of + [] -> ok; + [<<>>] -> ok; + _ -> throw(diff) + end, + <<_, _, "%% Copyright", _/binary>> = D1, + <<_, _, "%% Copyright", _/binary>> = D2, + copyright + catch + throw:_ -> diff; + error:{badmatch,_} -> + diff; + _:What -> + io:format("~p:~p: ~p ~p~n", [?MODULE,?LINE, What, erlang:get_stacktrace()]), + diff + end. + +w(Str) -> + w(Str, []). +w(Str,Args) -> + {Fd,_} = get(current_file), + io:format(Fd, Str, Args). + +args(Fun, Limit, List) -> + args(Fun, Limit, List, infinity, 0). + +args(Fun, Limit, List, Max) -> + args(Fun, Limit, List, Max, 0). + +args(_Fun, _Limit, [], _Max, _) -> ""; %% No args +args(Fun, _Limit, [Last], _Max, _Pos) -> + case Fun(Last) of + skip -> ""; %% FIXME bug if last skips + Str -> Str + end; +args(Fun, Limit, [H|R], Max, Pos) -> + case Fun(H) of + skip -> args(Fun,Limit,R, Max, Pos); + Str -> + {NL, NewPos} = + case length(Str) + Pos of + Curr when Curr > Max -> + {"\n ", 0}; + Curr -> + {"", Curr} + end, + case args(Fun,Limit,R, Max, NewPos) of + "" -> Str; + End -> Str ++ Limit ++ NL ++ End + end + end. + + + + +tokens(S) -> + tokens1(S, " \t\r\n(){}*;,@", []). +tokens(S,Seps) -> + tokens1(S, Seps, []). + +tokens1([C|S], Seps, Toks) -> + case lists:member(C, Seps) of + true -> tokens1(S, Seps, [C|Toks]); + false -> tokens2(S, Seps, Toks, [C]) + end; +tokens1([], _Seps, Toks) -> + replace_and_remove(Toks, []). + +tokens2([C|S], Seps, Toks, Cs) -> + case lists:member(C, Seps) of + true -> tokens1(S, Seps, [C, lists:reverse(Cs) |Toks]); + false -> tokens2(S, Seps, Toks, [C|Cs]) + end; +tokens2([], _Seps, Toks, Cs) -> + replace_and_remove([lists:reverse(Cs)|Toks], []). + +replace_and_remove([E|R], Acc) when is_list(E) -> %% Keep everything that is a word + replace_and_remove(R, [E|Acc]); +replace_and_remove([$\n | R], Acc) -> %% It is semi line oriented so keep eol + replace_and_remove(R, [eol|Acc]); +replace_and_remove([$( | R], Acc) -> + replace_and_remove(R, ["("|Acc]); +replace_and_remove([$) | R], Acc) -> + replace_and_remove(R, [")"|Acc]); +replace_and_remove([${ | R], Acc) -> + replace_and_remove(R, ["{"|Acc]); +replace_and_remove([$} | R], Acc) -> + replace_and_remove(R, ["}"|Acc]); +replace_and_remove([$| | R], Acc) -> + replace_and_remove(R, ["|"|Acc]); +replace_and_remove([$* | R], Acc) -> + replace_and_remove(R, ["*"|Acc]); +replace_and_remove([$& | R], Acc) -> + replace_and_remove(R, [$&|Acc]); +replace_and_remove([$<,$< | R], Acc) -> + replace_and_remove(R, ["<<"|Acc]); +replace_and_remove([$, | R], Acc) -> + replace_and_remove(R, [cont|Acc]); +replace_and_remove([$; | R], Acc) -> + replace_and_remove(R, [eoe|Acc]); +replace_and_remove([$@ | R], Acc) -> + replace_and_remove(R, [directive|Acc]); + +replace_and_remove([_E|R], Acc) -> %% Ignore everthing else + replace_and_remove(R, Acc); +replace_and_remove([], Acc) -> + Acc. + +halt(Reason) -> + case process_info(group_leader(), status) of + {_,waiting} -> + %% Now all output data is down in the driver. + %% Give the driver some extra time before halting. + receive after 10 -> ok end, + erlang:halt(Reason); + _ -> + %% Probably still processing I/O requests. + receive after 20 -> ok end, + gen_util:halt(Reason) + end. + +erl_copyright() -> + w("%%~n",[]), + w("%% %CopyrightBegin%~n",[]), + w("%% ~n",[]), + w("%% Copyright Ericsson AB 2008-2009. All Rights Reserved.~n",[]), + w("%% ~n",[]), + w("%% The contents of this file are subject to the Erlang Public License,~n",[]), + w("%% Version 1.1, (the \"License\"); you may not use this file except in~n",[]), + w("%% compliance with the License. You should have received a copy of the~n",[]), + w("%% Erlang Public License along with this software. If not, it can be~n",[]), + w("%% retrieved online at http://www.erlang.org/.~n",[]), + w("%% ~n",[]), + w("%% Software distributed under the License is distributed on an \"AS IS\"~n",[]), + w("%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See~n",[]), + w("%% the License for the specific language governing rights and limitations~n",[]), + w("%% under the License.~n",[]), + w("%% ~n",[]), + w("%% %CopyrightEnd%~n",[]). + +c_copyright() -> + w("/*~n",[]), + w(" * %CopyrightBegin%~n",[]), + w(" * ~n",[]), + w(" * Copyright Ericsson AB 2008-2009. All Rights Reserved.~n",[]), + w(" * ~n",[]), + w(" * The contents of this file are subject to the Erlang Public License,~n",[]), + w(" * Version 1.1, (the \"License\"); you may not use this file except in~n",[]), + w(" * compliance with the License. You should have received a copy of the~n",[]), + w(" * Erlang Public License along with this software. If not, it can be~n",[]), + w(" * retrieved online at http://www.erlang.org/.~n",[]), + w(" * ~n",[]), + w(" * Software distributed under the License is distributed on an \"AS IS\"~n",[]), + w(" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See~n",[]), + w(" * the License for the specific language governing rights and limitations~n",[]), + w(" * under the License.~n",[]), + w(" * ~n",[]), + w(" * %CopyrightEnd% ~n",[]), + w("*/~n",[]). + + |