aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--devel.but7
-rw-r--r--misc.c4
-rw-r--r--puzzles.h6
-rw-r--r--sort.c20
4 files changed, 16 insertions, 21 deletions
diff --git a/devel.but b/devel.but
index 71bc60d..209c501 100644
--- a/devel.but
+++ b/devel.but
@@ -5330,6 +5330,13 @@ This macro, defined in the main Puzzles header file, strips the
modifier flags from the key code passed as an argument. It is
equivalent to a bitwise-AND with \cw{~MOD_MASK}.
+\S{utils-swap-regions} \cw{swap_regions()}
+
+\c void swap_regions(void *av, void *bv, size_t size);
+
+Swap two regions of memory of \cw{size} bytes. The two regions must
+not overlap.
+
\C{writing} How to write a new puzzle
This chapter gives a guide to how to actually write a new puzzle:
diff --git a/misc.c b/misc.c
index 6b5f3f8..f9eaf5d 100644
--- a/misc.c
+++ b/misc.c
@@ -294,7 +294,7 @@ void game_mkhighlight(frontend *fe, float *ret,
game_mkhighlight_specific(fe, ret, background, highlight, lowlight);
}
-static void memswap(void *av, void *bv, int size)
+void swap_regions(void *av, void *bv, size_t size)
{
char tmpbuf[512];
char *a = av, *b = bv;
@@ -318,7 +318,7 @@ void shuffle(void *array, int nelts, int eltsize, random_state *rs)
for (i = nelts; i-- > 1 ;) {
int j = random_upto(rs, i+1);
if (j != i)
- memswap(carray + eltsize * i, carray + eltsize * j, eltsize);
+ swap_regions(carray + eltsize * i, carray + eltsize * j, eltsize);
}
}
diff --git a/puzzles.h b/puzzles.h
index b560b78..2c52bc6 100644
--- a/puzzles.h
+++ b/puzzles.h
@@ -448,6 +448,12 @@ void copy_left_justified(char *buf, size_t sz, const char *str);
function is NULL. Dynamically allocated, to be freed by caller. */
char *button2label(int button);
+/* Swap two regions of memory. The two regions must not
+ * overlap. (Note: the natural name for this might be "memswap", but
+ * the mem* namespace is reserved for future expansion by the C99
+ * standard per clause 7.26.11.1.) */
+void swap_regions(void *av, void *bv, size_t size);
+
/*
* dsf.c
*/
diff --git a/sort.c b/sort.c
index 6dff92f..e82f4ec 100644
--- a/sort.c
+++ b/sort.c
@@ -9,26 +9,8 @@
#include "puzzles.h"
-static void memswap(void *av, void *bv, size_t size)
-{
- char t[4096];
- char *a = (char *)av, *b = (char *)bv;
-
- while (size > 0) {
- size_t thissize = size < sizeof(t) ? size : sizeof(t);
-
- memcpy(t, a, thissize);
- memcpy(a, b, thissize);
- memcpy(b, t, thissize);
-
- size -= thissize;
- a += thissize;
- b += thissize;
- }
-}
-
#define PTR(i) ((char *)array + size * (i))
-#define SWAP(i,j) memswap(PTR(i), PTR(j), size)
+#define SWAP(i,j) swap_regions(PTR(i), PTR(j), size)
#define CMP(i,j) cmp(PTR(i), PTR(j), ctx)
#define LCHILD(i) (2*(i)+1)