From 2ce5797ec22ab9de10f426b017e4f564139fba62 Mon Sep 17 00:00:00 2001 From: Maciej Obarski Date: Fri, 28 Aug 2020 14:24:00 +0200 Subject: [PATCH] os: vfopen returns option now (#6244) --- vlib/os/os.v | 37 ++++++++++++++----------------------- vlib/os/os_windows.c.v | 5 +---- 2 files changed, 15 insertions(+), 27 deletions(-) diff --git a/vlib/os/os.v b/vlib/os/os.v index 61f9fed758..80395afade 100644 --- a/vlib/os/os.v +++ b/vlib/os/os.v @@ -10,10 +10,7 @@ pub const ( // read_bytes returns all bytes read from file in `path`. pub fn read_bytes(path string) ?[]byte { - mut fp := vfopen(path, 'rb') - if isnil(fp) { - return error('failed to open file "$path"') - } + mut fp := vfopen(path, 'rb')? C.fseek(fp, 0, C.SEEK_END) fsize := C.ftell(fp) C.rewind(fp) @@ -27,10 +24,7 @@ pub fn read_bytes(path string) ?[]byte { // read_file reads the file in `path` and returns the contents. pub fn read_file(path string) ?string { mode := 'rb' - mut fp := vfopen(path, mode) - if isnil(fp) { - return error('failed to open file "$path"') - } + mut fp := vfopen(path, mode)? defer { C.fclose(fp) } C.fseek(fp, 0, C.SEEK_END) fsize := C.ftell(fp) @@ -181,11 +175,17 @@ pub fn mv_by_cp(source string, target string) ? { // vfopen returns an opened C file, given its path and open mode. // NB: os.vfopen is useful for compatibility with C libraries, that expect `FILE *`. // If you write pure V code, os.create or os.open are more convenient. -pub fn vfopen(path, mode string) &C.FILE { +pub fn vfopen(path, mode string) ?&C.FILE { + mut fp := voidptr(0) $if windows { - return C._wfopen(path.to_wide(), mode.to_wide()) + fp = C._wfopen(path.to_wide(), mode.to_wide()) } $else { - return C.fopen(charptr(path.str), charptr(mode.str)) + fp = C.fopen(charptr(path.str), charptr(mode.str)) + } + if isnil(fp) { + return error('failed to open file "$path"') + } else { + return fp } } @@ -843,10 +843,7 @@ pub fn read_file_array(path string) []T { a := T{} tsize := int(sizeof(a)) // prepare for reading, get current file size - mut fp := vfopen(path, 'rb') - if isnil(fp) { - return array{} - } + mut fp := vfopen(path, 'rb') or { return array{} } C.fseek(fp, 0, C.SEEK_END) fsize := C.ftell(fp) C.rewind(fp) @@ -1342,10 +1339,7 @@ pub fn open(path string) ?File { } } */ - cfile := vfopen(path, 'rb') - if cfile == voidptr(0) { - return error('failed to open file "$path"') - } + cfile := vfopen(path, 'rb')? fd := fileno(cfile) return File { cfile: cfile @@ -1379,10 +1373,7 @@ pub fn create(path string) ?File { } } */ - cfile := vfopen(path, 'wb') - if cfile == voidptr(0) { - return error('failed to create file "$path"') - } + cfile := vfopen(path, 'wb')? fd := fileno(cfile) return File { cfile: cfile diff --git a/vlib/os/os_windows.c.v b/vlib/os/os_windows.c.v index f817d7a2ad..1f0adf07d4 100644 --- a/vlib/os/os_windows.c.v +++ b/vlib/os/os_windows.c.v @@ -146,10 +146,7 @@ pub fn mkdir(path string) ?bool { // Ref - https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/get-osfhandle?view=vs-2019 // get_file_handle retrieves the operating-system file handle that is associated with the specified file descriptor. pub fn get_file_handle(path string) HANDLE { - cfile := vfopen(path, 'rb') - if cfile == voidptr(0) { - return HANDLE(invalid_handle_value) - } + cfile := vfopen(path, 'rb') or { return HANDLE(invalid_handle_value) } handle := HANDLE(C._get_osfhandle(fileno(cfile))) // CreateFile? - hah, no -_- return handle }