mirror of
https://github.com/odin-lang/Odin.git
synced 2026-01-05 04:27:51 +00:00
107 lines
2.2 KiB
Odin
107 lines
2.2 KiB
Odin
#load "win32.odin"
|
|
|
|
File :: type struct {
|
|
Handle :: type HANDLE
|
|
handle: Handle
|
|
}
|
|
|
|
file_open :: proc(name: string) -> (File, bool) {
|
|
buf: [300]byte
|
|
_ = copy(buf[:], name as []byte)
|
|
f := File{CreateFileA(^buf[0], FILE_GENERIC_READ, FILE_SHARE_READ, null, OPEN_EXISTING, 0, null)}
|
|
success := f.handle != INVALID_HANDLE_VALUE as File.Handle
|
|
|
|
return f, success
|
|
}
|
|
|
|
file_create :: proc(name: string) -> (File, bool) {
|
|
buf: [300]byte
|
|
_ = copy(buf[:], name as []byte)
|
|
f := File{
|
|
handle = CreateFileA(^buf[0], FILE_GENERIC_WRITE, FILE_SHARE_READ, null, CREATE_ALWAYS, 0, null),
|
|
}
|
|
success := f.handle != INVALID_HANDLE_VALUE as File.Handle
|
|
return f, success
|
|
}
|
|
|
|
|
|
file_close :: proc(f: ^File) {
|
|
CloseHandle(f.handle)
|
|
}
|
|
|
|
file_write :: proc(f: ^File, buf: []byte) -> bool {
|
|
bytes_written: i32
|
|
return WriteFile(f.handle, ^buf[0], buf.count as i32, ^bytes_written, null) != 0
|
|
}
|
|
|
|
File_Standard :: type enum {
|
|
INPUT,
|
|
OUTPUT,
|
|
ERROR,
|
|
COUNT,
|
|
}
|
|
|
|
|
|
__std_files := __set_file_standards();
|
|
|
|
__set_file_standards :: proc() -> [File_Standard.COUNT as int]File {
|
|
return [File_Standard.COUNT as int]File{
|
|
File{handle = GetStdHandle(STD_INPUT_HANDLE)},
|
|
File{handle = GetStdHandle(STD_OUTPUT_HANDLE)},
|
|
File{handle = GetStdHandle(STD_ERROR_HANDLE)},
|
|
}
|
|
}
|
|
|
|
file_get_standard :: proc(std: File_Standard) -> ^File {
|
|
return ^__std_files[std]
|
|
}
|
|
|
|
|
|
read_entire_file :: proc(name: string) -> (string, bool) {
|
|
buf: [300]byte
|
|
_ = copy(buf[:], name as []byte)
|
|
c_string := ^buf[0]
|
|
|
|
|
|
f, file_ok := file_open(name)
|
|
if !file_ok {
|
|
return "", false
|
|
}
|
|
defer file_close(^f)
|
|
|
|
length: i64
|
|
file_size_ok := GetFileSizeEx(f.handle as HANDLE, ^length) != 0
|
|
if !file_size_ok {
|
|
return "", false
|
|
}
|
|
|
|
data := new_slice(u8, length)
|
|
if ^data[0] == null {
|
|
return "", false
|
|
}
|
|
|
|
single_read_length: i32
|
|
total_read: i64
|
|
|
|
for total_read < length {
|
|
remaining := length - total_read
|
|
to_read: u32
|
|
MAX :: 0x7fffffff
|
|
if remaining <= MAX {
|
|
to_read = remaining as u32
|
|
} else {
|
|
to_read = MAX
|
|
}
|
|
|
|
ReadFile(f.handle as HANDLE, ^data[total_read], to_read, ^single_read_length, null)
|
|
if single_read_length <= 0 {
|
|
free(^data[0])
|
|
return "", false
|
|
}
|
|
|
|
total_read += single_read_length as i64
|
|
}
|
|
|
|
return data as string, true
|
|
}
|