diff options
| -rw-r--r-- | src/cube.c | 19 | ||||
| -rw-r--r-- | src/cube.h | 2 | ||||
| -rw-r--r-- | src/cube_generic.h | 18 | ||||
| -rw-r--r-- | src/cube_public.h | 2 | ||||
| -rw-r--r-- | src/cube_transform_with_switch.h | 6 | ||||
| -rw-r--r-- | src/io_cube.h | 12 | ||||
| -rw-r--r-- | src/io_move_trans.h | 2 | ||||
| -rw-r--r-- | src/solve_generic.h | 26 | ||||
| -rw-r--r-- | src/solve_h48.h | 26 | ||||
| -rw-r--r-- | test/test.h | 11 |
10 files changed, 60 insertions, 64 deletions
| @@ -3,27 +3,16 @@ | |||
| 3 | #include <stdbool.h> | 3 | #include <stdbool.h> |
| 4 | #include <string.h> | 4 | #include <string.h> |
| 5 | 5 | ||
| 6 | void (*nissy_log)(const char *, va_list); | 6 | void (*nissy_log)(const char *, ...); |
| 7 | 7 | ||
| 8 | void | 8 | #define LOG(...) if (nissy_log != NULL) nissy_log(__VA_ARGS__); |
| 9 | _log(const char *str, ...) /* TODO: rename */ | ||
| 10 | { | ||
| 11 | va_list args; | ||
| 12 | |||
| 13 | if (nissy_log != NULL) { | ||
| 14 | va_start(args, str); | ||
| 15 | nissy_log(str, args); | ||
| 16 | va_end(args); | ||
| 17 | } | ||
| 18 | } | ||
| 19 | 9 | ||
| 20 | #ifdef DEBUG | 10 | #ifdef DEBUG |
| 21 | #define _static | 11 | #define _static |
| 22 | #define _static_inline | 12 | #define _static_inline |
| 23 | #define DBG_WARN(condition, ...) if (!(condition)) _log(__VA_ARGS__); | 13 | #define DBG_WARN(condition, ...) if (!(condition)) LOG(__VA_ARGS__); |
| 24 | #define DBG_ASSERT(condition, retval, ...) \ | 14 | #define DBG_ASSERT(condition, retval, ...) \ |
| 25 | if (!(condition)) { _log(__VA_ARGS__); return retval; } | 15 | if (!(condition)) { LOG(__VA_ARGS__); return retval; } |
| 26 | |||
| 27 | #else | 16 | #else |
| 28 | #define _static static | 17 | #define _static static |
| 29 | #define _static_inline static inline | 18 | #define _static_inline static inline |
| @@ -84,4 +84,4 @@ int64_t nissy_solve( | |||
| 84 | char *solutions | 84 | char *solutions |
| 85 | ); | 85 | ); |
| 86 | 86 | ||
| 87 | void nissy_setlogger(void (*logger_function)(const char *, va_list)); | 87 | void nissy_setlogger(void (*logger_function)(const char *, ...)); |
diff --git a/src/cube_generic.h b/src/cube_generic.h index d3080f7..7095c3a 100644 --- a/src/cube_generic.h +++ b/src/cube_generic.h | |||
| @@ -65,16 +65,16 @@ isconsistent(cube_t cube) | |||
| 65 | return true; | 65 | return true; |
| 66 | 66 | ||
| 67 | inconsistent_ep: | 67 | inconsistent_ep: |
| 68 | _log("Inconsistent EP\n"); | 68 | LOG("Inconsistent EP\n"); |
| 69 | return false; | 69 | return false; |
| 70 | inconsistent_cp: | 70 | inconsistent_cp: |
| 71 | _log("Inconsistent CP\n"); | 71 | LOG("Inconsistent CP\n"); |
| 72 | return false; | 72 | return false; |
| 73 | inconsistent_eo: | 73 | inconsistent_eo: |
| 74 | _log("Inconsistent EO\n"); | 74 | LOG("Inconsistent EO\n"); |
| 75 | return false; | 75 | return false; |
| 76 | inconsistent_co: | 76 | inconsistent_co: |
| 77 | _log("Inconsistent CO\n"); | 77 | LOG("Inconsistent CO\n"); |
| 78 | return false; | 78 | return false; |
| 79 | } | 79 | } |
| 80 | 80 | ||
| @@ -114,13 +114,13 @@ issolvable(cube_t cube) | |||
| 114 | return true; | 114 | return true; |
| 115 | 115 | ||
| 116 | issolvable_parity: | 116 | issolvable_parity: |
| 117 | _log("EP and CP parities are different\n"); | 117 | LOG("EP and CP parities are different\n"); |
| 118 | return false; | 118 | return false; |
| 119 | issolvable_eo: | 119 | issolvable_eo: |
| 120 | _log("Odd number of flipped edges\n"); | 120 | LOG("Odd number of flipped edges\n"); |
| 121 | return false; | 121 | return false; |
| 122 | issolvable_co: | 122 | issolvable_co: |
| 123 | _log("Sum of corner orientation is not multiple of 3\n"); | 123 | LOG("Sum of corner orientation is not multiple of 3\n"); |
| 124 | return false; | 124 | return false; |
| 125 | } | 125 | } |
| 126 | 126 | ||
| @@ -161,7 +161,7 @@ applymoves_finish: | |||
| 161 | return cube; | 161 | return cube; |
| 162 | 162 | ||
| 163 | applymoves_error: | 163 | applymoves_error: |
| 164 | _log("applymoves error\n"); | 164 | LOG("applymoves error\n"); |
| 165 | return zero; | 165 | return zero; |
| 166 | } | 166 | } |
| 167 | 167 | ||
| @@ -238,7 +238,7 @@ move(cube_t c, uint8_t m) | |||
| 238 | case _move_B3: | 238 | case _move_B3: |
| 239 | return _move(B3, c); | 239 | return _move(B3, c); |
| 240 | default: | 240 | default: |
| 241 | _log("move error, unknown move\n"); | 241 | LOG("move error, unknown move\n"); |
| 242 | return zero; | 242 | return zero; |
| 243 | } | 243 | } |
| 244 | } | 244 | } |
diff --git a/src/cube_public.h b/src/cube_public.h index e2255c5..69809d7 100644 --- a/src/cube_public.h +++ b/src/cube_public.h | |||
| @@ -168,7 +168,7 @@ nissy_solve( | |||
| 168 | } | 168 | } |
| 169 | 169 | ||
| 170 | void | 170 | void |
| 171 | nissy_setlogger(void (*log)(const char *, va_list)) | 171 | nissy_setlogger(void (*log)(const char *, ...)) |
| 172 | { | 172 | { |
| 173 | nissy_log = log; | 173 | nissy_log = log; |
| 174 | } | 174 | } |
diff --git a/src/cube_transform_with_switch.h b/src/cube_transform_with_switch.h index bc066fb..45e1d64 100644 --- a/src/cube_transform_with_switch.h +++ b/src/cube_transform_with_switch.h | |||
| @@ -118,7 +118,7 @@ transform_edges(cube_t c, uint8_t t) | |||
| 118 | case _trans_BLm: | 118 | case _trans_BLm: |
| 119 | return _trans_edges_mirrored(BLm, c); | 119 | return _trans_edges_mirrored(BLm, c); |
| 120 | default: | 120 | default: |
| 121 | _log("transform error, unknown transformation\n"); | 121 | LOG("transform error, unknown transformation\n"); |
| 122 | return zero; | 122 | return zero; |
| 123 | } | 123 | } |
| 124 | } | 124 | } |
| @@ -224,7 +224,7 @@ transform_corners(cube_t c, uint8_t t) | |||
| 224 | case _trans_BLm: | 224 | case _trans_BLm: |
| 225 | return _trans_corners_mirrored(BLm, c); | 225 | return _trans_corners_mirrored(BLm, c); |
| 226 | default: | 226 | default: |
| 227 | _log("transform error, unknown transformation\n"); | 227 | LOG("transform error, unknown transformation\n"); |
| 228 | return zero; | 228 | return zero; |
| 229 | } | 229 | } |
| 230 | } | 230 | } |
| @@ -330,7 +330,7 @@ transform(cube_t c, uint8_t t) | |||
| 330 | case _trans_BLm: | 330 | case _trans_BLm: |
| 331 | return _trans_mirrored(BLm, c); | 331 | return _trans_mirrored(BLm, c); |
| 332 | default: | 332 | default: |
| 333 | _log("transform error, unknown transformation\n"); | 333 | LOG("transform error, unknown transformation\n"); |
| 334 | return zero; | 334 | return zero; |
| 335 | } | 335 | } |
| 336 | } | 336 | } |
diff --git a/src/io_cube.h b/src/io_cube.h index 72113ff..95c1882 100644 --- a/src/io_cube.h +++ b/src/io_cube.h | |||
| @@ -49,7 +49,7 @@ readcube(const char *format, const char *buf) | |||
| 49 | if (!strcmp(format, ioformat[i].name)) | 49 | if (!strcmp(format, ioformat[i].name)) |
| 50 | return ioformat[i].read(buf); | 50 | return ioformat[i].read(buf); |
| 51 | 51 | ||
| 52 | _log("Cannot read cube in the given format\n"); | 52 | LOG("Cannot read cube in the given format\n"); |
| 53 | return zero; | 53 | return zero; |
| 54 | } | 54 | } |
| 55 | 55 | ||
| @@ -76,7 +76,7 @@ writecube(const char *format, cube_t cube, char *buf) | |||
| 76 | errormsg = "ERROR: format"; | 76 | errormsg = "ERROR: format"; |
| 77 | 77 | ||
| 78 | writecube_error: | 78 | writecube_error: |
| 79 | _log("writecube error, see stdout for details\n"); | 79 | LOG("writecube error, see stdout for details\n"); |
| 80 | len = strlen(errormsg); | 80 | len = strlen(errormsg); |
| 81 | memcpy(buf, errormsg, len); | 81 | memcpy(buf, errormsg, len); |
| 82 | buf[len] = '\n'; | 82 | buf[len] = '\n'; |
| @@ -93,7 +93,7 @@ readco(const char *str) | |||
| 93 | if (*str == '2') | 93 | if (*str == '2') |
| 94 | return _ctwist_ccw; | 94 | return _ctwist_ccw; |
| 95 | 95 | ||
| 96 | _log("Error reading CO\n"); | 96 | LOG("Error reading CO\n"); |
| 97 | return _error; | 97 | return _error; |
| 98 | } | 98 | } |
| 99 | 99 | ||
| @@ -107,7 +107,7 @@ readcp(const char *str) | |||
| 107 | !strncmp(str, cornerstralt[c], 3)) | 107 | !strncmp(str, cornerstralt[c], 3)) |
| 108 | return c; | 108 | return c; |
| 109 | 109 | ||
| 110 | _log("Error reading CP\n"); | 110 | LOG("Error reading CP\n"); |
| 111 | return _error; | 111 | return _error; |
| 112 | } | 112 | } |
| 113 | 113 | ||
| @@ -119,7 +119,7 @@ readeo(const char *str) | |||
| 119 | if (*str == '1') | 119 | if (*str == '1') |
| 120 | return _eflip; | 120 | return _eflip; |
| 121 | 121 | ||
| 122 | _log("Error reading EO\n"); | 122 | LOG("Error reading EO\n"); |
| 123 | return _error; | 123 | return _error; |
| 124 | } | 124 | } |
| 125 | 125 | ||
| @@ -132,7 +132,7 @@ readep(const char *str) | |||
| 132 | if (!strncmp(str, edgestr[e], 2)) | 132 | if (!strncmp(str, edgestr[e], 2)) |
| 133 | return e; | 133 | return e; |
| 134 | 134 | ||
| 135 | _log("Error reading EP\n"); | 135 | LOG("Error reading EP\n"); |
| 136 | return _error; | 136 | return _error; |
| 137 | } | 137 | } |
| 138 | 138 | ||
diff --git a/src/io_move_trans.h b/src/io_move_trans.h index 14130c7..cfeb93c 100644 --- a/src/io_move_trans.h +++ b/src/io_move_trans.h | |||
| @@ -49,7 +49,7 @@ readtrans(const char *buf) | |||
| 49 | if (!strncmp(buf, transstr[t], 11)) | 49 | if (!strncmp(buf, transstr[t], 11)) |
| 50 | return t; | 50 | return t; |
| 51 | 51 | ||
| 52 | _log("readtrans error\n"); | 52 | LOG("readtrans error\n"); |
| 53 | return _error; | 53 | return _error; |
| 54 | } | 54 | } |
| 55 | 55 | ||
diff --git a/src/solve_generic.h b/src/solve_generic.h index a8d6b39..6a1dcf3 100644 --- a/src/solve_generic.h +++ b/src/solve_generic.h | |||
| @@ -49,11 +49,11 @@ solve( | |||
| 49 | solutions | 49 | solutions |
| 50 | ); | 50 | ); |
| 51 | } else { | 51 | } else { |
| 52 | _log("solve: unknown solver '%s'\n", solver); | 52 | LOG("solve: unknown solver '%s'\n", solver); |
| 53 | return -1; | 53 | return -1; |
| 54 | } | 54 | } |
| 55 | 55 | ||
| 56 | _log("solve: error\n"); | 56 | LOG("solve: error\n"); |
| 57 | return -1; | 57 | return -1; |
| 58 | } | 58 | } |
| 59 | 59 | ||
| @@ -63,7 +63,7 @@ solve_generic_appendsolution(dfsarg_generic_t *arg) | |||
| 63 | int strl; | 63 | int strl; |
| 64 | 64 | ||
| 65 | strl = writemoves(arg->moves, arg->depth, *arg->nextsol); | 65 | strl = writemoves(arg->moves, arg->depth, *arg->nextsol); |
| 66 | _log("Solution found: %s\n", *arg->nextsol); | 66 | LOG("Solution found: %s\n", *arg->nextsol); |
| 67 | *arg->nextsol += strl; | 67 | *arg->nextsol += strl; |
| 68 | **arg->nextsol = '\n'; | 68 | **arg->nextsol = '\n'; |
| 69 | (*arg->nextsol)++; | 69 | (*arg->nextsol)++; |
| @@ -126,12 +126,12 @@ solve_generic( | |||
| 126 | int64_t ret, tmp, first; | 126 | int64_t ret, tmp, first; |
| 127 | 127 | ||
| 128 | if (!issolvable(cube)) { | 128 | if (!issolvable(cube)) { |
| 129 | _log("solve: cube is not solvable\n"); | 129 | LOG("solve: cube is not solvable\n"); |
| 130 | return -1; | 130 | return -1; |
| 131 | } | 131 | } |
| 132 | 132 | ||
| 133 | if (issolved(cube)) { | 133 | if (issolved(cube)) { |
| 134 | _log("solve: cube is already solved\n"); | 134 | LOG("solve: cube is already solved\n"); |
| 135 | sols[0] = '\n'; | 135 | sols[0] = '\n'; |
| 136 | sols[1] = 0; | 136 | sols[1] = 0; |
| 137 | return 1; | 137 | return 1; |
| @@ -141,32 +141,32 @@ solve_generic( | |||
| 141 | "solve: NISS not implemented yet, 'nisstype' ignored\n"); | 141 | "solve: NISS not implemented yet, 'nisstype' ignored\n"); |
| 142 | 142 | ||
| 143 | if (minmoves < 0) { | 143 | if (minmoves < 0) { |
| 144 | _log("solve: 'minmoves' is negative, setting to 0\n"); | 144 | LOG("solve: 'minmoves' is negative, setting to 0\n"); |
| 145 | minmoves = 0; | 145 | minmoves = 0; |
| 146 | } | 146 | } |
| 147 | 147 | ||
| 148 | if (maxmoves < 0) { | 148 | if (maxmoves < 0) { |
| 149 | _log("solve: invalid 'maxmoves', setting to 20\n"); | 149 | LOG("solve: invalid 'maxmoves', setting to 20\n"); |
| 150 | maxmoves = 20; | 150 | maxmoves = 20; |
| 151 | } | 151 | } |
| 152 | 152 | ||
| 153 | if (maxsols < 0) { | 153 | if (maxsols < 0) { |
| 154 | _log("solve: 'maxsols' is negative\n"); | 154 | LOG("solve: 'maxsols' is negative\n"); |
| 155 | return -1; | 155 | return -1; |
| 156 | } | 156 | } |
| 157 | 157 | ||
| 158 | if (maxsols == 0) { | 158 | if (maxsols == 0) { |
| 159 | _log("solve: 'maxsols' is 0\n"); | 159 | LOG("solve: 'maxsols' is 0\n"); |
| 160 | return 0; | 160 | return 0; |
| 161 | } | 161 | } |
| 162 | 162 | ||
| 163 | if (sols == NULL) { | 163 | if (sols == NULL) { |
| 164 | _log("solve: return parameter 'sols' is NULL\n"); | 164 | LOG("solve: return parameter 'sols' is NULL\n"); |
| 165 | return -1; | 165 | return -1; |
| 166 | } | 166 | } |
| 167 | 167 | ||
| 168 | if (estimate == NULL) { | 168 | if (estimate == NULL) { |
| 169 | _log("solve: 'estimate' is NULL\n"); | 169 | LOG("solve: 'estimate' is NULL\n"); |
| 170 | return -1; | 170 | return -1; |
| 171 | } | 171 | } |
| 172 | 172 | ||
| @@ -187,7 +187,7 @@ solve_generic( | |||
| 187 | if (tmp != 0) | 187 | if (tmp != 0) |
| 188 | first = arg.depth; | 188 | first = arg.depth; |
| 189 | 189 | ||
| 190 | _log("Found %" PRId64 " solution%s at depth %" PRIu8 "\n", | 190 | LOG("Found %" PRId64 " solution%s at depth %" PRIu8 "\n", |
| 191 | tmp, tmp == 1 ? "" : "s", arg.depth); | 191 | tmp, tmp == 1 ? "" : "s", arg.depth); |
| 192 | 192 | ||
| 193 | if (ret >= maxsols) | 193 | if (ret >= maxsols) |
| @@ -248,7 +248,7 @@ gendata(const char *solver, const char *options, void *data) | |||
| 248 | maxdepth = atoi(&options[i+1]); | 248 | maxdepth = atoi(&options[i+1]); |
| 249 | ret = gendata_h48(data, h, maxdepth); | 249 | ret = gendata_h48(data, h, maxdepth); |
| 250 | } else { | 250 | } else { |
| 251 | _log("gendata: implemented only for H48 solver\n"); | 251 | LOG("gendata: implemented only for H48 solver\n"); |
| 252 | ret = -1; | 252 | ret = -1; |
| 253 | } | 253 | } |
| 254 | 254 | ||
diff --git a/src/solve_h48.h b/src/solve_h48.h index fc3b9c9..1646f49 100644 --- a/src/solve_h48.h +++ b/src/solve_h48.h | |||
| @@ -146,13 +146,13 @@ gendata_cocsep(void *buf, uint64_t *selfsim, cube_t *rep) | |||
| 146 | .rep = rep | 146 | .rep = rep |
| 147 | }; | 147 | }; |
| 148 | for (i = 0, n = 0, cc = 0; i < 10; i++) { | 148 | for (i = 0, n = 0, cc = 0; i < 10; i++) { |
| 149 | _log("cocsep: generating depth %" PRIu8 "\n", i); | 149 | LOG("cocsep: generating depth %" PRIu8 "\n", i); |
| 150 | memset(visited, 0, COCSEP_VISITEDSIZE); | 150 | memset(visited, 0, COCSEP_VISITEDSIZE); |
| 151 | arg.depth = 0; | 151 | arg.depth = 0; |
| 152 | arg.maxdepth = i; | 152 | arg.maxdepth = i; |
| 153 | cc = gendata_cocsep_dfs(&arg); | 153 | cc = gendata_cocsep_dfs(&arg); |
| 154 | info[i+2] = cc; | 154 | info[i+2] = cc; |
| 155 | _log("found %" PRIu32 "\n", cc); | 155 | LOG("found %" PRIu32 "\n", cc); |
| 156 | } | 156 | } |
| 157 | 157 | ||
| 158 | info[0] = (uint32_t)n; | 158 | info[0] = (uint32_t)n; |
| @@ -161,12 +161,12 @@ gendata_cocsep(void *buf, uint64_t *selfsim, cube_t *rep) | |||
| 161 | "cocsep: computed %" PRIu16 " symmetry classes, " | 161 | "cocsep: computed %" PRIu16 " symmetry classes, " |
| 162 | "expected %zu\n", n, COCSEP_CLASSES); | 162 | "expected %zu\n", n, COCSEP_CLASSES); |
| 163 | 163 | ||
| 164 | _log("cocsep data computed\n"); | 164 | LOG("cocsep data computed\n"); |
| 165 | _log("Symmetry classes: %" PRIu32 "\n", info[0]); | 165 | LOG("Symmetry classes: %" PRIu32 "\n", info[0]); |
| 166 | _log("Maximum pruning value: %" PRIu32 "\n", info[1]); | 166 | LOG("Maximum pruning value: %" PRIu32 "\n", info[1]); |
| 167 | _log("Pruning value distribution:\n"); | 167 | LOG("Pruning value distribution:\n"); |
| 168 | for (j = 0; j < 10; j++) | 168 | for (j = 0; j < 10; j++) |
| 169 | _log("%" PRIu8 ":\t%" PRIu32 "\n", j, info[j+2]); | 169 | LOG("%" PRIu8 ":\t%" PRIu32 "\n", j, info[j+2]); |
| 170 | 170 | ||
| 171 | gendata_cocsep_return_size: | 171 | gendata_cocsep_return_size: |
| 172 | return COCSEP_FULLSIZE; | 172 | return COCSEP_FULLSIZE; |
| @@ -264,21 +264,21 @@ gendata_h48(void *buf, uint8_t h, uint8_t maxdepth) | |||
| 264 | tot < esep_max && arg.depth <= maxdepth; | 264 | tot < esep_max && arg.depth <= maxdepth; |
| 265 | arg.depth++ | 265 | arg.depth++ |
| 266 | ) { | 266 | ) { |
| 267 | _log("esep: generating depth %" PRIu8 "\n", arg.depth); | 267 | LOG("esep: generating depth %" PRIu8 "\n", arg.depth); |
| 268 | cc = gendata_esep_bfs(&arg); | 268 | cc = gendata_esep_bfs(&arg); |
| 269 | tot += cc; | 269 | tot += cc; |
| 270 | info[arg.depth+1] = cc; | 270 | info[arg.depth+1] = cc; |
| 271 | _log("found %" PRIu64 "\n", cc); | 271 | LOG("found %" PRIu64 "\n", cc); |
| 272 | } | 272 | } |
| 273 | 273 | ||
| 274 | info[0] = arg.depth-1; | 274 | info[0] = arg.depth-1; |
| 275 | infosize = 4 * (size_t)(info[0] + 2); | 275 | infosize = 4 * (size_t)(info[0] + 2); |
| 276 | 276 | ||
| 277 | _log("h48 pruning table computed\n"); | 277 | LOG("h48 pruning table computed\n"); |
| 278 | _log("Maximum pruning value: %" PRIu32 "\n", info[0]); | 278 | LOG("Maximum pruning value: %" PRIu32 "\n", info[0]); |
| 279 | _log("Pruning value distribution:\n"); | 279 | LOG("Pruning value distribution:\n"); |
| 280 | for (j = 0; j <= info[0]; j++) | 280 | for (j = 0; j <= info[0]; j++) |
| 281 | _log("%" PRIu8 ":\t%" PRIu32 "\n", j, info[j+1]); | 281 | LOG("%" PRIu8 ":\t%" PRIu32 "\n", j, info[j+1]); |
| 282 | 282 | ||
| 283 | gendata_h48_return_size: | 283 | gendata_h48_return_size: |
| 284 | return cocsepsize + ESEP_TABLESIZE(h, k) + infosize; | 284 | return cocsepsize + ESEP_TABLESIZE(h, k) + infosize; |
diff --git a/test/test.h b/test/test.h index 415e093..d092244 100644 --- a/test/test.h +++ b/test/test.h | |||
| @@ -25,12 +25,19 @@ bool issolvable(cube_t); | |||
| 25 | bool issolved(cube_t); | 25 | bool issolved(cube_t); |
| 26 | cube_t readcube(char *, char *); | 26 | cube_t readcube(char *, char *); |
| 27 | void writecube(char *, cube_t, char *); | 27 | void writecube(char *, cube_t, char *); |
| 28 | void nissy_setlogger(void (*logger_function)(const char *, va_list)); | 28 | void nissy_setlogger(void (*logger_function)(const char *, ...)); |
| 29 | 29 | ||
| 30 | /* Test function to be implemented by all tests */ | 30 | /* Test function to be implemented by all tests */ |
| 31 | void run(void); | 31 | void run(void); |
| 32 | 32 | ||
| 33 | void log_stderr(const char *str, va_list vl) { vfprintf(stderr, str, vl); } | 33 | void log_stderr(const char *str, ...) |
| 34 | { | ||
| 35 | va_list args; | ||
| 36 | |||
| 37 | va_start(args, str); | ||
| 38 | vfprintf(stderr, str, args); | ||
| 39 | va_end(args); | ||
| 40 | } | ||
| 34 | 41 | ||
| 35 | int main(void) { | 42 | int main(void) { |
| 36 | nissy_setlogger(log_stderr); | 43 | nissy_setlogger(log_stderr); |
