From 5c8699b7b0c48c5b9c40182b351da41b7887a5de Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Tue, 11 Oct 2022 20:41:28 -0700 Subject: streams: new function inc-indent-abs. * stream.c (inc_indent_abs): New function. (stream_init): inc-init-abs intrinsic registered. * stream.h (inc_indent_abs): Declared. * txr.1: Documented. * stdlib/doc-syms.tl: Updated. --- stdlib/doc-syms.tl | 7 ++++--- stream.c | 13 +++++++++++++ stream.h | 1 + txr.1 | 13 ++++++++++++- 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/stdlib/doc-syms.tl b/stdlib/doc-syms.tl index 59535d41..e214011c 100644 --- a/stdlib/doc-syms.tl +++ b/stdlib/doc-syms.tl @@ -864,7 +864,7 @@ ("get-fd" "N-011D42AB") ("get-frames" "N-010405DA") ("get-hash-userdata" "N-030B41A7") - ("get-indent" "N-024E9FD8") + ("get-indent" "N-00F72290") ("get-indent-mode" "N-03F3170C") ("get-json" "N-014295FE") ("get-jsons" "N-0124D378") @@ -998,7 +998,8 @@ ("inaddr-loopback" "N-026A2C3B") ("inaddr-str" "N-02456270") ("inc" "N-03A0AABD") - ("inc-indent" "N-024E9FD8") + ("inc-indent" "N-00F72290") + ("inc-indent-abs" "N-00F72290") ("include" "N-01A2ECA0") ("indent-code" "N-00512FDD") ("indent-data" "N-00512FDD") @@ -1703,7 +1704,7 @@ ("set-cflags" "N-02061924") ("set-hash-userdata" "N-030B40A7") ("set-iflags" "N-02061924") - ("set-indent" "N-024E9FD8") + ("set-indent" "N-00F72290") ("set-indent-mode" "N-03F3170C") ("set-key" "N-033F7D05") ("set-left" "N-033F7D05") diff --git a/stream.c b/stream.c index 08c2adc9..a3a70545 100644 --- a/stream.c +++ b/stream.c @@ -4104,6 +4104,18 @@ val inc_indent(val stream, val delta) return oldval; } +val inc_indent_abs(val stream, val delta) +{ + val self = lit("inc-indent-abs"); + struct strm_base *s = coerce(struct strm_base *, + cobj_handle(self, stream, stream_cls)); + val oldval = num(s->indent_chars); + s->indent_chars = c_num(plus(delta, oldval), self); + if (s->indent_chars < 0) + s->indent_chars = 0; + return oldval; +} + val width_check(val stream, val alt) { val self = lit("width-check"); @@ -5553,6 +5565,7 @@ void stream_init(void) reg_fun(intern(lit("get-indent"), user_package), func_n1(get_indent)); reg_fun(intern(lit("set-indent"), user_package), func_n2(set_indent)); reg_fun(intern(lit("inc-indent"), user_package), func_n2(inc_indent)); + reg_fun(intern(lit("inc-indent-abs"), user_package), func_n2(inc_indent_abs)); reg_fun(intern(lit("width-check"), user_package), func_n2(width_check)); reg_fun(intern(lit("force-break"), user_package), func_n1(force_break)); reg_fun(intern(lit("set-max-length"), user_package), func_n2(set_max_length)); diff --git a/stream.h b/stream.h index 4d73bac1..428fa47c 100644 --- a/stream.h +++ b/stream.h @@ -236,6 +236,7 @@ val set_indent_mode(val stream, val mode); val get_indent(val stream); val set_indent(val stream, val indent); val inc_indent(val stream, val delta); +val inc_indent_abs(val stream, val delta); val width_check(val stream, val alt); val force_break(val stream); val set_max_length(val stream, val length); diff --git a/txr.1 b/txr.1 index 162545c4..be539219 100644 --- a/txr.1 +++ b/txr.1 @@ -62570,11 +62570,12 @@ if and only if the current mode is equal to .metn compare-mode . -.coNP Functions @, get-indent @ set-indent and @ inc-indent +.coNP Functions @, get-indent @, set-indent @ inc-indent and @ inc-indent-abs .synb .mets (get-indent << stream ) .mets (set-indent < stream << new-indent ) .mets (inc-indent < stream << indent-delta ) +.mets (inc-indent-abs < stream << indent-delta ) .syne .desc These functions manipulate the indentation value of the stream. @@ -62605,6 +62606,16 @@ The indentation is calculated by adding to the current column position. If a negative indentation results, it is clamped to zero. +The +.code inc-indent-abs +function sets +.metn stream 's +indentation relative to the current indentation value. +The indentation is calculated by adding +.meta indent-delta +to the current indentation amount. +If a negative indentation results, it is clamped to zero. + .coNP Function @ width-check .synb .mets (width-check < stream << alt-char ) -- cgit v1.2.3