示例#1
0
文件: bmzip.cpp 项目: earlchew/bmzip
static int bm_comp(const _TCHAR* in_file, const _TCHAR* out_file)
{
	size_t in_size, out_size;
	bytes in, out, out_data;
	BM_DATA *bm_data;

	if ((in = read_all(in_file, &in_size)) == NULL) { /* error! */ _ftprintf(stderr, _T("Failed to read input file '%s'\n"), in_file); return -1; }
	if ((out = read_all(out_file, &out_size)) == NULL) { /* error! */ _ftprintf(stderr, _T("Failed to read output file '%s' - it must be a bootmgr file\n"), out_file); return -1; }
	if ((bm_data = find_bm_data(out, out+out_size)) == NULL) { /* error! not found */ _ftprintf(stderr, _T("Failed to find the boot manager compression signature in file '%s' - it must be a bootmgr file\n"), out_file); return -2; }
	print_version(bm_data);
	bm_data->uncompressed_size = in_size;
	if ((out_data = (bytes)malloc(2*in_size)) == NULL) { /* error! */ _ftprintf(stderr, _T("Failed to allocate %" PRIu_size_t " bytes for compression\n"), 2*in_size); return -3; }
	if ((out_size = compress(get_format(bm_data), in, in_size, out_data, 2*in_size)) == 0) { /* error! */ _ftprintf(stderr, _T("Failed to compress data: %u\n"), errno); return -4; }
	bm_data->compressed_size = out_size;
	out_data[out_size++] = 0;
	if (!write_all(out_file, out, ((bytes)bm_data) + bm_data->offset - out)) { /* error! */ _ftprintf(stderr, _T("Failed to save compressed file to '%s'\n"), out_file); return -5; }
	if (!append_all(out_file, out_data, out_size)) { /* error! */ _ftprintf(stderr, _T("Failed to save compressed file to '%s'\n"), out_file); return -5; }
	
	// TODO: free()

	return 0;
}
 message_builder& append_all(T&& x, Ts&&... xs) {
   append(std::forward<T>(x));
   return append_all(std::forward<Ts>(xs)...);
 }