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 | |
parent | b0960aed111d63695f328d47b181a0bd620b42cb (diff) | |
download | rockbox-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-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 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 | ******************************************************************************/ |
1767 | static int bubbles_searchgroup(struct game_context* bb, int row, int col) { | 1767 | static 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 | ******************************************************************************/ |
1877 | static void bubbles_anchored(struct game_context* bb, int row, int col) { | 1909 | static 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 | } |