implement get_line & get_raw_line for windows + REPL
parent
b9586a4017
commit
4ed67fbe7e
|
@ -937,10 +937,6 @@ fn new_v(args[]string) *V {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_repl() []string {
|
fn run_repl() []string {
|
||||||
$if windows {
|
|
||||||
println('REPL does not work on Windows yet, sorry!')
|
|
||||||
exit(1)
|
|
||||||
}
|
|
||||||
println('V $Version')
|
println('V $Version')
|
||||||
println('Use Ctrl-D or `exit` to exit')
|
println('Use Ctrl-D or `exit` to exit')
|
||||||
println('For now you have to use println() to print values, this will be fixed soon\n')
|
println('For now you have to use println() to print values, this will be fixed soon\n')
|
||||||
|
|
45
vlib/os/os.v
45
vlib/os/os.v
|
@ -405,34 +405,39 @@ pub fn filename(path string) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// get_line returns a one-line string from stdin
|
// get_line returns a one-line string from stdin
|
||||||
//u64 is used because C.getline needs a size_t as second argument
|
|
||||||
//Otherwise, it would cause a valgrind warning and may be dangerous
|
|
||||||
//Malloc takes an int as argument so a cast has to be made
|
|
||||||
pub fn get_line() string {
|
pub fn get_line() string {
|
||||||
$if windows {
|
str := get_raw_line()
|
||||||
panic('get_line() not implemented on Windows yet, sorry!')
|
if str[str.len - 1] == `\n` {
|
||||||
}
|
return str.substr(0, str.len - 1)
|
||||||
$else {
|
}
|
||||||
max := u64(256)
|
|
||||||
buf := malloc(int(max))
|
return str
|
||||||
nr_chars := C.getline(&buf, &max, stdin)
|
|
||||||
if nr_chars == 0 {
|
|
||||||
return ''
|
|
||||||
}
|
|
||||||
if buf[nr_chars - 1] == `\n` { // newline
|
|
||||||
return tos(buf, nr_chars - 1)
|
|
||||||
}
|
|
||||||
// To prevent cutting end of line if no newline
|
|
||||||
return tos(buf, nr_chars)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const(
|
||||||
|
STD_INPUT_HANDLE = -10
|
||||||
|
)
|
||||||
|
|
||||||
// get_raw_line returns a one-line string from stdin along with '\n' if there is any
|
// get_raw_line returns a one-line string from stdin along with '\n' if there is any
|
||||||
pub fn get_raw_line() string {
|
pub fn get_raw_line() string {
|
||||||
$if windows {
|
$if windows {
|
||||||
panic('get_raw_line() not implemented on Windows yet, sorry!')
|
max := 256
|
||||||
|
buf := malloc(max)
|
||||||
|
// TODO: Use HANDLE instead of voidptr
|
||||||
|
h_input := voidptr(C.GetStdHandle(STD_INPUT_HANDLE))
|
||||||
|
nr_chars := 0
|
||||||
|
// NOTE: Once we have UTF8 encode function to
|
||||||
|
// convert utf16 to utf8, change to ReadConsoleW
|
||||||
|
C.ReadConsole(h_input, buf, max, &nr_chars, 0)
|
||||||
|
if nr_chars == 0 {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
return tos(buf, nr_chars)
|
||||||
}
|
}
|
||||||
$else {
|
$else {
|
||||||
|
//u64 is used because C.getline needs a size_t as second argument
|
||||||
|
//Otherwise, it would cause a valgrind warning and may be dangerous
|
||||||
|
//Malloc takes an int as argument so a cast has to be made
|
||||||
max := u64(256)
|
max := u64(256)
|
||||||
buf := malloc(int(max))
|
buf := malloc(int(max))
|
||||||
nr_chars := C.getline(&buf, &max, stdin)
|
nr_chars := C.getline(&buf, &max, stdin)
|
||||||
|
|
Loading…
Reference in New Issue