diff --git a/compiler/main.v b/compiler/main.v index e738599b39..d8ce1cf2ba 100644 --- a/compiler/main.v +++ b/compiler/main.v @@ -937,10 +937,6 @@ fn new_v(args[]string) *V { } fn run_repl() []string { - $if windows { - println('REPL does not work on Windows yet, sorry!') - exit(1) - } println('V $Version') 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') diff --git a/vlib/os/os.v b/vlib/os/os.v index 142d48e891..902be9b9ed 100644 --- a/vlib/os/os.v +++ b/vlib/os/os.v @@ -405,34 +405,39 @@ pub fn filename(path string) string { } // 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 { - $if windows { - panic('get_line() not implemented on Windows yet, sorry!') - } - $else { - max := u64(256) - buf := malloc(int(max)) - 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) - } + str := get_raw_line() + if str[str.len - 1] == `\n` { + return str.substr(0, str.len - 1) + } + + return str } +const( + STD_INPUT_HANDLE = -10 +) + // get_raw_line returns a one-line string from stdin along with '\n' if there is any pub fn get_raw_line() string { $if windows { - panic('get_raw_line() not implemented on Windows yet, sorry!') - } - $else { + 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 { + //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) buf := malloc(int(max)) nr_chars := C.getline(&buf, &max, stdin)