board->tab = (char *) calloc (1, width * height + 1);
CHECKALLOC (board->tab);
memset (board->tab, ' ', width * height);
- board->current = (char *) calloc (1, width * height + 1);
- CHECKALLOC (board->current);
- memset (board->current, ' ', width * height);
board->scale = 0;
board->xsize = board->width = width;
board->ysize = board->height = height;
board->xoffset = 0;
board->yoffset = 0;
+ board->current = -1;
board->next = -1;
return board;
}
{
board_t *newboard = initboard (board->width, board->height);
char *tab = newboard->tab;
- char *current = newboard->current;
memcpy (newboard, board, sizeof (board_t));
newboard->tab = tab;
- newboard->current = current;
memcpy (newboard->tab, board->tab, board->width * board->height + 1);
- memcpy (newboard->current, board->current, board->width * board->height + 1);
return newboard;
}
{
if (board) {
free (board->tab);
- free (board->current);
}
free (board);
}
char *saveboard (board_t *board)
{
- int size = 3 * (8 + 3) + 8 + board->width * board->height + 1;
+ int size = 4 * (8 + 3) + 8 + board->width * board->height + 1;
VERBOSE (INFO, size += board->height * (8 + board->width));
char *buffer = (char *) calloc (size, 1);
int l = sprintf (buffer, "width: %d\n", board->width);
l += sprintf (buffer + l, "height: %d\n", board->height);
l += sprintf (buffer + l, "tab: \"%s\"\n", board->tab);
- l += sprintf (buffer + l, "current: \"%s\"\n", board->current);
+ l += sprintf (buffer + l, "current: \"%d\"\n", board->current);
l += sprintf (buffer + l, "next: %d\n", board->next);
VERBOSE (INFO, _makecomments (buffer + l, board));
int width = 0;
int height = 0;
char *tab = NULL;
- char *current = NULL;
+ int current = -1;
int next = -1;
char *saveptr1, *saveptr2;
} else if (strcmp (keyword, "tab") == 0) {
tab = atos (value);
} else if (strcmp (keyword, "current") == 0) {
- current = atos (value);
+ current = atoi (value);
} else if (strcmp (keyword, "next") == 0) {
next = atoi (value);
} else if (strcmp (keyword, "rem") == 0) {
}
board_t *board = NULL;
- if ((tab) && (strlen (tab) == (size_t)(width * height)) &&
- (current) && (strlen (current) == (size_t)(width * height))) {
+ if ((tab) && (strlen (tab) == (size_t)(width * height))) {
board = initboard (width, height);
memcpy (board->tab, tab, width * height);
- memcpy (board->current, current, width * height);
+ board->current = current;
board->next = next;
}
return board;
}
-char *getcell (board_t *board, int x, int y)
+block_t *initblock (int width, int height)
{
- return board->tab + x + board->width * y;
+ block_t *block = (block_t *) malloc (sizeof (block_t));
+ CHECKALLOC (block);
+ block->tab = (char *) calloc (1, width * height + 1);
+ CHECKALLOC (block->tab);
+ memset (block->tab, ' ', width * height);
+ block->width = width;
+ block->height = height;
+ return block;
}
-char getvalue (board_t *board, int x, int y)
+block_t *changeblock (block_t *dest, block_t *src)
{
- return (x >= 0) && (x < board->width) && (y >= 0) && (y < board->height) ? *getcell (board, x, y) : 0;
+ block_t *ret = NULL;
+ if (dest && src) {
+ free (dest->tab);
+ memcpy (dest, src, sizeof (block_t));
+ dest->tab = strdup (src->tab);
+ CHECKALLOC (dest->tab);
+ ret = dest;
+ }
+ return ret;
+}
+
+block_t *copyblock (block_t *block)
+{
+ block_t *newblock = initblock (block->width, block->height);
+ char *tab = newblock->tab;
+ memcpy (newblock, block, sizeof (block_t));
+ newblock->tab = tab;
+ memcpy (newblock->tab, block->tab, block->width * block->height + 1);
+ return newblock;
+}
+
+void freeblock (block_t *block)
+{
+ if (block) {
+ free (block->tab);
+ }
+ free (block);
+}
+
+block_t *rotateelement (block_t *element, int rot)
+{
+ int i, j;
+
+ rot = (rot > 0) ? rot % 4 : ((1 - rot / 4) * 4 + rot) % 4;
+
+ block_t *newelement = NULL;
+
+ switch (rot) {
+ case 0:
+ newelement = copyblock (element);
+ break;
+ case 1:
+ newelement = initblock (element->height, element->width);
+ for (i = 0; i < element->width; i++) {
+ for (j = 0; j < element->height; j++) {
+ *getcell (newelement, element->height - 1 - j, i) = *getcell (element, i, j);
+ }
+ }
+ break;
+ case 2:
+ newelement = initblock (element->width, element->height);
+ for (i = 0; i < element->width; i++) {
+ for (j = 0; j < element->height; j++) {
+ *getcell (newelement, element->width - 1 - i, element->height - 1 - j) = *getcell (element, i, j);
+ }
+ }
+ break;
+ case 3:
+ newelement = initblock (element->height, element->width);
+ for (i = 0; i < element->width; i++) {
+ for (j = 0; j < element->height; j++) {
+ *getcell (newelement, j, element->width - 1 - i) = *getcell (element, i, j);
+ }
+ }
+ break;
+ }
+
+ changeblock (element, newelement);
+ freeblock (newelement);
+
+ return element;
}
/* vim: set ts=4 sw=4 et: */