blob: 59e83d9eb117e19fc78be2dfc55016e23066280c [file] [log] [blame]
/* Copyright (c) 2012 Samsung Electronics Co., Ltd.
* http://www.samsung.com/
*
* This file is part of PowerTOP
*
* This program file is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program in a file named COPYING; if not, write to the
* Free Software Foundation, Inc,
* 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA
* or just google for it.
*
* Generic report generator.
* Written by Igor Zhbanov <i.zhbanov@samsung.com>
* 2012.10 */
/* Uncomment to disable asserts */
/*#define NDEBUG*/
#include <assert.h>
#include <stdarg.h>
#include "report-maker.h"
#include "report-formatter-csv.h"
#include "report-formatter-html.h"
/* ************************************************************************ */
report_maker::report_maker(report_type t)
{
type = t;
formatter = NULL;
setup_report_formatter();
clear_result(); /* To reset state and add document header */
}
/* ************************************************************************ */
report_maker::~report_maker()
{
if (formatter)
delete formatter;
}
/* ************************************************************************ */
void
report_maker::finish_report()
{
if (section_opened)
end_section();
formatter->finish_report();
}
/* ************************************************************************ */
const char *
report_maker::get_result()
{
return formatter->get_result();
}
/* ************************************************************************ */
void
report_maker::clear_result()
{
formatter->clear_result();
section_opened = false;
table_opened = false;
cell_opened = false;
row_opened = false;
paragraph_opened = false;
}
/* ************************************************************************ */
report_type
report_maker::get_type()
{
return type;
}
/* ************************************************************************ */
void
report_maker::set_type(report_type t)
{
clear_result();
type = t;
setup_report_formatter();
}
/* ************************************************************************ */
void
report_maker::setup_report_formatter()
{
if (formatter)
delete formatter;
if (type == REPORT_HTML)
formatter = new report_formatter_html();
else if (type == REPORT_CSV)
formatter = new report_formatter_csv();
else if (type == REPORT_OFF)
formatter = new report_formatter();
else
assert(false);
}
/* ************************************************************************ */
void
report_maker::add(const char *str)
{
assert(str);
assert(section_opened);
formatter->add(str);
}
/* ************************************************************************ */
void
report_maker::addf(const char *fmt, ...)
{
va_list ap;
assert(fmt);
assert(section_opened);
va_start(ap, fmt);
formatter->addv(fmt, ap);
va_end(ap);
}
/* ************************************************************************ */
void
report_maker::add_header(const char *header, int level)
{
assert(header);
assert(section_opened);
assert(level > 0 && level < 4);
if (table_opened)
end_table();
else if (paragraph_opened)
end_paragraph();
formatter->add_header(header, level);
}
/* ************************************************************************ */
void
report_maker::begin_section(section_type stype)
{
assert(stype >= 0 && stype < SECTION_MAX);
if (section_opened)
end_section(); /* Close previous */
section_opened = true;
formatter->begin_section(stype);
}
/* ************************************************************************ */
void
report_maker::end_section()
{
assert(section_opened);
if (table_opened)
end_table();
else if (paragraph_opened)
end_paragraph();
section_opened = false;
formatter->end_section();
}
/* ************************************************************************ */
void
report_maker::begin_table(table_type ttype)
{
assert(ttype >= 0 && ttype < TABLE_MAX);
assert(section_opened);
if (table_opened)
end_table(); /* Close previous */
else if (paragraph_opened)
end_paragraph();
table_opened = true;
formatter->begin_table(ttype);
}
/* ************************************************************************ */
void
report_maker::end_table()
{
assert(section_opened);
assert(table_opened);
if (row_opened)
end_row();
table_opened = false;
formatter->end_table();
}
/* ************************************************************************ */
void
report_maker::begin_row(row_type rtype)
{
assert(section_opened);
assert(table_opened);
assert(rtype >= 0 && rtype < ROW_MAX);
if (row_opened)
end_row(); /* Close previous */
row_opened = true;
formatter->begin_row(rtype);
}
/* ************************************************************************ */
void
report_maker::end_row()
{
assert(section_opened);
assert(table_opened);
assert(row_opened);
if (cell_opened)
end_cell();
row_opened = false;
formatter->end_row();
}
/* ************************************************************************ */
void
report_maker::begin_cell(cell_type ctype)
{
assert(section_opened);
assert(table_opened);
assert(row_opened);
assert(ctype >= 0 && ctype < CELL_MAX);
if (cell_opened)
end_cell(); /* Close previous */
cell_opened = true;
formatter->begin_cell(ctype);
}
/* ************************************************************************ */
void
report_maker::end_cell()
{
assert(section_opened);
assert(table_opened);
assert(row_opened);
assert(cell_opened);
cell_opened = false;
formatter->end_cell();
}
/* ************************************************************************ */
void
report_maker::add_empty_cell()
{
formatter->add_empty_cell();
}
/* ************************************************************************ */
void
report_maker::set_cpu_number(int nr)
{
formatter->set_cpu_number(nr);
}
/* ************************************************************************ */
void
report_maker::begin_paragraph()
{
assert(section_opened);
if (table_opened)
end_table();
else if (paragraph_opened)
end_paragraph(); /* Close previous */
paragraph_opened = true;
formatter->begin_paragraph();
}
/* ************************************************************************ */
void
report_maker::end_paragraph()
{
assert(paragraph_opened);
paragraph_opened = false;
formatter->end_paragraph();
}