gol

Implementation of Conway's Game of Life writen in C
git clone git://git.dimitrijedobrota.com/gol.git
Log | Files | Refs | README |

commitbe55fc01455e080935b3266f96fe04a946871bb2
parent1097adf7f863b6563435ade0fac1afccaef8562d
authorDimitrije Dobrota <mail@dimitrijedobrota.com>
dateThu, 9 Jun 2022 12:41:36 +0200

General improvement and bug fixing - Add file safety - Load pattern overwrites the cells beneath - Load game does not take previous cursor position into the count

Diffstat:
Minclude/utils.h|++++++++-
Msrc/file.c|+++++++++++++++++++++++---------------

2 files changed, 31 insertions(+), 16 deletions(-)


diff --git a/include/utils.h b/include/utils.h

@@ -34,7 +34,14 @@

#define MEM_CHECK(x) \
if ((x) == NULL) { \
display_stop(); \
printf("MEM GRESKA"); \
printf("MEM ERROR"); \
abort(); \
}
#define FILE_CHECK(x) \
if ((x) == NULL) { \
display_stop(); \
printf("FILE ERROR"); \
abort(); \
}

diff --git a/src/file.c b/src/file.c

@@ -162,30 +162,40 @@ extern int save_cells_s, pos_y, pos_x, evolve_index;

extern int width, height;
void file_load_pattern(char *name, int index) {
FILE *f;
char *fname;
int min_y = INT_MAX, min_x = INT_MAX, max_y = -1, max_x = -1;
int row, col, val;
MEM_CHECK(fname = malloc((strlen(name) + 5) * sizeof(char)));
sprintf(fname, "%s.part", name);
FILE *f = fopen(fname, "r");
if (!f)
exit(1);
FILE_CHECK(f = fopen(fname, "r"));
int row, col, val;
while (fscanf(f, "%d %d %d", &row, &col, &val) != EOF) {
setAt(pos_y + row, pos_x + col, val);
min_y = MIN(min_y, row);
min_x = MIN(min_x, col);
max_y = MAX(max_y, row);
max_x = MAX(max_x, col);
}
for (int i = min_y; i <= max_y; i++)
for (int j = min_x; j <= max_x; j++)
setAt(i + pos_y, j + pos_x, 0);
rewind(f);
while (fscanf(f, "%d %d %d", &row, &col, &val) != EOF)
setAt(pos_y + row, pos_x + col, val);
}
void file_save_pattern(char *name, int index) {
FILE *f;
char *fname;
MEM_CHECK(fname = malloc((strlen(name) + 5) * sizeof(char)));
sprintf(fname, "%s.part", name);
FILE *f = fopen(fname, "w");
if (!f)
exit(1);
FILE_CHECK(f = fopen(fname, "w"));
int min_y = save_cells[0]->cord.row;
int min_x = save_cells[0]->cord.col;

@@ -204,34 +214,32 @@ void file_save_pattern(char *name, int index) {

}
void file_load(char *name, int index) {
FILE *f;
char *fname;
int w, h;
MEM_CHECK(fname = malloc((strlen(name) + 5) * sizeof(char)));
sprintf(fname, "%s.all", name);
FILE *f = fopen(fname, "r");
if (!f)
exit(1);
FILE_CHECK(f = fopen(fname, "r"));
fscanf(f, "%d %d %d", &h, &w, &evolve_index);
int row, col, val;
while (fscanf(f, "%d %d %d", &row, &col, &val) != EOF) {
setAt(pos_y + row, pos_x + col, val);
setAt(row, col, val);
}
game(h, w, evolve_index);
}
void file_save(char *name, int index) {
FILE *f;
char *fname;
MEM_CHECK(fname = malloc((strlen(name) + 5) * sizeof(char)));
sprintf(fname, "%s.all", name);
FILE *f = fopen(fname, "w");
if (!f)
exit(1);
FILE_CHECK(f = fopen(fname, "w"));
fprintf(f, "%d %d %d\n", height, width, evolve_index);
for (Cell *c = hash; c != NULL; c = c->hh.next) {