diff options
author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-09-24 03:18:07 +0200 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-09-24 03:18:07 +0200 |
commit | 035cbdfe1bc5aea16cbcada5e3c00ecf5ac08c96 (patch) | |
tree | 91a3a86c8589cec7d2ebb70e2fdfb4e9f05cc3c5 /lib/sqfs/blk_proc/deduplicate.c | |
parent | 94b507f2c1c7244493473a0a6673d726a6fe9cf5 (diff) |
Breake some of the helper functions out of process_block.c
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'lib/sqfs/blk_proc/deduplicate.c')
-rw-r--r-- | lib/sqfs/blk_proc/deduplicate.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/lib/sqfs/blk_proc/deduplicate.c b/lib/sqfs/blk_proc/deduplicate.c new file mode 100644 index 0000000..34e4e37 --- /dev/null +++ b/lib/sqfs/blk_proc/deduplicate.c @@ -0,0 +1,49 @@ +/* SPDX-License-Identifier: LGPL-3.0-or-later */ +/* + * deduplicate.c + * + * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> + */ +#define SQFS_BUILDING_DLL +#include "internal.h" + +int store_block_location(sqfs_block_processor_t *proc, uint64_t offset, + uint32_t size, uint32_t chksum) +{ + size_t new_sz; + void *new; + + if (proc->num_blocks == proc->max_blocks) { + new_sz = proc->max_blocks * 2; + new = realloc(proc->blocks, sizeof(proc->blocks[0]) * new_sz); + + if (new == NULL) + return SQFS_ERROR_ALLOC; + + proc->blocks = new; + proc->max_blocks = new_sz; + } + + proc->blocks[proc->num_blocks].offset = offset; + proc->blocks[proc->num_blocks].signature = MK_BLK_SIG(chksum, size); + proc->num_blocks += 1; + return 0; +} + +size_t deduplicate_blocks(sqfs_block_processor_t *proc, size_t count) +{ + size_t i, j; + + for (i = 0; i < proc->file_start; ++i) { + for (j = 0; j < count; ++j) { + if (proc->blocks[i + j].signature != + proc->blocks[proc->file_start + j].signature) + break; + } + + if (j == count) + break; + } + + return i; +} |