diff --git a/.gitignore b/.gitignore index 3ab234f023eeef7ac5bb003d96d0ca1d21596b4a..db2ee3a2f3fa54431b73adf65233086e9cde2441 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ src/test_suite lib/hush examples/dns +examples/base64 TAGS *.swp *.swo diff --git a/examples/Makefile b/examples/Makefile index dc4a0f3085e8c137baca56ea79000c8b104605f9..d2c76cf4f931017629d8d675c857b9d188e1df8e 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -1,13 +1,15 @@ OUTPUTS := dns.o \ - dns + dns \ + base64.o \ + base64 TOPLEVEL := ../ include ../common.mk -all: dns +all: dns base64 dns: LDFLAGS:=-L../src -lhammer $(LDFLAGS) dns: dns.o rr.o dns_common.o @@ -17,4 +19,10 @@ dns.o: ../src/hammer.h dns_common.h rr.o: ../src/hammer.h rr.h dns_common.h -dns_common.o: ../src/hammer.h dns_common.h \ No newline at end of file +dns_common.o: ../src/hammer.h dns_common.h + +base64: LDFLAGS:=-L../src -lhammer $(LDFLAGS) +base64: base64.o + $(call hush, "Linking $@") $(CC) -o $@ $^ $(LDFLAGS) + +base64.o: ../src/hammer.h diff --git a/examples/base64.c b/examples/base64.c new file mode 100644 index 0000000000000000000000000000000000000000..beb2484f9dcbbf2add81c2295572731ca06fa487 --- /dev/null +++ b/examples/base64.c @@ -0,0 +1,54 @@ +#include "../src/hammer.h" + +const HParser* document = NULL; + +void init_parser(void) +{ + // CORE + const HParser *digit = h_ch_range(0x30, 0x39); + const HParser *alpha = h_choice(h_ch_range(0x41, 0x5a), h_ch_range(0x61, 0x7a), NULL); + + // AUX. + const HParser *plus = h_ch('+'); + const HParser *slash = h_ch('/'); + const HParser *equals = h_ch('='); + + const HParser *bsfdig = h_choice(alpha, digit, plus, slash, NULL); + const HParser *bsfdig_4bit = h_choice( + h_ch('A'), h_ch('E'), h_ch('I'), h_ch('M'), h_ch('Q'), h_ch('U'), + h_ch('Y'), h_ch('c'), h_ch('g'), h_ch('k'), h_ch('o'), h_ch('s'), + h_ch('w'), h_ch('0'), h_ch('4'), h_ch('8'), NULL); + const HParser *bsfdig_2bit = h_choice(h_ch('A'), h_ch('Q'), h_ch('g'), h_ch('w'), NULL); + const HParser *base64_2 = h_sequence(bsfdig, bsfdig, bsfdig_4bit, equals, NULL); + const HParser *base64_1 = h_sequence(bsfdig, bsfdig_2bit, equals, equals, NULL); + const HParser *base64 = h_choice(base64_2, base64_1, NULL); + // why does this parse "A=="?! + // why does this parse "aaA=" but not "aA=="?! + + document = base64; +} + + +#include <stdio.h> + +int main(int argc, char **argv) +{ + uint8_t input[102400]; + size_t inputsize; + const HParseResult *result; + + init_parser(); + + inputsize = fread(input, 1, sizeof(input), stdin); + fprintf(stderr, "inputsize=%lu\ninput=", inputsize); + fwrite(input, 1, inputsize, stderr); + result = h_parse(document, input, inputsize); + + if(result) { + fprintf(stderr, "parsed=%lld bytes\n", result->bit_length/8); + h_pprint(stdout, result->ast, 0, 0); + return 0; + } else { + return 1; + } +}