summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2009-11-02 15:57:40 -0800
committerKaz Kylheku <kaz@kylheku.com>2009-11-02 15:57:40 -0800
commitf6c4f253681b576f39d939e602e9de7bc1b8892b (patch)
treeb0cde10be55dfb779106fc6e2fb387d0741fd3e8 /lib.c
parent69a1cbeccd0834937a46c95da08948d684868c17 (diff)
downloadtxr-f6c4f253681b576f39d939e602e9de7bc1b8892b.tar.gz
txr-f6c4f253681b576f39d939e602e9de7bc1b8892b.tar.bz2
txr-f6c4f253681b576f39d939e602e9de7bc1b8892b.zip
Implement custom separator and limit in freeform.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c36
1 files changed, 28 insertions, 8 deletions
diff --git a/lib.c b/lib.c
index 8bb72dc1..b942703a 100644
--- a/lib.c
+++ b/lib.c
@@ -1357,7 +1357,7 @@ obj_t *lazy_stream_cons(obj_t *stream)
lazy_stream_func));
}
-obj_t *lazy_str(obj_t *list)
+obj_t *lazy_str(obj_t *list, obj_t *sep, obj_t *limit)
{
obj_t *obj = make_obj();
obj->ls.type = LSTR;
@@ -1368,19 +1368,31 @@ obj_t *lazy_str(obj_t *list)
} else {
obj->ls.prefix = first(list);
obj->ls.list = rest(list);
+ limit = if2(limit, minus(limit, one));
}
+ obj->ls.opts = cons(sep, limit);
+
return obj;
}
obj_t *lazy_str_force(obj_t *lstr)
{
+ obj_t *lim;
type_check(lstr, LSTR);
-
- if (lstr->ls.list) {
- lstr->ls.prefix = cat_str(cons(lstr->ls.prefix, lstr->ls.list),
- string("\n"));
+ lim = cdr(lstr->ls.opts);
+
+ if (!lim) {
+ if (lstr->ls.list) {
+ lstr->ls.prefix = cat_str(cons(lstr->ls.prefix, lstr->ls.list),
+ or2(car(lstr->ls.opts), string("\n")));
+ lstr->ls.list = nil;
+ }
+ } else while (gt(lim, zero) && lstr->ls.list) {
+ lstr->ls.prefix = cat_str(list(lstr->ls.prefix, car(lstr->ls.list), nao),
+ or2(car(lstr->ls.opts), string("\n")));
lstr->ls.list = nil;
+ lim = minus(lim, one);
}
return lstr->ls.prefix;
@@ -1388,14 +1400,22 @@ obj_t *lazy_str_force(obj_t *lstr)
obj_t *lazy_str_force_upto(obj_t *lstr, obj_t *index)
{
+ obj_t *lim;
type_check(lstr, LSTR);
+ lim = cdr(lstr->ls.opts);
- while (gt(index, length_str(lstr->ls.prefix)) && lstr->ls.list) {
+ while (gt(index, length_str(lstr->ls.prefix)) && lstr->ls.list &&
+ or2(nullp(lim),gt(lim,zero)))
+ {
obj_t *next = pop(&lstr->ls.list);
lstr->ls.prefix = cat_str(cons(lstr->ls.prefix, cons(next, nil)),
- string("\n"));
+ or2(car(lstr->ls.opts), string("\n")));
+ if (lim)
+ lim = minus(lim, one);
}
+ if (lim)
+ *cdr_l(lstr->ls.opts) = lim;
return lt(index, length_str(lstr->ls.prefix));
}
@@ -1469,7 +1489,7 @@ obj_t *lazy_str_get_trailing_list(obj_t *lstr, obj_t *index)
{
obj_t *split_suffix = split_str(sub_str(lstr->ls.prefix, index, nil),
- string("\n"));
+ or2(car(lstr->ls.opts), string("\n")));
return nappend2(split_suffix, lstr->ls.list);
}