=== Tape File Block (`TFLE`)

Lists all tape files.
Tape files are separations written to media, usually digital tapes, and are marked by filemarks.

==== Structure Definition

[source,c]
#define TAPE_FILE_MAGIC 0x454C4654
typedef struct TapeFileHeader
{
    uint32_t identifier;  ///< Block type identifier. Must be set to BlockType::TapeFileBlock. This magic value allows
                          ///< parsers to identify the block type.
    uint32_t entries;     ///< Number of file entries following this header. Specifies how many TapeFileEntry structures
                          ///< are in this block. Valid range: 0 to 2^32-1.
    uint64_t length;      ///< Size of entry data in bytes (excluding this header). Calculated as: entries ×
                          ///< sizeof(TapeFileEntry). This is the number of bytes following the header.
    uint64_t crc64;  ///< CRC64-ECMA checksum of the entry data. Computed over the array of TapeFileEntry structures
                     ///< only. Does NOT include this header. Used for integrity verification.
} TapeFileHeader;

==== Field Descriptions

[cols="2,2,2,6",options="header"]
|===
|Type
|Size
|Name
|Description

|uint32_t
|4 bytes
|identifier
|The tape file block identifier, always `TFLE`

|uint16_t
|2 bytes
|entries
|The number of entries following this header

|uint32_t
|4 bytes
|length
|The length in bytes of the data following this header.

|uint64_t
|8 bytes
|crc64
|The CRC64-ECMA checksum of the data following this header
|===

==== Tape file entries

[source,c]
typedef struct TapeFileEntry
{
    uint32_t File;  ///< File number (unique within the partition). Identifies this file among all files in the same
                    ///< partition. Numbering scheme is tape-format-dependent.
    uint8_t  Partition;   ///< Partition number containing this file. References a partition defined in the
                          ///< TapePartitionHeader block. Valid range: 0-255.
    uint64_t FirstBlock;  ///< First block of the file (inclusive). This is the starting block address of the file data.
                          ///< Block addresses are 0-based within the partition.
    uint64_t
        LastBlock;  ///< Last block of the file (inclusive). This is the ending block address of the file data. Must be
                    ///< ≥ FirstBlock. The file contains all blocks from FirstBlock through LastBlock inclusive.
} TapeFileEntry;

==== Field Descriptions

[cols="2,2,2,6",options="header"]
|===
|Type
|Size
|Name
|Description

|uint32
|4 bytes
|file
|File number.

|uint8
|1 byte
|partition
|Partition number this file belongs to.

|uint64
|8 bytes
|firstBlock
|First block number, inclusive, of the file.

|uint64
|8 bytes
|lastBlock
|Last block number, inclusive, of the file.
|===