diff options
author | Dimitri van Heesch <dimitri@stack.nl> | 2012-09-30 13:51:29 (GMT) |
---|---|---|
committer | Dimitri van Heesch <dimitri@stack.nl> | 2012-09-30 13:51:29 (GMT) |
commit | ceb4115c7b941039411e1793e01239610ff112a2 (patch) | |
tree | d18c06222e0f84d6077b586e5633053a8bc09da8 /src | |
parent | f6d511e52eb55c5d5b980c4d226f2ea80b396095 (diff) | |
download | Doxygen-ceb4115c7b941039411e1793e01239610ff112a2.zip Doxygen-ceb4115c7b941039411e1793e01239610ff112a2.tar.gz Doxygen-ceb4115c7b941039411e1793e01239610ff112a2.tar.bz2 |
Release-1.8.2-20120930
Diffstat (limited to 'src')
75 files changed, 2164 insertions, 761 deletions
diff --git a/src/cite.cpp b/src/cite.cpp index 96e88ae..5612eb4 100644 --- a/src/cite.cpp +++ b/src/cite.cpp @@ -45,7 +45,7 @@ CiteDict::CiteDict(int size) : m_entries(size, FALSE) m_entries.setAutoDelete(TRUE); } -static QCString getListOfBibFiles(const QCString &sep,bool stripExtension) +static QCString getListOfBibFiles(const QCString &sep,bool namesOnly) { QCString result; QStrList &citeDataList = Config_getList("CITE_BIB_FILES"); @@ -54,17 +54,24 @@ static QCString getListOfBibFiles(const QCString &sep,bool stripExtension) { int i; QCString bibFile = bibdata; - if (stripExtension && bibFile.right(4)==".bib") + if (namesOnly && bibFile.right(4)==".bib") // strip extension { bibFile = bibFile.left(bibFile.length()-4); } - if (stripExtension && (i=bibFile.findRev('/'))!=-1) + if ((i=bibFile.findRev('/'))!=-1) // strip path { bibFile = bibFile.mid(i+1); } if (!bibFile.isEmpty()) { - result+=bibFile; + if (namesOnly) // bare names + { + result+=bibFile; + } + else // add quotes for paths with spaces + { + result+="\""+bibFile+"\""; + } bibdata = citeDataList.next(); if (bibdata) { @@ -162,12 +169,52 @@ void CiteDict::generatePage() const f.writeBlock(bstData, bstData.length()); f.close(); - // 4. run bib2xhtml perl script on the generated file which will insert the + // 4. for html we just copy the bib files to the output so that + // bibtex can find them without path (bibtex doesn't support path's + // with spaces!) + QList<QCString> tempFiles; + tempFiles.setAutoDelete(TRUE); + QDir thisDir; + if (Config_getBool("GENERATE_HTML")) + { + // copy bib files to the latex output dir + QStrList &citeDataList = Config_getList("CITE_BIB_FILES"); + QCString bibOutputDir = outputDir+"/"; + QFileInfo fo(bibOutputDir); + const char *bibdata = citeDataList.first(); + while (bibdata) + { + QCString bibFile = bibdata; + if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib"; + QFileInfo fi(bibFile); + if (fi.exists() && fi.dirPath(TRUE)!=fo.absFilePath()) + { + if (!bibFile.isEmpty()) + { + QCString destFile=bibOutputDir+fi.fileName().data(); + copyFile(bibFile,destFile); + tempFiles.append(new QCString(destFile)); + } + } + else if (!fi.exists()) + { + err("Error: bib file %s not found!\n",bibFile.data()); + } + bibdata = citeDataList.next(); + } + } + + QCString oldDir = convertToQCString(QDir::currentDirPath()); + QDir::setCurrent(outputDir); + + // 5. run bib2xhtml perl script on the generated file which will insert the // bibliography in citelist.doc - portable_system("perl",bib2xhtmlFile+" "+getListOfBibFiles(" ",FALSE)+" "+ - citeListFile); + portable_system("perl","\""+bib2xhtmlFile+"\" "+getListOfBibFiles(" ",FALSE)+" \""+ + citeListFile+"\""); - // 5. read back the file + QDir::setCurrent(oldDir); + + // 6. read back the file f.setName(citeListFile); if (!f.open(IO_ReadOnly)) { @@ -212,11 +259,11 @@ void CiteDict::generatePage() const } //printf("doc=[%s]\n",doc.data()); - // 6. add it as a page + // 7. add it as a page addRelatedPage(CiteConsts::fileName, theTranslator->trCiteReferences(),doc,0,CiteConsts::fileName,1,0,0,0); - // 7. for latex we just copy the bib files to the output and let + // 8. for latex we just copy the bib files to the output and let // latex do this work. if (Config_getBool("GENERATE_LATEX")) { @@ -244,11 +291,14 @@ void CiteDict::generatePage() const } } - // 8. Remove temporary files - QDir thisDir; - thisDir.remove(citeListFile); - thisDir.remove(doxygenBstFile); - thisDir.remove(bib2xhtmlFile); - + // 9. Remove temporary files + //thisDir.remove(citeListFile); + //thisDir.remove(doxygenBstFile); + //thisDir.remove(bib2xhtmlFile); + //while (!tempFiles.isEmpty()) + //{ + // QCString *s=tempFiles.take(); + // thisDir.remove(*s); + //} } diff --git a/src/classdef.cpp b/src/classdef.cpp index bf95dbb..3dd562e 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -1507,6 +1507,7 @@ void ClassDef::writeSummaryLinks(OutputList &ol) for (li.toFirst();li.current();++li) { ol.writeSummaryLink(0,li.current()->data(),li.current()->data(),first); + first=FALSE; } } if (!first) @@ -2997,6 +2998,7 @@ void ClassDef::addUsedClass(ClassDef *cd,const char *accessName, Protection prot) { static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE"); + static bool umlLook = Config_getBool("UML_LOOK"); if (prot==Private && !extractPrivate) return; //printf("%s::addUsedClass(%s,%s)\n",name().data(),cd->name().data(),accessName); if (m_impl->usesImplClassDict==0) @@ -3012,13 +3014,25 @@ void ClassDef::addUsedClass(ClassDef *cd,const char *accessName, //printf("Adding used class %s to class %s via accessor %s\n", // cd->name().data(),name().data(),accessName); } - ucd->addAccessor(accessName); + QCString acc = accessName; + if (umlLook) + { + switch(prot) + { + case Public: acc.prepend("+"); break; + case Private: acc.prepend("-"); break; + case Protected: acc.prepend("#"); break; + case Package: acc.prepend("~"); break; + } + } + ucd->addAccessor(acc); } void ClassDef::addUsedByClass(ClassDef *cd,const char *accessName, Protection prot) { static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE"); + static bool umlLook = Config_getBool("UML_LOOK"); if (prot==Private && !extractPrivate) return; //printf("%s::addUsedByClass(%s,%s)\n",name().data(),cd->name().data(),accessName); if (m_impl->usedByImplClassDict==0) @@ -3034,7 +3048,18 @@ void ClassDef::addUsedByClass(ClassDef *cd,const char *accessName, //printf("Adding used by class %s to class %s\n", // cd->name().data(),name().data()); } - ucd->addAccessor(accessName); + QCString acc = accessName; + if (umlLook) + { + switch(prot) + { + case Public: acc.prepend("+"); break; + case Private: acc.prepend("-"); break; + case Protected: acc.prepend("#"); break; + case Package: acc.prepend("~"); break; + } + } + ucd->addAccessor(acc); } @@ -565,7 +565,7 @@ static void codifyLines(const char *text) { g_yyLineNr++; //*(p-1)='\0'; - int l = p-sp-1; + int l = (int)(p-sp-1); char *tmp = (char*)malloc(l+1); memcpy(tmp,sp,l); tmp[l]='\0'; diff --git a/src/commentcnv.l b/src/commentcnv.l index 6da02db..e9fc74b 100644 --- a/src/commentcnv.l +++ b/src/commentcnv.l @@ -41,6 +41,12 @@ #define ADDCHAR(c) g_outBuf->addChar(c) #define ADDARRAY(a,s) g_outBuf->addArray(a,s) +enum GuardType +{ + Guard_Cond, + Guard_CondNot +}; + struct CondCtx { CondCtx(int line,QCString id,bool b) @@ -77,6 +83,7 @@ static bool g_lastEscaped; static int g_lastBlockContext; static bool g_pythonDocString; +static GuardType guardType; // kind of guard for conditional section static SrcLangExt g_lang; @@ -118,7 +125,7 @@ static void replaceCommentMarker(const char *s,int len) ADDCHAR(' '); } // copy comment line to output - ADDARRAY(p,len-(p-s)); + ADDARRAY(p,len-(int)(p-s)); } static inline int computeIndent(const char *s) @@ -172,14 +179,29 @@ static inline void copyToOutput(const char *s,int len) static void startCondSection(const char *sectId) { g_condStack.push(new CondCtx(g_lineNr,sectId,g_skip)); - if (Config_getList("ENABLED_SECTIONS").find(sectId)!=-1) + if (guardType == Guard_Cond) { - //printf("*** Section is enabled!\n"); + if (Config_getList("ENABLED_SECTIONS").find(sectId)!=-1) + { + //printf("*** Section is enabled!\n"); + } + else + { + //printf("*** Section is disabled!\n"); + g_skip=TRUE; + } } - else + else if (guardType == Guard_CondNot) { - //printf("*** Section is disabled!\n"); - g_skip=TRUE; + if (Config_getList("ENABLED_SECTIONS").find(sectId)!=-1) + { + //printf("*** Section is disabled!\n"); + g_skip=TRUE; + } + else + { + //printf("*** Section is enabled!\n"); + } } } @@ -660,6 +682,12 @@ void replaceComment(int offset); } <CComment,ReadLine>[\\@]"cond"[ \t]+ { // conditional section g_condCtx = YY_START; + guardType = Guard_Cond; + BEGIN(CondLine); + } +<CComment,ReadLine>[\\@]"condnot"[ \t]+ { // conditional section + g_condCtx = YY_START; + guardType = Guard_CondNot; BEGIN(CondLine); } <CComment,ReadLine>[\\@]"endcond"/[^a-z_A-Z0-9] { // end of conditional section @@ -700,6 +728,7 @@ void replaceComment(int offset); <CondLine>[ \t]* <CComment,ReadLine>[\\@]"cond"[ \t\r]*/\n | <CondLine>. { // forgot section id? + guardType = Guard_Cond; if (YY_START!=CondLine) g_condCtx=YY_START; bool oldSkip=g_skip; startCondSection(" "); // fake section id causing the section to be hidden unconditionally diff --git a/src/commentscan.l b/src/commentscan.l index 2d814eb..21f6f1c 100644 --- a/src/commentscan.l +++ b/src/commentscan.l @@ -1044,9 +1044,9 @@ RCSTAG "$"{ID}":"[^\n$]+"$" // rule matched. // for flex 2.5.33+ we should use YY_CURRENT_BUFFER_LVALUE #if YY_FLEX_MINOR_VERSION>=5 && YY_FLEX_SUBMINOR_VERSION>=33 - inputPosition=prevPosition + yy_bp - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + inputPosition=prevPosition + (int)(yy_bp - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf); #else - inputPosition=prevPosition + yy_bp - yy_current_buffer->yy_ch_buf; + inputPosition=prevPosition + (int)(yy_bp - yy_current_buffer->yy_ch_buf); #endif yyterminate(); } @@ -1106,9 +1106,9 @@ RCSTAG "$"{ID}":"[^\n$]+"$" parseMore=TRUE; needNewEntry = TRUE; #if YY_FLEX_MINOR_VERSION>=5 && YY_FLEX_SUBMINOR_VERSION>=33 - inputPosition=prevPosition + yy_bp - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + strlen(yytext); + inputPosition=prevPosition + (int)(yy_bp - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf) + strlen(yytext); #else - inputPosition=prevPosition + yy_bp - yy_current_buffer->yy_ch_buf + strlen(yytext); + inputPosition=prevPosition + (int)(yy_bp - yy_current_buffer->yy_ch_buf) + strlen(yytext); #endif yyterminate(); } @@ -2848,7 +2848,7 @@ static int findExistingGroup(int &groupId,const MemberGroupInfo *info) ) { //printf("Found it!\n"); - return di.currentKey(); // put the item in this group + return (int)di.currentKey(); // put the item in this group } } groupId++; // start new group diff --git a/src/config.xml b/src/config.xml index e0caa16..410f732 100644 --- a/src/config.xml +++ b/src/config.xml @@ -284,11 +284,11 @@ Doxygen will parse them like normal C++ but will assume all classes use public instead of private inheritance when no explicit protection keyword is present. ' defval='0'/> <option type='bool' id='IDL_PROPERTY_SUPPORT' docs=' -For Microsoft's IDL there are propget and propput attributes to indicate -getter and setter methods for a property. Setting this option to YES (the -default) will make doxygen replace the get and set methods by a property in -the documentation. This will only work if the methods are indeed getting or -setting a simple type. If this is not the case, or you want to show the +For Microsoft's IDL there are propget and propput attributes to indicate +getter and setter methods for a property. Setting this option to YES (the +default) will make doxygen replace the get and set methods by a property in +the documentation. This will only work if the methods are indeed getting or +setting a simple type. If this is not the case, or you want to show the methods anyway, you should set this option to NO. ' defval='1'/> <option type='bool' id='DISTRIBUTE_GROUP_DOC' docs=' @@ -561,7 +561,8 @@ containing the references data. This must be a list of .bib files. The requires the bibtex tool to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style of the bibliography can be controlled using LATEX_BIB_STYLE. To use this -feature you need bibtex and perl available in the search path. +feature you need bibtex and perl available in the search path. Do not use +file names with spaces, bibtex cannot handle them. ' defval=''/> </group> <group name='Messages' docs='configuration options related to warning and progress messages'> diff --git a/src/configgen.py b/src/configgen.py index d02eafd..5af201f 100755 --- a/src/configgen.py +++ b/src/configgen.py @@ -12,6 +12,7 @@ # input used in their production; they are not affected by this license. # import xml.dom.minidom +import sys from xml.dom import minidom, Node def addValues(var,node): @@ -110,7 +111,7 @@ def parseGroups(node): def main(): - doc = xml.dom.minidom.parse("config.xml") + doc = xml.dom.minidom.parse(sys.argv[1]) elem = doc.documentElement print "/* WARNING: This file is generated!" print " * Do not edit this file, but edit config.xml instead and run" diff --git a/src/configoptions.cpp b/src/configoptions.cpp index 62caf46..99e4798 100644 --- a/src/configoptions.cpp +++ b/src/configoptions.cpp @@ -400,7 +400,12 @@ void addConfigOptions(Config *cfg) //---- cb = cfg->addBool( "IDL_PROPERTY_SUPPORT", - "For Microsoft's IDL there are propget and propput attributes to indicate getter and setter methods for a property. Setting this option to YES (the default) will make doxygen replace the get and set methods by a property in the documentation. This will only work if the methods are indeed getting or setting a simple type. If this is not the case, or you want to show the methods anyway, you should set this option to NO.", + "For Microsoft's IDL there are propget and propput attributes to indicate\n" + "getter and setter methods for a property. Setting this option to YES (the\n" + "default) will make doxygen replace the get and set methods by a property in\n" + "the documentation. This will only work if the methods are indeed getting or\n" + "setting a simple type. If this is not the case, or you want to show the\n" + "methods anyway, you should set this option to NO.", TRUE ); //---- @@ -801,7 +806,8 @@ void addConfigOptions(Config *cfg) "requires the bibtex tool to be installed. See also\n" "http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style\n" "of the bibliography can be controlled using LATEX_BIB_STYLE. To use this\n" - "feature you need bibtex and perl available in the search path." + "feature you need bibtex and perl available in the search path. Do not use\n" + "file names with spaces, bibtex cannot handle them." ); cl->setWidgetType(ConfigList::File); //--------------------------------------------------------------------------- diff --git a/src/definition.cpp b/src/definition.cpp index c4d3a6e..1e60730 100644 --- a/src/definition.cpp +++ b/src/definition.cpp @@ -691,7 +691,7 @@ void Definition::setInbodyDocumentation(const char *d,const char *inbodyFile,int * The line actually containing the bracket is returned via endLine. * Note that for VHDL code the bracket search is not done. */ -static bool readCodeFragment(const char *fileName, +bool readCodeFragment(const char *fileName, int &startLine,int &endLine,QCString &result) { static bool filterSourceFiles = Config_getBool("FILTER_SOURCE_FILES"); @@ -1546,7 +1546,7 @@ void Definition::writeToc(OutputList &ol) ol.writeString("<ul>"); SDict<SectionInfo>::Iterator li(*sectionDict); SectionInfo *si; - int level=1; + int level=1,l; char cs[2]; cs[1]='\0'; bool inLi[5]={ FALSE, FALSE, FALSE, FALSE }; @@ -1561,13 +1561,19 @@ void Definition::writeToc(OutputList &ol) int nextLevel = (int)si->type; if (nextLevel>level) { - ol.writeString("<ul>"); + for (l=level;l<nextLevel;l++) + { + ol.writeString("<ul>"); + } } else if (nextLevel<level) { - if (inLi[level]) ol.writeString("</li>\n"); - inLi[level]=FALSE; - ol.writeString("</ul>\n"); + for (l=level;l>nextLevel;l--) + { + if (inLi[l]) ol.writeString("</li>\n"); + inLi[l]=FALSE; + ol.writeString("</ul>\n"); + } } cs[0]='0'+nextLevel; if (inLi[nextLevel]) ol.writeString("</li>\n"); diff --git a/src/definition.h b/src/definition.h index 563fb61..ed447fe 100644 --- a/src/definition.h +++ b/src/definition.h @@ -38,6 +38,8 @@ struct SectionInfo; class Definition; class DefinitionImpl; + + /** Data associated with a detailed description. */ struct DocInfo { @@ -382,4 +384,12 @@ class DefinitionListIterator : public QListIterator<Definition> ~DefinitionListIterator() {} }; +/** Reads a fragment from file \a fileName starting with line \a startLine + * and ending with line \a endLine. The result is returned as a string + * via \a result. The function returns TRUE if successful and FALSE + * in case of an error. + */ +bool readCodeFragment(const char *fileName, + int &startLine,int &endLine, + QCString &result); #endif diff --git a/src/diagram.cpp b/src/diagram.cpp index b675b8d..67f63a0 100644 --- a/src/diagram.cpp +++ b/src/diagram.cpp @@ -606,7 +606,7 @@ void TreeDiagram::drawBoxes(FTextStream &t,Image *image, while (dr && !done) { int x=0,y=0; - float xf=0.0,yf=0.0; + float xf=0.0f,yf=0.0f; DiagramItem *di=dr->first(); if (di->isInList()) // put boxes in a list { @@ -623,8 +623,8 @@ void TreeDiagram::drawBoxes(FTextStream &t,Image *image, } else { - if (doBase) yf += 1.0; - else yf -= 1.0; + if (doBase) yf += 1.0f; + else yf -= 1.0f; } } else @@ -736,7 +736,7 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image, if (di->isInList()) // row consists of list connectors { int x=0,y=0,ys=0; - float xf=0.0,yf=0.0,ysf=0.0; + float xf=0.0f,yf=0.0f,ysf=0.0f; while (di) { DiagramItem *pi=di->parentItem(); @@ -808,12 +808,12 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image, if (doBase) { ysf = di->yPos()/(float)gridHeight+superRows-1; - yf = ysf + 0.5; + yf = ysf + 0.5f; } else { - ysf = (float)superRows-0.25-di->yPos()/(float)gridHeight; - yf = ysf - 0.25; + ysf = (float)superRows-0.25f-di->yPos()/(float)gridHeight; + yf = ysf - 0.25f; } } while (di!=last) // more children to add @@ -841,12 +841,12 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image, if (doBase) { t << "1 " << xf << " " << yf << " hedge\n"; - yf += 1.0; + yf += 1.0f; } else { t << "0 " << xf << " " << yf << " hedge\n"; - yf -= 1.0; + yf -= 1.0f; } } di=dr->next(); @@ -1092,9 +1092,9 @@ void ClassDiagram::writeFigure(FTextStream &output,const char *path, uint estWidth = cols*(20+QMAX(baseMaxLabelWidth,superMaxLabelWidth)); //printf("Estimated size %d x %d\n",estWidth,estHeight); - const float pageWidth = 14.0; // estimated page width in cm. - // Somewhat lower to deal with estimation - // errors. + const float pageWidth = 14.0f; // estimated page width in cm. + // Somewhat lower to deal with estimation + // errors. // compute the image height in centimeters based on the estimates float realHeight = QMIN(rows,12); // real height in cm diff --git a/src/dirdef.cpp b/src/dirdef.cpp index ad403f0..e45aff9 100644 --- a/src/dirdef.cpp +++ b/src/dirdef.cpp @@ -34,7 +34,7 @@ DirDef::DirDef(const char *path) : Definition(path,1,path) } setLocalName(m_shortName); m_dispName = fullPathNames ? stripFromPath(path) : m_shortName; - if (m_dispName.at(m_dispName.length()-1)=='/') + if (m_dispName.length()>0 && m_dispName.at(m_dispName.length()-1)=='/') { // strip trailing / m_dispName = m_dispName.left(m_dispName.length()-1); } @@ -648,7 +648,7 @@ DirDef *DirDef::mergeDirectoryInTree(const QCString &path) while ((i=path.find('/',p))!=-1) { QCString part=path.left(i+1); - if (!matchPath(part,Config_getList("STRIP_FROM_PATH")) && part!="/") + if (!matchPath(part,Config_getList("STRIP_FROM_PATH")) && (part!="/" && part!="//")) { dir=createNewDir(part); } diff --git a/src/docparser.cpp b/src/docparser.cpp index e7a6261..02153f6 100644 --- a/src/docparser.cpp +++ b/src/docparser.cpp @@ -43,6 +43,7 @@ #include "portable.h" #include "cite.h" #include "arguments.h" +#include "vhdldocgen.h" // debug off #define DBG(x) do {} while(0) @@ -5399,6 +5400,7 @@ int DocPara::handleCommand(const QCString &cmdName) m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::Msc,g_isExample,g_exampleName)); if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: msc section ended without end marker"); doctokenizerYYsetStatePara(); + VhdlDocGen::createFlowChart(g_memberDef); } break; case CMD_ENDCODE: diff --git a/src/docparser.h b/src/docparser.h index e1a630e..2fe68af 100644 --- a/src/docparser.h +++ b/src/docparser.h @@ -504,7 +504,7 @@ class DocIndexEntry : public DocNode { public: DocIndexEntry(DocNode *parent,Definition *scope,MemberDef *md) - : m_scope(scope), m_member(md) { m_parent = parent; } + : m_scope(scope), m_member(md){ m_parent = parent; } Kind kind() const { return Kind_IndexEntry; } int parse(); Definition *scope() const { return m_scope; } diff --git a/src/docsets.cpp b/src/docsets.cpp index e851383..2f0770b 100644 --- a/src/docsets.cpp +++ b/src/docsets.cpp @@ -263,7 +263,8 @@ void DocSets::addContentsItem(bool isDir, } } -void DocSets::addIndexItem(Definition *context,MemberDef *md,const char *) +void DocSets::addIndexItem(Definition *context,MemberDef *md, + const char *,const char *) { if (md==0 && context==0) return; diff --git a/src/docsets.h b/src/docsets.h index 799e289..8cf1d3d 100644 --- a/src/docsets.h +++ b/src/docsets.h @@ -49,7 +49,8 @@ class DocSets : public IndexIntf bool addToNavIndex, Definition *def ); - void addIndexItem(Definition *context,MemberDef *md,const char *title); + void addIndexItem(Definition *context,MemberDef *md, + const char *sectionAnchor,const char *title); void addIndexFile(const char *name); void addImageFile(const char *) {} void addStyleSheetFile(const char *) {} diff --git a/src/dot.cpp b/src/dot.cpp index 39bc844..adad589 100644 --- a/src/dot.cpp +++ b/src/dot.cpp @@ -1408,7 +1408,6 @@ bool DotManager::run() return TRUE; } - //-------------------------------------------------------------------- @@ -1682,6 +1681,18 @@ static void writeBoxMemberList(FTextStream &t, } } +static QCString stripProtectionPrefix(const QCString &s) +{ + if (!s.isEmpty() && (s[0]=='-' || s[0]=='+' || s[0]=='~' || s[0]=='#')) + { + return s.mid(1); + } + else + { + return s; + } +} + void DotNode::writeBox(FTextStream &t, GraphType gt, GraphOutputFormat /*format*/, @@ -1698,18 +1709,29 @@ void DotNode::writeBox(FTextStream &t, if (m_classDef && umlLook && (gt==Inheritance || gt==Collaboration)) { - // add names shown as relation to a dictionary, so we don't show + // add names shown as relations to a dictionary, so we don't show // them as attributes as well QDict<void> arrowNames(17); if (m_edgeInfo) { + // for each edge QListIterator<EdgeInfo> li(*m_edgeInfo); EdgeInfo *ei; for (li.toFirst();(ei=li.current());++li) { - if (!ei->m_label.isEmpty()) + if (!ei->m_label.isEmpty()) // labels joined by \n { - arrowNames.insert(ei->m_label,(void*)0x8); + int li=ei->m_label.find('\n'); + int p=0; + QCString lab; + while ((li=ei->m_label.find('\n',p))!=-1) + { + lab = stripProtectionPrefix(ei->m_label.mid(p,li-p)); + arrowNames.insert(lab,(void*)0x8); + p=li+1; + } + lab = stripProtectionPrefix(ei->m_label.right(ei->m_label.length()-p)); + arrowNames.insert(lab,(void*)0x8); } } } diff --git a/src/doxygen.cpp b/src/doxygen.cpp index afb2205..4397e77 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -4542,9 +4542,18 @@ static bool findClassRelation( { baseClass=new ClassDef(root->fileName,root->startLine, baseClassName,ClassDef::Class); - Doxygen::classSDict->append(baseClassName,baseClass); + //Doxygen::classSDict->append(baseClassName,baseClass); if (isArtificial) baseClass->setArtificial(TRUE); baseClass->setLanguage(root->lang); + int si = baseClassName.findRev("::"); + if (si!=-1) // class is nested + { + Definition *sd = findScopeFromQualifiedName(Doxygen::globalScope,baseClassName.left(si)); + if (sd==0 || sd==Doxygen::globalScope) // outer scope not found + { + baseClass->setArtificial(TRUE); // see bug678139 + } + } } } if (biName.right(2)=="-p") @@ -7430,7 +7439,6 @@ static void buildCompleteMemberLists() static void generateFileSources() { - if (documentedHtmlFiles==0) return; if (Doxygen::inputNameList->count()>0) { FileNameListIterator fnli(*Doxygen::inputNameList); @@ -9869,6 +9877,7 @@ static void stopDoxygen(int) { thisDir.remove(Doxygen::objDBFileName); } + killpg(0,SIGINT); exit(1); } #endif diff --git a/src/doxygen.css b/src/doxygen.css index ec994dd..de6fd81 100644 --- a/src/doxygen.css +++ b/src/doxygen.css @@ -1,4 +1,4 @@ -/* The standard CSS for doxygen */ +/* The standard CSS for doxygen $doxygenversion */ body, table, div, p, dl { font: 400 14px/19px Roboto,sans-serif; @@ -791,6 +791,14 @@ table.fieldtable { width: 100%; } +.fieldtable td.fielddoc p:first-child { + margin-top: 2px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + .fieldtable tr:last-child td { border-bottom: none; } diff --git a/src/doxygen_css.h b/src/doxygen_css.h index cb8d69f..64a9f25 100644 --- a/src/doxygen_css.h +++ b/src/doxygen_css.h @@ -1,4 +1,4 @@ -"/* The standard CSS for doxygen */\n" +"/* The standard CSS for doxygen $doxygenversion */\n" "\n" "body, table, div, p, dl {\n" " font: 400 14px/19px Roboto,sans-serif;\n" @@ -791,6 +791,14 @@ " width: 100%;\n" "}\n" "\n" +".fieldtable td.fielddoc p:first-child {\n" +" margin-top: 2px;\n" +"} \n" +" \n" +".fieldtable td.fielddoc p:last-child {\n" +" margin-bottom: 2px;\n" +"}\n" +"\n" ".fieldtable tr:last-child td {\n" " border-bottom: none;\n" "}\n" diff --git a/src/dynsections.js b/src/dynsections.js index 116542f..ed092c7 100644 --- a/src/dynsections.js +++ b/src/dynsections.js @@ -44,24 +44,43 @@ function toggleLevel(level) }); updateStripes(); } -function toggleFolder(id) + +function toggleFolder(id) { - var n = $('[id^=row_'+id+']'); - var i = $('[id^=img_'+id+']'); - var a = $('[id^=arr_'+id+']'); - var c = n.slice(1); - if (c.filter(':first').is(':visible')===true) { - i.attr('src','ftv2folderclosed.png'); - a.attr('src','ftv2pnode.png'); - c.hide(); - } else { - i.attr('src','ftv2folderopen.png'); - a.attr('src','ftv2mnode.png'); - c.show(); + //The clicked row + var currentRow = $('#row_'+id); + var currentRowImages = currentRow.find("img"); + + //All rows after the clicked row + var rows = currentRow.nextAll("tr"); + + //Only match elements AFTER this one (can't hide elements before) + var childRows = rows.filter(function() { + var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub + return this.id.match(re); + }); + + //First row is visible we are HIDING + if (childRows.filter(':first').is(':visible')===true) { + currentRowImages.filter("[id^=arr]").attr('src', 'ftv2pnode.png'); + currentRowImages.filter("[id^=img]").attr('src', 'ftv2folderclosed.png'); + rows.filter("[id^=row_"+id+"]").hide(); + } else { //We are SHOWING + //All sub images + var childImages = childRows.find("img"); + var childImg = childImages.filter("[id^=img]"); + var childArr = childImages.filter("[id^=arr]"); + + currentRow.find("[id^=arr]").attr('src', 'ftv2mnode.png'); //open row + currentRow.find("[id^=img]").attr('src', 'ftv2folderopen.png'); //open row + childImg.attr('src','ftv2folderclosed.png'); //children closed + childArr.attr('src','ftv2pnode.png'); //children closed + childRows.show(); //show all children } updateStripes(); } + function toggleInherit(id) { var rows = $('tr.inherit.'+id); diff --git a/src/dynsections_js.h b/src/dynsections_js.h index c2f5767..c2fba04 100644 --- a/src/dynsections_js.h +++ b/src/dynsections_js.h @@ -44,24 +44,43 @@ " });\n" " updateStripes();\n" "}\n" -"function toggleFolder(id) \n" +"\n" +"function toggleFolder(id)\n" "{\n" -" var n = $('[id^=row_'+id+']');\n" -" var i = $('[id^=img_'+id+']');\n" -" var a = $('[id^=arr_'+id+']');\n" -" var c = n.slice(1);\n" -" if (c.filter(':first').is(':visible')===true) {\n" -" i.attr('src','ftv2folderclosed.png');\n" -" a.attr('src','ftv2pnode.png');\n" -" c.hide();\n" -" } else {\n" -" i.attr('src','ftv2folderopen.png');\n" -" a.attr('src','ftv2mnode.png');\n" -" c.show();\n" +" //The clicked row\n" +" var currentRow = $('#row_'+id);\n" +" var currentRowImages = currentRow.find(\"img\");\n" +"\n" +" //All rows after the clicked row\n" +" var rows = currentRow.nextAll(\"tr\");\n" +"\n" +" //Only match elements AFTER this one (can't hide elements before)\n" +" var childRows = rows.filter(function() {\n" +" var re = new RegExp('^row_'+id+'\\\\d+_$', \"i\"); //only one sub\n" +" return this.id.match(re);\n" +" });\n" +"\n" +" //First row is visible we are HIDING\n" +" if (childRows.filter(':first').is(':visible')===true) {\n" +" currentRowImages.filter(\"[id^=arr]\").attr('src', 'ftv2pnode.png');\n" +" currentRowImages.filter(\"[id^=img]\").attr('src', 'ftv2folderclosed.png');\n" +" rows.filter(\"[id^=row_\"+id+\"]\").hide();\n" +" } else { //We are SHOWING\n" +" //All sub images\n" +" var childImages = childRows.find(\"img\");\n" +" var childImg = childImages.filter(\"[id^=img]\");\n" +" var childArr = childImages.filter(\"[id^=arr]\");\n" +"\n" +" currentRow.find(\"[id^=arr]\").attr('src', 'ftv2mnode.png'); //open row\n" +" currentRow.find(\"[id^=img]\").attr('src', 'ftv2folderopen.png'); //open row\n" +" childImg.attr('src','ftv2folderclosed.png'); //children closed\n" +" childArr.attr('src','ftv2pnode.png'); //children closed\n" +" childRows.show(); //show all children\n" " }\n" " updateStripes();\n" "}\n" "\n" +"\n" "function toggleInherit(id)\n" "{\n" " var rows = $('tr.inherit.'+id);\n" diff --git a/src/eclipsehelp.cpp b/src/eclipsehelp.cpp index 71db4ab..7a4052d 100644 --- a/src/eclipsehelp.cpp +++ b/src/eclipsehelp.cpp @@ -189,6 +189,7 @@ void EclipseHelp::addContentsItem( void EclipseHelp::addIndexItem( Definition * /* context */, MemberDef * /* md */, + const char * /* sectionAnchor */, const char * /* title */) { } diff --git a/src/eclipsehelp.h b/src/eclipsehelp.h index 2531a9f..489aa98 100644 --- a/src/eclipsehelp.h +++ b/src/eclipsehelp.h @@ -52,7 +52,8 @@ class EclipseHelp : public IndexIntf virtual void addContentsItem(bool isDir, const char *name, const char *ref, const char *file, const char *anchor,bool separateIndex,bool addToNavIndex, Definition *def); - virtual void addIndexItem(Definition *context,MemberDef *md,const char *title); + virtual void addIndexItem(Definition *context,MemberDef *md, + const char *sectionAnchor,const char *title); virtual void addIndexFile(const char *name); virtual void addImageFile(const char *name); virtual void addStyleSheetFile(const char *name); diff --git a/src/filedef.cpp b/src/filedef.cpp index 41d564d..a2040ca 100644 --- a/src/filedef.cpp +++ b/src/filedef.cpp @@ -807,7 +807,7 @@ void FileDef::writeSource(OutputList &ol) { startFile(ol,getSourceFileBase(),0,pageTitle,HLI_FileVisible, !generateTreeView, - !isDocFile && genSourceFile ? 0 : getOutputFileBase()); + !isDocFile && genSourceFile ? QCString() : getOutputFileBase()); if (!generateTreeView) { getDirDef()->writeNavigationPath(ol); @@ -820,7 +820,7 @@ void FileDef::writeSource(OutputList &ol) else { startFile(ol,getSourceFileBase(),0,pageTitle,HLI_FileVisible,FALSE, - !isDocFile && genSourceFile ? 0 : getOutputFileBase()); + !isDocFile && genSourceFile ? QCString() : getOutputFileBase()); startTitle(ol,getSourceFileBase()); ol.parseText(title); endTitle(ol,getSourceFileBase(),0); @@ -1173,13 +1173,15 @@ bool FileDef::isIncluded(const QCString &name) const bool FileDef::generateSourceFile() const { + static bool sourceBrowser = Config_getBool("SOURCE_BROWSER"); + static bool verbatimHeaders = Config_getBool("VERBATIM_HEADERS"); QCString extension = name().right(4); return !isReference() && - (Config_getBool("SOURCE_BROWSER") || - (Config_getBool("VERBATIM_HEADERS") && guessSection(name())==Entry::HEADER_SEC) + (sourceBrowser || + (verbatimHeaders && guessSection(name())==Entry::HEADER_SEC) ) && extension!=".doc" && extension!=".txt" && extension!=".dox" && - extension!=".md" && extension!=".markdown"; + extension!=".md" && name().right(9)!=".markdown"; } @@ -1526,7 +1528,7 @@ void FileDef::acquireFileVersion() } const int bufSize=1024; char buf[bufSize]; - int numRead = fread(buf,1,bufSize,f); + int numRead = (int)fread(buf,1,bufSize,f); portable_pclose(f); if (numRead>0 && !(fileVersion=QCString(buf,numRead).stripWhiteSpace()).isEmpty()) { diff --git a/src/fortranscanner.l b/src/fortranscanner.l index e214217..938d182 100644 --- a/src/fortranscanner.l +++ b/src/fortranscanner.l @@ -220,7 +220,7 @@ static void newLine(); //----------------------------------------------------------------------------- #undef YY_INPUT #define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); -#define YY_USER_ACTION yyColNr+=yyleng; +#define YY_USER_ACTION yyColNr+=(int)yyleng; //----------------------------------------------------------------------------- %} @@ -312,8 +312,8 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA //fprintf(stderr, "---%s", yytext); - int indexStart = getAmpersandAtTheStart(yytext, yyleng); - int indexEnd = getAmpOrExclAtTheEnd(yytext, yyleng); + int indexStart = getAmpersandAtTheStart(yytext, (int)yyleng); + int indexEnd = getAmpOrExclAtTheEnd(yytext, (int)yyleng); if (indexEnd>=0 && yytext[indexEnd]!='&') //we are only interested in amp indexEnd=-1; @@ -362,7 +362,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA initializer+=yytext; } <String>\"|\' { // string ends with next quote without previous backspace - if (yytext[0]!=stringStartSymbol) { yyColNr -= yyleng; REJECT; } // single vs double quote + if (yytext[0]!=stringStartSymbol) { yyColNr -= (int)yyleng; REJECT; } // single vs double quote if (yy_top_state() == Initialization || yy_top_state() == ArrayInitializer) initializer+=yytext; @@ -373,7 +373,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA initializer+=yytext; } <*>\"|\' { /* string starts */ - if (YY_START == StrIgnore) { yyColNr -= yyleng; REJECT; }; // ignore in simple comments + if (YY_START == StrIgnore) { yyColNr -= (int)yyleng; REJECT; }; // ignore in simple comments yy_push_state(YY_START); if (yy_top_state() == Initialization || yy_top_state() == ArrayInitializer) @@ -384,7 +384,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA /*------ ignore simple comment (not documentation comments) */ -<*>"!"/[^<>\n] { if (YY_START == String) { yyColNr -= yyleng; REJECT; } // "!" is ignored in strings +<*>"!"/[^<>\n] { if (YY_START == String) { yyColNr -= (int)yyleng; REJECT; } // "!" is ignored in strings // skip comment line (without docu comments "!>" "!<" ) /* ignore further "!" and ignore comments in Strings */ if ((YY_START != StrIgnore) && (YY_START != String)) @@ -709,7 +709,7 @@ private { } else { - yyColNr -= yyleng; + yyColNr -= (int)yyleng; REJECT; } } @@ -733,10 +733,10 @@ private { {BS} {} {ATTR_SPEC}. { /* update current modifierswhen it is an ATTR_SPEC and not a variable name */ /* bug_625519 */ - QChar chr = yytext[yyleng-1]; + QChar chr = yytext[(int)yyleng-1]; if (chr.isLetter() || chr.isDigit() || (chr == '_')) { - yyColNr -= yyleng; + yyColNr -= (int)yyleng; REJECT; } else @@ -744,7 +744,7 @@ private { QCString tmp = yytext; tmp = tmp.left(tmp.length() - 1); yyColNr -= 1; - unput(yytext[yyleng-1]); + unput(yytext[(int)yyleng-1]); currentModifiers |= (tmp); } } @@ -853,12 +853,12 @@ private { attr += yytext; modifiers[current_root][name.lower()] |= attr; } -<Variable>{COMMA} { //printf("COMMA: %d<=..<=%d\n", yyColNr-yyleng, yyColNr); +<Variable>{COMMA} { //printf("COMMA: %d<=..<=%d\n", yyColNr-(int)yyleng, yyColNr); // locate !< comment - updateVariablePrepassComment(yyColNr-yyleng, yyColNr); + updateVariablePrepassComment(yyColNr-(int)yyleng, yyColNr); } <Variable>{BS}"=" { yy_push_state(YY_START); - initializer=""; + initializer="="; initializerScope = initializerArrayScope = 0; BEGIN(Initialization); } @@ -904,7 +904,7 @@ private { } <Initialization>{COMMA} { if (initializerScope == 0) { - updateVariablePrepassComment(yyColNr-yyleng, yyColNr); + updateVariablePrepassComment(yyColNr-(int)yyleng, yyColNr); yy_pop_state(); // end initialization if (v_type == V_VARIABLE) last_entry->initializer= initializer; } @@ -979,7 +979,7 @@ private { BEGIN(SubprogBody); } <Parameterlist>{COMMA}|{BS} { current->args += yytext; - CommentInPrepass *c = locatePrepassComment(yyColNr-yyleng, yyColNr); + CommentInPrepass *c = locatePrepassComment(yyColNr-(int)yyleng, yyColNr); if (c!=NULL) { if(current->argList->count()>0) { current->argList->at(current->argList->count()-1)->docs = c->str; @@ -1029,7 +1029,7 @@ private { else { /* handle out of place !< comment as a normal comment */ - if (YY_START == String) { yyColNr -= yyleng; REJECT; } // "!" is ignored in strings + if (YY_START == String) { yyColNr -= (int)yyleng; REJECT; } // "!" is ignored in strings // skip comment line (without docu comments "!>" "!<" ) /* ignore further "!" and ignore comments in Strings */ if ((YY_START != StrIgnore) && (YY_START != String)) diff --git a/src/ftvhelp.cpp b/src/ftvhelp.cpp index 190f3e5..c41ab07 100644 --- a/src/ftvhelp.cpp +++ b/src/ftvhelp.cpp @@ -1296,7 +1296,11 @@ void FTVHelp::generateTreeViewScripts() if (f.open(IO_WriteOnly)) { FTextStream t(&f); - t << replaceColorMarkers(navtree_css); + t << substitute( + replaceColorMarkers(navtree_css), + "$width", + QCString().setNum(Config_getInt("TREEVIEW_WIDTH"))+"px" + ); } } } diff --git a/src/ftvhelp.h b/src/ftvhelp.h index d28b506..be60a60 100644 --- a/src/ftvhelp.h +++ b/src/ftvhelp.h @@ -53,7 +53,7 @@ class FTVHelp : public IndexIntf bool separateIndex, bool addToNavIndex, Definition *def); - void addIndexItem(Definition *,MemberDef *,const char *) {} + void addIndexItem(Definition *,MemberDef *,const char *,const char *) {} void addIndexFile(const char *) {} void addImageFile(const char *) {} void addStyleSheetFile(const char *) {} diff --git a/src/groupdef.cpp b/src/groupdef.cpp index 4f688f1..da35641 100644 --- a/src/groupdef.cpp +++ b/src/groupdef.cpp @@ -948,7 +948,7 @@ void GroupDef::writeDocumentation(OutputList &ol) } } - Doxygen::indexList.addIndexItem(this,0,title); + Doxygen::indexList.addIndexItem(this,0,0,title); if (!Config_getString("GENERATE_TAGFILE").isEmpty()) { diff --git a/src/header.html b/src/header.html index 78730af..0a0194b 100644 --- a/src/header.html +++ b/src/header.html @@ -3,6 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen $doxygenversion"/> <!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME--> <!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME--> <link href="$relpath$tabs.css" rel="stylesheet" type="text/css"/> diff --git a/src/header_html.h b/src/header_html.h index b8a5d81..505960a 100644 --- a/src/header_html.h +++ b/src/header_html.h @@ -3,6 +3,7 @@ "<head>\n" "<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n" "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n" +"<meta name=\"generator\" content=\"Doxygen $doxygenversion\"/>\n" "<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->\n" "<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->\n" "<link href=\"$relpath$tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n" diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp index 9ef5f5b..63cda59 100644 --- a/src/htmldocvisitor.cpp +++ b/src/htmldocvisitor.cpp @@ -29,7 +29,7 @@ #include "parserintf.h" #include "msc.h" #include "util.h" - +#include "vhdldocgen.h" static const int NUM_HTML_LIST_TYPES = 4; static const char types[][NUM_HTML_LIST_TYPES] = {"1", "a", "i", "A"}; @@ -476,13 +476,38 @@ void HtmlDocVisitor::visit(DocVerbatim *s) break; case DocVerbatim::Msc: { + forceEndParagraph(s); + +#if 0 // TODO: this should get its own command and not hijack the \msc + // command. This should also work for Latex and RTF output (or at + // least produce valid output there. + static bool optimizeForVhdl = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); + if (optimizeForVhdl) + { + if (VhdlDocGen::getFlowMember()) // use VHDL flow chart creator + { + QCString fname=FlowNode::convertNameToFileName(); + m_t << "<div align=\"left\">" << endl; + m_t << "<p>"; + m_t << "flowchart:" ; + m_t << "<a href=\""; + m_t << fname.data(); + m_t << ".svg\">"; + m_t << VhdlDocGen::getFlowMember()->name().data(); + m_t << "</a><br><br>"; + m_t << s->text().data(); + m_t << "</p>"; + VhdlDocGen::setFlowMember(NULL); + } + } +#endif static int mscindex = 1; QCString baseName(4096); baseName.sprintf("%s%d", (Config_getString("HTML_OUTPUT")+"/inline_mscgraph_").data(), mscindex++ - ); + ); QFile file(baseName+".msc"); if (!file.open(IO_WriteOnly)) { @@ -491,17 +516,16 @@ void HtmlDocVisitor::visit(DocVerbatim *s) QCString text = "msc {"; text+=s->text(); text+="}"; + file.writeBlock( text, text.length() ); file.close(); - forceEndParagraph(s); m_t << "<div align=\"center\">" << endl; writeMscFile(baseName+".msc",s->relPath(),s->context()); - m_t << "</div>" << endl; - forceStartParagraph(s); - if (Config_getBool("DOT_CLEANUP")) file.remove(); } + m_t << "</div>" << endl; + forceStartParagraph(s); break; } } @@ -702,7 +726,7 @@ void HtmlDocVisitor::visit(DocIndexEntry *e) // e->scope() ? e->scope()->name().data() : "<null>", // e->member() ? e->member()->name().data() : "<null>" // ); - Doxygen::indexList.addIndexItem(e->scope(),e->member(),e->entry()); + Doxygen::indexList.addIndexItem(e->scope(),e->member(),anchor,e->entry()); } void HtmlDocVisitor::visit(DocSimpleSectSep *) diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp index 93e5f3c..1c612ac 100644 --- a/src/htmlgen.cpp +++ b/src/htmlgen.cpp @@ -117,10 +117,10 @@ static unsigned char tab_a_png[36] = // normal tab background luma static unsigned char tab_b_png[36] = { - 221, 231, 238, 236, 233, 230, 228, 225, 224, - 221, 220, 218, 217, 216, 215, 214, 213, 212, - 212, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 204, 206, 208, 210, 214, 216, 203, 185 + 218, 228, 235, 233, 230, 227, 225, 222, 221, + 218, 217, 215, 214, 213, 212, 211, 210, 209, + 209, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 207, 209, 211, 213, 217, 219, 206, 188 }; // hovering tab background luma @@ -907,7 +907,7 @@ QCString substitute(const char *s,const char *src,const char *dst) { int count; for (count=0, p=s; (q=strstr(p,src))!=0; p=q+srcLen) count++; - resLen = p-s+strlen(p)+count*(dstLen-srcLen); + resLen = (int)(p-s)+strlen(p)+count*(dstLen-srcLen); } else // result has same size as s { @@ -939,7 +939,7 @@ QCString clearBlock(const char *s,const char *begin,const char *end) int resLen = 0; for (p=s; (q=strstr(p,begin))!=0; p=q+endLen) { - resLen+=q-p; + resLen+=(int)(q-p); p=q+beginLen; if ((q=strstr(p,end))==0) { @@ -1500,6 +1500,7 @@ void HtmlGenerator::writeSearchData(const char *dir) { FTextStream t(&f); QCString searchCss = replaceColorMarkers(search_styleSheet); + searchCss = substitute(searchCss,"$doxygenversion",versionString); if (Config_getBool("DISABLE_INDEX")) { // move up the search box if there are no tabs @@ -1513,29 +1514,21 @@ void HtmlGenerator::writeSearchData(const char *dir) void HtmlGenerator::writeStyleSheetFile(QFile &file) { FTextStream t(&file); - t << replaceColorMarkers(defaultStyleSheet); + t << replaceColorMarkers(substitute(defaultStyleSheet,"$doxygenversion",versionString)); } void HtmlGenerator::writeHeaderFile(QFile &file, const char * /*cssname*/) { FTextStream t(&file); + t << "<!-- HTML header for doxygen " << versionString << "-->" << endl; QCString contents(defaultHtmlHeader); t << contents; - -// QString relPathStr = "$relpath$"; - -// QCString id(file.name().utf8()); -// if (id.right(Doxygen::htmlFileExtension.length())==Doxygen::htmlFileExtension) -// { -// id=id.left(id.length()-Doxygen::htmlFileExtension.length()); -// } - -// t << substitute(defaultHtmlHeader, "$stylesheet", cssname); } void HtmlGenerator::writeFooterFile(QFile &file) { FTextStream t(&file); + t << "<!-- HTML footer for doxygen " << versionString << "-->" << endl; QCString contents(defaultHtmlFooter); t << contents; } @@ -1675,7 +1668,7 @@ void HtmlGenerator::writeStyleInfo(int part) //t << "H1 { text-align: center; border-width: thin none thin none;" << endl; //t << " border-style : double; border-color : blue; padding-left : 1em; padding-right : 1em }" << endl; - t << replaceColorMarkers(defaultStyleSheet); + t << replaceColorMarkers(substitute(defaultStyleSheet,"$doxygenversion",versionString)); endPlainFile(); Doxygen::indexList.addStyleSheetFile("doxygen.css"); } diff --git a/src/htmlgen.h b/src/htmlgen.h index a28aa8b..b520c9e 100644 --- a/src/htmlgen.h +++ b/src/htmlgen.h @@ -262,16 +262,21 @@ class HtmlGenerator : public OutputGenerator void endContents(); void writeNonBreakableSpace(int); - void startDescTable() - { t << "<table border=\"0\" cellspacing=\"2\" cellpadding=\"0\">" << endl; } + void startDescTable(const char *title) + //{ t << "<table border=\"0\" cellspacing=\"2\" cellpadding=\"0\">" << endl; } + { t << "<table class=\"fieldtable\">" << endl + << "<tr><th colspan=\"2\">" << title << "</th></tr>"; + } void endDescTable() { t << "</table>" << endl; } void startDescTableTitle() - { t << "<tr><td valign=\"top\"><em>"; } + //{ t << "<tr><td valign=\"top\"><em>"; } + { t << "<tr><td class=\"fieldname\"><em>"; } void endDescTableTitle() { t << "</em> </td>"; } void startDescTableData() - { t << "<td>" << endl; } + //{ t << "<td>" << endl; } + { t << "<td class=\"fielddoc\">" << endl; } void endDescTableData() { t << "</td></tr>" << endl; } diff --git a/src/htmlhelp.cpp b/src/htmlhelp.cpp index 744e86f..3df3774 100644 --- a/src/htmlhelp.cpp +++ b/src/htmlhelp.cpp @@ -621,7 +621,7 @@ QCString HtmlHelp::recode(const QCString &s) char *oPtr = output.data(); if (!portable_iconv(m_fromUtf8,&iPtr,&iLeft,&oPtr,&oLeft)) { - oSize -= oLeft; + oSize -= (int)oLeft; output.resize(oSize+1); output.at(oSize)='\0'; return output; @@ -692,7 +692,7 @@ void HtmlHelp::addContentsItem(bool isDir, void HtmlHelp::addIndexItem(Definition *context,MemberDef *md, - const char *word) + const char *sectionAnchor,const char *word) { if (md) { @@ -712,14 +712,14 @@ void HtmlHelp::addIndexItem(Definition *context,MemberDef *md, QCString level2 = md->name(); QCString contRef = separateMemberPages ? cfname : cfiname; QCString memRef = cfname; - QCString anchor = md->anchor(); + QCString anchor = sectionAnchor ? QCString(sectionAnchor) : md->anchor(); index->addItem(level1,level2,contRef,anchor,TRUE,FALSE); index->addItem(level2,level1,memRef,anchor,TRUE,TRUE); } else if (context) { QCString level1 = word ? QCString(word) : context->name(); - index->addItem(level1,0,context->getOutputFileBase(),0,TRUE,FALSE); + index->addItem(level1,0,context->getOutputFileBase(),sectionAnchor,TRUE,FALSE); } } diff --git a/src/htmlhelp.h b/src/htmlhelp.h index 524f8f1..8c0d317 100644 --- a/src/htmlhelp.h +++ b/src/htmlhelp.h @@ -79,7 +79,8 @@ class HtmlHelp : public IndexIntf bool separateIndex, bool addToNavIndex, Definition *def); - void addIndexItem(Definition *context,MemberDef *md,const char *title); + void addIndexItem(Definition *context,MemberDef *md, + const char *sectionAnchor, const char *title); void addIndexFile(const char *name); void addImageFile(const char *); void addStyleSheetFile(const char *) {} diff --git a/src/index.cpp b/src/index.cpp index 0e5294f..6424e44 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -1442,12 +1442,13 @@ static void writeNamespaceTree(NamespaceSDict *nsDict,FTVHelp *ftv, { bool hasChildren = containsVisibleChild(nd,showClasses); - + bool isLinkable = nd->isLinkableInProject(); + QCString ref; QCString file; - if (nd->isLinkableInProject()) + if (isLinkable) { - ref = nd->getReference(); + ref = nd->getReference(); file = nd->getOutputFileBase(); if (nd->getLanguage()==SrcLangExt_VHDL) // UGLY HACK { @@ -1455,7 +1456,7 @@ static void writeNamespaceTree(NamespaceSDict *nsDict,FTVHelp *ftv, } } - if (nd->isLinkable() || hasChildren) + if (isLinkable || hasChildren) { ftv->addContentsItem(hasChildren,nd->localName(),ref,file,0,FALSE,TRUE,nd); @@ -3970,7 +3971,7 @@ static void writeIndex(OutputList &ol) { Doxygen::indexList.addContentsItem(Doxygen::mainPage->hasSubPages(),title,0,indexName,0,Doxygen::mainPage->hasSubPages(),TRUE); } - if (Doxygen::mainPage->hasSubPages()) + if (Doxygen::mainPage->hasSubPages() || Doxygen::mainPage->hasSections()) { writePages(Doxygen::mainPage,0); } diff --git a/src/index.h b/src/index.h index 8eb93ce..122a9bb 100644 --- a/src/index.h +++ b/src/index.h @@ -39,7 +39,8 @@ class IndexIntf virtual void addContentsItem(bool isDir, const char *name, const char *ref, const char *file, const char *anchor, bool separateIndex, bool addToNavIndex,Definition *def) = 0; - virtual void addIndexItem(Definition *context,MemberDef *md,const char *title) = 0; + virtual void addIndexItem(Definition *context,MemberDef *md, + const char *sectionAnchor,const char *title) = 0; virtual void addIndexFile(const char *name) = 0; virtual void addImageFile(const char *name) = 0; virtual void addStyleSheetFile(const char *name) = 0; @@ -139,9 +140,9 @@ class IndexList : public IndexIntf Definition *def=0) { if (m_enabled) foreach<bool,const char *,const char *,const char *,const char*,bool,bool,Definition *> (&IndexIntf::addContentsItem,isDir,name,ref,file,anchor,separateIndex,addToNavIndex,def); } - void addIndexItem(Definition *context,MemberDef *md,const char *title=0) - { if (m_enabled) foreach<Definition *,MemberDef *> - (&IndexIntf::addIndexItem,context,md,title); } + void addIndexItem(Definition *context,MemberDef *md,const char *sectionAnchor=0,const char *title=0) + { if (m_enabled) foreach<Definition *,MemberDef *,const char *,const char *> + (&IndexIntf::addIndexItem,context,md,sectionAnchor,title); } void addIndexFile(const char *name) { if (m_enabled) foreach<const char *>(&IndexIntf::addIndexFile,name); } void addImageFile(const char *name) diff --git a/src/latexgen.cpp b/src/latexgen.cpp index a0188c8..d57764e 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -954,6 +954,7 @@ static void writeDefaultFooter(FTextStream &t) void LatexGenerator::writeHeaderFile(QFile &f) { FTextStream t(&f); + t << "% Latex header for doxygen " << versionString << endl; writeDefaultHeaderPart1(t); t << "Your title here"; writeDefaultHeaderPart2(t); @@ -964,12 +965,14 @@ void LatexGenerator::writeHeaderFile(QFile &f) void LatexGenerator::writeFooterFile(QFile &f) { FTextStream t(&f); + t << "% Latex footer for doxygen " << versionString << endl; writeDefaultFooter(t); } void LatexGenerator::writeStyleSheetFile(QFile &f) { FTextStream t(&f); + t << "% stylesheet for doxygen " << versionString << endl; writeDefaultStyleSheetPart1(t); QCString &projectName = Config_getString("PROJECT_NAME"); diff --git a/src/latexgen.h b/src/latexgen.h index f2cc193..1fe92dd 100644 --- a/src/latexgen.h +++ b/src/latexgen.h @@ -198,10 +198,15 @@ class LatexGenerator : public OutputGenerator void endContents() {} void writeNonBreakableSpace(int); - void startDescTable() - { t << "\\begin{description}" << endl; } + void startDescTable(const char *title) + { startSimpleSect(EnumValues,0,0,title); + startDescForItem(); + t << "\\begin{description}" << endl; } void endDescTable() - { t << "\\end{description}" << endl; } + { t << "\\end{description}" << endl; + endDescForItem(); + endSimpleSect(); + } void startDescTableTitle() { t << "\\item[{\\em " << endl; } void endDescTableTitle() diff --git a/src/layout.cpp b/src/layout.cpp index fa4ab42..adfb4e8 100644 --- a/src/layout.cpp +++ b/src/layout.cpp @@ -22,6 +22,7 @@ #include "vhdldocgen.h" #include "util.h" #include "doxygen.h" +#include "version.h" #include <assert.h> #include <qxml.h> @@ -1372,7 +1373,7 @@ void writeDefaultLayoutFile(const char *fileName) return; } QTextStream t(&f); - t << layout_default; + t << substitute(layout_default,"$doxygenversion",versionString); } //---------------------------------------------------------------------------------- diff --git a/src/layout_default.h b/src/layout_default.h index 0950a94..d2dfce6 100644 --- a/src/layout_default.h +++ b/src/layout_default.h @@ -1,4 +1,5 @@ "<doxygenlayout version=\"1.0\">\n" +" <!-- Generated by doxygen $doxygenversion -->\n" " <!-- Navigation index tabs for HTML output -->\n" " <navindex>\n" " <tab type=\"mainpage\" visible=\"yes\" title=\"\"/>\n" diff --git a/src/layout_default.xml b/src/layout_default.xml index 7127664..b0bbec4 100644 --- a/src/layout_default.xml +++ b/src/layout_default.xml @@ -1,4 +1,5 @@ <doxygenlayout version="1.0"> + <!-- Generated by doxygen $doxygenversion --> <!-- Navigation index tabs for HTML output --> <navindex> <tab type="mainpage" visible="yes" title=""/> diff --git a/src/lodepng.cpp b/src/lodepng.cpp index 638dbf4..df8378e 100644 --- a/src/lodepng.cpp +++ b/src/lodepng.cpp @@ -1765,13 +1765,13 @@ static unsigned Crc32_crc_table[256]; /*Make the table for a fast CRC.*/ static void Crc32_make_crc_table(void) { - unsigned c, k, n; + unsigned int c, k, n; for(n = 0; n < 256; n++) { c = n; for(k = 0; k < 8; k++) { - if(c & 1) c = 0xedb88320L ^ (c >> 1); + if(c & 1) c = (unsigned int)(0xedb88320L ^ (c >> 1)); else c = c >> 1; } Crc32_crc_table[n] = c; @@ -1782,9 +1782,9 @@ static void Crc32_make_crc_table(void) /*Update a running CRC with the bytes buf[0..len-1]--the CRC should be initialized to all 1's, and the transmitted value is the 1's complement of the final running CRC (see the crc() routine below).*/ -static unsigned Crc32_update_crc(const unsigned char* buf, unsigned crc, size_t len) +static unsigned Crc32_update_crc(const unsigned char* buf, unsigned int crc, size_t len) { - unsigned c = crc; + unsigned int c = crc; size_t n; if(!Crc32_crc_table_computed) Crc32_make_crc_table(); @@ -1798,7 +1798,7 @@ static unsigned Crc32_update_crc(const unsigned char* buf, unsigned crc, size_t /*Return the CRC of the bytes buf[0..len-1].*/ static unsigned Crc32_crc(const unsigned char* buf, size_t len) { - return Crc32_update_crc(buf, 0xffffffffL, len) ^ 0xffffffffL; + return Crc32_update_crc(buf, 0xffffffffu, len) ^ 0xffffffffu; } /* ////////////////////////////////////////////////////////////////////////// */ diff --git a/src/mangen.h b/src/mangen.h index e2d0965..a4af56c 100644 --- a/src/mangen.h +++ b/src/mangen.h @@ -195,8 +195,9 @@ class ManGenerator : public OutputGenerator void endContents() {} void writeNonBreakableSpace(int n) { int i; for (i=0;i<n;i++) t << " "; } - void startDescTable() {} - void endDescTable() {} + void startDescTable(const char *t) + { startSimpleSect(EnumValues,0,0,t); startDescForItem(); } + void endDescTable() { endDescForItem(); endSimpleSect(); } void startDescTableTitle() { startItemListItem(); startBold(); startEmphasis(); endItemListItem(); } void endDescTableTitle() { endEmphasis(); endBold(); } void startDescTableData() { t << endl; firstCol=TRUE; } diff --git a/src/memberdef.cpp b/src/memberdef.cpp index f9cae59..fe55168 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -499,6 +499,8 @@ class MemberDefImpl // FALSE => block is put before declaration. ClassDef *category; MemberDef *categoryRelation; + + bool tagDataWritten; }; MemberDefImpl::MemberDefImpl() : @@ -627,6 +629,7 @@ void MemberDefImpl::init(Definition *def, hasDocumentedReturnType = FALSE; docProvider = 0; isDMember = def->getDefFileName().right(2).lower()==".d"; + tagDataWritten = FALSE; } @@ -1336,7 +1339,7 @@ void MemberDef::writeDeclaration(OutputList &ol, bool inGroup,ClassDef *inheritedFrom,const char *inheritId ) { - //printf("%s MemberDef::writeDeclaration() inGroup=%d\n",name().data(),inGroup); + //printf("%s MemberDef::writeDeclaration() inGroup=%d\n",qualifiedName().data(),inGroup); // hide enum value, since they appear already as part of the enum, unless they // are explicitly grouped. @@ -1350,60 +1353,7 @@ void MemberDef::writeDeclaration(OutputList &ol, ASSERT (cd!=0 || nd!=0 || fd!=0 || gd!=0); // member should belong to something if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else d=gd; - // write tag file information of this member - if (!Config_getString("GENERATE_TAGFILE").isEmpty() && !isReference()) - { - Doxygen::tagFile << " <member kind=\""; - switch (m_impl->mtype) - { - case Define: Doxygen::tagFile << "define"; break; - case EnumValue: Doxygen::tagFile << "enumvalue"; break; - case Property: Doxygen::tagFile << "property"; break; - case Event: Doxygen::tagFile << "event"; break; - case Variable: Doxygen::tagFile << "variable"; break; - case Typedef: Doxygen::tagFile << "typedef"; break; - case Enumeration: Doxygen::tagFile << "enumeration"; break; - case Function: Doxygen::tagFile << "function"; break; - case Signal: Doxygen::tagFile << "signal"; break; - //case Prototype: Doxygen::tagFile << "prototype"; break; - case Friend: Doxygen::tagFile << "friend"; break; - case DCOP: Doxygen::tagFile << "dcop"; break; - case Slot: Doxygen::tagFile << "slot"; break; - } - if (m_impl->prot!=Public) - { - Doxygen::tagFile << "\" protection=\""; - if (m_impl->prot==Protected) Doxygen::tagFile << "protected"; - else if (m_impl->prot==Package) Doxygen::tagFile << "package"; - else /* Private */ Doxygen::tagFile << "private"; - } - if (m_impl->virt!=Normal) - { - Doxygen::tagFile << "\" virtualness=\""; - if (m_impl->virt==Virtual) Doxygen::tagFile << "virtual"; - else /* Pure */ Doxygen::tagFile << "pure"; - } - if (isStatic()) - { - Doxygen::tagFile << "\" static=\"yes"; - } - Doxygen::tagFile << "\">" << endl; - Doxygen::tagFile << " <type>" << convertToXML(typeString()) << "</type>" << endl; - Doxygen::tagFile << " <name>" << convertToXML(name()) << "</name>" << endl; - Doxygen::tagFile << " <anchorfile>" << convertToXML(getOutputFileBase()+Doxygen::htmlFileExtension) << "</anchorfile>" << endl; - Doxygen::tagFile << " <anchor>" << convertToXML(anchor()) << "</anchor>" << endl; - Doxygen::tagFile << " <arglist>" << convertToXML(argsString()) << "</arglist>" << endl; - writeDocAnchorsToTagFile(); - Doxygen::tagFile << " </member>" << endl; - } - - // write search index info - if (Doxygen::searchIndex && isLinkableInProject()) - { - Doxygen::searchIndex->setCurrentDoc(this,anchor(),FALSE); - Doxygen::searchIndex->addWord(localName(),TRUE); - Doxygen::searchIndex->addWord(qualifiedName(),FALSE); - } + _writeTagData(); QCString cname = d->name(); QCString cdname = d->displayName(); @@ -2262,9 +2212,9 @@ void MemberDef::_writeEnumValues(OutputList &ol,Definition *container, { if (first) { - ol.startSimpleSect(BaseOutputDocInterface::EnumValues,0,0,theTranslator->trEnumerationValues()+": "); - ol.startDescForItem(); - ol.startDescTable(); + //ol.startSimpleSect(BaseOutputDocInterface::EnumValues,0,0,theTranslator->trEnumerationValues()+": "); + //ol.startDescForItem(); + ol.startDescTable(theTranslator->trEnumerationValues()); } ol.addIndexItem(fmd->name(),ciname); @@ -2294,9 +2244,14 @@ void MemberDef::_writeEnumValues(OutputList &ol,Definition *container, //ol.newParagraph(); ol.startDescTableData(); - if (!fmd->briefDescription().isEmpty()) + bool hasBrief = !fmd->briefDescription().isEmpty(); + bool hasDetails = !fmd->documentation().isEmpty(); + + if (hasBrief) { - ol.parseDoc(fmd->briefFile(),fmd->briefLine(),getOuterScope()?getOuterScope():container,fmd,fmd->briefDescription(),TRUE,FALSE); + ol.parseDoc(fmd->briefFile(),fmd->briefLine(), + getOuterScope()?getOuterScope():container, + fmd,fmd->briefDescription(),TRUE,FALSE); } // FIXME:PARA //if (!fmd->briefDescription().isEmpty() && @@ -2304,9 +2259,11 @@ void MemberDef::_writeEnumValues(OutputList &ol,Definition *container, //{ // ol.newParagraph(); //} - if (!fmd->documentation().isEmpty()) + if (hasDetails) { - ol.parseDoc(fmd->docFile(),fmd->docLine(),getOuterScope()?getOuterScope():container,fmd,fmd->documentation()+"\n",TRUE,FALSE); + ol.parseDoc(fmd->docFile(),fmd->docLine(), + getOuterScope()?getOuterScope():container, + fmd,fmd->documentation()+"\n",TRUE,FALSE); } ol.endDescTableData(); } @@ -2317,9 +2274,9 @@ void MemberDef::_writeEnumValues(OutputList &ol,Definition *container, { //ol.endItemList(); ol.endDescTable(); - ol.endDescForItem(); - ol.endSimpleSect(); - ol.writeChar('\n'); + //ol.endDescForItem(); + //ol.endSimpleSect(); + //ol.writeChar('\n'); } } } @@ -2430,7 +2387,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),this,ldef.left(i)); vmd->writeEnumDeclaration(ol,getClassDef(),getNamespaceDef(),getFileDef(),getGroupDef()); linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),this,ldef.right(ldef.length()-i-l)); - + found=TRUE; } } @@ -3376,6 +3333,81 @@ Specifier MemberDef::virtualness(int count) const return v; } +void MemberDef::_writeTagData() +{ + if (m_impl->tagDataWritten) return; + static bool generateTagFile = !Config_getString("GENERATE_TAGFILE").isEmpty(); + // write tag file information of this member + if (generateTagFile && isLinkableInProject()) + { + Doxygen::tagFile << " <member kind=\""; + switch (m_impl->mtype) + { + case Define: Doxygen::tagFile << "define"; break; + case EnumValue: Doxygen::tagFile << "enumvalue"; break; + case Property: Doxygen::tagFile << "property"; break; + case Event: Doxygen::tagFile << "event"; break; + case Variable: Doxygen::tagFile << "variable"; break; + case Typedef: Doxygen::tagFile << "typedef"; break; + case Enumeration: Doxygen::tagFile << "enumeration"; break; + case Function: Doxygen::tagFile << "function"; break; + case Signal: Doxygen::tagFile << "signal"; break; + case Friend: Doxygen::tagFile << "friend"; break; + case DCOP: Doxygen::tagFile << "dcop"; break; + case Slot: Doxygen::tagFile << "slot"; break; + } + if (m_impl->prot!=Public) + { + Doxygen::tagFile << "\" protection=\""; + if (m_impl->prot==Protected) Doxygen::tagFile << "protected"; + else if (m_impl->prot==Package) Doxygen::tagFile << "package"; + else /* Private */ Doxygen::tagFile << "private"; + } + if (m_impl->virt!=Normal) + { + Doxygen::tagFile << "\" virtualness=\""; + if (m_impl->virt==Virtual) Doxygen::tagFile << "virtual"; + else /* Pure */ Doxygen::tagFile << "pure"; + } + if (isStatic()) + { + Doxygen::tagFile << "\" static=\"yes"; + } + Doxygen::tagFile << "\">" << endl; + Doxygen::tagFile << " <type>" << convertToXML(typeString()) << "</type>" << endl; + Doxygen::tagFile << " <name>" << convertToXML(name()) << "</name>" << endl; + Doxygen::tagFile << " <anchorfile>" << convertToXML(getOutputFileBase()+Doxygen::htmlFileExtension) << "</anchorfile>" << endl; + Doxygen::tagFile << " <anchor>" << convertToXML(anchor()) << "</anchor>" << endl; + Doxygen::tagFile << " <arglist>" << convertToXML(argsString()) << "</arglist>" << endl; + writeDocAnchorsToTagFile(); + Doxygen::tagFile << " </member>" << endl; + _addToSearchIndex(); + } + MemberList *fmdl=m_impl->enumFields; + if (fmdl) + { + MemberListIterator mli(*fmdl); + MemberDef *fmd; + for (mli.toFirst();(fmd=mli.current());++mli) + { + if (!fmd->isReference()) + { + if (!Config_getString("GENERATE_TAGFILE").isEmpty()) + { + Doxygen::tagFile << " <member kind=\"enumvalue\">" << endl; + Doxygen::tagFile << " <name>" << convertToXML(fmd->name()) << "</name>" << endl; + Doxygen::tagFile << " <anchorfile>" << convertToXML(getOutputFileBase()+Doxygen::htmlFileExtension) << "</anchorfile>" << endl; + Doxygen::tagFile << " <anchor>" << convertToXML(fmd->anchor()) << "</anchor>" << endl; + Doxygen::tagFile << " <arglist>" << convertToXML(fmd->argsString()) << "</arglist>" << endl; + Doxygen::tagFile << " </member>" << endl; + fmd->_addToSearchIndex(); + } + } + } + } + m_impl->tagDataWritten=TRUE; +} + void MemberDef::_computeIsConstructor() { KEEP_RESIDENT_DURING_CALL; @@ -3503,15 +3535,7 @@ void MemberDef::writeEnumDeclaration(OutputList &typeDecl, { if (isLinkableInProject() || hasDocumentedEnumValues()) { - if (!Config_getString("GENERATE_TAGFILE").isEmpty() && !isReference()) - { - Doxygen::tagFile << " <member kind=\"enumeration\">" << endl; - Doxygen::tagFile << " <name>" << convertToXML(name()) << "</name>" << endl; - Doxygen::tagFile << " <anchorfile>" << convertToXML(getOutputFileBase()+Doxygen::htmlFileExtension) << "</anchorfile>" << endl; - Doxygen::tagFile << " <anchor>" << convertToXML(anchor()) << "</anchor>" << endl; - Doxygen::tagFile << " <arglist>" << convertToXML(argsString()) << "</arglist>" << endl; - Doxygen::tagFile << " </member>" << endl; - } + _writeTagData(); writeLink(typeDecl,cd,nd,fd,gd); } else @@ -3558,15 +3582,7 @@ void MemberDef::writeEnumDeclaration(OutputList &typeDecl, if (fmd->hasDocumentation()) // enum value has docs { - if (!Config_getString("GENERATE_TAGFILE").isEmpty() && !fmd->isReference()) - { - Doxygen::tagFile << " <member kind=\"enumvalue\">" << endl; - Doxygen::tagFile << " <name>" << convertToXML(fmd->name()) << "</name>" << endl; - Doxygen::tagFile << " <anchorfile>" << convertToXML(getOutputFileBase()+Doxygen::htmlFileExtension) << "</anchorfile>" << endl; - Doxygen::tagFile << " <anchor>" << convertToXML(fmd->anchor()) << "</anchor>" << endl; - Doxygen::tagFile << " <arglist>" << convertToXML(fmd->argsString()) << "</arglist>" << endl; - Doxygen::tagFile << " </member>" << endl; - } + fmd->_writeTagData(); fmd->writeLink(typeDecl,cd,nd,fd,gd); } else // no docs for this enum value @@ -4759,6 +4775,7 @@ void MemberDef::flushToDisk() const marshalBool (Doxygen::symbolStorage,m_impl->docsForDefinition); marshalObjPointer (Doxygen::symbolStorage,m_impl->category); marshalObjPointer (Doxygen::symbolStorage,m_impl->categoryRelation); + marshalBool (Doxygen::symbolStorage,m_impl->tagDataWritten); marshalUInt(Doxygen::symbolStorage,END_MARKER); // function doesn't modify the object conceptually but compiler doesn't know this. @@ -4862,6 +4879,7 @@ void MemberDef::loadFromDisk() const m_impl->docsForDefinition = unmarshalBool (Doxygen::symbolStorage); m_impl->category = (ClassDef*)unmarshalObjPointer (Doxygen::symbolStorage); m_impl->categoryRelation = (MemberDef*)unmarshalObjPointer (Doxygen::symbolStorage); + m_impl->tagDataWritten = unmarshalBool (Doxygen::symbolStorage); marker = unmarshalUInt(Doxygen::symbolStorage); assert(marker==END_MARKER); @@ -4956,6 +4974,23 @@ QCString MemberDef::displayName(bool) const return Definition::name(); } +void MemberDef::_addToSearchIndex() +{ + // write search index info + if (Doxygen::searchIndex && isLinkableInProject()) + { + Doxygen::searchIndex->setCurrentDoc(this,anchor(),FALSE); + QCString ln=localName(),qn=qualifiedName(); + Doxygen::searchIndex->addWord(ln,TRUE); + if (ln!=qn) + { + Doxygen::searchIndex->addWord(qn,TRUE); + } + } +} + + + //---------------- static void transferArgumentDocumentation(ArgumentList *decAl,ArgumentList *defAl) diff --git a/src/memberdef.h b/src/memberdef.h index 8850035..e1db828 100644 --- a/src/memberdef.h +++ b/src/memberdef.h @@ -397,6 +397,8 @@ class MemberDef : public Definition const QCString &cfname,const QCString &ciname, const QCString &cname); void _writeCategoryRelation(OutputList &ol); + void _writeTagData(); + void _addToSearchIndex(); static int s_indentLevel; // disable copying of member defs diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp index 2512502..0bb63a7 100644 --- a/src/namespacedef.cpp +++ b/src/namespacedef.cpp @@ -878,7 +878,7 @@ void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,bool loca name = nd->displayName(); } ol.writeObjectLink(nd->getReference(),nd->getOutputFileBase(),0,name); - if (!Config_getString("GENERATE_TAGFILE").isEmpty() && !nd->isReference()) + if (!Config_getString("GENERATE_TAGFILE").isEmpty() && nd->isLinkableInProject()) { Doxygen::tagFile << " <namespace>" << convertToXML(nd->name()) << "</namespace>" << endl; } diff --git a/src/navtree.css b/src/navtree.css index eb2aa70..a2ae30a 100644 --- a/src/navtree.css +++ b/src/navtree.css @@ -86,7 +86,7 @@ display:block; position: absolute; left: 0px; - width: 300px; + width: $width; } .ui-resizable .ui-resizable-handle { diff --git a/src/navtree_css.h b/src/navtree_css.h index 00a889f..6e42061 100644 --- a/src/navtree_css.h +++ b/src/navtree_css.h @@ -86,7 +86,7 @@ " display:block;\n" " position: absolute;\n" " left: 0px;\n" -" width: 300px;\n" +" width: $width;\n" "}\n" "\n" ".ui-resizable .ui-resizable-handle {\n" diff --git a/src/objcache.cpp b/src/objcache.cpp index a08d649..4258397 100644 --- a/src/objcache.cpp +++ b/src/objcache.cpp @@ -184,7 +184,7 @@ unsigned int ObjCache::hash(void *addr) key ^= (key >> 15); key += ~(key << 27); key ^= (key >> 31); - return key & (m_size-1); + return (unsigned int)(key & (m_size-1)); } else { @@ -196,7 +196,7 @@ unsigned int ObjCache::hash(void *addr) key ^= (key >> 6); key += ~(key << 11); key ^= (key >> 16); - return key & (m_size-1); + return (unsigned int)(key & (m_size-1)); } } diff --git a/src/outputgen.h b/src/outputgen.h index e9e1d25..be9c208 100644 --- a/src/outputgen.h +++ b/src/outputgen.h @@ -245,7 +245,7 @@ class BaseOutputDocInterface : public CodeOutputInterface virtual void addIndexItem(const char *s1,const char *s2) = 0; virtual void writeNonBreakableSpace(int) = 0; - virtual void startDescTable() = 0; + virtual void startDescTable(const char *title) = 0; virtual void endDescTable() = 0; virtual void startDescTableTitle() = 0; virtual void endDescTableTitle() = 0; diff --git a/src/outputlist.h b/src/outputlist.h index 72662a5..784b16b 100644 --- a/src/outputlist.h +++ b/src/outputlist.h @@ -363,8 +363,8 @@ class OutputList : public OutputDocInterface { forall(&OutputGenerator::endContents); } void writeNonBreakableSpace(int num) { forall(&OutputGenerator::writeNonBreakableSpace,num); } - void startDescTable() - { forall(&OutputGenerator::startDescTable); } + void startDescTable(const char *title) + { forall(&OutputGenerator::startDescTable,title); } void endDescTable() { forall(&OutputGenerator::endDescTable); } void startDescTableTitle() diff --git a/src/pagedef.cpp b/src/pagedef.cpp index 1442ce1..0d98184 100644 --- a/src/pagedef.cpp +++ b/src/pagedef.cpp @@ -184,7 +184,7 @@ void PageDef::writeDocumentation(OutputList &ol) } } - Doxygen::indexList.addIndexItem(this,0,filterTitle(title())); + Doxygen::indexList.addIndexItem(this,0,0,filterTitle(title())); } void PageDef::writePageDocumentation(OutputList &ol) diff --git a/src/portable.cpp b/src/portable.cpp index 49f7bf1..bb13ddb 100644 --- a/src/portable.cpp +++ b/src/portable.cpp @@ -198,7 +198,8 @@ void portable_setenv(const char *name,const char *value) { for (ep = environ; *ep; ++ep) { - if (!strncmp (*ep, name, namelen) && (*ep)[namelen] == '=') + if (!strncmp (*ep, name, (uint)namelen) && + (*ep)[namelen] == '=') break; else ++size; @@ -281,7 +282,7 @@ void portable_unsetenv(const char *variable) ep = environ; while (*ep != NULL) { - if (!strncmp(*ep, variable, len) && (*ep)[len]=='=') + if (!strncmp(*ep, variable, (uint)len) && (*ep)[len]=='=') { /* Found it. Remove this pointer by moving later ones back. */ char **dp = ep; @@ -51,7 +51,11 @@ #include "entry.h" #define YY_NEVER_INTERACTIVE 1 - +enum GuardType +{ + Guard_Cond, + Guard_CondNot +}; struct FileState { @@ -356,6 +360,7 @@ static bool g_isSource; static bool g_lexInit = FALSE; +static GuardType guardType; // kind of guard for conditional section //DefineDict* getGlobalDefineDict() //{ // return g_globalDefineDict; @@ -1651,9 +1656,19 @@ static void readIncludeFile(const QCString &inc) static void startCondSection(const char *sectId) { g_condStack.push(new bool(g_skip)); - if (Config_getList("ENABLED_SECTIONS").find(sectId)==-1) + if (guardType == Guard_Cond) { - g_skip=TRUE; + if (Config_getList("ENABLED_SECTIONS").find(sectId)==-1) + { + g_skip=TRUE; + } + } + else if (guardType == Guard_CondNot) + { + if (Config_getList("ENABLED_SECTIONS").find(sectId)!=-1) + { + g_skip=TRUE; + } } } @@ -1779,12 +1794,12 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) } <Start>^{B}*"#" { BEGIN(Command); } <Start>^{B}*/[^#] { - outputArray(yytext,yyleng); + outputArray(yytext,(int)yyleng); BEGIN(CopyLine); } <Start>^{B}*[_A-Z][_A-Z0-9]*{B}*"("[^\)\n]*")"/{BN}{1,10}*[:{] { // constructors? int i; - for (i=yyleng-1;i>=0;i--) + for (i=(int)yyleng-1;i>=0;i--) { unput(yytext[i]); } @@ -1814,7 +1829,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) else // don't skip { int i; - for (i=yyleng-1;i>=0;i--) + for (i=(int)yyleng-1;i>=0;i--) { unput(yytext[i]); } @@ -1824,7 +1839,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) <CopyLine>"extern"{BN}{0,80}"\"C\""*{BN}{0,80}"{" { QCString text=yytext; g_yyLineNr+=text.contains('\n'); - outputArray(yytext,yyleng); + outputArray(yytext,(int)yyleng); } <CopyLine>"{" { // count brackets inside the main file if (g_includeStack.isEmpty()) @@ -1841,23 +1856,23 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) outputChar(*yytext); } <CopyLine>"'"\\[0-7]{1,3}"'" { - outputArray(yytext,yyleng); + outputArray(yytext,(int)yyleng); } <CopyLine>"'"\\."'" { - outputArray(yytext,yyleng); + outputArray(yytext,(int)yyleng); } <CopyLine>"'"."'" { - outputArray(yytext,yyleng); + outputArray(yytext,(int)yyleng); } <CopyLine>\" { outputChar(*yytext); BEGIN( CopyString ); } <CopyString>[^\"\\\r\n]+ { - outputArray(yytext,yyleng); + outputArray(yytext,(int)yyleng); } <CopyString>\\. { - outputArray(yytext,yyleng); + outputArray(yytext,(int)yyleng); } <CopyString>\" { outputChar(*yytext); @@ -1897,7 +1912,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) } else { - outputArray(yytext,yyleng); + outputArray(yytext,(int)yyleng); } } <CopyLine>{ID} { @@ -1915,7 +1930,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) } else { - outputArray(yytext,yyleng); + outputArray(yytext,(int)yyleng); } } <CopyLine>"\\"\r?/\n { // strip line continuation characters @@ -2404,7 +2419,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) BEGIN(CopyCComment); } <DefineText>"//"[!/]? { - outputArray(yytext,yyleng); + outputArray(yytext,(int)yyleng); g_lastCPPContext=YY_START; g_defLitText+=' '; BEGIN(SkipCPPComment); @@ -2424,21 +2439,21 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) } } <SkipCComment>"//"("/")* { - outputArray(yytext,yyleng); + outputArray(yytext,(int)yyleng); } <SkipCComment>"/*" { outputChar('/');outputChar('*'); //g_commentCount++; } <SkipCComment>[\\@][\\@]("f{"|"f$"|"f[") { - outputArray(yytext,yyleng); + outputArray(yytext,(int)yyleng); } <SkipCComment>[\\@][\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"rtfonly"|"manonly"|"dot"|"code"){BN}+ { - outputArray(yytext,yyleng); + outputArray(yytext,(int)yyleng); g_yyLineNr+=QCString(yytext).contains('\n'); } <SkipCComment>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"rtfonly"|"manonly"|"dot"|"code"){BN}+ { - outputArray(yytext,yyleng); + outputArray(yytext,(int)yyleng); g_yyLineNr+=QCString(yytext).contains('\n'); if (yytext[1]=='f') { @@ -2451,18 +2466,26 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) BEGIN(SkipVerbatim); } <SkipCComment,SkipCPPComment>[\\@]"cond"[ \t]+ { // conditional section + guardType = Guard_Cond; g_condCtx = YY_START; outputArray(yytext,yyleng); BEGIN(CondLine); } +<SkipCComment,SkipCPPComment>[\\@]"condnot"[ \t]+ { // conditional section + guardType = Guard_CondNot; + g_condCtx = YY_START; + outputArray(yytext,(int)yyleng); + BEGIN(CondLine); + } <CondLine>[a-z_A-Z][a-z_A-Z0-9.\-]* { startCondSection(yytext); - outputArray(yytext,yyleng); + outputArray(yytext,(int)yyleng); BEGIN(g_condCtx); } <SkipCComment,SkipCPPComment>[\\@]"cond"[ \t\r]*/\n { + guardType = Guard_Cond; g_condCtx = YY_START; - outputArray(yytext,yyleng); + outputArray(yytext,(int)yyleng); } <CondLine>. { unput(*yytext); @@ -2470,11 +2493,11 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) BEGIN(g_condCtx); } <SkipCComment,SkipCPPComment>[\\@]"endcond"/[^a-z_A-Z0-9] { - outputArray(yytext,yyleng); + outputArray(yytext,(int)yyleng); endCondSection(); } <SkipVerbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode"|"f$"|"f]"|"f}") { /* end of verbatim block */ - outputArray(yytext,yyleng); + outputArray(yytext,(int)yyleng); if (yytext[1]=='f' && g_blockName=="f") { BEGIN(SkipCComment); @@ -2485,10 +2508,10 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) } } <SkipVerbatim>"*/"|"/*" { - outputArray(yytext,yyleng); + outputArray(yytext,(int)yyleng); } <SkipCComment,SkipVerbatim>[^*\\@\x06\n\/]+ { - outputArray(yytext,yyleng); + outputArray(yytext,(int)yyleng); } <SkipCComment,SkipVerbatim>\n { g_yyLineNr++; @@ -2528,7 +2551,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) <RemoveCComment>\n { g_yyLineNr++; outputChar('\n'); } <RemoveCComment>. <SkipCPPComment>[^\n\/\\@]+ { - outputArray(yytext,yyleng); + outputArray(yytext,(int)yyleng); } <SkipCPPComment,RemoveCPPComment>\n { unput(*yytext); @@ -2541,7 +2564,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) outputChar('/');outputChar('/'); } <SkipCPPComment>[^\x06\@\\\n]+ { - outputArray(yytext,yyleng); + outputArray(yytext,(int)yyleng); } <SkipCPPComment>. { outputChar(*yytext); @@ -2715,14 +2738,14 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) } <*>"/*"/"*/" | <*>"/*"[*]? { - outputArray(yytext,yyleng); + outputArray(yytext,(int)yyleng); g_lastCContext=YY_START; g_commentCount=1; if (yyleng==3) g_lastGuardName.resize(0); // reset guard in case the #define is documented! BEGIN(SkipCComment); } <*>"//"[/]? { - outputArray(yytext,yyleng); + outputArray(yytext,(int)yyleng); g_lastCPPContext=YY_START; if (yyleng==3) g_lastGuardName.resize(0); // reset guard in case the #define is documented! BEGIN(SkipCPPComment); diff --git a/src/pycode.l b/src/pycode.l index 035aa96..319712e 100644 --- a/src/pycode.l +++ b/src/pycode.l @@ -1217,7 +1217,7 @@ TARGET ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUT // should be improved. // (translate tabs to space, etc) codifyLines(yytext); - adjustScopesAndSuites(yyleng); + adjustScopesAndSuites((int)yyleng); } "\n"|({BB}"\n") { diff --git a/src/pyscanner.l b/src/pyscanner.l index b0486e4..ba19fee 100644 --- a/src/pyscanner.l +++ b/src/pyscanner.l @@ -787,7 +787,7 @@ STARTDOCSYMS "##" if (computeIndent(&yytext[1])<=g_indent) { int i; - for (i=yyleng-1;i>=0;i--) + for (i=(int)yyleng-1;i>=0;i--) { unput(yytext[i]); } @@ -805,7 +805,7 @@ STARTDOCSYMS "##" if (computeIndent(&yytext[1])<=g_indent) { int i; - for (i=yyleng-1;i>=0;i--) + for (i=(int)yyleng-1;i>=0;i--) { unput(yytext[i]); } diff --git a/src/qhp.cpp b/src/qhp.cpp index 00e870b..e72db55 100644 --- a/src/qhp.cpp +++ b/src/qhp.cpp @@ -124,9 +124,10 @@ void Qhp::initialize() // Add extra root node QCString fullProjectname = getFullProjectName(); + QCString indexFile = "index"+Doxygen::htmlFileExtension; const char * const attributes[] = { "title", fullProjectname, - "ref", QCString("index")+Doxygen::htmlFileExtension, + "ref", indexFile, NULL }; m_toc.open("section", attributes); @@ -211,7 +212,7 @@ void Qhp::addContentsItem(bool /*isDir*/, const char * name, } void Qhp::addIndexItem(Definition *context,MemberDef *md, - const char *word) + const char *sectionAnchor,const char *word) { (void)word; //printf("addIndexItem(%s %s %s\n", @@ -235,7 +236,7 @@ void Qhp::addIndexItem(Definition *context,MemberDef *md, QCString level1 = context->name(); QCString level2 = word ? QCString(word) : md->name(); QCString contRef = separateMemberPages ? cfname : cfiname; - QCString anchor = md->anchor(); + QCString anchor = sectionAnchor ? QCString(sectionAnchor) : md->anchor(); QCString ref; @@ -256,7 +257,7 @@ void Qhp::addIndexItem(Definition *context,MemberDef *md, // <keyword name="Foo" id="Foo" ref="doc.html"/> QCString contRef = context->getOutputFileBase(); QCString level1 = word ? QCString(word) : context->name(); - QCString ref = makeFileName(contRef); + QCString ref = makeRef(contRef,sectionAnchor); const char * attributes[] = { "name", level1, @@ -35,7 +35,8 @@ class Qhp : public IndexIntf const char * file, const char * anchor, bool separateIndex,bool addToNavIndex, Definition *def); - void addIndexItem(Definition *context,MemberDef *md,const char *title); + void addIndexItem(Definition *context, MemberDef *md, + const char *sectionAnchor, const char *title); void addIndexFile(const char * name); void addImageFile(const char * name); void addStyleSheetFile(const char * name); diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp index ad99480..7abb929 100644 --- a/src/rtfgen.cpp +++ b/src/rtfgen.cpp @@ -1964,9 +1964,11 @@ void RTFGenerator::endMemberList() // // not yet implemented //} // -void RTFGenerator::startDescTable() +void RTFGenerator::startDescTable(const char *title) { DBG_RTF(t << "{\\comment (startDescTable) }" << endl) + startSimpleSect(EnumValues,0,0,title); + startDescForItem(); //t << "{" << endl; //incrementIndentLevel(); //t << rtf_Style_Reset << rtf_CList_DepthStyle(); @@ -1976,6 +1978,8 @@ void RTFGenerator::endDescTable() { //decrementIndentLevel(); DBG_RTF(t << "{\\comment (endDescTable)}" << endl) + endDescForItem(); + endSimpleSect(); //t << "}" << endl; //t << rtf_Style_Reset << styleStack.top(); } @@ -2295,7 +2299,7 @@ static void encodeForOutput(FTextStream &t,const QCString &s) char *outputPtr = enc.data(); if (!portable_iconv(cd, &inputPtr, &iLeft, &outputPtr, &oLeft)) { - enc.resize(enc.size()-oLeft); + enc.resize(enc.size()-(unsigned int)oLeft); converted=TRUE; } portable_iconv_close(cd); diff --git a/src/rtfgen.h b/src/rtfgen.h index 52aa160..92b858f 100644 --- a/src/rtfgen.h +++ b/src/rtfgen.h @@ -190,7 +190,7 @@ class RTFGenerator : public OutputGenerator void endContents() {} void writeNonBreakableSpace(int); - void startDescTable(); + void startDescTable(const char *title); void endDescTable(); void startDescTableTitle(); void endDescTableTitle(); diff --git a/src/scanner.l b/src/scanner.l index e46c89d..c8dfcaa 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -3554,7 +3554,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" } <MemberSpec>([*&]*{BN}*)*{ID}{BN}*("["[^\]\n]*"]")* { // the [] part could be improved. lineCount(); - int i=0,l=yyleng,j; + int i=0,l=(int)yyleng,j; while (i<l && (!isId(yytext[i]))) i++; msName = QCString(yytext).right(l-i).stripWhiteSpace(); j=msName.find("["); @@ -4001,7 +4001,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" { // for defines we interpret a comment // as documentation for the define - int i;for (i=yyleng-1;i>=0;i--) + int i;for (i=(int)yyleng-1;i>=0;i--) { unput(yytext[i]); } @@ -4052,7 +4052,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" { // for defines we interpret a comment // as documentation for the define - int i;for (i=yyleng-1;i>0;i--) + int i;for (i=(int)yyleng-1;i>0;i--) { unput(yytext[i]); } @@ -4291,11 +4291,20 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" current->args += " volatile "; current->argList->volatileSpecifier=TRUE; } -<FuncQual>{BN}*"noexcept"{BN}* { // volatile member function +<FuncQual>{BN}*"noexcept"{BN}* { // noexcept qualifier lineCount() ; current->args += " noexcept "; current->spec |= Entry::NoExcept; } +<FuncQual>{BN}*"noexcept"{BN}*"(" { // noexcept expression + lineCount() ; + current->args += " noexcept("; + current->spec |= Entry::NoExcept; + lastRoundContext=FuncQual; + pCopyRoundString=¤t->args; + roundCount=0; + BEGIN(CopyRound); + } <FuncQual,TrailingReturn>{BN}*"="{BN}*"0"{BN}* { // pure virtual member function lineCount() ; current->args += " = 0"; diff --git a/src/searchindex.cpp b/src/searchindex.cpp index cd030db..bb86998 100644 --- a/src/searchindex.cpp +++ b/src/searchindex.cpp @@ -30,6 +30,7 @@ #include "pagedef.h" #include "growbuf.h" #include "message.h" +#include "version.h" // file format: (all multi-byte values are stored in big endian format) @@ -70,10 +71,11 @@ void IndexWord::addUrlIndex(int idx,bool hiPriority) //-------------------------------------------------------------------- SearchIndex::SearchIndex() : SearchIndexIntf(Internal), - m_words(328829), m_index(numIndexEntries), m_urlIndex(-1) + m_words(328829), m_index(numIndexEntries), m_url2IdMap(10007), m_urls(10007), m_urlIndex(-1) { int i; m_words.setAutoDelete(TRUE); + m_url2IdMap.setAutoDelete(TRUE); m_urls.setAutoDelete(TRUE); m_index.setAutoDelete(TRUE); for (i=0;i<numIndexEntries;i++) m_index.insert(i,new QList<IndexWord>); @@ -87,7 +89,6 @@ void SearchIndex::setCurrentDoc(Definition *ctx,const char *anchor,bool isSource QCString url=isSourceFile ? ((FileDef*)ctx)->getSourceFileBase() : ctx->getOutputFileBase(); url+=Config_getString("HTML_FILE_EXTENSION"); if (anchor) url+=QCString("#")+anchor; - m_urlIndex++; QCString name=ctx->qualifiedName(); if (ctx->definitionType()==Definition::TypeMember) { @@ -159,7 +160,17 @@ void SearchIndex::setCurrentDoc(Definition *ctx,const char *anchor,bool isSource } } - m_urls.insert(m_urlIndex,new URL(name,url)); + int *pIndex = m_url2IdMap.find(url); + if (pIndex==0) + { + ++m_urlIndex; + m_url2IdMap.insert(url,new int(m_urlIndex)); + m_urls.insert(m_urlIndex,new URL(name,url)); + } + else + { + m_urls.insert(*pIndex,new URL(name,url)); + } } static int charsToIndex(const char *word) @@ -398,8 +409,8 @@ struct SearchDocEntry { QCString type; QCString name; - QCString tag; - QCString url; + QCString tagFile; + QCString url; GrowBuf importantText; GrowBuf normalText; }; @@ -503,31 +514,23 @@ static QCString definitionToName(Definition *ctx) void SearchIndexExternal::setCurrentDoc(Definition *ctx,const char *anchor,bool isSourceFile) { - //if (p->openOk) - //{ + QCString tagFile = stripPath(Config_getString("GENERATE_TAGFILE")); + QCString baseName = isSourceFile ? ((FileDef*)ctx)->getSourceFileBase() : ctx->getOutputFileBase(); + QCString url = baseName + Doxygen::htmlFileExtension; + if (anchor) url+=QCString("#")+anchor; + QCString key = tagFile+";"+url; + + p->current = p->docEntries.find(key); + if (!p->current) + { SearchDocEntry *e = new SearchDocEntry; - e->type = definitionToName(ctx); + e->type = isSourceFile ? QCString("source") : definitionToName(ctx); e->name = ctx->qualifiedName(); - e->tag = stripPath(Config_getString("GENERATE_TAGFILE")); - QCString baseName = isSourceFile ? ((FileDef*)ctx)->getSourceFileBase() : ctx->getOutputFileBase(); - e->url = baseName + Doxygen::htmlFileExtension; - if (anchor) e->url+=QCString("#")+anchor; + e->tagFile = tagFile; + e->url = url; p->current = e; - p->docEntries.append(e->url,e); - //if (p->insideDoc) - //{ - // p->t << " </doc>" << endl; - //} - //p->t << " <doc>" << endl; - //QCString baseName = isSourceFile ? ((FileDef*)ctx)->getSourceFileBase() : ctx->getOutputFileBase(); - //p->t << " <field name=\"type\">" << definitionToName(ctx) << "</field>" << endl; - //p->t << " <field name=\"name\">" << convertToXML(ctx->qualifiedName()) << "</field>" << endl; - //p->t << " <field name=\"tag\">" << convertToXML(stripPath(Config_getString("GENERATE_TAGFILE"))) << "</field>" << endl; - //p->t << " <field name=\"url\">" << baseName << Doxygen::htmlFileExtension; - //if (anchor) p->t << "#" << anchor; - //p->t << "</field>" << endl; - //p->insideDoc=TRUE; - //} + p->docEntries.append(key,e); + } } void SearchIndexExternal::addWord(const char *word,bool hiPriority) @@ -536,14 +539,6 @@ void SearchIndexExternal::addWord(const char *word,bool hiPriority) GrowBuf *pText = hiPriority ? &p->current->importantText : &p->current->normalText; if (pText->getPos()>0) pText->addChar(' '); pText->addStr(word); - //if (p->openOk) - //{ - // p->t << " <field name=\"text"; - // if (hiPriority) p->t << "\" boost=\"yes"; - // p->t << "\">"; - // p->t << convertToXML(word); - // p->t << "</field>" << endl; - //} } void SearchIndexExternal::write(const char *fileName) @@ -561,10 +556,10 @@ void SearchIndexExternal::write(const char *fileName) doc->normalText.addChar(0); // make sure buffer ends with a 0 terminator doc->importantText.addChar(0); // make sure buffer ends with a 0 terminator t << " <doc>" << endl; - t << " <field name=\"type\">" << doc->type << "</field>" << endl; - t << " <field name=\"name\">" << convertToXML(doc->name) << "</field>" << endl; - t << " <field name=\"tag\">" << convertToXML(doc->tag) << "</field>" << endl; - t << " <field name=\"url\">" << doc->url << "</field>" << endl; + t << " <field name=\"type\">" << doc->type << "</field>" << endl; + t << " <field name=\"name\">" << convertToXML(doc->name) << "</field>" << endl; + t << " <field name=\"tag\">" << convertToXML(doc->tagFile) << "</field>" << endl; + t << " <field name=\"url\">" << convertToXML(doc->url) << "</field>" << endl; t << " <field name=\"keywords\">" << convertToXML(doc->importantText.get()) << "</field>" << endl; t << " <field name=\"text\">" << convertToXML(doc->normalText.get()) << "</field>" << endl; t << " </doc>" << endl; @@ -1023,6 +1018,7 @@ void writeJavascriptSearchIndex() " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">" << endl; t << "<html><head><title></title>" << endl; t << "<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>" << endl; + t << "<meta name=\"generator\" content=\"Doxygen " << versionString << "\">" << endl; t << "<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>" << endl; t << "<script type=\"text/javascript\" src=\"" << baseName << ".js\"></script>" << endl; t << "<script type=\"text/javascript\" src=\"search.js\"></script>" << endl; diff --git a/src/searchindex.h b/src/searchindex.h index c643315..d1fe994 100644 --- a/src/searchindex.h +++ b/src/searchindex.h @@ -24,6 +24,7 @@ #include <qdict.h> #include <qintdict.h> #include <qvector.h> +#include "sortdict.h" class FTextStream; class Definition; @@ -89,7 +90,8 @@ class SearchIndex : public SearchIndexIntf void addWord(const char *word,bool hiPrio,bool recurse); QDict<IndexWord> m_words; QVector< QList<IndexWord> > m_index; - QIntDict<URL> m_urls; + QDict<int> m_url2IdMap; + QIntDict<URL> m_urls; int m_urlIndex; }; diff --git a/src/store.cpp b/src/store.cpp index 6d3b7d1..74719a9 100644 --- a/src/store.cpp +++ b/src/store.cpp @@ -162,7 +162,7 @@ int Store::write(const char *buf,uint size) #else portable_off_t curPos = m_cur; #endif - int bytesInBlock = BLOCK_SIZE - BLOCK_POINTER_SIZE - (curPos & (BLOCK_SIZE-1)); + int bytesInBlock = (int)(BLOCK_SIZE - BLOCK_POINTER_SIZE - (curPos & (BLOCK_SIZE-1))); int bytesLeft = bytesInBlock<(int)size ? (int)size-bytesInBlock : 0; int numBytes = size - bytesLeft; STORE_ASSERT(bytesInBlock>=0); @@ -254,7 +254,7 @@ void Store::end() #else portable_off_t curPos = m_cur; #endif - int bytesInBlock = BLOCK_SIZE - (curPos & (BLOCK_SIZE-1)); + int bytesInBlock = (int)(BLOCK_SIZE - (curPos & (BLOCK_SIZE-1))); //printf("%x: Store::end erasing %x bytes\n",(int)curPos&~(BLOCK_SIZE-1),bytesInBlock); //printf("end: bytesInBlock=%x\n",bytesInBlock); // zero out rest of the block @@ -327,7 +327,7 @@ int Store::read(char *buf,uint size) #else portable_off_t curPos = m_cur; #endif - int bytesInBlock = BLOCK_SIZE - BLOCK_POINTER_SIZE - (curPos & (BLOCK_SIZE-1)); + int bytesInBlock = (int)(BLOCK_SIZE - BLOCK_POINTER_SIZE - (curPos & (BLOCK_SIZE-1))); int bytesLeft = bytesInBlock<(int)size ? (int)size-bytesInBlock : 0; int numBytes = size - bytesLeft; //printf(" Store::read: pos=%x num=%d left=%d\n",(int)curPos,numBytes,bytesLeft); diff --git a/src/tclscanner.l b/src/tclscanner.l index 5a1ec1d..c46d136 100644 --- a/src/tclscanner.l +++ b/src/tclscanner.l @@ -172,7 +172,7 @@ int TclFindElement( } else if (openBraces == 1) { - size = (p - elemStart); + size = (int)(p - elemStart); p++; if ((p >= limit) || isspace(UCHAR(*p))) { /* INTL: ISO space. */ @@ -211,7 +211,7 @@ int TclFindElement( case '\v': if ((openBraces == 0) && !inQuotes) { - size = (p - elemStart); + size = (int)(p - elemStart); goto done; } break; @@ -223,7 +223,7 @@ int TclFindElement( case '"': if (inQuotes) { - size = (p - elemStart); + size = (int)(p - elemStart); p++; if ((p >= limit) || isspace(UCHAR(*p))) { /* INTL: ISO space */ @@ -254,7 +254,7 @@ int TclFindElement( { return TCL_ERROR; } - size = (p - elemStart); + size = (int)(p - elemStart); } done: @@ -316,7 +316,7 @@ int Tcl_SplitList( } } } - length = l - list; + length = (int)(l - list); argv = (CONST char **) ckalloc((unsigned) ((size * sizeof(char *)) + length + 1)); for (i = 0, p = ((char *) argv) + size*sizeof(char *); @@ -326,7 +326,7 @@ int Tcl_SplitList( result = TclFindElement(list, length, &element, &list, &elSize, &brace); - length -= (list - prevList); + length -= (int)(list - prevList); if (result != TCL_OK) { ckfree((char *) argv); diff --git a/src/translator_dk.h b/src/translator_dk.h index 0f15cf8..bf02402 100644 --- a/src/translator_dk.h +++ b/src/translator_dk.h @@ -16,7 +16,7 @@ * */ /*! @file - * @brief ´Danish translation + * @brief Danish translation */ /* diff --git a/src/translatordecoder.h b/src/translatordecoder.h index bf22df1..7261ee9 100644 --- a/src/translatordecoder.h +++ b/src/translatordecoder.h @@ -70,7 +70,7 @@ class TranslatorDecoder : public Translator char *oPtr = output.data(); if (!portable_iconv(cd,&iPtr,&iLeft,&oPtr,&oLeft)) { - oSize -= oLeft; + oSize -= (int)oLeft; output.resize(oSize+1); output.at(oSize)='\0'; return output; diff --git a/src/util.cpp b/src/util.cpp index 2679b65..e5caac5 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -2290,7 +2290,7 @@ QCString transcodeCharacterStringToUTF8(const QCString &input) char *outputPtr = output.data(); if (!portable_iconv(cd, &inputPtr, &iLeft, &outputPtr, &oLeft)) { - outputSize-=oLeft; + outputSize-=(int)oLeft; output.resize(outputSize+1); output.at(outputSize)='\0'; //printf("iconv: input size=%d output size=%d\n[%s]\n",size,newSize,srcBuf.data()); @@ -2383,7 +2383,7 @@ QCString fileToString(const char *name,bool filter,bool isSourceCode) QCString contents(bSize); int totalSize=0; int size; - while ((size=fread(contents.data()+totalSize,1,bSize,f))==bSize) + while ((size=(int)fread(contents.data()+totalSize,1,bSize,f))==bSize) { totalSize+=bSize; contents.resize(totalSize+bSize); @@ -3321,7 +3321,7 @@ static QCString getCanonicalTypeForIdentifier( if (mType && mType->isTypedef()) // but via a typedef { - result = resolvedType; + result = resolvedType+ts; // the +ts was added for bug 685125 } else { @@ -7054,7 +7054,7 @@ static int transcodeCharacterBuffer(const char *fileName,BufStr &srcBuf,int size uint newSize=0; if (!portable_iconv(cd, &srcPtr, &iLeft, &dstPtr, &oLeft)) { - newSize = tmpBufSize-oLeft; + newSize = tmpBufSize-(int)oLeft; srcBuf.shrink(newSize); strncpy(srcBuf.data(),tmpBuf.data(),newSize); //printf("iconv: input size=%d output size=%d\n[%s]\n",size,newSize,srcBuf.data()); @@ -7110,7 +7110,7 @@ bool readInputFile(const char *fileName,BufStr &inBuf) const int bufSize=1024; char buf[bufSize]; int numRead; - while ((numRead=fread(buf,1,bufSize,f))>0) + while ((numRead=(int)fread(buf,1,bufSize,f))>0) { //printf(">>>>>>>>Reading %d bytes\n",numRead); inBuf.addArray(buf,numRead),size+=numRead; diff --git a/src/vhdlcode.l b/src/vhdlcode.l index 89412b2..22df1c1 100644 --- a/src/vhdlcode.l +++ b/src/vhdlcode.l @@ -361,7 +361,7 @@ static void codifyLines(const char *text,const char *cl=0,bool classlink=FALSE) { g_yyLineNr++; QCString line = sp; - line = line.left(p-sp-1); + line = line.left((int)(p-sp)-1); //*(p-1)='\0'; //g_code->codify(sp); writeWord(line,cl,classlink); diff --git a/src/vhdldocgen.cpp b/src/vhdldocgen.cpp index e4e5bd1..1ddcbdf 100644 --- a/src/vhdldocgen.cpp +++ b/src/vhdldocgen.cpp @@ -75,9 +75,22 @@ static void writeClassToDot(FTextStream &t,ClassDef* cd); static void writeVhdlDotLink(FTextStream &t,const QCString &a,const QCString &b,const QCString &style); static void writeVhdlPortToolTip(FTextStream& t,QList<MemberDef>* port,ClassDef *cd); +static const MemberDef *flowMember=0; +void VhdlDocGen::setFlowMember( const MemberDef* mem) +{ + flowMember=mem; +} +const MemberDef* VhdlDocGen::getFlowMember() +{ + return flowMember; +} +void VhdlDocGen::resetFlowMember() +{ + flowMember=NULL; +} //-------------------------------------------------------------------------------------------------- static void codify(FTextStream &t,const char *str) @@ -130,12 +143,12 @@ void VhdlDocGen::writeOverview() { ClassSDict::Iterator cli(*Doxygen::classSDict); ClassDef *cd; - bool found=false; + bool found=FALSE; for ( ; (cd=cli.current()) ; ++cli ) { if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ENTITYCLASS ) { - found=true; + found=TRUE; break; } } @@ -214,7 +227,7 @@ static void startDot(FTextStream &t) { t << " digraph G { \n"; t << "rankdir=LR \n"; - t << "concentrate=true\n"; + t << "concentrate=TRUE\n"; t << "stylesheet=\"doxygen.css\"\n"; } @@ -481,21 +494,21 @@ static void writeTable(QList<MemberDef>* port,FTextStream & t) if (i<inp) { md=(MemberDef*)inPorts.at(i); - writeColumn(t,md,true); + writeColumn(t,md,TRUE); } else { - writeColumn(t,NULL,true); + writeColumn(t,NULL,TRUE); } if (i<outp) { md=(MemberDef*)outPorts.at(i); - writeColumn(t,md,false); + writeColumn(t,md,FALSE); } else { - writeColumn(t,NULL,false); + writeColumn(t,NULL,FALSE); } } } @@ -2832,7 +2845,7 @@ bool VhdlDocGen::findConstraintFile(LayoutNavEntry *lne) { QCString ov = theTranslator->trDesignOverview(); QCString ofile("vhdl_design_overview"); - LayoutNavEntry *oo=new LayoutNavEntry( lne,LayoutNavEntry::MainPage,true,ofile,ov,""); + LayoutNavEntry *oo=new LayoutNavEntry( lne,LayoutNavEntry::MainPage,TRUE,ofile,ov,""); kk->addChild(oo); } @@ -3108,7 +3121,7 @@ static void addInstance(ClassDef* classEntity, ClassDef* ar, //printf("addInstance %s to %s\n", cd->name().data(), classEntity->name().data()); QCString n1=cur->type; - if (!cd->isBaseClass(classEntity, true, 0)) + if (!cd->isBaseClass(classEntity, TRUE, 0)) { cd->insertBaseClass(classEntity,n1,Public,Normal,0); } @@ -3117,7 +3130,7 @@ static void addInstance(ClassDef* classEntity, ClassDef* ar, VhdlDocGen::addBaseClass(cd,classEntity); } - if (!VhdlDocGen::isSubClass(classEntity,cd,true,0)) + if (!VhdlDocGen::isSubClass(classEntity,cd,TRUE,0)) { classEntity->insertSubClass(cd,Public,Normal,0); } @@ -3290,3 +3303,773 @@ void VhdlDocGen::addBaseClass(ClassDef* cd,ClassDef *ent) } } + +void VhdlDocGen::createFlowChart(MemberDef *mdef) +{ + QCString codeFragment; + + int actualStart= mdef->getStartBodyLine(); + int actualEnd=mdef->getEndBodyLine(); + FileDef* fd=mdef->getFileDef(); + bool b=readCodeFragment( fd->absFilePath().data(), actualStart,actualEnd,codeFragment); + if (!b) return; + + VHDLLanguageScanner *pIntf =(VHDLLanguageScanner*) Doxygen::parserManager->getParser(".vhd"); + VhdlDocGen::setFlowMember(mdef); + Entry root; + pIntf->parseInput("",codeFragment.data(),&root); + +} + +//############################## Flowcharts ################################################# + + +#define STARTL (FlowNode::WHILE_NO | FlowNode::IF_NO | \ + FlowNode::FOR_NO | FlowNode::CASE_NO | \ + FlowNode::LOOP_NO ) +#define DECLN (FlowNode::NEXT_WHEN_NO | FlowNode::WHEN_NO | \ + FlowNode::ELSIF_NO | FlowNode::IF_NO | \ + FlowNode::FOR_NO | FlowNode::WHILE_NO | \ + FlowNode::CASE_NO | FlowNode::LOOP_NO ) +#define STARTFIN (FlowNode::START_NO | FlowNode::END_NO) +#define LOOP (FlowNode::FOR_NO | FlowNode::WHILE_NO | \ + FlowNode::LOOP_NO ) +#define ENDCL (FlowNode::END_CASE | FlowNode::END_LOOP) +#define EEND (FlowNode::ENDIF_NO | FlowNode::ELSE_NO) +#define IFF (FlowNode::ELSIF_NO | FlowNode::IF_NO) +#define EWHEN (FlowNode::NEXT_WHEN_NO) +#define EMPTY (EEND | FlowNode::ELSIF_NO) + +int FlowNode::ifcounter=0; +int FlowNode::nodeCounter=0; +int FlowNode::imageCounter=0; +int FlowNode::caseCounter=0; +QList<FlowNode> FlowNode::flowList; + +void FlowNode::colTextNodes() +{ + QCString text; + FlowNode *flno; + bool found=FALSE; + for (uint j=0;j<flowList.count();j++) + { + FlowNode *flo=flowList.at(j); + if (flo->type==TEXT_NO) + { + text+=flo->text+'\n'; + if (!found) + flno=flo; + if (found) + { + flno->text+=flo->text; + flowList.remove(flo); + if (j>0)j=j-1; + } + found=TRUE; + } + else + found=FALSE; + } + + // find if..endif without text + // if..elseif without text + for (uint j=0;j<flowList.count()-1;j++) + { + FlowNode *flo=flowList.at(j); + int kind=flo->type; + if ( kind & IFF || flo->type==ELSE_NO) + { + FlowNode *ftemp=flowList.at(j+1); + if (ftemp->type & EMPTY) + { + FlowNode *fNew = new FlowNode(TEXT_NO,"empty ",0); + fNew->stamp=flo->stamp; + flowList.insert(j+1,fNew); + } + } + } + +}// colTextNode + +QCString FlowNode::getNodeName(int n) +{ + QCString node; + node.setNum(n); + return node.prepend("node"); +} + +void FlowNode::delFlowList() +{ + ifcounter=0; + nodeCounter=0; + uint size=flowList.count(); + + for (uint j=0;j <size ;j++) + { + FlowNode *fll=flowList.at(j); + delete fll; + } + flowList.clear(); +} + + +void FlowNode::codify(FTextStream &t,const char *str) +{ + if (str) + { + const char *p=str; + char c; + while (*p) + { + c=*p++; + switch(c) + { + case '<': t << "<"; break; + case '>': t << ">"; break; + case '&': t << "&"; break; + case '\'': t << "'"; break; + case '"': t << """; break; + case '\n': t <<"<BR ALIGN=\"LEFT\"/>"; break; + default: t << c; break; + } + } + } +}//codify + +FlowNode::~FlowNode() +{ +} + +FlowNode::FlowNode(int typ,const char * t,const char* ex,const char* label) +{ + if (typ & STARTL) + { + ifcounter++; + } + + stamp=FlowNode::ifcounter; + text=t; + exp=ex; + type=typ; + this->label=label; + + + if (typ==START_NO || typ==END_NO || typ==VARIABLE_NO) + stamp=-1; + + id=++nodeCounter; +} + +void FlowNode::addFlowNode(int type,const char* text,const char* exp, const char *label) +{ + static QRegExp reg("[;]"); + static QRegExp reg1("[\"]"); + + if (!VhdlDocGen::getFlowMember()) return; + + QCString typeString(text); + QCString expression(exp); + + + if (text) + { + typeString=typeString.replace(reg,"\n"); + } + + if (exp) + expression=expression.replace(reg1,"\\\""); + + FlowNode *fl=new FlowNode(type,typeString.data(),expression.data(),label); + if (type==START_NO) + flowList.prepend(fl); + else if (type==VARIABLE_NO) + flowList.insert(1,fl); + else + flowList.append(fl); + +} + +void FlowNode::moveToPrevLevel() +{ + if (!VhdlDocGen::getFlowMember()) return; + ifcounter--; +} + + +void FlowNode::setLabel(const char* t) +{ + FlowNode *fll=flowList.last(); + fll->label=t; + assert(fll->type & LOOP); + +} + +void FlowNode::printFlowList() +{ + uint size=FlowNode::flowList.count(); + for (uint j=0;j<size;j++) + { + FlowNode *fll=flowList.at(j); + QCString ty=getNodeType(fll->type); + + printf("============================================"); + if (!fll->text.isEmpty()) + { + printf("\n (%d) NODE:type %s text %s stamp:%d\n",fll->id,ty.data(),fll->text.data(),fll->stamp); + } + else + { + printf("\n (%d) NODE:type %s exp %s stamp:%d [%s]\n",fll->id,ty.data(),fll->exp.data(),fll->stamp,fll->label.data()); + } + + printf("============================================"); + }// for +} + + +QCString FlowNode::convertNameToFileName() +{ + static QRegExp exp ("[#&*+-/<=>|$?^]"); + QCString temp,qcs; + qcs=VhdlDocGen::getFlowMember()->name(); + + // string literal + VhdlDocGen::deleteAllChars(qcs,'"'); + + // functions like "<=", ">" + int u=qcs.find(exp,0); + + if (u>=0) + { + qcs.prepend("Z"); + qcs=qcs.replace(exp,"_"); + } + + temp=temp.setNum(imageCounter); + return qcs+temp; +} + +const char* FlowNode::getNodeType(int c) +{ + switch(c) + { + case FlowNode::IF_NO: return "if "; + case FlowNode::ELSIF_NO: return "elsif "; + case FlowNode::ELSE_NO: return "else "; + case FlowNode::CASE_NO: return "case "; + case FlowNode::WHEN_NO: return "when "; + case FlowNode::EXIT_NO: return "exit "; + case FlowNode::END_NO: return "end "; + case FlowNode::TEXT_NO: return "text "; + case FlowNode::START_NO: return "start "; + case FlowNode::ENDIF_NO: return "endif "; + case FlowNode::FOR_NO: return "for "; + case FlowNode::WHILE_NO: return "while "; + case FlowNode::END_LOOP: return "end_loop "; + case FlowNode::END_CASE: return "end_case "; + case FlowNode::VARIABLE_NO: return "variable_decl "; + case FlowNode::RETURN_NO: return "return "; + case FlowNode::LOOP_NO: return "infinte loop "; + case FlowNode::NEXT_NO: return "next "; + case FlowNode::EXIT_WHEN_NO: return "exit_when "; + case FlowNode::NEXT_WHEN_NO: return "next_when "; + case FlowNode::EMPTY_NO: return "empty "; + default: return "--failure--"; + } +} + +void FlowNode::createSVG() +{ + QCString qcs("/"); + QCString ov = Config_getString("HTML_OUTPUT"); + + FlowNode::imageCounter++; + qcs+=FlowNode::convertNameToFileName()+".svg"; + + //const MemberDef *m=VhdlDocGen::getFlowMember(); + //fprintf(stderr,"\n creating flowchart : %s %s in file %s \n",VhdlDocGen::trTypeString(m->getMemberSpecifiers()),m->name().data(),m->getFileDef()->name().data()); + + QCString dir=" -o "+ov+qcs; + ov+="/flow_design.dot"; + + QCString vlargs="-Tsvg "+ov+dir ; + + if (portable_system("dot",vlargs)!=0) + { + err("could not create dot file"); + } +} + + +void FlowNode::startDot(FTextStream &t) +{ + t << " digraph G { \n"; + t << "rankdir=TB \n"; + t << "concentrate=true\n"; + t << "stylesheet=\"doxygen.css\"\n"; +} + +void FlowNode::endDot(FTextStream &t) +{ + t << " } \n"; +} + +void FlowNode::writeFlowNode() +{ + // assert(VhdlDocGen::flowMember); + + QCString ov = Config_getString("HTML_OUTPUT"); + QCString fileName = ov+"/flow_design.dot"; + QFile f(fileName); + FTextStream t(&f); + + if (!f.open(IO_WriteOnly)) + { + err("Error: Cannot open file %s for writing\n",fileName.data()); + return; + } + + colTextNodes(); + // printFlowList( ); + FlowNode::startDot(t); + uint size=flowList.count(); + + for (uint j=0;j <size ;j++) + { + FlowNode *fll=flowList.at(j); + writeShape(t,fll); + } + writeFlowLinks(t); + + FlowNode::endDot(t); + delFlowList(); + f.close(); + FlowNode::createSVG(); +}// writeFlowNode + +void FlowNode::writeShape(FTextStream &t,const FlowNode* fl) +{ + if (fl->type & EEND) return; + QCString var; + if (fl->type & LOOP) + { + var=" loop"; + } + else if (fl->type & IFF) + { + var=" then"; + } + else + { + var=""; + } + + t<<getNodeName(fl->id).data(); + QCString q=getNodeType(fl->type); + bool dec=(fl->type & DECLN); + if (dec) + { + t << " [shape=diamond,style=filled,color=\".7 .3 1.0\",label=\" "+fl->exp+var+"\"]\n"; + } + else if (fl->type & ENDCL) + { + QCString val=fl->text; + t << " [shape=ellipse ,label=\""+val+"\"]\n"; + } + else if (fl->type & STARTFIN) + { + static QRegExp reg1("[\"]"); + QCString val=fl->text; + val=val.replace(reg1,"\\\""); + t << "[shape=box , style=rounded label=<\n"; + t << "<TABLE BORDER=\"0\" CELLBORDER=\"0\" CELLSPACING=\"0\" CELLPADDING=\"0\" >\n "; + t << "<TR><TD BGCOLOR=\"white\" > "; + FlowNode::codify(t,val.data()); + t << " </TD></TR></TABLE>>];"; + } + else + { + if (fl->text.isEmpty()) return; + bool var=(fl->type & FlowNode::VARIABLE_NO) ; + QCString repl("<BR ALIGN=\"LEFT\"/>"); + QCString q=fl->text; + + int z=q.findRev("\n"); + + if (z==(int)q.length()-1) + { + q=q.remove(z,2); + } + t << "[shape=none margin=0.1, label=<\n"; + t << "<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\" CELLPADDING=\"2\" >\n "; + if (var) + { + t << "<TR><TD BGCOLOR=\"lightyellow\" > "; + } + else + { + t << "<TR><TD BGCOLOR=\"lightcyan\" > "; + } + FlowNode::codify(t,q.data()); + t << " </TD></TR></TABLE>>];"; + } +} + + +void FlowNode::writeEdge(FTextStream &t,const FlowNode* fl_from,const FlowNode* fl_to,int i) +{ + checkNode(fl_to); + writeEdge(t,fl_from->id,fl_to->id,i); +} + +void FlowNode::writeEdge(FTextStream &t,int fl_from,int fl_to,int i) +{ + QCString label,col; + + if (i==0) + { + col="red"; + label="yes"; + } + else if (i==1) + { + col="black"; + label="no"; + } + else + { + col="green"; + label=""; + } + + t<<"edge [color=\""+col+"\",label=\""+label+"\"]\n"; + t<<getNodeName(fl_from).data(); + t<<"->"; + t<<getNodeName(fl_to).data(); + t<<"\n"; +} + + +void FlowNode::checkNode(const FlowNode* /*flo*/) +{ + // assert(!(flo->type & IDLE)); +} + +void FlowNode::checkNode(int /*z*/) +{ + // FlowNode *flo=flowList.at(z); + //assert(!(flo->type & IDLE)); +} + +int FlowNode::getNextNode(int index) +{ + for (uint j=index+1;j<flowList.count();j++) + { + FlowNode *flo=flowList.at(j); + int kind=flo->type; + if (kind & FlowNode::ENDIF_NO) + { + continue; + } + + if (kind==ELSE_NO || kind==ELSIF_NO) + { + j=findNode(j,flo->stamp,FlowNode::ENDIF_NO); + } + else + { + return j; + } + } + + return flowList.count()-1; +} + +int FlowNode::findNode(int index,int type) +{ + for (uint j=index+1;j<flowList.count();j++) + { + FlowNode *flo=flowList.at(j); + if (flo->type==type) + { + return j; + } + } + return flowList.count()-1; +}// findNode + + +int FlowNode::findNode(int index,int stamp,int type) +{ + for (uint j=index+1;j<flowList.count();j++) + { + FlowNode *flo=flowList.at(j); + if (flo->type==type && flo->stamp==stamp) + { + return j; + } + } + return flowList.count()-1; +}// findNode + +int FlowNode::getNoLink(const FlowNode* fl,uint index) +{ + + for (uint j=index+1;j<flowList.count();j++) + { + FlowNode *flo=FlowNode::flowList.at(j); + if (flo->type==IF_NO && flo->stamp==fl->stamp) + { + return j; + } + + if (flo->type==ELSE_NO && flo->stamp==fl->stamp) + { + return j+1; + } + + if (flo->type==ELSIF_NO && flo->stamp==fl->stamp) + { + return j; + } + + if ((flo->type & ENDIF_NO) && flo->stamp==fl->stamp) + { + return getNextNode(j); + } + + } + return flowList.count()-1;// end process +} + +int FlowNode::getTextLink(const FlowNode* /*fl*/,uint index) +{ + assert(FlowNode::flowList.count()>index); + + uint i=index+1; + + FlowNode *flo=flowList.at(i); + if (flo->type==IF_NO) + { + return i; + } + + if (FlowNode::caseCounter) + { + return FlowNode::findNode(index,END_CASE); + } + else + { + i = FlowNode::getNextNode(index); + } + + if (i>0) return i; + + return flowList.count()-1;// end process +} + +int FlowNode::findNextLoop(int index,int stamp) +{ + for (uint j=index+1;j<FlowNode::flowList.count();j++) + { + FlowNode *flo=FlowNode::flowList.at(j); + if (flo->type==END_LOOP && flo->stamp==stamp) + { + return j; + } + } + return flowList.count()-1; +} + +int FlowNode::findPrevLoop(int index,int stamp) +{ + for (uint j=index;j>0;j--) + { + FlowNode *flo=flowList.at(j); + if (flo->type & LOOP) + { + if ( flo->stamp==stamp) + { + return j; + } + } + } + err("end loop without loop"); + assert(FALSE); + return flowList.count()-1; +} + + +int FlowNode::findLabel(int index,QCString & label) +{ + for (uint j=index;j>0;j--) + { + FlowNode *flo=flowList.at(j); + if ((flo->type & LOOP) && !flo->label.isEmpty() && stricmp(flo->label.data(),label.data())==0) + { + return findNode(j,flo->stamp,END_LOOP); + } + } + return 0; +} + + +void FlowNode::writeFlowLinks(FTextStream &t) +{ + + uint size=flowList.count(); + if (size<2) return; + + // start link + writeEdge(t,flowList.at(0),flowList.at(1),2); + + for (uint j=0;j<size;j++) + { + FlowNode *fll=flowList.at(j); + int kind=fll->type; + if (kind==ELSE_NO || kind==ENDIF_NO) + { + continue; + } + + if (kind==IF_NO) + { + writeEdge(t,fll,flowList.at(j+1),0); + int z=getNoLink(fll,j); + writeEdge(t,fll,flowList.at(z),1); + } + + if (kind==ELSIF_NO) + { + writeEdge(t,fll,flowList.at(j+1),0); + int z=getNoLink(fll,j); + writeEdge(t,fll,flowList.at(z),1); + } + + if ((kind & LOOP) && kind!=LOOP_NO) + { + writeEdge(t,fll,flowList.at(j+1),0); + int z=findNode(j,fll->stamp,END_LOOP); + z = getNextNode(z); + writeEdge(t,fll,flowList.at(z),1); + } + + if (kind==LOOP_NO) + { + writeEdge(t,fll,flowList.at(j+1),0); + } + + if (kind==TEXT_NO || kind==VARIABLE_NO) + { + int z=getTextLink(fll,j); + writeEdge(t,fll,flowList.at(z),2); + } + + if (kind==WHEN_NO) + { + writeEdge(t,fll,flowList.at(j+1),0); + int z=flowList.count()-1; + int u=findNode(j,fll->stamp,WHEN_NO); + if (u<z) + writeEdge(t,fll,FlowNode::flowList.at(u),1); + else { + z=findNode(j,fll->stamp,END_CASE); + writeEdge(t,fll,FlowNode::flowList.at(z),1); + } + } + + if (kind==CASE_NO) + { + writeEdge(t,fll,flowList.at(j+1),2); + caseCounter++; + } + + if (kind==RETURN_NO) + { + writeEdge(t,fll,FlowNode::flowList.at(size-1),2); + } + + if (kind==EXIT_NO) + { + int z; + if (!fll->label.isEmpty()) + { + z=findLabel(j,fll->label); + z=getNextNode(z); + //assert(z!=0); + } + else + { + z =findNextLoop(j,fll->stamp); + z=getNextNode(z); + } + writeEdge(t,fll,flowList.at(z),2); + } + + if (kind==END_CASE) + { + int z=FlowNode::getNextNode(j); + writeEdge(t,fll,flowList.at(z),2); + caseCounter--; + } + + if (kind==END_LOOP) + { + int z=findPrevLoop(j,fll->stamp); + writeEdge(t,fll,flowList.at(z),2); + } + + if (kind & EWHEN) + { + writeEdge(t,fll,flowList.at(j+1),0); + int z=getNextNode(j+1); + writeEdge(t,fll,flowList.at(z),1); + } + + if (kind & NEXT_NO) + { + int z=findNode(j,fll->stamp,END_LOOP); + writeEdge(t,fll,flowList.at(z),1); + } + } //for +} //writeFlowLinks + +void FlowNode::alignFuncProc( QCString & q,const ArgumentList* al,bool isFunc) +{ + if (al==0) return; + + ArgumentListIterator ali(*al); + int index=ali.count(); + if (index==0) return; + + int len=q.length()+VhdlDocGen::getFlowMember()->name().length(); + QCString prev,temp; + prev.fill(' ',len+1); + + Argument *arg; + bool first=TRUE; + q+="\n"; + for (;(arg=ali.current());++ali) + { + QCString attl=arg->defval+" "; + attl+=arg->name+" "; + + if (!isFunc) + { + attl+=arg->attrib+" "; + } + else + { + attl+=" in "; + } + + attl+=arg->type; + + if (--index) attl+=",\n"; else attl+="\n"; + + attl.prepend(prev.data()); + temp+=attl; + first=FALSE; + } + q+=temp; +} diff --git a/src/vhdldocgen.h b/src/vhdldocgen.h index bb62f3f..8d8307e 100644 --- a/src/vhdldocgen.h +++ b/src/vhdldocgen.h @@ -25,6 +25,7 @@ #include <qcstring.h> #include "layout.h" #include "memberlist.h" +#include "arguments.h" class Entry; class ClassDef; @@ -262,6 +263,14 @@ class VhdlDocGen static void writeOverview(OutputList &ol); static void writeOverview(); + + // flowcharts + static void createFlowChart( MemberDef*); + static void addFlowImage(FTextStream,QCString); + + static void setFlowMember( const MemberDef *flowMember); + static const MemberDef * getFlowMember(); + static void resetFlowMember(); private: static void findAllArchitectures(QList<QCString>& ql,const ClassDef *cd); @@ -272,4 +281,90 @@ class VhdlDocGen static void writeRecorUnit(QCString & largs,OutputList& ol ,const MemberDef *mdef); }; + +class FlowNode +{ + public: + enum nodeType { + IF_NO = 1<<1, + ELSIF_NO = 1<<2, + ELSE_NO = 1<<3, + CASE_NO = 1<<4, + WHEN_NO = 1<<5, + EXIT_NO = 1<<6, + END_NO = 1<<7, + TEXT_NO = 1<<8, + START_NO = 1<<9, + ENDIF_NO = 1<<10, + FOR_NO = 1<<11, + WHILE_NO = 1<<12, + END_LOOP = 1<<13, + END_CASE = 1<<14, + VARIABLE_NO = 1<<15, + RETURN_NO = 1<<16, + LOOP_NO = 1<<17, + NEXT_NO = 1<<18, + EXIT_WHEN_NO = 1<<19, + NEXT_WHEN_NO = 1<<20, + EMPTY_NO = 1<<21 + }; + + //---------- create svg ------------------------------------------------------------- + static void createSVG(); + static void startDot(FTextStream &t); + static void endDot(FTextStream &t); + static void codify(FTextStream &t,const char *str); + static void writeShape(FTextStream &t,const FlowNode* fl); + static void writeEdge(FTextStream &t,int fl_from,int fl_to,int i); + static void writeEdge(FTextStream &t,const FlowNode* fl_from,const FlowNode* fl_to,int i); + //static void writeEndNode(FTextStream &t,const FlowNode* fl); + static void writeFlowLinks(FTextStream &t); + //static void writeStartNode(FTextStream &t,const FlowNode* fl); + static void checkNode(int); + static void checkNode(const FlowNode*); + + static QCString getNodeName(int n); + static void colTextNodes(); + + static int getTextLink(const FlowNode* fl,uint index); + static int getNoLink(const FlowNode*,uint); + static int getNextNode(int); + static int findNode(int index,int stamp,int type); + static int findNode(int index,int type); + static int findNextLoop(int j,int stamp); + static int findPrevLoop(int j,int stamp); + static int findLabel(int j,QCString &); + static void delFlowList(); + static const char* getNodeType(int c); + + static void addFlowNode(int type,const char* text,const char* exp,const char * label=NULL); + static void moveToPrevLevel(); + static void printFlowList(); + static void setLabel(const char* text); + static int getTimeStamp(); + static void printNodeList(); + static void writeFlowNode(); + static void alignFuncProc(QCString & q,const ArgumentList* al,bool isFunc); + static QCString convertNameToFileName(); + + static QList<FlowNode> flowList; + static int ifcounter; + static int nodeCounter; + static int imageCounter; + static int caseCounter; + + FlowNode(int typ,const char* t,const char* ex,const char* label=NULL); + ~FlowNode(); + + int id; + int stamp; + int type; + + QCString label; + QCString text; + QCString exp; +}; + + + #endif diff --git a/src/vhdlparser.y b/src/vhdlparser.y index 82f68a7..32727a2 100644 --- a/src/vhdlparser.y +++ b/src/vhdlparser.y @@ -63,9 +63,10 @@ struct YYMM #include "arguments.h" //-----------------------------variables --------------------------------------------------------------------------- -//static VhdlParser* myconv=0; +//static MyParserVhdl* myconv=0; static VhdlContainer s_str; + static QList<Entry>instFiles; static int yyLineNr; static Entry* lastCompound; @@ -79,6 +80,7 @@ static QCString currName; static int levelCounter; static QCString confName; static QCString genLabels; +static QCString lab; static QList<VhdlConfNode> configL; static VhdlConfNode* currNode; @@ -91,7 +93,7 @@ static int param_sec = 0; static int parse_sec=0; -//---------------------------- function -------------------------------------------------------------------------------- +//---------------------------- functions -------------------------------------------------------------------------------- int vhdlScanYYlex (); void vhdlScanYYerror (char const *); @@ -104,7 +106,7 @@ static void addCompInst(char *n, char* instName,char* comp,int line); static void newEntry(); static void initEntry(Entry *e); -static bool isFuncProcProced(); + static void popConfig(); static void pushLabel(const QCString &label); static void popLabel(); @@ -118,6 +120,8 @@ static void addProto(const char *s1,const char *s2,const char *s3, static void createFunction(const QCString &impure,int spec, const QCString &fname); +static void createFlow(QCString s); + void newVhdlEntry() { newEntry(); @@ -325,13 +329,29 @@ t_ToolDir %type<qstr> entity_class_entry_list entity_class_entry group_constituent_list group_constituent group_declaration group_template_declaration %type<qstr> procs_stat1_5 comp_1 mark_comp dot_name fi_dec multiplying_operator factor term adding_op %type<qstr> simple_exp alias_spec sigma signature1 mark_stats mark_stats_1 signature -%type<qstr> protected_type_body protected_type_declaration alias_name_stat vcomp_stat comp_spec_stat +%type<qstr> protected_type_body protected_type_declaration alias_name_stat vcomp_stat comp_spec_stat procs_decltve_item %type<qstr> sig_stat external_name absolute_pathname relative_pathname package_path_name external_pathname pathname_element_list neg_list pathname_element %type<qstr> func_name return_is param func_prec iproc ifunc interface_subprogram_decl interface_package_decl package_instantiation_decl -%type<qstr> subprogram_instantiation_decl -%type<qstr> context_ref libustcont_stats libustcont_stat context_decl - +%type<qstr> subprogram_instantiation_decl procs_stat1_4 +%type<qstr> context_ref libustcont_stats libustcont_stat context_decl entity_decltve_item case_stat +%type<qstr> exit_stat if_stat loop_stat next_stat null_stat return_stat signal_assign_stat +%type<qstr> variable_assign_stat wait_stat report_statement assertion_stat_2 assertion_stat_1 + +%type<qstr> binding_indic_2 binding_indic_1 shift_op block_decltve_item disconnection_spec seq_stats_1 seq_stats_2 seq_stats +%type<qstr> signal_list signal_list_1 signal_list_2 seq_stat assertion_stat choice_stat choice_stat_1 +%type<qstr> case_stat_1 case_stat_2 case_stat_alternative exit_stat_1 exit_stat_2 if_stat_2 if_stat_3 if_stat_1 loop_stat_2 loop_stat_1 loop_stat_3 +%type<qstr> next_stat_1 next_stat_2 return_stat_1 lable variable_assign_stat_1 +%type<qstr> wait_stat_1 wait_stat_2 wait_stat_3 target delay_mechanism +%type<qstr> if_generation_scheme if_scheme if_scheme_1 if_scheme_2 if_scheme_3 iteration_scheme for_scheme while_scheme concurrent_stats +%type<qstr> concurrent_stats_1 concurrent_stats_2 concurrent_stat block_stat_5 block_stat_4 block_stat_3 block_stat_2 block_stat_1 block_stat_0 +%type<qstr> generate_statement_body generation_scheme concurrent_assertion_stat concurrent_procedure_call concurrent_signal_assign_stat +%type<qstr> block_stat_6 block_stat_7 block_stat_8 condal_signal_assign sel_signal_assign opts condal_wavefrms wavefrm wavefrm_element +%type<qstr> wavefrm_1 wavefrm_2 wavefrm_element_1 wavefrm_element_2 opts_1 opts_2 sel_wavefrms +%type<qstr> sel_wavefrms_1 sel_wavefrms_2 gen_stat1 block_declarative_part end_stats inout_stat +%type<qstr> selected_signal_assignment comp_inst_stat + %type<qstr> conditional_signal_assignment selected_variable_assignment conditional_variable_assignment + %type<qstr> subprog_decltve_item subprog_body_3 subprog_body_1 procs_stat1_2 %debug @@ -341,10 +361,14 @@ t_ToolDir %expect 2 // minimum bison version -//%require "2.2" +//%required "2.2" + + %% start: design_file + | procs_stat + | subprog_body design_file : design_unit_list @@ -441,10 +465,9 @@ entity_start: t_ENTITY t_Identifier t_IS $$=$2; lastEntity=current; lastCompound=0; - /*int k=*/ getParsedLine(t_ENTITY); + getParsedLine(t_ENTITY); addVhdlType($$,getParsedLine(t_ENTITY),Entry::CLASS_SEC,VhdlDocGen::ENTITY,0,0,Public); - //fprintf(stderr,"\n entiy %s : at line %d",$$.data(),s_str.yyLineNr); - } + } ; entity_decl_5 : /* empty */ @@ -473,9 +496,7 @@ arch_body : arch_start error t_END arch_body_2 t_Semicolon arch_start : t_ARCHITECTURE t_Identifier t_OF t_Identifier t_IS { - $$=$4; - $$+="::"; - $$+=$2; + $$=$4+"::"+$2; pushLabel($2); lastCompound=current; addVhdlType($$,getParsedLine(t_ARCHITECTURE),Entry::CLASS_SEC,VhdlDocGen::ARCHITECTURE,0,0,Private); @@ -516,22 +537,15 @@ package_decl : package_start package_decl_1 t_END package_decl_2 t_Semicolon package_start : t_PACKAGE t_Identifier t_IS { lastCompound=current; - - - Entry *clone=new Entry(*current); - clone->section=Entry::NAMESPACE_SEC; - clone->spec=VhdlDocGen::PACKAGE; - clone->name=$2; - int line=s_str.iLine; - clone->startLine=line; - clone->bodyLine=line; - - clone->protection=Package; - current_root->addSubEntry(clone); - - - addVhdlType($2,line,Entry::CLASS_SEC,VhdlDocGen::PACKAGE,0,0,Package); - //fprintf(stderr,"\n entiy %s : at line %d",$$.data(),s_str.yyLineNr); + Entry *clone=new Entry(*current); + clone->section=Entry::NAMESPACE_SEC; + clone->spec=VhdlDocGen::PACKAGE; + clone->name=$2; + clone->startLine=s_str.iLine; + clone->bodyLine=s_str.iLine; + clone->protection=Package; + current_root->addSubEntry(clone); + addVhdlType($2,s_str.iLine,Entry::CLASS_SEC,VhdlDocGen::PACKAGE,0,0,Package); } package_decl_2 : /* empty */ @@ -563,56 +577,54 @@ package_body_2 : t_Identifier { last package_body_2 : t_PACKAGE t_BODY { lastCompound=0; } package_body_2 : t_PACKAGE t_BODY t_Identifier { lastCompound=0; } - package_body_1 : /* empty */ { $$=""; } package_body_1 : package_body_1 package_body_3 package_body_3 : package_body_decltve_item - /*------------------------------------------ -- Declarative Item --------------------------------------------*/ -common_decltve_item_1: package_decl +common_decltve_item_1: package_decl common_decltve_item_1: package_instantiation_decl common_decltve_item_1: package_body common_decltve_item_1: subprogram_instantiation_decl -common_decltve_item: type_decl -common_decltve_item: subtype_decl -common_decltve_item: constant_decl -common_decltve_item: file_decl -common_decltve_item: alias_decl -common_decltve_item: subprog_decl -common_decltve_item: use_clause - -entity_decltve_item: common_decltve_item -entity_decltve_item: subprog_body -entity_decltve_item: attribute_decl -entity_decltve_item: attribute_spec -entity_decltve_item: disconnection_spec -entity_decltve_item: signal_decl -entity_decltve_item: variable_decl -entity_decltve_item: group_template_declaration -entity_decltve_item: group_declaration -entity_decltve_item: common_decltve_item_1 - - -block_decltve_item: common_decltve_item -block_decltve_item: subprog_body -block_decltve_item: comp_decl -block_decltve_item: attribute_decl -block_decltve_item: attribute_spec -block_decltve_item: config_spec -block_decltve_item: disconnection_spec +common_decltve_item: type_decl{$$=$1;} +common_decltve_item: subtype_decl{$$=$1;} +common_decltve_item: constant_decl{ $$=$1;} +common_decltve_item: file_decl{$$=$1;} +common_decltve_item: alias_decl{$$=$1;} +common_decltve_item: subprog_decl{$$=$1;} +common_decltve_item: use_clause {$$=$1;} + +entity_decltve_item: common_decltve_item {$$=$1;} +entity_decltve_item: subprog_body {$$=$1;} +entity_decltve_item: attribute_decl {$$=$1;} +entity_decltve_item: attribute_spec {$$=$1;} +entity_decltve_item: disconnection_spec {$$=$1;} +entity_decltve_item: signal_decl {$$=$1;} +entity_decltve_item: variable_decl {$$=$1;} +entity_decltve_item: group_template_declaration {$$=$1;} +entity_decltve_item: group_declaration {$$=$1;} +entity_decltve_item: common_decltve_item_1 {$$="";} + + +block_decltve_item: common_decltve_item +block_decltve_item: subprog_body +block_decltve_item: comp_decl +block_decltve_item: attribute_decl +block_decltve_item: attribute_spec +block_decltve_item: config_spec +block_decltve_item: disconnection_spec block_decltve_item: signal_decl block_decltve_item: variable_decl block_decltve_item: group_template_declaration block_decltve_item: group_declaration -block_decltve_item: common_decltve_item_1 -block_decltve_item: tool_directive +block_decltve_item: common_decltve_item_1 {$$="";} +block_decltve_item: tool_directive {$$="";} block_declarative_part: block_decltve_item | block_declarative_part block_decltve_item @@ -640,23 +652,16 @@ package_body_decltve_item: attribute_decl package_body_decltve_item: attribute_spec package_body_decltve_item: common_decltve_item_1 -subprog_decltve_item: common_decltve_item -subprog_decltve_item: subprog_body -subprog_decltve_item: attribute_decl -subprog_decltve_item: attribute_spec -subprog_decltve_item: variable_decl +subprog_decltve_item: common_decltve_item {$$=$1;} +subprog_decltve_item: subprog_body {$$="";} +subprog_decltve_item: attribute_decl {$$=$1;} +subprog_decltve_item: attribute_spec {$$=$1;} +subprog_decltve_item: variable_decl {$$=$1;} subprog_decltve_item: group_template_declaration -subprog_decltve_item: group_declaration -subprog_decltve_item: common_decltve_item_1 - -procs_decltve_item: common_decltve_item -procs_decltve_item: subprog_body -procs_decltve_item: attribute_decl -procs_decltve_item: attribute_spec -procs_decltve_item: variable_decl -procs_decltve_item: group_template_declaration -procs_decltve_item: group_declaration -procs_decltve_item: common_decltve_item_1 +subprog_decltve_item: group_declaration {$$="";} +subprog_decltve_item: common_decltve_item_1 {$$="";} + +procs_decltve_item: subprog_decltve_item {$$=$1;} config_decltve_item: attribute_spec { $$=$1; } config_decltve_item: use_clause { $$=$1; } @@ -672,7 +677,11 @@ func_prec: t_IMPURE { $$="impure"; } subprog_decl: subprog_spec t_Semicolon { currP=0; } subprog_spec: t_PROCEDURE t_Identifier - { currP=VhdlDocGen::PROCEDURE; createFunction($2,currP,0); } + { + currP=VhdlDocGen::PROCEDURE; + createFunction($2,currP,0); + tempEntry=current; + } subprog_spec_1 { newEntry(); } subprog_spec: func_prec t_FUNCTION designator { @@ -680,7 +689,7 @@ subprog_spec: func_prec t_FUNCTION designator createFunction($1,currP,$3.data()); } subprog_spec_2 t_RETURN mark - { + { tempEntry=current; current->type=$7; newEntry(); @@ -694,8 +703,10 @@ subprog_spec : t_FUNCTION designator subprog_spec_2 t_RETURN mark { tempEntry=current; + current->bodyLine=getParsedLine(t_FUNCTION); current->type=$6; newEntry(); + } subprog_spec_22: gen_interface_list @@ -718,7 +729,9 @@ subprog_spec_1: subprog_spec_2 subprog_body: subprog_spec t_IS subprog_body_1 t_BEGIN seq_stats t_END subprog_body_2 t_Semicolon { - currP=0; + tempEntry->endBodyLine=s_str.yyLineNr; + createFlow($3); + currP=0; } subprog_body: subprog_spec t_IS error t_END subprog_body_2 t_Semicolon { @@ -732,12 +745,12 @@ subprog_body_2: t_PROCEDURE t_Identifier subprog_body_2: t_FUNCTION t_Identifier subprog_body_2: t_FUNCTION t_STRING - -subprog_body_1: /* empty */ +subprog_body_1: /* empty */ {$$="";} //subprog_body_1 : subprogram_instantiation_decl -subprog_body_1: subprog_body_1 subprog_body_3 -subprog_body_3: subprog_decltve_item +subprog_body_1: subprog_body_1 subprog_body_3 {$$=$1+$2; } +subprog_body_3: subprog_decltve_item { $$=$1; } + /*-------------------------------------------------- -- Interface Lists and Associaton Lists ----------------------------------------------------*/ @@ -753,8 +766,7 @@ interf_element: interface_package_decl // adding generic : [ package foo is new bar] if (parse_sec==GEN_SEC) { - QCString n=current->name; - addVhdlType(n.data(),getParsedLine(t_PACKAGE),Entry::VARIABLE_SEC,VhdlDocGen::GENERIC,$1.data(),0); + addVhdlType(current->name.data(),getParsedLine(t_PACKAGE),Entry::VARIABLE_SEC,VhdlDocGen::GENERIC,$1.data(),0); } } interf_element: interface_subprogram_decl @@ -766,21 +778,18 @@ interf_element: interface_subprogram_decl if (a>b) b=a; - QCString n=current->name; - addVhdlType(n.data(),b,Entry::VARIABLE_SEC,VhdlDocGen::GENERIC,$1.data(),0); + addVhdlType(current->name.data(),b,Entry::VARIABLE_SEC,VhdlDocGen::GENERIC,$1.data(),0); } } interf_element: interf_element_1 t_Identifier { if (parse_sec==GEN_SEC) { - QCString v= $1; - addVhdlType($2,s_str.iLine,Entry::VARIABLE_SEC,currP,$1.data(),0); + addVhdlType($2,s_str.iLine,Entry::VARIABLE_SEC,currP,$1.data(),0); } } interf_element: interf_element_1 idf_list t_Colon interf_element_2 subtype_indic interf_element_3 interf_element_4 { - QCString b=$2; $$=$2+":"+$4+$5+$6+$7; if (currP!=VhdlDocGen::COMPONENT) { @@ -822,7 +831,7 @@ association_list_2: t_Comma association_element { $$=", "+$2; } gen_association_list : t_LeftParen gen_association_element gen_association_list_1 t_RightParen { - QCString str="( "+$2; + QCString str="( "+$2+$3; str.append(" )"); $$=str; } @@ -830,7 +839,7 @@ gen_association_list: t_LeftParen error t_RightParen { $$=""; } gen_association_list: t_LeftParen t_OPEN t_RightParen { $$=" ( open ) "; } gen_association_list_1: /* empty */ { $$=""; } -gen_association_list_1: gen_association_list_1 gen_association_list_2 { $$=$1+"?? "+$2; } +gen_association_list_1: gen_association_list_1 gen_association_list_2 { $$=$1+" "+$2; } gen_association_list_2: t_Comma gen_association_element { $$=","+$2; } association_element: formal_part t_Arrow actual_part { $$=$1+"=>"+$3; } @@ -840,7 +849,7 @@ association_element: t_DEFAULT { $$="default"; } /* changed ;gen_association_element : association_element */ gen_association_element: expr { $$=$1; } -gen_association_element: choice t_Arrow expr +gen_association_element: choice t_Arrow expr { $$=$1+"=>"+$3; } gen_association_element: discrete_range1 { $$=$1 ; } formal_part: name { $$=$1; } @@ -853,31 +862,29 @@ actual_part: t_INERTIAL expr { $$="inertial"; } -- Names and Expressions ----------------------------------------------------*/ - - expr: and_relation { $$=$1; } expr: relation { $$=$1; } -shift_op: t_SLL - | t_SRA - | t_SLA - | t_SRL - | t_ROR - | t_ROL +shift_op: t_SLL { $$="sll"; } + | t_SRA { $$="sra"; } + | t_SLA { $$="sla"; } + | t_SRL { $$="srl"; } + | t_ROR { $$="ror"; } + | t_ROL { $$="rol"; } ; -and_relation: relation shift_op relation -and_relation: relation t_AND relation -and_relation: relation t_XOR relation -and_relation: relation t_OR relation -and_relation: relation t_NOR relation -and_relation: relation t_XNOR relation -and_relation: relation t_NAND relation -and_relation: and_relation t_NAND relation -and_relation: and_relation t_NOR relation -and_relation: and_relation t_XNOR relation -and_relation: and_relation t_AND relation -and_relation: and_relation t_OR relation -and_relation: and_relation t_XOR relation +and_relation: relation shift_op relation {$$= $1+$2+$3; } +and_relation: relation t_AND relation {$$= $1+" and "+$3; } +and_relation: relation t_XOR relation {$$= $1+" xor "+$3; } +and_relation: relation t_OR relation {$$= $1+" or "+$3; } +and_relation: relation t_NOR relation {$$= $1+" nor "+$3; } +and_relation: relation t_XNOR relation {$$= $1+"xnor"+$3; } +and_relation: relation t_NAND relation {$$= $1+"nand"+$3; } +and_relation: and_relation t_NAND relation {$$= $1+"nand"+$3; } +and_relation: and_relation t_NOR relation{$$= $1+"nor"+$3; } +and_relation: and_relation t_XNOR relation {$$= $1+"nand"+$3; } +and_relation: and_relation t_AND relation {$$= $1+" and "+$3; } +and_relation: and_relation t_OR relation {$$= $1+" or "+$3; } +and_relation: and_relation t_XOR relation {$$= $1+" xor "+$3; } /* ;relation : unary_operator primary */ @@ -890,7 +897,7 @@ relation: t_NOT primary { $$="not "+$2; } relation: primary t_DoubleStar primary { $$=$1+" ** "+$3; } relation: t_Minus primary t_DoubleStar primary { $$=$2+" ** "+$4; } -/* ; relation : relation binary_operator primary */ +/* relation : relation binary_operator primary */ relation: relation t_MOD relation { $$=$1+" mod "+$3; } relation: relation t_REM relation { $$=$1+" rem "+$3; } @@ -1013,11 +1020,13 @@ type_decl: t_TYPE t_Identifier error t_Semicolon { $$=""; } type_decl: t_TYPE t_Identifier type_decl_1 t_Semicolon { addVhdlType($2,getParsedLine(t_TYPE),Entry::VARIABLE_SEC,VhdlDocGen::TYPE,0,$3.data()); + $$="type "; + $$+=$2+$3+";"; } type_decl: t_TYPE error t_Semicolon { $$=""; } type_decl_1: /* empty */ { $$=""; } -type_decl_1: t_IS type_definition { $$="is "+$2; } +type_decl_1: t_IS type_definition { $$=" is "+$2; } type_definition: enumeration_type_definition { $$=$1; } type_definition: range_constraint { $$=$1; } @@ -1153,6 +1162,9 @@ constant_decl: t_CONSTANT idf_list t_Colon subtype_indic constant_decl_1 t_Semic QCString it=$4+" "+$5; // fprintf(stderr,"\n currP %d \n",currP); addVhdlType($2,getParsedLine(t_CONSTANT),Entry::VARIABLE_SEC,VhdlDocGen::CONSTANT,0,it.data()); + $$="constant "+$2; + $$+=": "; + $$+=it+";"; } constant_decl_1: /* empty */ { $$=""; } constant_decl_1: t_VarAsgn expr { $$=":="+$2; } @@ -1169,7 +1181,8 @@ signal_decl_1: signal_kind { $$=$1; } variable_decl: t_VARIABLE idf_list t_Colon subtype_indic variable_decl_1 t_Semicolon { - $$=$2+":"+$4+" "+$5; + $$=$2+":"+$4+" "+$5+";"; + $$.prepend("variable: "); } variable_decl: t_SHARED t_VARIABLE idf_list t_Colon subtype_indic variable_decl_1 t_Semicolon { @@ -1193,6 +1206,9 @@ alias_decl: t_ALIAS alias_name_stat alias_spec t_IS name signature t_Semicolon { QCString s=$3+" is "+$5+$6; addVhdlType($2,getParsedLine(t_ALIAS),Entry::VARIABLE_SEC,VhdlDocGen::ALIAS,0,s.data()); + $$="alias "+$2; + $$+=": "; + $$+=s+";"; } alias_decl: t_ALIAS alias_name_stat alias_spec t_IS error t_Semicolon { $$=""; } @@ -1200,7 +1216,7 @@ alias_name_stat: t_Identifier { $$=$1; } alias_name_stat: t_StringLit { $$=$1; } alias_spec :/*empty*/ { $$=""; } - | t_Colon subtype_indic { $$=","+$2; } + | t_Colon subtype_indic { $$=$2; } ; file_decl: t_FILE idf_list t_Colon subtype_indic t_IS file_decl_1 expr t_Semicolon @@ -1222,13 +1238,14 @@ file_decl_1: /* empty */ { $$=""; } file_decl_1: mode { $$=$1; } disconnection_spec: t_DISCONNECT signal_list t_Colon mark t_AFTER expr t_Semicolon - -signal_list: name signal_list_1 -signal_list: t_OTHERS -signal_list: t_ALL -signal_list_1: /* empty */ -signal_list_1: signal_list_1 signal_list_2 -signal_list_2: t_Comma name + { $$="disconnect "+$2+":"+$4+" after "+$6;} + +signal_list: name signal_list_1 { $$=$1+$2;} +signal_list: t_OTHERS { $$="others";} +signal_list: t_ALL { $$="all";} +signal_list_1: /* empty */ { $$="";} +signal_list_1: signal_list_1 signal_list_2 { $$=$1+$2;} +signal_list_2: t_Comma name {$$=" , "+$2;} /*-------------------------------------------------- -- Attribute Declarations and Specifications @@ -1237,12 +1254,14 @@ signal_list_2: t_Comma name attribute_decl: t_ATTRIBUTE t_Identifier t_Colon mark t_Semicolon { addVhdlType($2,getParsedLine(t_ATTRIBUTE),Entry::VARIABLE_SEC,VhdlDocGen::ATTRIBUTE,0,$4.data()); + $$= "attribute "+$2+ " : "+$4; } attribute_spec: t_ATTRIBUTE t_Identifier t_OF entity_spec t_IS expr t_Semicolon { - QCString oo=$4+" is "+$6; - addVhdlType($2,getParsedLine(t_ATTRIBUTE),Entry::VARIABLE_SEC,VhdlDocGen::ATTRIBUTE,0,oo.data()); + QCString att=$4+" is "+$6; + addVhdlType($2,getParsedLine(t_ATTRIBUTE),Entry::VARIABLE_SEC,VhdlDocGen::ATTRIBUTE,0,att.data()); + $$="attribute "+att+";"; } entity_spec : entity_name_list signature t_Colon entity_class { $$=$1+$2+":"+$4;} @@ -1263,7 +1282,7 @@ entity_class: t_LABEL { $$="label"; } entity_class: t_TYPE { $$="type"; } entity_class: t_SUBTYPE { $$="subtype"; } entity_class: t_PROCEDURE { $$="procedure"; } -entity_class: t_FUNCTION { $$="function"; } +entity_class: t_FUNCTION { $$="function"; } entity_class: t_SIGNAL { $$="signal"; } entity_class: t_VARIABLE { $$="variable"; } entity_class: t_CONSTANT { $$="constant"; } @@ -1277,69 +1296,90 @@ entity_class: t_PROPERTY { $$="property"; } /*-------------------------------------------------- -- Schemes - --------------------------------------------------------------------------*/ -if_generation_scheme: if_scheme +if_generation_scheme: if_scheme { $$=$1; } -if_scheme: t_IF expr t_GENERATE generate_statement_body if_scheme_1 if_scheme_2 -if_scheme: t_IF lable expr t_GENERATE generate_statement_body if_scheme_1 if_scheme_2 +if_scheme: t_IF expr t_GENERATE generate_statement_body if_scheme_1 if_scheme_2 {$$="";} +if_scheme: t_IF lable expr t_GENERATE generate_statement_body if_scheme_1 if_scheme_2 {$$="";} -if_scheme_2: /* empty */ -if_scheme_2: t_ELSE t_GENERATE generate_statement_body -if_scheme_2: t_ELSE lable t_GENERATE generate_statement_body -if_scheme_1: /* empty */ -if_scheme_1: if_scheme_1 if_scheme_3 -if_scheme_3: t_ELSIF expr t_GENERATE generate_statement_body -if_scheme_3: t_ELSIF lable expr t_GENERATE generate_statement_body +if_scheme_2: /* empty */ { $$=""; } +if_scheme_2: t_ELSE t_GENERATE generate_statement_body { $$="else generate "+$3; } +if_scheme_2: t_ELSE lable t_GENERATE generate_statement_body { $$="else "+$2+" generate "+$4; } +if_scheme_1: /* empty */ { $$=""; } +if_scheme_1: if_scheme_1 if_scheme_3 { $$=$1+$2; } +if_scheme_3: t_ELSIF expr t_GENERATE generate_statement_body { $$="elsif "+$2+" generate "+$4; } +if_scheme_3: t_ELSIF lable expr t_GENERATE generate_statement_body { $$="elsif "+$2+$3+" generate "+$5; } -generation_scheme: for_scheme +generation_scheme: for_scheme {$$=$1;} -iteration_scheme: for_scheme -iteration_scheme: while_scheme +iteration_scheme: for_scheme {$$=$1;} +iteration_scheme: while_scheme {$$=$1;} -for_scheme: t_FOR t_Identifier t_IN discrete_range -for_scheme: t_FOR lable t_Identifier t_IN discrete_range - -while_scheme: t_WHILE expr +for_scheme: t_FOR t_Identifier t_IN discrete_range + { + if(!lab.isEmpty()) + $$=lab+" :for "+$2+" in "+$4; + else + $$=" for "+$2+" in "+$4; + FlowNode::addFlowNode(FlowNode::FOR_NO,0,$$,lab.data()); + lab.resize(0); + } +for_scheme: t_FOR lable t_Identifier t_IN discrete_range + { + $$=lab+" for "+$2+$3+" in "+$5; + FlowNode::addFlowNode(FlowNode::FOR_NO,0,$$,lab.data()); + lab=""; + } + +while_scheme: t_WHILE expr { + $$=" while "+$2; + FlowNode::addFlowNode(FlowNode::WHILE_NO,0,$$,lab.data()); + lab=""; + } /*-------------------------------------------------- -- Concurrent Statements ----------------------------------------------------*/ -concurrent_stats: concurrent_stats_1 -concurrent_stats_1: /* empty */ -concurrent_stats_1: concurrent_stats_1 concurrent_stats_2 -concurrent_stats_2: concurrent_stat - -concurrent_stat : block_stat - | concurrent_assertion_stat - | concurrent_procedure_call - | concurrent_signal_assign_stat - | comp_inst_stat - | generate_stat - | procs_stat +concurrent_stats: concurrent_stats_1 {$$=$1;} +concurrent_stats_1: /* empty */ {$$="";} +concurrent_stats_1: concurrent_stats_1 concurrent_stats_2 {$$=$1+$2;} +concurrent_stats_2: concurrent_stat {$$=$1;} + +concurrent_stat : block_stat {$$=$1;} + | concurrent_assertion_stat {$$=$1;} + | concurrent_procedure_call {$$=$1;} + | concurrent_signal_assign_stat {$$=$1;} + | comp_inst_stat + { + QCString li=$1; + $$=$1; + + } + | generate_stat {$$=$1;} + | procs_stat block_stat: t_Identifier t_Colon t_BLOCK block_stat_0 block_stat_1 block_stat_2 block_stat_3 block_stat_4 t_BEGIN concurrent_stats t_END t_BLOCK block_stat_5 - t_Semicolon -block_stat_5: /* empty */ -block_stat_5: t_Identifier -block_stat_4: /* empty */ -block_stat_4: block_stat_4 block_stat_6 -block_stat_6: block_decltve_item -block_stat_3: /* empty */ -block_stat_3: t_PORT interf_list t_Semicolon block_stat_7 -//block_sta_7: /* empty */ -block_stat_7: t_PORT t_MAP association_list t_Semicolon -block_stat_2: /* empty */ -block_stat_2: t_GENERIC interf_list t_Semicolon block_stat_8 -block_stat_8: /* empty */ -block_stat_8: t_GENERIC t_MAP association_list t_Semicolon -block_stat_1: /* empty */ -block_stat_1: t_LeftParen expr t_RightParen block_stat_0 -block_stat_0: /* empty */ -block_stat_0: t_IS + t_Semicolon {$$=$1+":block"+$4+$5+$6+$7+$8+"begin "+$10+" block "+$13;} +block_stat_5: /* empty */ {$$="";} +block_stat_5: t_Identifier {$$=$1;} +block_stat_4: /* empty */ {$$=""; } +block_stat_4: block_stat_4 block_stat_6 {$$=$1+$2;} +block_stat_6: block_decltve_item {$$=$1;} +block_stat_3: /* empty */ {$$="";} +block_stat_3: t_PORT interf_list t_Semicolon block_stat_7 {$$="port "+$2+";"+$4; } +//block_sta_7: /* empty */ {$$="";} +block_stat_7: t_PORT t_MAP association_list t_Semicolon {$$="port map "+$3; } +block_stat_2: /* empty */ {$$="";} +block_stat_2: t_GENERIC interf_list t_Semicolon block_stat_8 {$$="generic "+$2+";"+$4; } +block_stat_8: /* empty */ {$$="";} +block_stat_8: t_GENERIC t_MAP association_list t_Semicolon {$$="generic map "+$3; } +block_stat_1: /* empty */ {$$="";} +block_stat_1: t_LeftParen expr t_RightParen block_stat_0 {$$="("+$2+")"+$4; } +block_stat_0: /* empty */ {$$=""; } +block_stat_0: t_IS {$$=" is ";} dot_name: t_Identifier { $$=$1; } | dot_name t_Dot t_Identifier { $$=$1+"."+$3; } @@ -1356,90 +1396,91 @@ vcomp_stat: t_COMPONENT { $$="component";yyLineNr=s_str.iLine; } comp_inst_stat: t_Identifier t_Colon name { yyLineNr=s_str.iLine; } t_GENERIC t_MAP association_list comp_inst_stat_1 t_Semicolon { - addCompInst($1.data(),$3.data(),0,yyLineNr); + addCompInst($1.data(),$3.data(),0,yyLineNr);$$=""; } comp_inst_stat: t_Identifier t_Colon name { yyLineNr=s_str.iLine; } t_PORT t_MAP association_list t_Semicolon { - addCompInst($1.data(),$3.data(),0,yyLineNr); + addCompInst($1.data(),$3.data(),0,yyLineNr);$$="222"; } comp_inst_stat: t_Identifier t_Colon vcomp_stat mark_comp t_PORT t_MAP association_list t_Semicolon { - addCompInst($1.data(),$4.data(),$3.data(),yyLineNr); + addCompInst($1.data(),$4.data(),$3.data(),yyLineNr);$$=""; } comp_inst_stat: t_Identifier t_Colon vcomp_stat mark_comp t_GENERIC t_MAP association_list comp_inst_stat_1 t_Semicolon { - addCompInst($1.data(),$4.data(),$3.data(),yyLineNr); + addCompInst($1.data(),$4.data(),$3.data(),yyLineNr);$$=""; } -comp_inst_stat_1: /* empty */ -comp_inst_stat_1: t_PORT t_MAP association_list +comp_inst_stat_1: /* empty {$$="";} */ +comp_inst_stat_1: t_PORT t_MAP association_list // {$$="port map"+$3;} -concurrent_assertion_stat: t_Identifier t_Colon assertion_stat -concurrent_assertion_stat: assertion_stat +concurrent_assertion_stat: t_Identifier t_Colon assertion_stat {$$=$1+":"+$3;} +concurrent_assertion_stat: assertion_stat {$$=$1; } -concurrent_assertion_stat: t_Identifier t_Colon t_POSTPONED assertion_stat -concurrent_assertion_stat: t_POSTPONED assertion_stat +concurrent_assertion_stat: t_Identifier t_Colon t_POSTPONED assertion_stat {$$=$1+":"+"postponed "+$4; } +concurrent_assertion_stat: t_POSTPONED assertion_stat {$$="postponed "+$2; } -concurrent_procedure_call: t_Identifier t_Colon procedure_call_stat -concurrent_procedure_call: procedure_call_stat +concurrent_procedure_call: t_Identifier t_Colon procedure_call_stat {$$=$1+":"+$3; } +concurrent_procedure_call: procedure_call_stat {$$=$1;} -concurrent_procedure_call: t_Identifier t_Colon t_POSTPONED procedure_call_stat -concurrent_procedure_call: t_POSTPONED procedure_call_stat +concurrent_procedure_call: t_Identifier t_Colon t_POSTPONED procedure_call_stat {$$=$1+":"+"postponed "+$4; } +concurrent_procedure_call: t_POSTPONED procedure_call_stat {$$="postponed "+$2; } -concurrent_signal_assign_stat: t_Identifier t_Colon condal_signal_assign -concurrent_signal_assign_stat: condal_signal_assign +concurrent_signal_assign_stat: t_Identifier t_Colon condal_signal_assign {$$=$1+":"+$3; } +concurrent_signal_assign_stat: condal_signal_assign {$$=$1;} -concurrent_signal_assign_stat: t_Identifier t_Colon t_POSTPONED condal_signal_assign -concurrent_signal_assign_stat: t_POSTPONED condal_signal_assign +concurrent_signal_assign_stat: t_Identifier t_Colon t_POSTPONED condal_signal_assign {$$=$1+":"+"postponed "+$4; } +concurrent_signal_assign_stat: t_POSTPONED condal_signal_assign {$$="postponed "+$2; } -concurrent_signal_assign_stat: t_Identifier t_Colon t_POSTPONED sel_signal_assign -concurrent_signal_assign_stat: t_POSTPONED sel_signal_assign +concurrent_signal_assign_stat: t_Identifier t_Colon t_POSTPONED sel_signal_assign {$$=$1+":"+"postponed "+$4; } +concurrent_signal_assign_stat: t_POSTPONED sel_signal_assign {$$="postponed "+$2; } -concurrent_signal_assign_stat: t_Identifier t_Colon sel_signal_assign -concurrent_signal_assign_stat: sel_signal_assign +concurrent_signal_assign_stat: t_Identifier t_Colon sel_signal_assign {$$=$1+":"+$3; } +concurrent_signal_assign_stat: sel_signal_assign {$$=$1; } -condal_signal_assign: target t_LESym opts condal_wavefrms t_Semicolon +condal_signal_assign: target t_LESym opts condal_wavefrms t_Semicolon {$$=$1+"<="+$3+$4; } -condal_wavefrms: wavefrm -condal_wavefrms: wavefrm t_WHEN expr -condal_wavefrms: wavefrm t_WHEN expr t_ELSE condal_wavefrms +condal_wavefrms: wavefrm {$$=$1;} +condal_wavefrms: wavefrm t_WHEN expr {$$=$1+" when "+$3;} +condal_wavefrms: wavefrm t_WHEN expr t_ELSE condal_wavefrms {$$=$1+" when "+$3+"else"+$5;} -wavefrm: wavefrm_element wavefrm_1 -wavefrm: t_UNAFFECTED -wavefrm_1: /* empty */ -wavefrm_1: wavefrm_1 wavefrm_2 -wavefrm_2: t_Comma wavefrm_element +wavefrm: wavefrm_element wavefrm_1 {$$=$1+$2;} +wavefrm: t_UNAFFECTED {$$="unaffected";} +wavefrm_1: /* empty */ {$$="";} +wavefrm_1: wavefrm_1 wavefrm_2 {$$=$1+$2;} +wavefrm_2: t_Comma wavefrm_element {$$=","+$2;} -wavefrm_element: expr wavefrm_element_1 -wavefrm_element_1: /* empty */ -wavefrm_element_1: t_AFTER expr -wavefrm_element_1: t_NULL wavefrm_element_2 -wavefrm_element_1: t_NULL -wavefrm_element_2: t_AFTER expr +wavefrm_element: expr wavefrm_element_1 {$$=$1+$2;} +wavefrm_element_1: /* empty */ {$$="";} +wavefrm_element_1: t_AFTER expr {$$="after "+$2;} +wavefrm_element_1: t_NULL wavefrm_element_2 {$$=" null "+$2;} +wavefrm_element_1: t_NULL {$$=" null ";} +wavefrm_element_2: t_AFTER expr {$$="after "+$2;} -target: name -target: aggregate +target: name {$$=$1;} +target: aggregate {$$=$1;} -opts: opts_1 opts_2 +opts: opts_1 opts_2 {$$=$1+$2;} -opts_2: /* empty */ -opts_2: t_TRANSPORT -opts_2: t_REJECT expr t_INERTIAL -opts_2: t_INERTIAL +opts_2: /* empty */ {$$="";} +opts_2: t_TRANSPORT {$$="transport ";} +opts_2: t_REJECT expr t_INERTIAL {$$="transport"+$2+" intertial ";} +opts_2: t_INERTIAL {$$=" intertial ";} -opts_1: /* empty */ -opts_1: t_GUARDED +opts_1: /* empty */ {$$="";} +opts_1: t_GUARDED {$$=" guarded ";} -sel_signal_assign: t_WITH expr t_SELECT target t_LESym opts sel_wavefrms t_Semicolon +sel_signal_assign: t_WITH expr t_SELECT target t_LESym opts sel_wavefrms t_Semicolon + {$$="with "+$2+" select "+$4+"<="+$6+$7;} + +sel_wavefrms: sel_wavefrms_1 wavefrm t_WHEN choices {$$=$1+$2;} +sel_wavefrms_1: /* empty */ {$$="";} +sel_wavefrms_1: sel_wavefrms_1 sel_wavefrms_2 {$$=$1+$2;} +sel_wavefrms_2: wavefrm t_WHEN choices t_Comma {$$=$1+" when "+$3;} -sel_wavefrms: sel_wavefrms_1 wavefrm t_WHEN choices -sel_wavefrms_1: /* empty */ -sel_wavefrms_1: sel_wavefrms_1 sel_wavefrms_2 -sel_wavefrms_2: wavefrm t_WHEN choices t_Comma - -gen_stat1: /* empty */ - | block_declarative_part t_BEGIN - | t_BEGIN +gen_stat1: /* empty */ {$$="";} + | block_declarative_part t_BEGIN {$$=$1+" begin ";} + | t_BEGIN {$$="begin ";} // problem with double end // end; @@ -1465,29 +1506,41 @@ generate_stat_1: t_GENERATE { $$=""; } generate_stat_1: t_GENERATE t_Identifier { $$=$2; } //end_stats : -end_stats: t_END t_Semicolon -end_stats: t_END t_Identifier t_Semicolon +end_stats: t_END t_Semicolon { $$="end"; } +end_stats: t_END t_Identifier t_Semicolon { $$="end "+$2; } procs_stat: t_Identifier t_Colon procs_stat1 - { + { current->name=$1; + tempEntry=current; current->endBodyLine=s_str.yyLineNr; newEntry(); + currName=$1; } procs_stat: procs_stat1 { current->name=VhdlDocGen::getProcessNumber(); current->endBodyLine=s_str.yyLineNr; + tempEntry=current; newEntry(); } procs_stat1: procs_stat1_5 - { currP=VhdlDocGen::PROCESS; } + { + currP=VhdlDocGen::PROCESS; + current->startLine=s_str.yyLineNr; + current->bodyLine=s_str.yyLineNr; + } t_PROCESS procs_stat1_1 procs_stat1_2 t_BEGIN seq_stats t_END procs_stat1_3 t_Semicolon - { currP=0; - createFunction(currName,VhdlDocGen::PROCESS,$4.data()); + { + $5.stripPrefix($4.data()); + tempEntry=current; + currP=0; + createFunction(currName,VhdlDocGen::PROCESS,$4.data()); + createFlow($5); + currName=""; } procs_stat1: error t_END procs_stat1_3 t_Semicolon { currP=0; } @@ -1500,10 +1553,10 @@ procs_stat1_5: t_POSTPONED { $$="postponed"; } procs_stat1_6: /* empty */ { $$=""; } procs_stat1_6: t_Identifier { $$=$1; } -procs_stat1_2: /* empty */ -procs_stat1_2: t_IS -procs_stat1_2: procs_stat1_2 procs_stat1_4 -procs_stat1_4: procs_decltve_item +procs_stat1_2: /* empty */ {$$="";} +procs_stat1_2: t_IS {$$="";} +procs_stat1_2: procs_stat1_2 procs_stat1_4 { $$+=$2; } +procs_stat1_4: procs_decltve_item { $$=$1; } procs_stat1_1: /* empty */ { $$=""; } procs_stat1_1: t_LeftParen t_ALL t_RightParen { $$="all"; } procs_stat1_1: t_LeftParen sensitivity_list t_RightParen { $$=$2; } @@ -1517,113 +1570,201 @@ sensitivity_list_2: t_Comma name { $$=","+$2; } -- Sequential Statements ----------------------------------------------------*/ -seq_stats: seq_stats_1 -seq_stats_1: /* empty */ -seq_stats_1: seq_stats_1 seq_stats_2 -seq_stats_2: seq_stat - -seq_stat: assertion_stat -seq_stat: lable assertion_stat -seq_stat: case_stat -seq_stat: exit_stat -seq_stat: if_stat -seq_stat: loop_stat -seq_stat: next_stat -seq_stat: null_stat -seq_stat: procedure_call_stat -seq_stat: return_stat -seq_stat: lable signal_assign_stat -seq_stat: signal_assign_stat -seq_stat: variable_assign_stat -seq_stat: wait_stat -seq_stat: lable wait_stat -seq_stat: report_statement - -report_statement: loop_stat_1 t_REPORT expr assertion_stat_2 t_Semicolon - -assertion_stat: t_ASSERT expr assertion_stat_1 assertion_stat_2 t_Semicolon -assertion_stat_2: /* empty */ -assertion_stat_2 : t_SEVERITY expr -assertion_stat_1 : /* empty */ -assertion_stat_1 : t_REPORT expr - -choice_stat : /* empty */ -choice_stat : t_Q - -choice_stat_1: /* empty */ -choice_stat_1 : t_Q -choice_stat_1 : t_Identifier - -case_stat : t_CASE choice_stat expr t_IS case_stat_alternative case_stat_1 t_END t_CASE choice_stat_1 t_Semicolon -case_stat : lable t_CASE choice_stat expr t_IS case_stat_alternative case_stat_1 t_END t_CASE choice_stat_1 t_Semicolon - -case_stat : t_CASE error t_END t_CASE choice_stat_1 t_Semicolon -case_stat_1 : /* empty */ -case_stat_1 : case_stat_1 case_stat_2 -case_stat_2 : case_stat_alternative - -case_stat_alternative : t_WHEN choices t_Arrow seq_stats - -exit_stat : t_EXIT exit_stat_1 exit_stat_2 t_Semicolon -exit_stat_2 : /* empty */ -exit_stat_2 : t_WHEN expr -exit_stat_1 : /* empty */ -exit_stat_1 : t_Identifier - -if_stat : t_IF expr t_THEN seq_stats if_stat_1 if_stat_2 t_END t_IF t_Semicolon -if_stat : t_IF expr t_THEN error t_END t_IF t_Semicolon -if_stat_2 : /* empty */ -if_stat_2 : t_ELSE seq_stats -if_stat_1 : /* empty */ -if_stat_1 : if_stat_1 if_stat_3 -if_stat_3 : t_ELSIF expr t_THEN seq_stats +seq_stats: seq_stats_1 {$$=$1;} +seq_stats_1: /* empty */ {$$="";} +seq_stats_1: seq_stats_1 seq_stats_2 {$$=$1+$2;} +seq_stats_2: seq_stat {$$=$1;} + +seq_stat: assertion_stat {$$=$1; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);} +seq_stat: lable assertion_stat {$$=$1+$2; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);} +seq_stat: case_stat {$$=$1;} +seq_stat: exit_stat { + $$=$1; + } +seq_stat: if_stat {$$="";} +seq_stat: loop_stat {$$=$1;} +seq_stat: next_stat { + $$=$1; + } +seq_stat: null_stat {$$=$1; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);} +seq_stat: procedure_call_stat {$$=$1; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);} +seq_stat: return_stat {$$=$1; FlowNode::addFlowNode(FlowNode::RETURN_NO,$$.data(),0);} +seq_stat: lable signal_assign_stat {$$=$1+$2;} +seq_stat: signal_assign_stat + { + $$=$1; + FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0); + } +seq_stat: variable_assign_stat { $$=$1; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);} +seq_stat: wait_stat {$$=$1; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);} +seq_stat: lable wait_stat {$$=$1+$2; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);} +seq_stat: report_statement {$$=$1; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);} + +report_statement: loop_stat_1 t_REPORT expr assertion_stat_2 t_Semicolon {$$=$1+"report "+$3+$4+";"; } + +assertion_stat: t_ASSERT expr assertion_stat_1 assertion_stat_2 t_Semicolon {$$="assert "+$2+$3+$4+";";} +assertion_stat_2: /* empty */ {$$="";} +assertion_stat_2 : t_SEVERITY expr {$$=" serverity "+$2;} +assertion_stat_1 : /* empty */ {$$="";} +assertion_stat_1 : t_REPORT expr {$$=" report "+$2;} + +choice_stat : /* empty */ {$$="";} +choice_stat : t_Q {$$="?";} + +choice_stat_1: /* empty */ {$$="";} +choice_stat_1 : t_Q {$$="?";} +choice_stat_1 : t_Identifier {$$=$1;} + + +case_stat : t_CASE choice_stat expr + { + QCString ca="case "+$2+$3; + FlowNode::addFlowNode(FlowNode::CASE_NO,0,ca); + } + t_IS case_stat_alternative case_stat_1 t_END t_CASE choice_stat_1 t_Semicolon + { + FlowNode::addFlowNode(FlowNode::END_CASE,"end case",0); + FlowNode::moveToPrevLevel(); + } + -loop_stat: loop_stat_1 loop_stat_2 t_LOOP seq_stats t_END t_LOOP loop_stat_3 t_Semicolon -loop_stat_3: /* empty */ -loop_stat_3: t_Identifier -loop_stat_2: /* epty */ -loop_stat_2: iteration_scheme -loop_stat_1: /* empty */ -loop_stat_1: t_Identifier t_Colon +case_stat : lable t_CASE choice_stat expr + { + QCString ca="case "+$3+$4; + FlowNode::addFlowNode(FlowNode::CASE_NO,0,ca); + } + t_IS case_stat_alternative case_stat_1 t_END t_CASE choice_stat_1 t_Semicolon + { + FlowNode::addFlowNode(FlowNode::END_CASE,0,0); + FlowNode::moveToPrevLevel(); + } -next_stat: t_NEXT next_stat_1 next_stat_2 t_Semicolon -next_stat_2: /* empty */ -next_stat_2: t_WHEN expr -next_stat_1: /* empty */ -next_stat_1: t_Identifier +case_stat : t_CASE error t_END t_CASE choice_stat_1 t_Semicolon {$$="";} +case_stat_1 : /* empty */ {$$="";} +case_stat_1 : case_stat_1 case_stat_2 {$$=$1+$2;} +case_stat_2 : case_stat_alternative {$$=$1;} +case_stat_alternative : t_WHEN choices t_Arrow + { + QCString t="when "; + t+=$2+"=> "; + FlowNode::addFlowNode(FlowNode::WHEN_NO,0,t); + } +seq_stats {$$="";} -null_stat: t_NULL t_Semicolon -procedure_call_stat: name t_Semicolon -return_stat: t_RETURN return_stat_1 t_Semicolon -return_stat_1: /* empty */ -return_stat_1: expr +if_stat : t_IF expr t_THEN + { + $2.prepend("if "); + FlowNode::addFlowNode(FlowNode::IF_NO,0,$2); + } + seq_stats + + if_stat_1 if_stat_2 t_END t_IF t_Semicolon + { + FlowNode::addFlowNode(FlowNode::ENDIF_NO,0,0); + FlowNode::moveToPrevLevel(); + } + +if_stat_2 : /* empty */ {$$=""; } +if_stat_2 : t_ELSE + { + FlowNode::addFlowNode(FlowNode::ELSE_NO,0,0); + } seq_stats {$$=""; } + + +if_stat_1 : /* empty */ {$$=""; } +if_stat_1 : if_stat_1 if_stat_3 {$$=$1+$2; } +if_stat_3 : t_ELSIF expr t_THEN + { + FlowNode::addFlowNode(FlowNode::ELSIF_NO,0,$2.data()); + } seq_stats {$$="";} + +loop_stat: loop_stat_1 loop_stat_2 t_LOOP seq_stats t_END t_LOOP loop_stat_3 t_Semicolon + { + + $$=$1+$2+" loop "+$4+" end loop" +$7; + QCString endLoop="end loop" + $7; + FlowNode::addFlowNode(FlowNode::END_LOOP,endLoop.data(),0); + FlowNode::moveToPrevLevel(); + } + +loop_stat_3: /* empty */ {$$=""; } +loop_stat_3: t_Identifier {$$=$1; } +loop_stat_2: /* empty */ { + $$=""; + FlowNode::addFlowNode(FlowNode::LOOP_NO,0,"infinite loop"); + } +loop_stat_2: iteration_scheme +loop_stat_1: /* empty */ {$$=""; } +loop_stat_1: t_Identifier t_Colon {$$=$1+":";lab=$1;} + +exit_stat : loop_stat_1 t_EXIT exit_stat_1 exit_stat_2 t_Semicolon + { + $$=$1+"exit "+$3+";"; + if($4.data()) + FlowNode::addFlowNode(FlowNode::EXIT_WHEN_NO,0,$4.data(),0); + + FlowNode::addFlowNode(FlowNode::EXIT_NO,$$.data(),0,$3.data()); + } +exit_stat_2 : /* empty */ {$$="";} +exit_stat_2 : t_WHEN expr {$$="when "+$2;} +exit_stat_1 : /* empty */ {$$="";} +exit_stat_1 : t_Identifier {$$=$1;lab=$$;} -signal_assign_stat: target t_LESym wavefrm t_Semicolon - | target t_LESym delay_mechanism wavefrm t_Semicolon - | target t_LESym t_FORCE inout_stat expr t_Semicolon - | target t_LESym t_RELEASE inout_stat t_Semicolon - | selected_signal_assignment - | conditional_signal_assignment + +next_stat: loop_stat_1 t_NEXT next_stat_1 next_stat_2 t_Semicolon + { + $$=$1+"next "+$3+";" ; + if($4.data()) + FlowNode::addFlowNode(FlowNode::EXIT_WHEN_NO,0,$4.data(),0); + FlowNode::addFlowNode(FlowNode::NEXT_NO,$$.data(),0,$3.data()); + } + +next_stat_2: /* empty */ {$$=""; } +next_stat_2: t_WHEN expr {$$="when "+$2; } +next_stat_1: /* empty */ {$$=""; } +next_stat_1: t_Identifier {$$=$1;lab=$$; } + +null_stat: t_NULL t_Semicolon {$$="null"; $$+=";";} + +procedure_call_stat: name t_Semicolon + { + $$=$1+";"; + } + +return_stat: t_RETURN return_stat_1 t_Semicolon {$$="return "+$2+";" ;} +return_stat_1: /* empty */ {$$=""; } +return_stat_1: expr {$$=$1; } + +signal_assign_stat: target t_LESym wavefrm t_Semicolon {$$=$1+" <="+$3+";" ;} + | target t_LESym delay_mechanism wavefrm t_Semicolon {$$=$1+ "<= "+$3+$4 +";";} + | target t_LESym t_FORCE inout_stat expr t_Semicolon {$$=$1+ "<= "+ " force "+$4+";" ;} + | target t_LESym t_RELEASE inout_stat t_Semicolon {$$=$1+ "<= "+" release "+$4 +";";} + | selected_signal_assignment {$$=$1; } + | conditional_signal_assignment {$$=$1; } ; -variable_assign_stat: variable_assign_stat_1 t_Semicolon - | conditional_variable_assignment - | lable selected_variable_assignment - | selected_variable_assignment +variable_assign_stat: variable_assign_stat_1 t_Semicolon {$$=$1+";"; } + | conditional_variable_assignment {$$=$1; } + | lable selected_variable_assignment {$$=$1; } + | selected_variable_assignment {$$=$1; } -lable: t_Identifier t_Colon -variable_assign_stat_1: target t_VarAsgn expr -variable_assign_stat_1: lable target t_VarAsgn expr +lable: t_Identifier t_Colon { $$=$1+":"; } +variable_assign_stat_1: target t_VarAsgn expr {$$=$1+":="+$3; } +variable_assign_stat_1: lable target t_VarAsgn expr {$$=$1+$2+":="+$4; } wait_stat: t_WAIT wait_stat_1 wait_stat_2 wait_stat_3 t_Semicolon -wait_stat_3: /* empty */ -wait_stat_3: t_FOR expr -wait_stat_2: /* empty */ -wait_stat_2: t_UNTIL expr -wait_stat_1: /* empty */ -wait_stat_1: t_ON sensitivity_list + { + $$="wait "+$2+$3+$4+";"; + } + +wait_stat_3: /* empty */ {$$=""; } +wait_stat_3: t_FOR expr {$$="for "+$2; } +wait_stat_2: /* empty */ {$$=""; } +wait_stat_2: t_UNTIL expr {$$=" until "+$2; } +wait_stat_1: /* empty */ {$$=""; } +wait_stat_1: t_ON sensitivity_list {$$=" on "+$2; } /*-------------------------------------------------- @@ -1715,11 +1856,11 @@ inst_list: t_OTHERS { $$="others"; } binding_indic : entity_aspect binding_indic_1 binding_indic_2 { $$=$1; } -binding_indic_2: -binding_indic_2: t_PORT t_MAP association_list +binding_indic_2: {$$="";} +binding_indic_2: t_PORT t_MAP association_list {$$="port map "+$3;} -binding_indic_1: -binding_indic_1: t_GENERIC t_MAP association_list +binding_indic_1: {$$="";} +binding_indic_1: t_GENERIC t_MAP association_list {$$="generic map "+$3;} entity_aspect: t_ENTITY name { $$="entity "+$2; } @@ -1748,9 +1889,10 @@ group_template_declaration : t_GROUP t_Identifier t_IS t_LeftParen entity_cl addVhdlType($2,getParsedLine(t_GROUP),Entry::VARIABLE_SEC,VhdlDocGen::GROUP,$5.data(),0); } -group_template_declaration: t_GROUP t_Identifier t_IS t_LeftParen error t_Semicolon t_RightParen { $$=""; } +group_template_declaration: t_GROUP t_Identifier t_IS t_LeftParen error t_Semicolon t_RightParen{ $$=""; } + -entity_class_entry : entity_class tbox +entity_class_entry : entity_class tbox {$$=$1+$2;} tbox : /* empty */ { $$=""; } tbox : t_Box { $$="<>"; } @@ -1898,8 +2040,8 @@ when_stats: when_stats_1 ttend: t_END t_Semicolon ttend: t_END t_Identifier t_Semicolon -conditional_signal_assignment: conditional_waveform_assignment -conditional_signal_assignment: conditional_force_assignment +conditional_signal_assignment: conditional_waveform_assignment {$$="";} +conditional_signal_assignment: conditional_force_assignment {$$="";} conditional_waveform_assignment: target t_LESym wavefrm_element t_WHEN expr else_wave_list t_Semicolon conditional_waveform_assignment: target t_LESym delay_mechanism wavefrm_element t_WHEN expr else_wave_list t_Semicolon @@ -1913,8 +2055,8 @@ else_wave_list: t_ELSE expr conditional_force_assignment: target t_LESym t_FORCE inout_stat expr t_WHEN expr else_stat t_Semicolon conditional_force_assignment: target t_LESym t_FORCE inout_stat expr t_WHEN expr t_Semicolon -selected_signal_assignment : selected_waveform_assignment -selected_signal_assignment : selected_force_assignment +selected_signal_assignment : selected_waveform_assignment {$$="";} +selected_signal_assignment : selected_force_assignment {$$="";} selected_waveform_assignment: t_WITH expr t_SELECT choice_stat target t_LESym delay_stat sel_wave_list @@ -1930,13 +2072,13 @@ sel_wave_list_1: wavefrm_element t_WHEN choices t_Semicolon selected_force_assignment: t_WITH expr t_SELECT choice_stat target t_LESym t_FORCE inout_stat sel_var_list -inout_stat: -inout_stat: t_IN -inout_stat: t_OUT +inout_stat: /* empty */ {$$="";} +inout_stat: t_IN {$$=" in ";} +inout_stat: t_OUT {$$="out";} -delay_mechanism : t_TRANSPORT - | t_REJECT expr t_INERTIAL - | t_INERTIAL +delay_mechanism : t_TRANSPORT { $$=" transport ";} + | t_REJECT expr t_INERTIAL { $$=" reject "+$2+"inertial ";} + | t_INERTIAL { $$=" inertial ";} conditional_variable_assignment : variable_assign_stat_1 t_WHEN expr else_stat t_Semicolon conditional_variable_assignment : variable_assign_stat_1 t_WHEN expr t_Semicolon @@ -1945,7 +2087,7 @@ else_stat: t_ELSE expr t_WHEN expr else_stat: else_stat t_ELSE expr t_WHEN expr else_stat: t_ELSE expr -selected_variable_assignment: t_WITH expr t_SELECT choice_stat select_name t_VarAsgn sel_var_list +selected_variable_assignment: t_WITH expr t_SELECT choice_stat select_name t_VarAsgn sel_var_list {$$="";} sel_var_list: expr t_WHEN choices t_Comma sel_var_list sel_var_list: sel_var_list_1 @@ -2067,22 +2209,17 @@ extern YYSTYPE vhdlScanYYlval; void vhdlScanYYerror(const char* /*str*/) { -// fprintf(stderr,"\n<---error at line %d : [ %s] in file : %s ---->",s_str.yyLineNr,s_str.qstr.data(),s_str.fileName); + // fprintf(stderr,"\n<---error at line %d : [ %s] in file : %s ---->",s_str.yyLineNr,s_str.qstr.data(),s_str.fileName); // exit(0); } + void vhdlParse() { -// //myconv=conv; - vhdlScanYYparse(); +vhdlScanYYparse(); } -//int lex(void) -//{ -// return myconv->doLex(); -//} - -VhdlContainer* getVhdlCont() +struct VhdlContainer* getVhdlCont() { return &s_str; } @@ -2109,7 +2246,7 @@ static void addCompInst(char *n, char* instName, char* comp,int iLine) current->args=lastCompound->name; // architecture name current->includeName=comp; // component/enity/configuration - //printf(" \n genlable: [%s] inst: [%s] name: [%s] \n",genLabels.data(),instName,n); + //printf(" \n genlable: [%s] inst: [%s] name: [%s] %d\n",n,instName,comp,iLine); if (lastCompound) { @@ -2147,12 +2284,13 @@ static void popConfig() { assert(currNode); currNode=currNode->prevNode; - // printf("\n pop arch %s ",currNode->arch.data()); + printf("\n pop arch %s ",currNode->arch.data()); } static void addConfigureNode(const char* a,const char*b, bool isRoot,bool isLeave,bool inlineConf) { - VhdlConfNode* co; + assert(false); + VhdlConfNode* co; QCString ent,arch,lab; ent=a; lab = VhdlDocGen::parseForConfig(ent,arch); @@ -2190,7 +2328,7 @@ static void addConfigureNode(const char* a,const char*b, bool isRoot,bool isLeav } }// addConfigure -//------------------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------------------ static bool isFuncProcProced() { @@ -2215,7 +2353,6 @@ static void initEntry(Entry *e) static void addProto(const char *s1,const char *s2,const char *s3, const char *s4,const char *s5,const char *s6) { - // (void)s3; // avoid unused warning (void)s5; // avoid unused warning static QRegExp reg("[\\s]"); QCString name=s2; @@ -2258,9 +2395,10 @@ static void createFunction(const QCString &impure,int spec, const QCString &fname) { int it=0; - current->bodyLine=getParsedLine(spec); current->spec=spec; current->section=Entry::FUNCTION_SEC; + +if(impure=="impure" || impure=="pure") current->exception=impure; if (parse_sec==GEN_SEC) @@ -2287,8 +2425,9 @@ static void createFunction(const QCString &impure,int spec, current->args=fname; current->name=impure; if (!fname.isEmpty()) + VhdlDocGen::deleteAllChars(current->args,' '); { - QStringList q1=QStringList::split(',',fname); + QStringList q1=QStringList::split(",",fname); for (uint ii=0;ii<q1.count();ii++) { Argument *arg=new Argument; @@ -2296,20 +2435,21 @@ static void createFunction(const QCString &impure,int spec, current->argList->append(arg); } } + return; } - current->startLine=getParsedLine(it); - current->bodyLine=getParsedLine(it); + + current->startLine=getParsedLine(it); + current->bodyLine=getParsedLine(it); + } static void addVhdlType(const QCString &name,int startLine,int section,int spec, const char* args,const char* type,Protection prot) { static QRegExp reg("[\\s]"); - - //int startLine=getParsedLine(spec); - - if (isFuncProcProced()) + + if (isFuncProcProced() || VhdlDocGen::getFlowMember()) { return; } @@ -2379,3 +2519,50 @@ static void newEntry() initEntry(current); } +void createFlow(QCString val) +{ + + if(!VhdlDocGen::getFlowMember()) return; + QCString q,ret; + + if(currP==VhdlDocGen::FUNCTION) + { + q=":function( "; + FlowNode::alignFuncProc(q,tempEntry->argList,true); + q+=")"; + } + else if(currP==VhdlDocGen::PROCEDURE) + { + q=":procedure ("; + FlowNode::alignFuncProc(q,tempEntry->argList,false); + q+=")"; + } + else { + q=":process( "+tempEntry->args; + q+=")"; + } + + q.prepend(VhdlDocGen::getFlowMember()->name().data()); + + FlowNode::addFlowNode(FlowNode::START_NO,q,0); + + if(!val.isEmpty()) + FlowNode::addFlowNode(FlowNode::VARIABLE_NO,val,0); + + if(currP==VhdlDocGen::FUNCTION) + { + ret="end function "; + } + else if(currP==VhdlDocGen::PROCEDURE) + ret="end procedure"; + else + ret="end process "; + + FlowNode::addFlowNode(FlowNode::END_NO,ret,0); + // FlowNode::printFlowList(); + FlowNode::writeFlowNode(); + currP=0; + } + + +
\ No newline at end of file diff --git a/src/vhdlscanner.l b/src/vhdlscanner.l index a13a51c..e7de626 100644 --- a/src/vhdlscanner.l +++ b/src/vhdlscanner.l @@ -114,7 +114,7 @@ static struct } str_doc; #define YY_NEVER_INTERACTIVE 1 -#define YY_USER_ACTION num_chars += vhdlScanYYleng; +#define YY_USER_ACTION num_chars += (int)vhdlScanYYleng; #define MAX_KEYWORD_LEN 20 |