diff options
| author | Adam Boot <rotator@gmail.com> | 2006-03-22 01:13:39 +0000 |
|---|---|---|
| committer | Adam Boot <rotator@gmail.com> | 2006-03-22 01:13:39 +0000 |
| commit | e1226f4305c76a8a7a98695194730902ddeaecc9 (patch) | |
| tree | 84cd6aebdd62b0cd09b83ce6477ff019553159ac /apps/plugins/bubbles.c | |
| parent | b0960aed111d63695f328d47b181a0bd620b42cb (diff) | |
| download | rockbox-e1226f4305c76a8a7a98695194730902ddeaecc9.zip rockbox-e1226f4305c76a8a7a98695194730902ddeaecc9.tar.gz rockbox-e1226f4305c76a8a7a98695194730902ddeaecc9.tar.bz2 rockbox-e1226f4305c76a8a7a98695194730902ddeaecc9.tar.xz | |
Fix stack overflow bug for real
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9174 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/bubbles.c')
| -rwxr-xr-x | apps/plugins/bubbles.c | 227 |
1 files changed, 146 insertions, 81 deletions
diff --git a/apps/plugins/bubbles.c b/apps/plugins/bubbles.c index 03f3b76..de0863b 100755 --- a/apps/plugins/bubbles.c +++ b/apps/plugins/bubbles.c @@ -1765,58 +1765,90 @@ static bool bubbles_ingroup(struct game_context* bb, int row, int col) { * type that the current bubble belongs to. ******************************************************************************/ static int bubbles_searchgroup(struct game_context* bb, int row, int col) { - int count = 1; - int adj = row%2; - int mytype = bb->playboard[row][col].type; + int i, adj; + int myrow, mycol, mytype; + int count = 0; - if (bb->playboard[row][col].ingroup) - return 0; - bb->playboard[row][col].ingroup = true; + struct coord { + int row; + int col; + } search[(2*BB_WIDTH-1)*(BB_HEIGHT/2)]; - /* recursively call neighbors */ - if(col-1 >= 0) { - if(bb->playboard[row][col-1].type == mytype && - !bb->playboard[row][col-1].ingroup) { - count += bubbles_searchgroup(bb, row, col-1); + /* search initial bubble */ + bb->playboard[row][col].ingroup = true; + search[count].row = row; + search[count].col = col; + count++; + + /* breadth-first search neighbors */ + for(i=0; i<count; i++) { + myrow = search[i].row; + mycol = search[i].col; + mytype = bb->playboard[myrow][mycol].type; + adj = myrow%2; + + if(mycol-1 >= 0) { + if(bb->playboard[myrow][mycol-1].type == mytype && + !bb->playboard[myrow][mycol-1].ingroup) { + bb->playboard[myrow][mycol-1].ingroup = true; + search[count].row = myrow; + search[count].col = mycol-1; + count++; + } } - } - if(col-1+adj >= 0) { - if(row-1 >= 0) { - if(bb->playboard[row-1][col-1+adj].type == mytype && - !bb->playboard[row-1][col-1+adj].ingroup) { - count += bubbles_searchgroup(bb, row-1, col-1+adj); + if(mycol-1+adj >= 0) { + if(myrow-1 >= 0) { + if(bb->playboard[myrow-1][mycol-1+adj].type == mytype && + !bb->playboard[myrow-1][mycol-1+adj].ingroup) { + bb->playboard[myrow-1][mycol-1+adj].ingroup = true; + search[count].row = myrow-1; + search[count].col = mycol-1+adj; + count++; + } } - } - if(row+1 < BB_HEIGHT) { - if(bb->playboard[row+1][col-1+adj].type == mytype && - !bb->playboard[row+1][col-1+adj].ingroup) { - count += bubbles_searchgroup(bb, row+1, col-1+adj); + if(myrow+1 < BB_HEIGHT) { + if(bb->playboard[myrow+1][mycol-1+adj].type == mytype && + !bb->playboard[myrow+1][mycol-1+adj].ingroup) { + bb->playboard[myrow+1][mycol-1+adj].ingroup = true; + search[count].row = myrow+1; + search[count].col = mycol-1+adj; + count++; + } } } - } - if(col+adj >= 0) { - if(row-1 >= 0) { - if(bb->playboard[row-1][col+adj].type == mytype && - !bb->playboard[row-1][col+adj].ingroup) { - count += bubbles_searchgroup(bb, row-1, col+adj); + if(mycol+adj >= 0) { + if(myrow-1 >= 0) { + if(bb->playboard[myrow-1][mycol+adj].type == mytype && + !bb->playboard[myrow-1][mycol+adj].ingroup) { + bb->playboard[myrow-1][mycol+adj].ingroup = true; + search[count].row = myrow-1; + search[count].col = mycol+adj; + count++; + } } - } - if(row+1 < BB_HEIGHT) { - if(bb->playboard[row+1][col+adj].type == mytype && - !bb->playboard[row+1][col+adj].ingroup) { - count += bubbles_searchgroup(bb, row+1, col+adj); + if(myrow+1 < BB_HEIGHT) { + if(bb->playboard[myrow+1][mycol+adj].type == mytype && + !bb->playboard[myrow+1][mycol+adj].ingroup) { + bb->playboard[myrow+1][mycol+adj].ingroup = true; + search[count].row = myrow+1; + search[count].col = mycol+adj; + count++; + } } } - } - if(col+1 < BB_WIDTH-adj) { - if(bb->playboard[row][col+1].type == mytype && - !bb->playboard[row][col+1].ingroup) { - count += bubbles_searchgroup(bb, row, col+1); + if(mycol+1 < BB_WIDTH-adj) { + if(bb->playboard[myrow][mycol+1].type == mytype && + !bb->playboard[myrow][mycol+1].ingroup) { + bb->playboard[myrow][mycol+1].ingroup = true; + search[count].row = myrow; + search[count].col = mycol+1; + count++; + } } } @@ -1875,63 +1907,96 @@ static int bubbles_remove(struct game_context* bb) { * current bubble. ******************************************************************************/ static void bubbles_anchored(struct game_context* bb, int row, int col) { - int adj = row%2; + int i, adj; + int myrow, mycol, mytype; + int count = 0; - if (bb->playboard[row][col].anchored) - return; - /* mark bubble */ - bb->playboard[row][col].anchored = true; + struct coord { + int row; + int col; + } search[(2*BB_WIDTH-1)*(BB_HEIGHT/2)]; - /* recursively call neighbors */ - if(col-1 >= 0) { - if(bb->playboard[row][col-1].type >= 0 && - !bb->playboard[row][col-1].ingroup && - !bb->playboard[row][col-1].anchored) { - bubbles_anchored(bb, row, col-1); + /* search initial bubble */ + bb->playboard[row][col].anchored = true; + search[count].row = row; + search[count].col = col; + count++; + + /* breadth-first search neighbors */ + for(i=0; i<count; i++) { + myrow = search[i].row; + mycol = search[i].col; + mytype = bb->playboard[myrow][mycol].type; + adj = myrow%2; + + if(mycol-1 >= 0) { + if(bb->playboard[myrow][mycol-1].type >= 0 && + !bb->playboard[myrow][mycol-1].ingroup && + !bb->playboard[myrow][mycol-1].anchored) { + bb->playboard[myrow][mycol-1].anchored = true; + search[count].row = myrow; + search[count].col = mycol-1; + count++; + } } - } - if(col-1+adj >= 0) { - if(row-1 >= 0) { - if(bb->playboard[row-1][col-1+adj].type >= 0 && - !bb->playboard[row-1][col-1+adj].ingroup && - !bb->playboard[row-1][col-1+adj].anchored) { - bubbles_anchored(bb, row-1, col-1+adj); + if(mycol-1+adj >= 0) { + if(myrow-1 >= 0) { + if(bb->playboard[myrow-1][mycol-1+adj].type >= 0 && + !bb->playboard[myrow-1][mycol-1+adj].ingroup && + !bb->playboard[myrow-1][mycol-1+adj].anchored) { + bb->playboard[myrow-1][mycol-1+adj].anchored = true; + search[count].row = myrow-1; + search[count].col = mycol-1+adj; + count++; + } } - } - if(row+1 < BB_HEIGHT) { - if(bb->playboard[row+1][col-1+adj].type >= 0 && - !bb->playboard[row+1][col-1+adj].ingroup && - !bb->playboard[row+1][col-1+adj].anchored) { - bubbles_anchored(bb, row+1, col-1+adj); + if(myrow+1 < BB_HEIGHT) { + if(bb->playboard[myrow+1][mycol-1+adj].type >= 0 && + !bb->playboard[myrow+1][mycol-1+adj].ingroup && + !bb->playboard[myrow+1][mycol-1+adj].anchored) { + bb->playboard[myrow+1][mycol-1+adj].anchored = true; + search[count].row = myrow+1; + search[count].col = mycol-1+adj; + count++; + } } } - } - if(col+adj >= 0) { - if(row-1 >= 0) { - if(bb->playboard[row-1][col+adj].type >= 0 && - !bb->playboard[row-1][col+adj].ingroup && - !bb->playboard[row-1][col+adj].anchored) { - bubbles_anchored(bb, row-1, col+adj); + if(mycol+adj >= 0) { + if(myrow-1 >= 0) { + if(bb->playboard[myrow-1][mycol+adj].type >= 0 && + !bb->playboard[myrow-1][mycol+adj].ingroup && + !bb->playboard[myrow-1][mycol+adj].anchored) { + bb->playboard[myrow-1][mycol+adj].anchored = true; + search[count].row = myrow-1; + search[count].col = mycol+adj; + count++; + } } - } - if(row+1 < BB_HEIGHT) { - if(bb->playboard[row+1][col+adj].type >= 0 && - !bb->playboard[row+1][col+adj].ingroup && - !bb->playboard[row+1][col+adj].anchored) { - bubbles_anchored(bb, row+1, col+adj); + if(myrow+1 < BB_HEIGHT) { + if(bb->playboard[myrow+1][mycol+adj].type >= 0 && + !bb->playboard[myrow+1][mycol+adj].ingroup && + !bb->playboard[myrow+1][mycol+adj].anchored) { + bb->playboard[myrow+1][mycol+adj].anchored = true; + search[count].row = myrow+1; + search[count].col = mycol+adj; + count++; + } } } - } - if(col+1 < BB_WIDTH-adj) { - if(bb->playboard[row][col+1].type >= 0 && - !bb->playboard[row][col+1].ingroup && - !bb->playboard[row][col+1].anchored) { - bubbles_anchored(bb, row, col+1); + if(mycol+1 < BB_WIDTH-adj) { + if(bb->playboard[myrow][mycol+1].type >= 0 && + !bb->playboard[myrow][mycol+1].ingroup && + !bb->playboard[myrow][mycol+1].anchored) { + bb->playboard[myrow][mycol+1].anchored = true; + search[count].row = myrow; + search[count].col = mycol+1; + count++; + } } } } |