diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2013-12-10 14:12:48 +0800 |
---|---|---|
committer | Jeremy Kerr <jk@ozlabs.org> | 2014-01-31 08:46:34 +0800 |
commit | 485680a5bfeb952fd652a59efcce35636d6aec00 (patch) | |
tree | 8f3f09ede88b8e60eb5a19a5a29de4e83451934e /lib/fold | |
parent | 5a271400e9b5396cb90258b7582fe7ac6bcc2230 (diff) | |
download | petitboot-485680a5bfeb952fd652a59efcce35636d6aec00.zip petitboot-485680a5bfeb952fd652a59efcce35636d6aec00.tar.gz |
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 <jk@ozlabs.org>
Diffstat (limited to 'lib/fold')
-rw-r--r-- | lib/fold/fold.c | 44 | ||||
-rw-r--r-- | lib/fold/fold.h | 27 |
2 files changed, 71 insertions, 0 deletions
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 */ + |