diff --git a/examples/calc.peg b/examples/calc.peg index 2f57c64..7d630a0 100644 --- a/examples/calc.peg +++ b/examples/calc.peg @@ -43,7 +43,7 @@ _ <- [ \t]* EOL <- '\n' / '\r\n' / '\r' / ';' %% -int main() { +int main(int argc, char **argv) { calc_context_t *ctx = calc_create(NULL); while (calc_parse(ctx, NULL)); calc_destroy(ctx); diff --git a/src/packcc.c b/src/packcc.c index bff6777..2ddcb02 100644 --- a/src/packcc.c +++ b/src/packcc.c @@ -3228,13 +3228,24 @@ static code_reach_t generate_quantifying_code(generate_t *gen, const node_t *exp stream__write_characters(gen->stream, ' ', indent); stream__puts(gen->stream, "const size_t n0 = chunk->thunks.len;\n"); } - stream__write_characters(gen->stream, ' ', indent); - stream__puts(gen->stream, "int i;\n"); - stream__write_characters(gen->stream, ' ', indent); - if (max < 0) - stream__puts(gen->stream, "for (i = 0;; i++) {\n"); - else + if (max < 0) { + if (min > 0) { + stream__write_characters(gen->stream, ' ', indent); + stream__puts(gen->stream, "int i;\n"); + stream__write_characters(gen->stream, ' ', indent); + stream__puts(gen->stream, "for (i = 0;; i++) {\n"); + } + else { + stream__write_characters(gen->stream, ' ', indent); + stream__puts(gen->stream, "for (;;) {\n"); + } + } + else { + stream__write_characters(gen->stream, ' ', indent); + stream__puts(gen->stream, "int i;\n"); + stream__write_characters(gen->stream, ' ', indent); stream__printf(gen->stream, "for (i = 0; i < %d; i++) {\n", max); + } stream__write_characters(gen->stream, ' ', indent + 4); stream__puts(gen->stream, "const size_t p = ctx->cur;\n"); stream__write_characters(gen->stream, ' ', indent + 4); diff --git a/tests/code_generation.d/generation.bats b/tests/code_generation.d/generation.bats index 89ee21f..0364e70 100644 --- a/tests/code_generation.d/generation.bats +++ b/tests/code_generation.d/generation.bats @@ -7,12 +7,7 @@ load "$TESTDIR/utils.sh" } @test "Testing code_generation.d - compilation" { - test_compile \ - -D pcc_create=my_create \ - -D pcc_destroy=my_destroy \ - -D pcc_parse=my_parse \ - -D pcc_context_t=my_context_t \ - -D RET_TYPE=double + ${CC:-cc} -I "$BATS_TEST_DIRNAME" "$BATS_TEST_DIRNAME/parser.c" "$BATS_TEST_DIRNAME/main.c" -o "$BATS_TEST_DIRNAME/parser" "$@" } @test "Testing code_generation.d - earlyheader" { diff --git a/tests/code_generation.d/input.peg b/tests/code_generation.d/input.peg index f072240..88e7998 100644 --- a/tests/code_generation.d/input.peg +++ b/tests/code_generation.d/input.peg @@ -1,7 +1,7 @@ %header { /* HEADER ONLY */ } %source { - int custom_function() { + int custom_function(void) { return 42; } } diff --git a/tests/code_generation.d/main.c b/tests/code_generation.d/main.c new file mode 100644 index 0000000..017a996 --- /dev/null +++ b/tests/code_generation.d/main.c @@ -0,0 +1,9 @@ +#include "parser.h" + +int main(int argc, char **argv) { + double ret; + my_context_t *ctx = my_create(0); + while (my_parse(ctx, &ret)); + my_destroy(ctx); + return 0; +}