#include "error.h" #include #include #define buffer_size 256 #define filename "pack" 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]; char name[56]; const char* workingdir, * dsep = ""; Entry entry; FILE* outfile, * infile; outfile = fopen(filename, "wb"); if (!outfile) { fprintf( stderr, "Failed to open '%s' for writing.\n", filename ); return error_file_not_found; } file_count = argc - 2; head_size = 8; blob_offset = head_size + file_count * sizeof entry; workingdir = argv[1]; if (workingdir[strlen(workingdir) - 1] != '/') dsep = "/"; 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 + 2]); strcpy(name, workingdir); strcat(name, dsep); strcat(name, entry.name); infile = fopen(name, "rb"); if (!infile) { fprintf( stderr, "Failed to open '%s' for reading.\n", entry.name ); return error_file_not_found; } fseek(infile, 0, SEEK_END); entry.size = ftell(infile); rewind(infile); 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); return error_none; }