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 3 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;