Create "set" of filenames for use when archiving
This commit is contained in:
parent
2f4c0d3679
commit
c6d2d50c0f
2 changed files with 28 additions and 1 deletions
|
@ -846,6 +846,19 @@ int write_files_fn(void *data, void *ud) {
|
||||||
void cleanup_nop_fn(__attribute__((unused)) void *unused) {}
|
void cleanup_nop_fn(__attribute__((unused)) void *unused) {}
|
||||||
void cleanup_free_fn(void *data) { free(data); }
|
void cleanup_free_fn(void *data) { free(data); }
|
||||||
|
|
||||||
|
int filenames_to_abs_map_fn(void *data, void *ud) {
|
||||||
|
SDArchiverFileInfo *file_info = data;
|
||||||
|
SDArchiverHashMap **abs_filenames = ud;
|
||||||
|
|
||||||
|
// Get combined full path to file.
|
||||||
|
char *fullpath = filename_to_absolute_path(file_info->filename);
|
||||||
|
|
||||||
|
simple_archiver_hash_map_insert(abs_filenames, fullpath, fullpath,
|
||||||
|
strlen(fullpath) + 1, cleanup_nop_fn, NULL);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
char *simple_archiver_error_to_string(enum SDArchiverStateReturns error) {
|
char *simple_archiver_error_to_string(enum SDArchiverStateReturns error) {
|
||||||
switch (error) {
|
switch (error) {
|
||||||
case SDAS_SUCCESS:
|
case SDAS_SUCCESS:
|
||||||
|
@ -864,6 +877,8 @@ char *simple_archiver_error_to_string(enum SDArchiverStateReturns error) {
|
||||||
return "Invalid file";
|
return "Invalid file";
|
||||||
case SDAS_INTERNAL_ERROR:
|
case SDAS_INTERNAL_ERROR:
|
||||||
return "Internal error";
|
return "Internal error";
|
||||||
|
case SDAS_FAILED_TO_CREATE_MAP:
|
||||||
|
return "Failed to create set of filenames (internal error)";
|
||||||
default:
|
default:
|
||||||
return "Unknown error";
|
return "Unknown error";
|
||||||
}
|
}
|
||||||
|
@ -878,6 +893,7 @@ SDArchiverState *simple_archiver_init_state(const SDArchiverParsed *parsed) {
|
||||||
state->flags = 0;
|
state->flags = 0;
|
||||||
state->parsed = parsed;
|
state->parsed = parsed;
|
||||||
state->out_f = NULL;
|
state->out_f = NULL;
|
||||||
|
state->map = NULL;
|
||||||
|
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
@ -891,6 +907,14 @@ void simple_archiver_free_state(SDArchiverState **state) {
|
||||||
|
|
||||||
int simple_archiver_write_all(FILE *out_f, SDArchiverState *state,
|
int simple_archiver_write_all(FILE *out_f, SDArchiverState *state,
|
||||||
const SDArchiverLinkedList *filenames) {
|
const SDArchiverLinkedList *filenames) {
|
||||||
|
// First create a "set" of absolute paths to given filenames.
|
||||||
|
__attribute__((cleanup(simple_archiver_hash_map_free)))
|
||||||
|
SDArchiverHashMap *abs_filenames = simple_archiver_hash_map_init();
|
||||||
|
if (simple_archiver_list_get(filenames, filenames_to_abs_map_fn,
|
||||||
|
&abs_filenames)) {
|
||||||
|
return SDAS_FAILED_TO_CREATE_MAP;
|
||||||
|
}
|
||||||
|
|
||||||
if (fwrite("SIMPLE_ARCHIVE_VER", 1, 18, out_f) != 18) {
|
if (fwrite("SIMPLE_ARCHIVE_VER", 1, 18, out_f) != 18) {
|
||||||
return SDAS_FAILED_TO_WRITE;
|
return SDAS_FAILED_TO_WRITE;
|
||||||
}
|
}
|
||||||
|
@ -974,6 +998,7 @@ int simple_archiver_write_all(FILE *out_f, SDArchiverState *state,
|
||||||
state->count = 0;
|
state->count = 0;
|
||||||
state->max = filenames->count;
|
state->max = filenames->count;
|
||||||
state->out_f = out_f;
|
state->out_f = out_f;
|
||||||
|
state->map = abs_filenames;
|
||||||
fprintf(stderr, "Begin archiving...\n");
|
fprintf(stderr, "Begin archiving...\n");
|
||||||
fprintf(stderr, "[%10u/%10u]\n", state->count, state->max);
|
fprintf(stderr, "[%10u/%10u]\n", state->count, state->max);
|
||||||
if (simple_archiver_list_get(filenames, write_files_fn, state)) {
|
if (simple_archiver_list_get(filenames, write_files_fn, state)) {
|
||||||
|
|
|
@ -31,6 +31,7 @@ typedef struct SDArchiverState {
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
const SDArchiverParsed *parsed;
|
const SDArchiverParsed *parsed;
|
||||||
FILE *out_f;
|
FILE *out_f;
|
||||||
|
SDArchiverHashMap *map;
|
||||||
unsigned int count;
|
unsigned int count;
|
||||||
unsigned int max;
|
unsigned int max;
|
||||||
} SDArchiverState;
|
} SDArchiverState;
|
||||||
|
@ -43,7 +44,8 @@ enum SDArchiverStateReturns {
|
||||||
SDAS_NO_DECOMPRESSOR,
|
SDAS_NO_DECOMPRESSOR,
|
||||||
SDAS_INVALID_PARSED_STATE,
|
SDAS_INVALID_PARSED_STATE,
|
||||||
SDAS_INVALID_FILE,
|
SDAS_INVALID_FILE,
|
||||||
SDAS_INTERNAL_ERROR
|
SDAS_INTERNAL_ERROR,
|
||||||
|
SDAS_FAILED_TO_CREATE_MAP
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Returned pointer must not be freed.
|
/// Returned pointer must not be freed.
|
||||||
|
|
Loading…
Reference in a new issue