nissy-core

The "engine" of nissy, including the H48 optimal solver.
git clone https://git.tronto.net/nissy-core
Download | Log | Files | Refs | README | LICENSE

commit 7c934801f88c640970ad41b5ddd39f4e39609f28
parent 243a852d31483d10983c50978d1d4471efd0e553
Author: Sebastiano Tronto <sebastiano@tronto.net>
Date:   Tue, 27 May 2025 09:03:51 +0200

Removed VLA notation from function parameters.

I found out that this gives undefined behavior when then size is 0.
Better not to have it at all, it is confusing for other developers anyway.

Diffstat:
Msrc/core/moves.h | 24++++++++++++------------
Msrc/nissy.c | 8++++----
Msrc/nissy.h | 8++++----
Msrc/solvers/coord/checkdata.h | 4++--
Msrc/solvers/coord/common.h | 4++--
Msrc/solvers/coord/solve.h | 19+++++++++----------
Msrc/solvers/coord/utils.h | 4++--
Msrc/solvers/dispatch.h | 2+-
Msrc/solvers/h48/checkdata.h | 4++--
Msrc/solvers/h48/solve.h | 12++++++------
Msrc/solvers/solutions.h | 9++++-----
Msrc/solvers/tables.h | 18++++++++++--------
Msrc/utils/math.h | 24++++++++++++------------
13 files changed, 70 insertions(+), 70 deletions(-)

