--- /dev/null
+<% #include "knot.h" %>
+
+<% static void print_img(int ptrn) { %>
+ <% if (ptrn) { %>
+ <img src="img/<% if (ptrn & LEFT ) printf("l"); %>
+ <% if (ptrn & RIGHT) printf("r"); %>
+ <% if (ptrn & UP ) printf("u"); %>
+ <% if (ptrn & DOWN ) printf("d"); %>.png">
+ <% } %>
+<% } %>
+
+<% void print_index(tile_t **tiles) { %>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+ <title>Knot</title>
+ <meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
+ <head>
+ <style type="text/css">
+ * { border:0; margin:0; padding:0; }
+ table { border-collapse:separate; margin:auto; width:1800px;}
+ td { width:64px; height:64px; border-spacing:0px 0px;}
+ img { position:absolute; }
+ </style>
+ </head>
+ <body>
+ <table cellpadding="0" cellspacing="0">
+ <% for (int row = 1; row < 10; row++) { %>
+ <tr>
+ <% for (int col = 1; col < 30; col++) { %>
+ <td>
+ <% print_img(tiles[row][col].bot); %>
+ <% print_img(tiles[row][col].top); %>
+ </td>
+ <% } %>
+ </tr>
+ <% } %>
+ </table>
+ </body>
+</html>
+<% } %>
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "knot.h"
+
+static void do_tile(tile_t **tiles, int row, int col)
+{
+ tile_t *t = &tiles[row][col];
+ tile_t *l = &tiles[row][col-1];
+ tile_t *r = &tiles[row][col+1];
+ tile_t *u = &tiles[row-1][col];
+ //tile_t *d = &tiles[row+1][col];
+
+ /* Fill in what we know */
+ switch (tiles[row][col].c) {
+ case '-': t->top = LEFT | RIGHT; break;
+ case '|': t->top = UP | DOWN; break;
+ case '\'': t->top = UP; break;
+ case '.': t->top = DOWN; break;
+ }
+
+ /* Follow bottoms */
+ if (t->c == '|' && (l->top | l->bot) & RIGHT)
+ t->bot = LEFT | RIGHT;
+ if (t->c == '-' && (u->top | u->bot) & DOWN)
+ t->bot = UP | DOWN;
+
+ /* Adds sides for ''s and .'s */
+ if (t->c == '.' || t->c == '\'') {
+ if ((l->top | l->bot) & RIGHT)
+ t->top |= LEFT;
+ else
+ t->top |= RIGHT;
+ }
+
+}
+
+static void print_ptrn(int ptrn)
+{
+ printf("%c", ptrn & LEFT ? '<' : '-');
+ printf("%c", ptrn & RIGHT ? '>' : '-');
+ printf("%c", ptrn & UP ? '^' : '-');
+ printf("%c", ptrn & DOWN ? 'v' : '-');
+}
+
+int main()
+{
+ /* Init tiles */
+ tile_t *tiles[64];
+ for (int i = 0; i < 64; i++)
+ tiles[i] = calloc(512, sizeof(tile_t));
+
+ /* Read data */
+ char c;
+ int row = 1, col = 1;
+ while ((c = getchar()) != EOF) {
+ if (row > 63 || col > 511)
+ exit(-1);
+ if (c == '\n') {
+ row++;
+ col = 1;
+ } else {
+ tiles[row][col].c = c;
+ col++;
+ }
+ }
+
+ /* Process */
+ for (row = 1; row < 63; row++)
+ for (col = 1; col < 511; col++)
+ do_tile(tiles, row, col);
+
+ /* Output */
+ //for (row = 1; row < 63; row++) {
+ // for (col = 1; col < 511; col++) {
+ // print_ptrn(tiles[row][col].top);
+ // print_ptrn(tiles[row][col].bot);
+ // printf(" ");
+ // }
+ // printf("\n");
+ //}
+
+ /* HTML */
+ print_index(tiles);
+}