]> git.huck.website - gol.git/commitdiff
input file map generation
authorHuck Boles <huck@huck.website>
Tue, 24 Jan 2023 19:52:46 +0000 (13:52 -0600)
committerHuck Boles <huck@huck.website>
Tue, 24 Jan 2023 19:52:46 +0000 (13:52 -0600)
Makefile
src/function.c
src/gol.c
src/gol.h
src/map.c

index 4ef4aaa72f33c7c14cc3009794eeb86caf571ee0..7d9852e840707c8c918e7e0678b38b14ee070e7c 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -66,8 +66,8 @@ $(OBJDIR)/%.o: $(SRCDIR)/%.c $(HDR)
 clean:
        -rm -f $(BUILD)/* $(OBJDIR)/*
 
-debug: CFLAGS += -ggdb3 -Og
-debug: $(BIN)
+debug: $(SRC)
+       $(CC) $(SRC) $(FLAGS) -ggdb3 -Og -pipe -o $(BIN)-debug
 
 $(MANPAGE): $(MAN)
        $(ZIP) -c $(MAN) > $(MANPAGE)
index 14b6580b247da28acc51681c9e8ae09b6b650d05..363f253acf12d766c1f946c2bad0e0b9764fabe0 100644 (file)
@@ -1,11 +1,12 @@
 #include "gol.h"
 
 
-extern int row,col,step,ascii,color,weight;
+extern int row,col,step,ascii,color,weight,file;
+extern char *filename;
 
 void parseopts(int n, char **args){
     char c;
-    while ((c = getopt(n,args,"hVacy:x:t:w:")) != -1){
+    while ((c = getopt(n,args,"hVacy:x:t:w:f:")) != -1){
         switch (c) {
             case 'h':
                 help();
@@ -29,6 +30,10 @@ void parseopts(int n, char **args){
             case 'a':
                 ascii = 1;
                 break;
+            case 'f':
+                file = 1;
+                strcpy(filename,optarg);
+                break;
             case '?':
                 fprintf(stderr, "\t%s\n",optarg);
                 errorcheck(FLAG_ERR);
@@ -54,6 +59,8 @@ void errorcheck(int err){
 
     if ((err & STATE_ERR) != 0) { fprintf(stderr,"ERROR: Could not determine cell state\n"); }
 
+    if ((err & FILE_ERR) != 0) { fprintf(stderr,"ERROR: Could not open file\n"); }
+
     exit(err);
 }
 
index 093a3686de1475dd5bd071bcaf2fadad02945ea5..5a010b8014f16cd63757543762cc907e214af0f4 100644 (file)
--- a/src/gol.c
+++ b/src/gol.c
@@ -1,6 +1,7 @@
 #include "gol.h"
 
-int  row,col,step,ascii,weight;
+int  row,col,step,ascii,weight,file;
+char *filename;
 
 int main(int argc, char *argv[]){
     srand(time(NULL));
@@ -11,11 +12,17 @@ int main(int argc, char *argv[]){
     step = 75000;
     ascii = 0;
     weight = 5;
+    file = 0;
 
+    filename = malloc(sizeof(char) * MAXLINE);
     parseopts(argc,argv);
-
     struct map map = newmap();
-    genmap(map);
+
+    if (file) {
+        mapfile(map,filename);
+    } else {
+        genmap(map);
+    }
 
     while (stop > 0){
         stop = updatemap(map);
@@ -24,7 +31,7 @@ int main(int argc, char *argv[]){
     }
 
     freemap(map);
-
+    free(filename);
     return 0;
 }
 
index 517b8089ce067d01a5742fcb058d0e4a4ba2baee..f81ba77fef1c0926b6ec3a6f41ec7c62c2d25aaa 100644 (file)
--- a/src/gol.h
+++ b/src/gol.h
@@ -15,7 +15,7 @@
 enum {DIE = -1, DEAD = 0, ALIVE = 1, SPAWN = 1 << 1};
 
 /* error codes */
-enum {NO_ERR = 0, FLAG_ERR = 1, STATE_ERR = 1 << 1, COLOR_ERR = 1 << 2};
+enum {NO_ERR = 0, FLAG_ERR = 1, STATE_ERR = 1 << 1, COLOR_ERR = 1 << 2, FILE_ERR = 1 << 3};
 
 struct cell {
     char    pixel[4];
@@ -39,6 +39,7 @@ void printdisplay(struct map);
 
 /* map.c */
 void genmap(struct map);
+void mapfile(struct map, char *);
 int updatemap(struct map);
 int numneighbor(struct map,int,int);
 int checkstate(struct map,int,int);
index ae5ca413d6dc4f39fc277fdd051ce876db56834d..95c3e206a2a306bed623df6082aa853851bfdee2 100644 (file)
--- a/src/map.c
+++ b/src/map.c
@@ -17,10 +17,43 @@ void genmap(struct map map){
     return;
 }
 
+void mapfile(struct map map, char *file){
+    FILE *fp = fopen(file, "r");
+    if (!fp) errorcheck(FILE_ERR);
+    
+    int r = 0;
+    int c = 0;
+    char x = ' ';
+
+    while ((x = getc(fp)) != EOF){
+        /* exit if more rows than in map */
+        if (r >= row) { break; }
+
+        /* spaces are dead, anything else alive */
+        if (x == ' ') { 
+            map.line[r].cell[c].state = DEAD;
+        } else if (c < col) {
+            map.line[r].cell[c].state = ALIVE;
+        }
+
+        /* move down a row and reset columns at newlines and column limits */
+        if (x == '\n' || c >= col ) { 
+            map.line[r].cell[c].state = DEAD;
+            r++,c=0; 
+        }
+
+        c++;
+    }
+
+    fclose(fp);
+    return;
+}
+
 int updatemap(struct map map){
     int n = 0;
     struct map tmp = newmap();
 
+    /* non edges */
     for (int r = 0; r < row-1; r++){
         for(int c = 0; c < col-1; c++){
             int state = checkstate(map,r,c);
@@ -31,6 +64,7 @@ int updatemap(struct map map){
         }
     }
 
+    /* left/right side */
     for (int r = 0; r < row -1; r++){
         int state = checkstate(map,r,0);
         tmp.line[r].cell[col-1].state = state;
@@ -39,6 +73,7 @@ int updatemap(struct map map){
         if (state > DEAD){ n++; }
     }
 
+    /* top/bottom */
     for (int c = 0; c < col -1; c++){
         int state = checkstate(map,0,c);
         tmp.line[row-1].cell[c].state = state;
@@ -47,6 +82,7 @@ int updatemap(struct map map){
         if (state > DEAD){ n++; }
     }
 
+    /* copy to map */
     for(int r = 0; r < row; r++){
         for (int c = 0; c < col; c++){
             map.line[r].cell[c] = tmp.line[r].cell[c];