summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorAdam Boot <rotator@gmail.com>2006-03-22 01:13:39 +0000
committerAdam Boot <rotator@gmail.com>2006-03-22 01:13:39 +0000
commite1226f4305c76a8a7a98695194730902ddeaecc9 (patch)
tree84cd6aebdd62b0cd09b83ce6477ff019553159ac /apps
parentb0960aed111d63695f328d47b181a0bd620b42cb (diff)
downloadrockbox-e1226f4305c76a8a7a98695194730902ddeaecc9.tar.gz
rockbox-e1226f4305c76a8a7a98695194730902ddeaecc9.zip
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')
-rwxr-xr-xapps/plugins/bubbles.c227
1 files changed, 146 insertions, 81 deletions
diff --git a/apps/plugins/bubbles.c b/apps/plugins/bubbles.c
index 03f3b767c9..de0863b1a3 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) {
1765* type that the current bubble belongs to. 1765* type that the current bubble belongs to.
1766******************************************************************************/ 1766******************************************************************************/
1767static int bubbles_searchgroup(struct game_context* bb, int row, int col) { 1767static int bubbles_searchgroup(struct game_context* bb, int row, int col) {
1768 int count = 1; 1768 int i, adj;
1769 int adj = row%2; 1769 int myrow, mycol, mytype;
1770 int mytype = bb->playboard[row][col].type; 1770 int count = 0;
1771 1771
1772 if (bb->playboard[row][col].ingroup) 1772 struct coord {
1773 return 0; 1773 int row;
1774 bb->playboard[row][col].ingroup = true; 1774 int col;
1775 } search[(2*BB_WIDTH-1)*(BB_HEIGHT/2)];
1775 1776
1776 /* recursively call neighbors */ 1777 /* search initial bubble */
1777 if(col-1 >= 0) { 1778 bb->playboard[row][col].ingroup = true;
1778 if(bb->playboard[row][col-1].type == mytype && 1779 search[count].row = row;
1779 !bb->playboard[row][col-1].ingroup) { 1780 search[count].col = col;
1780 count += bubbles_searchgroup(bb, row, col-1); 1781 count++;
1782
1783 /* breadth-first search neighbors */
1784 for(i=0; i<count; i++) {
1785 myrow = search[i].row;
1786 mycol = search[i].col;
1787 mytype = bb->playboard[myrow][mycol].type;
1788 adj = myrow%2;
1789
1790 if(mycol-1 >= 0) {
1791 if(bb->playboard[myrow][mycol-1].type == mytype &&
1792 !bb->playboard[myrow][mycol-1].ingroup) {
1793 bb->playboard[myrow][mycol-1].ingroup = true;
1794 search[count].row = myrow;
1795 search[count].col = mycol-1;
1796 count++;
1797 }
1781 } 1798 }
1782 }
1783 1799
1784 if(col-1+adj >= 0) { 1800 if(mycol-1+adj >= 0) {
1785 if(row-1 >= 0) { 1801 if(myrow-1 >= 0) {
1786 if(bb->playboard[row-1][col-1+adj].type == mytype && 1802 if(bb->playboard[myrow-1][mycol-1+adj].type == mytype &&
1787 !bb->playboard[row-1][col-1+adj].ingroup) { 1803 !bb->playboard[myrow-1][mycol-1+adj].ingroup) {
1788 count += bubbles_searchgroup(bb, row-1, col-1+adj); 1804 bb->playboard[myrow-1][mycol-1+adj].ingroup = true;
1805 search[count].row = myrow-1;
1806 search[count].col = mycol-1+adj;
1807 count++;
1808 }
1789 } 1809 }
1790 }
1791 1810
1792 if(row+1 < BB_HEIGHT) { 1811 if(myrow+1 < BB_HEIGHT) {
1793 if(bb->playboard[row+1][col-1+adj].type == mytype && 1812 if(bb->playboard[myrow+1][mycol-1+adj].type == mytype &&
1794 !bb->playboard[row+1][col-1+adj].ingroup) { 1813 !bb->playboard[myrow+1][mycol-1+adj].ingroup) {
1795 count += bubbles_searchgroup(bb, row+1, col-1+adj); 1814 bb->playboard[myrow+1][mycol-1+adj].ingroup = true;
1815 search[count].row = myrow+1;
1816 search[count].col = mycol-1+adj;
1817 count++;
1818 }
1796 } 1819 }
1797 } 1820 }
1798 }
1799 1821
1800 if(col+adj >= 0) { 1822 if(mycol+adj >= 0) {
1801 if(row-1 >= 0) { 1823 if(myrow-1 >= 0) {
1802 if(bb->playboard[row-1][col+adj].type == mytype && 1824 if(bb->playboard[myrow-1][mycol+adj].type == mytype &&
1803 !bb->playboard[row-1][col+adj].ingroup) { 1825 !bb->playboard[myrow-1][mycol+adj].ingroup) {
1804 count += bubbles_searchgroup(bb, row-1, col+adj); 1826 bb->playboard[myrow-1][mycol+adj].ingroup = true;
1827 search[count].row = myrow-1;
1828 search[count].col = mycol+adj;
1829 count++;
1830 }
1805 } 1831 }
1806 }
1807 1832
1808 if(row+1 < BB_HEIGHT) { 1833 if(myrow+1 < BB_HEIGHT) {
1809 if(bb->playboard[row+1][col+adj].type == mytype && 1834 if(bb->playboard[myrow+1][mycol+adj].type == mytype &&
1810 !bb->playboard[row+1][col+adj].ingroup) { 1835 !bb->playboard[myrow+1][mycol+adj].ingroup) {
1811 count += bubbles_searchgroup(bb, row+1, col+adj); 1836 bb->playboard[myrow+1][mycol+adj].ingroup = true;
1837 search[count].row = myrow+1;
1838 search[count].col = mycol+adj;
1839 count++;
1840 }
1812 } 1841 }
1813 } 1842 }
1814 }
1815 1843
1816 if(col+1 < BB_WIDTH-adj) { 1844 if(mycol+1 < BB_WIDTH-adj) {
1817 if(bb->playboard[row][col+1].type == mytype && 1845 if(bb->playboard[myrow][mycol+1].type == mytype &&
1818 !bb->playboard[row][col+1].ingroup) { 1846 !bb->playboard[myrow][mycol+1].ingroup) {
1819 count += bubbles_searchgroup(bb, row, col+1); 1847 bb->playboard[myrow][mycol+1].ingroup = true;
1848 search[count].row = myrow;
1849 search[count].col = mycol+1;
1850 count++;
1851 }
1820 } 1852 }
1821 } 1853 }
1822 1854
@@ -1875,63 +1907,96 @@ static int bubbles_remove(struct game_context* bb) {
1875* current bubble. 1907* current bubble.
1876******************************************************************************/ 1908******************************************************************************/
1877static void bubbles_anchored(struct game_context* bb, int row, int col) { 1909static void bubbles_anchored(struct game_context* bb, int row, int col) {
1878 int adj = row%2; 1910 int i, adj;
1911 int myrow, mycol, mytype;
1912 int count = 0;
1879 1913
1880 if (bb->playboard[row][col].anchored) 1914 struct coord {
1881 return; 1915 int row;
1882 /* mark bubble */ 1916 int col;
1883 bb->playboard[row][col].anchored = true; 1917 } search[(2*BB_WIDTH-1)*(BB_HEIGHT/2)];
1884 1918
1885 /* recursively call neighbors */ 1919 /* search initial bubble */
1886 if(col-1 >= 0) { 1920 bb->playboard[row][col].anchored = true;
1887 if(bb->playboard[row][col-1].type >= 0 && 1921 search[count].row = row;
1888 !bb->playboard[row][col-1].ingroup && 1922 search[count].col = col;
1889 !bb->playboard[row][col-1].anchored) { 1923 count++;
1890 bubbles_anchored(bb, row, col-1); 1924
1925 /* breadth-first search neighbors */
1926 for(i=0; i<count; i++) {
1927 myrow = search[i].row;
1928 mycol = search[i].col;
1929 mytype = bb->playboard[myrow][mycol].type;
1930 adj = myrow%2;
1931
1932 if(mycol-1 >= 0) {
1933 if(bb->playboard[myrow][mycol-1].type >= 0 &&
1934 !bb->playboard[myrow][mycol-1].ingroup &&
1935 !bb->playboard[myrow][mycol-1].anchored) {
1936 bb->playboard[myrow][mycol-1].anchored = true;
1937 search[count].row = myrow;
1938 search[count].col = mycol-1;
1939 count++;
1940 }
1891 } 1941 }
1892 }
1893 1942
1894 if(col-1+adj >= 0) { 1943 if(mycol-1+adj >= 0) {
1895 if(row-1 >= 0) { 1944 if(myrow-1 >= 0) {
1896 if(bb->playboard[row-1][col-1+adj].type >= 0 && 1945 if(bb->playboard[myrow-1][mycol-1+adj].type >= 0 &&
1897 !bb->playboard[row-1][col-1+adj].ingroup && 1946 !bb->playboard[myrow-1][mycol-1+adj].ingroup &&
1898 !bb->playboard[row-1][col-1+adj].anchored) { 1947 !bb->playboard[myrow-1][mycol-1+adj].anchored) {
1899 bubbles_anchored(bb, row-1, col-1+adj); 1948 bb->playboard[myrow-1][mycol-1+adj].anchored = true;
1949 search[count].row = myrow-1;
1950 search[count].col = mycol-1+adj;
1951 count++;
1952 }
1900 } 1953 }
1901 }
1902 1954
1903 if(row+1 < BB_HEIGHT) { 1955 if(myrow+1 < BB_HEIGHT) {
1904 if(bb->playboard[row+1][col-1+adj].type >= 0 && 1956 if(bb->playboard[myrow+1][mycol-1+adj].type >= 0 &&
1905 !bb->playboard[row+1][col-1+adj].ingroup && 1957 !bb->playboard[myrow+1][mycol-1+adj].ingroup &&
1906 !bb->playboard[row+1][col-1+adj].anchored) { 1958 !bb->playboard[myrow+1][mycol-1+adj].anchored) {
1907 bubbles_anchored(bb, row+1, col-1+adj); 1959 bb->playboard[myrow+1][mycol-1+adj].anchored = true;
1960 search[count].row = myrow+1;
1961 search[count].col = mycol-1+adj;
1962 count++;
1963 }
1908 } 1964 }
1909 } 1965 }
1910 }
1911 1966
1912 if(col+adj >= 0) { 1967 if(mycol+adj >= 0) {
1913 if(row-1 >= 0) { 1968 if(myrow-1 >= 0) {
1914 if(bb->playboard[row-1][col+adj].type >= 0 && 1969 if(bb->playboard[myrow-1][mycol+adj].type >= 0 &&
1915 !bb->playboard[row-1][col+adj].ingroup && 1970 !bb->playboard[myrow-1][mycol+adj].ingroup &&
1916 !bb->playboard[row-1][col+adj].anchored) { 1971 !bb->playboard[myrow-1][mycol+adj].anchored) {
1917 bubbles_anchored(bb, row-1, col+adj); 1972 bb->playboard[myrow-1][mycol+adj].anchored = true;
1973 search[count].row = myrow-1;
1974 search[count].col = mycol+adj;
1975 count++;
1976 }
1918 } 1977 }
1919 }
1920 1978
1921 if(row+1 < BB_HEIGHT) { 1979 if(myrow+1 < BB_HEIGHT) {
1922 if(bb->playboard[row+1][col+adj].type >= 0 && 1980 if(bb->playboard[myrow+1][mycol+adj].type >= 0 &&
1923 !bb->playboard[row+1][col+adj].ingroup && 1981 !bb->playboard[myrow+1][mycol+adj].ingroup &&
1924 !bb->playboard[row+1][col+adj].anchored) { 1982 !bb->playboard[myrow+1][mycol+adj].anchored) {
1925 bubbles_anchored(bb, row+1, col+adj); 1983 bb->playboard[myrow+1][mycol+adj].anchored = true;
1984 search[count].row = myrow+1;
1985 search[count].col = mycol+adj;
1986 count++;
1987 }
1926 } 1988 }
1927 } 1989 }
1928 }
1929 1990
1930 if(col+1 < BB_WIDTH-adj) { 1991 if(mycol+1 < BB_WIDTH-adj) {
1931 if(bb->playboard[row][col+1].type >= 0 && 1992 if(bb->playboard[myrow][mycol+1].type >= 0 &&
1932 !bb->playboard[row][col+1].ingroup && 1993 !bb->playboard[myrow][mycol+1].ingroup &&
1933 !bb->playboard[row][col+1].anchored) { 1994 !bb->playboard[myrow][mycol+1].anchored) {
1934 bubbles_anchored(bb, row, col+1); 1995 bb->playboard[myrow][mycol+1].anchored = true;
1996 search[count].row = myrow;
1997 search[count].col = mycol+1;
1998 count++;
1999 }
1935 } 2000 }
1936 } 2001 }
1937} 2002}