#!/usr/bin/env escript
% vim:ft=erlang:
%-
% Copyright (c) 2012-2014 Yakaz
% Copyright (c) 2016 Jean-Sébastien Pédron <jean-sebastien.pedron@dumbbell.fr>
% All rights reserved.
%
% Redistribution and use in source and binary forms, with or without
% modification, are permitted provided that the following conditions
% are met:
% 1. Redistributions of source code must retain the above copyright
%    notice, this list of conditions and the following disclaimer.
% 2. Redistributions in binary form must reproduce the above copyright
%    notice, this list of conditions and the following disclaimer in the
%    documentation and/or other materials provided with the distribution.
%
% THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
% ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
% ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
% FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
% OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
% HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
% LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
% OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
% SUCH DAMAGE.

main([Input, Count_S]) ->
    Count = list_to_integer(Count_S),
    {ok, Content} = file:read_file(Input),
    %% Build mochijson2.
    Mochi = filename:join([filename:dirname(Input), "mochijson2.erl"]),
    {ok, Module, Binary} = compile:file(Mochi, [binary, debug_info]),
    {module, _} = code:load_binary(Module, Mochi, Binary),
    T0 = erlang:now(),
    loop(Content, Count),
    T1 = erlang:now(),
    print_result(Count, T0, T1).

loop(Content, Count) when Count >= 1 ->
    mochijson2:decode(Content),
    loop(Content, Count - 1);
loop(_, 0) ->
    ok.

print_result(Count, T0, T1) when Count > 0 ->
    Diff = timer:now_diff(T1, T0),
    io:format("  mochijson2:       ~8.2f us~n", [Diff / Count]);
print_result(_, _, _) ->
    io:format("  mochijson2:            n/a~n", []).
