summaryrefslogtreecommitdiffstats
path: root/lib/fold/fold.c
blob: ec10c8c240388af62981d582eaac401d19ae28d7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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;
		}
	}
}
OpenPOWER on IntegriCloud