From 346cc5ca2c69442273326cd7cb5b09dce70b69ec Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Fri, 24 Jul 2020 08:34:39 +0300 Subject: [PATCH] term: fix panic in term.header, when cols,rows from get_terminal_size are < 2 --- vlib/term/term.v | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/vlib/term/term.v b/vlib/term/term.v index 1cc7fcb45e..0ce55af54a 100644 --- a/vlib/term/term.v +++ b/vlib/term/term.v @@ -49,30 +49,41 @@ pub fn h_divider(divider string) string { // e.g: term.header('TEXT', '=') // =============== TEXT =============== pub fn header(text, divider string) string { - if text.len == 0 || divider.len < 2 { + if text.len == 0 { return h_divider(divider) } - cols,_ := get_terminal_size() - tlimit := if cols > text.len + 2 + 2 * divider.len { text.len } else { cols - 3 - 2 * divider.len } + xcols,_ := get_terminal_size() + cols := imax(1, xcols) + tlimit := imax(1, if cols > text.len + 2 + 2 * divider.len { text.len } else { cols - 3 - 2 * divider.len }) tlimit_alligned := if (tlimit % 2) != (cols % 2) { tlimit + 1 } else { tlimit } - tstart := (cols - tlimit_alligned) / 2 + tstart := imax(0, (cols - tlimit_alligned) / 2) ln := if divider.len > 0 { divider.repeat(1 + cols / divider.len)[0..cols] } else { " ".repeat(1 + cols) } + if ln.len == 1 { + return ln + ' ' + text[0..tlimit] + ' ' + ln + } return ln[0..tstart] + ' ' + text[0..tlimit] + ' ' + ln[tstart + tlimit + 2..cols] } +fn imax(x,y int) int { + return if x > y { x } else { y } +} + fn supports_escape_sequences(fd int) bool { - //println('TERM=' + os.getenv('TERM')) - if os.getenv('TERM') == 'dumb' { - return false - } vcolors_override := os.getenv('VCOLORS') if vcolors_override == 'always' { return true } + if vcolors_override == 'never' { + return false + } + if os.getenv('TERM') == 'dumb' { + return false + } $if windows { - return (is_atty(fd) & 0x0004) > 0 && os.getenv('TERM') != 'dumb' // enable_virtual_terminal_processing + // 4 is enable_virtual_terminal_processing + return (is_atty(fd) & 0x0004) > 0 } $else { - return is_atty(fd) > 0 && os.getenv('TERM') != 'dumb' + return is_atty(fd) > 0 } }