610e9bfd8c
upstream release, update local patches tha are going to be merged in the next release (fingers crossed) OBS-URL: https://build.opensuse.org/request/show/251480 OBS-URL: https://build.opensuse.org/package/show/filesystems/btrfsprogs?expand=0&rev=172
259 lines
6.8 KiB
Diff
259 lines
6.8 KiB
Diff
From a79f61440afaa0b77dc67c896fa3367a171c2306 Mon Sep 17 00:00:00 2001
|
|
From: Goffredo Baroncelli <kreijack@libero.it>
|
|
Date: Thu, 13 Feb 2014 20:19:21 +0100
|
|
Subject: [PATCH 23/42] btrfs-progs: Add helpers functions to handle the
|
|
printing of data in tabular format
|
|
|
|
This patch adds some functions to manage the printing of the data in
|
|
tabular format.
|
|
|
|
The function
|
|
struct string_table *table_create(int columns, int rows)
|
|
creates an (empty) table.
|
|
|
|
The functions
|
|
char *table_printf(struct string_table *tab, int column,
|
|
int row, char *fmt, ...)
|
|
char *table_vprintf(struct string_table *tab, int column,
|
|
int row, char *fmt, va_list ap)
|
|
populate the table with text. To align the text to the left, the text
|
|
shall be prefixed with '<', otherwise the text shall be prefixed by a
|
|
'>'. If the first character is a '=', the the text is replace by a
|
|
sequence of '=' to fill the column width.
|
|
|
|
The function
|
|
void table_free(struct string_table *)
|
|
frees all the data associated to the table.
|
|
|
|
The function
|
|
void table_dump(struct string_table *tab)
|
|
prints the table on stdout.
|
|
|
|
Signed-off-by: Goffredo Baroncelli <kreijack@inwind.it>
|
|
Signed-off-by: David Sterba <dsterba@suse.cz>
|
|
---
|
|
Makefile | 2 +-
|
|
string_table.c | 156 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
string_table.h | 36 +++++++++++++
|
|
3 files changed, 193 insertions(+), 1 deletion(-)
|
|
create mode 100644 string_table.c
|
|
create mode 100644 string_table.h
|
|
|
|
Index: btrfs-progs-v3.16/Makefile
|
|
===================================================================
|
|
--- btrfs-progs-v3.16.orig/Makefile
|
|
+++ btrfs-progs-v3.16/Makefile
|
|
@@ -10,7 +10,7 @@ objects = ctree.o disk-io.o radix-tree.o
|
|
root-tree.o dir-item.o file-item.o inode-item.o inode-map.o \
|
|
extent-cache.o extent_io.o volumes.o utils.o repair.o \
|
|
qgroup.o raid6.o free-space-cache.o list_sort.o props.o \
|
|
- ulist.o qgroup-verify.o
|
|
+ ulist.o qgroup-verify.o string-table.o
|
|
cmds_objects = cmds-subvolume.o cmds-filesystem.o cmds-device.o cmds-scrub.o \
|
|
cmds-inspect.o cmds-balance.o cmds-send.o cmds-receive.o \
|
|
cmds-quota.o cmds-qgroup.o cmds-replace.o cmds-check.o \
|
|
diff --git a/string-table.c b/string-table.c
|
|
new file mode 100644
|
|
index 000000000000..701f2147a3cc
|
|
--- /dev/null
|
|
+++ b/string-table.c
|
|
@@ -0,0 +1,156 @@
|
|
+/*
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public
|
|
+ * License v2 as published by the Free Software Foundation.
|
|
+ *
|
|
+ * 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; if not, write to the
|
|
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
+ * Boston, MA 021110-1307, USA.
|
|
+ */
|
|
+
|
|
+#include <stdlib.h>
|
|
+#include <string.h>
|
|
+#include <stdio.h>
|
|
+#include <stdarg.h>
|
|
+
|
|
+#include "string-table.h"
|
|
+
|
|
+/*
|
|
+ * This function create an array of char * which will represent a table
|
|
+ */
|
|
+struct string_table *table_create(int columns, int rows)
|
|
+{
|
|
+ struct string_table *p;
|
|
+ int size;
|
|
+
|
|
+ size = sizeof( struct string_table ) +
|
|
+ rows * columns* sizeof(char *);
|
|
+ p = calloc(1, size);
|
|
+
|
|
+ if (!p) return NULL;
|
|
+
|
|
+ p->ncols = columns;
|
|
+ p->nrows = rows;
|
|
+
|
|
+ return p;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * This function is like a vprintf, but store the results in a cell of
|
|
+ * the table.
|
|
+ * If fmt starts with '<', the text is left aligned; if fmt starts with
|
|
+ * '>' the text is right aligned. If fmt is equal to '=' the text will
|
|
+ * be replaced by a '=====' dimensioned on the basis of the column width
|
|
+ */
|
|
+char *table_vprintf(struct string_table *tab, int column, int row,
|
|
+ char *fmt, va_list ap)
|
|
+{
|
|
+ int idx = tab->ncols*row+column;
|
|
+ char *msg = calloc(100, sizeof(char));
|
|
+
|
|
+ if (!msg)
|
|
+ return NULL;
|
|
+
|
|
+ if (tab->cells[idx])
|
|
+ free(tab->cells[idx]);
|
|
+ tab->cells[idx] = msg;
|
|
+ vsnprintf(msg, 99, fmt, ap);
|
|
+
|
|
+ return msg;
|
|
+}
|
|
+
|
|
+
|
|
+/*
|
|
+ * This function is like a printf, but store the results in a cell of
|
|
+ * the table.
|
|
+ */
|
|
+char *table_printf(struct string_table *tab, int column, int row,
|
|
+ char *fmt, ...)
|
|
+{
|
|
+ va_list ap;
|
|
+ char *ret;
|
|
+
|
|
+ va_start(ap, fmt);
|
|
+ ret = table_vprintf(tab, column, row, fmt, ap);
|
|
+ va_end(ap);
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * This function dumps the table. Every "=" string will be replaced by
|
|
+ * a "=======" length as the column
|
|
+ */
|
|
+void table_dump(struct string_table *tab)
|
|
+{
|
|
+ int sizes[tab->ncols];
|
|
+ int i, j;
|
|
+
|
|
+ for (i = 0 ; i < tab->ncols ; i++) {
|
|
+ sizes[i] = 0;
|
|
+ for (j = 0 ; j < tab->nrows ; j++) {
|
|
+ int idx = i + j*tab->ncols;
|
|
+ int s;
|
|
+
|
|
+ if (!tab->cells[idx])
|
|
+ continue;
|
|
+
|
|
+ s = strlen(tab->cells[idx]) - 1;
|
|
+ if (s < 1 || tab->cells[idx][0] == '=')
|
|
+ continue;
|
|
+
|
|
+ if (s > sizes[i])
|
|
+ sizes[i] = s;
|
|
+ }
|
|
+ }
|
|
+
|
|
+
|
|
+ for (j = 0 ; j < tab->nrows ; j++) {
|
|
+ for (i = 0 ; i < tab->ncols ; i++) {
|
|
+
|
|
+ int idx = i + j*tab->ncols;
|
|
+ char *s = tab->cells[idx];
|
|
+
|
|
+ if (!s|| !strlen(s)) {
|
|
+ printf("%*s", sizes[i], "");
|
|
+ } else if (s && s[0] == '=') {
|
|
+ int k = sizes[i];
|
|
+ while(k--)
|
|
+ putchar('=');
|
|
+ } else {
|
|
+ printf("%*s",
|
|
+ s[0] == '<' ? -sizes[i] : sizes[i],
|
|
+ s+1);
|
|
+ }
|
|
+ if (i != (tab->ncols - 1))
|
|
+ putchar(' ');
|
|
+ }
|
|
+ putchar('\n');
|
|
+ }
|
|
+
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Deallocate a tabular and all its content
|
|
+ */
|
|
+
|
|
+void table_free(struct string_table *tab)
|
|
+{
|
|
+
|
|
+ int i, count;
|
|
+
|
|
+ count = tab->ncols * tab->nrows;
|
|
+
|
|
+ for (i=0 ; i < count ; i++)
|
|
+ if (tab->cells[i])
|
|
+ free(tab->cells[i]);
|
|
+
|
|
+ free(tab);
|
|
+
|
|
+}
|
|
diff --git a/string-table.h b/string-table.h
|
|
new file mode 100644
|
|
index 000000000000..83c4425d5f76
|
|
--- /dev/null
|
|
+++ b/string-table.h
|
|
@@ -0,0 +1,36 @@
|
|
+/*
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public
|
|
+ * License v2 as published by the Free Software Foundation.
|
|
+ *
|
|
+ * 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; if not, write to the
|
|
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
+ * Boston, MA 021110-1307, USA.
|
|
+ */
|
|
+
|
|
+#ifndef STRING_TABLE_H
|
|
+#define STRING_TABLE_H
|
|
+
|
|
+struct string_table {
|
|
+
|
|
+ int ncols, nrows;
|
|
+ char *cells[];
|
|
+
|
|
+};
|
|
+
|
|
+
|
|
+struct string_table *table_create(int columns, int rows);
|
|
+char *table_printf(struct string_table *tab, int column, int row,
|
|
+ char *fmt, ...);
|
|
+char *table_vprintf(struct string_table *tab, int column, int row,
|
|
+ char *fmt, va_list ap);
|
|
+void table_dump(struct string_table *tab);
|
|
+void table_free(struct string_table *);
|
|
+
|
|
+#endif
|