Independent dBASE III (version 0x03, no memo) codec. Public Table, Row, Field andValue types are directly constructible. read and write default to strict UTF-8;pass encoding=Latin1 explicitly for ISO-8859-1. No encoding is guessed from thelanguage-driver byte. Field names are unique, case-sensitive printable ASCII,1–10 bytes. Character fields support widths 1–255 bytes.
Numeric/Float values use exact fixed decimal strings, including sign and trailingfractional zeroes. No floating-point conversion, exponent notation, implicitrounding, precision reduction, or width truncation occurs. Fractional digits mustfit the field decimals. Dates use real Gregorian YYYYMMDD dates, years 0001–9999.Logical T/Y/F/N is accepted case-insensitively; space and ? mean Missing.
Character reads remove trailing space/NUL padding; blank character data becomesText(""). Writing Missing to a character column therefore reads back as Text("").Blank numeric/date data means Missing; date 00000000 also reads as Missing.These are format-level normalizations, not byte-for-byte preservation. Physicalrow order and deleted flags are always retained. Reserved header bytes and fieldaddresses are not preserved. The optional EOF marker is accepted; other trailingbytes, truncated records and unsupported field types are rejected.
open_reader validates the structure, then row_at decodes an individual physicalrecord lazily. rows_range reads a checked interval. Malformed values in otherrecords are detected only when those records are decoded. read validates allrecords by materializing them. fields() returns a schema copy.
Limits caps input/output bytes, records, fields and materialized cells. Defaults:256 MiB, one million records, 2046 fields, ten million cells. Callers can supplylarger explicit limits; signed integer overflow guards still apply. The cell capapplies to full read, so row_at can process large tables without materializing allvalues. write has deterministic update date 2000-01-01; pass update_date towrite an explicit Gregorian date in the dBASE header range 1900–2155.
validate_table uses UTF-8 byte widths; validate_table_encoded checks the chosenencoding. field_index and project use exact case-sensitive names; projectionpreserves row order and deletion flags, and rejects missing/duplicate columns.DbfError::Invalid(Int,String) reports byte offsets for input failures; tablevalidation and out-of-range APIs use logical row/index positions where no inputbyte exists.