From: Andy Spencer Date: Sat, 16 Jan 2010 23:35:08 +0000 (+0000) Subject: Memory fixes X-Git-Url: http://pileus.org/git/?p=~andy%2Fct;a=commitdiff_plain;h=cf7703acc5f2ea954c6ca6d5463da6a6a5e1b10b Memory fixes - Don't rely on left/right/top/bottom padding - Free allocated memory --- diff --git a/knot/html.ct b/knot/html.ct index fa6e766..a80c21d 100644 --- a/knot/html.ct +++ b/knot/html.ct @@ -22,17 +22,17 @@ - - <% for (int row = 1; rows[row].cols; row++) { %> - - <% for (int col = 1; col < rows[row].ncols; col++) { %> - +
- <% print_img(rows[row].cols[col].bot); %> - <% print_img(rows[row].cols[col].top); %> -
+ <% for (int row = 0; rows[row].ncols >= 0; row++) { %> + + <% for (int col = 0; col < rows[row].ncols; col++) { %> + + <% } %> + <% } %> - - <% } %>
+ <% print_img(rows[row].cols[col].bot); %> + <% print_img(rows[row].cols[col].top); %> +
diff --git a/knot/knot.c b/knot/knot.c index 9743cf4..a859bab 100644 --- a/knot/knot.c +++ b/knot/knot.c @@ -6,9 +6,7 @@ static void do_tile(row_t *rows, int row, int col) { - tile_t *t = &rows[row ].cols[col ]; - tile_t *l = &rows[row ].cols[col-1]; - tile_t *u = &rows[row-1].cols[col ]; + tile_t *t = &rows[row].cols[col]; /* Fill in what we know */ switch (t->c) { @@ -19,15 +17,21 @@ static void do_tile(row_t *rows, int row, int col) } /* Follow bottoms */ - if (t->c == '|' && (l->top | l->bot) & RIGHT) - t->bot = LEFT | RIGHT; - if (rows[row-1].ncols >= col) + 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; @@ -47,34 +51,43 @@ int main() { /* Init tiles */ 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 (c == '\n') { row++; - col = 1; + col = 0; rows = realloc(rows, sizeof(row_t) * (row+2)); - rows[row+1] = (row_t){}; + rows[row+0] = (row_t){.ncols = 0}; + rows[row+1] = (row_t){.ncols = -1}; } else { rows[row].cols = realloc(rows[row].cols, sizeof(tile_t) * (col+1)); rows[row].ncols = col+1; - rows[row].cols[col] = (tile_t){}; - rows[row].cols[col].c = c; + rows[row].cols[col] = (tile_t){.c = c}; do_tile(rows, row, col); 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(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; } diff --git a/knot/mkfile b/knot/mkfile index ea142e4..dc787dd 100644 --- a/knot/mkfile +++ b/knot/mkfile @@ -1,7 +1,8 @@ PROGS=knot CLEAN=html.c *.html -default:V: hitch.html +knots=`{ls *.txt} +default:V: ${knots:%.txt=%.html} knot: knot.o html.o knot.h