90 lines
1.9 KiB
V
90 lines
1.9 KiB
V
module os
|
|
|
|
pub struct File {
|
|
cfile voidptr // Using void* instead of FILE*
|
|
pub:
|
|
fd int
|
|
pub mut:
|
|
is_opened bool
|
|
}
|
|
|
|
struct FileInfo {
|
|
name string
|
|
size int
|
|
}
|
|
|
|
[deprecated]
|
|
pub fn (f File) is_opened() bool {
|
|
eprintln('warning: `file.is_opened()` has been deprecated, use `file.is_opened` instead')
|
|
return f.is_opened
|
|
}
|
|
|
|
// **************************** Write ops ***************************
|
|
pub fn (mut f File) write(s string) {
|
|
if !f.is_opened {
|
|
return
|
|
}
|
|
/*
|
|
$if linux {
|
|
$if !android {
|
|
C.syscall(sys_write, f.fd, s.str, s.len)
|
|
return
|
|
}
|
|
}
|
|
*/
|
|
C.fwrite(s.str, s.len, 1, f.cfile)
|
|
}
|
|
|
|
pub fn (mut f File) writeln(s string) {
|
|
if !f.is_opened {
|
|
return
|
|
}
|
|
/*
|
|
$if linux {
|
|
$if !android {
|
|
snl := s + '\n'
|
|
C.syscall(sys_write, f.fd, snl.str, snl.len)
|
|
return
|
|
}
|
|
}
|
|
*/
|
|
// TODO perf
|
|
C.fwrite(s.str, s.len, 1, f.cfile)
|
|
C.fputs('\n', f.cfile)
|
|
}
|
|
|
|
pub fn (mut f File) write_bytes(data voidptr, size int) int {
|
|
return C.fwrite(data, 1, size, f.cfile)
|
|
}
|
|
|
|
pub fn (mut f File) write_bytes_at(data voidptr, size, pos int) int {
|
|
C.fseek(f.cfile, pos, C.SEEK_SET)
|
|
res := C.fwrite(data, 1, size, f.cfile)
|
|
C.fseek(f.cfile, 0, C.SEEK_END)
|
|
return res
|
|
}
|
|
|
|
// **************************** 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)
|
|
}
|
|
|
|
// read_bytes_at reads an amount of bytes at the given position in the file
|
|
pub fn (f &File) read_bytes_at(size, pos int) []byte {
|
|
mut arr := [`0`].repeat(size)
|
|
C.fseek(f.cfile, pos, C.SEEK_SET)
|
|
nreadbytes := C.fread(arr.data, 1, size, f.cfile)
|
|
C.fseek(f.cfile, 0, C.SEEK_SET)
|
|
return arr[0..nreadbytes]
|
|
}
|
|
|
|
// **************************** Utility ops ***********************
|
|
// write any unwritten data in stream's buffer
|
|
pub fn (mut f File) flush() {
|
|
if !f.is_opened {
|
|
return
|
|
}
|
|
C.fflush(f.cfile)
|
|
}
|