mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-21 16:05:44 -07:00
Get rid of the malloc in shuffle(), by defining a subfunction
memswap() which declares a fixed-size buffer on the stack and uses it multiple times if necessary. [originally from svn r6107]
This commit is contained in:
25
misc.c
25
misc.c
@ -194,21 +194,32 @@ void game_mkhighlight(frontend *fe, float *ret,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void memswap(void *av, void *bv, int size)
|
||||||
|
{
|
||||||
|
char tmpbuf[512];
|
||||||
|
char *a = av, *b = bv;
|
||||||
|
|
||||||
|
while (size > 0) {
|
||||||
|
int thislen = min(size, sizeof(tmpbuf));
|
||||||
|
memcpy(tmpbuf, a, thislen);
|
||||||
|
memcpy(a, b, thislen);
|
||||||
|
memcpy(b, tmpbuf, thislen);
|
||||||
|
a += thislen;
|
||||||
|
b += thislen;
|
||||||
|
size -= thislen;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void shuffle(void *array, int nelts, int eltsize, random_state *rs)
|
void shuffle(void *array, int nelts, int eltsize, random_state *rs)
|
||||||
{
|
{
|
||||||
char *tmp = smalloc(eltsize);
|
|
||||||
char *carray = (char *)array;
|
char *carray = (char *)array;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = nelts; i-- > 1 ;) {
|
for (i = nelts; i-- > 1 ;) {
|
||||||
int j = random_upto(rs, i+1);
|
int j = random_upto(rs, i+1);
|
||||||
if (j != i) {
|
if (j != i)
|
||||||
memcpy(tmp, carray + eltsize * i, eltsize);
|
memswap(carray + eltsize * i, carray + eltsize * j, eltsize);
|
||||||
memcpy(carray + eltsize * i, carray + eltsize * j, eltsize);
|
|
||||||
memcpy(carray + eltsize * j, tmp, eltsize);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
sfree(tmp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_rect_outline(frontend *fe, int x, int y, int w, int h, int colour)
|
void draw_rect_outline(frontend *fe, int x, int y, int w, int h, int colour)
|
||||||
|
Reference in New Issue
Block a user