/* 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 * 2012.10 */ #ifndef _REPORT_MAKER_H_ #define _REPORT_MAKER_H_ /* This report generator implements the following document structure: * body * \---> section * |---> header * |---> paragraph * \---> table * \---> table row * \---> table cell * * The report body consists of a number of sections (a.k.a.
s, * a.k.a. tabs). * Each section can contain headers (

,

,

), paragraphs (

) * and tables (). * * A header is a single line of text. * * Paragraphs can contain only text. * * A table consists of table rows. A table row consists of table cells. * A table cell can contain only text. * * Each section, table, row or cell could have its own formatting. * To distinguish elements from others of its type, each element could have * an unique identifier (see enums section_type, table_type, row_type and * cell_type below). These identifiers are used in formatter implementations * to produce special formatting. * * Example of usage: * report_maker report(REPORT_OFF); * * report.set_type(REPORT_HTML); * report.begin_section(); * report.add_header("Big report"); * report.begin_paragraph("Some text"); * report.begin_table(); * report.begin_row(); * report.begin_cell(); * report.add("Something"); * report.begin_cell(CELL_SPECIAL); * report.add("Foo bar"); * report.finish_report(); * const char *result = report.get_result(); */ #include #include /* Conditional gettext. We need original strings for CSV. */ #define __(STRING) \ ((report.get_type() == REPORT_CSV) ? (STRING) : gettext(STRING)) #ifndef UNUSED #define UNUSED __attribute__((unused)) #endif /* UNUSED */ /* ************************************************************************ */ enum report_type { REPORT_OFF, REPORT_HTML, REPORT_CSV }; /* ************************************************************************ */ enum section_type { SECTION_DEFAULT, SECTION_SYSINFO, SECTION_CPUIDLE, SECTION_CPUFREQ, SECTION_DEVPOWER, SECTION_SOFTWARE, SECTION_SUMMARY, SECTION_TUNING, SECTION_MAX /* Must be last in this enum */ }; /* ************************************************************************ */ enum table_type { TABLE_DEFAULT, TABLE_WIDE, TABLE_MAX /* Must be last in this enum */ }; /* ************************************************************************ */ enum row_type { ROW_DEFAULT, ROW_SYSINFO, ROW_DEVPOWER, ROW_SOFTWARE, ROW_SUMMARY, ROW_TUNABLE, ROW_TUNABLE_BAD, ROW_MAX /* Must be last in this enum */ }; /* ************************************************************************ */ enum cell_type { CELL_DEFAULT, CELL_SYSINFO, CELL_FIRST_PACKAGE_HEADER, CELL_EMPTY_PACKAGE_HEADER, CELL_CORE_HEADER, CELL_CPU_CSTATE_HEADER, CELL_CPU_PSTATE_HEADER, CELL_STATE_NAME, CELL_EMPTY_PACKAGE_STATE, CELL_PACKAGE_STATE_VALUE, CELL_CORE_STATE_VALUE, CELL_CPU_STATE_VALUE, CELL_SEPARATOR, CELL_DEVPOWER_HEADER, CELL_DEVPOWER_DEV_NAME, CELL_DEVPOWER_POWER, CELL_DEVPOWER_UTIL, CELL_DEVACTIVITY_PROCESS, CELL_DEVACTIVITY_DEVICE, CELL_SOFTWARE_HEADER, CELL_SOFTWARE_PROCESS, CELL_SOFTWARE_DESCRIPTION, CELL_SOFTWARE_POWER, CELL_SUMMARY_HEADER, CELL_SUMMARY_CATEGORY, CELL_SUMMARY_DESCRIPTION, CELL_SUMMARY_ITEM, CELL_TUNABLE_HEADER, CELL_UNTUNABLE_HEADER, CELL_MAX /* Must be last in this enum */ }; /* ************************************************************************ */ class report_formatter; class report_maker { public: report_maker(report_type t); ~report_maker(); report_type get_type(); void set_type(report_type t); void addf(const char *fmt, ...) __attribute__ ((format (printf, 2, 3))); void finish_report(); const char *get_result(); void clear_result(); void add(const char *str); void add_header(const char *header, int level = 2); void begin_section(section_type stype = SECTION_DEFAULT); void begin_table(table_type ttype = TABLE_DEFAULT); void begin_row(row_type rtype = ROW_DEFAULT); void begin_cell(cell_type ctype = CELL_DEFAULT); void add_empty_cell(); void begin_paragraph(); void set_cpu_number(int nr); private: void setup_report_formatter(); void end_section(); void end_table(); void end_row(); void end_cell(); void end_paragraph(); report_type type; report_formatter *formatter; bool cell_opened, row_opened, table_opened, section_opened, paragraph_opened; }; #endif /* _REPORT_MAKER_H_ */