mirror of
https://github.com/IllusionMan1212/flac-odin.git
synced 2026-10-24 02:12:29 +00:00
49 lines
1.1 KiB
Odin
49 lines
1.1 KiB
Odin
package flac
|
|
|
|
import "core:io"
|
|
|
|
// Buffer is a very minimal writable buffer based on bytes.Buffer
|
|
Buffer :: struct {
|
|
buf: [dynamic]byte,
|
|
}
|
|
|
|
buffer_init_allocator :: proc(b: ^Buffer, len, cap: int, allocator := context.allocator, loc := #caller_location) {
|
|
b.buf = make([dynamic]byte, len, cap, allocator, loc)
|
|
}
|
|
|
|
buffer_write :: proc(b: ^Buffer, p: []byte) -> (n: int, err: io.Error) {
|
|
return append(&b.buf, ..p), nil
|
|
}
|
|
|
|
buffer_destroy :: proc(b: ^Buffer) {
|
|
delete(b.buf)
|
|
}
|
|
|
|
buffer_to_bytes :: proc(b: ^Buffer) -> []byte {
|
|
return b.buf[:]
|
|
}
|
|
|
|
buffer_to_stream :: proc(b: ^Buffer) -> (s: io.Stream) {
|
|
s.data = b
|
|
s.procedure = _buffer_proc
|
|
return
|
|
}
|
|
|
|
@(private)
|
|
_buffer_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, offset: i64, whence: io.Seek_From) -> (n: i64, err: io.Error) {
|
|
b := (^Buffer)(stream_data)
|
|
#partial switch mode {
|
|
case .Write:
|
|
return io._i64_err(buffer_write(b, p))
|
|
case .Size:
|
|
n = i64(cap(b.buf))
|
|
return
|
|
case .Destroy:
|
|
buffer_destroy(b)
|
|
return
|
|
case .Query:
|
|
return io.query_utility({.Write, .Size, .Destroy})
|
|
}
|
|
return 0, .Empty
|
|
}
|