summaryrefslogtreecommitdiffstats
path: root/src/commentcnv.l
diff options
context:
space:
mode:
Diffstat (limited to 'src/commentcnv.l')
-rw-r--r--src/commentcnv.l185
1 files changed, 185 insertions, 0 deletions
diff --git a/src/commentcnv.l b/src/commentcnv.l
new file mode 100644
index 0000000..d2da72c
--- /dev/null
+++ b/src/commentcnv.l
@@ -0,0 +1,185 @@
+/*****************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2002 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
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+%{
+
+#define YY_NEVER_INTERACTIVE 1
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "bufstr.h"
+
+static BufStr *g_inBuf;
+static BufStr *g_outBuf;
+static int g_inBufPos;
+
+static void replaceCommentMarker(const char *s,int len)
+{
+ const char *p=s;
+ char c;
+ // copy blanks
+ while ((c=*p) && (c==' ' || c=='\t' || c=='\n'))
+ {
+ g_outBuf->addChar(c);
+ p++;
+ }
+ // replace start of comment marker by spaces
+ while ((c=*p) && (c=='/' || c=='!'))
+ {
+ g_outBuf->addChar(' ');
+ p++;
+ if (*p=='<') // comment-after-item marker
+ {
+ g_outBuf->addChar(' ');
+ p++;
+ }
+ if (c=='!') // end after first !
+ {
+ break;
+ }
+ }
+ // copy comment line to output
+ g_outBuf->addArray(p,len-(p-s));
+}
+
+static inline void copyToOutput(const char *s,int len)
+{
+ g_outBuf->addArray(s,len);
+}
+
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int bytesInBuf = g_inBuf->curPos()-g_inBufPos;
+ int bytesToCopy = QMIN(max_size,bytesInBuf);
+ memcpy(buf,g_inBuf->data()+g_inBufPos,bytesToCopy);
+ g_inBufPos+=bytesToCopy;
+ return bytesToCopy;
+}
+
+%}
+
+%option noyywrap
+%option nounput
+
+%x Scan
+%x SkipString
+%x SComment
+%x CComment
+%x Verbatim
+
+%%
+
+<Scan>[^\"\/\n\\]* { /* eat anything that is not " / or \n */
+ copyToOutput(yytext,yyleng);
+ }
+<Scan>"\"" { /* start of a string */
+ copyToOutput(yytext,yyleng);
+ BEGIN(SkipString);
+ }
+<Scan>\n { /* new line */
+ copyToOutput(yytext,yyleng);
+ }
+<Scan>("//!"|"///").*\n/[ \t]*"//" { /* start C++ style special comment block */
+ copyToOutput("/*!",3);
+ copyToOutput(yytext+3,yyleng-3);
+ BEGIN(SComment);
+ }
+<Scan>"//".*\n { /* one line C++ comment */
+ copyToOutput(yytext,yyleng);
+ }
+<Scan>"/*" { /* start of a C comment */
+ copyToOutput(yytext,yyleng);
+ BEGIN(CComment);
+ }
+<Scan>"\\verbatim" { /* start of a verbatim block */
+ copyToOutput(yytext,yyleng);
+ BEGIN(Verbatim);
+ }
+<Scan>. { /* any other character */
+ copyToOutput(yytext,yyleng);
+ }
+<Verbatim>"\\endverbatim" { /* end of verbatim block */
+ copyToOutput(yytext,yyleng);
+ BEGIN(Scan);
+ }
+<Verbatim>[^\\\n]* { /* any character not a backslash or new line */
+ copyToOutput(yytext,yyleng);
+ }
+<Verbatim>\n { /* new line in verbatim block */
+ copyToOutput(yytext,yyleng);
+ }
+<Verbatim>. { /* any other character */
+ copyToOutput(yytext,yyleng);
+ }
+<SkipString>\\. { /* escaped character in string */
+ copyToOutput(yytext,yyleng);
+ }
+<SkipString>"\"" { /* end of string */
+ copyToOutput(yytext,yyleng);
+ BEGIN(Scan);
+ }
+<SkipString>. { /* any other string character */
+ copyToOutput(yytext,yyleng);
+ }
+<SkipString>\n { /* new line inside string (illegal for some compilers) */
+ copyToOutput(yytext,yyleng);
+ }
+<CComment>[^*\n]* { /* anything that is not a '*' */
+ copyToOutput(yytext,yyleng);
+ }
+<CComment>"*"+[^*/\n]* { /* stars without slashes */
+ copyToOutput(yytext,yyleng);
+ }
+<CComment>\n { /* new line in comment */
+ copyToOutput(yytext,yyleng);
+ }
+<CComment>"*"+"/" { /* end of C comment */
+ copyToOutput(yytext,yyleng);
+ BEGIN(Scan);
+ }
+<SComment>^[ \t]*"//".*/\n { /* second line of special comment */
+ replaceCommentMarker(yytext,yyleng);
+ }
+<SComment>\n[ \t]*"//".*/\n { /* other line of special comment */
+ replaceCommentMarker(yytext,yyleng);
+ }
+<SComment>\n { /* end of special comment */
+ copyToOutput(" */",3);
+ copyToOutput(yytext,yyleng);
+ BEGIN(Scan);
+ }
+
+%%
+
+void convertCppComments(BufStr *inBuf,BufStr *outBuf)
+{
+ g_inBuf = inBuf;
+ g_outBuf = outBuf;
+ g_inBufPos = 0;
+ BEGIN(Scan);
+ yylex();
+}
+
+//----------------------------------------------------------------------------
+extern "C" { // some bogus code to keep the compiler happy
+ void commentcnvYYdummy() { yy_flex_realloc(0,0); }
+}
+