AmendHub

Download:

jcs

/

subtext

/

amendments

/

155

session: Don't run all session_printf formats through expand_template

session_expand_template is only needed for actual template views and
is pretty expensive. We only really need support for bolding and
resetting in session_printf.
 
This had the side effect of converting all bare \r's in session_printf
to \r\n, which screwed up ANSI output that was trying to just jump
back to the beginning of the line, like chat output.

jcs made amendment 155 over 2 years ago
--- ansi.c Mon Jun 13 15:52:50 2022 +++ ansi.c Fri Jun 17 17:13:28 2022 @@ -29,6 +29,24 @@ static char ansi_buf[10][32]; static short last_ansi_buf = 0; +const char * +ansi_bold(struct session *s) +{ + static const char bold[] = "\33[1m"; + if (s->vt100) + return bold; + return ""; +} + +const char * +ansi_reset(struct session *s) +{ + static const char reset[] = "\33[0m"; + if (s->vt100) + return reset; + return ""; +} + char * ansi(struct session *s, ...) { @@ -44,7 +62,7 @@ ansi(struct session *s, ...) if (++last_ansi_buf >= nitems(ansi_buf)) last_ansi_buf = 0; - *ansi_out = 0; + *ansi_out = '\0'; va_start(ap, s); while ((attr = va_arg(ap, short)) != ANSI_END) { --- ansi.h Sun May 15 22:04:03 2022 +++ ansi.h Fri Jun 17 17:13:58 2022 @@ -47,7 +47,9 @@ enum { ANSI_END = -1 }; -char *ansi(struct session *s, ...); +char * ansi(struct session *s, ...); +const char * ansi_bold(struct session *s); +const char * ansi_reset(struct session *s); size_t ansi_strip(char *inp, char **outp); void ansi_probe_screen_size(struct session *s); --- session.c Thu Jun 16 11:01:19 2022 +++ session.c Fri Jun 17 21:18:04 2022 @@ -318,10 +318,8 @@ session_close(struct session *session) void session_flush(struct session *session) { - if (session->ending) + if (session->ending || session->obuflen == 0) return; - if (session->obuflen == 0) - return; while (session->obuflen != 0) { session->node_funcs->output(session); @@ -376,18 +374,53 @@ session_output(struct session *session, const char *st size_t session_printf(struct session *session, const char *format, ...) { - static char session_printf_tbuf[192]; + static char session_printf_ebuf[160], session_printf_tbuf[160]; va_list ap; - size_t len; - char *expanded; + size_t len, n, en; + bool stop = false; - len = session_expand_template(session, format, &expanded); - + /* avoid a full session_expand_template just for {{B}} and {{/B}} */ + session_printf_ebuf[0] = '\0'; + for (n = 0, en = 0; format[n] != '\0'; n++) { + if (!stop) { + if (format[n] == '{' && format[n + 1] == '{' && + format[n + 2] == 'B' && format[n + 3] == '}' && + format[n + 4] == '}') { + en = strlcat(session_printf_ebuf, ansi_bold(session), + sizeof(session_printf_ebuf)); + n += 4; + continue; + } + if (format[n] == '{' && + format[n + 1] == '{' && format[n + 2] == '/' && + format[n + 3] == 'B' && format[n + 4] == '}' && + format[n + 5] == '}') { + en = strlcat(session_printf_ebuf, ansi_reset(session), + sizeof(session_printf_ebuf)); + n += 5; + continue; + } + if (format[n] == '{' && + format[n + 1] == '{' && format[n + 2] == '#' && + format[n + 3] == '}' && format[n + 4] == '}') { + stop = true; + n += 4; + continue; + } + } + + session_printf_ebuf[en++] = format[n]; + + if (en >= sizeof(session_printf_ebuf)) + panic("session_printf_ebuf overflow!"); + session_printf_ebuf[en] = '\0'; + } + va_start(ap, format); len = vsnprintf(session_printf_tbuf, sizeof(session_printf_tbuf), - expanded, ap); + session_printf_ebuf, ap); va_end(ap); - free(expanded); + if (len > sizeof(session_printf_tbuf)) panic("session_printf overflow! (%ld > %ld)", len, sizeof(session_printf_tbuf)); @@ -461,10 +494,8 @@ session_wait_for_chars(struct session *session, unsign while (session->ibuflen < num_chars) { session->node_funcs->input(session); - if (session->ending) + if (session->ending || session->abort_input) return false; - if (session->abort_input) - return false; if (session->obuflen != 0 && session->chatting) return false; if (expire && Ticks > expire) @@ -548,7 +579,6 @@ done_consuming: } session->last_input = ret; - return ret; idled_out: @@ -886,7 +916,7 @@ session_bar(struct session *s, char *left_str, char *r ansi(s, ANSI_RESET, ANSI_REVERSE, ANSI_END), sizeof(sides[0])); else - sidelen = strlcat(side, ansi(s, ANSI_BOLD, ANSI_END), + sidelen = strlcat(side, ansi_bold(s), sizeof(sides[0])); bold = !bold; @@ -1066,11 +1096,9 @@ session_expand_var(struct session *session, char *ivar } if (strcmp(var, "B") == 0) { - retlen = strlcpy(retval, - ansi(session, ANSI_BOLD, ANSI_END), retsize); + retlen = strlcpy(retval, ansi_bold(session), retsize); } else if (strcmp(var, "/B") == 0) { - retlen = strlcpy(retval, - ansi(session, ANSI_RESET, ANSI_END), retsize); + retlen = strlcpy(retval, ansi_reset(session), retsize); } else if (strcmp(var, "#") == 0) { *end_expansion = true; retlen = 0;