Module: io.buffer

Source: ./io/buffer.reef


Overview

io/buffer - Buffered I/O (BufferedReader / BufferedWriter objects)

Provides buffered reading and writing with configurable buffer sizes. Default buffer size is 8KB (8192 bytes), matching modern standards.

Opens return Result[T, error.Error]: Ok(handle) on success. Read opens (open_buffered_reader(_size)) classify failures as Err(NotFound) if the path doesn't exist, Err(IoError) otherwise (see open_failure_kind). Write/append opens (open_buffered_writer(_size), open_buffered_appender) always classify failures as Err(IoError) — fopen(path, "w"/"a") never creates the file on failure, so existence-based classification can't distinguish "missing parent dir" from "permission denied"; this matches io.file's writeFile/appendFile precedent. writer_write/writer_write_line return Result[bool, error.Error] using the void-success convention (Ok(true) — never Ok(false); a write failure is always Err).

Usage: import io.buffer import core.result as result import core.option as option let reader_res = open_buffered_reader("file.txt") if result.is_ok(reader_res) let reader = result.unwrap_ok(reader_res) loop let lr = reader_read_line(reader) if result.is_err(lr) break end if let opt = result.unwrap_ok(lr) if option.is_none(opt) break end if println(option.unwrap(opt)) end loop reader_close(reader) end if


Objects

BufferedReader

Fields:

Name Type
file_ptr pointer
buffer string
buf_size int
buf_pos int
buf_len int
is_eof bool
opened bool
had_error bool

proc init()

Methods:

shared fn is_open(): bool

shared fn at_eof(): bool

exclusive proc fill_buffer()

exclusive fn read_line(): result.Result[option.Option[string], error.Error]

exclusive fn read_bytes(count: int): result.Result[option.Option[string], error.Error]

exclusive proc close()

BufferedWriter

Fields:

Name Type
file_ptr pointer
buffer string
buf_size int
buf_pos int
opened bool

proc init()

Methods:

shared fn is_open(): bool

exclusive proc flush()

exclusive fn write(data: string): result.Result[bool, error.Error]

exclusive fn write_line(data: string): result.Result[bool, error.Error]

exclusive proc close()


Functions

fn default_buffer_size(): int

Default buffer size: 8KB

fn open_failure_kind(path: string): error.ErrorKind

Classifies a failed fopen() for path when opening for READING: NotFound if the path doesn't exist at all, IoError for any other reason (e.g. permission denied, or a non-directory component in the path). Mirrors io.file.open_failure_kind. Do NOT use this for write/append opens: fopen(path, "w"/"a") never creates the file on failure, so an exists()-recheck would always see the path absent and misclassify every write-open failure (including permission-denied on the parent dir) as NotFound. Write/append opens use a flat IoError instead (matching io.file's writeFile/appendFile/writeBinaryFile precedent).

fn open_buffered_reader(path: string): result.Result[BufferedReader, error.Error]

Open a file for buffered reading with default buffer size (8KB) Ok(reader) on success. Err(NotFound) if the path doesn't exist, Err(IoError) if it exists but cannot be opened for reading.

fn open_buffered_reader_size(path: string, buf_size: int): result.Result[BufferedReader, error.Error]

Open a file for buffered reading with custom buffer size Ok(reader) on success. Err(NotFound) if the path doesn't exist, Err(IoError) if it exists but cannot be opened for reading.

fn reader_is_open(r: BufferedReader): bool

fn reader_at_eof(r: BufferedReader): bool

fn reader_read_line(r: BufferedReader): result.Result[option.Option[string], error.Error]

Read a single line (up to newline or EOF), stripping trailing '\r'. Ok(Some(line)) — a line was read (may be "" for a genuinely blank line). Ok(None) — clean EOF, nothing more to read. Err(IoError) — the reader is not open, or a genuine read error occurred (reef_ferror), never conflated with EOF.

fn reader_read_bytes(r: BufferedReader, count: int): result.Result[option.Option[string], error.Error]

fn open_buffered_writer(path: string): result.Result[BufferedWriter, error.Error]

Open a file for buffered writing (truncate if exists) Ok(writer) on success. Err(IoError) on any fopen failure — write opens never leave a way to tell "missing path" from "permission denied" via exists()-recheck (fopen(path, "w") doesn't create the file on failure), so this is always IoError, never NotFound.

fn open_buffered_writer_size(path: string, buf_size: int): result.Result[BufferedWriter, error.Error]

Open a file for buffered writing with custom buffer size Ok(writer) on success. Err(IoError) on any fopen failure (see open_buffered_writer for why this is never NotFound).

fn open_buffered_appender(path: string): result.Result[BufferedWriter, error.Error]

Open a file for buffered appending Ok(writer) on success. Err(IoError) on any fopen failure (see open_buffered_writer for why this is never NotFound).

fn writer_is_open(w: BufferedWriter): bool

Check if writer is open

fn writer_write(w: BufferedWriter, data: string): result.Result[bool, error.Error]

fn writer_write_line(w: BufferedWriter, data: string): result.Result[bool, error.Error]


Procedures

proc reader_fill_buffer(r: BufferedReader)

Fill buffer from file On a zero-byte read, distinguishes clean EOF from a genuine I/O error via reef_ferror: sets is_eof for the former, had_error (sticky) for the latter.

proc reader_close(r: BufferedReader)

proc writer_flush(w: BufferedWriter)

proc writer_close(w: BufferedWriter)


Generated by reefc doc