diff --git a/src/core/moves.h b/src/core/moves.h @@ -3,13 +3,13 @@ STATIC uint8_t readmove(char); STATIC int64_t readmoves(const char *, - size_t n, size_t m, uint64_t *, uint64_t *, uint8_t [n], uint8_t [m]); + size_t, size_t, uint64_t *, uint64_t *, uint8_t *, uint8_t *); STATIC int64_t countmoves(const char *); STATIC uint8_t readmodifier(char); -STATIC int64_t writemoves(size_t n, const uint8_t [n], size_t m, char [m]); +STATIC int64_t writemoves(size_t, const uint8_t *, size_t, char *); STATIC_INLINE bool allowednextmove(uint8_t, uint8_t); -STATIC bool allowedmoves(size_t n, const uint8_t [n]); +STATIC bool allowedmoves(size_t, const uint8_t *); STATIC_INLINE uint8_t movebase(uint8_t); STATIC_INLINE uint8_t moveaxis(uint8_t); @@ -24,8 +24,8 @@ STATIC uint8_t transform_move(uint8_t, uint8_t); STATIC cube_t move(cube_t, uint8_t); STATIC cube_t premove(cube_t, uint8_t); STATIC uint8_t inverse_move(uint8_t); -STATIC void sortparallel_moves(size_t n, uint8_t [n]); -STATIC bool are_lastmoves_singlecw(size_t n, const uint8_t [n]); +STATIC void sortparallel_moves(size_t, uint8_t*); +STATIC bool are_lastmoves_singlecw(size_t, const uint8_t*); #define FOREACH_READMOVE(ARG_BUF, ARG_MOVE, ARG_C, ARG_MAX, \ RET_ERROR, ARG_ACTION) \ @@ -126,8 +126,8 @@ readmoves( size_t invsize, uint64_t *n, uint64_t *i, - uint8_t normal[nsize], - uint8_t inverse[invsize] + uint8_t *normal, + uint8_t *inverse ) { uint8_t m; @@ -171,9 +171,9 @@ countmoves(const char *buf) STATIC int64_t writemoves( size_t nmoves, - const uint8_t m[nmoves], + const uint8_t *m, size_t buf_size, - char buf[buf_size] + char *buf ) { size_t i, len, w; @@ -214,7 +214,7 @@ allowednextmove(uint8_t m1, uint8_t m2) } STATIC bool -allowedmoves(size_t n, const uint8_t m[n]) +allowedmoves(size_t n, const uint8_t *m) { uint8_t j; @@ -422,7 +422,7 @@ inverse_move(uint8_t m) } STATIC void -sortparallel_moves(size_t n, uint8_t moves[n]) +sortparallel_moves(size_t n, uint8_t *moves) { uint8_t i; @@ -435,7 +435,7 @@ sortparallel_moves(size_t n, uint8_t moves[n]) } STATIC bool -are_lastmoves_singlecw(size_t n, const uint8_t moves[n]) +are_lastmoves_singlecw(size_t n, const uint8_t *moves) { bool two; diff --git a/src/nissy.c b/src/nissy.c @@ -215,7 +215,7 @@ long long nissy_gendata( const char *solver, unsigned long long data_size, - unsigned char data[data_size] + unsigned char *data ) { return nissy_gendata_unsafe(solver, data_size, data); @@ -253,7 +253,7 @@ long long nissy_checkdata( const char *solver, unsigned long long data_size, - const unsigned char data[data_size] + const unsigned char *data ) { solver_dispatch_t *dispatch; @@ -278,9 +278,9 @@ nissy_solve( unsigned optimal, unsigned threads, unsigned long long data_size, - const unsigned char data[data_size], + const unsigned char *data, unsigned sols_size, - char sols[sols_size], + char *sols, long long stats[static NISSY_SIZE_SOLVE_STATS], int (*poll_status)(void *), void *poll_status_data diff --git a/src/nissy.h b/src/nissy.h @@ -276,7 +276,7 @@ long long nissy_gendata( const char *solver, unsigned long long data_size, - unsigned char data[data_size] + unsigned char *data ); /* @@ -296,7 +296,7 @@ long long nissy_checkdata( const char *solver, unsigned long long data_size, - const unsigned char data[data_size] + const unsigned char *data ); /* @@ -352,9 +352,9 @@ nissy_solve( unsigned optimal, unsigned threads, unsigned long long data_size, - const unsigned char data[data_size], + const unsigned char *data, unsigned sols_size, - char sols[sols_size], + char *sols, long long stats[static NISSY_SIZE_SOLVE_STATS], int (*poll_status)(void *), void *poll_status_data diff --git a/src/solvers/coord/checkdata.h b/src/solvers/coord/checkdata.h @@ -1,11 +1,11 @@ STATIC long long checkdata_coord( - const char *, unsigned long long n, const unsigned char [n]); + const char *, unsigned long long, const unsigned char *); STATIC long long checkdata_coord( const char *solver, unsigned long long data_size, - const unsigned char data[data_size] + const unsigned char *data ) { coord_t *coord; diff --git a/src/solvers/coord/common.h b/src/solvers/coord/common.h @@ -9,7 +9,7 @@ STATIC size_t coord_gendata_generic(const coord_t [static 1], unsigned char *); STATIC void append_coord_name(const coord_t [static 1], char *); STATIC bool solution_lastqt_cw(const solution_moves_t [static 1]); STATIC bool coord_can_switch(const coord_t [static 1], const unsigned char *, - size_t n, const uint8_t [n]); + size_t, const uint8_t *); STATIC uint64_t coord_coord_generic( @@ -164,7 +164,7 @@ coord_can_switch( const coord_t coord[static 1], const unsigned char *data, size_t n, - const uint8_t moves[n] + const uint8_t *moves ) { /* diff --git a/src/solvers/coord/solve.h b/src/solvers/coord/solve.h @@ -13,13 +13,12 @@ typedef struct { } dfsarg_solve_coord_t; STATIC int64_t solve_coord(oriented_cube_t, coord_t [static 1], uint8_t, - uint8_t, uint8_t, uint8_t, uint64_t, uint8_t, uint8_t, uint64_t n, - const unsigned char [n], size_t m, char [m], int (*)(void *), void *); + uint8_t, uint8_t, uint8_t, uint64_t, uint8_t, uint8_t, uint64_t, + const unsigned char *, size_t, char *, int (*)(void *), void *); STATIC long long solve_coord_dispatch(oriented_cube_t, const char *, unsigned, - unsigned, unsigned, unsigned, unsigned, unsigned, unsigned long long n, - const unsigned char [n], unsigned m, char [m], - long long [static NISSY_SIZE_SOLVE_STATS], - int (*)(void *), void *); + unsigned, unsigned, unsigned, unsigned, unsigned, unsigned long long, + const unsigned char *, unsigned, char *, + long long [static NISSY_SIZE_SOLVE_STATS], int (*)(void *), void *); STATIC bool coord_solution_admissible(const dfsarg_solve_coord_t [static 1]); STATIC bool solve_coord_dfs_stop(const dfsarg_solve_coord_t [static 1]); STATIC bool coord_continue_onnormal(const dfsarg_solve_coord_t [static 1]); @@ -210,9 +209,9 @@ solve_coord_dispatch( unsigned optimal, unsigned threads, unsigned long long data_size, - const unsigned char data[data_size], + const unsigned char *data, unsigned solutions_size, - char sols[solutions_size], + char *sols, long long stats[static NISSY_SIZE_SOLVE_STATS], int (*poll_status)(void *), void *poll_status_data @@ -251,9 +250,9 @@ solve_coord( uint8_t optimal, uint8_t threads, uint64_t data_size, - const unsigned char data[data_size], + const unsigned char *data, size_t solutions_size, - char sols[solutions_size], + char *sols, int (*poll_status)(void *), void *poll_status_data ) diff --git a/src/solvers/coord/utils.h b/src/solvers/coord/utils.h @@ -1,10 +1,10 @@ -STATIC coord_t *parse_coord(size_t n, const char [n]); +STATIC coord_t *parse_coord(size_t, const char *); STATIC uint8_t parse_axis(const char [static 2]); STATIC void parse_coord_and_axis(const char *, coord_t **, uint8_t *); STATIC long long dataid_coord(const char *, char [static NISSY_SIZE_DATAID]); STATIC coord_t * -parse_coord(size_t n, const char coord[n]) +parse_coord(size_t n, const char *coord) { int i; diff --git a/src/solvers/dispatch.h b/src/solvers/dispatch.h @@ -2,7 +2,7 @@ typedef struct { const char *prefix; long long (*dataid)(const char *, char [static NISSY_SIZE_DATAID]); long long (*gendata)( - const char *, unsigned long long n, unsigned char [n]); + const char *, unsigned long long, unsigned char *); long long (*checkdata)( const char *, unsigned long long, const unsigned char *); long long (*solve)(oriented_cube_t, const char *, unsigned, unsigned, diff --git a/src/solvers/h48/checkdata.h b/src/solvers/h48/checkdata.h @@ -1,5 +1,5 @@ STATIC long long checkdata_h48( - const char *, unsigned long long n, const unsigned char [n]); + const char *, unsigned long long, const unsigned char *); /* Currently unused. @@ -178,7 +178,7 @@ STATIC long long checkdata_h48( const char *solver, unsigned long long data_size, - const unsigned char data[data_size] + const unsigned char *data ) { const unsigned char *table; diff --git a/src/solvers/h48/solve.h b/src/solvers/h48/solve.h @@ -49,8 +49,8 @@ typedef struct { } dfsarg_solve_h48_maketasks_t; STATIC long long solve_h48_dispatch(oriented_cube_t, const char *, unsigned, - unsigned, unsigned, unsigned, unsigned, unsigned, unsigned long long n, - const unsigned char [n], unsigned m, char [m], + unsigned, unsigned, unsigned, unsigned, unsigned, unsigned long long, + const unsigned char *, unsigned, char *, long long [static NISSY_SIZE_SOLVE_STATS], int (*)(void *), void *); STATIC_INLINE bool solve_h48_stop(dfsarg_solve_h48_t [static 1]); STATIC int64_t solve_h48_maketasks( @@ -60,7 +60,7 @@ STATIC void *solve_h48_runthread(void *); STATIC int64_t solve_h48_dfs(dfsarg_solve_h48_t [static 1]); STATIC void solve_h48_log_solutions(solution_list_t [static 1], size_t); STATIC int64_t solve_h48(oriented_cube_t, uint8_t, uint8_t, uint8_t, uint8_t, - uint8_t, uint64_t, const unsigned char *, size_t n, char [n], + uint8_t, uint64_t, const unsigned char *, size_t, char *, long long [static NISSY_SIZE_SOLVE_STATS], int (*)(void *), void *); STATIC long long solve_h48_dispatch( @@ -73,9 +73,9 @@ STATIC long long solve_h48_dispatch( unsigned optimal, unsigned threads, unsigned long long data_size, - const unsigned char data[data_size], + const unsigned char *data, unsigned sols_size, - char sols[sols_size], + char *sols, long long stats[static NISSY_SIZE_SOLVE_STATS], int (*poll_status)(void *), void *poll_status_data @@ -410,7 +410,7 @@ solve_h48( uint64_t data_size, const unsigned char *data, size_t solutions_size, - char solutions[solutions_size], + char *solutions, long long stats[static NISSY_SIZE_SOLVE_STATS], int (*poll_status)(void *), void *poll_status_data diff --git a/src/solvers/solutions.h b/src/solvers/solutions.h @@ -1,11 +1,10 @@ STATIC void solution_moves_reset(solution_moves_t [static 1]); STATIC void solution_moves_transform(solution_moves_t [static 1], uint8_t); STATIC void solution_moves_reorient(solution_moves_t [static 1], uint8_t); -STATIC bool solution_list_init( - solution_list_t [static 1], size_t n, char [n]); +STATIC bool solution_list_init(solution_list_t [static 1], size_t, char *); STATIC bool solution_moves_equal( const solution_moves_t [static 1], const solution_moves_t [static 1]); -STATIC bool solution_moves_is_duplicate(size_t n, const solution_moves_t[n+1]); +STATIC bool solution_moves_is_duplicate(size_t, const solution_moves_t *); STATIC bool appendchar(solution_list_t [static 1], char); STATIC bool appendnormal( const solution_moves_t [static 1], solution_list_t [static 1]); @@ -50,7 +49,7 @@ solution_moves_reorient(solution_moves_t moves[static 1], uint8_t or) } STATIC bool -solution_list_init(solution_list_t sols[static 1], size_t n, char buf[n]) +solution_list_init(solution_list_t sols[static 1], size_t n, char *buf) { if (n == 0) return false; @@ -88,7 +87,7 @@ solution_moves_equal( } STATIC bool -solution_moves_is_duplicate(size_t n, const solution_moves_t s[n+1]) +solution_moves_is_duplicate(size_t n, const solution_moves_t *s) { size_t i; diff --git a/src/solvers/tables.h b/src/solvers/tables.h @@ -1,11 +1,13 @@ -STATIC uint64_t read_unaligned_u64(const unsigned char [static sizeof(uint64_t)]); -STATIC void write_unaligned_u64(unsigned char [static sizeof(uint64_t)], uint64_t); +STATIC uint64_t read_unaligned_u64( + const unsigned char [static sizeof(uint64_t)]); +STATIC void write_unaligned_u64( + unsigned char [static sizeof(uint64_t)], uint64_t); STATIC int64_t readtableinfo( - size_t n, const unsigned char [n], tableinfo_t [static 1]); + size_t, const unsigned char *, tableinfo_t [static 1]); STATIC int64_t readtableinfo_n( - size_t n, const unsigned char [n], uint8_t, tableinfo_t [static 1]); + size_t, const unsigned char *, uint8_t, tableinfo_t [static 1]); STATIC int64_t writetableinfo( - const tableinfo_t [static 1], size_t n, unsigned char [n]); + const tableinfo_t [static 1], size_t, unsigned char *); STATIC uint64_t read_unaligned_u64(const unsigned char buf[static sizeof(uint64_t)]) @@ -26,7 +28,7 @@ write_unaligned_u64(unsigned char buf[static sizeof(uint64_t)], uint64_t x) STATIC int64_t readtableinfo( size_t buf_size, - const unsigned char buf[buf_size], + const unsigned char *buf, tableinfo_t info[static 1] ) { @@ -70,7 +72,7 @@ readtableinfo( STATIC int64_t readtableinfo_n( size_t buf_size, - const unsigned char buf[buf_size], + const unsigned char *buf, uint8_t n, tableinfo_t info[static 1] ) @@ -88,7 +90,7 @@ STATIC int64_t writetableinfo( const tableinfo_t info[static 1], size_t data_size, - unsigned char buf[data_size] + unsigned char *buf ) { size_t i; diff --git a/src/utils/math.h b/src/utils/math.h @@ -4,12 +4,12 @@ #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) STATIC int64_t factorial(int64_t); -STATIC bool isperm(size_t n, const uint8_t [n]); -STATIC int64_t permtoindex(size_t n, const uint8_t [n]); -STATIC void indextoperm(int64_t, size_t n, uint8_t [n]); -STATIC int permsign(size_t n, const uint8_t [n]); -STATIC int64_t digitstosumzero(size_t n, const uint8_t [n], uint8_t); -STATIC void sumzerotodigits(int64_t, size_t n, uint8_t, uint8_t [n]); +STATIC bool isperm(size_t, const uint8_t *); +STATIC int64_t permtoindex(size_t, const uint8_t *); +STATIC void indextoperm(int64_t, size_t, uint8_t *); +STATIC int permsign(size_t, const uint8_t *); +STATIC int64_t digitstosumzero(size_t, const uint8_t *, uint8_t); +STATIC void sumzerotodigits(int64_t, size_t, uint8_t, uint8_t *); STATIC double intpow(double, uint64_t); STATIC int64_t @@ -33,7 +33,7 @@ factorial(int64_t n) } STATIC bool -isperm(size_t n, const uint8_t a[n]) +isperm(size_t n, const uint8_t *a) { size_t i; bool aux[FACTORIAL_MAX+1]; @@ -61,7 +61,7 @@ isperm(size_t n, const uint8_t a[n]) } STATIC int64_t -permtoindex(size_t n, const uint8_t a[n]) +permtoindex(size_t n, const uint8_t *a) { size_t i, j; int64_t c, ret; @@ -85,7 +85,7 @@ permtoindex(size_t n, const uint8_t a[n]) } STATIC void -indextoperm(int64_t p, size_t n, uint8_t r[n]) +indextoperm(int64_t p, size_t n, uint8_t *r) { int64_t c; size_t i, j; @@ -120,7 +120,7 @@ indextoperm_error: } STATIC int -permsign(size_t n, const uint8_t a[n]) +permsign(size_t n, const uint8_t *a) { size_t i, j, ret; @@ -132,7 +132,7 @@ permsign(size_t n, const uint8_t a[n]) } STATIC int64_t -digitstosumzero(size_t n, const uint8_t a[n], uint8_t b) +digitstosumzero(size_t n, const uint8_t *a, uint8_t b) { int64_t ret, p; size_t i, sum; @@ -162,7 +162,7 @@ digitstosumzero(size_t n, const uint8_t a[n], uint8_t b) } STATIC void -sumzerotodigits(int64_t d, size_t n, uint8_t b, uint8_t a[n]) +sumzerotodigits(int64_t d, size_t n, uint8_t b, uint8_t *a) { uint8_t sum; size_t i;