aboutsummaryrefslogtreecommitdiff
path: root/lib/linestack.c
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2018-10-10 06:36:12 -0500
committerRob Landley <rob@landley.net>2018-10-10 06:36:12 -0500
commit9492c7fce507cd5cd5172d6e2bf2b86573198806 (patch)
treef443233d93092b5058af4525b30ee68d5f3fa5c4 /lib/linestack.c
parentc349e6f2e19281903fd8666cfeafe2f081fef66a (diff)
downloadtoybox-9492c7fce507cd5cd5172d6e2bf2b86573198806.tar.gz
Rewrite of watch.
Diffstat (limited to 'lib/linestack.c')
-rw-r--r--lib/linestack.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/lib/linestack.c b/lib/linestack.c
index 99807ccf..fb6cc1e4 100644
--- a/lib/linestack.c
+++ b/lib/linestack.c
@@ -1,6 +1,11 @@
#include "toys.h"
-// A linestack is an array of struct ptr_len.
+// The design idea here is indexing a big blob of (potentially mmaped) data
+// instead of copying the data into a zillion seperate malloc()s.
+
+// A linestack is an array of struct ptr_len, with a currently used len
+// and max tracking the memory allocation. This indexes existing string data,
+// the lifetime of which is tracked externally.
// Insert one stack into another before position in old stack.
// (Does not copy contents of strings, just shuffles index array contents.)
@@ -92,8 +97,7 @@ int crunch_str(char **str, int width, FILE *out, char *escmore,
for (end = start = *str; *end; columns += col, end += bytes) {
wchar_t wc;
- if ((bytes = utf8towc(&wc, end, 4))>0 && (col = wcwidth(wc))>=0)
- {
+ if ((bytes = utf8towc(&wc, end, 4))>0 && (col = wcwidth(wc))>=0) {
if (!escmore || wc>255 || !strchr(escmore, wc)) {
if (width-columns<col) break;
if (out) fwrite(end, bytes, 1, out);
@@ -108,8 +112,9 @@ int crunch_str(char **str, int width, FILE *out, char *escmore,
}
col = width-columns;
if (col<1) break;
- if (escout) col = escout(out, col, wc);
- else if (out) fwrite(end, bytes, 1, out);
+ if (escout) {
+ if ((col = escout(out, col, wc))<0) break;
+ } else if (out) fwrite(end, 1, bytes, out);
}
*str = end;