133 lines
3.9 KiB
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]);
|
|
}
|
|
}
|