summaryrefslogtreecommitdiff
path: root/graph.h
diff options
context:
space:
mode:
Diffstat (limited to 'graph.h')
-rw-r--r--graph.h73
1 files changed, 73 insertions, 0 deletions
diff --git a/graph.h b/graph.h
new file mode 100644
index 0000000..0b6c5c2
--- /dev/null
+++ b/graph.h
@@ -0,0 +1,73 @@
+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;
+}