readline: optional return, automatic raw mode and standalone functions
parent
aaf286ec5e
commit
5acadbab32
|
@ -68,9 +68,10 @@ enum Action {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Toggle raw mode of the terminal by changing its attributes
|
// Toggle raw mode of the terminal by changing its attributes
|
||||||
pub fn (r mut Readline) enable_raw_mode() {
|
fn (r mut Readline) enable_raw_mode() {
|
||||||
if ( C.tcgetattr(0, &r.orig_termios) == -1 ) {
|
if ( C.tcgetattr(0, &r.orig_termios) == -1 ) {
|
||||||
r.is_tty = false
|
r.is_tty = false
|
||||||
|
r.is_raw = false
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
mut raw := r.orig_termios
|
mut raw := r.orig_termios
|
||||||
|
@ -85,9 +86,10 @@ pub fn (r mut Readline) enable_raw_mode() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Not catching the SIGUSER (CTRL+C) Signal
|
// Not catching the SIGUSER (CTRL+C) Signal
|
||||||
pub fn (r mut Readline) enable_raw_mode2() {
|
fn (r mut Readline) enable_raw_mode2() {
|
||||||
if ( C.tcgetattr(0, &r.orig_termios) == -1 ) {
|
if ( C.tcgetattr(0, &r.orig_termios) == -1 ) {
|
||||||
r.is_tty = false
|
r.is_tty = false
|
||||||
|
r.is_raw = false
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
mut raw := r.orig_termios
|
mut raw := r.orig_termios
|
||||||
|
@ -102,9 +104,10 @@ pub fn (r mut Readline) enable_raw_mode2() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset back the terminal to its default value
|
// Reset back the terminal to its default value
|
||||||
pub fn (r Readline) disable_raw_mode() {
|
pub fn (r mut Readline) disable_raw_mode() {
|
||||||
if r.is_raw {
|
if r.is_raw {
|
||||||
C.tcsetattr(0, C.TCSADRAIN, &r.orig_termios)
|
C.tcsetattr(0, C.TCSADRAIN, &r.orig_termios)
|
||||||
|
r.is_raw = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -115,8 +118,9 @@ fn (r Readline) read_char() int {
|
||||||
|
|
||||||
// Main function of the readline module
|
// Main function of the readline module
|
||||||
// Will loop and ingest characters until EOF or Enter
|
// Will loop and ingest characters until EOF or Enter
|
||||||
// Returns the completed line
|
// Returns the completed line as utf8 ustring
|
||||||
pub fn (r mut Readline) read_line_utf8(prompt string) ustring {
|
// Will return an error if line is empty
|
||||||
|
pub fn (r mut Readline) read_line_utf8(prompt string) ?ustring {
|
||||||
r.current = ''.ustring()
|
r.current = ''.ustring()
|
||||||
r.cursor = 0
|
r.cursor = 0
|
||||||
r.prompt = prompt
|
r.prompt = prompt
|
||||||
|
@ -128,6 +132,9 @@ pub fn (r mut Readline) read_line_utf8(prompt string) ustring {
|
||||||
else {
|
else {
|
||||||
r.previous_lines[0] = ''.ustring()
|
r.previous_lines[0] = ''.ustring()
|
||||||
}
|
}
|
||||||
|
if !r.is_raw {
|
||||||
|
r.enable_raw_mode2()
|
||||||
|
}
|
||||||
|
|
||||||
print(r.prompt)
|
print(r.prompt)
|
||||||
for {
|
for {
|
||||||
|
@ -137,13 +144,42 @@ pub fn (r mut Readline) read_line_utf8(prompt string) ustring {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
r.previous_lines[0] = ''.ustring()
|
r.previous_lines[0] = ''.ustring()
|
||||||
r.search_index = 0
|
r.search_index = 0
|
||||||
|
r.disable_raw_mode()
|
||||||
|
if r.current.s == '' {
|
||||||
|
return error('empty line')
|
||||||
|
}
|
||||||
return r.current
|
return r.current
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (r mut Readline) read_line(prompt string) string {
|
// Returns the string from the utf8 ustring
|
||||||
return r.read_line_utf8(prompt).s
|
pub fn (r mut Readline) read_line(prompt string) ?string {
|
||||||
|
s := r.read_line_utf8(prompt) or {
|
||||||
|
return error(err)
|
||||||
|
}
|
||||||
|
return s.s
|
||||||
|
}
|
||||||
|
|
||||||
|
// Standalone function without persistent functionnalities (eg: history)
|
||||||
|
// Returns utf8 based ustring
|
||||||
|
pub fn read_line_utf8(prompt string) ?ustring {
|
||||||
|
mut r := Readline{}
|
||||||
|
s := r.read_line_utf8(prompt) or {
|
||||||
|
return error(err)
|
||||||
|
}
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
// Standalone function without persistent functionnalities (eg: history)
|
||||||
|
// Return string from utf8 ustring
|
||||||
|
pub fn read_line(prompt string) ?string {
|
||||||
|
mut r := Readline{}
|
||||||
|
s := r.read_line(prompt) or {
|
||||||
|
return error(err)
|
||||||
|
}
|
||||||
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (r Readline) analyse(c byte) Action {
|
fn (r Readline) analyse(c byte) Action {
|
||||||
|
|
Loading…
Reference in New Issue