#include #include #define buffer_size 256 typedef struct { int size; int offset; char name[56]; } Entry; int main(int argc, char** argv) { int i, j, file_count, blob_offset, read, head_size; char buffer[buffer_size]; Entry entry; FILE* outfile, * infile; outfile = fopen("pack", "wb"); if (!outfile) { fprintf(stderr, "Failed to open 'pack' for writing."); return 1; } file_count = argc - 1; head_size = 8; blob_offset = head_size + file_count * sizeof entry; fwrite(&file_count, 4, 1, outfile); fwrite(&blob_offset, 4, 1, outfile); entry.offset = blob_offset; for (i = 0; i < file_count; i++) { strcpy(entry.name, argv[i + 1]); infile = fopen(entry.name, "rb"); if (!infile) { fprintf( stderr, "Failed to open '%s' for reading.", entry.name ); return 1; } fseek(infile, 0, SEEK_END); entry.size = ftell(infile); rewind(infile); printf("Adding %s\n", entry.name); fseek(outfile, head_size + i * sizeof entry, SEEK_SET); fwrite(&entry, 1, sizeof entry, outfile); fseek(outfile, entry.offset, SEEK_SET); for (j = 0; j < entry.size; j += buffer_size) { read = fread(buffer, 1, buffer_size, infile); fwrite(buffer, 1, read, outfile); } entry.offset += entry.size; fclose(infile); } fclose(outfile); }