diff options
-rw-r--r-- | ChangeLog | 15 | ||||
-rw-r--r-- | lib.c | 33 | ||||
-rw-r--r-- | lib.h | 2 | ||||
-rw-r--r-- | match.c | 6 |
4 files changed, 34 insertions, 22 deletions
@@ -1,5 +1,20 @@ 2009-10-21 Kaz Kylheku <kkylheku@gmail.com> + Change the freeform line catenation semantics to termination + rather than separation. + + * lib.h (lazy_str): Declaration updated. + + * lib.c (lazy_str): Tack terminator onto initial prefix + string. Parameter renamed. Also, terminator string cached + in the object. + (lazy_str_force, lazy_str_force_upto): Terminate, rather + than separate. + + * match.c (match_files): sep variable renamed to term. + +2009-10-21 Kaz Kylheku <kkylheku@gmail.com> + * gc.c (mark_obj): Bugfix: recurse over recently added member, opts, in the lazy_string structure. @@ -1357,21 +1357,23 @@ obj_t *lazy_stream_cons(obj_t *stream) lazy_stream_func)); } -obj_t *lazy_str(obj_t *list, obj_t *sep, obj_t *limit) +obj_t *lazy_str(obj_t *lst, obj_t *term, obj_t *limit) { obj_t *obj = make_obj(); obj->ls.type = LSTR; - if (nullp(list)) { + term = or2(term, string("\n")); + + if (nullp(lst)) { obj->ls.prefix = null_string; obj->ls.list = nil; } else { - obj->ls.prefix = first(list); - obj->ls.list = rest(list); + obj->ls.prefix = cat_str(list(first(lst), term, nao), nil); + obj->ls.list = rest(lst); limit = if2(limit, minus(limit, one)); } - obj->ls.opts = cons(sep, limit); + obj->ls.opts = cons(term, limit); return obj; } @@ -1382,17 +1384,12 @@ obj_t *lazy_str_force(obj_t *lstr) type_check(lstr, LSTR); 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 = cdr(lstr->ls.list); - lim = minus(lim, one); + while ((!lim || gt(lim, zero)) && lstr->ls.list) { + obj_t *next = pop(&lstr->ls.list); + obj_t *term = car(lstr->ls.opts); + lstr->ls.prefix = cat_str(list(lstr->ls.prefix, next, term, nao), nil); + if (lim) + lim = minus(lim, one); } if (lim) @@ -1411,8 +1408,8 @@ obj_t *lazy_str_force_upto(obj_t *lstr, obj_t *index) 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)), - or2(car(lstr->ls.opts), string("\n"))); + obj_t *term = car(lstr->ls.opts); + lstr->ls.prefix = cat_str(list(lstr->ls.prefix, next, term, nao), nil); if (lim) lim = minus(lim, one); } @@ -289,7 +289,7 @@ obj_t *vec_set_fill(obj_t *vec, obj_t *fill); obj_t **vecref_l(obj_t *vec, obj_t *ind); obj_t *vec_push(obj_t *vec, obj_t *item); obj_t *lazy_stream_cons(obj_t *stream); -obj_t *lazy_str(obj_t *list, obj_t *sep, obj_t *limit); +obj_t *lazy_str(obj_t *list, obj_t *term, obj_t *limit); obj_t *lazy_str_force_upto(obj_t *lstr, obj_t *index); obj_t *lazy_str_force(obj_t *lstr); obj_t *lazy_str_get_trailing_list(obj_t *lstr, obj_t *index); @@ -993,10 +993,10 @@ repeat_spec_same_data: } else { obj_t *limit = or2(if2(nump(first(vals)), first(vals)), if2(nump(second(vals)), second(vals))); - obj_t *sep = or2(if2(stringp(first(vals)), first(vals)), - if2(stringp(second(vals)), second(vals))); + obj_t *term = or2(if2(stringp(first(vals)), first(vals)), + if2(stringp(second(vals)), second(vals))); obj_t *ff_specline = rest(first(spec)); - obj_t *ff_dataline = lazy_str(data, sep, limit); + obj_t *ff_dataline = lazy_str(data, term, limit); cons_bind (new_bindings, success, match_line(bindings, ff_specline, ff_dataline, zero, |