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