summaryrefslogtreecommitdiff
path: root/packassets.c
diff options
context:
space:
mode:
Diffstat (limited to 'packassets.c')
-rw-r--r--packassets.c82
1 files changed, 82 insertions, 0 deletions
diff --git a/packassets.c b/packassets.c
new file mode 100644
index 0000000..5b31b0d
--- /dev/null
+++ b/packassets.c
@@ -0,0 +1,82 @@
+#include "error.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#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;
+}