aboutsummaryrefslogtreecommitdiffstats
path: root/lib/ic/src/icpreproc.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ic/src/icpreproc.erl')
-rw-r--r--lib/ic/src/icpreproc.erl111
1 files changed, 111 insertions, 0 deletions
diff --git a/lib/ic/src/icpreproc.erl b/lib/ic/src/icpreproc.erl
new file mode 100644
index 0000000000..0ed7813ebd
--- /dev/null
+++ b/lib/ic/src/icpreproc.erl
@@ -0,0 +1,111 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-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%
+%%
+%%
+-module(icpreproc).
+
+
+
+-export([preproc/2]).
+
+
+-import(lists, [filter/2]).
+
+
+%%----------------------------------------------------------------------
+%%----------------------------------------------------------------------
+
+
+preproc(G, File) ->
+ Cmd = ic_options:get_opt(G, preproc_cmd),
+ Flags = ic_options:get_opt(G, preproc_flags),
+
+
+ case Cmd of
+ "erl" ->
+ case ic_pp:run(File,Flags) of
+ {ok, [$#, $ , $1 | Rest], []} ->
+ [$#, $ , $1 | Rest];
+ {ok, [$#, $ , $1 | Rest], Warning} ->
+ print_warning(G,Warning),
+ [$#, $ , $1 | Rest];
+ {error,Error} ->
+ print_error(G,Error)
+ end;
+
+ _ ->
+ Line = Cmd++" "++Flags++" "++File,
+ % FIXME: Check status code of command instead of this test
+ case os:cmd(Line) of
+ [$#, $ , C | Rest] when is_integer(C), C > $0, C =< $9 ->
+ [$#, $ , C | Rest];
+ X ->
+ ic_error:fatal_error(G, {preproc, filter(X)})
+ end
+ end.
+
+
+filter(X) ->
+ X2 = divide_nl(X, []),
+ filter_x_switch(X2).
+
+
+divide_nl([10 | Xs], Out) ->
+ [lists:reverse(Out) | divide_nl(Xs, [])];
+divide_nl([X | Xs], Out) -> divide_nl(Xs, [X|Out]);
+divide_nl([], Out) -> lists:reverse(Out).
+
+
+filter_x_switch(L) ->
+ filter(fun([$g,$c,$c,$:,$ ,$W,$a,$r,$n,$i,$n,$g,$:,$ ,$`,$-,$x,$ | _]) ->
+ false;
+ (_) -> true end, L).
+
+
+print_error(_G,[]) ->
+ ok;
+print_error(G,[{File,Line,Text}]) ->
+ ErrorText = File++":"++integer_to_list(Line)++": "++Text,
+ ic_error:fatal_error(G, {ic_pp_error, ErrorText}),
+ ok;
+print_error(G,[{File,Line,Text}|T]) ->
+ ErrorText = File++":"++integer_to_list(Line)++": "++Text,
+ ic_error:error(G, {ic_pp_error, ErrorText}),
+ print_error(G,T);
+print_error(G,[H]) ->
+ ErrorText = H++"\n",
+ ic_error:fatal_error(G, {ic_pp_error, ErrorText}),
+ ok;
+print_error(G,[H|T]) ->
+ ErrorText = H++"\n",
+ ic_error:error(G, {ic_pp_error, ErrorText}),
+ print_error(G,T).
+
+
+print_warning(_G,[]) ->
+ ok;
+print_warning(G,[{File,Line,Text}|T]) ->
+ WarText = File++":"++integer_to_list(Line)++": "++Text,
+ ic_error:warn(G, {ic_pp_warning, WarText}),
+ print_warning(G,T);
+print_warning(G,[H|T]) ->
+ WarText = H++"\n",
+ ic_error:warn(G, {ic_pp_warning, WarText}),
+ print_warning(G,T).
+
+