From 485680a5bfeb952fd652a59efcce35636d6aec00 Mon Sep 17 00:00:00 2001 From: Jeremy Kerr Date: Tue, 10 Dec 2013 14:12:48 +0800 Subject: lib/fold: Add text fold utility We want to fold help text into the ncurses UI, so add a little module to split text into lines. Signed-off-by: Jeremy Kerr --- lib/fold/fold.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ lib/fold/fold.h | 27 +++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 lib/fold/fold.c create mode 100644 lib/fold/fold.h (limited to 'lib/fold') diff --git a/lib/fold/fold.c b/lib/fold/fold.c new file mode 100644 index 0000000..ec10c8c --- /dev/null +++ b/lib/fold/fold.c @@ -0,0 +1,44 @@ + +#include "fold/fold.h" + +void fold_text(const char *text, + int linelen, + int line_cb(void *arg, const char *start, int len), + void *arg) +{ + const char *start, *end, *sep; + int rc = 0; + + start = end = sep = text; + + while (!rc) { + + if (*end == '\n') { + rc = line_cb(arg, start, end - start); + start = sep = ++end; + + } else if (*end == '\0') { + line_cb(arg, start, end - start); + rc = 1; + + } else if (end - start >= linelen - 1) { + if (sep != start) { + /* split on a previous word boundary, if + * possible */ + rc = line_cb(arg, start, sep - start); + start = end = ++sep; + } else { + /* otherwise, break the word */ + end++; + rc = line_cb(arg, start, end - start); + start = sep = end; + } + + } else { + end++; + /* record our last separator */ + if (*end == ' ') + sep = end; + } + } +} diff --git a/lib/fold/fold.h b/lib/fold/fold.h new file mode 100644 index 0000000..834fcf2 --- /dev/null +++ b/lib/fold/fold.h @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2013 IBM Corporation + * + * This program 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; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef FOLD_H +#define FOLD_H + +void fold_text(const char *text, + int linelen, + int line_cb(void *arg, const char *start, int len), + void *arg); + +#endif /* FOLD_H */ + -- cgit v1.2.1