golImplementation of Conway's Game of Life writen in C |
git clone git://git.dimitrijedobrota.com/gol.git |
Log | Files | Refs | README | |
commit | be55fc01455e080935b3266f96fe04a946871bb2 |
parent | 1097adf7f863b6563435ade0fac1afccaef8562d |
author | Dimitrije Dobrota <mail@dimitrijedobrota.com> |
date | Thu, 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:M | include/utils.h | | | ++++++++- |
M | src/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) {