aboutsummaryrefslogtreecommitdiff
path: root/pack.c
blob: 3d25688ea7bb063054f8956a5a9d6835d39daca0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <stdio.h>
#include <string.h>

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