24typedef enum : uint16_t {
45typedef enum : uint16_t {
50typedef enum : uint64_t {
55typedef enum : uint16_t {
63typedef enum : uint8_t {
141 for (
size_t i = 0U; i < (size_t)
k_tar_block; ++i) {
192 return (length == 0U) ?
k_ra8_ok : sink(ctx, zeros, length);
217 const uint8_t* bytes,
223 err = sink(ctx, header,
sizeof(header));
225 if ((err ==
k_ra8_ok) && (length > UINT32_MAX)) {
228 if ((err ==
k_ra8_ok) && (length != 0U)) {
229 err = sink(ctx, bytes, (uint32_t)length);
264 uint64_t source_size = source.
size;
273 err = sink(ctx, header,
sizeof(header));
314 const char* directory,
322 for (
size_t i = 0U; (err ==
k_ra8_ok) && (i < count); ++i) {
329 char comic_xml[4096];
337 (
const uint8_t*)comic_xml,
341 const uint8_t trailer[2U * (size_t)
k_tar_block] = {};
342 err = sink(ctx, trailer,
sizeof(trailer));
367 if ((gzip ==
nullptr) || (length < 0) || (gzip->
error !=
k_ra8_ok)) {
397 gzip->
crc = (uint32_t)mz_crc32(gzip->
crc, bytes, length);
398 gzip->
size += length;
399 if (tdefl_compress_buffer(gzip->
compressor, bytes, length, TDEFL_NO_FLUSH) != TDEFL_STATUS_OKAY) {
420 bytes[i] = (uint8_t)(value & (uint32_t)
k_byte_mask);
444 tdefl_compressor* compressor =
446 if (compressor ==
nullptr) {
453 .compressor = compressor,
454 .crc = (uint32_t)MZ_CRC32_INIT,
458 TDEFL_STATUS_OKAY)) {
465 (tdefl_compress_buffer(compressor,
nullptr, 0U, TDEFL_FINISH) != TDEFL_STATUS_DONE)) {
@ k_byte_bits
Bits per byte (SHPR field width).
@ k_fw_fs_path_cap
Largest portable path including its NUL.
Package a downloaded chapter folder into a reader-openable container.
void * mdl_export_workspace_take(mdl_export_workspace_t *ws, size_t bytes, size_t alignment)
Reserve aligned bytes from an exporter arena.
struct mdl_export_workspace mdl_export_workspace_t
Caller-owned bounded arena for all exporter scratch state.
ra8_err_t mdl_export_build_comicinfo_pages(const mdl_export_meta_t *meta, size_t page_count, char *buf, size_t cap)
Generate ComicInfo.xml including page count and direction semantics.
Module-private contracts shared by chapter export writers.
@ k_name_max
Maximum entry-name bytes.
ra8_err_t priv_mdl_export_path_join(char *out, size_t capacity, const char *directory, const char *leaf)
Join a canonical directory and leaf without truncation.
ra8_err_t priv_mdl_export_source_copy(mdl_export_source_t *source, mdl_export_sink_fn_t sink, void *sink_ctx)
Stream one portable source into a bounded caller sink.
ra8_err_t priv_mdl_export_source_close(mdl_export_source_t *source)
Close one open source and clear its retained binding.
ra8_err_t priv_mdl_export_output_write(mdl_export_output_t *output, const uint8_t *bytes, uint32_t length)
Append one complete byte span to an active export stage.
ra8_err_t priv_mdl_export_source_open(mdl_export_source_t *source, mdl_storage_t *storage, const char *path)
Open one regular source and snapshot its exact nonempty extent.
ra8_err_t(* mdl_export_sink_fn_t)(void *ctx, const uint8_t *bytes, uint32_t length)
Portable archive-output sink signature.
ra8_err_t priv_mdl_export_tar_gzip(mdl_storage_t *storage, const char *dir, char names[][k_name_max], size_t count, mdl_export_output_t *output, const mdl_export_meta_t *meta, mdl_export_workspace_t *ws)
Write a gzip-wrapped CBT archive.
mdl_tar_layout_t
ustar header field offsets and widths.
@ k_len_size
Size field width.
@ k_off_mtime
Timestamp field offset.
@ k_off_gid
GID field offset.
@ k_off_version
Ustar version offset.
@ k_off_magic
Ustar magic offset.
@ k_tar_block
Tar record size.
@ k_off_size
Size field offset.
@ k_off_name
Name field offset.
@ k_off_mode
Mode field offset.
@ k_off_chksum
Checksum field offset.
@ k_off_uid
UID field offset.
@ k_off_type
Entry-type field offset.
@ k_len_mtime
Timestamp field width.
@ k_len_name
Name field width.
@ k_len_chksum
Checksum field width.
@ k_len_magic
Ustar magic width.
@ k_len_id
Mode/UID/GID field width.
mdl_gzip_header_t
Fixed non-zero bytes in the RFC 1952 header.
@ k_gzip_deflate
DEFLATE compression method.
@ k_gzip_os_unknown
Unknown originating OS.
@ k_gzip_id2
Gzip identification byte two.
@ k_gzip_id1
Gzip identification byte one.
static ra8_err_t internal_direct_sink(void *ctx, const uint8_t *bytes, uint32_t length)
Append bytes directly to an archive publication stage.
static ra8_err_t internal_gzip_sink(void *ctx, const uint8_t *bytes, uint32_t length)
Feed one uncompressed tar span into streaming DEFLATE.
static const uint8_t s_ustar_magic[k_len_magic]
Fixed ustar magic and version payloads.
static size_t internal_round_block(size_t bytes)
Round one payload extent to a whole tar record.
static ra8_err_t internal_write_zeros(mdl_export_sink_fn_t sink, void *ctx, uint32_t length)
Emit zero padding through one archive sink.
static ra8_err_t internal_build_tar(mdl_storage_t *storage, const char *directory, char names[][k_name_max], size_t count, const mdl_export_meta_t *meta, mdl_export_sink_fn_t sink, void *ctx)
Stream a complete deterministic ustar archive.
mdl_tar_size_t
Largest payload representable by the fixed eleven-digit tar field.
@ k_tar_size_max
Maximum classic octal payload size.
static const uint8_t s_ustar_version[2]
static ra8_err_t internal_tar_write_source(mdl_storage_t *storage, const char *path, const char *member, mdl_export_sink_fn_t sink, void *ctx)
Emit one portable source as a verified tar member.
ra8_err_t priv_mdl_export_tar(mdl_storage_t *storage, const char *dir, char names[][k_name_max], size_t count, mdl_export_output_t *output, const mdl_export_meta_t *meta)
Write an uncompressed CBT tar archive.
static mz_bool internal_gzip_put(const void *bytes, int length, void *ctx)
Append DEFLATE callback output to the active stage.
static ra8_err_t internal_tar_header(uint8_t *block, const char *name, size_t size)
Build one deterministic ustar regular-file header.
mdl_gzip_layout_t
Gzip framing and serialization constants.
@ k_gzip_header_bytes
Fixed RFC 1952 header.
@ k_gzip_u32_bytes
Trailer scalar width.
mdl_tar_mode_t
Fixed regular-file mode in deterministic tar headers.
@ k_file_mode
Portable regular-file permission bits.
static void internal_put_u32le(uint8_t *bytes, uint32_t value)
Serialize one little-endian gzip trailer scalar.
static ra8_err_t internal_tar_write_memory(mdl_export_sink_fn_t sink, void *ctx, const char *name, const uint8_t *bytes, size_t length)
Emit one bounded in-memory tar member.
Annotation-attribute framework macros for ra8-firmware.
#define RA8_PRIV
Module-private helper: shared across TUs but only inside one library.
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
@ k_ra8_fail
Generic unspecified failure.
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
@ k_ra8_err_invalid_size
Invalid size parameter (too large, too small, or misaligned).
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
void * memset(void *dst, int value, size_t n)
Fill memory with a constant byte value.
size_t strlen(const char *s)
Calculate string length.
void * memcpy(void *dst, const void *src, size_t n)
Copy memory area between non-overlapping regions.
bool is_open
Facade lifecycle guard.
Online gzip state receiving the uncompressed tar stream.
uint32_t size
Tar size modulo 2^32.
tdefl_compressor * compressor
Caller-arena DEFLATE state.
uint32_t crc
Running tar CRC32.
ra8_err_t error
First output/compress error.
mdl_export_output_t * output
Active gzip output stage.
mdl_export_output_t * output
Active staged transaction.
One validated staged publication, including random ZIP backfill.
One open regular source with a snapshotted identity.
fw_fs_file_t file
Open portable source stream.
uint64_t size
Snapshotted source extent.
One non-reentrant downloader filesystem dependency bundle.