From a2f7f962ced158dbceebbfc0c3dfbbc58b119e55 Mon Sep 17 00:00:00 2001 From: Franklin Wei Date: Sun, 21 Jul 2024 18:33:01 -0400 Subject: [PATCH] Rename memswap() to swap_regions(). Consolidate duplicate implementations. C99 reserves the mem* namespace for future expansion. Some Rockbox targets had issues with memswap() conflicting with another definition, so fix that. --- devel.but | 7 +++++++ misc.c | 4 ++-- puzzles.h | 6 ++++++ sort.c | 20 +------------------- 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)