builtin: use C.fwrite (buffered) for _write_buf_to_fd (#14558)
parent
58ebc0680e
commit
0f3b2c2ae7
|
@ -24,6 +24,7 @@ pub fn cprint(omessage string) {
|
||||||
message = term.cyan(message)
|
message = term.cyan(message)
|
||||||
}
|
}
|
||||||
print(message)
|
print(message)
|
||||||
|
flush_stdout()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn cprint_strong(omessage string) {
|
pub fn cprint_strong(omessage string) {
|
||||||
|
@ -32,16 +33,19 @@ pub fn cprint_strong(omessage string) {
|
||||||
message = term.bright_green(message)
|
message = term.bright_green(message)
|
||||||
}
|
}
|
||||||
print(message)
|
print(message)
|
||||||
|
flush_stdout()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn cprintln(omessage string) {
|
pub fn cprintln(omessage string) {
|
||||||
cprint(omessage)
|
cprint(omessage)
|
||||||
println('')
|
println('')
|
||||||
|
flush_stdout()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn cprintln_strong(omessage string) {
|
pub fn cprintln_strong(omessage string) {
|
||||||
cprint_strong(omessage)
|
cprint_strong(omessage)
|
||||||
println('')
|
println('')
|
||||||
|
flush_stdout()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn verbose_trace(label string, message string) {
|
pub fn verbose_trace(label string, message string) {
|
||||||
|
|
|
@ -123,6 +123,7 @@ pub fn (mut ts TestSession) print_messages() {
|
||||||
// progress mode, the last line is rewritten many times:
|
// progress mode, the last line is rewritten many times:
|
||||||
if is_ok && !ts.silent_mode {
|
if is_ok && !ts.silent_mode {
|
||||||
print('\r$empty\r$msg')
|
print('\r$empty\r$msg')
|
||||||
|
flush_stdout()
|
||||||
} else {
|
} else {
|
||||||
// the last \n is needed, so SKIP/FAIL messages
|
// the last \n is needed, so SKIP/FAIL messages
|
||||||
// will not get overwritten by the OK ones
|
// will not get overwritten by the OK ones
|
||||||
|
|
|
@ -200,8 +200,13 @@ fn (mut context Context) parse_options() ? {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn flushed_print(s string) {
|
||||||
|
print(s)
|
||||||
|
flush_stdout()
|
||||||
|
}
|
||||||
|
|
||||||
fn (mut context Context) clear_line() {
|
fn (mut context Context) clear_line() {
|
||||||
print(context.cline)
|
flushed_print(context.cline)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (mut context Context) expand_all_commands(commands []string) []string {
|
fn (mut context Context) expand_all_commands(commands []string) []string {
|
||||||
|
@ -247,7 +252,7 @@ fn (mut context Context) run() {
|
||||||
println('Series: ${si:4}/${context.series:-4}, command: $cmd')
|
println('Series: ${si:4}/${context.series:-4}, command: $cmd')
|
||||||
if context.warmup > 0 && run_warmups < context.commands.len {
|
if context.warmup > 0 && run_warmups < context.commands.len {
|
||||||
for i in 1 .. context.warmup + 1 {
|
for i in 1 .. context.warmup + 1 {
|
||||||
print('${context.cgoback}warming up run: ${i:4}/${context.warmup:-4} for ${cmd:-50s} took ${duration:6} ms ...')
|
flushed_print('${context.cgoback}warming up run: ${i:4}/${context.warmup:-4} for ${cmd:-50s} took ${duration:6} ms ...')
|
||||||
mut sw := time.new_stopwatch()
|
mut sw := time.new_stopwatch()
|
||||||
res := os.execute(cmd)
|
res := os.execute(cmd)
|
||||||
if res.exit_code != 0 {
|
if res.exit_code != 0 {
|
||||||
|
@ -260,9 +265,9 @@ fn (mut context Context) run() {
|
||||||
context.clear_line()
|
context.clear_line()
|
||||||
for i in 1 .. (context.count + 1) {
|
for i in 1 .. (context.count + 1) {
|
||||||
avg := f64(sum) / f64(i)
|
avg := f64(sum) / f64(i)
|
||||||
print('${context.cgoback}Average: ${avg:9.3f}ms | run: ${i:4}/${context.count:-4} | took ${duration:6} ms')
|
flushed_print('${context.cgoback}Average: ${avg:9.3f}ms | run: ${i:4}/${context.count:-4} | took ${duration:6} ms')
|
||||||
if context.show_output {
|
if context.show_output {
|
||||||
print(' | result: ${oldres:s}')
|
flushed_print(' | result: ${oldres:s}')
|
||||||
}
|
}
|
||||||
mut sw := time.new_stopwatch()
|
mut sw := time.new_stopwatch()
|
||||||
res := scripting.exec(cmd) or { continue }
|
res := scripting.exec(cmd) or { continue }
|
||||||
|
@ -288,7 +293,7 @@ fn (mut context Context) run() {
|
||||||
context.results[icmd].atiming = new_aints(context.results[icmd].timings, context.nmins,
|
context.results[icmd].atiming = new_aints(context.results[icmd].timings, context.nmins,
|
||||||
context.nmaxs)
|
context.nmaxs)
|
||||||
context.clear_line()
|
context.clear_line()
|
||||||
print(context.cgoback)
|
flushed_print(context.cgoback)
|
||||||
mut m := map[string][]int{}
|
mut m := map[string][]int{}
|
||||||
ioutputs := context.results[icmd].outputs
|
ioutputs := context.results[icmd].outputs
|
||||||
for o in ioutputs {
|
for o in ioutputs {
|
||||||
|
@ -358,7 +363,7 @@ fn (mut context Context) show_diff_summary() {
|
||||||
println('context: $context')
|
println('context: $context')
|
||||||
}
|
}
|
||||||
if int(base) > context.fail_on_maxtime {
|
if int(base) > context.fail_on_maxtime {
|
||||||
print(performance_regression_label)
|
flushed_print(performance_regression_label)
|
||||||
println('average time: ${base:6.1f} ms > $context.fail_on_maxtime ms threshold.')
|
println('average time: ${base:6.1f} ms > $context.fail_on_maxtime ms threshold.')
|
||||||
exit(2)
|
exit(2)
|
||||||
}
|
}
|
||||||
|
@ -367,7 +372,7 @@ fn (mut context Context) show_diff_summary() {
|
||||||
}
|
}
|
||||||
fail_threshold_max := f64(context.fail_on_regress_percent)
|
fail_threshold_max := f64(context.fail_on_regress_percent)
|
||||||
if first_cmd_percentage > fail_threshold_max {
|
if first_cmd_percentage > fail_threshold_max {
|
||||||
print(performance_regression_label)
|
flushed_print(performance_regression_label)
|
||||||
println('${first_cmd_percentage:5.1f}% > ${fail_threshold_max:5.1f}% threshold.')
|
println('${first_cmd_percentage:5.1f}% > ${fail_threshold_max:5.1f}% threshold.')
|
||||||
exit(3)
|
exit(3)
|
||||||
}
|
}
|
||||||
|
|
|
@ -183,6 +183,7 @@ fn (foptions &FormatOptions) format_pipe() {
|
||||||
// checker.new_checker(table, prefs).check(file_ast)
|
// checker.new_checker(table, prefs).check(file_ast)
|
||||||
formatted_content := fmt.fmt(file_ast, table, prefs, foptions.is_debug)
|
formatted_content := fmt.fmt(file_ast, table, prefs, foptions.is_debug)
|
||||||
print(formatted_content)
|
print(formatted_content)
|
||||||
|
flush_stdout()
|
||||||
foptions.vlog('fmt.fmt worked and $formatted_content.len bytes were written to stdout.')
|
foptions.vlog('fmt.fmt worked and $formatted_content.len bytes were written to stdout.')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -279,6 +280,7 @@ fn (mut foptions FormatOptions) post_process_file(file string, formatted_file_pa
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
print(formatted_fc)
|
print(formatted_fc)
|
||||||
|
flush_stdout()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (f FormatOptions) str() string {
|
fn (f FormatOptions) str() string {
|
||||||
|
|
|
@ -268,13 +268,28 @@ fn _write_buf_to_fd(fd int, buf &u8, buf_len int) {
|
||||||
if buf_len <= 0 {
|
if buf_len <= 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
unsafe {
|
mut ptr := unsafe { buf }
|
||||||
mut ptr := buf
|
mut remaining_bytes := isize(buf_len)
|
||||||
mut remaining_bytes := buf_len
|
mut x := isize(0)
|
||||||
for remaining_bytes > 0 {
|
$if freestanding || vinix {
|
||||||
x := C.write(fd, ptr, remaining_bytes)
|
unsafe {
|
||||||
ptr += x
|
for remaining_bytes > 0 {
|
||||||
remaining_bytes -= x
|
x = C.write(fd, ptr, remaining_bytes)
|
||||||
|
ptr += x
|
||||||
|
remaining_bytes -= x
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} $else {
|
||||||
|
mut stream := voidptr(C.stdout)
|
||||||
|
if fd == 2 {
|
||||||
|
stream = voidptr(C.stderr)
|
||||||
|
}
|
||||||
|
unsafe {
|
||||||
|
for remaining_bytes > 0 {
|
||||||
|
x = isize(C.fwrite(ptr, 1, remaining_bytes, stream))
|
||||||
|
ptr += x
|
||||||
|
remaining_bytes -= x
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@ module term
|
||||||
// y is the y coordinate
|
// y is the y coordinate
|
||||||
pub fn set_cursor_position(c Coord) {
|
pub fn set_cursor_position(c Coord) {
|
||||||
print('\x1b[$c.y;$c.x' + 'H')
|
print('\x1b[$c.y;$c.x' + 'H')
|
||||||
|
flush_stdout()
|
||||||
}
|
}
|
||||||
|
|
||||||
// n is number of cells
|
// n is number of cells
|
||||||
|
@ -25,6 +26,7 @@ pub fn set_cursor_position(c Coord) {
|
||||||
// direction: D is backward / West
|
// direction: D is backward / West
|
||||||
pub fn move(n int, direction string) {
|
pub fn move(n int, direction string) {
|
||||||
print('\x1b[$n$direction')
|
print('\x1b[$n$direction')
|
||||||
|
flush_stdout()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn cursor_up(n int) {
|
pub fn cursor_up(n int) {
|
||||||
|
@ -50,6 +52,7 @@ pub fn cursor_back(n int) {
|
||||||
|
|
||||||
pub fn erase_display(t string) {
|
pub fn erase_display(t string) {
|
||||||
print('\x1b[' + t + 'J')
|
print('\x1b[' + t + 'J')
|
||||||
|
flush_stdout()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn erase_toend() {
|
pub fn erase_toend() {
|
||||||
|
@ -63,6 +66,7 @@ pub fn erase_tobeg() {
|
||||||
// clears entire screen and returns cursor to top left-corner
|
// clears entire screen and returns cursor to top left-corner
|
||||||
pub fn erase_clear() {
|
pub fn erase_clear() {
|
||||||
print('\033[H\033[J')
|
print('\033[H\033[J')
|
||||||
|
flush_stdout()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn erase_del_clear() {
|
pub fn erase_del_clear() {
|
||||||
|
@ -75,6 +79,7 @@ pub fn erase_del_clear() {
|
||||||
// Note: Cursor position does not change
|
// Note: Cursor position does not change
|
||||||
pub fn erase_line(t string) {
|
pub fn erase_line(t string) {
|
||||||
print('\x1b[' + t + 'K')
|
print('\x1b[' + t + 'K')
|
||||||
|
flush_stdout()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn erase_line_toend() {
|
pub fn erase_line_toend() {
|
||||||
|
@ -92,11 +97,13 @@ pub fn erase_line_clear() {
|
||||||
// Will make cursor appear if not visible
|
// Will make cursor appear if not visible
|
||||||
pub fn show_cursor() {
|
pub fn show_cursor() {
|
||||||
print('\x1b[?25h')
|
print('\x1b[?25h')
|
||||||
|
flush_stdout()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Will make cursor invisible
|
// Will make cursor invisible
|
||||||
pub fn hide_cursor() {
|
pub fn hide_cursor() {
|
||||||
print('\x1b[?25l')
|
print('\x1b[?25l')
|
||||||
|
flush_stdout()
|
||||||
}
|
}
|
||||||
|
|
||||||
// clear_previous_line - useful for progressbars.
|
// clear_previous_line - useful for progressbars.
|
||||||
|
@ -105,4 +112,5 @@ pub fn hide_cursor() {
|
||||||
// the previous content.
|
// the previous content.
|
||||||
pub fn clear_previous_line() {
|
pub fn clear_previous_line() {
|
||||||
print('\r\x1b[1A\x1b[2K')
|
print('\r\x1b[1A\x1b[2K')
|
||||||
|
flush_stdout()
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,6 +52,7 @@ pub fn get_cursor_position() ?Coord {
|
||||||
unsafe { C.tcsetattr(0, C.TCSANOW, &state) }
|
unsafe { C.tcsetattr(0, C.TCSANOW, &state) }
|
||||||
|
|
||||||
print('\e[6n')
|
print('\e[6n')
|
||||||
|
flush_stdout()
|
||||||
|
|
||||||
mut x := 0
|
mut x := 0
|
||||||
mut y := 0
|
mut y := 0
|
||||||
|
@ -87,6 +88,7 @@ pub fn set_terminal_title(title string) bool {
|
||||||
print('\033]0')
|
print('\033]0')
|
||||||
print(title)
|
print(title)
|
||||||
print('\007')
|
print('\007')
|
||||||
|
flush_stdout()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,4 +96,5 @@ pub fn set_terminal_title(title string) bool {
|
||||||
pub fn clear() {
|
pub fn clear() {
|
||||||
print('\x1b[2J')
|
print('\x1b[2J')
|
||||||
print('\x1b[H')
|
print('\x1b[H')
|
||||||
|
flush_stdout()
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,12 +32,14 @@ pub fn init(cfg Config) &Context {
|
||||||
fn save_title() {
|
fn save_title() {
|
||||||
// restore the previously saved terminal title
|
// restore the previously saved terminal title
|
||||||
print('\x1b[22;0t')
|
print('\x1b[22;0t')
|
||||||
|
flush_stdout()
|
||||||
}
|
}
|
||||||
|
|
||||||
[inline]
|
[inline]
|
||||||
fn load_title() {
|
fn load_title() {
|
||||||
// restore the previously saved terminal title
|
// restore the previously saved terminal title
|
||||||
print('\x1b[23;0t')
|
print('\x1b[23;0t')
|
||||||
|
flush_stdout()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (mut ctx Context) run() ? {
|
pub fn (mut ctx Context) run() ? {
|
||||||
|
|
|
@ -26,6 +26,7 @@ fn restore_terminal_state() {
|
||||||
// clear the terminal and set the cursor to the origin
|
// clear the terminal and set the cursor to the origin
|
||||||
print('\x1b[2J\x1b[3J')
|
print('\x1b[2J\x1b[3J')
|
||||||
print('\x1b[?1049l')
|
print('\x1b[?1049l')
|
||||||
|
flush_stdout()
|
||||||
}
|
}
|
||||||
C.SetConsoleMode(ui.ctx_ptr.stdin_handle, ui.stdin_at_startup)
|
C.SetConsoleMode(ui.ctx_ptr.stdin_handle, ui.stdin_at_startup)
|
||||||
}
|
}
|
||||||
|
@ -65,6 +66,7 @@ pub fn init(cfg Config) &Context {
|
||||||
print('\x1b[?1049h')
|
print('\x1b[?1049h')
|
||||||
// clear the terminal and set the cursor to the origin
|
// clear the terminal and set the cursor to the origin
|
||||||
print('\x1b[2J\x1b[3J\x1b[1;1H')
|
print('\x1b[2J\x1b[3J\x1b[1;1H')
|
||||||
|
flush_stdout()
|
||||||
}
|
}
|
||||||
|
|
||||||
if ctx.cfg.hide_cursor {
|
if ctx.cfg.hide_cursor {
|
||||||
|
@ -74,6 +76,7 @@ pub fn init(cfg Config) &Context {
|
||||||
|
|
||||||
if ctx.cfg.window_title != '' {
|
if ctx.cfg.window_title != '' {
|
||||||
print('\x1b]0;$ctx.cfg.window_title\x07')
|
print('\x1b]0;$ctx.cfg.window_title\x07')
|
||||||
|
flush_stdout()
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
|
@ -317,10 +320,12 @@ fn (mut ctx Context) parse_events() {
|
||||||
fn save_title() {
|
fn save_title() {
|
||||||
// restore the previously saved terminal title
|
// restore the previously saved terminal title
|
||||||
print('\x1b[22;0t')
|
print('\x1b[22;0t')
|
||||||
|
flush_stdout()
|
||||||
}
|
}
|
||||||
|
|
||||||
[inline]
|
[inline]
|
||||||
fn load_title() {
|
fn load_title() {
|
||||||
// restore the previously saved terminal title
|
// restore the previously saved terminal title
|
||||||
print('\x1b[23;0t')
|
print('\x1b[23;0t')
|
||||||
|
flush_stdout()
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,6 +79,7 @@ fn (mut ctx Context) termios_setup() ? {
|
||||||
|
|
||||||
if ctx.cfg.window_title != '' {
|
if ctx.cfg.window_title != '' {
|
||||||
print('\x1b]0;$ctx.cfg.window_title\x07')
|
print('\x1b]0;$ctx.cfg.window_title\x07')
|
||||||
|
flush_stdout()
|
||||||
}
|
}
|
||||||
|
|
||||||
if !ctx.cfg.skip_init_checks {
|
if !ctx.cfg.skip_init_checks {
|
||||||
|
@ -90,6 +91,7 @@ fn (mut ctx Context) termios_setup() ? {
|
||||||
// feature-test the SU spec
|
// feature-test the SU spec
|
||||||
sx, sy := get_cursor_position()
|
sx, sy := get_cursor_position()
|
||||||
print('$bsu$esu')
|
print('$bsu$esu')
|
||||||
|
flush_stdout()
|
||||||
ex, ey := get_cursor_position()
|
ex, ey := get_cursor_position()
|
||||||
if sx == ex && sy == ey {
|
if sx == ex && sy == ey {
|
||||||
// the terminal either ignored or handled the sequence properly, enable SU
|
// the terminal either ignored or handled the sequence properly, enable SU
|
||||||
|
@ -108,11 +110,14 @@ fn (mut ctx Context) termios_setup() ? {
|
||||||
C.tcsetattr(C.STDIN_FILENO, C.TCSAFLUSH, &termios)
|
C.tcsetattr(C.STDIN_FILENO, C.TCSAFLUSH, &termios)
|
||||||
// enable mouse input
|
// enable mouse input
|
||||||
print('\x1b[?1003h\x1b[?1006h')
|
print('\x1b[?1003h\x1b[?1006h')
|
||||||
|
flush_stdout()
|
||||||
if ctx.cfg.use_alternate_buffer {
|
if ctx.cfg.use_alternate_buffer {
|
||||||
// switch to the alternate buffer
|
// switch to the alternate buffer
|
||||||
print('\x1b[?1049h')
|
print('\x1b[?1049h')
|
||||||
|
flush_stdout()
|
||||||
// clear the terminal and set the cursor to the origin
|
// clear the terminal and set the cursor to the origin
|
||||||
print('\x1b[2J\x1b[3J\x1b[1;1H')
|
print('\x1b[2J\x1b[3J\x1b[1;1H')
|
||||||
|
flush_stdout()
|
||||||
}
|
}
|
||||||
ctx.window_height, ctx.window_width = get_terminal_size()
|
ctx.window_height, ctx.window_width = get_terminal_size()
|
||||||
|
|
||||||
|
@ -162,6 +167,7 @@ fn (mut ctx Context) termios_setup() ? {
|
||||||
|
|
||||||
fn get_cursor_position() (int, int) {
|
fn get_cursor_position() (int, int) {
|
||||||
print('\033[6n')
|
print('\033[6n')
|
||||||
|
flush_stdout()
|
||||||
mut s := ''
|
mut s := ''
|
||||||
unsafe {
|
unsafe {
|
||||||
buf := malloc_noscan(25)
|
buf := malloc_noscan(25)
|
||||||
|
@ -183,8 +189,10 @@ fn supports_truecolor() bool {
|
||||||
}
|
}
|
||||||
// set the bg color to some arbirtrary value (#010203), assumed not to be the default
|
// set the bg color to some arbirtrary value (#010203), assumed not to be the default
|
||||||
print('\x1b[48:2:1:2:3m')
|
print('\x1b[48:2:1:2:3m')
|
||||||
|
flush_stdout()
|
||||||
// andquery the current color
|
// andquery the current color
|
||||||
print('\x1bP\$qm\x1b\\')
|
print('\x1bP\$qm\x1b\\')
|
||||||
|
flush_stdout()
|
||||||
mut s := ''
|
mut s := ''
|
||||||
unsafe {
|
unsafe {
|
||||||
buf := malloc_noscan(25)
|
buf := malloc_noscan(25)
|
||||||
|
@ -199,6 +207,7 @@ fn termios_reset() {
|
||||||
// C.TCSANOW ??
|
// C.TCSANOW ??
|
||||||
C.tcsetattr(C.STDIN_FILENO, C.TCSAFLUSH, &ui.termios_at_startup)
|
C.tcsetattr(C.STDIN_FILENO, C.TCSAFLUSH, &ui.termios_at_startup)
|
||||||
print('\x1b[?1003l\x1b[?1006l\x1b[?25h')
|
print('\x1b[?1003l\x1b[?1006l\x1b[?25h')
|
||||||
|
flush_stdout()
|
||||||
c := ctx_ptr
|
c := ctx_ptr
|
||||||
if unsafe { c != 0 } && c.cfg.use_alternate_buffer {
|
if unsafe { c != 0 } && c.cfg.use_alternate_buffer {
|
||||||
print('\x1b[?1049l')
|
print('\x1b[?1049l')
|
||||||
|
|
|
@ -116,6 +116,7 @@ pub fn (mut ctx Context) clear() {
|
||||||
[inline]
|
[inline]
|
||||||
pub fn (mut ctx Context) set_window_title(s string) {
|
pub fn (mut ctx Context) set_window_title(s string) {
|
||||||
print('\x1b]0;$s\x07')
|
print('\x1b]0;$s\x07')
|
||||||
|
flush_stdout()
|
||||||
}
|
}
|
||||||
|
|
||||||
// draw_point draws a point at position `x`,`y`.
|
// draw_point draws a point at position `x`,`y`.
|
||||||
|
|
Loading…
Reference in New Issue