-static int compress_chunk(const u8 chunk[], unsigned chunk_sz,
- u8 compressed_chunk[],
- unsigned *compressed_chunk_len_ret,
- int ctype)
-{
- unsigned compressed_chunk_sz;
- int (*compress)(const void *, unsigned, void *, unsigned *);
- if (ctype == WIM_COMPRESSION_TYPE_LZX)
- compress = lzx_compress;
- else
- compress = xpress_compress;
- return (*compress)(chunk, chunk_sz, compressed_chunk,
- compressed_chunk_len_ret);
-}
-
-static int write_wim_resource_chunk(const u8 chunk[], unsigned chunk_size,
- FILE *out_fp, int out_ctype,
- struct chunk_table *chunk_tab)
-{
- const u8 *out_chunk;
- unsigned out_chunk_size;
-
- if (out_ctype == WIM_COMPRESSION_TYPE_NONE) {
- out_chunk = chunk;
- out_chunk_size = chunk_size;
- } else {
- u8 *compressed_chunk = alloca(chunk_size);
- int ret;
- unsigned compressed_chunk_len;
-
- wimlib_assert(chunk_tab != NULL);
-
- ret = compress_chunk(chunk, chunk_size, compressed_chunk,
- &out_chunk_size, out_ctype);
- if (ret > 0)
- return ret;
- else if (ret < 0) {
- out_chunk = chunk;
- out_chunk_size = chunk_size;
- } else {
- out_chunk = compressed_chunk;
- }
- *chunk_tab->cur_offset_p++ = chunk_tab->cur_offset;
- chunk_tab->cur_offset += out_chunk_size;
- }
-
- if (fwrite(out_chunk, 1, out_chunk_size, out_fp) != out_chunk_size) {
- ERROR_WITH_ERRNO("Failed to write WIM resource chunk");
- return WIMLIB_ERR_WRITE;
- }
- return 0;
-}
-
-static int
-finish_wim_resource_chunk_tab(const struct chunk_table *chunk_tab,
- FILE *out_fp)
-{
- if (fseeko(out_fp, chunk_tab->file_offset, SEEK_SET) != 0) {
- ERROR_WITH_ERRNO("Failed to seet to byte "PRIu64" of output "
- "WIM file", chunk_tab->file_offset);
- return WIMLIB_ERR_WRITE;
- }
-
- if (chunk_tab->bytes_per_chunk_entry == 8) {
- array_to_le64(chunk_tab->offsets, chunk_tab->num_chunks - 1);
- } else {
- for (u64 i = 0; i < chunk_tab->num_chunks - 1; i++)
- ((u32*)chunk_tab->offsets)[i] =
- to_le32(chunk_tab->offsets[i]);
- }
- if (fwrite(chunk_tab->offsets, 1, chunk_tab->table_disk_size, out_fp) !=
- chunk_tab->table_disk_size)
- {
- ERROR_WITH_ERRNO("Failed to write chunk table in compressed "
- "file resource");
- return WIMLIB_ERR_WRITE;
- }
- if (fseeko(out_fp, chunk_tab->file_offset, SEEK_SET) != 0) {
- ERROR_WITH_ERRNO("Failed to seet to byte "PRIu64" of output "
- "WIM file", chunk_tab->file_offset);
- return WIMLIB_ERR_WRITE;
- }
- return 0;
-}
-
-static int write_wim_resource(const struct lookup_table_entry *lte,
- FILE *out_fp, int out_ctype)