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)...); }