Skip to content

Commit 38f4eb8

Browse files
committed
Support parsing null characters
1 parent 25ed98e commit 38f4eb8

File tree

7 files changed

+256
-174
lines changed

7 files changed

+256
-174
lines changed

src/packcc.c

Lines changed: 183 additions & 173 deletions
Large diffs are not rendered by default.

tests/null.d/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/input.bin

tests/null.d/expected.txt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
CHAR_A
2+
CHAR_CLASS_0_A
3+
CHAR_CLASS_1_A
4+
CHAR_CLASS_2_A
5+
CHAR_CLASS_3_A
6+
STRING_0_A
7+
STRING_1_A
8+
STRING_2_A
9+
STRING_3_A
10+
CHAR_CLASS_0_A
11+
CAPTURED_A
12+
CHAR_B
13+
CHAR_CLASS_0_B
14+
CHAR_CLASS_1_B
15+
CHAR_CLASS_2_B
16+
CHAR_CLASS_3_B
17+
STRING_0_B
18+
STRING_1_B
19+
STRING_2_B
20+
STRING_3_B
21+
CHAR_CLASS_0_B
22+
CAPTURED_B

tests/null.d/input.peg

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
FILE <- (LINE ';\n')+
2+
LINE <- CHAR / CHAR_CLASS_0 / CHAR_CLASS_1 / CHAR_CLASS_2 / CHAR_CLASS_3 / STRING_0 / STRING_1 / STRING_2 / STRING_3 / CAPTURED
3+
4+
CHAR <- "char_a:" '\0' { printf("CHAR_A\n"); } / "char_b:" '\x00' { printf("CHAR_B\n"); }
5+
CHAR_CLASS_0 <- "char_class_0_a:" [abc\0-!123]+ { printf("CHAR_CLASS_0_A\n"); } / "char_class_0_b:" [abc\x00-!123]+ { printf("CHAR_CLASS_0_B\n"); }
6+
CHAR_CLASS_1 <- "char_class_1_a:" [abc\0]+ { printf("CHAR_CLASS_1_A\n"); } / "char_class_1_b:" [abc\x00]+ { printf("CHAR_CLASS_1_B\n"); }
7+
CHAR_CLASS_2 <- "char_class_2_a:" [\0-!]+ { printf("CHAR_CLASS_2_A\n"); } / "char_class_2_b:" [\x00-!]+ { printf("CHAR_CLASS_2_B\n"); }
8+
CHAR_CLASS_3 <- "char_class_3_a:" [\0]+ { printf("CHAR_CLASS_3_A\n"); } / "char_class_3_b:" [\x00]+ { printf("CHAR_CLASS_3_B\n"); }
9+
STRING_0 <- "string_0_a:" "abc\0123" { printf("STRING_0_A\n"); } / "string_0_b:" "abc\x00123" { printf("STRING_0_B\n"); }
10+
STRING_1 <- "string_1_a:" "abc\0" { printf("STRING_1_A\n"); } / "string_1_b:" "abc\x00" { printf("STRING_1_B\n"); }
11+
STRING_2 <- "string_2_a:" "\0123" { printf("STRING_2_A\n"); } / "string_2_b:" "\x00123" { printf("STRING_2_B\n"); }
12+
STRING_3 <- "string_3_a:" "\0" { printf("STRING_3_A\n"); } / "string_3_b:" "\x00" { printf("STRING_3_B\n"); }
13+
CAPTURED <- "captured_a:" < CHAR_CLASS_0 "xyz\0123" > "|" $1 { printf("CAPTURED_A\n"); } / "captured_b:" < CHAR_CLASS_0 "xyz\x00123" > "|" $2 { printf("CAPTURED_B\n"); }

tests/null.d/input.txt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
char_a:X;
2+
char_class_0_a:c3X!;
3+
char_class_1_a:aXc;
4+
char_class_2_a:!X!X;
5+
char_class_3_a:XX;
6+
string_0_a:abcX123;
7+
string_1_a:abcX;
8+
string_2_a:X123;
9+
string_3_a:X;
10+
captured_a:char_class_0_a:X!c3xyzX123|char_class_0_a:X!c3xyzX123;
11+
char_b:X;
12+
char_class_0_b:c3X!;
13+
char_class_1_b:aXc;
14+
char_class_2_b:!X!X;
15+
char_class_3_b:XX;
16+
string_0_b:abcX123;
17+
string_1_b:abcX;
18+
string_2_b:X123;
19+
string_3_b:X;
20+
captured_b:char_class_0_b:X!c3xyzX123|char_class_0_b:X!c3xyzX123;

tests/null.d/null.bats

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#!/usr/bin/env bats
2+
3+
load "$TESTDIR/utils.sh"
4+
5+
@test "Testing null.d - generation" {
6+
test_generate
7+
}
8+
9+
@test "Testing null.d - compilation" {
10+
test_compile
11+
}
12+
13+
@test "Testing null.d - run" {
14+
tr "X" "\0" < "$BATS_TEST_DIRNAME/input.txt" > "$BATS_TEST_DIRNAME/input.bin"
15+
run_for_input "$BATS_TEST_DIRNAME/input.bin" "$BATS_TEST_DIRNAME/expected.txt"
16+
}

tests/utils.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ check_output() {
1212

1313
run_for_input() {
1414
run timeout 5s "$BATS_TEST_DIRNAME/parser" < "$1"
15-
check_output "$1"
15+
check_output "${2:-$1}"
1616
}
1717

1818
in_header() {

0 commit comments

Comments
 (0)