#include "file.h" #include #include #include #include "utilities.h" struct data { int x; int y; int value; }; static int **list_to_map(struct data *values, int count, int width, int height) { int **map = malloc(sizeof_2d(width, height, sizeof(int))); init2d((void **)map, width, height, sizeof(int)); for (int i = 0; i < count; i++) map[values[i].x][values[i].y] = values[i].value; return map; } static void get_numbers(char *line, int *left_int, int *right_int) { char *left, *right; if (find_lr_ints(line, &left, &right)) { *left_int = strtol(left, NULL, 10); *right_int = strtol(right, NULL, 10); } } struct maze *maze_from_file(char *path) { FILE *file = fopen(path, "r"); if (file == NULL) return NULL; struct maze *maze = malloc(sizeof(struct maze)); struct data values[50 * 50]; char buffer[256]; int i = 0, y = 0, max_width = 0; while (fgets(buffer, 256, file)) { int length = strlen(buffer); if (length > 0) { if (length > 5 && !strncmp(buffer, "start", 5)) { get_numbers(buffer + 5, &(maze->starting_point.x), &(maze->starting_point.y)); } else if (length > 3 && !strncmp(buffer, "end", 3)) { get_numbers(buffer + 3, &(maze->end_point.x), &(maze->end_point.y)); } else { int x; for (x = 0; buffer[x] != 10; x++) { values[i].x = x; values[i].y = y; values[i].value = buffer[x] == '0' ? 0 : 1; i++; } if (x > max_width) max_width = x; y++; } } } fclose(file); maze->width = max_width; maze->height = y; maze->map = list_to_map(values, i, maze->width, maze->height); return maze; } int maze_to_file(char *path, struct maze *maze) { FILE *file = fopen(path, "w"); if (file == NULL) return -1; fprintf(file, "start=(%d,%d)\n", maze->starting_point.x, maze->starting_point.y); fprintf(file, "end=(%d,%d)\n", maze->end_point.x, maze->end_point.y); for (int y = 0; y < maze->height; y++) { for (int x = 0; x < maze->width; x++) { fprintf(file, "%d", maze->map[x][y]); } fprintf(file, "\n"); } fclose(file); return 0; }