summaryrefslogtreecommitdiff
path: root/src/doctokenizer.l
diff options
context:
space:
mode:
Diffstat (limited to 'src/doctokenizer.l')
-rw-r--r--src/doctokenizer.l842
1 files changed, 464 insertions, 378 deletions
diff --git a/src/doctokenizer.l b/src/doctokenizer.l
index ac5b6d2..330db00 100644
--- a/src/doctokenizer.l
+++ b/src/doctokenizer.l
@@ -6,8 +6,8 @@
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -49,7 +49,7 @@
#define USE_STATE2STRING 0
#define TK_COMMAND_SEL() (yytext[0] == '@' ? TK_COMMAND_AT : TK_COMMAND_BS)
-
+
//--------------------------------------------------------------------------
// context for tokenizer phase
@@ -75,13 +75,18 @@ struct DocLexerContext
TokenInfo *token;
int rule;
int autoListLevel;
- int inputPos;
+ yy_size_t inputPos;
const char *inputString;
YY_BUFFER_STATE state;
};
static QStack<DocLexerContext> g_lexerStack;
+static int g_yyLineNr = 0;
+
+#define lineCount(s,len) do { for(int i=0;i<(int)len;i++) if (s[i]=='\n') g_yyLineNr++; } while(0)
+
+
#if USE_STATE2STRING
static const char *stateToString(int state);
#endif
@@ -124,6 +129,7 @@ QCString extractPartAfterNewLine(const QCString &text)
int nl2 = text.findRev("\\ilinebr");
if (nl2!=-1)
{
+ if (text.at(nl2+8)==' ') nl2++; // skip space after \\ilinebr
return text.mid(nl2+8);
}
return text;
@@ -187,7 +193,7 @@ static void processSection()
}
else
{
- warn(g_fileName,yylineno,"Found section/anchor %s without context\n",g_secLabel.data());
+ warn(g_fileName,g_yyLineNr,"Found section/anchor %s without context\n",g_secLabel.data());
}
SectionInfo *si = SectionManager::instance().find(g_secLabel);
if (si)
@@ -203,10 +209,10 @@ static void handleHtmlTag()
g_token->attribs.clear();
g_token->endTag = FALSE;
g_token->emptyTag = FALSE;
-
+
// Check for end tag
int startNamePos=1;
- if (tagText.at(1)=='/')
+ if (tagText.at(1)=='/')
{
g_token->endTag = TRUE;
startNamePos++;
@@ -234,7 +240,7 @@ static void handleHtmlTag()
// check for end of the tag
if (c == '>') break;
// Check for XML style "empty" tag.
- if (c == '/')
+ if (c == '/')
{
g_token->emptyTag = TRUE;
break;
@@ -244,42 +250,42 @@ static void handleHtmlTag()
while (i<(int)yyleng && !isspace((uchar)c) && c!='=' && c!= '>') { c=tagText.at(++i); }
endName=i;
HtmlAttrib opt;
- opt.name = tagText.mid(startName,endName-startName).lower();
+ opt.name = tagText.mid(startName,endName-startName).lower();
// skip spaces
- while (i<(int)yyleng && isspace((uchar)c)) { c=tagText.at(++i); }
+ while (i<(int)yyleng && isspace((uchar)c)) { c=tagText.at(++i); }
if (tagText.at(i)=='=') // option has value
{
c=tagText.at(++i);
// skip spaces
- while (i<(int)yyleng && isspace((uchar)c)) { c=tagText.at(++i); }
+ while (i<(int)yyleng && isspace((uchar)c)) { c=tagText.at(++i); }
if (tagText.at(i)=='\'') // option '...'
{
c=tagText.at(++i);
- startAttrib=i;
-
- // search for matching quote
- while (i<(int)yyleng && c!='\'') { c=tagText.at(++i); }
- endAttrib=i;
+ startAttrib=i;
+
+ // search for matching quote
+ while (i<(int)yyleng && c!='\'') { c=tagText.at(++i); }
+ endAttrib=i;
if (i<(int)yyleng) { c=tagText.at(++i);}
}
else if (tagText.at(i)=='"') // option "..."
{
c=tagText.at(++i);
- startAttrib=i;
- // search for matching quote
- while (i<(int)yyleng && c!='"') { c=tagText.at(++i); }
- endAttrib=i;
+ startAttrib=i;
+ // search for matching quote
+ while (i<(int)yyleng && c!='"') { c=tagText.at(++i); }
+ endAttrib=i;
if (i<(int)yyleng) { c=tagText.at(++i);}
}
else // value without any quotes
{
- startAttrib=i;
- // search for separator or end symbol
- while (i<(int)yyleng && !isspace((uchar)c) && c!='>') { c=tagText.at(++i); }
- endAttrib=i;
+ startAttrib=i;
+ // search for separator or end symbol
+ while (i<(int)yyleng && !isspace((uchar)c) && c!='>') { c=tagText.at(++i); }
+ endAttrib=i;
if (i<(int)yyleng) { c=tagText.at(++i);}
}
- opt.value = tagText.mid(startAttrib,endAttrib-startAttrib);
+ opt.value = tagText.mid(startAttrib,endAttrib-startAttrib);
if (opt.name == "align") opt.value = opt.value.lower();
else if (opt.name == "valign")
{
@@ -296,7 +302,7 @@ static void handleHtmlTag()
}
g_token->attribsStr = tagText.mid(startAttribList,i-startAttribList);
}
-
+
static QCString stripEmptyLines(const QCString &s)
{
if (s.isEmpty()) return QCString();
@@ -307,11 +313,11 @@ static QCString stripEmptyLines(const QCString &s)
{
int c;
while ((c=s[p]) && (c==' ' || c=='\t')) p++;
- if (s[p]=='\n')
+ if (s[p]=='\n')
{
- start=++p;
+ start=++p;
}
- else
+ else
{
break;
}
@@ -323,7 +329,7 @@ static QCString stripEmptyLines(const QCString &s)
{
int c;
while ((c=s[p]) && (c==' ' || c=='\t')) p--;
- if (s[p]=='\n')
+ if (s[p]=='\n')
{
end=p;
}
@@ -337,6 +343,7 @@ static QCString stripEmptyLines(const QCString &s)
return s.mid(start,end-start);
}
+#define unput_string(yytext,yyleng) do { for (int i=(int)yyleng-1;i>=0;i--) unput(yytext[i]); } while(0)
//--------------------------------------------------------------------------
#undef YY_INPUT
@@ -378,21 +385,21 @@ OLISTITEM {BLANK}*[1-9][0-9]*"."{BLANK}
ENDLIST {BLANK}*"."{BLANK}*\n
ATTRNAME [a-z_A-Z\x80-\xFF][:a-z_A-Z0-9\x80-\xFF\-]*
ATTRIB {ATTRNAME}{WS}*("="{WS}*(("\""[^\"]*"\"")|("'"[^\']*"'")|[^ \t\r\n'"><]+))?
-URLCHAR [a-z_A-Z0-9\!\~\,\:\;\'\$\?\@\&\%\#\.\-\+\/\=]
+URLCHAR [a-z_A-Z0-9\!\~\,\:\;\'\$\?\@\&\%\#\.\-\+\/\=\x80-\xFF]
URLMASK ({URLCHAR}+([({]{URLCHAR}*[)}])?)+
-URLPROTOCOL ("http:"|"https:"|"ftp:"|"file:"|"news:"|"irc")
-FILESCHAR [a-z_A-Z0-9\\:\\\/\-\+&#]
-FILEECHAR [a-z_A-Z0-9\-\+&#]
+URLPROTOCOL ("http:"|"https:"|"ftp:"|"ftps:"|"sftp:"|"file:"|"news:"|"irc:"|"ircs:")
+FILESCHAR [a-z_A-Z0-9\\:\\\/\-\+&#@]
+FILEECHAR [a-z_A-Z0-9\-\+&#@]
HFILEMASK ("."{FILESCHAR}*{FILEECHAR}+)+
FILEMASK ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|{HFILEMASK}
-LINKMASK [^ \t\n\r\\@<&${}]+("("[^\n)]*")")?({BLANK}*("const"|"volatile"){BLANK}+)?
+LINKMASK [^ \t\n\r\\@<&${}]+("("[^\n)]*")")?({BLANK}*("const"|"volatile"){BLANK}+)?
VERBATIM "verbatim"{BLANK}*
SPCMD1 {CMD}([a-z_A-Z][a-z_A-Z0-9]*|{VERBATIM}|"--"|"---")
SPCMD2 {CMD}[\\@<>&$#%~".+=|-]
SPCMD3 {CMD}_form#[0-9]+
SPCMD4 {CMD}"::"
SPCMD5 {CMD}":"
-INOUT "in"|"out"|("in"{BLANK}*","?{BLANK}*"out")|("out"{BLANK}*","?{BLANK}*"in")
+INOUT "in"|"out"|("in"{BLANK}*","?{BLANK}*"out")|("out"{BLANK}*","?{BLANK}*"in")
PARAMIO {CMD}param{BLANK}*"["{BLANK}*{INOUT}{BLANK}*"]"
VARARGS "..."
TEMPCHAR [a-z_A-Z0-9.,: \t\*\&\(\)\[\]]
@@ -427,7 +434,7 @@ WORD2 "."|","|"("|")"|"["|"]"|"::"|":"|";"|"\?"|"="|"'"
WORD1NQ {ESCWORD}|{CHARWORDQ}+|"{"|"}"
WORD2NQ "."|","|"("|")"|"["|"]"|"::"|":"|";"|"\?"|"="|"'"
CAPTION [cC][aA][pP][tT][iI][oO][nN]
-HTMLTAG "<"(("/")?){ID}({WS}+{ATTRIB})*{WS}*(("/")?)">"
+HTMLTAG "<"(("/")?){ID}({WS}+{ATTRIB})*{WS}*(("/")?)">"
HTMLKEYL "strong"|"center"|"table"|"caption"|"small"|"code"|"dfn"|"var"|"img"|"pre"|"sub"|"sup"|"tr"|"td"|"th"|"ol"|"ul"|"li"|"tt"|"kbd"|"em"|"hr"|"dl"|"dt"|"dd"|"br"|"i"|"a"|"b"|"p"|"strike"|"u"|"del"|"ins"|"s"
HTMLKEYU "STRONG"|"CENTER"|"TABLE"|"CAPTION"|"SMALL"|"CODE"|"DFN"|"VAR"|"IMG"|"PRE"|"SUB"|"SUP"|"TR"|"TD"|"TH"|"OL"|"UL"|"LI"|"TT"|"KBD"|"EM"|"HR"|"DL"|"DT"|"DD"|"BR"|"I"|"A"|"B"|"P"|"STRIKE"|"U"|"DEL"|"INS"|"S"
HTMLKEYW {HTMLKEYL}|{HTMLKEYU}
@@ -439,9 +446,9 @@ REFWORD4_NOCV (({SCOPEPRE}*"operator"{OPMASKOP2})|(("::"|"#"){SCOPEPRE}*"operat
REFWORD4 {REFWORD4_NOCV}{CVSPEC}?
REFWORD {FILEMASK}|{LABELID}|{REFWORD2}|{REFWORD3}|{REFWORD4}
REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
+RCSID "$"("Author"|"Date"|"Header"|"Id"|"Locker"|"Log"|"Name"|"RCSfile"|"Revision"|"Source"|"State")":"[^:\n$][^\n$]*"$"
%option noyywrap
-%option yylineno
%x St_Para
%x St_Comment
@@ -493,21 +500,23 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
%%
<St_Para>\r /* skip carriage return */
-<St_Para>^{LISTITEM} { /* list item */
+<St_Para>^{LISTITEM} { /* list item */
+ lineCount(yytext,yyleng);
QCString text=yytext;
- int dashPos = text.findRev('-');
- g_token->isEnumList = text.at(dashPos+1)=='#';
+ int dashPos = text.findRev('-');
+ g_token->isEnumList = text.at(dashPos+1)=='#';
g_token->id = -1;
- g_token->indent = computeIndent(yytext,dashPos);
+ g_token->indent = computeIndent(yytext,dashPos);
return TK_LISTITEM;
}
-<St_Para>^{MLISTITEM} { /* list item */
+<St_Para>^{MLISTITEM} { /* list item */
if (!g_markdownSupport || g_insidePre)
{
REJECT;
}
else
{
+ lineCount(yytext,yyleng);
QCString text=yytext;
static QRegExp re("[*+]");
int listPos = text.findRev(re);
@@ -517,7 +526,7 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
return TK_LISTITEM;
}
}
-<St_Para>^{OLISTITEM} { /* numbered list item */
+<St_Para>^{OLISTITEM} { /* numbered list item */
if (!g_markdownSupport || g_insidePre)
{
REJECT;
@@ -534,21 +543,23 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
return TK_LISTITEM;
}
}
-<St_Para>{BLANK}*(\n|"\\ilinebr"){LISTITEM} { /* list item on next line */
+<St_Para>{BLANK}*(\n|"\\ilinebr"){LISTITEM} { /* list item on next line */
+ lineCount(yytext,yyleng);
QCString text=extractPartAfterNewLine(yytext);
- int dashPos = text.findRev('-');
- g_token->isEnumList = text.at(dashPos+1)=='#';
+ int dashPos = text.findRev('-');
+ g_token->isEnumList = text.at(dashPos+1)=='#';
g_token->id = -1;
- g_token->indent = computeIndent(text,dashPos);
+ g_token->indent = computeIndent(text,dashPos);
return TK_LISTITEM;
}
-<St_Para>{BLANK}*(\n|"\\ilinebr"){MLISTITEM} { /* list item on next line */
+<St_Para>{BLANK}*(\n|"\\ilinebr"){MLISTITEM} { /* list item on next line */
if (!g_markdownSupport || g_insidePre)
{
REJECT;
}
else
{
+ lineCount(yytext,yyleng);
QCString text=extractPartAfterNewLine(yytext);
static QRegExp re("[*+]");
int markPos = text.findRev(re);
@@ -558,13 +569,14 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
return TK_LISTITEM;
}
}
-<St_Para>{BLANK}*(\n|"\\ilinebr"){OLISTITEM} { /* list item on next line */
+<St_Para>{BLANK}*(\n|"\\ilinebr"){OLISTITEM} { /* list item on next line */
if (!g_markdownSupport || g_insidePre)
{
REJECT;
}
else
{
+ lineCount(yytext,yyleng);
QCString text=extractPartAfterNewLine(yytext);
static QRegExp re("[1-9]");
int digitPos = text.find(re);
@@ -575,41 +587,44 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
return TK_LISTITEM;
}
}
-<St_Para>^{ENDLIST} { /* end list */
+<St_Para>^{ENDLIST} { /* end list */
+ lineCount(yytext,yyleng);
int dotPos = QCString(yytext).findRev('.');
- g_token->indent = computeIndent(yytext,dotPos);
+ g_token->indent = computeIndent(yytext,dotPos);
return TK_ENDLIST;
}
-<St_Para>{BLANK}*(\n|"\\ilinebr"){ENDLIST} { /* end list on next line */
+<St_Para>{BLANK}*(\n|"\\ilinebr"){ENDLIST} { /* end list on next line */
+ lineCount(yytext,yyleng);
QCString text=extractPartAfterNewLine(yytext);
int dotPos = text.findRev('.');
- g_token->indent = computeIndent(text,dotPos);
+ g_token->indent = computeIndent(text,dotPos);
return TK_ENDLIST;
}
<St_Para>"{"{BLANK}*"@link"/{BLANK}+ {
- g_token->name = "javalink";
- return TK_COMMAND_AT;
- }
+ g_token->name = "javalink";
+ return TK_COMMAND_AT;
+ }
<St_Para>"{"{BLANK}*"@inheritDoc"{BLANK}*"}" {
- g_token->name = "inheritdoc";
- return TK_COMMAND_AT;
- }
+ g_token->name = "inheritdoc";
+ return TK_COMMAND_AT;
+ }
<St_Para>"@_fakenl" { // artificial new line
- yylineno++;
- }
+ //g_yyLineNr++;
+ }
<St_Para>{SPCMD3} {
- g_token->name = "_form";
- bool ok;
- g_token->id = QCString(yytext).right((int)yyleng-7).toInt(&ok);
- ASSERT(ok);
- return TK_COMMAND_SEL();
- }
+ g_token->name = "_form";
+ bool ok;
+ g_token->id = QCString(yytext).right((int)yyleng-7).toInt(&ok);
+ ASSERT(ok);
+ return TK_COMMAND_SEL();
+ }
<St_Para>{CMD}"n"\n { /* \n followed by real newline */
- yylineno++;
+ lineCount(yytext,yyleng);
+ //g_yyLineNr++;
g_token->name = yytext+1;
- g_token->name = g_token->name.stripWhiteSpace();
- g_token->paramDir=TokenInfo::Unspecified;
- return TK_COMMAND_SEL();
+ g_token->name = g_token->name.stripWhiteSpace();
+ g_token->paramDir=TokenInfo::Unspecified;
+ return TK_COMMAND_SEL();
}
<St_Para>"\\ilinebr" {
}
@@ -618,108 +633,109 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
<St_Para>{SPCMD5} |
<St_Para>{SPCMD4} { /* special command */
g_token->name = yytext+1;
- g_token->name = g_token->name.stripWhiteSpace();
- g_token->paramDir=TokenInfo::Unspecified;
+ g_token->name = g_token->name.stripWhiteSpace();
+ g_token->paramDir=TokenInfo::Unspecified;
return TK_COMMAND_SEL();
- }
+ }
<St_Para>{PARAMIO} { /* param [in,out] command */
- g_token->name = "param";
- QCString s(yytext);
- bool isIn = s.find("in")!=-1;
- bool isOut = s.find("out")!=-1;
- if (isIn)
- {
- if (isOut)
- {
- g_token->paramDir=TokenInfo::InOut;
- }
- else
- {
- g_token->paramDir=TokenInfo::In;
- }
- }
- else if (isOut)
- {
- g_token->paramDir=TokenInfo::Out;
- }
- else
- {
- g_token->paramDir=TokenInfo::Unspecified;
- }
- return TK_COMMAND_SEL();
- }
+ g_token->name = "param";
+ QCString s(yytext);
+ bool isIn = s.find("in")!=-1;
+ bool isOut = s.find("out")!=-1;
+ if (isIn)
+ {
+ if (isOut)
+ {
+ g_token->paramDir=TokenInfo::InOut;
+ }
+ else
+ {
+ g_token->paramDir=TokenInfo::In;
+ }
+ }
+ else if (isOut)
+ {
+ g_token->paramDir=TokenInfo::Out;
+ }
+ else
+ {
+ g_token->paramDir=TokenInfo::Unspecified;
+ }
+ return TK_COMMAND_SEL();
+ }
<St_Para>{URLPROTOCOL}{URLMASK}/[,\.] { // URL, or URL.
g_token->name=yytext;
- g_token->isEMailAddr=FALSE;
- return TK_URL;
+ g_token->isEMailAddr=FALSE;
+ return TK_URL;
}
<St_Para>{URLPROTOCOL}{URLMASK} { // URL
g_token->name=yytext;
- g_token->isEMailAddr=FALSE;
- return TK_URL;
+ g_token->isEMailAddr=FALSE;
+ return TK_URL;
}
<St_Para>"<"{URLPROTOCOL}{URLMASK}">" { // URL
g_token->name=yytext;
g_token->name = g_token->name.mid(1,g_token->name.length()-2);
- g_token->isEMailAddr=FALSE;
- return TK_URL;
+ g_token->isEMailAddr=FALSE;
+ return TK_URL;
}
<St_Para>{MAILADDR} { // Mail address
g_token->name=yytext;
g_token->name.stripPrefix("mailto:");
- g_token->isEMailAddr=TRUE;
- return TK_URL;
+ g_token->isEMailAddr=TRUE;
+ return TK_URL;
}
<St_Para>"<"{MAILADDR}">" { // Mail address
g_token->name=yytext;
g_token->name = g_token->name.mid(1,g_token->name.length()-2);
g_token->name.stripPrefix("mailto:");
- g_token->isEMailAddr=TRUE;
- return TK_URL;
+ g_token->isEMailAddr=TRUE;
+ return TK_URL;
}
<St_Para>"<"{MAILADDR2}">" { // anti spam mail address
g_token->name=yytext;
- return TK_WORD;
+ return TK_WORD;
}
-<St_Para>"$"{ID}":"[^:\n$][^\n$]*"$" { /* RCS tag */
+<St_Para>{RCSID} { /* RCS tag */
QCString tagName(yytext+1);
- int index=tagName.find(':');
- g_token->name = tagName.left(index);
- int text_begin = index+2;
- int text_end = tagName.length()-1;
- if (tagName[text_begin-1]==':') /* check for Subversion fixed-length keyword */
- {
- ++text_begin;
- if (tagName[text_end-1]=='#')
- --text_end;
- }
- g_token->text = tagName.mid(text_begin,text_end-text_begin);
- return TK_RCSTAG;
- }
+ int index=tagName.find(':');
+ g_token->name = tagName.left(index);
+ int text_begin = index+2;
+ int text_end = tagName.length()-1;
+ if (tagName[text_begin-1]==':') /* check for Subversion fixed-length keyword */
+ {
+ ++text_begin;
+ if (tagName[text_end-1]=='#')
+ --text_end;
+ }
+ g_token->text = tagName.mid(text_begin,text_end-text_begin);
+ return TK_RCSTAG;
+ }
<St_Para,St_HtmlOnly,St_ManOnly,St_LatexOnly,St_RtfOnly,St_XmlOnly,St_DbOnly>"$("{ID}")" | /* environment variable */
<St_Para,St_HtmlOnly,St_ManOnly,St_LatexOnly,St_RtfOnly,St_XmlOnly,St_DbOnly>"$("{ID}"("{ID}"))" { /* environment variable */
QCString name = &yytext[2];
- name = name.left(name.length()-1);
- QCString value = Portable::getenv(name);
- for (int i=value.length()-1;i>=0;i--) unput(value.at(i));
+ name = name.left(name.length()-1);
+ QCString value = Portable::getenv(name);
+ for (int i=value.length()-1;i>=0;i--) unput(value.at(i));
}
-<St_Para>{HTMLTAG} { /* html tag */
+<St_Para>{HTMLTAG} { /* html tag */
+ lineCount(yytext,yyleng);
handleHtmlTag();
return TK_HTMLTAG;
}
-<St_Para,St_Text>"&"{ID}";" { /* special symbol */
+<St_Para,St_Text>"&"{ID}";" { /* special symbol */
g_token->name = yytext;
return TK_SYMBOL;
}
/********* patterns for linkable words ******************/
-<St_Para>{ID}/"<"{HTMLKEYW}">" { /* this rule is to prevent opening html
- * tag to be recognized as a templated classes
- */
+<St_Para>{ID}/"<"{HTMLKEYW}">" { /* this rule is to prevent opening html
+ * tag to be recognized as a templated classes
+ */
g_token->name = yytext;
return TK_LNKWORD;
- }
+ }
<St_Para>{LNKWORD1}/"<br>" | // prevent <br> html tag to be parsed as template arguments
<St_Para>{LNKWORD1} |
<St_Para>{LNKWORD1}{FUNCARG} |
@@ -727,34 +743,35 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
<St_Para>{LNKWORD3} {
g_token->name = yytext;
return TK_LNKWORD;
- }
+ }
<St_Para>{LNKWORD1}{FUNCARG}{CVSPEC}[^a-z_A-Z0-9] {
g_token->name = yytext;
g_token->name = g_token->name.left(g_token->name.length()-1);
- unput(yytext[(int)yyleng-1]);
+ unput(yytext[(int)yyleng-1]);
return TK_LNKWORD;
}
/********* patterns for normal words ******************/
<St_Para,St_Text>[\-+0-9] |
<St_Para,St_Text>{WORD1} |
-<St_Para,St_Text>{WORD2} { /* function call */
+<St_Para,St_Text>{WORD2} { /* function call */
+ lineCount(yytext,yyleng);
if (yytext[0]=='%') // strip % if present
- g_token->name = &yytext[1];
- else
+ g_token->name = &yytext[1];
+ else
g_token->name = yytext;
return TK_WORD;
- /* the following is dummy code to please the
- * compiler, removing this results in a warning
- * on my machine
- */
- goto find_rule;
+ /* the following is dummy code to please the
+ * compiler, removing this results in a warning
+ * on my machine
+ */
+ goto find_rule;
}
<St_Text>({ID}".")+{ID} {
g_token->name = yytext;
return TK_WORD;
- }
+ }
<St_Para,St_Text>"operator"/{BLANK}*"<"[a-zA-Z_0-9]+">" { // Special case: word "operator" followed by a HTML command
// avoid interpretation as "operator <"
g_token->name = yytext;
@@ -764,45 +781,58 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
/*******************************************************/
<St_Para,St_Text>{BLANK}+ |
-<St_Para,St_Text>{BLANK}*\n{BLANK}* { /* white space */
+<St_Para,St_Text>{BLANK}*\n{BLANK}* { /* white space */
+ lineCount(yytext,yyleng);
g_token->chars=yytext;
return TK_WHITESPACE;
}
<St_Text>[\\@<>&$#%~] {
g_token->name = yytext;
return TK_COMMAND_SEL();
- }
+ }
<St_Para>({BLANK}*\n)+{BLANK}*\n/{LISTITEM} { /* skip trailing paragraph followed by new list item */
if (g_insidePre || g_autoListLevel==0)
{
REJECT;
}
+ lineCount(yytext,yyleng);
}
<St_Para>({BLANK}*\n)+{BLANK}*\n/{MLISTITEM} { /* skip trailing paragraph followed by new list item */
if (!g_markdownSupport || g_insidePre || g_autoListLevel==0)
{
REJECT;
}
+ lineCount(yytext,yyleng);
}
<St_Para>({BLANK}*\n)+{BLANK}*\n/{OLISTITEM} { /* skip trailing paragraph followed by new list item */
if (!g_markdownSupport || g_insidePre || g_autoListLevel==0)
{
REJECT;
}
+ lineCount(yytext,yyleng);
}
-<St_Para>({BLANK}*\n)+{BLANK}*\n{BLANK}* {
- g_token->indent=computeIndent(yytext,(int)yyleng);
- int i;
- // put back the indentation (needed for list items)
- for (i=0;i<g_token->indent;i++)
+<St_Para>({BLANK}*(\n|"\\ilinebr"))+{BLANK}*(\n|"\\ilinebr"){BLANK}* {
+ lineCount(yytext,yyleng);
+ if (g_insidePre)
+ {
+ g_token->chars=yytext;
+ return TK_WHITESPACE;
+ }
+ else
{
- unput(' ');
+ g_token->indent=computeIndent(yytext,(int)yyleng);
+ int i;
+ // put back the indentation (needed for list items)
+ for (i=0;i<g_token->indent;i++)
+ {
+ unput(' ');
+ }
+ // tell flex that after putting the last indent
+ // back we are at the beginning of the line
+ YY_CURRENT_BUFFER->yy_at_bol=1;
+ // start of a new paragraph
+ return TK_NEWPARA;
}
- // tell flex that after putting the last indent
- // back we are at the beginning of the line
- YY_CURRENT_BUFFER->yy_at_bol=1;
- // start of a new paragraph
- return TK_NEWPARA;
}
<St_CodeOpt>{BLANK}*"{"(".")?{LABELID}"}" {
g_token->name = yytext;
@@ -813,20 +843,23 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
<St_CodeOpt>"\\ilinebr" |
<St_CodeOpt>\n |
<St_CodeOpt>. {
- for (int i=yyleng-1;i>=0;i--) unput(yytext[i]);
+ unput_string(yytext,yyleng);
BEGIN(St_Code);
}
<St_Code>{WS}*{CMD}"endcode" {
+ lineCount(yytext,yyleng);
return RetVal_OK;
}
<St_XmlCode>{WS}*"</code>" {
+ lineCount(yytext,yyleng);
return RetVal_OK;
}
<St_Code,St_XmlCode>[^\\@\n<]+ |
<St_Code,St_XmlCode>\n |
<St_Code,St_XmlCode>. {
- g_token->verb+=yytext;
- }
+ lineCount(yytext,yyleng);
+ g_token->verb+=yytext;
+ }
<St_HtmlOnlyOption>" [block]" { // the space is added in commentscan.l
g_token->name="block";
BEGIN(St_HtmlOnly);
@@ -836,7 +869,7 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
BEGIN(St_HtmlOnly);
}
<St_HtmlOnlyOption>"\\ilinebr" {
- for (int i=yyleng-1;i>=0;i--) unput(yytext[i]);
+ unput_string(yytext,yyleng);
BEGIN(St_HtmlOnly);
}
<St_HtmlOnly>{CMD}"endhtmlonly" {
@@ -845,77 +878,86 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
<St_HtmlOnly>[^\\@\n$]+ |
<St_HtmlOnly>\n |
<St_HtmlOnly>. {
- g_token->verb+=yytext;
- }
+ lineCount(yytext,yyleng);
+ g_token->verb+=yytext;
+ }
<St_ManOnly>{CMD}"endmanonly" {
return RetVal_OK;
}
<St_ManOnly>[^\\@\n$]+ |
<St_ManOnly>\n |
<St_ManOnly>. {
- g_token->verb+=yytext;
- }
+ lineCount(yytext,yyleng);
+ g_token->verb+=yytext;
+ }
<St_RtfOnly>{CMD}"endrtfonly" {
return RetVal_OK;
}
<St_RtfOnly>[^\\@\n$]+ |
<St_RtfOnly>\n |
<St_RtfOnly>. {
- g_token->verb+=yytext;
- }
+ lineCount(yytext,yyleng);
+ g_token->verb+=yytext;
+ }
<St_LatexOnly>{CMD}"endlatexonly" {
return RetVal_OK;
}
<St_LatexOnly>[^\\@\n]+ |
<St_LatexOnly>\n |
<St_LatexOnly>. {
- g_token->verb+=yytext;
- }
+ lineCount(yytext,yyleng);
+ g_token->verb+=yytext;
+ }
<St_XmlOnly>{CMD}"endxmlonly" {
return RetVal_OK;
}
<St_XmlOnly>[^\\@\n]+ |
<St_XmlOnly>\n |
<St_XmlOnly>. {
- g_token->verb+=yytext;
- }
+ lineCount(yytext,yyleng);
+ g_token->verb+=yytext;
+ }
<St_DbOnly>{CMD}"enddocbookonly" {
return RetVal_OK;
}
<St_DbOnly>[^\\@\n]+ |
<St_DbOnly>\n |
<St_DbOnly>. {
- g_token->verb+=yytext;
- }
+ lineCount(yytext,yyleng);
+ g_token->verb+=yytext;
+ }
<St_Verbatim>{CMD}"endverbatim" {
- g_token->verb=stripEmptyLines(g_token->verb);
+ g_token->verb=stripEmptyLines(g_token->verb);
return RetVal_OK;
}
<St_Verbatim>[^\\@\n]+ |
<St_Verbatim>\n |
<St_Verbatim>. { /* Verbatim text */
- g_token->verb+=yytext;
- }
+ lineCount(yytext,yyleng);
+ g_token->verb+=yytext;
+ }
<St_Dot>{CMD}"enddot" {
return RetVal_OK;
}
<St_Dot>[^\\@\n]+ |
<St_Dot>\n |
<St_Dot>. { /* dot text */
- g_token->verb+=yytext;
- }
+ lineCount(yytext,yyleng);
+ g_token->verb+=yytext;
+ }
<St_Msc>{CMD}("endmsc") {
return RetVal_OK;
}
<St_Msc>[^\\@\n]+ |
<St_Msc>\n |
<St_Msc>. { /* msc text */
- g_token->verb+=yytext;
- }
+ lineCount(yytext,yyleng);
+ g_token->verb+=yytext;
+ }
<St_PlantUMLOpt>{BLANK}*"{"[^}]*"}" { // case 1: file name is specified as {filename}
g_token->sectionId = QCString(yytext).stripWhiteSpace();
// skip curly brackets around the optional image name
- g_token->sectionId = g_token->sectionId.mid(1,g_token->sectionId.length()-2).stripWhiteSpace();
+ g_token->sectionId = g_token->sectionId.mid(1,g_token->sectionId.length()-2).stripWhiteSpace();
return RetVal_OK;
}
<St_PlantUMLOpt>{BLANK}*{FILEMASK}{BLANK}+/{ID}"=" { // case 2: plain file name specified followed by an attribute
@@ -938,7 +980,7 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
<St_PlantUMLOpt>"\n" |
<St_PlantUMLOpt>. {
g_token->sectionId = "";
- for (int i=yyleng-1;i>=0;i--) unput(yytext[i]);
+ unput_string(yytext,yyleng);
return RetVal_OK;
}
<St_PlantUML>{CMD}"enduml" {
@@ -947,117 +989,126 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
<St_PlantUML>[^\\@\n]+ |
<St_PlantUML>\n |
<St_PlantUML>. { /* plantuml text */
- g_token->verb+=yytext;
- }
-<St_Title>"\"" { // quoted title
- BEGIN(St_TitleQ);
- }
+ lineCount(yytext,yyleng);
+ g_token->verb+=yytext;
+ }
+<St_Title>"\"" { // quoted title
+ BEGIN(St_TitleQ);
+ }
<St_Title>[ \t]+ {
g_token->chars=yytext;
- return TK_WHITESPACE;
+ return TK_WHITESPACE;
}
-<St_Title>. { // non-quoted title
- unput(*yytext);
- BEGIN(St_TitleN);
+<St_Title>. { // non-quoted title
+ unput(*yytext);
+ BEGIN(St_TitleN);
}
-<St_Title>\n {
+<St_Title>\n {
unput(*yytext);
- return 0;
- }
+ return 0;
+ }
<St_Title>"\\ilinebr" {
- for (int i=yyleng-1;i>=0;i--) unput(yytext[i]);
- return 0;
+ unput_string(yytext,yyleng);
+ return 0;
}
<St_TitleN>"&"{ID}";" { /* symbol */
g_token->name = yytext;
- return TK_SYMBOL;
+ return TK_SYMBOL;
}
<St_TitleN>{HTMLTAG} {
- }
-<St_TitleN>(\n|"\\ilinebr") { /* new line => end of title */
- for (int i=yyleng-1;i>=0;i--) unput(yytext[i]);
- return 0;
+ lineCount(yytext,yyleng);
+ }
+<St_TitleN>\n { /* new line => end of title */
+ unput(*yytext);
+ return 0;
}
-<St_TitleN>{SPCMD1} |
-<St_TitleN>{SPCMD2} { /* special command */
+<St_TitleN>"\\ilinebr" { /* new line => end of title */
+ unput_string(yytext,yyleng);
+ return 0;
+ }
+<St_TitleN>{SPCMD1} |
+<St_TitleN>{SPCMD2} { /* special command */
g_token->name = yytext+1;
- g_token->paramDir=TokenInfo::Unspecified;
+ g_token->paramDir=TokenInfo::Unspecified;
return TK_COMMAND_SEL();
}
<St_TitleN>{ID}"=" { /* attribute */
if (yytext[0]=='%') // strip % if present
- g_token->name = &yytext[1];
- else
+ g_token->name = &yytext[1];
+ else
g_token->name = yytext;
- return TK_WORD;
+ return TK_WORD;
}
<St_TitleN>[\-+0-9] |
<St_TitleN>{WORD1} |
<St_TitleN>{WORD2} { /* word */
+ lineCount(yytext,yyleng);
if (yytext[0]=='%') // strip % if present
- g_token->name = &yytext[1];
- else
+ g_token->name = &yytext[1];
+ else
g_token->name = yytext;
- return TK_WORD;
+ return TK_WORD;
}
<St_TitleN>[ \t]+ {
g_token->chars=yytext;
- return TK_WHITESPACE;
+ return TK_WHITESPACE;
}
<St_TitleQ>"&"{ID}";" { /* symbol */
g_token->name = yytext;
- return TK_SYMBOL;
+ return TK_SYMBOL;
}
<St_TitleQ>(\n|"\\ilinebr") { /* new line => end of title */
- for (int i=yyleng-1;i>=0;i--) unput(yytext[i]);
- return 0;
+ unput_string(yytext,yyleng);
+ return 0;
}
-<St_TitleQ>{SPCMD1} |
-<St_TitleQ>{SPCMD2} { /* special command */
+<St_TitleQ>{SPCMD1} |
+<St_TitleQ>{SPCMD2} { /* special command */
g_token->name = yytext+1;
- g_token->paramDir=TokenInfo::Unspecified;
+ g_token->paramDir=TokenInfo::Unspecified;
return TK_COMMAND_SEL();
}
<St_TitleQ>{WORD1NQ} |
<St_TitleQ>{WORD2NQ} { /* word */
g_token->name = yytext;
- return TK_WORD;
+ return TK_WORD;
}
<St_TitleQ>[ \t]+ {
g_token->chars=yytext;
- return TK_WHITESPACE;
+ return TK_WHITESPACE;
}
-<St_TitleQ>"\"" { /* closing quote => end of title */
- BEGIN(St_TitleA);
- return 0;
+<St_TitleQ>"\"" { /* closing quote => end of title */
+ BEGIN(St_TitleA);
+ return 0;
}
<St_TitleA>{BLANK}*{ID}{BLANK}*"="{BLANK}* { // title attribute
- g_token->name = yytext;
- g_token->name = g_token->name.left(g_token->name.find('=')).stripWhiteSpace();
- BEGIN(St_TitleV);
- }
+ g_token->name = yytext;
+ g_token->name = g_token->name.left(g_token->name.find('=')).stripWhiteSpace();
+ BEGIN(St_TitleV);
+ }
<St_TitleV>[^ \t\r\n]+ { // attribute value
- g_token->chars = yytext;
- BEGIN(St_TitleN);
- return TK_WORD;
- }
+ lineCount(yytext,yyleng);
+ g_token->chars = yytext;
+ BEGIN(St_TitleN);
+ return TK_WORD;
+ }
<St_TitleV,St_TitleA>. {
- unput(*yytext);
- return 0;
+ unput(*yytext);
+ return 0;
}
<St_TitleV,St_TitleA>(\n|"\\ilinebr") {
- for (int i=yyleng-1;i>=0;i--) unput(yytext[i]);
- return 0;
+ unput_string(yytext,yyleng);
+ return 0;
}
<St_Anchor>{LABELID}{WS}? { // anchor
- g_token->name = QCString(yytext).stripWhiteSpace();
- return TK_WORD;
- }
-<St_Anchor>. {
- unput(*yytext);
- return 0;
- }
+ lineCount(yytext,yyleng);
+ g_token->name = QCString(yytext).stripWhiteSpace();
+ return TK_WORD;
+ }
+<St_Anchor>. {
+ unput(*yytext);
+ return 0;
+ }
<St_Cite>{CITEID} { // label to cite
if (yytext[0] =='"')
{
@@ -1068,59 +1119,60 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
{
g_token->name=yytext;
}
- return TK_WORD;
- }
+ return TK_WORD;
+ }
<St_Cite>{BLANK} { // white space
- unput(' ');
- return 0;
+ unput(' ');
+ return 0;
}
<St_Cite>(\n|"\\ilinebr") { // new line
- for (int i=yyleng-1;i>=0;i--) unput(yytext[i]);
- return 0;
- }
-<St_Cite>. { // any other character
+ unput_string(yytext,yyleng);
+ return 0;
+ }
+<St_Cite>. { // any other character
unput(*yytext);
- return 0;
- }
+ return 0;
+ }
<St_Ref>{REFWORD_NOCV}/{BLANK}("const")[a-z_A-Z0-9] { // see bug776988
- g_token->name=yytext;
- return TK_WORD;
+ g_token->name=yytext;
+ return TK_WORD;
}
<St_Ref>{REFWORD_NOCV}/{BLANK}("volatile")[a-z_A-Z0-9] { // see bug776988
- g_token->name=yytext;
- return TK_WORD;
+ g_token->name=yytext;
+ return TK_WORD;
}
<St_Ref>{REFWORD} { // label to refer to
- g_token->name=yytext;
- return TK_WORD;
- }
+ g_token->name=yytext;
+ return TK_WORD;
+ }
<St_Ref>{BLANK} { // white space
- unput(' ');
- return 0;
+ unput(' ');
+ return 0;
}
<St_Ref>{WS}+"\""{WS}* { // white space following by quoted string
- BEGIN(St_Ref2);
+ lineCount(yytext,yyleng);
+ BEGIN(St_Ref2);
}
<St_Ref>(\n|"\\ilinebr") { // new line
- for (int i=yyleng-1;i>=0;i--) unput(yytext[i]);
- return 0;
- }
-<St_Ref>. { // any other character
+ unput_string(yytext,yyleng);
+ return 0;
+ }
+<St_Ref>. { // any other character
unput(*yytext);
- return 0;
- }
+ return 0;
+ }
<St_IntRef>[A-Z_a-z0-9.:/#\-\+\(\)]+ {
g_token->name = yytext;
- return TK_WORD;
- }
+ return TK_WORD;
+ }
<St_IntRef>{BLANK}+"\"" {
BEGIN(St_Ref2);
}
<St_SetScope>({SCOPEMASK}|{ANONNS}){BLANK}|{FILEMASK} {
g_token->name = yytext;
g_token->name = g_token->name.stripWhiteSpace();
- return TK_WORD;
- }
+ return TK_WORD;
+ }
<St_SetScope>{SCOPEMASK}"<" {
g_token->name = yytext;
g_token->name = g_token->name.stripWhiteSpace();
@@ -1146,26 +1198,27 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
}
<St_Ref2>"&"{ID}";" { /* symbol */
g_token->name = yytext;
- return TK_SYMBOL;
+ return TK_SYMBOL;
}
<St_Ref2>"\""|\n|"\\ilinebr" { /* " or \n => end of title */
- return 0;
+ lineCount(yytext,yyleng);
+ return 0;
}
-<St_Ref2>{SPCMD1} |
-<St_Ref2>{SPCMD2} { /* special command */
+<St_Ref2>{SPCMD1} |
+<St_Ref2>{SPCMD2} { /* special command */
g_token->name = yytext+1;
- g_token->paramDir=TokenInfo::Unspecified;
+ g_token->paramDir=TokenInfo::Unspecified;
return TK_COMMAND_SEL();
}
<St_Ref2>{WORD1NQ} |
<St_Ref2>{WORD2NQ} {
/* word */
g_token->name = yytext;
- return TK_WORD;
+ return TK_WORD;
}
<St_Ref2>[ \t]+ {
g_token->chars=yytext;
- return TK_WHITESPACE;
+ return TK_WHITESPACE;
}
<St_XRefItem>{LABELID} {
g_token->name=yytext;
@@ -1174,39 +1227,41 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
BEGIN(St_XRefItem2);
}
<St_XRefItem2>[0-9]+"." {
- QCString numStr=yytext;
- numStr=numStr.left((int)yyleng-1);
- g_token->id=numStr.toInt();
- return RetVal_OK;
- }
+ QCString numStr=yytext;
+ numStr=numStr.left((int)yyleng-1);
+ g_token->id=numStr.toInt();
+ return RetVal_OK;
+ }
<St_Para,St_Title,St_Ref2>"<!--" { /* html style comment block */
g_commentState = YY_START;
- BEGIN(St_Comment);
+ BEGIN(St_Comment);
}
<St_Param>"\""[^\n\"]+"\"" {
- g_token->name = yytext+1;
- g_token->name = g_token->name.left((int)yyleng-2);
- return TK_WORD;
+ g_token->name = yytext+1;
+ g_token->name = g_token->name.left((int)yyleng-2);
+ return TK_WORD;
}
<St_Param>({PHPTYPE}{BLANK}*("["{BLANK}*"]")*{BLANK}*"|"{BLANK}*)*{PHPTYPE}{BLANK}*("["{BLANK}*"]")*{WS}+("&")?"$"{LABELID} {
- QCString params = yytext;
- int j = params.find('&');
- int i = params.find('$');
- if (j<i && j!=-1) i=j;
- QCString types = params.left(i).stripWhiteSpace();
- g_token->name = types+"#"+params.mid(i);
- return TK_WORD;
- }
+ lineCount(yytext,yyleng);
+ QCString params = yytext;
+ int j = params.find('&');
+ int i = params.find('$');
+ if (j<i && j!=-1) i=j;
+ QCString types = params.left(i).stripWhiteSpace();
+ g_token->name = types+"#"+params.mid(i);
+ return TK_WORD;
+ }
<St_Param>[^ \t\n,@\\]+ {
- g_token->name = yytext;
+ g_token->name = yytext;
if (g_token->name.at(static_cast<uint>(yyleng)-1)==':')
{
g_token->name=g_token->name.left(static_cast<uint>(yyleng)-1);
}
- return TK_WORD;
+ return TK_WORD;
}
<St_Param>{WS}*","{WS}* /* param separator */
-<St_Param>{WS} {
+<St_Param>{WS} {
+ lineCount(yytext,yyleng);
g_token->chars=yytext;
return TK_WHITESPACE;
}
@@ -1215,6 +1270,7 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
}
<St_Options>{WS}*","{WS}*
<St_Options>{WS} { /* option separator */
+ lineCount(yytext,yyleng);
g_token->name+=",";
}
<St_Options>"}" {
@@ -1234,25 +1290,35 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
return 0;
}
<St_File>{FILEMASK} {
- g_token->name = yytext;
- return TK_WORD;
- }
-<St_File>"\""[^\n\"]+"\"" {
- QCString text=yytext;
- g_token->name = text.mid(1,text.length()-2);
- return TK_WORD;
- }
-<St_Pattern>[^\r\n]+ {
g_token->name = yytext;
+ return TK_WORD;
+ }
+<St_File>"\""[^\n\"]+"\"" {
+ QCString text=yytext;
+ g_token->name = text.mid(1,text.length()-2);
+ return TK_WORD;
+ }
+<St_Pattern>[^\\\r\n]+ {
+ g_token->name += yytext;
+ }
+<St_Pattern>"\\ilinebr" {
g_token->name = g_token->name.stripWhiteSpace();
- return TK_WORD;
- }
+ return TK_WORD;
+ }
+<St_Pattern>\n {
+ lineCount(yytext,yyleng);
+ g_token->name = g_token->name.stripWhiteSpace();
+ return TK_WORD;
+ }
+<St_Pattern>. {
+ g_token->name += yytext;
+ }
<St_Link>{LINKMASK}|{REFWORD} {
g_token->name = yytext;
- return TK_WORD;
+ return TK_WORD;
}
<St_Comment>"-->" { /* end of html comment */
- BEGIN(g_commentState);
+ BEGIN(g_commentState);
}
<St_Comment>[^-]+ /* inside html comment */
<St_Comment>. /* inside html comment */
@@ -1260,13 +1326,17 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
/* State for skipping title (all chars until the end of the line) */
<St_SkipTitle>.
-<St_SkipTitle>(\n|"\\ilinebr") { return 0; }
+<St_SkipTitle>(\n|"\\ilinebr") {
+ lineCount(yytext,yyleng);
+ return 0;
+ }
- /* State for the pass used to find the anchors and sections */
+ /* State for the pass used to find the anchors and sections */
<St_Sections>[^\n@\\<]+
<St_Sections>{CMD}("<"|{CMD})
<St_Sections>"<"{CAPTION}({WS}+{ATTRIB})*">" {
+ lineCount(yytext,yyleng);
QCString tag=yytext;
int s=tag.find("id=");
if (s!=-1) // command has id attribute
@@ -1284,142 +1354,146 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
}
}
}
-<St_Sections>{CMD}"anchor"{BLANK}+ {
- g_secType = SectionType::Anchor;
- BEGIN(St_SecLabel1);
+<St_Sections>{CMD}"anchor"{BLANK}+ {
+ g_secType = SectionType::Anchor;
+ BEGIN(St_SecLabel1);
}
-<St_Sections>{CMD}"section"{BLANK}+ {
- g_secType = SectionType::Section;
- BEGIN(St_SecLabel2);
+<St_Sections>{CMD}"section"{BLANK}+ {
+ g_secType = SectionType::Section;
+ BEGIN(St_SecLabel2);
}
-<St_Sections>{CMD}"subsection"{BLANK}+ {
- g_secType = SectionType::Subsection;
- BEGIN(St_SecLabel2);
+<St_Sections>{CMD}"subsection"{BLANK}+ {
+ g_secType = SectionType::Subsection;
+ BEGIN(St_SecLabel2);
}
-<St_Sections>{CMD}"subsubsection"{BLANK}+ {
- g_secType = SectionType::Subsubsection;
- BEGIN(St_SecLabel2);
+<St_Sections>{CMD}"subsubsection"{BLANK}+ {
+ g_secType = SectionType::Subsubsection;
+ BEGIN(St_SecLabel2);
}
-<St_Sections>{CMD}"paragraph"{BLANK}+ {
- g_secType = SectionType::Paragraph;
- BEGIN(St_SecLabel2);
+<St_Sections>{CMD}"paragraph"{BLANK}+ {
+ g_secType = SectionType::Paragraph;
+ BEGIN(St_SecLabel2);
}
<St_Sections>{CMD}"verbatim"/[^a-z_A-Z0-9] {
g_endMarker="endverbatim";
- BEGIN(St_SecSkip);
- }
+ BEGIN(St_SecSkip);
+ }
<St_Sections>{CMD}"dot"/[^a-z_A-Z0-9] {
g_endMarker="enddot";
- BEGIN(St_SecSkip);
- }
+ BEGIN(St_SecSkip);
+ }
<St_Sections>{CMD}"msc"/[^a-z_A-Z0-9] {
g_endMarker="endmsc";
- BEGIN(St_SecSkip);
- }
+ BEGIN(St_SecSkip);
+ }
<St_Sections>{CMD}"startuml"/[^a-z_A-Z0-9] {
g_endMarker="enduml";
- BEGIN(St_SecSkip);
- }
+ BEGIN(St_SecSkip);
+ }
<St_Sections>{CMD}"htmlonly"/[^a-z_A-Z0-9] {
g_endMarker="endhtmlonly";
- BEGIN(St_SecSkip);
+ BEGIN(St_SecSkip);
}
<St_Sections>{CMD}"latexonly"/[^a-z_A-Z0-9] {
g_endMarker="endlatexonly";
- BEGIN(St_SecSkip);
+ BEGIN(St_SecSkip);
}
<St_Sections>{CMD}"manonly"/[^a-z_A-Z0-9] {
g_endMarker="endmanonly";
- BEGIN(St_SecSkip);
+ BEGIN(St_SecSkip);
}
<St_Sections>{CMD}"rtfonly"/[^a-z_A-Z0-9] {
g_endMarker="endrtfonly";
- BEGIN(St_SecSkip);
+ BEGIN(St_SecSkip);
}
<St_Sections>{CMD}"xmlonly"/[^a-z_A-Z0-9] {
g_endMarker="endxmlonly";
- BEGIN(St_SecSkip);
+ BEGIN(St_SecSkip);
}
<St_Sections>{CMD}"docbookonly"/[^a-z_A-Z0-9] {
g_endMarker="enddocbookonly";
- BEGIN(St_SecSkip);
+ BEGIN(St_SecSkip);
}
<St_Sections>{CMD}"code"/[^a-z_A-Z0-9] {
g_endMarker="endcode";
- BEGIN(St_SecSkip);
- }
+ BEGIN(St_SecSkip);
+ }
<St_Sections>"<!--" {
g_endMarker="-->";
- BEGIN(St_SecSkip);
+ BEGIN(St_SecSkip);
}
-<St_SecSkip>{CMD}{ID} {
+<St_SecSkip>{CMD}{ID} {
if (qstrcmp(yytext+1,g_endMarker)==0)
- {
- BEGIN(St_Sections);
- }
+ {
+ BEGIN(St_Sections);
+ }
}
-<St_SecSkip>"-->" {
+<St_SecSkip>"-->" {
if (qstrcmp(yytext,g_endMarker)==0)
- {
- BEGIN(St_Sections);
- }
+ {
+ BEGIN(St_Sections);
+ }
}
<St_SecSkip>[^a-z_A-Z0-9\-\\\@]+
<St_SecSkip>.
<St_SecSkip>(\n|"\\ilinebr")
<St_Sections>.
<St_Sections>(\n|"\\ilinebr")
-<St_SecLabel1>{LABELID} {
+<St_SecLabel1>{LABELID} {
+ lineCount(yytext,yyleng);
g_secLabel = yytext;
processSection();
BEGIN(St_Sections);
}
-<St_SecLabel2>{LABELID}{BLANK}+ |
-<St_SecLabel2>{LABELID} {
+<St_SecLabel2>{LABELID}{BLANK}+ |
+<St_SecLabel2>{LABELID} {
g_secLabel = yytext;
- g_secLabel = g_secLabel.stripWhiteSpace();
+ g_secLabel = g_secLabel.stripWhiteSpace();
BEGIN(St_SecTitle);
}
<St_SecTitle>[^\n]+ |
<St_SecTitle>[^\n]*\n {
+ lineCount(yytext,yyleng);
g_secTitle = yytext;
- g_secTitle = g_secTitle.stripWhiteSpace();
+ g_secTitle = g_secTitle.stripWhiteSpace();
if (g_secTitle.right(8)=="\\ilinebr")
{
g_secTitle.left(g_secTitle.length()-8);
}
processSection();
BEGIN(St_Sections);
- }
+ }
<St_SecTitle,St_SecLabel1,St_SecLabel2>. {
- warn(g_fileName,yylineno,"Unexpected character '%s' while looking for section label or title",yytext);
+ warn(g_fileName,g_yyLineNr,"Unexpected character '%s' while looking for section label or title",yytext);
}
<St_Snippet>[^\\\n]+ {
- g_token->name += yytext;
+ g_token->name += yytext;
}
<St_Snippet>"\\" {
- g_token->name += yytext;
+ g_token->name += yytext;
}
<St_Snippet>(\n|"\\ilinebr") {
- g_token->name = g_token->name.stripWhiteSpace();
- return TK_WORD;
- }
-
- /* Generic rules that work for all states */
-<*>\n {
- warn(g_fileName,yylineno,"Unexpected new line character");
- }
+ lineCount(yytext,yyleng);
+ g_token->name = g_token->name.stripWhiteSpace();
+ return TK_WORD;
+ }
+
+ /* Generic rules that work for all states */
+<*>\n {
+ lineCount(yytext,yyleng);
+ warn(g_fileName,g_yyLineNr,"Unexpected new line character");
+ }
<*>"\\ilinebr" {
}
<*>[\\@<>&$#%~"=] { /* unescaped special character */
- //warn(g_fileName,yylineno,"Unexpected character '%s', assuming command \\%s was meant.",yytext,yytext);
- g_token->name = yytext;
- return TK_COMMAND_SEL();
+ //warn(g_fileName,g_yyLineNr,"Unexpected character '%s', assuming command \\%s was meant.",yytext,yytext);
+ g_token->name = yytext;
+ return TK_COMMAND_SEL();
+ }
+<*>. {
+ warn(g_fileName,g_yyLineNr,"Unexpected character '%s'",yytext);
}
-<*>. {
- warn(g_fileName,yylineno,"Unexpected character '%s'",yytext);
- }
%%
//--------------------------------------------------------------------------
@@ -1435,7 +1509,7 @@ void doctokenizerYYFindSections(const char *input,const Definition *d,
g_definition = d;
g_fileName = fileName;
BEGIN(St_Sections);
- doctokenizerYYlineno = 1;
+ g_yyLineNr = 1;
doctokenizerYYlex();
printlex(yy_flex_debug, FALSE, __FILE__, fileName);
}
@@ -1565,6 +1639,7 @@ void doctokenizerYYsetStateFile()
void doctokenizerYYsetStatePattern()
{
+ g_token->name = "";
BEGIN(St_Pattern);
}
@@ -1672,6 +1747,17 @@ void doctokenizerYYendAutoList()
// return retval;
//}
+void setDoctokinizerLineNr(int lineno)
+{
+ g_yyLineNr = lineno;
+}
+
+int getDoctokinizerLineNr(void)
+{
+ return g_yyLineNr;
+}
+
+
#if USE_STATE2STRING
#include "doctokenizer.l.h"
#endif