diff --git a/examples/clock/clock.q b/examples/clock/clock.q index 2b8c304..9234c04 100644 --- a/examples/clock/clock.q +++ b/examples/clock/clock.q @@ -6,8 +6,7 @@ main() { loop { elapsed := time.since(start) - io.write(elapsed / time.second) - io.write("\n") + io.writeLine(elapsed / time.second) time.sleep(time.second - elapsed % time.second) } } \ No newline at end of file diff --git a/examples/shell/shell.q b/examples/shell/shell.q index 3d468a8..20ddf1e 100644 --- a/examples/shell/shell.q +++ b/examples/shell/shell.q @@ -30,7 +30,6 @@ execute(path string) { if err != 0 { io.write("error executing: ") - io.write(path) - io.write("\n") + io.writeLine(path) } } \ No newline at end of file diff --git a/lib/io/init_windows.q b/lib/io/init_windows.q index 9ec7cf9..c67d93c 100644 --- a/lib/io/init_windows.q +++ b/lib/io/init_windows.q @@ -1,15 +1,23 @@ init() { kernel32.SetConsoleCP(utf8) kernel32.SetConsoleOutputCP(utf8) + stdin = kernel32.GetStdHandle(-10) + stdout = kernel32.GetStdHandle(-11) +} + +global { + stdin int64 + stdout int64 +} + +const { + utf8 = 65001 } extern { kernel32 { + GetStdHandle(device int64) -> (handle int64) SetConsoleCP(cp uint) SetConsoleOutputCP(cp uint) } -} - -const { - utf8 = 65001 } \ No newline at end of file diff --git a/lib/io/io_windows.q b/lib/io/io_windows.q deleted file mode 100644 index 5286ea5..0000000 --- a/lib/io/io_windows.q +++ /dev/null @@ -1,51 +0,0 @@ -read(buffer string) -> (read int) { - stdin := kernel32.GetStdHandle(-10) - ptr := new(uint32) - kernel32.ReadFile(stdin, buffer.ptr, buffer.len as uint32, ptr, 0) - count := [ptr] - delete(ptr) - return count as int -} - -readFrom(fd int, buffer string) -> (read int, err error) { - ptr := new(uint32) - success := kernel32.ReadFile(fd, buffer.ptr, buffer.len as uint32, ptr, 0) - - if !success { - return 0, -1 - } - - count := [ptr] - delete(ptr) - return count as int, 0 -} - -write(buffer string) -> (written int) { - stdout := kernel32.GetStdHandle(-11) - ptr := new(uint32) - kernel32.WriteFile(stdout, buffer.ptr, buffer.len as uint32, ptr, 0) - count := [ptr] - delete(ptr) - return count as int -} - -writeTo(fd int, buffer string) -> (written int, err error) { - ptr := new(uint32) - success := kernel32.WriteFile(fd, buffer.ptr, buffer.len as uint32, ptr, 0) - - if !success { - return 0, -1 - } - - count := [ptr] - delete(ptr) - return count as int, 0 -} - -extern { - kernel32 { - GetStdHandle(device int64) -> (handle int64) - ReadFile(fd int64, buffer *byte, length uint32, read *uint32, overlapped *any|nil) -> (success bool) - WriteFile(fd int64, buffer *byte, length uint32, written *uint32, overlapped *any|nil) -> (success bool) - } -} \ No newline at end of file diff --git a/lib/io/read_unix.q b/lib/io/read_unix.q new file mode 100644 index 0000000..56e41b1 --- /dev/null +++ b/lib/io/read_unix.q @@ -0,0 +1,13 @@ +read(buffer string) -> (read int) { + return syscall(_read, 0, buffer.ptr, buffer.len) +} + +readFrom(fd int, buffer string) -> (read int, err error) { + n := syscall(_read, fd, buffer.ptr, buffer.len) + + if n < 0 { + return 0, n + } + + return n, 0 +} \ No newline at end of file diff --git a/lib/io/read_windows.q b/lib/io/read_windows.q new file mode 100644 index 0000000..c947535 --- /dev/null +++ b/lib/io/read_windows.q @@ -0,0 +1,26 @@ +read(buffer string) -> (read int) { + ptr := new(uint32) + kernel32.ReadFile(stdin, buffer.ptr, buffer.len as uint32, ptr, 0) + count := [ptr] + delete(ptr) + return count as int +} + +readFrom(fd int, buffer string) -> (read int, err error) { + ptr := new(uint32) + success := kernel32.ReadFile(fd, buffer.ptr, buffer.len as uint32, ptr, 0) + + if !success { + return 0, -1 + } + + count := [ptr] + delete(ptr) + return count as int, 0 +} + +extern { + kernel32 { + ReadFile(fd int64, buffer *byte, length uint32, read *uint32, overlapped *any|nil) -> (success bool) + } +} \ No newline at end of file diff --git a/lib/io/write[int].q b/lib/io/writeDigits.q similarity index 69% rename from lib/io/write[int].q rename to lib/io/writeDigits.q index 4dc55a2..286befb 100644 --- a/lib/io/write[int].q +++ b/lib/io/writeDigits.q @@ -3,12 +3,12 @@ write(n int) { write("-") } - writeInt(n, 10) + writeDigits(n, 10) } -writeInt(n int, base int) { +writeDigits(n int, base int) { if n >= base || n <= -base { - writeInt(n / base, base) + writeDigits(n / base, base) } writeDigit(n % base) diff --git a/lib/io/writeLine.q b/lib/io/writeLine.q new file mode 100644 index 0000000..b7c35ae --- /dev/null +++ b/lib/io/writeLine.q @@ -0,0 +1,9 @@ +writeLine(buffer string) { + write(buffer) + write("\n") +} + +writeLine(number int) { + write(number) + write("\n") +} \ No newline at end of file diff --git a/lib/io/io_unix.q b/lib/io/write_unix.q similarity index 50% rename from lib/io/io_unix.q rename to lib/io/write_unix.q index 927e5f1..7fba751 100644 --- a/lib/io/io_unix.q +++ b/lib/io/write_unix.q @@ -1,17 +1,3 @@ -read(buffer string) -> (read int) { - return syscall(_read, 0, buffer.ptr, buffer.len) -} - -readFrom(fd int, buffer string) -> (read int, err error) { - n := syscall(_read, fd, buffer.ptr, buffer.len) - - if n < 0 { - return 0, n - } - - return n, 0 -} - write(buffer string) -> (written int) { return syscall(_write, 1, buffer.ptr, buffer.len) } diff --git a/lib/io/write_windows.q b/lib/io/write_windows.q new file mode 100644 index 0000000..112d68d --- /dev/null +++ b/lib/io/write_windows.q @@ -0,0 +1,26 @@ +write(buffer string) -> (written int) { + ptr := new(uint32) + kernel32.WriteFile(stdout, buffer.ptr, buffer.len as uint32, ptr, 0) + count := [ptr] + delete(ptr) + return count as int +} + +writeTo(fd int, buffer string) -> (written int, err error) { + ptr := new(uint32) + success := kernel32.WriteFile(fd, buffer.ptr, buffer.len as uint32, ptr, 0) + + if !success { + return 0, -1 + } + + count := [ptr] + delete(ptr) + return count as int, 0 +} + +extern { + kernel32 { + WriteFile(fd int64, buffer *byte, length uint32, written *uint32, overlapped *any|nil) -> (success bool) + } +} \ No newline at end of file diff --git a/tests/array-int-fixed-offset.q b/tests/array-int-fixed-offset.q index acd03f5..544e24e 100644 --- a/tests/array-int-fixed-offset.q +++ b/tests/array-int-fixed-offset.q @@ -14,12 +14,8 @@ fill(x []int) { } show(x []int) { - io.write(x[127]) - io.write("\n") - io.write(x[128]) - io.write("\n") - io.write(x[4095]) - io.write("\n") - io.write(x[4096]) - io.write("\n") + io.writeLine(x[127]) + io.writeLine(x[128]) + io.writeLine(x[4095]) + io.writeLine(x[4096]) } \ No newline at end of file diff --git a/tests/cli-args.q b/tests/cli-args.q index 5f1f325..2c1f22f 100644 --- a/tests/cli-args.q +++ b/tests/cli-args.q @@ -5,7 +5,6 @@ main() { args := cli.args() loop i := 1..args.len { - io.write(args[i]) - io.write("\n") + io.writeLine(args[i]) } } \ No newline at end of file diff --git a/tests/limits.q b/tests/limits.q index 2e27a2b..2668126 100644 --- a/tests/limits.q +++ b/tests/limits.q @@ -2,20 +2,12 @@ import io import math main() { - io.write(math.maxInt8) - io.write("\n") - io.write(math.minInt8) - io.write("\n") - io.write(math.maxInt16) - io.write("\n") - io.write(math.minInt16) - io.write("\n") - io.write(math.maxInt32) - io.write("\n") - io.write(math.minInt32) - io.write("\n") - io.write(math.maxInt64) - io.write("\n") - io.write(math.minInt64) - io.write("\n") + io.writeLine(math.maxInt8) + io.writeLine(math.minInt8) + io.writeLine(math.maxInt16) + io.writeLine(math.minInt16) + io.writeLine(math.maxInt32) + io.writeLine(math.minInt32) + io.writeLine(math.maxInt64) + io.writeLine(math.minInt64) } \ No newline at end of file diff --git a/tests/loop-next.q b/tests/loop-next.q index dc86d8d..a40cec9 100644 --- a/tests/loop-next.q +++ b/tests/loop-next.q @@ -6,7 +6,6 @@ main() { loop.next() } - io.write(i) - io.write("\n") + io.writeLine(i) } } \ No newline at end of file