correct rotation
authorLaurent Mazet <mazet@softndesign.org>
Sat, 22 Jun 2024 21:01:15 +0000 (23:01 +0200)
committerLaurent Mazet <mazet@softndesign.org>
Sat, 22 Jun 2024 21:01:15 +0000 (23:01 +0200)
function.c
function.h

index 6a579c1982e0e1f350ffe566dad9c2ffe0f8ad07..d3439201148a328c71015ba1d7b27eb9d31551e7 100644 (file)
@@ -33,6 +33,18 @@ board_t *initboard (int xsize, int ysize)
     return board;
 }
 
+void copyboard (board_t *dst, board_t *src)
+{
+    if (dst->xsize * dst->ysize != src->xsize * src->ysize) {
+        free (dst->tab);
+        dst->tab = (char *) calloc (1, src->xsize * src->ysize + 1);
+        CHECKALLOC (dst->tab);
+        dst->xsize = src->xsize;
+        dst->ysize = src->ysize;
+    }
+    memcpy (dst->tab, src->tab, dst->xsize * dst->ysize);
+}
+
 void freeboard (board_t *board)
 {
     if (board) {
@@ -152,7 +164,7 @@ board_t *loadboard (char *str)
     board_t *board = NULL;
     if ((tab) && (strlen (tab) == (size_t)(xsize * ysize))) {
         board = initboard (xsize, ysize);
-        strcpy (board->tab, tab);
+        memcpy (board->tab, tab, xsize * ysize);
     } else if (xsize * ysize > 0) {
         board = initboard (xsize, ysize);
     }
@@ -216,7 +228,7 @@ void computenextgen (board_t *board)
         }
     }
 
-    strcpy (board->tab, nextboard->tab);
+    copyboard (board, nextboard);
     freeboard (nextboard);
 }
 
@@ -227,7 +239,7 @@ void rotateelement (board_t *element, int rot)
     rot = (rot > 0) ? rot % 4 : ((1 - rot / 4) * 4 + rot) % 4;
 
     board_t *newelement = NULL;
-    if (rot % 2) {
+    if (rot % 2 == 0) {
         newelement = initboard (element->xsize, element->ysize);
     } else {
         newelement = initboard (element->ysize, element->xsize);
@@ -235,7 +247,7 @@ void rotateelement (board_t *element, int rot)
 
     switch (rot) {
     case 0:
-        strcpy (newelement->tab, element->tab);
+        copyboard (newelement, element);
         break;
     case 1:
         for (i = 0; i < element->xsize; i++) {
@@ -260,7 +272,7 @@ void rotateelement (board_t *element, int rot)
         break;
     }
 
-    strcpy (element->tab, newelement->tab);
+    copyboard (element, newelement);
 
     freeboard (newelement);
 }
index d7f34e1d8aa80356de66be97c3b762c12235d4fc..bc4a8cf2e2003f89c3d23e3eec9aeec5bb761c86 100644 (file)
@@ -15,6 +15,8 @@ int strmaxlen (char *str, char ch);
 
 board_t *initboard (int xsize, int ysize);
 
+void copyboard (board_t *dst, board_t *src);
+
 void freeboard (board_t *board);
 
 void cleanboard (board_t *board);