bool_t dat_prepare_dir(restable_t *rt) { uint32_t size; uint32_t i; dat_t dat; dat_init(&dat); if (dat_from_rt(rt, &dat) == FALSE) { dat_free(&dat); return FALSE; } if (dat_sort(&dat) == FALSE) { dat_free(&dat); return FALSE; } /*dat_print(&dat);*/ size = DAT_HEADER_SIZE; for(i = 0; i < dat.numpaths; i++) size += strlen(dat.paths[i].name) + 1 + DAT_DIR_SIZE; for(i = 0; i < dat.numfiles; i++) size += strlen(dat.files[i].name) + 1 + DAT_ENTRY_SIZE; fseek(rt->file, size, SEEK_SET); dat_free(&dat); return TRUE; }
void dat_free(dat_t *dat) { uint32_t i; for(i = 0; i < dat->numfiles; i++) s_free(&(dat->files[i].name)); free(dat->files); for(i = 0; i < dat->numpaths; i++) s_free(&(dat->paths[i].name)); free(dat->paths); dat_init(dat); }
DAT_BOOLEAN udat_check_state(void) { DAT_MODULE_STATE state; DAT_BOOLEAN status; state = dat_module_get_state(); if (DAT_MODULE_STATE_UNINITIALIZED == state) { dat_init(); status = DAT_TRUE; } else if (DAT_MODULE_STATE_DEINITIALIZED == state) { status = DAT_FALSE; } else { status = DAT_TRUE; } return (status); }
bool_t dat_write_dir(restable_t *rt) { uint32_t number; uint32_t offset; dat_t dat; uint32_t i; uint32_t j; offset = ftell(rt->file); fseek(rt->file, 0, SEEK_SET); dat_init(&dat); if (dat_from_rt(rt, &dat) == FALSE) { dat_free(&dat); return FALSE; } if (dat_sort(&dat) == FALSE) { dat_free(&dat); return FALSE; } if (writef(rt->file, "b4b4b4b4", dat.numpaths, dat.numpaths, 0, 0) != OK) { fprintf(stderr, "dat_write_dir: Can't write header.\n"); dat_free(&dat); return FALSE; } for(i = 0; i < dat.numpaths; i++) { if (writef(rt->file, "sp", dat.paths[i].name) != OK) { fprintf(stderr, "dat_write_dir: Can't write path name #%u.\n", i); dat_free(&dat); return FALSE; } } number = 0; for(i = 0; i < dat.numpaths; i++) { if (writef(rt->file, "b4b4b4b4", dat.paths[i].numfiles, dat.paths[i].numfiles, 0x10, 0) != OK) { fprintf(stderr, "dat_write_dir: Can't write entry path header #%u.\n", i); dat_free(&dat); return FALSE; } for(j = 0; j < dat.paths[i].numfiles; j++) { if (writef(rt->file, "spb4b4b4b4", dat.files[number + j].name, dat.files[number + j].compression, dat.files[number + j].offset, dat.files[number + j].size, dat.files[number + j].compressed) != OK) { fprintf(stderr, "dat_write_dir: Can't write entry #%u of path #%u.\n", j, i); dat_free(&dat); return FALSE; } } number += dat.paths[i].numfiles; } dat_free(&dat); fseek(rt->file, offset, SEEK_SET); return TRUE; }
bool_t dat_read_dir(restable_t *rt) { uint32_t number; uint32_t zero; dat_t dat; uint32_t i; uint32_t j; if (readf(rt->file, "b4c4b4c4", &number, NULL, &zero, NULL) != OK) { fprintf(stderr, "dat_read_dir: Can't read header.\n"); return FALSE; } if (zero != 0) { fprintf(stderr, "dat_read_dir: Wrong DAT-file.\n"); return FALSE; } dat_init(&dat); if (dat_set_numpaths(&dat, number) == FALSE) return FALSE; for(i = 0; i < dat.numpaths; i++) { if (readf(rt->file, "sp", &(dat.paths[i].name)) != OK) { fprintf(stderr, "dat_read_dir: Can't read path name #%u.\n", i); dat_free(&dat); return FALSE; } } for(i = 0; i < dat.numpaths; i++) { if (readf(rt->file, "b4c12", &(dat.paths[i].numfiles), NULL) != OK) { fprintf(stderr, "dat_read_dir: Can't read entry.\n"); dat_free(&dat); return FALSE; } number = dat.numfiles; if (dat_set_numfiles(&dat, dat.numfiles + dat.paths[i].numfiles) == FALSE) { dat_free(&dat); return FALSE; } for(j = 0; j < dat.paths[i].numfiles; j++) { if (readf(rt->file, "spb4b4b4b4", &(dat.files[number + j].name), &(dat.files[number + j].compression), &(dat.files[number + j].offset), &(dat.files[number + j].size), &(dat.files[number + j].compressed)) != OK) { dat_free(&dat); return FALSE; } dat.files[number + j].path = i; } } if (dat_to_rt(rt, &dat) == FALSE) { dat_free(&dat); return FALSE; } /*dat_print(&dat);*/ dat_free(&dat); return TRUE; }