From a68b93c61873dcee0e67bf895a38c09760b0ad4e Mon Sep 17 00:00:00 2001 From: "Meredith L. Patterson" Date: Sat, 2 Jun 2012 03:35:25 +0200 Subject: [PATCH] adding pesco's base64 example --- .gitignore | 1 + examples/Makefile | 14 +++++++++--- examples/base64.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 examples/base64.c diff --git a/.gitignore b/.gitignore index af536ad..2370b3b 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ src/test_suite lib/hush examples/dns +examples/base64 TAGS diff --git a/examples/Makefile b/examples/Makefile index dc4a0f3..d2c76cf 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 0000000..beb2484 --- /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 + +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; + } +}