Example #1
0
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;
}
Example #2
0
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);
}
Example #3
0
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);
}
Example #4
0
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;
}
Example #5
0
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;
}