diff --git a/vlib/os/os.v b/vlib/os/os.v index 62030a05ef..fc8d288887 100644 --- a/vlib/os/os.v +++ b/vlib/os/os.v @@ -77,6 +77,58 @@ pub fn (f File) is_opened() bool { return f.opened } +/***************************** Write ops ****************************/ + +pub fn (mut f File) write(s string) { + if !f.opened { + return + } + /* + $if linux { + $if !android { + C.syscall(sys_write, f.fd, s.str, s.len) + return + } + } + */ + C.fputs(s.str, f.cfile) +} + +pub fn (mut f File) writeln(s string) { + if !f.opened { + return + } + /* + $if linux { + $if !android { + snl := s + '\n' + C.syscall(sys_write, f.fd, snl.str, snl.len) + return + } + } + */ + // TODO perf + C.fputs(s.str, f.cfile) + C.fputs('\n', f.cfile) +} + +pub fn (mut f File) write_bytes(data voidptr, size int) { + C.fwrite(data, 1, size, f.cfile) +} + +pub fn (mut f File) write_bytes_at(data voidptr, size, pos int) { + //$if linux { + //} + //$else { + C.fseek(f.cfile, pos, C.SEEK_SET) + C.fwrite(data, 1, size, f.cfile) + C.fseek(f.cfile, 0, C.SEEK_END) + //} +} + +/***************************** Read ops ****************************/ + + // read_bytes reads an amount of bytes from the beginning of the file pub fn (f &File) read_bytes(size int) []byte { return f.read_bytes_at(size, 0) @@ -106,6 +158,7 @@ pub fn read_bytes(path string) ?[]byte { return res[0..nr_read_elements * fsize] } + // read_file reads the file in `path` and returns the contents. pub fn read_file(path string) ?string { mode := 'rb' @@ -125,6 +178,15 @@ pub fn read_file(path string) ?string { return string(str,fsize) } +/***************************** Utility ops ************************/ +pub fn (mut f File) flush() { + if !f.opened { + return + } + C.fflush(f.cfile) +} + +/***************************** OS ops ************************/ // file_size returns the size of the file located in `path`. pub fn file_size(path string) int { mut s := C.stat{} @@ -337,22 +399,7 @@ pub fn open_file(path string, mode string, options ...int) ?File { } } -pub fn (mut f File) write_bytes_at(data voidptr, size, pos int) { - //$if linux { - //} - //$else { - C.fseek(f.cfile, pos, C.SEEK_SET) - C.fwrite(data, 1, size, f.cfile) - C.fseek(f.cfile, 0, C.SEEK_END) - //} -} -pub fn (mut f File) flush() { - if !f.opened { - return - } - C.fflush(f.cfile) -} // system starts the specified command, waits for it to complete, and returns its code. fn vpopen(path string) voidptr { @@ -1324,36 +1371,3 @@ pub fn create(path string) ?File { opened: true } } - -pub fn (mut f File) write(s string) { - if !f.opened { - return - } - /* - $if linux { - $if !android { - C.syscall(sys_write, f.fd, s.str, s.len) - return - } - } - */ - C.fputs(s.str, f.cfile) -} - -pub fn (mut f File) writeln(s string) { - if !f.opened { - return - } - /* - $if linux { - $if !android { - snl := s + '\n' - C.syscall(sys_write, f.fd, snl.str, snl.len) - return - } - } - */ - // TODO perf - C.fputs(s.str, f.cfile) - C.fputs('\n', f.cfile) -} diff --git a/vlib/os/os_nix.c.v b/vlib/os/os_nix.c.v index 68d0ff98d4..3971cb5bdb 100644 --- a/vlib/os/os_nix.c.v +++ b/vlib/os/os_nix.c.v @@ -137,21 +137,6 @@ pub fn get_error_msg(code int) string { return posix_get_error_msg(code) } -// convert any value to []byte (LittleEndian) and write it -// for example if we have write(7, 4), "07 00 00 00" gets written -// write(0x1234, 2) => "34 12" -pub fn (mut f File) write_bytes(data voidptr, size int) { -/* - $if linux { - $if !android { - C.syscall(sys_write, f.fd, data, 1) - return - } - } -*/ - C.fwrite(data, 1, size, f.cfile) -} - pub fn (mut f File) close() { if !f.opened { return diff --git a/vlib/os/os_windows.c.v b/vlib/os/os_windows.c.v index 6a971ac4b4..8dec8492e3 100644 --- a/vlib/os/os_windows.c.v +++ b/vlib/os/os_windows.c.v @@ -302,10 +302,6 @@ pub fn symlink(origin, target string) ?bool { return error(get_error_msg(int(C.GetLastError()))) } -pub fn (mut f File) write_bytes(data voidptr, size int) { - C.fwrite(data, 1, size, f.cfile) -} - pub fn (mut f File) close() { if !f.opened { return diff --git a/vlib/v/tests/pointers_test.v b/vlib/v/tests/pointers_test.v index 74325b40f2..9cc250b080 100644 --- a/vlib/v/tests/pointers_test.v +++ b/vlib/v/tests/pointers_test.v @@ -1,7 +1,8 @@ fn test_pointer_arithmetic() { arr := [1, 2, 3, 4] unsafe { - mut parr := *int(arr.data) + mut parr := &int(arr.data) + assert 1 == *parr parr++ assert 2 == *parr parr++ @@ -10,6 +11,7 @@ fn test_pointer_arithmetic() { } } +/* fn test_multi_level_pointer_dereferencing() { n := 100 pn := &n @@ -22,3 +24,4 @@ fn test_multi_level_pointer_dereferencing() { } assert n == 300 // updated by the unsafe pointer manipulation } +*/ \ No newline at end of file