method print_stats fmt =
    Format.pp_set_formatter_tag_functions fmt Metrics_base.html_tag_functions;
    Format.pp_set_tags fmt true;
    let pr_hdr fmt hdr_name =
      Format.fprintf fmt "@{<th>%s@}" hdr_name in
    Datatype.String.Map.iter
      (fun filename func_tbl ->
        Metrics.result ~level:2 "%a" self#pp_file_metrics filename;
        if func_tbl <> Datatype.String.Map.empty then
          begin
            Format.fprintf fmt
              "@[<v 0>@{<h3>%s@}<br/>@ @{<table>@[<v 2>@ @[<v 2>@{<tbody>@ @{<tr>@[<v 2>@ %a@ %a@ %a@ %a@ %a@ %a@ %a@ %a@ %a@ @]@}@ %a@ @}@]@]@ @} @]@ "
              filename
              pr_hdr "Function" pr_hdr "#If stmts" pr_hdr "#Assignments"
              pr_hdr "#Loops" pr_hdr "#Calls" pr_hdr "#Gotos"
              pr_hdr "#Pointer dereferencing" pr_hdr "#Exits"
              pr_hdr "Cyclomatic value"
              (fun fmt fun_tbl ->
                Datatype.String.Map.iter
                  (fun _funcname func_metrics ->
                    Format.fprintf fmt "%a" pp_metrics_as_html_row func_metrics;
                  ) fun_tbl
              ) func_tbl;
          end
        else Metrics.warning "Filename <%s> has no functions@." filename
      ) metrics_map;