From 630d8e4b9b45a49771dec8321dcaf37513a8a6c1 Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan@rename-it.nl> Date: Tue, 22 Jul 2008 09:43:15 +0200 Subject: [PATCH] Testsuite: added lexer string scan comparison test and fixed lexer bug in the process. --- src/lib-sieve/sieve-lexer.c | 20 ++++++++++++++++---- src/testsuite/Makefile.am | 1 + src/testsuite/tests/lexer.svtest | 29 +++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 src/testsuite/tests/lexer.svtest diff --git a/src/lib-sieve/sieve-lexer.c b/src/lib-sieve/sieve-lexer.c index 7fd4f6105..6116e4ccc 100644 --- a/src/lib-sieve/sieve-lexer.c +++ b/src/lib-sieve/sieve-lexer.c @@ -565,21 +565,33 @@ static bool sieve_lexer_scan_raw_token(struct sieve_lexer *lexer) /* Parse literal lines */ while ( TRUE ) { + bool cr_shifted = FALSE; + /* Remove dot-stuffing or detect end of text */ if ( sieve_lexer_curchar(lexer) == '.' ) { - bool cr_shifted = FALSE; sieve_lexer_shift(lexer); /* Check for CRLF */ - if ( sieve_lexer_curchar(lexer) == '\r' ) + if ( sieve_lexer_curchar(lexer) == '\r' ) { sieve_lexer_shift(lexer); + cr_shifted = TRUE; + } if ( sieve_lexer_curchar(lexer) == '\n' ) { sieve_lexer_shift(lexer); lexer->token_type = STT_STRING; return TRUE; - } else if ( cr_shifted ) - str_append_c(str, '\r'); + } else if ( cr_shifted ) { + sieve_lexer_error(lexer, + "found CR without subsequent LF in multi-line string literal"); + lexer->token_type = STT_ERROR; + return FALSE; + } + + /* Handle dot-stuffing */ + str_append_c(str, '.'); + if ( sieve_lexer_curchar(lexer) == '.' ) + sieve_lexer_shift(lexer); } /* Scan the rest of the line */ diff --git a/src/testsuite/Makefile.am b/src/testsuite/Makefile.am index a92be128e..945b9b7b5 100644 --- a/src/testsuite/Makefile.am +++ b/src/testsuite/Makefile.am @@ -65,6 +65,7 @@ test_cases = \ tests/testsuite.svtest\ tests/control-structures.svtest \ tests/exists.svtest \ + tests/lexer.svtest \ tests/comparators/core.svtest \ tests/match-types/contains.svtest \ tests/match-types/matches.svtest \ diff --git a/src/testsuite/tests/lexer.svtest b/src/testsuite/tests/lexer.svtest new file mode 100644 index 000000000..95e668b6d --- /dev/null +++ b/src/testsuite/tests/lexer.svtest @@ -0,0 +1,29 @@ +require "vnd.dovecot.testsuite"; +require "variables"; + +/* Test conformance to RFC 5228 - 2.4.2. Strings */ + +set "text" text: +Line 1 +.Line 2 +..Line 3 +.Line 4 +Line 5 +. +; + +set "quoted" +"Line 1 +.Line 2 +.Line 3 +.Line 4 +Line 5 +"; + +test "LEXER-string-literal" { + if not string :is "${text}" "${quoted}" { + test_fail "lexer messed-up dot stuffing"; + } +} + + -- GitLab