typedef struct { int width; int height; char** e; bool** visited; } Graph2D; enum { NORTH = 0, EAST, SOUTH, WEST, DIRECTIONS, }; typedef struct { int x; int y; } Coordinates; bool valid(Graph2D* g, Coordinates c) { return c.x >= 0 && c.x < g->width && c.y >= 0 && c.y < g->height; } /* Reads from the input until exhausted. Returns memory which must be freed by the caller. */ Graph2D* ingest(FILE* in) { char *t = getall(in); char *s = t; /* Two passes. One to count width and height. Another to store to allocated memory. */ int height = 0, width = -1, i = 0; while (s[i] != '\0') { if (s[i] == '\n') { if (width == -1) { width = i + 1; } height++; } i++; } char** buffer = calloc(height, sizeof(char*)); bool** visited = calloc(height, sizeof(bool*)); Graph2D* g = calloc(1, sizeof(Graph2D)); g->width = width; g->height = height; g->e = buffer; g->visited = visited; i = height; while (i > 0) { buffer[i-1] = calloc(width, sizeof(char)); visited[i-1] = calloc(width, sizeof(bool)); i--; } i = 0; int j = 0; while (i < height) { if (j < width - 1) { buffer[i][j] = *s; j++; } else { i++; j = 0; } s++; } free(t); return g; }