<% } %>
<% } %>
-<% void print_index(tile_t **tiles) { %>
+<% void print_index(row_t *rows) { %>
<!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">
<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;}
+ td { min-width:64px; height:64px; }
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>
+ <table cellpadding="0" cellspacing="0">
+ <% for (int row = 0; rows[row].ncols >= 0; row++) { %>
+ <tr>
+ <% for (int col = 0; col < rows[row].ncols; col++) { %>
+ <td>
+ <% print_img(rows[row].cols[col].bot); %>
+ <% print_img(rows[row].cols[col].top); %>
+ </td>
+ <% } %>
+ </tr>
<% } %>
- </tr>
- <% } %>
</table>
</body>
</html>
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include "knot.h"
-static void do_tile(tile_t **tiles, int row, int col)
+static void do_tile(row_t *rows, 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];
+ tile_t *t = &rows[row].cols[col];
/* Fill in what we know */
- switch (tiles[row][col].c) {
+ switch (t->c) {
case '-': t->top = LEFT | RIGHT; break;
case '|': t->top = UP | DOWN; break;
case '\'': t->top = UP; 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;
+ if (col > 0) {
+ tile_t *l = &rows[row].cols[col-1];
+ if (t->c == '|' && (l->top | l->bot) & RIGHT)
+ t->bot = LEFT | RIGHT;
+ }
+ if (row > 0 && rows[row-1].ncols > col) {
+ tile_t *u = &rows[row-1].cols[col];
+ 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)
+ tile_t *l = &rows[row].cols[col-1];
+ if (col > 0 && (l->top | l->bot) & RIGHT)
t->top |= LEFT;
else
t->top |= RIGHT;
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;
+ int row = 0, col = 0;
+ row_t *rows = calloc(sizeof(row_t), (row+2));
while ((c = getchar()) != EOF) {
- if (row > 63 || col > 511)
- exit(-1);
if (c == '\n') {
row++;
- col = 1;
+ col = 0;
+ rows = realloc(rows, sizeof(row_t) * (row+2));
+ rows[row+0] = (row_t){.ncols = 0};
+ rows[row+1] = (row_t){.ncols = -1};
} else {
- tiles[row][col].c = c;
+ rows[row].cols = realloc(rows[row].cols, sizeof(tile_t) * (col+1));
+ rows[row].ncols = col+1;
+ rows[row].cols[col] = (tile_t){.c = c};
+ do_tile(rows, row, col);
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");
- //}
+ if (0)
+ for (row = 0; rows[row].ncols >= 0; row++) {
+ for (col = 0; col > rows[row].ncols; col++) {
+ print_ptrn(rows[row].cols[col].top);
+ print_ptrn(rows[row].cols[col].bot);
+ printf(" ");
+ }
+ printf("\n");
+ }
/* HTML */
- print_index(tiles);
+ print_index(rows);
+
+ /* Free tile */
+ for (int row = 0; rows[row].ncols >= 0; row++)
+ if (rows[row].cols > 0)
+ free(rows[row].cols);
+ free(rows);
+
+ return 0;
}