Skip to content

Commit f48e87d

Browse files
authored
Merge pull request #5930 from odin-lang/bill/os2-file-stream
`os2.File_Stream`
2 parents 5caaefd + e53bc16 commit f48e87d

File tree

9 files changed

+290
-82
lines changed

9 files changed

+290
-82
lines changed

base/intrinsics/intrinsics.odin

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,8 @@ type_polymorphic_record_parameter_value :: proc($T: typeid, index: int) -> $V --
215215
type_is_specialized_polymorphic_record :: proc($T: typeid) -> bool ---
216216
type_is_unspecialized_polymorphic_record :: proc($T: typeid) -> bool ---
217217

218-
type_is_subtype_of :: proc($T, $U: typeid) -> bool ---
218+
type_is_subtype_of :: proc($T, $U: typeid) -> bool ---
219+
type_is_superset_of :: proc($Super, $Sub: typeid) -> bool ---
219220

220221
type_field_index_of :: proc($T: typeid, $name: string) -> uintptr ---
221222

core/os/os2/file.odin

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@ import "base:runtime"
2222
*/
2323
File :: struct {
2424
impl: rawptr,
25-
stream: io.Stream,
26-
fstat: Fstat_Callback,
25+
stream: File_Stream,
2726
}
2827

2928
/*
@@ -218,7 +217,11 @@ name :: proc(f: ^File) -> string {
218217
*/
219218
close :: proc(f: ^File) -> Error {
220219
if f != nil {
221-
return io.close(f.stream)
220+
if f.stream.procedure == nil {
221+
return .Unsupported
222+
}
223+
_, err := f.stream.procedure(f, .Close, nil, 0, nil, runtime.nil_allocator())
224+
return err
222225
}
223226
return nil
224227
}
@@ -235,7 +238,10 @@ close :: proc(f: ^File) -> Error {
235238
*/
236239
seek :: proc(f: ^File, offset: i64, whence: io.Seek_From) -> (ret: i64, err: Error) {
237240
if f != nil {
238-
return io.seek(f.stream, offset, whence)
241+
if f.stream.procedure == nil {
242+
return 0, .Unsupported
243+
}
244+
return f.stream.procedure(f, .Seek, nil, offset, whence, runtime.nil_allocator())
239245
}
240246
return 0, .Invalid_File
241247
}
@@ -247,7 +253,12 @@ seek :: proc(f: ^File, offset: i64, whence: io.Seek_From) -> (ret: i64, err: Err
247253
*/
248254
read :: proc(f: ^File, p: []byte) -> (n: int, err: Error) {
249255
if f != nil {
250-
return io.read(f.stream, p)
256+
if f.stream.procedure == nil {
257+
return 0, .Unsupported
258+
}
259+
n64: i64
260+
n64, err = f.stream.procedure(f, .Read, p, 0, nil, runtime.nil_allocator())
261+
return int(n64), err
251262
}
252263
return 0, .Invalid_File
253264
}
@@ -260,7 +271,12 @@ read :: proc(f: ^File, p: []byte) -> (n: int, err: Error) {
260271
*/
261272
read_at :: proc(f: ^File, p: []byte, offset: i64) -> (n: int, err: Error) {
262273
if f != nil {
263-
return io.read_at(f.stream, p, offset)
274+
if f.stream.procedure == nil {
275+
return 0, .Unsupported
276+
}
277+
n64: i64
278+
n64, err = f.stream.procedure(f, .Read_At, p, offset, nil, runtime.nil_allocator())
279+
return int(n64), err
264280
}
265281
return 0, .Invalid_File
266282
}
@@ -272,7 +288,12 @@ read_at :: proc(f: ^File, p: []byte, offset: i64) -> (n: int, err: Error) {
272288
*/
273289
write :: proc(f: ^File, p: []byte) -> (n: int, err: Error) {
274290
if f != nil {
275-
return io.write(f.stream, p)
291+
if f.stream.procedure == nil {
292+
return 0, .Unsupported
293+
}
294+
n64: i64
295+
n64, err = f.stream.procedure(f, .Write, p, 0, nil, runtime.nil_allocator())
296+
return int(n64), err
276297
}
277298
return 0, .Invalid_File
278299
}
@@ -284,7 +305,12 @@ write :: proc(f: ^File, p: []byte) -> (n: int, err: Error) {
284305
*/
285306
write_at :: proc(f: ^File, p: []byte, offset: i64) -> (n: int, err: Error) {
286307
if f != nil {
287-
return io.write_at(f.stream, p, offset)
308+
if f.stream.procedure == nil {
309+
return 0, .Unsupported
310+
}
311+
n64: i64
312+
n64, err = f.stream.procedure(f, .Write_At, p, offset, nil, runtime.nil_allocator())
313+
return int(n64), err
288314
}
289315
return 0, .Invalid_File
290316
}
@@ -294,7 +320,18 @@ write_at :: proc(f: ^File, p: []byte, offset: i64) -> (n: int, err: Error) {
294320
*/
295321
file_size :: proc(f: ^File) -> (n: i64, err: Error) {
296322
if f != nil {
297-
return io.size(f.stream)
323+
if f.stream.procedure == nil {
324+
return 0, .Unsupported
325+
}
326+
n, err = f.stream.procedure(f, .Size, nil, 0, nil, runtime.nil_allocator())
327+
if err == .Unsupported {
328+
n = 0
329+
curr := seek(f, 0, .Current) or_return
330+
end := seek(f, 0, .End) or_return
331+
seek(f, curr, .Start) or_return
332+
n = end
333+
}
334+
return
298335
}
299336
return 0, .Invalid_File
300337
}
@@ -304,7 +341,11 @@ file_size :: proc(f: ^File) -> (n: i64, err: Error) {
304341
*/
305342
flush :: proc(f: ^File) -> Error {
306343
if f != nil {
307-
return io.flush(f.stream)
344+
if f.stream.procedure == nil {
345+
return .Unsupported
346+
}
347+
_, err := f.stream.procedure(f, .Flush, nil, 0, nil, runtime.nil_allocator())
348+
return err
308349
}
309350
return nil
310351
}

core/os/os2/file_linux.odin

Lines changed: 24 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,16 @@ _stdin := File{
2929
stream = {
3030
procedure = _file_stream_proc,
3131
},
32-
fstat = _fstat,
3332
}
3433
_stdout := File{
3534
stream = {
3635
procedure = _file_stream_proc,
3736
},
38-
fstat = _fstat,
3937
}
4038
_stderr := File{
4139
stream = {
4240
procedure = _file_stream_proc,
4341
},
44-
fstat = _fstat,
4542
}
4643

4744
@init
@@ -55,7 +52,6 @@ _standard_stream_init :: proc "contextless" () {
5552
data = impl,
5653
procedure = _file_stream_proc,
5754
}
58-
impl.file.fstat = _fstat
5955
return &impl.file
6056
}
6157

@@ -109,7 +105,6 @@ _new_file :: proc(fd: uintptr, _: string, allocator: runtime.Allocator) -> (f: ^
109105
data = impl,
110106
procedure = _file_stream_proc,
111107
}
112-
impl.file.fstat = _fstat
113108
return &impl.file, nil
114109
}
115110

@@ -476,88 +471,76 @@ _read_entire_pseudo_file_cstring :: proc(name: cstring, allocator: runtime.Alloc
476471
}
477472

478473
@(private="package")
479-
_file_stream_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, offset: i64, whence: io.Seek_From) -> (n: i64, err: io.Error) {
474+
_file_stream_proc :: proc(stream_data: rawptr, mode: File_Stream_Mode, p: []byte, offset: i64, whence: io.Seek_From, allocator: runtime.Allocator) -> (n: i64, err: Error) {
480475
f := (^File_Impl)(stream_data)
481-
ferr: Error
482476
switch mode {
483477
case .Read:
484-
n, ferr = _read(f, p)
485-
err = error_to_io_error(ferr)
478+
n, err = _read(f, p)
486479
return
487480
case .Read_At:
488-
n, ferr = _read_at(f, p, offset)
489-
err = error_to_io_error(ferr)
481+
n, err = _read_at(f, p, offset)
490482
return
491483
case .Write:
492-
n, ferr = _write(f, p)
493-
err = error_to_io_error(ferr)
484+
n, err = _write(f, p)
494485
return
495486
case .Write_At:
496-
n, ferr = _write_at(f, p, offset)
497-
err = error_to_io_error(ferr)
487+
n, err = _write_at(f, p, offset)
498488
return
499489
case .Seek:
500-
n, ferr = _seek(f, offset, whence)
501-
err = error_to_io_error(ferr)
490+
n, err = _seek(f, offset, whence)
502491
return
503492
case .Size:
504-
n, ferr = _file_size(f)
505-
err = error_to_io_error(ferr)
493+
n, err = _file_size(f)
506494
return
507495
case .Flush:
508-
ferr = _flush(f)
509-
err = error_to_io_error(ferr)
496+
err = _flush(f)
510497
return
511498
case .Close, .Destroy:
512-
ferr = _close(f)
513-
err = error_to_io_error(ferr)
499+
err = _close(f)
514500
return
515501
case .Query:
516502
return io.query_utility({.Read, .Read_At, .Write, .Write_At, .Seek, .Size, .Flush, .Close, .Destroy, .Query})
503+
case .Fstat:
504+
err = file_stream_fstat_utility(f, p, allocator)
505+
return
517506
}
518507
return 0, .Unsupported
519508
}
520509

521510

522511
@(private="package")
523-
_file_stream_buffered_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, offset: i64, whence: io.Seek_From) -> (n: i64, err: io.Error) {
512+
_file_stream_buffered_proc :: proc(stream_data: rawptr, mode: File_Stream_Mode, p: []byte, offset: i64, whence: io.Seek_From, allocator: runtime.Allocator) -> (n: i64, err: Error) {
524513
f := (^File_Impl)(stream_data)
525-
ferr: Error
526514
switch mode {
527515
case .Read:
528-
n, ferr = _read(f, p)
529-
err = error_to_io_error(ferr)
516+
n, err = _read(f, p)
530517
return
531518
case .Read_At:
532-
n, ferr = _read_at(f, p, offset)
533-
err = error_to_io_error(ferr)
519+
n, err = _read_at(f, p, offset)
534520
return
535521
case .Write:
536-
n, ferr = _write(f, p)
537-
err = error_to_io_error(ferr)
522+
n, err = _write(f, p)
538523
return
539524
case .Write_At:
540-
n, ferr = _write_at(f, p, offset)
541-
err = error_to_io_error(ferr)
525+
n, err = _write_at(f, p, offset)
542526
return
543527
case .Seek:
544-
n, ferr = _seek(f, offset, whence)
545-
err = error_to_io_error(ferr)
528+
n, err = _seek(f, offset, whence)
546529
return
547530
case .Size:
548-
n, ferr = _file_size(f)
549-
err = error_to_io_error(ferr)
531+
n, err = _file_size(f)
550532
return
551533
case .Flush:
552-
ferr = _flush(f)
553-
err = error_to_io_error(ferr)
534+
err = _flush(f)
554535
return
555536
case .Close, .Destroy:
556-
ferr = _close(f)
557-
err = error_to_io_error(ferr)
537+
err = _close(f)
558538
return
559539
case .Query:
560540
return io.query_utility({.Read, .Read_At, .Write, .Write_At, .Seek, .Size, .Flush, .Close, .Destroy, .Query})
541+
case .Fstat:
542+
err = file_stream_fstat_utility(f, p, allocator)
543+
return
561544
}
562545
return 0, .Unsupported
563546
}

core/os/os2/file_posix.odin

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ init_std_files :: proc "contextless" () {
3636
data = impl,
3737
procedure = _file_stream_proc,
3838
}
39-
impl.file.fstat = _fstat
4039
return &impl.file
4140
}
4241

@@ -110,7 +109,6 @@ __new_file :: proc(handle: posix.FD, allocator: runtime.Allocator) -> ^File {
110109
data = impl,
111110
procedure = _file_stream_proc,
112111
}
113-
impl.file.fstat = _fstat
114112
return &impl.file
115113
}
116114

@@ -371,7 +369,7 @@ _exists :: proc(path: string) -> bool {
371369
return posix.access(cpath) == .OK
372370
}
373371

374-
_file_stream_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, offset: i64, whence: io.Seek_From) -> (n: i64, err: io.Error) {
372+
_file_stream_proc :: proc(stream_data: rawptr, mode: File_Stream_Mode, p: []byte, offset: i64, whence: io.Seek_From, allocator: runtime.Allocator) -> (n: i64, err: Error) {
375373
f := (^File_Impl)(stream_data)
376374
fd := f.fd
377375

@@ -489,18 +487,19 @@ _file_stream_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte,
489487
return
490488

491489
case .Flush:
492-
ferr := _sync(&f.file)
493-
err = error_to_io_error(ferr)
490+
err = _sync(&f.file)
494491
return
495492

496493
case .Close, .Destroy:
497-
ferr := _close(f)
498-
err = error_to_io_error(ferr)
494+
err = _close(f)
499495
return
500496

501497
case .Query:
502498
return io.query_utility({.Read, .Read_At, .Write, .Write_At, .Seek, .Size, .Flush, .Close, .Destroy, .Query})
503499

500+
case .Fstat:
501+
err = file_stream_fstat_utility(f, p, allocator)
502+
return
504503
case:
505504
return 0, .Unsupported
506505
}

0 commit comments

Comments
 (0)