From fc33c79577cf7d6b93898968319fe6b98ec61986 Mon Sep 17 00:00:00 2001 From: kaa Date: Wed, 18 Jun 2025 03:12:30 -0700 Subject: Generic 2D graph --- graph.h | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 graph.h (limited to 'graph.h') 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; +} -- cgit v1.2.3