timesynk/tools/pack_data.c

133 lines
3.9 KiB
C

#include <stdio.h>
#include <stdlib.h>
#define TITLE "--- ts data packer ---"
#define USAGE "Usage is:\n\t%s my_data_dir\nWhere my_data_dir is a directory with at least the following:\n tile data files:\n\tequips\n\titems\n\tplayers\n\twalls\n\tfloors\n\tnpcs\n\tdoors\nThese files will be cleaned of comments and unnecessary white space before being combined into a single file named 'data'.\n"
#define PROCESSING "-> processing %s\n"
#define WRITING "--> appending buffer to %s\n"
#define PROC_TARGET "--> copying %s to buffer and cleaning\n"
#define CANNOT_OPEN "ERR: %s either doesn't exist or is empty\n"
#define CANNOT_WRITE "ERR: couldn't open %s for writing\n"
#define DONE "-> finished writing %s\n"
int fileToMemory(char **buffer, char *file_name) {
int i, n, pos = 0;
char t_buf[16];
FILE *file = fopen(file_name, "r");
if (file == NULL)
return -1;
fseek(file, 0, SEEK_END);
int size = ftell(file);
fseek(file, 0, SEEK_SET);
char *new_buffer = malloc(size);
while ((n = fread(t_buf, 1, 16, file))) {
for (i = 0; i < n; i++) {
new_buffer[pos++] = t_buf[i];
}
}
fclose(file);
*buffer = new_buffer;
return size;
}
#define FILE_COUNT 8
char files[FILE_COUNT][15] = {
"players",
"npcs",
"equips",
"items",
"doors",
"floors",
"walls"
};
#define MODE_NO_FIRST_CHAR 0
#define MODE_NORMAL 1
#define MODE_CLEAR_LINE 2
int main(int argc, char **argv) {
printf("%s\n", TITLE);
if (argc > 1) {
char *buffer;
char file_name[63];
char final_file[63];
sprintf(final_file, "%s/%s.tsd", argv[1], argv[1]);
remove(final_file);
FILE *output_file = fopen(final_file, "w");
if (output_file == NULL) {
printf(CANNOT_WRITE, final_file);
return -1;
}
printf(PROCESSING, argv[1]);
int i;
for (i = 0;i < FILE_COUNT;i++) {
if (files[i][0] != '\0') {
sprintf(file_name, "%s/%s", argv[1], files[i]);
int file_chars = 0;
if ((file_chars = fileToMemory(&buffer, file_name)) > 0) {
printf(PROC_TARGET, file_name);
int buffer_offset = 0;
int buffer_2_offset = 0;
char buffer_2[file_chars];
int mode = 0;
while (buffer[buffer_offset] != '\0') {
switch (buffer[buffer_offset]) {
case ' ':
if (mode == MODE_NORMAL) {
buffer_2[buffer_2_offset++] = buffer[buffer_offset++];
} else {
buffer_offset++;
}
break;
case '\n':
if (mode == MODE_NO_FIRST_CHAR) {
buffer_offset++;
} else if (mode == MODE_CLEAR_LINE) {
mode = MODE_NO_FIRST_CHAR;
buffer_offset++;
} else {
mode = MODE_NO_FIRST_CHAR;
buffer_2[buffer_2_offset++] = buffer[buffer_offset++];
}
break;
case ';':
if (mode == MODE_NO_FIRST_CHAR) {
mode = MODE_CLEAR_LINE;
buffer_offset++;
}
break;
default:
if (mode == MODE_NO_FIRST_CHAR) {
mode = MODE_NORMAL;
} else if (mode == MODE_CLEAR_LINE) {
buffer_offset++;
} else {
buffer_2[buffer_2_offset++] = buffer[buffer_offset++];
}
break;
}
}
buffer_2[buffer_2_offset] = '\0';
// write cleaned buffer to file
printf(WRITING, final_file);
fprintf(output_file, "%d {\n", i);
fprintf(output_file, "%s", buffer_2);
fprintf(output_file, "}\n");
} else {
printf(CANNOT_OPEN, file_name);
}
}
}
fclose(output_file);
printf(DONE, final_file);
} else {
printf(USAGE, argv[0]);
}
}