I've never trusted common variables. Take those bare ints out of
[sgt/puzzles] / latin.h
diff --git a/latin.h b/latin.h
index f312cf9..4ec6954 100644 (file)
--- a/latin.h
+++ b/latin.h
@@ -8,7 +8,7 @@ typedef unsigned char digit;
 /* --- Solver structures, definitions --- */
 
 #ifdef STANDALONE_SOLVER
-int solver_show_working, solver_recurse_depth;
+extern int solver_show_working, solver_recurse_depth;
 #endif
 
 struct latin_solver {
@@ -86,25 +86,34 @@ int latin_solver_diff_simple(struct latin_solver *solver);
  * the more difficult single-number elimination. */
 int latin_solver_diff_set(struct latin_solver *solver,
                           struct latin_solver_scratch *scratch,
-                          int *extreme);
+                          int extreme);
 
-typedef int (latin_solver_callback)(digit *, int, int, void*);
-/* Use to provide a standard way of dealing with solvers which can recurse;
- * pass in your enumeration for 'recursive diff' and your solver
- * callback. Returns #solutions (0 == already solved). */
-int latin_solver_recurse(struct latin_solver *solver, int recdiff,
-                         latin_solver_callback cb, void *ctx);
+typedef int (*usersolver_t)(struct latin_solver *solver, void *ctx);
+typedef void *(*ctxnew_t)(void *ctx);
+typedef void (*ctxfree_t)(void *ctx);
 
 /* Individual puzzles should use their enumerations for their
  * own difficulty levels, ensuring they don't clash with these. */
 enum { diff_impossible = 10, diff_ambiguous, diff_unfinished };
-int latin_solver(digit *grid, int order, int maxdiff, void *unused);
+
+/* Externally callable function that allocates and frees a latin_solver */
+int latin_solver(digit *grid, int o, int maxdiff,
+                int diff_simple, int diff_set_0, int diff_set_1,
+                int diff_forcing, int diff_recursive,
+                usersolver_t const *usersolvers, void *ctx,
+                ctxnew_t ctxnew, ctxfree_t ctxfree);
+
+/* Version you can call if you want to alloc and free latin_solver yourself */
+int latin_solver_main(struct latin_solver *solver, int maxdiff,
+                     int diff_simple, int diff_set_0, int diff_set_1,
+                     int diff_forcing, int diff_recursive,
+                     usersolver_t const *usersolvers, void *ctx,
+                     ctxnew_t ctxnew, ctxfree_t ctxfree);
 
 void latin_solver_debug(unsigned char *cube, int o);
 
 /* --- Generation and checking --- */
 
-digit *latin_generate_quick(int o, random_state *rs);
 digit *latin_generate(int o, random_state *rs);
 
 int latin_check(digit *sq, int order); /* !0 => not a latin square */