aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hardinfo/util.c10
-rw-r--r--includes/report.h2
-rw-r--r--shell/report.c70
3 files changed, 78 insertions, 4 deletions
diff --git a/hardinfo/util.c b/hardinfo/util.c
index 81b7e743..c58e2e1a 100644
--- a/hardinfo/util.c
+++ b/hardinfo/util.c
@@ -407,7 +407,7 @@ void parameters_init(int *argc, char ***argv, ProgramParameters * param)
.short_name = 'f',
.arg = G_OPTION_ARG_STRING,
.arg_data = &report_format,
- .description = N_("chooses a report format (text, html)")},
+ .description = N_("chooses a report format ([text], html)")},
{
.long_name = "run-benchmark",
.short_name = 'b',
@@ -496,8 +496,12 @@ void parameters_init(int *argc, char ***argv, ProgramParameters * param)
param->force_all_details = force_all_details;
param->argv0 = *(argv)[0];
- if (report_format && g_str_equal(report_format, "html"))
- param->report_format = REPORT_FORMAT_HTML;
+ if (report_format) {
+ if (g_str_equal(report_format, "html"))
+ param->report_format = REPORT_FORMAT_HTML;
+ if (g_str_equal(report_format, "shell"))
+ param->report_format = REPORT_FORMAT_SHELL;
+ }
/* html ok?
* gui: yes
diff --git a/includes/report.h b/includes/report.h
index 931a536e..1c1bd420 100644
--- a/includes/report.h
+++ b/includes/report.h
@@ -24,6 +24,7 @@
typedef enum {
REPORT_FORMAT_HTML,
REPORT_FORMAT_TEXT,
+ REPORT_FORMAT_SHELL,
N_REPORT_FORMAT
} ReportFormat;
@@ -81,6 +82,7 @@ void report_dialog_show();
ReportContext *report_context_html_new();
ReportContext *report_context_text_new();
+ReportContext *report_context_shell_new();
void report_header (ReportContext *ctx);
void report_footer (ReportContext *ctx);
diff --git a/shell/report.c b/shell/report.c
index 8a8f8c6b..924f2ec4 100644
--- a/shell/report.c
+++ b/shell/report.c
@@ -31,6 +31,7 @@ static void set_all_active(ReportDialog * rd, gboolean setting);
static FileTypes file_types[] = {
{"HTML (*.html)", "text/html", ".html", report_context_html_new},
{"Plain Text (*.txt)", "text/plain", ".txt", report_context_text_new},
+ {"Shell Dump (*.txt)", "text/plain", ".txt", report_context_shell_new},
{NULL, NULL, NULL, NULL}
};
@@ -237,12 +238,56 @@ void report_details(ReportContext *ctx, gchar *key, gchar *value, gboolean highl
report_details_end(ctx);
}
+static void report_table_shell_dump(ReportContext *ctx, gchar *key_file_str, int level)
+{
+ gchar *text, *p, *next_nl, *eq, *indent;
+ gchar *key, *value;
+
+ indent = g_strnfill(level * 4, ' ');
+
+ if (key_file_str) {
+ p = text = g_strdup(key_file_str);
+ while(next_nl = strchr(p, '\n')) {
+ *next_nl = 0;
+ eq = strchr(p, '=');
+ if (*p != '[' && eq) {
+ *eq = 0;
+ key = p; value = eq + 1;
+
+ ctx->output = h_strdup_cprintf("%s%s=%s\n", ctx->output, indent, key, value);
+ if (key_wants_details(key) || params.force_all_details) {
+ gchar *mi_tag = key_mi_tag(key);
+ gchar *mi_data = ctx->entry->morefunc(mi_tag); /*const*/
+
+ if (mi_data)
+ report_table_shell_dump(ctx, mi_data, level + 1);
+
+ g_free(mi_tag);
+ }
+
+ } else
+ ctx->output = h_strdup_cprintf("%s%s\n", ctx->output, indent, p);
+ p = next_nl + 1;
+ }
+ }
+ g_free(text);
+ g_free(indent);
+ return;
+}
+
void report_table(ReportContext * ctx, gchar * text)
{
- GKeyFile *key_file = g_key_file_new();
+ GKeyFile *key_file = NULL;
gchar **groups;
gint i;
+ if (ctx->format == REPORT_FORMAT_SHELL) {
+ report_table_shell_dump(ctx, text, 0);
+ return;
+ }
+
+ key_file = g_key_file_new();
+
/* make only "Value" column visible ("Key" column is always visible) */
ctx->columns = REPORT_COL_VALUE;
ctx->show_column_headers = FALSE;
@@ -683,6 +728,29 @@ ReportContext *report_context_text_new()
return ctx;
}
+ReportContext *report_context_shell_new()
+{
+ ReportContext *ctx;
+
+ ctx = g_new0(ReportContext, 1);
+ ctx->header = report_text_header;
+ ctx->footer = report_text_footer;
+
+ ctx->title = report_text_title;
+ ctx->subtitle = report_text_subtitle;
+ /* special format handled in report_table(),
+ * doesn't need the others. */
+
+ ctx->output = g_strdup("");
+ ctx->format = REPORT_FORMAT_SHELL;
+
+ ctx->column_titles = g_hash_table_new_full(g_str_hash, g_str_equal,
+ g_free, g_free);
+ ctx->first_table = TRUE;
+
+ return ctx;
+}
+
void report_context_free(ReportContext * ctx)
{
g_hash_table_destroy(ctx->column_titles);