summaryrefslogtreecommitdiffstats
path: root/src/commentcnv.l
diff options
context:
space:
mode:
Diffstat (limited to 'src/commentcnv.l')
-rw-r--r--src/commentcnv.l567
1 files changed, 0 insertions, 567 deletions
diff --git a/src/commentcnv.l b/src/commentcnv.l
deleted file mode 100644
index a3d62a4..0000000
--- a/src/commentcnv.l
+++ /dev/null
@@ -1,567 +0,0 @@
-/*****************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 <qstack.h>
-#include <qregexp.h>
-#include <qtextstream.h>
-
-#include "bufstr.h"
-#include "debug.h"
-#include "message.h"
-#include "config.h"
-#include "doxygen.h"
-
-
-#define ADDCHAR(c) g_outBuf->addChar(c)
-#define ADDARRAY(a,s) g_outBuf->addArray(a,s)
-
-struct CondCtx
-{
- CondCtx(int line,QCString id,bool b)
- : lineNr(line),sectionId(id), skip(b) {}
- int lineNr;
- QCString sectionId;
- bool skip;
-};
-
-static BufStr * g_inBuf;
-static BufStr * g_outBuf;
-static int g_inBufPos;
-static int g_col;
-static int g_blockHeadCol;
-static bool g_mlBrief;
-static int g_readLineCtx;
-static bool g_skip;
-static QCString g_fileName;
-static int g_lineNr;
-static int g_condCtx;
-static QStack<CondCtx> g_condStack;
-static QCString g_blockName;
-static int g_lastCommentContext;
-
-static void replaceCommentMarker(const char *s,int len)
-{
- const char *p=s;
- char c;
- // copy blanks
- while ((c=*p) && (c==' ' || c=='\t' || c=='\n'))
- {
- ADDCHAR(c);
- g_lineNr += c=='\n';
- p++;
- }
- // replace start of comment marker by spaces
- while ((c=*p) && (c=='/' || c=='!' || c=='#'))
- {
- ADDCHAR(' ');
- p++;
- if (*p=='<') // comment-after-item marker
- {
- ADDCHAR(' ');
- p++;
- }
- if (c=='!') // end after first !
- {
- break;
- }
- }
- // copy comment line to output
- ADDARRAY(p,len-(p-s));
-}
-
-static inline int computeIndent(const char *s)
-{
- int col=0;
- static int tabSize=Config_getInt("TAB_SIZE");
- const char *p=s;
- char c;
- while ((c=*p++))
- {
- if (c==' ') col++;
- else if (c=='\t') col+=tabSize-(col%tabSize);
- else break;
- }
- return col;
-}
-
-static inline void copyToOutput(const char *s,int len)
-{
- int i;
- if (g_skip) // only add newlines.
- {
- for (i=0;i<len;i++)
- {
- if (s[i]=='\n')
- {
- ADDCHAR('\n');
- g_lineNr++;
- }
- }
- }
- else
- {
- ADDARRAY(s,len);
- static int tabSize=Config_getInt("TAB_SIZE");
- for (i=0;i<len;i++)
- {
- switch (s[i])
- {
- case '\n': g_col=0; g_lineNr++; break;
- case '\t': g_col+=tabSize-(g_col%tabSize); break;
- default: g_col++; break;
- }
- }
- }
-}
-
-static void startCondSection(const char *sectId)
-{
- g_condStack.push(new CondCtx(g_lineNr,sectId,g_skip));
- if (Config_getList("ENABLED_SECTIONS").find(sectId)!=-1)
- {
- //printf("*** Section is enabled!\n");
- }
- else
- {
- //printf("*** Section is disabled!\n");
- g_skip=TRUE;
- }
-}
-
-static void endCondSection()
-{
- if (g_condStack.isEmpty())
- {
- warn(g_fileName,g_lineNr,"Found \\endcond command without matching \\cond");
- g_skip=FALSE;
- }
- else
- {
- CondCtx *ctx = g_condStack.pop();
- g_skip=ctx->skip;
- }
-}
-
-/** remove and executes \\cond and \\endcond commands in \a s */
-static QCString handleCondCmdInAliases(const QCString &s)
-{
- QCString result;
- //printf("handleCondCmdInAliases(%s)\n",s.data());
- static QRegExp cmdPat("[\\\\@][a-z_A-Z][a-z_A-Z0-9]*");
- int p=0,i,l;
- while ((i=cmdPat.match(s,p,&l))!=-1)
- {
- result+=s.mid(p,i-p);
- QCString cmd = s.mid(i+1,l-1);
- //printf("Found command %s\n",cmd.data());
- if (cmd=="cond")
- {
- int sp=i+l,ep;
- const char *arg=s.data()+sp;
- char c;
- // skip spaces
- while ((c=*arg) && (c==' ' || c=='\t')) arg++,sp++;
- // read argument
- if (*arg=='\n') // no arg
- {
- startCondSection(" ");
- ep=sp;
- }
- else // get argument
- {
- ep=sp;
- while ((c=*arg) && isId(c)) arg++,ep++;
- if (ep>sp)
- {
- QCString id = s.mid(sp,ep-sp);
- //printf("Found conditional section id %s\n",id.data());
- startCondSection(id);
- }
- else // invalid identifier
- {
- }
- }
- p=ep;
- }
- else if (cmd=="endcond")
- {
- endCondSection();
- p=i+l;
- }
- else
- {
- result+=s.mid(i,l);
- p=i+l;
- }
- }
- result+=s.right(s.length()-p);
- return result;
-}
-
-/** copies string \a s with length \a len to the output, while
- * replacing any alias commands found in the string.
- */
-static void replaceAliases(const char *s,int len)
-{
- static QRegExp cmd("[@\\\\][a-z_A-Z][a-z_A-Z0-9]*");
- QCString in=s;
- int p=0,i,l;
- while ((i=cmd.match(in,p,&l))!=-1)
- {
- copyToOutput(s+p,i-p);
- QCString *pValue=Doxygen::aliasDict[in.mid(i+1,l-1)];
- if (pValue)
- {
- QCString val = handleCondCmdInAliases(*pValue);
- copyToOutput(val.data(),val.length());
- }
- else
- {
- copyToOutput(s+i,l);
- }
- p=i+l;
- }
- copyToOutput(s+p,len-p);
-}
-
-
-#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;
-}
-
-void replaceComment(int offset);
-
-%}
-
-CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'"))
-
-%option noyywrap
-
-%x Scan
-%x SkipString
-%x SComment
-%x CComment
-%x Verbatim
-%x ReadLine
-%x CondLine
-
-%%
-
-<Scan>[^"'\/\n\\]* { /* eat anything that is not " / or \n */
- copyToOutput(yytext,yyleng);
- }
-<Scan>"\"" { /* start of a string */
- copyToOutput(yytext,yyleng);
- BEGIN(SkipString);
- }
-<Scan>{CHARLIT} {
- copyToOutput(yytext,yyleng);
- }
-<Scan>\n { /* new line */
- copyToOutput(yytext,yyleng);
- }
-<Scan>("//!"|"///").*/\n[ \t]*"//"[\/!][^\/] { /* start C++ style special comment block */
- if (g_mlBrief) REJECT; // bail out if we do not need to convert
- int i=3;
- if (yytext[2]=='/')
- {
- while (i<yyleng && yytext[i]=='/') i++;
- }
- g_blockHeadCol=g_col;
- copyToOutput("/**",3);
- //copyToOutput(yytext+i,yyleng-i);
- replaceAliases(yytext+i,yyleng-i);
- BEGIN(SComment);
- }
-<Scan>"//##Documentation".*/\n { /* Start of Rational Rose ANSI C++ comment block */
- if (g_mlBrief) REJECT;
- int i=17; //=strlen("//##Documentation");
- g_blockHeadCol=g_col;
- copyToOutput("/**",3);
- //copyToOutput(yytext+i,yyleng-i);
- replaceAliases(yytext+i,yyleng-i);
- BEGIN(SComment);
- }
-<Scan>"//"/.*\n { /* one line C++ comment */
- copyToOutput(yytext,yyleng);
- g_readLineCtx=YY_START;
- BEGIN(ReadLine);
- }
-<Scan>"/*" { /* start of a C comment */
- copyToOutput(yytext,yyleng);
- BEGIN(CComment);
- }
-<CComment>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"rtfonly"|"manonly"|"dot"|"code"|"f$"|"f["|"f{")/[^a-z_A-Z0-9] { /* start of a verbatim block */
- copyToOutput(yytext,yyleng);
- if (yytext[2]=='[')
- {
- g_blockName="f]";
- }
- else if (yytext[2]=='{')
- {
- g_blockName="f}";
- }
- else
- {
- g_blockName=&yytext[1];
- }
- g_lastCommentContext = YY_START;
- BEGIN(Verbatim);
- }
-<Scan>. { /* any other character */
- copyToOutput(yytext,yyleng);
- }
-<Verbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode"|"f$"|"f]"|"f}") { /* end of verbatim block */
- copyToOutput(yytext,yyleng);
- if (yytext[1]=='f') // end of formula
- {
- BEGIN(g_lastCommentContext);
- }
- else if (&yytext[4]==g_blockName)
- {
- BEGIN(g_lastCommentContext);
- }
- }
-<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 '*' or command */
- 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);
- }
-<CComment>. {
- copyToOutput(yytext,yyleng);
- }
-<SComment>^[ \t]*"///"[\/]*/\n {
- replaceComment(0);
- }
-<SComment>\n[ \t]*"///"[\/]*/\n {
- replaceComment(1);
- }
-<SComment>^[ \t]*"///"[^\/\n]/.*\n {
- replaceComment(0);
- g_readLineCtx=YY_START;
- BEGIN(ReadLine);
- }
-<SComment>\n[ \t]*"///"[^\/\n]/.*\n {
- replaceComment(1);
- g_readLineCtx=YY_START;
- BEGIN(ReadLine);
- }
-<SComment>^[ \t]*"//!" | // just //!
-<SComment>^[ \t]*"//!<"/.*\n | // or //!< something
-<SComment>^[ \t]*"//!"[^<]/.*\n { // or //!something
- replaceComment(0);
- g_readLineCtx=YY_START;
- BEGIN(ReadLine);
- }
-<SComment>\n[ \t]*"//!" |
-<SComment>\n[ \t]*"//!<"/.*\n |
-<SComment>\n[ \t]*"//!"[^<\n]/.*\n {
- replaceComment(1);
- g_readLineCtx=YY_START;
- BEGIN(ReadLine);
- }
-<SComment>^[ \t]*"//##"/.*\n {
- replaceComment(0);
- g_readLineCtx=YY_START;
- BEGIN(ReadLine);
- }
-<SComment>\n[ \t]*"//##"/.*\n {
- replaceComment(1);
- g_readLineCtx=YY_START;
- BEGIN(ReadLine);
- }
-<SComment>\n { /* end of special comment */
- copyToOutput(" */",3);
- copyToOutput(yytext,yyleng);
- BEGIN(Scan);
- }
-<ReadLine>[^\\@\n]*/\n {
- copyToOutput(yytext,yyleng);
- BEGIN(g_readLineCtx);
- }
-<CComment,ReadLine>[\\@][\\@][~a-z_A-Z][a-z_A-Z0-9]*[ \t]* { // escaped command
- copyToOutput(yytext,yyleng);
- }
-<CComment,ReadLine>[\\@]"cond"[ \t]+ { // conditional section
- g_condCtx = YY_START;
- BEGIN(CondLine);
- }
-<CComment,ReadLine>[\\@]"endcond"/[^a-z_A-Z0-9] { // end of conditional section
- bool oldSkip=g_skip;
- endCondSection();
- if (YY_START==CComment && oldSkip && !g_skip)
- {
- //printf("** Adding start of comment!\n");
- ADDCHAR('/');
- ADDCHAR('*');
- }
- }
-<CondLine>[a-z_A-Z][a-z_A-Z0-9.\-]* {
- bool oldSkip=g_skip;
- startCondSection(yytext);
- if (g_condCtx==CComment && !oldSkip && g_skip)
- {
- //printf("** Adding terminator for comment!\n");
- ADDCHAR('*');
- ADDCHAR('/');
- }
- BEGIN(g_condCtx);
- }
-<CondLine>[ \t]*
-<CComment,ReadLine>[\\@]"cond"[ \t]*\n |
-<CondLine>. { // forgot section id?
- bool oldSkip=g_skip;
- startCondSection(" "); // fake section id causing the section to be hidden unconditionally
- if (g_condCtx==CComment && !oldSkip && g_skip)
- {
- //printf("** Adding terminator for comment!\n");
- ADDCHAR('*');
- ADDCHAR('/');
- }
- if (*yytext=='\n') g_lineNr++;
- BEGIN(g_condCtx);
- }
-<CComment,ReadLine>[\\@][a-z_A-Z][a-z_A-Z0-9]* { // expand alias
- QCString *pValue=Doxygen::aliasDict[yytext+1];
- if (pValue)
- {
- QCString val = handleCondCmdInAliases(*pValue);
- copyToOutput(val.data(),val.length());
- }
- else
- {
- copyToOutput(yytext,yyleng);
- }
- }
-<ReadLine>. {
- copyToOutput(yytext,yyleng);
- }
-
-%%
-
-void replaceComment(int offset)
-{
- if (g_mlBrief)
- {
- copyToOutput(yytext,yyleng);
- }
- else
- {
- //printf("replaceComment(%s)\n",yytext);
- int i=computeIndent(&yytext[offset]);
- if (i==g_blockHeadCol)
- {
- replaceCommentMarker(yytext,yyleng);
- }
- else
- {
- copyToOutput(" */",3);
- int i;for (i=yyleng-1;i>=0;i--) unput(yytext[i]);
- BEGIN(Scan);
- }
- }
-}
-
-/*! This function does three things:
- * -# It converts multi-line C++ style comment blocks (that are aligned)
- * to C style comment blocks (if MULTILINE_CPP_IS_BRIEF is set to NO).
- * -# It replaces aliases with their definition (see ALIASES)
- * -# It handles conditional sections (\cond...\endcond blocks)
- */
-void convertCppComments(BufStr *inBuf,BufStr *outBuf,const char *fileName)
-{
- //printf("convertCppComments(%s)\n",fileName);
- g_inBuf = inBuf;
- g_outBuf = outBuf;
- g_inBufPos = 0;
- g_col = 0;
- g_mlBrief = Config_getBool("MULTILINE_CPP_IS_BRIEF");
- g_skip = FALSE;
- g_fileName = fileName;
- g_lineNr = 0;
- g_condStack.clear();
- g_condStack.setAutoDelete(TRUE);
- BEGIN(Scan);
- yylex();
- while (!g_condStack.isEmpty())
- {
- CondCtx *ctx = g_condStack.pop();
- QCString sectionInfo = " ";
- if (ctx->sectionId!=" ") sectionInfo.sprintf(" with label %s ",ctx->sectionId.data());
- warn(g_fileName,ctx->lineNr,"Conditional section%sdoes not have "
- "a corresponding \\endcond command within this file.",sectionInfo.data());
- }
- if (Debug::isFlagSet(Debug::CommentCnv))
- {
- g_outBuf->at(g_outBuf->curPos())='\0';
- msg("-------------\n%s\n-------------\n",g_outBuf->data());
- }
-}
-
-
-//----------------------------------------------------------------------------
-#if !defined(YY_FLEX_SUBMINOR_VERSION)
-extern "C" { // some bogus code to keep the compiler happy
- void commentcnvYYdummy() { yy_flex_realloc(0,0); }
-}
-#endif
-