summaryrefslogtreecommitdiff
path: root/src/scan.l
diff options
context:
space:
mode:
Diffstat (limited to 'src/scan.l')
-rw-r--r--src/scan.l41
1 files changed, 29 insertions, 12 deletions
diff --git a/src/scan.l b/src/scan.l
index afafa7d..9a2bd83 100644
--- a/src/scan.l
+++ b/src/scan.l
@@ -41,6 +41,9 @@ extern const char *escaped_qstart, *escaped_qend;
#define M4QSTART "[["
#define M4QEND "]]"
+#define SECT3_ESCAPED_QSTART "[" M4QEND M4QSTART "[" M4QEND M4QSTART
+#define SECT3_ESCAPED_QEND M4QEND "]" M4QSTART M4QEND "]" M4QSTART
+
#define ACTION_ECHO add_action( yytext )
#define ACTION_IFDEF(def, should_define) \
{ \
@@ -110,6 +113,8 @@ extern const char *escaped_qstart, *escaped_qend;
%x GROUP_MINUS_PARAMS
%x EXTENDED_COMMENT
%x COMMENT_DISCARD
+%x SECT3_NOESCAPE
+%x CHARACTER_CONSTANT
WS [[:blank:]]+
OPTWS [[:blank:]]*
@@ -240,8 +245,8 @@ M4QEND "]]"
}
. /* ignore spurious characters */
}
-<ACTION,CODEBLOCK,ACTION_STRING,PERCENT_BRACE_ACTION,COMMENT>{
- "M4"|"YY"|"m4" add_action(M4QSTART); ACTION_ECHO; add_action(M4QEND);
+<ACTION,CODEBLOCK,ACTION_STRING,PERCENT_BRACE_ACTION,COMMENT,CHARACTER_CONSTANT>{
+ M4|YY|m4 add_action(M4QSTART); ACTION_ECHO; add_action(M4QEND);
{M4QSTART} ACTION_ECHO_QSTART;
{M4QEND} ACTION_ECHO_QEND;
}
@@ -285,9 +290,9 @@ M4QEND "]]"
buf_strnappend(&top_buf, M4QEND, 2);
}
- [^{}\r\n] {
- buf_strnappend(&top_buf, yytext, yyleng);
- }
+ ([^{}\r\nmMY\[\]]+)|[^{}\r\n] {
+ buf_strnappend(&top_buf, yytext, yyleng);
+ }
<<EOF>> {
linenum = brace_start_line;
@@ -920,10 +925,11 @@ nmstr[yyleng - 2 - end_is_ws] = '\0'; /* chop trailing brace */
<ACTION>{
"{" ACTION_ECHO; ++bracelevel;
"}" ACTION_ECHO; --bracelevel;
- [^[:alpha:]_{}"'/\n\[\]]+ ACTION_ECHO;
+ [^[:alpha:]_{}\"'/\n\[\]]+ ACTION_ECHO;
[\[\]] ACTION_ECHO;
{NAME} ACTION_ECHO;
- "'"([^'\\\n]|\\.)*"'" ACTION_ECHO; /* character constant */
+ "'"([^\'\\\n]|\\.)"'" ACTION_ECHO; /* character constant */
+ "'" ACTION_ECHO; yy_push_state(CHARACTER_CONSTANT);
\" ACTION_ECHO; BEGIN(ACTION_STRING);
{NL} {
++linenum;
@@ -941,14 +947,20 @@ nmstr[yyleng - 2 - end_is_ws] = '\0'; /* chop trailing brace */
}
<ACTION_STRING>{
- [^]"\\\n[]+ ACTION_ECHO;
+ [^\]\"\\\n\[MmY]+ ACTION_ECHO;
+ \" ACTION_ECHO; BEGIN(ACTION);
+}
+<CHARACTER_CONSTANT>{
+ [^\[\]\'\\\nMmY]+ ACTION_ECHO;
+ \' ACTION_ECHO; yy_pop_state();
+}
+<ACTION_STRING,CHARACTER_CONSTANT>{
\\. ACTION_ECHO;
{NL} ++linenum; ACTION_ECHO;
- \" ACTION_ECHO; BEGIN(ACTION);
. ACTION_ECHO;
}
-<COMMENT,COMMENT_DISCARD,ACTION,ACTION_STRING><<EOF>> {
+<COMMENT,COMMENT_DISCARD,ACTION,ACTION_STRING,CHARACTER_CONSTANT><<EOF>> {
synerr( _( "EOF encountered inside an action" ) );
yyterminate();
}
@@ -969,10 +981,15 @@ nmstr[yyleng - 2 - end_is_ws] = '\0'; /* chop trailing brace */
<SECT3>{
- /* "M4"|"m4"|"YY" fprintf (yyout, "[[%s]]", yytext); */
+ "M4"|"m4"|"YY" {
+ if (no_section3_escape) {
+ ECHO;
+ } else
+ fprintf (yyout, "[[%s]]", yytext);
+ }
{M4QSTART} fwrite (escaped_qstart, 1, strlen(escaped_qstart) - 0, yyout);
{M4QEND} fwrite (escaped_qend, 1, strlen(escaped_qend) - 0, yyout);
- [^\[\]\n]*(\n?) ECHO;
+ [^\[\]MmY\n]*(\n?) ECHO;
(.|\n) ECHO;
<<EOF>> {
//fwrite(M4QEND, 1, strlen(M4QEND), yyout);