os: move file logic to file.v (#6013)
parent
055117dc5f
commit
d71c11577a
|
@ -0,0 +1,89 @@
|
||||||
|
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)
|
||||||
|
}
|
112
vlib/os/os.v
112
vlib/os/os.v
|
@ -8,91 +8,6 @@ pub const (
|
||||||
max_path_len = 4096
|
max_path_len = 4096
|
||||||
)
|
)
|
||||||
|
|
||||||
pub struct File {
|
|
||||||
cfile voidptr // Using void* instead of FILE*
|
|
||||||
pub:
|
|
||||||
fd int
|
|
||||||
mut:
|
|
||||||
opened bool
|
|
||||||
}
|
|
||||||
|
|
||||||
struct FileInfo {
|
|
||||||
name string
|
|
||||||
size int
|
|
||||||
}
|
|
||||||
|
|
||||||
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.fwrite(s.str, s.len, 1, 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.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 {
|
|
||||||
//$if linux {
|
|
||||||
//}
|
|
||||||
//$else {
|
|
||||||
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]
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
pub fn read_bytes(path string) ?[]byte {
|
pub fn read_bytes(path string) ?[]byte {
|
||||||
mut fp := vfopen(path, 'rb')
|
mut fp := vfopen(path, 'rb')
|
||||||
if isnil(fp) {
|
if isnil(fp) {
|
||||||
|
@ -128,15 +43,6 @@ pub fn read_file(path string) ?string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/***************************** Utility ops ************************/
|
|
||||||
|
|
||||||
pub fn (mut f File) flush() {
|
|
||||||
if !f.opened {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
C.fflush(f.cfile)
|
|
||||||
}
|
|
||||||
|
|
||||||
/***************************** OS ops ************************/
|
/***************************** OS ops ************************/
|
||||||
// file_size returns the size of the file located in `path`.
|
// file_size returns the size of the file located in `path`.
|
||||||
pub fn file_size(path string) int {
|
pub fn file_size(path string) int {
|
||||||
|
@ -155,6 +61,7 @@ pub fn file_size(path string) int {
|
||||||
return s.st_size
|
return s.st_size
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// move files or folders from one path to other
|
||||||
pub fn mv(old, new string) {
|
pub fn mv(old, new string) {
|
||||||
$if windows {
|
$if windows {
|
||||||
C._wrename(old.to_wide(), new.to_wide())
|
C._wrename(old.to_wide(), new.to_wide())
|
||||||
|
@ -163,6 +70,7 @@ pub fn mv(old, new string) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// copies files or folders from one path to other
|
||||||
pub fn cp(old, new string) ? {
|
pub fn cp(old, new string) ? {
|
||||||
$if windows {
|
$if windows {
|
||||||
w_old := old.replace('/', '\\')
|
w_old := old.replace('/', '\\')
|
||||||
|
@ -327,7 +235,7 @@ pub fn open_append(path string) ?File {
|
||||||
if isnil(file.cfile) {
|
if isnil(file.cfile) {
|
||||||
return error('failed to create(append) file "$path"')
|
return error('failed to create(append) file "$path"')
|
||||||
}
|
}
|
||||||
file.opened = true
|
file.is_opened = true
|
||||||
return file
|
return file
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -379,7 +287,7 @@ pub fn open_file(path string, mode string, options ...int) ?File {
|
||||||
return File{
|
return File{
|
||||||
cfile: cfile
|
cfile: cfile
|
||||||
fd: fd
|
fd: fd
|
||||||
opened: true
|
is_opened: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -594,9 +502,11 @@ pub fn is_executable(path string) bool {
|
||||||
}
|
}
|
||||||
$if solaris {
|
$if solaris {
|
||||||
statbuf := C.stat{}
|
statbuf := C.stat{}
|
||||||
|
unsafe {
|
||||||
if C.stat(charptr(path.str), &statbuf) != 0 {
|
if C.stat(charptr(path.str), &statbuf) != 0 {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return (int(statbuf.st_mode) & ( s_ixusr | s_ixgrp | s_ixoth )) != 0
|
return (int(statbuf.st_mode) & ( s_ixusr | s_ixgrp | s_ixoth )) != 0
|
||||||
}
|
}
|
||||||
return C.access(charptr(path.str), x_ok) != -1
|
return C.access(charptr(path.str), x_ok) != -1
|
||||||
|
@ -1010,7 +920,9 @@ pub fn executable() string {
|
||||||
mut result := vcalloc(max_path_len)
|
mut result := vcalloc(max_path_len)
|
||||||
mib := [1/* CTL_KERN */, 14/* KERN_PROC */, 12/* KERN_PROC_PATHNAME */, -1]
|
mib := [1/* CTL_KERN */, 14/* KERN_PROC */, 12/* KERN_PROC_PATHNAME */, -1]
|
||||||
size := max_path_len
|
size := max_path_len
|
||||||
|
unsafe {
|
||||||
C.sysctl(mib.data, 4, result, &size, 0, 0)
|
C.sysctl(mib.data, 4, result, &size, 0, 0)
|
||||||
|
}
|
||||||
return string(result)
|
return string(result)
|
||||||
}
|
}
|
||||||
// "Sadly there is no way to get the full path of the executed file in OpenBSD."
|
// "Sadly there is no way to get the full path of the executed file in OpenBSD."
|
||||||
|
@ -1404,7 +1316,7 @@ pub fn open(path string) ?File {
|
||||||
}
|
}
|
||||||
return File{
|
return File{
|
||||||
fd: fd
|
fd: fd
|
||||||
opened: true
|
is_opened: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1417,7 +1329,7 @@ pub fn open(path string) ?File {
|
||||||
return File {
|
return File {
|
||||||
cfile: cfile
|
cfile: cfile
|
||||||
fd: fd
|
fd: fd
|
||||||
opened: true
|
is_opened: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1440,7 +1352,7 @@ pub fn create(path string) ?File {
|
||||||
}
|
}
|
||||||
file = File{
|
file = File{
|
||||||
fd: fd
|
fd: fd
|
||||||
opened: true
|
is_opened: true
|
||||||
}
|
}
|
||||||
return file
|
return file
|
||||||
}
|
}
|
||||||
|
@ -1454,7 +1366,7 @@ pub fn create(path string) ?File {
|
||||||
return File {
|
return File {
|
||||||
cfile: cfile
|
cfile: cfile
|
||||||
fd: fd
|
fd: fd
|
||||||
opened: true
|
is_opened: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,8 +20,6 @@ pub const (
|
||||||
sys_creat = 85
|
sys_creat = 85
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
// TODO no pub => error
|
// TODO no pub => error
|
||||||
pub fn write(fd int, data voidptr, nbytes int) int {
|
pub fn write(fd int, data voidptr, nbytes int) int {
|
||||||
|
@ -47,9 +45,4 @@ pub fn malloc(n int) byteptr {
|
||||||
println('malloc($n)')
|
println('malloc($n)')
|
||||||
return mmap(0, n, 3, 4098, //prot_read|prot_write,
|
return mmap(0, n, 3, 4098, //prot_read|prot_write,
|
||||||
-1,0) //map_private|map_anonymous,
|
-1,0) //map_private|map_anonymous,
|
||||||
}
|
|
||||||
|
|
||||||
pub fn free(b byteptr) {
|
|
||||||
|
|
||||||
}
|
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -171,10 +171,10 @@ pub fn get_error_msg(code int) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (mut f File) close() {
|
pub fn (mut f File) close() {
|
||||||
if !f.opened {
|
if !f.is_opened {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
f.opened = false
|
f.is_opened = false
|
||||||
/*
|
/*
|
||||||
$if linux {
|
$if linux {
|
||||||
$if !android {
|
$if !android {
|
||||||
|
|
|
@ -305,10 +305,10 @@ pub fn symlink(origin, target string) ?bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (mut f File) close() {
|
pub fn (mut f File) close() {
|
||||||
if !f.opened {
|
if !f.is_opened {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
f.opened = false
|
f.is_opened = false
|
||||||
C.fflush(f.cfile)
|
C.fflush(f.cfile)
|
||||||
C.fclose(f.cfile)
|
C.fclose(f.cfile)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue