1 /*****************************************************************************
5 * Copyright (C) 1997-2015 by Dimitri van Heesch.
7 * Permission to use, copy, modify, and distribute this software and its
8 * documentation under the terms of the GNU General Public License is hereby
9 * granted. No representations are made about the suitability of this software
10 * for any purpose. It is provided "as is" without express or implied warranty.
11 * See the GNU General Public License for more details.
13 * Documents produced by Doxygen are derivative works derived from the
14 * input used in their production; they are not affected by this license.
17 %option never-interactive
18 %option prefix="commentcnvYY"
28 #include <qtextstream.h>
37 #include "condparser.h"
42 #define YY_NO_UNISTD_H 1
44 #define ADDCHAR(c) g_outBuf->addChar(c)
45 #define ADDARRAY(a,s) g_outBuf->addArray(a,s)
49 CondCtx(int line,QCString id,bool b)
50 : lineNr(line),sectionId(id), skip(b) {}
63 static BufStr * g_inBuf;
64 static BufStr * g_outBuf;
65 static int g_inBufPos;
67 static int g_blockHeadCol;
68 static bool g_mlBrief;
69 static int g_readLineCtx;
71 static QCString g_fileName;
74 static QStack<CondCtx> g_condStack;
75 static QStack<CommentCtx> g_commentStack;
76 static QCString g_blockName;
77 static int g_lastCommentContext;
78 static bool g_inSpecialComment;
79 static bool g_inRoseComment;
80 static int g_stringContext;
81 static int g_charContext;
82 static int g_javaBlock;
83 static bool g_specialComment;
85 static QCString g_aliasString;
86 static int g_blockCount;
87 static bool g_lastEscaped;
88 static int g_lastBlockContext;
89 static bool g_pythonDocString;
90 static int g_nestingCount;
92 static bool g_vhdl; // for VHDL old style --! comment
94 static SrcLangExt g_lang;
95 static bool isFixedForm; // For Fortran
97 static void replaceCommentMarker(const char *s,int len)
101 // copy leading blanks
102 while ((c=*p) && (c==' ' || c=='\t' || c=='\n'))
108 // replace start of comment marker by blanks and the last character by a *
110 while ((c=*p) && (c=='/' || c=='!' || c=='#'))
114 if (*p=='<') // comment-after-item marker
119 if (c=='!') // end after first !
131 if (blanks>1) ADDCHAR('*');
134 // copy comment line to output
135 ADDARRAY(p,len-(int)(p-s));
138 static inline int computeIndent(const char *s)
141 static int tabSize=Config_getInt(TAB_SIZE);
147 else if (c=='\t') col+=tabSize-(col%tabSize);
153 static inline void copyToOutput(const char *s,int len)
156 if (g_skip) // only add newlines.
163 //fprintf(stderr,"---> skip %d\n",g_lineNr);
171 static int tabSize=Config_getInt(TAB_SIZE);
177 //fprintf(stderr,"---> copy %d\n",g_lineNr);
179 case '\t': g_col+=tabSize-(g_col%tabSize); break;
180 default: g_col++; break;
186 static void startCondSection(const char *sectId)
188 //printf("startCondSection: skip=%d stack=%d\n",g_skip,g_condStack.count());
190 bool expResult = prs.parse(g_fileName,g_lineNr,sectId);
191 g_condStack.push(new CondCtx(g_lineNr,sectId,g_skip));
192 if (!expResult) // not enabled
198 static void endCondSection()
200 if (g_condStack.isEmpty())
202 warn(g_fileName,g_lineNr,"Found \\endcond command without matching \\cond");
207 CondCtx *ctx = g_condStack.pop();
210 //printf("endCondSection: skip=%d stack=%d\n",g_skip,g_condStack.count());
213 /** copies string \a s with length \a len to the output, while
214 * replacing any alias commands found in the string.
216 static void replaceAliases(const char *s)
218 QCString result = resolveAliasCmd(s);
219 //printf("replaceAliases(%s)->'%s'\n",s,result.data());
220 copyToOutput(result,result.length());
225 #define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
227 static int yyread(char *buf,int max_size)
229 int bytesInBuf = g_inBuf->curPos()-g_inBufPos;
230 int bytesToCopy = QMIN(max_size,bytesInBuf);
231 memcpy(buf,g_inBuf->data()+g_inBufPos,bytesToCopy);
232 g_inBufPos+=bytesToCopy;
236 void replaceComment(int offset);
255 <Scan>[^"'!\/\n\\#,\-]* { /* eat anything that is not " / , or \n */
256 copyToOutput(yytext,(int)yyleng);
258 <Scan>[,] { /* eat , so we have a nice separator in long initialization lines */
259 copyToOutput(yytext,(int)yyleng);
261 <Scan>"\"\"\""! { /* start of python long comment */
262 if (g_lang!=SrcLangExt_Python)
268 g_pythonDocString = TRUE;
270 g_commentStack.clear(); /* to be on the save side */
271 copyToOutput(yytext,(int)yyleng);
273 g_commentStack.push(new CommentCtx(g_lineNr));
277 if (g_lang!=SrcLangExt_Fortran)
283 copyToOutput(yytext,(int)yyleng);
284 g_nestingCount=0; // Fortran doesn't have an end comment
285 g_commentStack.clear(); /* to be on the save side */
287 g_commentStack.push(new CommentCtx(g_lineNr));
290 <Scan>[Cc\*][><!]/.*\n {
291 if (g_lang!=SrcLangExt_Fortran)
297 /* check for fixed format; we might have some conditional as part of multiline if like C<5 .and. & */
298 if (isFixedForm && (g_col == 0))
300 copyToOutput(yytext,(int)yyleng);
301 g_nestingCount=0; // Fortran doesn't have an end comment
302 g_commentStack.clear(); /* to be on the safe side */
304 g_commentStack.push(new CommentCtx(g_lineNr));
313 if (g_lang!=SrcLangExt_Fortran)
319 copyToOutput(yytext,(int)yyleng);
323 if (g_lang!=SrcLangExt_Fortran)
331 copyToOutput(yytext,(int)yyleng);
339 <Scan>"\"" { /* start of a string */
340 copyToOutput(yytext,(int)yyleng);
341 g_stringContext = YY_START;
345 copyToOutput(yytext,(int)yyleng);
346 g_charContext = YY_START;
347 if (g_lang!=SrcLangExt_VHDL)
352 <Scan>\n { /* new line */
353 copyToOutput(yytext,(int)yyleng);
355 <Scan>"//!"/.*\n[ \t]*"//"[\/!][^\/] | /* start C++ style special comment block */
356 <Scan>("///"[/]*)/[^/].*\n[ \t]*"//"[\/!][^\/] { /* start C++ style special comment block */
359 REJECT; // bail out if we do not need to convert
366 while (i<(int)yyleng && yytext[i]=='/') i++;
368 g_blockHeadCol=g_col;
369 copyToOutput("/**",3);
370 replaceAliases(yytext+i);
371 g_inSpecialComment=TRUE;
373 g_readLineCtx=SComment;
377 <Scan>"//##Documentation".*/\n { /* Start of Rational Rose ANSI C++ comment block */
378 if (g_mlBrief) REJECT;
379 int i=17; //=strlen("//##Documentation");
380 g_blockHeadCol=g_col;
381 copyToOutput("/**",3);
382 replaceAliases(yytext+i);
383 g_inRoseComment=TRUE;
386 <Scan>"//"[!\/]/.*\n[ \t]*"//"[|\/][ \t]*[@\\]"}" { // next line contains an end marker, see bug 752712
387 g_inSpecialComment=yytext[2]=='/' || yytext[2]=='!';
388 copyToOutput(yytext,(int)yyleng);
389 g_readLineCtx=YY_START;
392 <Scan>"//"/.*\n { /* one line C++ comment */
393 g_inSpecialComment=yytext[2]=='/' || yytext[2]=='!';
394 copyToOutput(yytext,(int)yyleng);
395 g_readLineCtx=YY_START;
398 <Scan>"/**/" { /* avoid matching next rule for empty C comment, see bug 711723 */
399 copyToOutput(yytext,(int)yyleng);
401 <Scan>"/*"[*!]? { /* start of a C comment */
402 if ((g_lang==SrcLangExt_Python) || (g_lang==SrcLangExt_Tcl))
406 g_specialComment=(int)yyleng==3;
408 g_commentStack.clear(); /* to be on the save side */
409 copyToOutput(yytext,(int)yyleng);
411 g_commentStack.push(new CommentCtx(g_lineNr));
414 if (g_lang!=SrcLangExt_Python)
420 copyToOutput(yytext,(int)yyleng);
421 g_nestingCount=0; // Python doesn't have an end comment for #
422 g_commentStack.clear(); /* to be on the save side */
424 g_commentStack.push(new CommentCtx(g_lineNr));
428 if (g_lang!=SrcLangExt_VHDL)
435 copyToOutput(yytext,(int)yyleng);
436 g_nestingCount=0; // VHDL doesn't have an end comment
437 g_commentStack.clear(); /* to be on the save side */
439 g_commentStack.push(new CommentCtx(g_lineNr));
443 if (g_lang!=SrcLangExt_Fortran)
449 copyToOutput(yytext,(int)yyleng);
450 g_nestingCount=0; // Fortran doesn't have an end comment
451 g_commentStack.clear(); /* to be on the save side */
453 g_commentStack.push(new CommentCtx(g_lineNr));
456 <CComment>"{@code"/[ \t\n] {
457 copyToOutput("@code",5);
458 g_lastCommentContext = YY_START;
460 g_blockName=&yytext[1];
463 <CComment,ReadLine>[\\@]("dot"|"code"|"msc"|"startuml")/[^a-z_A-Z0-9] { /* start of a verbatim block */
464 copyToOutput(yytext,(int)yyleng);
465 g_lastCommentContext = YY_START;
467 if (qstrcmp(&yytext[1],"startuml")==0)
473 g_blockName=&yytext[1];
477 <CComment,ReadLine>[\\@]("f$"|"f["|"f{") {
478 copyToOutput(yytext,(int)yyleng);
479 g_blockName=&yytext[1];
480 if (g_blockName.at(1)=='[')
482 g_blockName.at(1)=']';
484 else if (g_blockName.at(1)=='{')
486 g_blockName.at(1)='}';
488 g_lastCommentContext = YY_START;
491 <CComment,ReadLine>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"docbookonly"|"rtfonly"|"manonly")/[^a-z_A-Z0-9] { /* start of a verbatim block */
492 copyToOutput(yytext,(int)yyleng);
493 g_blockName=&yytext[1];
494 g_lastCommentContext = YY_START;
497 <Scan>. { /* any ather character */
498 copyToOutput(yytext,(int)yyleng);
500 <Verbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddocbookonly"|"endrtfonly"|"endmanonly"|"f$"|"f]"|"f}") { /* end of verbatim block */
501 copyToOutput(yytext,(int)yyleng);
502 if (&yytext[1]==g_blockName) // end of formula
504 BEGIN(g_lastCommentContext);
506 else if (&yytext[4]==g_blockName)
508 BEGIN(g_lastCommentContext);
519 copyToOutput(yytext,(int)yyleng);
532 copyToOutput(" @endcode ",10);
533 BEGIN(g_lastCommentContext);
537 copyToOutput(yytext,(int)yyleng);
541 <VerbatimCode>[\\@]("enddot"|"endcode"|"endmsc"|"enduml") { /* end of verbatim block */
542 copyToOutput(yytext,(int)yyleng);
543 if (&yytext[4]==g_blockName)
545 BEGIN(g_lastCommentContext);
548 <VerbatimCode>^[ \t]*"//"[\!\/]? { /* skip leading comments */
549 if (!g_inSpecialComment)
551 copyToOutput(yytext,(int)yyleng);
556 while (yytext[l]==' ' || yytext[l]=='\t')
560 copyToOutput(yytext,l);
561 if (yyleng-l==3) // ends with //! or ///
563 copyToOutput(" * ",3);
567 copyToOutput("//",2);
571 <Verbatim,VerbatimCode>[^@\/\\\n{}]* { /* any character not a backslash or new line or } */
572 copyToOutput(yytext,(int)yyleng);
574 <Verbatim,VerbatimCode>\n { /* new line in verbatim block */
575 copyToOutput(yytext,(int)yyleng);
577 <Verbatim>^[ \t]*"///" {
578 if (g_blockName=="dot" || g_blockName=="msc" || g_blockName=="uml" || g_blockName.at(0)=='f')
580 // see bug 487871, strip /// from dot images and formulas.
582 while (yytext[l]==' ' || yytext[l]=='\t')
586 copyToOutput(yytext,l);
589 else // even slashes are verbatim (e.g. \verbatim, \code)
594 <Verbatim,VerbatimCode>. { /* any other character */
595 copyToOutput(yytext,(int)yyleng);
597 <SkipString>\\. { /* escaped character in string */
598 if (g_lang==SrcLangExt_Fortran)
601 copyToOutput(yytext,1);
605 copyToOutput(yytext,(int)yyleng);
608 <SkipString>"\"" { /* end of string */
609 copyToOutput(yytext,(int)yyleng);
610 BEGIN(g_stringContext);
612 <SkipString>. { /* any other string character */
613 copyToOutput(yytext,(int)yyleng);
615 <SkipString>\n { /* new line inside string (illegal for some compilers) */
616 copyToOutput(yytext,(int)yyleng);
618 <SkipChar>\\. { /* escaped character */
619 if (g_lang==SrcLangExt_Fortran)
622 copyToOutput(yytext,1);
626 copyToOutput(yytext,(int)yyleng);
629 <SkipChar>' { /* end of character literal */
630 copyToOutput(yytext,(int)yyleng);
631 BEGIN(g_charContext);
633 <SkipChar>. { /* any other string character */
634 copyToOutput(yytext,(int)yyleng);
636 <SkipChar>\n { /* new line character */
637 copyToOutput(yytext,(int)yyleng);
640 <CComment>[^\\!@*\n{\"\/]* { /* anything that is not a '*' or command */
641 copyToOutput(yytext,(int)yyleng);
643 <CComment>"*"+[^*/\\@\n{\"]* { /* stars without slashes */
644 copyToOutput(yytext,(int)yyleng);
646 <CComment>"\"\"\"" { /* end of Python docstring */
647 if (g_lang!=SrcLangExt_Python)
654 g_pythonDocString = FALSE;
655 copyToOutput(yytext,(int)yyleng);
659 <CComment>\n { /* new line in comment */
660 copyToOutput(yytext,(int)yyleng);
661 /* in case of Fortran always end of comment */
662 if (g_lang==SrcLangExt_Fortran)
667 <CComment>"/"+"*" { /* nested C comment */
668 if ((g_lang==SrcLangExt_Python) || (g_lang==SrcLangExt_Tcl))
673 g_commentStack.push(new CommentCtx(g_lineNr));
674 copyToOutput(yytext,(int)yyleng);
676 <CComment>"*"+"/" { /* end of C comment */
677 if ((g_lang==SrcLangExt_Python) || (g_lang==SrcLangExt_Tcl))
683 copyToOutput(yytext,(int)yyleng);
685 if (g_nestingCount<=0)
692 delete g_commentStack.pop();
696 /* Python an VHDL share CComment, so special attention for ending comments is required */
697 <CComment>"\n"/[ \t]*"#" {
698 if (g_lang!=SrcLangExt_VHDL)
704 if (g_vhdl) // inside --! comment
707 copyToOutput(yytext,(int)yyleng);
710 else // C-type comment
716 <CComment>"\n"/[ \t]*"-" {
717 if (g_lang!=SrcLangExt_Python || g_pythonDocString)
723 copyToOutput(yytext,(int)yyleng);
727 <CComment>"\n"/[ \t]*[^ \t#\-] {
728 if (g_lang==SrcLangExt_Python)
730 if (g_pythonDocString)
736 copyToOutput(yytext,(int)yyleng);
740 else if (g_lang==SrcLangExt_VHDL)
742 if (g_vhdl) // inside --! comment
745 copyToOutput(yytext,(int)yyleng);
748 else // C-type comment
758 /* removed for bug 674842 (bug was introduced in rev 768)
760 g_charContext = YY_START;
761 copyToOutput(yytext,(int)yyleng);
765 g_stringContext = YY_START;
766 copyToOutput(yytext,(int)yyleng);
771 copyToOutput(yytext,(int)yyleng);
773 <SComment>^[ \t]*"///"[\/]*/\n {
776 <SComment>\n[ \t]*"///"[\/]*/\n {
779 <SComment>^[ \t]*"///"[^\/\n]/.*\n {
781 g_readLineCtx=YY_START;
784 <SComment>\n[ \t]*"//"[\/!]("<")?[ \t]*[\\@]"}".*\n {
785 /* See Bug 752712: end the multiline comment when finding a @} or \} command */
786 copyToOutput(" */",3);
787 copyToOutput(yytext,(int)yyleng);
788 g_inSpecialComment=FALSE;
789 g_inRoseComment=FALSE;
792 <SComment>\n[ \t]*"///"[^\/\n]/.*\n {
794 g_readLineCtx=YY_START;
797 <SComment>^[ \t]*"//!" | // just //!
798 <SComment>^[ \t]*"//!<"/.*\n | // or //!< something
799 <SComment>^[ \t]*"//!"[^<]/.*\n { // or //!something
801 g_readLineCtx=YY_START;
804 <SComment>\n[ \t]*"//!" |
805 <SComment>\n[ \t]*"//!<"/.*\n |
806 <SComment>\n[ \t]*"//!"[^<\n]/.*\n {
808 g_readLineCtx=YY_START;
811 <SComment>^[ \t]*"//##"/.*\n {
812 if (!g_inRoseComment)
819 g_readLineCtx=YY_START;
823 <SComment>\n[ \t]*"//##"/.*\n {
824 if (!g_inRoseComment)
831 g_readLineCtx=YY_START;
835 <SComment>\n { /* end of special comment */
836 copyToOutput(" */",3);
837 copyToOutput(yytext,(int)yyleng);
838 g_inSpecialComment=FALSE;
839 g_inRoseComment=FALSE;
843 copyToOutput("*‍/",7);
846 copyToOutput(yytext,(int)yyleng);
848 <ReadLine>[^\\@\n\*]* {
849 copyToOutput(yytext,(int)yyleng);
851 <ReadLine>[^\\@\n\*]*/\n {
852 copyToOutput(yytext,(int)yyleng);
853 BEGIN(g_readLineCtx);
855 <CComment,ReadLine>[\\@][\\@][~a-z_A-Z][a-z_A-Z0-9]*[ \t]* { // escaped command
856 copyToOutput(yytext,(int)yyleng);
858 <CComment,ReadLine>[\\@]"cond"/[^a-z_A-Z0-9] { // conditional section
859 g_condCtx = YY_START;
862 <CComment,ReadLine>[\\@]"endcond"/[^a-z_A-Z0-9] { // end of conditional section
865 if (YY_START==CComment && oldSkip && !g_skip)
867 //printf("** Adding start of comment!\n");
868 if (g_lang!=SrcLangExt_Python &&
869 g_lang!=SrcLangExt_VHDL &&
870 g_lang!=SrcLangExt_Markdown &&
871 g_lang!=SrcLangExt_Fortran)
875 if (g_specialComment)
882 <CondLine>[!()&| \ta-z_A-Z0-9.\-]+ {
884 startCondSection(yytext);
885 if ((g_condCtx==CComment || g_readLineCtx==SComment) &&
888 if (g_lang!=SrcLangExt_Python &&
889 g_lang!=SrcLangExt_VHDL &&
890 g_lang!=SrcLangExt_Markdown &&
891 g_lang!=SrcLangExt_Fortran)
897 if (g_readLineCtx==SComment)
907 <CComment,ReadLine>[\\@]"cond"[ \t\r]*/\n |
908 <CondLine>. { // forgot section id?
909 if (YY_START!=CondLine) g_condCtx=YY_START;
911 startCondSection(" "); // fake section id causing the section to be hidden unconditionally
912 if ((g_condCtx==CComment || g_readLineCtx==SComment) &&
915 //printf("** Adding terminator for comment!\n");
916 if (g_lang!=SrcLangExt_Python &&
917 g_lang!=SrcLangExt_VHDL)
923 if (*yytext=='\n') g_lineNr++;
924 if (g_readLineCtx==SComment)
933 <CComment,ReadLine>[\\@][a-z_A-Z][a-z_A-Z0-9]* { // expand alias without arguments
934 replaceAliases(yytext);
936 <CComment,ReadLine>[\\@][a-z_A-Z][a-z_A-Z0-9]*"{" { // expand alias with arguments
937 g_lastBlockContext=YY_START;
939 g_aliasString=yytext;
941 BEGIN( ReadAliasArgs );
943 <ReadAliasArgs>^[ \t]*"//"[/!]/[^\n]+ { // skip leading special comments (see bug 618079)
945 <ReadAliasArgs>"*/" { // oops, end of comment in the middle of an alias?
946 if (g_lang==SrcLangExt_Python)
950 else // abort the alias, restart scanning
952 copyToOutput(g_aliasString,g_aliasString.length());
953 copyToOutput(yytext,(int)yyleng);
957 <ReadAliasArgs>[^{}\n\\\*]+ {
958 g_aliasString+=yytext;
961 <ReadAliasArgs>"\\" {
962 if (g_lastEscaped) g_lastEscaped=FALSE;
963 else g_lastEscaped=TRUE;
964 g_aliasString+=yytext;
967 g_aliasString+=yytext;
972 g_aliasString+=yytext;
973 if (!g_lastEscaped) g_blockCount++;
977 g_aliasString+=yytext;
978 if (!g_lastEscaped) g_blockCount--;
981 replaceAliases(g_aliasString);
982 BEGIN( g_lastBlockContext );
987 g_aliasString+=yytext;
991 copyToOutput(yytext,(int)yyleng);
996 void replaceComment(int offset)
998 if (g_mlBrief || g_skip)
1000 copyToOutput(yytext,(int)yyleng);
1004 //printf("replaceComment(%s)\n",yytext);
1005 int i=computeIndent(&yytext[offset]);
1006 if (i==g_blockHeadCol)
1008 replaceCommentMarker(yytext,(int)yyleng);
1012 copyToOutput(" */",3);
1013 int i;for (i=(int)yyleng-1;i>=0;i--) unput(yytext[i]);
1014 g_inSpecialComment=FALSE;
1020 // simplified way to know if this is fixed form
1021 // duplicate in fortrancode.l
1022 static bool recognizeFixedForm(const char* contents)
1025 bool skipLine=FALSE;
1030 switch(contents[i]) {
1042 if(column==1) return TRUE;
1046 if(column>1 && column<7) return FALSE;
1051 if(column==7) return TRUE;
1059 /*! This function does three things:
1060 * -# It converts multi-line C++ style comment blocks (that are aligned)
1061 * to C style comment blocks (if MULTILINE_CPP_IS_BRIEF is set to NO).
1062 * -# It replaces aliases with their definition (see ALIASES)
1063 * -# It handles conditional sections (cond...endcond blocks)
1065 void convertCppComments(BufStr *inBuf,BufStr *outBuf,const char *fileName)
1067 //printf("convertCppComments(%s)\n",fileName);
1072 g_mlBrief = Config_getBool(MULTILINE_CPP_IS_BRIEF);
1074 g_fileName = fileName;
1075 g_lang = getLanguageFromFileName(fileName);
1076 g_pythonDocString = FALSE;
1078 g_condStack.clear();
1079 g_condStack.setAutoDelete(TRUE);
1080 g_commentStack.clear();
1081 g_commentStack.setAutoDelete(TRUE);
1084 printlex(yy_flex_debug, TRUE, __FILE__, fileName);
1085 isFixedForm = FALSE;
1086 if (g_lang==SrcLangExt_Fortran)
1088 isFixedForm = recognizeFixedForm(inBuf->data());
1091 if (g_lang==SrcLangExt_Markdown)
1095 g_commentStack.push(new CommentCtx(g_lineNr));
1102 while (!g_condStack.isEmpty())
1104 CondCtx *ctx = g_condStack.pop();
1105 QCString sectionInfo = " ";
1106 if (ctx->sectionId!=" ") sectionInfo.sprintf(" with label '%s' ",ctx->sectionId.stripWhiteSpace().data());
1107 warn(g_fileName,ctx->lineNr,"Conditional section%sdoes not have "
1108 "a corresponding \\endcond command within this file.",sectionInfo.data());
1110 if (g_nestingCount>0 && g_lang!=SrcLangExt_Markdown)
1112 QCString tmp= "(probable line reference: ";
1114 while (!g_commentStack.isEmpty())
1116 CommentCtx *ctx = g_commentStack.pop();
1117 if (!first) tmp += ", ";
1118 tmp += QCString().setNum(ctx->lineNr);
1123 warn(g_fileName,g_lineNr,"Reached end of file while still inside a (nested) comment. "
1124 "Nesting level %d %s",g_nestingCount,tmp.data());
1126 g_commentStack.clear();
1128 if (Debug::isFlagSet(Debug::CommentCnv))
1130 g_outBuf->at(g_outBuf->curPos())='\0';
1131 Debug::print(Debug::CommentCnv,0,"-----------\nCommentCnv: %s\n"
1132 "output=[\n%s]\n-----------\n",fileName,g_outBuf->data()
1135 printlex(yy_flex_debug, FALSE, __FILE__, fileName);
1139 //----------------------------------------------------------------------------
1140 #if !defined(YY_FLEX_SUBMINOR_VERSION)
1141 extern "C" { // some bogus code to keep the compiler happy
1142 void commentcnvYYdummy() { yy_flex_realloc(0,0); }