diff options
Diffstat (limited to 'src')
119 files changed, 10109 insertions, 9816 deletions
diff --git a/src/cite.cpp b/src/cite.cpp index e3314ca..797881f 100644 --- a/src/cite.cpp +++ b/src/cite.cpp @@ -151,7 +151,7 @@ void CiteDict::generatePage() const p=s+1; int i; - if ((i = line.find("crossref")) != -1) /* assumption crossreference is on one line and the only item */ + if ((i = line.find("crossref")) != -1) /* assumption cross reference is on one line and the only item */ { int j=line.find("{",i); int k=line.find("}",i); @@ -235,14 +235,14 @@ void CiteDict::generatePage() const // 5. run bib2xhtml perl script on the generated file which will insert the // bibliography in citelist.doc int exitCode; - portable_sysTimerStop(); - if ((exitCode=portable_system("perl","\""+bib2xhtmlFile+"\" "+bibOutputFiles+" \""+ + Portable::sysTimerStop(); + if ((exitCode=Portable::system("perl","\""+bib2xhtmlFile+"\" "+bibOutputFiles+" \""+ citeListFile+"\"")) != 0) { err("Problems running bibtex. Verify that the command 'perl --version' works from the command line. Exit code: %d\n", exitCode); } - portable_sysTimerStop(); + Portable::sysTimerStop(); QDir::setCurrent(oldDir); diff --git a/src/clangparser.cpp b/src/clangparser.cpp index 271b99f..f6020dd 100644 --- a/src/clangparser.cpp +++ b/src/clangparser.cpp @@ -87,7 +87,7 @@ static QCString detab(const QCString &s) while (stop--) out.addChar(' '); } break; - case '\n': // reset colomn counter + case '\n': // reset column counter out.addChar(c); col=0; break; diff --git a/src/classdef.cpp b/src/classdef.cpp index 7ce6bf1..bba962e 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -133,7 +133,6 @@ class ClassDefImpl : public DefinitionImpl, public ClassDef virtual MemberDef *isSmartPointer() const; virtual bool isJavaEnum() const; virtual bool isGeneric() const; - virtual bool isAnonymous() const; virtual const ClassSDict *innerClasses() const; virtual QCString title() const; virtual QCString generatedFromFiles() const; @@ -265,7 +264,7 @@ class ClassDefImpl : public DefinitionImpl, public ClassDef // PIMPL idiom class IMPL; - IMPL *m_impl; + IMPL *m_impl = 0; }; ClassDef *createClassDef( @@ -423,8 +422,6 @@ class ClassDefAliasImpl : public DefinitionAliasImpl, public ClassDef { return getCdAlias()->isJavaEnum(); } virtual bool isGeneric() const { return getCdAlias()->isGeneric(); } - virtual bool isAnonymous() const - { return getCdAlias()->isAnonymous(); } virtual const ClassSDict *innerClasses() const { return getCdAlias()->innerClasses(); } virtual QCString title() const @@ -525,7 +522,7 @@ class ClassDefAliasImpl : public DefinitionAliasImpl, public ClassDef QPtrDict<void> *visitedClasses=0) const {} private: - mutable bool m_visited; + mutable bool m_visited = false; }; @@ -563,27 +560,27 @@ class ClassDefImpl::IMPL /*! Include information about the header file should be included * in the documentation. 0 by default, set by setIncludeFile(). */ - IncludeInfo *incInfo; + IncludeInfo *incInfo = 0; /*! List of base class (or super-classes) from which this class derives * directly. */ - BaseClassList *inherits; + BaseClassList *inherits = 0; /*! List of sub-classes that directly derive from this class */ - BaseClassList *inheritedBy; + BaseClassList *inheritedBy = 0; /*! Namespace this class is part of * (this is the inner most namespace in case of nested namespaces) */ - NamespaceDef *nspace; + NamespaceDef *nspace = 0; /*! File this class is defined in */ - FileDef *fileDef; + FileDef *fileDef = 0; /*! List of all members (including inherited members) */ - MemberNameInfoSDict *allMemberNameInfoSDict; + MemberNameInfoSDict *allMemberNameInfoSDict = 0; /*! Template arguments of this class */ ArgumentList tempArgs; @@ -595,7 +592,7 @@ class ClassDefImpl::IMPL FileList files; /*! Examples that use this class */ - ExampleSDict *exampleSDict; + ExampleSDict *exampleSDict = 0; /*! Holds the kind of "class" this is. */ ClassDef::CompoundType compType; @@ -609,30 +606,30 @@ class ClassDefImpl::IMPL /*! The inner classes contained in this class. Will be 0 if there are * no inner classes. */ - ClassSDict *innerClasses; + ClassSDict *innerClasses = 0; /* classes for the collaboration diagram */ - UsesClassDict *usesImplClassDict; - UsesClassDict *usedByImplClassDict; - UsesClassDict *usesIntfClassDict; + UsesClassDict *usesImplClassDict = 0; + UsesClassDict *usedByImplClassDict = 0; + UsesClassDict *usesIntfClassDict = 0; - ConstraintClassDict *constraintClassDict; + ConstraintClassDict *constraintClassDict = 0; /*! Template instances that exists of this class, the key in the * dictionary is the template argument list. */ - mutable QDict<ClassDef> *templateInstances; + mutable QDict<ClassDef> *templateInstances = 0; /*! Template instances that exists of this class, as defined by variables. * We do NOT want to document these individually. The key in the * dictionary is the template argument list. */ - mutable QDict<ClassDef> *variableInstances; + mutable QDict<ClassDef> *variableInstances = 0; - QDict<int> *templBaseClassNames; + QDict<int> *templBaseClassNames = 0; /*! The class this class is an instance of. */ - const ClassDef *templateMaster; + const ClassDef *templateMaster = 0; /*! local class name which could be a typedef'ed alias name. */ QCString className; @@ -640,56 +637,54 @@ class ClassDefImpl::IMPL /*! If this class is a Objective-C category, then this points to the * class which is extended. */ - ClassDef *categoryOf; + ClassDef *categoryOf = 0; QList<MemberList> memberLists; /* user defined member groups */ - MemberGroupSDict *memberGroupSDict; + MemberGroupSDict *memberGroupSDict = 0; /*! Is this an abstract class? */ - bool isAbstract; + bool isAbstract = false; /*! Is the class part of an unnamed namespace? */ - bool isStatic; + bool isStatic = false; /*! TRUE if classes members are merged with those of the base classes. */ - bool membersMerged; + bool membersMerged = false; /*! TRUE if the class is defined in a source file rather than a header file. */ - bool isLocal; + bool isLocal = false; - bool isTemplArg; + bool isTemplArg = false; /*! Does this class group its user-grouped members * as a sub-section of the normal (public/protected/..) * groups? */ - bool subGrouping; + bool subGrouping = false; /** Reason of existence is a "use" relation */ - bool usedOnly; + bool usedOnly = false; /** List of titles to use for the summary */ SDict<QCString> vhdlSummaryTitles; /** Is this a simple (non-nested) C structure? */ - bool isSimple; + bool isSimple = false; /** Does this class overloaded the -> operator? */ - MemberDef *arrowOperator; + MemberDef *arrowOperator = 0; - ClassList *taggedInnerClasses; - ClassDef *tagLessRef; + ClassList *taggedInnerClasses = 0; + ClassDef *tagLessRef = 0; /** Does this class represent a Java style enum? */ - bool isJavaEnum; - - bool isGeneric; + bool isJavaEnum = false; - bool isAnonymous; + bool isGeneric = false; - uint64 spec; + uint64 spec = 0; QCString metaData; }; @@ -751,7 +746,6 @@ void ClassDefImpl::IMPL::init(const char *defFileName, const char *name, isLocal=FALSE; } isGeneric = (lang==SrcLangExt_CSharp || lang==SrcLangExt_Java) && QCString(name).find('<')!=-1; - isAnonymous = QCString(name).find('@')!=-1; } ClassDefImpl::IMPL::IMPL() : vhdlSummaryTitles(17) @@ -835,6 +829,10 @@ QCString ClassDefImpl::displayName(bool includeScope) const n=className(); } } + if (isAnonymous()) + { + n = removeAnonymousScopes(n); + } QCString sep=getLanguageSpecificSeparator(lang); if (sep!="::") { @@ -849,14 +847,7 @@ QCString ClassDefImpl::displayName(bool includeScope) const // n = n.left(n.length()-2); //} //printf("ClassDefImpl::displayName()=%s\n",n.data()); - if (n.find('@')!=-1) - { - return removeAnonymousScopes(n); - } - else - { - return n; - } + return n; } // inserts a base/super class in the inheritance list @@ -1715,7 +1706,8 @@ void ClassDefImpl::writeInheritanceGraph(OutputList &ol) const DotClassGraph inheritanceGraph(this,Inheritance); if (inheritanceGraph.isTooBig()) { - warn_uncond("Inheritance graph for '%s' not generated, too many nodes. Consider increasing DOT_GRAPH_MAX_NODES.\n",name().data()); + warn_uncond("Inheritance graph for '%s' not generated, too many nodes (%d), threshold is %d. Consider increasing DOT_GRAPH_MAX_NODES.\n", + name().data(), inheritanceGraph.numNodes(), Config_getInt(DOT_GRAPH_MAX_NODES)); } else if (!inheritanceGraph.isTrivial()) { @@ -3077,7 +3069,7 @@ void ClassDefImpl::writeMemberList(OutputList &ol) const //printf("%s: Member %s of class %s md->protection()=%d mi->prot=%d prot=%d inherited=%d\n", // name().data(),md->name().data(),cd->name().data(),md->protection(),mi->prot,prot,mi->inherited); - if (cd && !md->name().isEmpty() && md->name()[0]!='@') + if (cd && !md->name().isEmpty() && !md->isAnonymous()) { bool memberWritten=FALSE; if (cd->isLinkable() && md->isLinkable()) @@ -3315,7 +3307,7 @@ bool ClassDefImpl::hasExamples() const void ClassDefImpl::addTypeConstraint(const QCString &typeConstraint,const QCString &type) { - //printf("addTypeContraint(%s,%s)\n",type.data(),typeConstraint.data()); + //printf("addTypeConstraint(%s,%s)\n",type.data(),typeConstraint.data()); static bool hideUndocRelation = Config_getBool(HIDE_UNDOC_RELATIONS); if (typeConstraint.isEmpty() || type.isEmpty()) return; ClassDef *cd = const_cast<ClassDef*>(getResolvedClass(this,getFileDef(),typeConstraint)); @@ -3655,7 +3647,7 @@ void ClassDefImpl::mergeMembers() { MemberDef *srcMd = srcMi->memberDef; bool found=FALSE; - bool ambigue=FALSE; + bool ambiguous=FALSE; bool hidden=FALSE; MemberNameInfoIterator dstMnii(*dstMni); MemberInfo *dstMi; @@ -3694,7 +3686,7 @@ void ClassDefImpl::mergeMembers() QCString scope=dstMi->scopePath.left(dstMi->scopePath.find(sep)+sepLen); if (scope!=dstMi->ambiguityResolutionScope.left(scope.length())) dstMi->ambiguityResolutionScope.prepend(scope); - ambigue=TRUE; + ambiguous=TRUE; } } else // same members @@ -3723,12 +3715,12 @@ void ClassDefImpl::mergeMembers() { dstMi->ambiguityResolutionScope.prepend(scope); } - ambigue=TRUE; + ambiguous=TRUE; } } } - //printf("member %s::%s hidden %d ambigue %d srcMi->ambigClass=%p\n", - // srcCd->name().data(),srcMd->name().data(),hidden,ambigue,srcMi->ambigClass); + //printf("member %s::%s hidden %d ambiguous %d srcMi->ambigClass=%p\n", + // srcCd->name().data(),srcMd->name().data(),hidden,ambiguous,srcMi->ambigClass); // TODO: fix the case where a member is hidden by inheritance // of a member with the same name but with another prototype, @@ -3757,7 +3749,7 @@ void ClassDefImpl::mergeMembers() MemberInfo *newMi = new MemberInfo(srcMd,prot,virt,TRUE); newMi->scopePath=bClass->name()+sep+srcMi->scopePath; - if (ambigue) + if (ambiguous) { //printf("$$ New member %s %s add scope %s::\n", // srcMi->ambiguityResolutionScope.data(), @@ -4733,7 +4725,7 @@ int ClassDefImpl::countAdditionalInheritedMembers() const } } } - //printf("countAdditonalInheritedMembers()=%d\n",totalCount); + //printf("countAdditionalInheritedMembers()=%d\n",totalCount); return totalCount; } @@ -5299,7 +5291,6 @@ bool ClassDefImpl::isSliceLocal() const void ClassDefImpl::setName(const char *name) { - m_impl->isAnonymous = QCString(name).find('@')!=-1; DefinitionImpl::setName(name); } @@ -5308,11 +5299,6 @@ void ClassDefImpl::setMetaData(const char *md) m_impl->metaData = md; } -bool ClassDefImpl::isAnonymous() const -{ - return m_impl->isAnonymous; -} - QCString ClassDefImpl::collaborationGraphFileName() const { return m_impl->collabFileName; diff --git a/src/classdef.h b/src/classdef.h index c9cc806..3158c50 100644 --- a/src/classdef.h +++ b/src/classdef.h @@ -302,7 +302,6 @@ class ClassDef : virtual public Definition virtual bool isJavaEnum() const = 0; virtual bool isGeneric() const = 0; - virtual bool isAnonymous() const = 0; virtual const ClassSDict *innerClasses() const = 0; virtual QCString title() const = 0; diff --git a/src/classlist.cpp b/src/classlist.cpp index 6928c52..2b284b1 100644 --- a/src/classlist.cpp +++ b/src/classlist.cpp @@ -72,7 +72,7 @@ bool ClassSDict::declVisible(const ClassDef::CompoundType *filter) const ClassDef *cd=0; for (sdi.toFirst();(cd=sdi.current());++sdi) { - if (cd->name().find('@')==-1 && + if (!cd->isAnonymous() && (filter==0 || *filter==cd->compoundType()) ) { @@ -103,7 +103,7 @@ void ClassSDict::writeDeclaration(OutputList &ol,const ClassDef::CompoundType *f for (sdi.toFirst();(cd=sdi.current());++sdi) { //printf(" ClassSDict::writeDeclaration for %s\n",cd->name().data()); - if (cd->name().find('@')==-1 && + if (!cd->isAnonymous() && !cd->isExtension() && (cd->protection()!=Private || extractPrivate) && (filter==0 || *filter==cd->compoundType()) @@ -137,7 +137,7 @@ void ClassSDict::writeDocumentation(OutputList &ol,const Definition * container) // cd->name().data(),cd->getOuterScope(),cd->isLinkableInProject(),cd->isEmbeddedInOuterScope(), // container,cd->partOfGroups() ? cd->partOfGroups()->count() : 0); - if (cd->name().find('@')==-1 && + if (!cd->isAnonymous() && cd->isLinkableInProject() && cd->isEmbeddedInOuterScope() && !cd->isAlias() && @@ -18,20 +18,37 @@ #ifndef CODE_H #define CODE_H -#include "types.h" +#include "parserintf.h" -class CodeOutputInterface; class FileDef; class MemberDef; class QCString; class Definition; -void parseCCode(CodeOutputInterface &,const char *,const QCString &, - SrcLangExt lang, bool isExample, const char *exName,FileDef *fd, - int startLine,int endLine,bool inlineFragment, - const MemberDef *memberDef,bool showLineNumbers,const Definition *searchCtx, - bool collectXRefs); -void resetCCodeParserState(); -void codeFreeScanner(); +class CCodeParser : public CodeParserInterface +{ + public: + CCodeParser(); + virtual ~CCodeParser(); + void parseCode(CodeOutputInterface &codeOutIntf, + const char *scopeName, + const QCString &input, + SrcLangExt lang, + bool isExampleBlock, + const char *exampleName=0, + FileDef *fileDef=0, + int startLine=-1, + int endLine=-1, + bool inlineFragment=FALSE, + const MemberDef *memberDef=0, + bool showLineNumbers=TRUE, + const Definition *searchCtx=0, + bool collectXRefs=TRUE + ); + void resetCodeParserState(); + private: + struct Private; + std::unique_ptr<Private> p; +}; #endif @@ -16,6 +16,8 @@ */ %option never-interactive %option prefix="codeYY" +%option reentrant +%option extra-type="struct codeYY_state *" %{ @@ -28,6 +30,7 @@ #include <qregexp.h> #include <qdir.h> +#include "code.h" #include "entry.h" #include "doxygen.h" #include "message.h" @@ -58,80 +61,6 @@ * statics */ -static CodeOutputInterface * g_code; - -static ClassSDict *g_codeClassSDict = 0; -static QCString g_curClassName; -static QStrList g_curClassBases; - -static QCString g_parmType; -static QCString g_parmName; - -static const char * g_inputString; //!< the code fragment as text -static int g_inputPosition; //!< read offset during parsing -static int g_inputLines; //!< number of line in the code fragment -static int g_yyLineNr; //!< current line number -static int g_yyColNr; //!< current column number -static bool g_needsTermination; - -static bool g_exampleBlock; -static QCString g_exampleName; -static QCString g_exampleFile; - -static bool g_insideTemplate = FALSE; -static QCString g_type; -static QCString g_name; -static QCString g_args; -static QCString g_classScope; -static QCString g_realScope; -static QStack<int> g_scopeStack; //!< 1 if bracket starts a scope, - // 2 for internal blocks -static int g_anchorCount; -static FileDef * g_sourceFileDef; -static bool g_lineNumbers; -static Definition * g_currentDefinition; -static MemberDef * g_currentMemberDef; -static bool g_includeCodeFragment; -static const char * g_currentFontClass; -static bool g_searchingForBody; -static bool g_insideBody; -static int g_bodyCurlyCount; -static QCString g_saveName; -static QCString g_saveType; -static QCString g_delimiter; - -static int g_bracketCount = 0; -static int g_curlyCount = 0; -static int g_sharpCount = 0; -static bool g_inFunctionTryBlock = FALSE; -static bool g_inForEachExpression = FALSE; - -static int g_lastTemplCastContext; -static int g_lastSpecialCContext; -static int g_lastStringContext; -static int g_lastSkipCppContext; -static int g_lastVerbStringContext; -static int g_lastObjCCallContext; -static int g_memCallContext; -static int g_lastCContext; -static int g_skipInlineInitContext; - -static bool g_insideCpp; -static bool g_insideObjC; -static bool g_insideJava; -static bool g_insideCS; -static bool g_insidePHP; -static bool g_insideProtocolList; -static bool g_insideSlice; - -static bool g_lexInit = FALSE; - -static QStack<int> g_classScopeLengthStack; - -static int g_prefixed_with_this_keyword = FALSE; -static const Definition *g_searchCtx; -static bool g_collectXRefs; - // context for an Objective-C method call struct ObjCCallCtx { @@ -147,31 +76,6 @@ struct ObjCCallCtx int braceCount; }; -// globals for objective-C method calls -static ObjCCallCtx *g_currentCtx=0; -static int g_currentCtxId=0; -static int g_currentNameId=0; -static int g_currentObjId=0; -static int g_currentWordId=0; -static int g_currentCommentId=0; -static QStack<ObjCCallCtx> g_contextStack; -static QIntDict<ObjCCallCtx> g_contextDict; -static QIntDict<QCString> g_nameDict; -static QIntDict<QCString> g_objectDict; -static QIntDict<QCString> g_wordDict; -static QIntDict<QCString> g_commentDict; -static int g_braceCount=0; - -static void saveObjCContext(); -static void restoreObjCContext(); - -static const char *stateToString(int state); - -static QCString g_forceTagReference; - - -//------------------------------------------------------------------- - /*! Represents a stack of variable to class mappings as found in the * code. Each scope is enclosed in pushScope() and popScope() calls. * Variables are added by calling addVariables() and one can search @@ -227,7 +131,7 @@ class VariableContext m_scopes.clear(); } - void addVariable(const QCString &type,const QCString &name); + void addVariable(yyscan_t yyscanner,const QCString &type,const QCString &name); ClassDef *findVariable(const QCString &name); int count() const { return m_scopes.count(); } @@ -237,8 +141,2115 @@ class VariableContext QList<Scope> m_scopes; }; -void VariableContext::addVariable(const QCString &type,const QCString &name) +//------------------------------------------------------------------- + +class CallContext +{ + public: + struct Ctx + { + Ctx(QCString _name, QCString _type) : name(_name), type(_type), d(0) {} + QCString name; + QCString type; + const Definition *d; + }; + + CallContext() + { + m_defList.append(new Ctx("","")); + m_defList.setAutoDelete(TRUE); + } + virtual ~CallContext() {} + void setScope(const Definition *d) + { + Ctx *ctx = m_defList.getLast(); + if (ctx) + { + DBG_CTX((stderr,"** Set call context %s (%p)\n",d==0 ? "<null>" : d->name().data(),d)); + ctx->d=d; + } + } + void pushScope(QCString _name, QCString _type) + { + m_defList.append(new Ctx(_name,_type)); + DBG_CTX((stderr,"** Push call context %d\n",m_defList.count())); + } + void popScope(QCString &_name, QCString &_type) + { + if (m_defList.count()>1) + { + DBG_CTX((stderr,"** Pop call context %d\n",m_defList.count())); + Ctx *ctx = m_defList.getLast(); + if (ctx) + { + _name = ctx->name; + _type = ctx->type; + } + m_defList.removeLast(); + } + else + { + DBG_CTX((stderr,"** ILLEGAL: Pop call context\n")); + } + } + void clear() + { + DBG_CTX((stderr,"** Clear call context\n")); + m_defList.clear(); + m_defList.append(new Ctx("","")); + } + const Definition *getScope() const + { + Ctx *ctx = m_defList.getLast(); + if (ctx) return ctx->d; else return 0; + } + + private: + QList<Ctx> m_defList; +}; + + +struct codeYY_state +{ + CodeOutputInterface * code = 0; + + ClassSDict *codeClassSDict = 0; + QCString curClassName; + QStrList curClassBases; + + QCString parmType; + QCString parmName; + + const char * inputString = 0; //!< the code fragment as text + int inputPosition = 0; //!< read offset during parsing + int inputLines = 0; //!< number of line in the code fragment + int yyLineNr = 0; //!< current line number + int yyColNr = 0; //!< current column number + bool needsTermination = FALSE; + + bool exampleBlock = FALSE; + QCString exampleName; + QCString exampleFile; + + bool insideTemplate = FALSE; + QCString type; + QCString name; + QCString args; + QCString classScope; + QCString realScope; + QStack<int> scopeStack; //!< 1 if bracket starts a scope, + // 2 for internal blocks + int anchorCount = 0; + FileDef * sourceFileDef = 0; + bool lineNumbers = FALSE; + Definition * currentDefinition = 0; + MemberDef * currentMemberDef = 0; + bool includeCodeFragment = FALSE; + const char * currentFontClass = 0; + bool searchingForBody = FALSE; + bool insideBody = FALSE; + int bodyCurlyCount = 0; + QCString saveName; + QCString saveType; + QCString delimiter; + + int bracketCount = 0; + int curlyCount = 0; + int sharpCount = 0; + bool inFunctionTryBlock = FALSE; + bool inForEachExpression = FALSE; + + int lastTemplCastContext = 0; + int lastSpecialCContext = 0; + int lastStringContext = 0; + int lastSkipCppContext = 0; + int lastVerbStringContext = 0; + int lastObjCCallContext = 0; + int memCallContext = 0; + int lastCContext = 0; + int skipInlineInitContext = 0; + + SrcLangExt lang = SrcLangExt_Unknown; + bool insideObjC = FALSE; + bool insideProtocolList = FALSE; + + bool lexInit = FALSE; + + QStack<int> classScopeLengthStack; + + int prefixed_with_this_keyword = FALSE; + const Definition *searchCtx = 0; + bool collectXRefs = FALSE; + + ObjCCallCtx * currentCtx=0; + int currentCtxId=0; + int currentNameId=0; + int currentObjId=0; + int currentWordId=0; + int currentCommentId=0; + QStack<ObjCCallCtx> contextStack; + QIntDict<ObjCCallCtx> contextDict; + QIntDict<QCString> nameDict; + QIntDict<QCString> objectDict; + QIntDict<QCString> wordDict; + QIntDict<QCString> commentDict; + int braceCount=0; + + QCString forceTagReference; + VariableContext theVarContext; + CallContext theCallContext; +}; + +static bool isCastKeyword(const QCString &s); + +//------------------------------------------------------------------- + +static void saveObjCContext(yyscan_t yyscanner); +static void restoreObjCContext(yyscan_t yyscanner); +static const char *stateToString(yyscan_t yyscanner,int state); +static void addUsingDirective(yyscan_t yyscanner,const char *name); +static void pushScope(yyscan_t yyscanner,const char *s); +static void popScope(yyscan_t yyscanner); +static void setCurrentDoc(yyscan_t yyscanner,const QCString &anchor); +static void addToSearchIndex(yyscan_t yyscanner,const char *text); +static void setClassScope(yyscan_t yyscanner,const QCString &name); +static void startCodeLine(yyscan_t yyscanner); +static void endCodeLine(yyscan_t yyscanner); +static void nextCodeLine(yyscan_t yyscanner); +static void startFontClass(yyscan_t yyscanner,const char *s); +static void endFontClass(yyscan_t yyscanner); +static void codifyLines(yyscan_t yyscanner,const char *text); +static void writeMultiLineCodeLink(yyscan_t yyscanner,CodeOutputInterface &ol, + const Definition *d, + const char *text); +static void addType(yyscan_t yyscanner); +static void addParmType(yyscan_t yyscanner); +static void addUsingDirective(yyscan_t yyscanner,const char *name); +static void setParameterList(yyscan_t yyscanner,const MemberDef *md); +static const ClassDef *stripClassName(yyscan_t yyscanner,const char *s,Definition *d); +static MemberDef *setCallContextForVar(yyscan_t yyscanner,const QCString &name); +static void updateCallContextForSmartPointer(yyscan_t yyscanner); +static bool getLinkInScope(yyscan_t yyscanner,const QCString &c, // scope + const QCString &m, // member + const char *memberText, // exact text + CodeOutputInterface &ol, + const char *text, + bool varOnly=FALSE + ); +static bool getLink(yyscan_t yyscanner,const char *className, + const char *memberName, + CodeOutputInterface &ol, + const char *text=0, + bool varOnly=FALSE); +static void generateClassOrGlobalLink(yyscan_t yyscanner,CodeOutputInterface &ol,const char *clName, + bool typeOnly=FALSE,bool varOnly=FALSE); +static bool generateClassMemberLink(yyscan_t yyscanner,CodeOutputInterface &ol,MemberDef *xmd,const char *memName); +static bool generateClassMemberLink(yyscan_t yyscanner,CodeOutputInterface &ol,const Definition *def,const char *memName); +static void generateMemberLink(yyscan_t yyscanner,CodeOutputInterface &ol,const QCString &varName, + const char *memName); +static void generatePHPVariableLink(yyscan_t yyscanner,CodeOutputInterface &ol,const char *varName); +static void generateFunctionLink(yyscan_t yyscanner,CodeOutputInterface &ol,const char *funcName); +static int countLines(yyscan_t yyscanner); +static void writeObjCMethodCall(yyscan_t yyscanner,ObjCCallCtx *ctx); +static QCString escapeName(yyscan_t yyscanner,const char *s); +static QCString escapeObject(yyscan_t yyscanner,const char *s); +static QCString escapeWord(yyscan_t yyscanner,const char *s); +static QCString escapeComment(yyscan_t yyscanner,const char *s); +static bool skipLanguageSpecificKeyword(yyscan_t yyscanner,const QCString &kw); +static int yyread(yyscan_t yyscanner,char *buf,int max_size); + + +/* ----------------------------------------------------------------- + */ +#undef YY_INPUT +#define YY_INPUT(buf,result,max_size) result=yyread(yyscanner,buf,max_size); + + +%} + +B [ \t] +BN [ \t\n\r] +ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]* +SEP ("::"|"\\") +SCOPENAME ({SEP}{BN}*)?({ID}{BN}*{SEP}{BN}*)*("~"{BN}*)?{ID} +TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">" +SCOPETNAME (((({ID}{TEMPLIST}?){BN}*)?{SEP}{BN}*)*)((~{BN}*)?{ID}) +SCOPEPREFIX ({ID}{TEMPLIST}?{BN}*{SEP}{BN}*)+ +KEYWORD_OBJC ("@public"|"@private"|"@protected"|"@class"|"@implementation"|"@interface"|"@end"|"@selector"|"@protocol"|"@optional"|"@required"|"@throw"|"@synthesize"|"@property") +KEYWORD ("asm"|"__assume"|"auto"|"class"|"const"|"delete"|"enum"|"explicit"|"extern"|"false"|"friend"|"gcnew"|"gcroot"|"set"|"get"|"inline"|"internal"|"mutable"|"namespace"|"new"|"null"|"nullptr"|"override"|"operator"|"pin_ptr"|"private"|"protected"|"public"|"raise"|"register"|"remove"|"self"|"sizeof"|"static"|"struct"|"__super"|"function"|"template"|"generic"|"this"|"true"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile"|"abstract"|"final"|"import"|"synchronized"|"transient"|"alignas"|"alignof"|{KEYWORD_OBJC}) +FLOWKW ("break"|"catch"|"continue"|"default"|"do"|"else"|"finally"|"return"|"switch"|"throw"|"throws"|"@catch"|"@finally") +FLOWCONDITION ("case"|"for"|"foreach"|"for each"|"goto"|"if"|"try"|"while"|"@try") +TYPEKW ("bool"|"byte"|"char"|"double"|"float"|"int"|"long"|"object"|"short"|"signed"|"unsigned"|"void"|"wchar_t"|"size_t"|"boolean"|"id"|"SEL"|"string"|"nullptr") +TYPEKWSL ("LocalObject"|"Object"|"Value") +CASTKW ("const_cast"|"dynamic_cast"|"reinterpret_cast"|"static_cast") +CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'")) +ARITHOP "+"|"-"|"/"|"*"|"%"|"--"|"++" +ASSIGNOP "="|"*="|"/="|"%="|"+="|"-="|"<<="|">>="|"&="|"^="|"|=" +LOGICOP "=="|"!="|">"|"<"|">="|"<="|"&&"|"||"|"!" +BITOP "&"|"|"|"^"|"<<"|">>"|"~" +OPERATOR {ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP} +RAWBEGIN (u|U|L|u8)?R\"[^ \t\(\)\\]{0,16}"(" +RAWEND ")"[^ \t\(\)\\]{0,16}\" + +%option noyywrap + +%x SkipString +%x SkipStringS +%x SkipVerbString +%x SkipCPP +%x SkipComment +%x SkipCxxComment +%x RemoveSpecialCComment +%x StripSpecialCComment +%x Body +%x FuncCall +%x MemberCall +%x MemberCall2 +%x SkipInits +%x ClassName +%x AlignAs +%x AlignAsEnd +%x PackageName +%x ClassVar +%x CppCliTypeModifierFollowup +%x Bases +%x SkipSharp +%x ReadInclude +%x TemplDecl +%x TemplCast +%x CallEnd +%x ObjCMethod +%x ObjCParams +%x ObjCParamType +%x ObjCCall +%x ObjCMName +%x ObjCSkipStr +%x ObjCCallComment +%x OldStyleArgs +%x UsingName +%x RawString +%x InlineInit + +%% + +<*>\x0d +<Body>^([ \t]*"#"[ \t]*("include"|"import")[ \t]*)("<"|"\"") { + startFontClass(yyscanner,"preprocessor"); + yyextra->code->codify(yytext); + BEGIN( ReadInclude ); + } +<Body>("@interface"|"@implementation"|"@protocol")[ \t\n]+ { + yyextra->insideObjC=TRUE; + startFontClass(yyscanner,"keyword"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + if (!yyextra->insideTemplate) + BEGIN( ClassName ); + } +<Body>(("public"|"private"){B}+)?("ref"|"value"|"interface"|"enum"){B}+("class"|"struct") { + if (yyextra->insideTemplate) REJECT; + startFontClass(yyscanner,"keyword"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + BEGIN( ClassName ); + } +<Body>"property"|"event"/{BN}* { + if (yyextra->insideTemplate) REJECT; + startFontClass(yyscanner,"keyword"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + } +<Body>(KEYWORD_CPPCLI_DATATYPE|("partial"{B}+)?"class"|"struct"|"union"|"namespace"|"interface"){B}+ { + startFontClass(yyscanner,"keyword"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + if (!yyextra->insideTemplate) + BEGIN( ClassName ); + } +<Body>("package")[ \t\n]+ { + startFontClass(yyscanner,"keyword"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + BEGIN( PackageName ); + } +<ClassVar>\n { + if (!yyextra->insideObjC) REJECT; + codifyLines(yyscanner,yytext); + BEGIN(Body); + } +<Body,ClassVar,Bases>"-"|"+" { + if (!yyextra->insideObjC || yyextra->insideBody) + { + yyextra->code->codify(yytext); + } + else // Start of Objective-C method + { + //printf("Method!\n"); + yyextra->code->codify(yytext); + BEGIN(ObjCMethod); + } + } +<ObjCMethod>":" { + yyextra->code->codify(yytext); + BEGIN(ObjCParams); + } +<ObjCParams>"(" { + yyextra->code->codify(yytext); + BEGIN(ObjCParamType); + } +<ObjCParams,ObjCMethod>";"|"{" { + yyextra->code->codify(yytext); + if (*yytext=='{') + { + if (yyextra->searchingForBody) + { + yyextra->searchingForBody=FALSE; + yyextra->insideBody=TRUE; + } + if (yyextra->insideBody) yyextra->bodyCurlyCount++; + if (!yyextra->curClassName.isEmpty()) // valid class name + { + pushScope(yyscanner,yyextra->curClassName); + DBG_CTX((stderr,"** scope stack push SCOPEBLOCK\n")); + yyextra->scopeStack.push(SCOPEBLOCK); + } + } + yyextra->type.resize(0); + yyextra->name.resize(0); + BEGIN(Body); + } +<ObjCParams>{ID}{B}*":" { + yyextra->code->codify(yytext); + } +<ObjCParamType>{TYPEKW} { + startFontClass(yyscanner,"keywordtype"); + yyextra->code->codify(yytext); + endFontClass(yyscanner); + yyextra->parmType=yytext; + } +<ObjCParamType>{ID} { + generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext); + yyextra->parmType=yytext; + } +<ObjCParamType>")" { + yyextra->code->codify(yytext); + BEGIN(ObjCParams); + } +<ObjCParams>{ID} { + yyextra->code->codify(yytext); + yyextra->parmName=yytext; + yyextra->theVarContext.addVariable(yyscanner,yyextra->parmType,yyextra->parmName); + yyextra->parmType.resize(0);yyextra->parmName.resize(0); + } +<ObjCMethod,ObjCParams,ObjCParamType>{ID} { + generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext); + } +<ObjCMethod,ObjCParams,ObjCParamType>. { + yyextra->code->codify(yytext); + } +<ObjCMethod,ObjCParams,ObjCParamType>\n { + codifyLines(yyscanner,yytext); + } +<ReadInclude>[^\n\"\>]+/(">"|"\"") { + //FileInfo *f; + bool ambig; + bool found=FALSE; + //QCString absPath = yytext; + //if (yyextra->sourceFileDef && QDir::isRelativePath(absPath)) + //{ + // absPath = QDir::cleanDirPath(yyextra->sourceFileDef->getPath()+"/"+absPath); + //} + + FileDef *fd=findFileDef(Doxygen::inputNameDict,yytext,ambig); + //printf("looking for include %s -> %s fd=%p\n",yytext,absPath.data(),fd); + if (fd && fd->isLinkable()) + { + if (ambig) // multiple input files match the name + { + //printf("===== yes %s is ambiguous\n",yytext); + QCString name = QDir::cleanDirPath(yytext).utf8(); + if (!name.isEmpty() && yyextra->sourceFileDef) + { + FileName *fn = Doxygen::inputNameDict->find(name); + if (fn) + { + FileNameIterator fni(*fn); + // for each include name + for (fni.toFirst();!found && (fd=fni.current());++fni) + { + // see if this source file actually includes the file + found = yyextra->sourceFileDef->isIncluded(fd->absFilePath()); + //printf(" include file %s found=%d\n",fd->absFilePath().data(),found); + } + } + } + } + else // not ambiguous + { + found = TRUE; + } + } + //printf(" include file %s found=%d\n",fd ? fd->absFilePath().data() : "<none>",found); + if (found) + { + writeMultiLineCodeLink(yyscanner,*yyextra->code,fd,yytext); + } + else + { + yyextra->code->codify(yytext); + } + char c=yyinput(yyscanner); + QCString text; + text+=c; + yyextra->code->codify(text); + endFontClass(yyscanner); + BEGIN( Body ); + } +<Body,Bases>^[ \t]*"#" { + startFontClass(yyscanner,"preprocessor"); + yyextra->lastSkipCppContext = YY_START; + yyextra->code->codify(yytext); + BEGIN( SkipCPP ) ; + } +<SkipCPP>. { + yyextra->code->codify(yytext); + } +<SkipCPP>[^\n\/\\]+ { + yyextra->code->codify(yytext); + } +<SkipCPP>\\[\r]?\n { + codifyLines(yyscanner,yytext); + } +<SkipCPP>"//" { + yyextra->code->codify(yytext); + } +<Body,FuncCall>"{" { + yyextra->theVarContext.pushScope(); + + DBG_CTX((stderr,"** scope stack push INNERBLOCK\n")); + yyextra->scopeStack.push(INNERBLOCK); + + if (yyextra->searchingForBody) + { + yyextra->searchingForBody=FALSE; + yyextra->insideBody=TRUE; + } + yyextra->code->codify(yytext); + if (yyextra->insideBody) + { + yyextra->bodyCurlyCount++; + } + yyextra->type.resize(0); + yyextra->name.resize(0); + BEGIN( Body ); + } +<Body,FuncCall,MemberCall,MemberCall2>"}" { + yyextra->theVarContext.popScope(); + yyextra->type.resize(0); + yyextra->name.resize(0); + + int *scope = yyextra->scopeStack.pop(); + DBG_CTX((stderr,"** scope stack pop SCOPEBLOCK=%d\n",scope==SCOPEBLOCK)); + if (scope==SCOPEBLOCK || scope==CLASSBLOCK) + { + popScope(yyscanner); + } + + yyextra->code->codify(yytext); + + DBG_CTX((stderr,"yyextra->bodyCurlyCount=%d\n",yyextra->bodyCurlyCount)); + if (--yyextra->bodyCurlyCount<=0) + { + yyextra->insideBody=FALSE; + yyextra->currentMemberDef=0; + if (yyextra->currentDefinition) + yyextra->currentDefinition=yyextra->currentDefinition->getOuterScope(); + } + BEGIN(Body); + } +<Body,ClassVar>"@end" { + //printf("End of objc scope fd=%s\n",yyextra->sourceFileDef->name().data()); + if (yyextra->sourceFileDef) + { + FileDef *fd=yyextra->sourceFileDef; + yyextra->insideObjC = fd->name().lower().right(2)==".m" || + fd->name().lower().right(3)==".mm"; + //printf("insideObjC=%d\n",yyextra->insideObjC); + } + else + { + yyextra->insideObjC = FALSE; + } + if (yyextra->insideBody) + { + yyextra->theVarContext.popScope(); + + int *scope = yyextra->scopeStack.pop(); + DBG_CTX((stderr,"** scope stack pop SCOPEBLOCK=%d\n",scope==SCOPEBLOCK)); + if (scope==SCOPEBLOCK || scope==CLASSBLOCK) + { + popScope(yyscanner); + } + yyextra->insideBody=FALSE; + } + + startFontClass(yyscanner,"keyword"); + yyextra->code->codify(yytext); + endFontClass(yyscanner); + + yyextra->currentMemberDef=0; + if (yyextra->currentDefinition) + yyextra->currentDefinition=yyextra->currentDefinition->getOuterScope(); + BEGIN(Body); + } +<ClassName,ClassVar>";" { + yyextra->code->codify(yytext); + yyextra->searchingForBody=FALSE; + BEGIN( Body ); + } +<ClassName,ClassVar>[*&^%]+ { + yyextra->type=yyextra->curClassName.copy(); + yyextra->name.resize(0); + yyextra->code->codify(yytext); + BEGIN( Body ); // variable of type struct * + } +<ClassName>"__declspec"{B}*"("{B}*{ID}{B}*")" { + startFontClass(yyscanner,"keyword"); + yyextra->code->codify(yytext); + endFontClass(yyscanner); + } +<ClassName>{ID}("."{ID})* | +<ClassName>{ID}("::"{ID})* { + if (yyextra->lang==SrcLangExt_CSharp) + yyextra->curClassName=substitute(yytext,".","::"); + else + yyextra->curClassName=yytext; + addType(yyscanner); + if (yyextra->curClassName=="alignas") + { + startFontClass(yyscanner,"keyword"); + yyextra->code->codify(yytext); + endFontClass(yyscanner); + BEGIN( AlignAs ); + } + else + { + generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext); + BEGIN( ClassVar ); + } + } +<AlignAs>"(" { + yyextra->bracketCount=1; + yyextra->code->codify(yytext); + BEGIN( AlignAsEnd ); + } +<AlignAs>\n { yyextra->yyLineNr++; + codifyLines(yyscanner,yytext); + } +<AlignAs>. { yyextra->code->codify(yytext); } +<AlignAsEnd>"(" { yyextra->code->codify(yytext); + yyextra->bracketCount++; + } +<AlignAsEnd>")" { + yyextra->code->codify(yytext); + if (--yyextra->bracketCount<=0) + { + BEGIN(ClassName); + } + } +<AlignAsEnd>\n { yyextra->yyLineNr++; + codifyLines(yyscanner,yytext); + } +<AlignAsEnd>. { yyextra->code->codify(yytext); } +<ClassName>{ID}("\\"{ID})* { // PHP namespace + yyextra->curClassName=substitute(yytext,"\\","::"); + yyextra->scopeStack.push(CLASSBLOCK); + pushScope(yyscanner,yyextra->curClassName); + addType(yyscanner); + generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext); + BEGIN( ClassVar ); + } +<ClassName>{ID}{B}*"("{ID}")" { // Obj-C category + yyextra->curClassName=removeRedundantWhiteSpace(yytext); + yyextra->scopeStack.push(CLASSBLOCK); + pushScope(yyscanner,yyextra->curClassName); + addType(yyscanner); + generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext); + BEGIN( ClassVar ); + } +<PackageName>{ID}("."{ID})* { + yyextra->curClassName=substitute(yytext,".","::"); + //printf("found package: %s\n",yyextra->curClassName.data()); + addType(yyscanner); + codifyLines(yyscanner,yytext); + } +<ClassVar>"=" { + unput(*yytext); + BEGIN( Body ); + } +<ClassVar>("extends"|"implements") { // Java, Slice + startFontClass(yyscanner,"keyword"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + yyextra->curClassBases.clear(); + BEGIN( Bases ); + } +<ClassVar>("sealed"|"abstract")/{BN}*(":"|"{") { + DBG_CTX((stderr,"***** C++/CLI modifier %s on yyextra->curClassName=%s\n",yytext,yyextra->curClassName.data())); + startFontClass(yyscanner,"keyword"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + BEGIN( CppCliTypeModifierFollowup ); + } +<ClassVar>{ID} { + yyextra->type = yyextra->curClassName.copy(); + yyextra->name = yytext; + if (yyextra->insideBody) + { + yyextra->theVarContext.addVariable(yyscanner,yyextra->type,yyextra->name); + } + generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext); + } +<ClassName,ClassVar,CppCliTypeModifierFollowup>{B}*":"{B}* { + codifyLines(yyscanner,yytext); + yyextra->curClassBases.clear(); + BEGIN( Bases ); + } +<PackageName>[ \t]*";" | +<Bases>^{B}*/"@"{ID} | // Objective-C interface +<Bases,ClassName,ClassVar,CppCliTypeModifierFollowup>{B}*"{"{B}* { + yyextra->theVarContext.pushScope(); + yyextra->code->codify(yytext); + if (YY_START==ClassVar && yyextra->curClassName.isEmpty()) + { + yyextra->curClassName = yyextra->name.copy(); + } + if (yyextra->searchingForBody) + { + yyextra->searchingForBody=FALSE; + yyextra->insideBody=TRUE; + } + if (yyextra->insideBody) yyextra->bodyCurlyCount++; + if (!yyextra->curClassName.isEmpty()) // valid class name + { + DBG_CTX((stderr,"** scope stack push CLASSBLOCK\n")); + yyextra->scopeStack.push(CLASSBLOCK); + pushScope(yyscanner,yyextra->curClassName); + DBG_CTX((stderr,"***** yyextra->curClassName=%s\n",yyextra->curClassName.data())); + if (getResolvedClass(yyextra->currentDefinition,yyextra->sourceFileDef,yyextra->curClassName)==0) + { + DBG_CTX((stderr,"Adding new class %s\n",yyextra->curClassName.data())); + ClassDef *ncd=createClassDef("<code>",1,1, + yyextra->curClassName,ClassDef::Class,0,0,FALSE); + yyextra->codeClassSDict->append(yyextra->curClassName,ncd); + // insert base classes. + char *s=yyextra->curClassBases.first(); + while (s) + { + const ClassDef *bcd=yyextra->codeClassSDict->find(s); + if (bcd==0) bcd=getResolvedClass(yyextra->currentDefinition,yyextra->sourceFileDef,s); + if (bcd && bcd!=ncd) + { + ncd->insertBaseClass(const_cast<ClassDef*>(bcd),s,Public,Normal); + } + s=yyextra->curClassBases.next(); + } + } + //printf("yyextra->codeClassList.count()=%d\n",yyextra->codeClassList.count()); + } + else // not a class name -> assume inner block + { + DBG_CTX((stderr,"** scope stack push INNERBLOCK\n")); + yyextra->scopeStack.push(INNERBLOCK); + } + yyextra->curClassName.resize(0); + yyextra->curClassBases.clear(); + BEGIN( Body ); + } +<Bases>"virtual"|"public"|"protected"|"private"|"@public"|"@private"|"@protected" { + startFontClass(yyscanner,"keyword"); + yyextra->code->codify(yytext); + endFontClass(yyscanner); + } +<Bases>{SEP}?({ID}{SEP})*{ID} { + DBG_CTX((stderr,"%s:addBase(%s)\n",yyextra->curClassName.data(),yytext)); + yyextra->curClassBases.inSort(yytext); + generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext); + } +<Bases>"<" { + yyextra->code->codify(yytext); + if (!yyextra->insideObjC) + { + yyextra->sharpCount=1; + BEGIN ( SkipSharp ); + } + else + { + yyextra->insideProtocolList=TRUE; + } + } +<Bases>">" { + yyextra->code->codify(yytext); + yyextra->insideProtocolList=FALSE; + } +<SkipSharp>"<" { + yyextra->code->codify(yytext); + ++yyextra->sharpCount; + } +<SkipSharp>">" { + yyextra->code->codify(yytext); + if (--yyextra->sharpCount<=0) + BEGIN ( Bases ); + } +<SkipSharp>"\"" { + yyextra->code->codify(yytext); + yyextra->lastStringContext=YY_START; + BEGIN(SkipString); + } +<SkipSharp>"\'" { + yyextra->code->codify(yytext); + yyextra->lastStringContext=YY_START; + BEGIN(SkipStringS); + } +<Bases>"(" { + yyextra->code->codify(yytext); + yyextra->sharpCount=1; + BEGIN ( SkipSharp ); + } +<SkipSharp>"(" { + yyextra->code->codify(yytext); + ++yyextra->sharpCount; + } +<SkipSharp>")" { + yyextra->code->codify(yytext); + if (--yyextra->sharpCount<=0) + BEGIN ( Bases ); + } + + +<Bases>"," { + yyextra->code->codify(yytext); + } + + +<Body>{SCOPEPREFIX}?"operator"{B}*"()"{B}*/"(" { + addType(yyscanner); + generateFunctionLink(yyscanner,*yyextra->code,yytext); + yyextra->bracketCount=0; + yyextra->args.resize(0); + yyextra->name+=yytext; + BEGIN( FuncCall ); + } +<Body>{SCOPEPREFIX}?"operator"/"(" { + addType(yyscanner); + generateFunctionLink(yyscanner,*yyextra->code,yytext); + yyextra->bracketCount=0; + yyextra->args.resize(0); + yyextra->name+=yytext; + BEGIN( FuncCall ); + } +<Body>{SCOPEPREFIX}?"operator"[^a-z_A-Z0-9\(\n]+/"(" { + addType(yyscanner); + generateFunctionLink(yyscanner,*yyextra->code,yytext); + yyextra->bracketCount=0; + yyextra->args.resize(0); + yyextra->name+=yytext; + BEGIN( FuncCall ); + } +<Body,TemplDecl>("template"|"generic")/([^a-zA-Z0-9]) { + startFontClass(yyscanner,"keyword"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + yyextra->insideTemplate=TRUE; + yyextra->sharpCount=0; + } +<Body>"using"{BN}+"namespace"{BN}+ { + startFontClass(yyscanner,"keyword"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + BEGIN(UsingName); + } +<UsingName>{ID}("::"{ID})* { addUsingDirective(yyscanner,yytext); + generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext); + DBG_CTX((stderr,"** scope stack push CLASSBLOCK\n")); + yyextra->scopeStack.push(CLASSBLOCK); + pushScope(yyscanner,yytext); + BEGIN(Body); + } +<UsingName>\n { codifyLines(yyscanner,yytext); BEGIN(Body); } +<UsingName>. { codifyLines(yyscanner,yytext); BEGIN(Body); } +<Body,FuncCall>"$"?"this"("->"|".") { yyextra->code->codify(yytext); // this-> for C++, this. for C# + yyextra->prefixed_with_this_keyword = TRUE; + } +<Body>{KEYWORD}/([^a-z_A-Z0-9]) { + if (yyextra->lang==SrcLangExt_Java && qstrcmp("internal",yytext) ==0) REJECT; + if (skipLanguageSpecificKeyword(yyscanner,yytext)) REJECT; + startFontClass(yyscanner,"keyword"); + codifyLines(yyscanner,yytext); + if (QCString(yytext)=="typedef") + { + addType(yyscanner); + yyextra->name+=yytext; + } + endFontClass(yyscanner); + } +<Body>{KEYWORD}/{B}* { + if (skipLanguageSpecificKeyword(yyscanner,yytext)) REJECT; + startFontClass(yyscanner,"keyword"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + } +<Body>{KEYWORD}/{BN}*"(" { + if (skipLanguageSpecificKeyword(yyscanner,yytext)) REJECT; + startFontClass(yyscanner,"keyword"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + yyextra->name.resize(0);yyextra->type.resize(0); + } +<FuncCall>"in"/{BN}* { + if (!yyextra->inForEachExpression) REJECT; + startFontClass(yyscanner,"keywordflow"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + // insert the variable in the parent scope, see bug 546158 + yyextra->theVarContext.popScope(); + yyextra->theVarContext.addVariable(yyscanner,yyextra->parmType,yyextra->parmName); + yyextra->theVarContext.pushScope(); + yyextra->name.resize(0);yyextra->type.resize(0); + } +<Body>{FLOWKW}/{BN}*"(" { + startFontClass(yyscanner,"keywordflow"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + yyextra->name.resize(0);yyextra->type.resize(0); + yyextra->inForEachExpression = (qstrcmp(yytext,"for each")==0 || qstrcmp(yytext, "foreach")==0); + BEGIN(FuncCall); + } +<Body>{FLOWCONDITION}/{BN}*"(" { + if (yyextra->currentMemberDef && yyextra->currentMemberDef->isFunction()) + { + yyextra->currentMemberDef->incrementFlowKeyWordCount(); + } + startFontClass(yyscanner,"keywordflow"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + yyextra->name.resize(0);yyextra->type.resize(0); + yyextra->inForEachExpression = (strcmp(yytext,"for each")==0 || strcmp(yytext, "foreach")==0); + BEGIN(FuncCall); + } +<Body>{FLOWKW}/([^a-z_A-Z0-9]) { + startFontClass(yyscanner,"keywordflow"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + if (yyextra->inFunctionTryBlock && (qstrcmp(yytext,"catch")==0 || qstrcmp(yytext,"finally")==0)) + { + yyextra->inFunctionTryBlock=FALSE; + } + } +<Body>{FLOWCONDITION}/([^a-z_A-Z0-9]) { + if (yyextra->currentMemberDef && yyextra->currentMemberDef->isFunction()) + { + yyextra->currentMemberDef->incrementFlowKeyWordCount(); + } + startFontClass(yyscanner,"keywordflow"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + if (yyextra->inFunctionTryBlock && (strcmp(yytext,"catch")==0 || strcmp(yytext,"finally")==0)) + { + yyextra->inFunctionTryBlock=FALSE; + } + } +<Body>{FLOWKW}/{B}* { + startFontClass(yyscanner,"keywordflow"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + } +<Body>{FLOWCONDITION}/{B}* { + if (yyextra->currentMemberDef && yyextra->currentMemberDef->isFunction()) + { + yyextra->currentMemberDef->incrementFlowKeyWordCount(); + } + startFontClass(yyscanner,"keywordflow"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + } +<Body>"*"{B}*")" { // end of cast? + yyextra->code->codify(yytext); + yyextra->theCallContext.popScope(yyextra->name, yyextra->type); + yyextra->bracketCount--; + yyextra->parmType = yyextra->name; + BEGIN(FuncCall); + } +<Body>[\\|\)\+\-\/\%\~\!] { + yyextra->code->codify(yytext); + yyextra->name.resize(0);yyextra->type.resize(0); + if (*yytext==')') + { + yyextra->theCallContext.popScope(yyextra->name, yyextra->type); + yyextra->bracketCount--; + BEGIN(FuncCall); + } + } +<Body,TemplDecl,ObjCMethod>{TYPEKW}/{B}* { + startFontClass(yyscanner,"keywordtype"); + yyextra->code->codify(yytext); + endFontClass(yyscanner); + addType(yyscanner); + yyextra->name+=yytext; + } +<Body,TemplDecl,ObjCMethod>{TYPEKWSL}/{B}* { + if (yyextra->lang!=SrcLangExt_Slice) + { + REJECT; + } + else + { + startFontClass(yyscanner,"keywordtype"); + yyextra->code->codify(yytext); + endFontClass(yyscanner); + addType(yyscanner); + yyextra->name+=yytext; + } + } +<Body>"generic"/{B}*"<"[^\n\/\-\.\{\"\>]*">"{B}* { + startFontClass(yyscanner,"keyword"); + yyextra->code->codify(yytext); + endFontClass(yyscanner); + yyextra->sharpCount=0; + BEGIN(TemplDecl); + } +<Body>"template"/{B}*"<"[^\n\/\-\.\{\"\>]*">"{B}* { // template<...> + startFontClass(yyscanner,"keyword"); + yyextra->code->codify(yytext); + endFontClass(yyscanner); + yyextra->sharpCount=0; + BEGIN(TemplDecl); + } +<TemplDecl>"class"|"typename" { + startFontClass(yyscanner,"keyword"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + } +<TemplDecl>"<" { + yyextra->code->codify(yytext); + yyextra->sharpCount++; + } +<TemplDecl>">" { + yyextra->code->codify(yytext); + yyextra->sharpCount--; + if (yyextra->sharpCount<=0) + { + BEGIN(Body); + } + } +<TemplCast>">" { + startFontClass(yyscanner,"keyword"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + BEGIN( yyextra->lastTemplCastContext ); + } +<TemplCast>{ID}("::"{ID})* { + generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext); + } +<TemplCast>("const"|"volatile"){B}* { + startFontClass(yyscanner,"keyword"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + } +<TemplCast>[*^]* { + codifyLines(yyscanner,yytext); + } +<Body,MemberCall2,FuncCall>{CASTKW}{B}*"<" { // static_cast<T>( + startFontClass(yyscanner,"keyword"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + yyextra->lastTemplCastContext = YY_START; + BEGIN(TemplCast); + } +<Body>"$this->"{SCOPENAME}/{BN}*[;,)\]] { // PHP member variable + addType(yyscanner); + generatePHPVariableLink(yyscanner,*yyextra->code,yytext); + yyextra->name+=yytext+7; + } +<Body,TemplCast>{SCOPENAME}{B}*"<"[^\n\/\-\.\{\"\>\(]*">"("::"{ID})*/{B}* { // A<T> *pt; + if (isCastKeyword(yytext) && YY_START==Body) + { + REJECT; + } + addType(yyscanner); + generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext); + yyextra->name+=yytext; + } +<Body>{SCOPENAME}/{BN}*[:;,)\]] { // "int var;" or "var, var2" or "debug(f) macro" , or int var : 5; + addType(yyscanner); + // changed this to generateFunctionLink, see bug 624514 + //generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext,FALSE,TRUE); + generateFunctionLink(yyscanner,*yyextra->code,yytext); + yyextra->name+=yytext; + } +<Body>{SCOPENAME}/{B}* { // p->func() + addType(yyscanner); + generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext); + yyextra->name+=yytext; + } +<Body>"("{B}*("*"{B}*)+{SCOPENAME}*{B}*")"/{B}* { // (*p)->func() but not "if (p) ..." + yyextra->code->codify(yytext); + int s=0;while (s<(int)yyleng && !isId(yytext[s])) s++; + int e=(int)yyleng-1;while (e>=0 && !isId(yytext[e])) e--; + QCString varname = ((QCString)yytext).mid(s,e-s+1); + addType(yyscanner); + yyextra->name=varname; + } +<Body>{SCOPETNAME}{B}*"<"[^\n\/\-\.\{\"\>]*">"/{BN}*"(" | +<Body>{SCOPETNAME}/{BN}*"(" { // a() or c::a() or t<A,B>::a() or A\B\foo() + if (isCastKeyword(yytext)) + { + REJECT; + } + addType(yyscanner); + generateFunctionLink(yyscanner,*yyextra->code,yytext); + yyextra->bracketCount=0; + yyextra->args.resize(0); + yyextra->name+=yytext; + BEGIN( FuncCall ); + } +<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>{RAWBEGIN} { + QCString text=yytext; + int i=text.find('R'); + yyextra->code->codify(text.left(i+1)); + startFontClass(yyscanner,"stringliteral"); + yyextra->code->codify(yytext+i+1); + yyextra->lastStringContext=YY_START; + yyextra->inForEachExpression = FALSE; + yyextra->delimiter = yytext+i+2; + yyextra->delimiter=yyextra->delimiter.left(yyextra->delimiter.length()-1); + BEGIN( RawString ); + } +<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>\" { + startFontClass(yyscanner,"stringliteral"); + yyextra->code->codify(yytext); + yyextra->lastStringContext=YY_START; + yyextra->inForEachExpression = FALSE; + BEGIN( SkipString ); + } +<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>\' { + startFontClass(yyscanner,"stringliteral"); + yyextra->code->codify(yytext); + yyextra->lastStringContext=YY_START; + yyextra->inForEachExpression = FALSE; + BEGIN( SkipStringS ); + } +<SkipString>[^\"\\\r\n]* { + yyextra->code->codify(yytext); + } +<SkipStringS>[^\'\\\r\n]* { + yyextra->code->codify(yytext); + } +<SkipString,SkipStringS>"//"|"/*" { + yyextra->code->codify(yytext); + } +<SkipString>@?\" { + yyextra->code->codify(yytext); + endFontClass(yyscanner); + BEGIN( yyextra->lastStringContext ); + } +<SkipStringS>\' { + yyextra->code->codify(yytext); + endFontClass(yyscanner); + BEGIN( yyextra->lastStringContext ); + } +<SkipString,SkipStringS>\\. { + yyextra->code->codify(yytext); + } +<RawString>{RAWEND} { + yyextra->code->codify(yytext); + QCString delimiter = yytext+1; + delimiter=delimiter.left(delimiter.length()-1); + if (delimiter==yyextra->delimiter) + { + BEGIN( yyextra->lastStringContext ); + } + } +<RawString>[^)\n]+ { yyextra->code->codify(yytext); } +<RawString>. { yyextra->code->codify(yytext); } +<RawString>\n { codifyLines(yyscanner,yytext); } +<SkipVerbString>[^"\n]+ { + yyextra->code->codify(yytext); + } +<SkipVerbString>\"\" { // escaped quote + yyextra->code->codify(yytext); + } +<SkipVerbString>\" { // end of string + yyextra->code->codify(yytext); + endFontClass(yyscanner); + BEGIN( yyextra->lastVerbStringContext ); + } +<SkipVerbString>. { + yyextra->code->codify(yytext); + } +<SkipVerbString>\n { + codifyLines(yyscanner,yytext); + } +<Body>":" { + yyextra->code->codify(yytext); + yyextra->name.resize(0);yyextra->type.resize(0); + } +<Body>"<" { + if (yyextra->insideTemplate) + { + yyextra->sharpCount++; + } + yyextra->code->codify(yytext); + } +<Body>">" { + if (yyextra->insideTemplate) + { + if (--yyextra->sharpCount<=0) + { + yyextra->insideTemplate=FALSE; + } + } + yyextra->code->codify(yytext); + } +<Body,MemberCall,MemberCall2,FuncCall>"'"((\\0[Xx0-9]+)|(\\.)|(.))"'" { + startFontClass(yyscanner,"charliteral"); + yyextra->code->codify(yytext); + endFontClass(yyscanner); + } +<Body>"."|"->" { + if (yytext[0]=='-') // -> could be overloaded + { + updateCallContextForSmartPointer(yyscanner); + } + yyextra->code->codify(yytext); + yyextra->memCallContext = YY_START; + BEGIN( MemberCall ); + } +<MemberCall>{SCOPETNAME}/{BN}*"(" { + if (yyextra->theCallContext.getScope()) + { + if (!generateClassMemberLink(yyscanner,*yyextra->code,yyextra->theCallContext.getScope(),yytext)) + { + yyextra->code->codify(yytext); + addToSearchIndex(yyscanner,yytext); + } + yyextra->name.resize(0); + } + else + { + yyextra->code->codify(yytext); + addToSearchIndex(yyscanner,yytext); + yyextra->name.resize(0); + } + yyextra->type.resize(0); + if (yyextra->memCallContext==Body) + { + BEGIN(FuncCall); + } + else + { + BEGIN(yyextra->memCallContext); + } + } +<MemberCall>{SCOPENAME}/{B}* { + if (yyextra->theCallContext.getScope()) + { + DBG_CTX((stderr,"yyextra->theCallContext.getClass()=%p\n",yyextra->theCallContext.getScope())); + if (!generateClassMemberLink(yyscanner,*yyextra->code,yyextra->theCallContext.getScope(),yytext)) + { + yyextra->code->codify(yytext); + addToSearchIndex(yyscanner,yytext); + } + yyextra->name.resize(0); + } + else + { + DBG_CTX((stderr,"no class context!\n")); + yyextra->code->codify(yytext); + addToSearchIndex(yyscanner,yytext); + yyextra->name.resize(0); + } + yyextra->type.resize(0); + BEGIN(yyextra->memCallContext); + } +<Body>[,=;\[] { + if (yyextra->insideObjC && *yytext=='[') + { + //printf("Found start of ObjC call!\n"); + // start of a method call + yyextra->contextDict.setAutoDelete(TRUE); + yyextra->nameDict.setAutoDelete(TRUE); + yyextra->objectDict.setAutoDelete(TRUE); + yyextra->wordDict.setAutoDelete(TRUE); + yyextra->commentDict.setAutoDelete(TRUE); + yyextra->contextDict.clear(); + yyextra->nameDict.clear(); + yyextra->objectDict.clear(); + yyextra->wordDict.clear(); + yyextra->commentDict.clear(); + yyextra->currentCtxId = 0; + yyextra->currentNameId = 0; + yyextra->currentObjId = 0; + yyextra->currentCtx = 0; + yyextra->braceCount = 0; + unput('['); + BEGIN(ObjCCall); + } + else + { + yyextra->code->codify(yytext); + yyextra->saveName = yyextra->name.copy(); + yyextra->saveType = yyextra->type.copy(); + if (*yytext!='[' && !yyextra->type.isEmpty()) + { + //printf("yyextra->scopeStack.bottom()=%p\n",yyextra->scopeStack.bottom()); + //if (yyextra->scopeStack.top()!=CLASSBLOCK) // commented out for bug731363 + { + //printf("AddVariable: '%s' '%s' context=%d\n", + // yyextra->type.data(),yyextra->name.data(),yyextra->theVarContext.count()); + yyextra->theVarContext.addVariable(yyscanner,yyextra->type,yyextra->name); + } + yyextra->name.resize(0); + } + if (*yytext==';' || *yytext=='=') + { + yyextra->type.resize(0); + yyextra->name.resize(0); + } + else if (*yytext=='[') + { + yyextra->theCallContext.pushScope(yyextra->name, yyextra->type); + } + yyextra->args.resize(0); + yyextra->parmType.resize(0); + yyextra->parmName.resize(0); + } + } + /* +<ObjCMemberCall>{ID} { + if (qstrcmp(yytext,"self")==0 || qstrcmp(yytext,"super")==0) + { + // TODO: get proper base class for "super" + yyextra->theCallContext.setClass(getClass(yyextra->curClassName)); + startFontClass(yyscanner,"keyword"); + yyextra->code->codify(yytext); + endFontClass(yyscanner); + } + else + { + generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext); + } + yyextra->name.resize(0); + BEGIN(ObjCMemberCall2); + } +<ObjCMemberCall>"[" { + yyextra->code->codify(yytext); + yyextra->theCallContext.pushScope(yyscanner,yyextra->name, yyextra->type); + } +<ObjCMemberCall2>{ID}":"? { + yyextra->name+=yytext; + if (yyextra->theCallContext.getClass()) + { + //printf("Calling method %s\n",yyextra->name.data()); + if (!generateClassMemberLink(yyscanner,*yyextra->code,yyextra->theCallContext.getClass(),yyextra->name)) + { + yyextra->code->codify(yytext); + addToSearchIndex(yyscanner,yyextra->name); + } + } + else + { + yyextra->code->codify(yytext); + addToSearchIndex(yyscanner,yyextra->name); + } + yyextra->name.resize(0); + BEGIN(ObjCMemberCall3); + } +<ObjCMemberCall2,ObjCMemberCall3>"]" { + yyextra->theCallContext.popScope(yyextra->name, yyextra->type); + yyextra->code->codify(yytext); + BEGIN(Body); + } + */ +<ObjCCall,ObjCMName>"["|"{" { + saveObjCContext(yyscanner); + yyextra->currentCtx->format+=*yytext; + BEGIN(ObjCCall); + //printf("open\n"); + } +<ObjCCall,ObjCMName>"]"|"}" { + yyextra->currentCtx->format+=*yytext; + restoreObjCContext(yyscanner); + BEGIN(ObjCMName); + if (yyextra->currentCtx==0) + { + // end of call + writeObjCMethodCall(yyscanner,yyextra->contextDict.find(0)); + BEGIN(Body); + } + //printf("close\n"); + } +<ObjCCall,ObjCMName>"//".* { + yyextra->currentCtx->format+=escapeComment(yyscanner,yytext); + } +<ObjCCall,ObjCMName>"/*" { + yyextra->lastObjCCallContext = YY_START; + yyextra->currentCtx->comment=yytext; + BEGIN(ObjCCallComment); + } +<ObjCCallComment>"*/" { + yyextra->currentCtx->comment+=yytext; + yyextra->currentCtx->format+=escapeComment(yyscanner,yyextra->currentCtx->comment); + BEGIN(yyextra->lastObjCCallContext); + } +<ObjCCallComment>[^*\n]+ { yyextra->currentCtx->comment+=yytext; } +<ObjCCallComment>"//"|"/*" { yyextra->currentCtx->comment+=yytext; } +<ObjCCallComment>\n { yyextra->currentCtx->comment+=*yytext; } +<ObjCCallComment>. { yyextra->currentCtx->comment+=*yytext; } +<ObjCCall>{ID} { + yyextra->currentCtx->format+=escapeObject(yyscanner,yytext); + if (yyextra->braceCount==0) + { + yyextra->currentCtx->objectTypeOrName=yytext; + //printf("new type=%s\n",yyextra->currentCtx->objectTypeOrName.data()); + BEGIN(ObjCMName); + } + } +<ObjCMName>{ID}/{BN}*"]" { + if (yyextra->braceCount==0 && + yyextra->currentCtx->methodName.isEmpty()) + { + yyextra->currentCtx->methodName=yytext; + yyextra->currentCtx->format+=escapeName(yyscanner,yytext); + } + else + { + yyextra->currentCtx->format+=escapeWord(yyscanner,yytext); + } + } +<ObjCMName>{ID}/{BN}*":" { + if (yyextra->braceCount==0) + { + yyextra->currentCtx->methodName+=yytext; + yyextra->currentCtx->methodName+=":"; + } + yyextra->currentCtx->format+=escapeName(yyscanner,yytext); + } +<ObjCSkipStr>[^\n\"$\\]* { yyextra->currentCtx->format+=yytext; } +<ObjCSkipStr>\\. { yyextra->currentCtx->format+=yytext; } +<ObjCSkipStr>"\"" { yyextra->currentCtx->format+=yytext; + BEGIN(yyextra->lastStringContext); + } +<ObjCCall,ObjCMName>{CHARLIT} { yyextra->currentCtx->format+=yytext; } +<ObjCCall,ObjCMName>"@"?"\"" { yyextra->currentCtx->format+=yytext; + yyextra->lastStringContext=YY_START; + BEGIN(ObjCSkipStr); + } +<ObjCCall,ObjCMName,ObjCSkipStr>"$" { yyextra->currentCtx->format+="$$"; } +<ObjCCall,ObjCMName>"(" { yyextra->currentCtx->format+=*yytext; yyextra->braceCount++; } +<ObjCCall,ObjCMName>")" { yyextra->currentCtx->format+=*yytext; yyextra->braceCount--; } +<ObjCSkipStr>"@"/"\"" { // needed to prevent matching the global rule (for C#) + yyextra->currentCtx->format+=yytext; + } +<ObjCCall,ObjCMName,ObjCSkipStr>{ID} { yyextra->currentCtx->format+=escapeWord(yyscanner,yytext); } +<ObjCCall,ObjCMName,ObjCSkipStr>. { yyextra->currentCtx->format+=*yytext; } +<ObjCCall,ObjCMName,ObjCSkipStr>\n { yyextra->currentCtx->format+=*yytext; } + +<Body>"]" { + yyextra->theCallContext.popScope(yyextra->name, yyextra->type); + yyextra->code->codify(yytext); + // TODO: nested arrays like: a[b[0]->func()]->func() + yyextra->name = yyextra->saveName.copy(); + yyextra->type = yyextra->saveType.copy(); + } +<Body>[0-9]+ { + yyextra->code->codify(yytext); + } +<Body>[0-9]+[xX][0-9A-Fa-f]+ { + yyextra->code->codify(yytext); + } +<MemberCall2,FuncCall>{KEYWORD}/([^a-z_A-Z0-9]) { + //addParmType(yyscanner); + //yyextra->parmName=yytext; + if (skipLanguageSpecificKeyword(yyscanner,yytext)) REJECT; + startFontClass(yyscanner,"keyword"); + yyextra->code->codify(yytext); + endFontClass(yyscanner); + } +<MemberCall2,FuncCall,OldStyleArgs,TemplCast>{TYPEKW}/([^a-z_A-Z0-9]) { + addParmType(yyscanner); + yyextra->parmName=yytext; + startFontClass(yyscanner,"keywordtype"); + yyextra->code->codify(yytext); + endFontClass(yyscanner); + } +<MemberCall2,FuncCall,OldStyleArgs,TemplCast>{TYPEKWSL}/([^a-z_A-Z0-9]) { + if (yyextra->lang!=SrcLangExt_Slice) + { + REJECT; + } + else + { + addParmType(yyscanner); + yyextra->parmName=yytext; + startFontClass(yyscanner,"keywordtype"); + yyextra->code->codify(yytext); + endFontClass(yyscanner); + } + } +<MemberCall2,FuncCall>{FLOWKW}/([^a-z_A-Z0-9]) { + addParmType(yyscanner); + yyextra->parmName=yytext; + startFontClass(yyscanner,"keywordflow"); + yyextra->code->codify(yytext); + endFontClass(yyscanner); + } +<MemberCall2,FuncCall>{FLOWCONDITION}/([^a-z_A-Z0-9]) { + if (yyextra->currentMemberDef && yyextra->currentMemberDef->isFunction()) + { + yyextra->currentMemberDef->incrementFlowKeyWordCount(); + } + addParmType(yyscanner); + yyextra->parmName=yytext; + startFontClass(yyscanner,"keywordflow"); + yyextra->code->codify(yytext); + endFontClass(yyscanner); + } +<MemberCall2,FuncCall>{ID}(({B}*"<"[^\n\[\](){}<>]*">")?({B}*"::"{B}*{ID})?)* { + if (isCastKeyword(yytext)) + { + REJECT; + } + addParmType(yyscanner); + yyextra->parmName=yytext; + generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext,!yyextra->insideBody); + } +<FuncCall>";" { // probably a cast, not a function call + yyextra->code->codify(yytext); + yyextra->inForEachExpression = FALSE; + BEGIN( Body ); + } +<MemberCall2,FuncCall>, { + yyextra->code->codify(yytext); + yyextra->theVarContext.addVariable(yyscanner,yyextra->parmType,yyextra->parmName); + yyextra->parmType.resize(0);yyextra->parmName.resize(0); + } +<MemberCall2,FuncCall>"{" { + if (yyextra->bracketCount>0) + { + yyextra->code->codify(yytext); + yyextra->skipInlineInitContext=YY_START; + yyextra->curlyCount=0; + BEGIN(InlineInit); + } + else + { + REJECT; + } + } +<InlineInit>"{" { yyextra->curlyCount++; + yyextra->code->codify(yytext); + } +<InlineInit>"}" { + yyextra->code->codify(yytext); + if (--yyextra->curlyCount<=0) + { + BEGIN(yyextra->skipInlineInitContext); + } + } +<InlineInit>\n { + codifyLines(yyscanner,yytext); + } +<InlineInit>. { + yyextra->code->codify(yytext); + } +<MemberCall2,FuncCall>"(" { + yyextra->parmType.resize(0);yyextra->parmName.resize(0); + yyextra->code->codify(yytext); + yyextra->bracketCount++; + yyextra->theCallContext.pushScope(yyextra->name, yyextra->type); + if (YY_START==FuncCall && !yyextra->insideBody) + { + yyextra->theVarContext.pushScope(); + } + } +<MemberCall2,FuncCall>{OPERATOR} { // operator + if (qstrcmp(yytext,"*") && + qstrcmp(yytext,"&") && + qstrcmp(yytext,"^") && + qstrcmp(yytext,"%")) // typically a pointer or reference + { + // not a * or &, or C++/CLI's ^ or % + yyextra->parmType.resize(0);yyextra->parmName.resize(0); + } + yyextra->code->codify(yytext); + } +<MemberCall,MemberCall2,FuncCall>("*"{B}*)?")" { + if (yytext[0]==')') // no a pointer cast + { + //printf("addVariable(%s,%s)\n",yyextra->parmType.data(),yyextra->parmName.data()); + if (yyextra->parmType.isEmpty()) + { + yyextra->parmType=yyextra->parmName; + yyextra->parmName.resize(0); + } + yyextra->theVarContext.addVariable(yyscanner,yyextra->parmType,yyextra->parmName); + } + else + { + yyextra->parmType = yyextra->parmName; + yyextra->parmName.resize(0); + yyextra->theVarContext.addVariable(yyscanner,yyextra->parmType,yyextra->parmName); + } + yyextra->theCallContext.popScope(yyextra->name, yyextra->type); + yyextra->inForEachExpression = FALSE; + //yyextra->theCallContext.setClass(0); // commented out, otherwise a()->b() does not work for b(). + yyextra->code->codify(yytext); + if (--yyextra->bracketCount<=0) + { + if (yyextra->name.isEmpty()) + { + BEGIN( Body ); + } + else + { + BEGIN( CallEnd ); + } + } + } +<CallEnd>[ \t\n]* { codifyLines(yyscanner,yytext); } + /* +<MemberCall2,FuncCall>")"[ \t\n]*[;:] { + */ +<CallEnd>[;:] { + codifyLines(yyscanner,yytext); + yyextra->bracketCount=0; + if (*yytext==';') yyextra->searchingForBody=FALSE; + if (!yyextra->type.isEmpty()) + { + DBG_CTX((stderr,"add variable yyextra->type=%s yyextra->name=%s)\n",yyextra->type.data(),yyextra->name.data())); + yyextra->theVarContext.addVariable(yyscanner,yyextra->type,yyextra->name); + } + yyextra->parmType.resize(0);yyextra->parmName.resize(0); + yyextra->theCallContext.setScope(0); + if (*yytext==';' || yyextra->insideBody) + { + if (!yyextra->insideBody) + { + yyextra->theVarContext.popScope(); + } + yyextra->name.resize(0);yyextra->type.resize(0); + BEGIN( Body ); + } + else + { + yyextra->bracketCount=0; + BEGIN( SkipInits ); + } + } +<CallEnd>("const"|"volatile"|"sealed"|"override")({BN}+("const"|"volatile"|"sealed"|"override"))*/{BN}*(";"|"="|"throw"{BN}*"(") { + startFontClass(yyscanner,"keyword"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + } +<CallEnd,OldStyleArgs>("const"|"volatile"|"sealed"|"override")*({BN}+("const"|"volatile"|"sealed"|"override"))*{BN}*"{" { + if (yyextra->insideBody) + { + yyextra->theVarContext.pushScope(); + } + yyextra->theVarContext.addVariable(yyscanner,yyextra->parmType,yyextra->parmName); + //yyextra->theCallContext.popScope(yyextra->name, yyextra->type); + yyextra->parmType.resize(0);yyextra->parmName.resize(0); + int index = yyextra->name.findRev("::"); + DBG_CTX((stderr,"yyextra->name=%s\n",yyextra->name.data())); + if (index!=-1) + { + QCString scope = yyextra->name.left(index); + if (!yyextra->classScope.isEmpty()) scope.prepend(yyextra->classScope+"::"); + const ClassDef *cd=getResolvedClass(Doxygen::globalScope,yyextra->sourceFileDef,scope); + if (cd) + { + setClassScope(yyscanner,cd->name()); + yyextra->scopeStack.push(SCOPEBLOCK); + DBG_CTX((stderr,"** scope stack push SCOPEBLOCK\n")); + } + else + { + //setClassScope(yyscanner,yyextra->realScope); + yyextra->scopeStack.push(INNERBLOCK); + DBG_CTX((stderr,"** scope stack push INNERBLOCK\n")); + } + } + else + { + DBG_CTX((stderr,"** scope stack push INNERBLOCK\n")); + yyextra->scopeStack.push(INNERBLOCK); + } + yytext[yyleng-1]='\0'; + QCString cv(yytext); + if (!cv.stripWhiteSpace().isEmpty()) + { + startFontClass(yyscanner,"keyword"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + } + else // just whitespace + { + codifyLines(yyscanner,yytext); + } + yyextra->code->codify("{"); + if (yyextra->searchingForBody) + { + yyextra->searchingForBody=FALSE; + yyextra->insideBody=TRUE; + } + if (yyextra->insideBody) yyextra->bodyCurlyCount++; + yyextra->type.resize(0); yyextra->name.resize(0); + BEGIN( Body ); + } +<CallEnd>"try" { // function-try-block + startFontClass(yyscanner,"keyword"); + yyextra->code->codify(yytext); + endFontClass(yyscanner); + yyextra->inFunctionTryBlock=TRUE; + } +<CallEnd>{ID} { + if (yyextra->insideBody || !yyextra->parmType.isEmpty()) + { + REJECT; + } + // could be K&R style definition + addParmType(yyscanner); + yyextra->parmName=yytext; + generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext,!yyextra->insideBody); + BEGIN(OldStyleArgs); + } +<OldStyleArgs>{ID} { + addParmType(yyscanner); + yyextra->parmName=yytext; + generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext,!yyextra->insideBody); + } +<OldStyleArgs>[,;] { + yyextra->code->codify(yytext); + yyextra->theVarContext.addVariable(yyscanner,yyextra->parmType,yyextra->parmName); + if (*yytext==';') yyextra->parmType.resize(0); + yyextra->parmName.resize(0); + } +<CallEnd,OldStyleArgs>"#" { + startFontClass(yyscanner,"preprocessor"); + yyextra->lastSkipCppContext = Body; + yyextra->code->codify(yytext); + BEGIN( SkipCPP ); + } +<CallEnd>. { + unput(*yytext); + if (!yyextra->insideBody) + { + yyextra->theVarContext.popScope(); + } + yyextra->name.resize(0);yyextra->args.resize(0); + yyextra->parmType.resize(0);yyextra->parmName.resize(0); + BEGIN( Body ); + } +<SkipInits>";" { + yyextra->code->codify(yytext); + yyextra->type.resize(0); yyextra->name.resize(0); + BEGIN( Body ); + } +<SkipInits>"{" { + yyextra->code->codify(yytext); + if (yyextra->searchingForBody) + { + yyextra->searchingForBody=FALSE; + yyextra->insideBody=TRUE; + } + if (yyextra->insideBody) yyextra->bodyCurlyCount++; + if (yyextra->name.find("::")!=-1) + { + DBG_CTX((stderr,"** scope stack push SCOPEBLOCK\n")); + yyextra->scopeStack.push(SCOPEBLOCK); + setClassScope(yyscanner,yyextra->realScope); + } + else + { + DBG_CTX((stderr,"** scope stack push INNERBLOCK\n")); + yyextra->scopeStack.push(INNERBLOCK); + } + yyextra->type.resize(0); yyextra->name.resize(0); + BEGIN( Body ); + } +<SkipInits>{ID} { + generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext); + } +<FuncCall>{ID}/"(" { + generateFunctionLink(yyscanner,*yyextra->code,yytext); + } +<FuncCall>{ID}/("."|"->") { + yyextra->name=yytext; + generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext); + BEGIN( MemberCall2 ); + } +<FuncCall,MemberCall2>("("{B}*("*"{B}*)+{ID}*{B}*")"{B}*)/("."|"->") { + yyextra->code->codify(yytext); + int s=0;while (!isId(yytext[s])) s++; + int e=(int)yyleng-1;while (!isId(yytext[e])) e--; + yyextra->name=((QCString)yytext).mid(s,e-s+1); + BEGIN( MemberCall2 ); + } +<MemberCall2>{ID}/([ \t\n]*"(") { + if (!yyextra->args.isEmpty()) + generateMemberLink(yyscanner,*yyextra->code,yyextra->args,yytext); + else + generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext); + yyextra->args.resize(0); + BEGIN( FuncCall ); + } +<MemberCall2>{ID}/([ \t\n]*("."|"->")) { + //yyextra->code->codify(yytext); + yyextra->name=yytext; + generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext); + BEGIN( MemberCall2 ); + } +<MemberCall2>"->"|"." { + if (yytext[0]=='-') // -> could be overloaded + { + updateCallContextForSmartPointer(yyscanner); + } + yyextra->code->codify(yytext); + yyextra->memCallContext = YY_START; + BEGIN( MemberCall ); + } +<SkipComment>"/*"("!"?)"*/" { + yyextra->code->codify(yytext); + endFontClass(yyscanner); + BEGIN( yyextra->lastCContext ) ; + } +<SkipComment>"//"|"/*" { + yyextra->code->codify(yytext); + } +<SkipComment>[^*/\n]+ { + yyextra->code->codify(yytext); + } +<SkipComment>[ \t]*"*/" { + yyextra->code->codify(yytext); + endFontClass(yyscanner); + if (yyextra->lastCContext==SkipCPP) + { + startFontClass(yyscanner,"preprocessor"); + } + BEGIN( yyextra->lastCContext ) ; + } +<SkipCxxComment>[^\r\n]*"\\"[\r]?\n { // line continuation + codifyLines(yyscanner,yytext); + } +<SkipCxxComment>[^\r\n]+ { + yyextra->code->codify(yytext); + } +<SkipCxxComment>\r +<SkipCxxComment>\n { + unput('\n'); + endFontClass(yyscanner); + BEGIN( yyextra->lastCContext ) ; + } +<SkipCxxComment>. { + yyextra->code->codify(yytext); + } +<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*({B}*(("//@"[{}])|("/*@"[{}]"*/")){B}*\n)?{B}*"/*"[*!]/[^/*] { + yyextra->yyLineNr+=QCString(yytext).contains('\n'); + } +<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*({B}*(("//@"[{}])|("/*@"[{}]"*/")){B}*\n)? { + yyextra->yyLineNr+=QCString(yytext).contains('\n'); + nextCodeLine(yyscanner); + if (yyextra->lastSpecialCContext==SkipCxxComment) + { // force end of C++ comment here + endFontClass(yyscanner); + BEGIN( yyextra->lastCContext ) ; + } + else + { + BEGIN(yyextra->lastSpecialCContext); + } + } +<RemoveSpecialCComment>"*/" { + BEGIN(yyextra->lastSpecialCContext); + } +<RemoveSpecialCComment>[^*\n]+ +<RemoveSpecialCComment>"//"|"/*" +<RemoveSpecialCComment>\n { yyextra->yyLineNr++; } +<RemoveSpecialCComment>. +<MemberCall>[^a-z_A-Z0-9(\n] { + yyextra->code->codify(yytext); + yyextra->type.resize(0); + yyextra->name.resize(0); + BEGIN(yyextra->memCallContext); + } +<*>\n({B}*"//"[!/][^\n]*\n)+ { // remove special one-line comment + if (YY_START==SkipCPP) REJECT; + if (Config_getBool(STRIP_CODE_COMMENTS)) + { + yyextra->yyLineNr+=((QCString)yytext).contains('\n'); + nextCodeLine(yyscanner); + } + else + { + startFontClass(yyscanner,"comment"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + } + if (YY_START==SkipCxxComment) + { + endFontClass(yyscanner); + BEGIN( yyextra->lastCContext ) ; + } + } +<SkipCPP>\n/.*\n { + endFontClass(yyscanner); + codifyLines(yyscanner,yytext); + BEGIN( yyextra->lastSkipCppContext ) ; + } +<*>\n{B}*"//@"[{}].*\n { // remove one-line group marker + if (Config_getBool(STRIP_CODE_COMMENTS)) + { + yyextra->yyLineNr+=2; + nextCodeLine(yyscanner); + } + else + { + startFontClass(yyscanner,"comment"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + } + if (YY_START==SkipCxxComment) + { + endFontClass(yyscanner); + BEGIN( yyextra->lastCContext ) ; + } + } +<*>\n{B}*"/*@"[{}] { // remove one-line group marker + if (Config_getBool(STRIP_CODE_COMMENTS)) + { + if (YY_START != RemoveSpecialCComment) yyextra->lastSpecialCContext = YY_START; + yyextra->yyLineNr++; + BEGIN(RemoveSpecialCComment); + } + else + { + // check is to prevent getting stuck in skipping C++ comments + if (YY_START != SkipComment && YY_START != SkipCxxComment) + { + yyextra->lastCContext = YY_START ; + } + startFontClass(yyscanner,"comment"); + codifyLines(yyscanner,yytext); + BEGIN(SkipComment); + } + } +<*>^{B}*"//@"[{}].*\n { // remove one-line group marker + if (Config_getBool(STRIP_CODE_COMMENTS)) + { + yyextra->yyLineNr++; + nextCodeLine(yyscanner); + } + else + { + startFontClass(yyscanner,"comment"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + } + } +<*>^{B}*"/*@"[{}] { // remove multi-line group marker + if (Config_getBool(STRIP_CODE_COMMENTS)) + { + if (YY_START != RemoveSpecialCComment) yyextra->lastSpecialCContext = YY_START; + BEGIN(RemoveSpecialCComment); + } + else + { + // check is to prevent getting stuck in skipping C++ comments + if (YY_START != SkipComment && YY_START != SkipCxxComment) + { + yyextra->lastCContext = YY_START ; + } + startFontClass(yyscanner,"comment"); + yyextra->code->codify(yytext); + BEGIN(SkipComment); + } + } +<*>^{B}*"//"[!/][^\n]*\n { // remove special one-line comment + if (Config_getBool(STRIP_CODE_COMMENTS)) + { + yyextra->yyLineNr++; + //nextCodeLine(yyscanner); + } + else + { + startFontClass(yyscanner,"comment"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + } + } +<*>"//"[!/][^\n]*\n { // strip special one-line comment + if (YY_START==SkipComment || YY_START==SkipString) REJECT; + if (Config_getBool(STRIP_CODE_COMMENTS)) + { + char c[2]; c[0]='\n'; c[1]=0; + codifyLines(yyscanner,c); + } + else + { + startFontClass(yyscanner,"comment"); + codifyLines(yyscanner,yytext); + endFontClass(yyscanner); + } + } +<*>"/*[tag:"[^\]\n]*"]*/"{B}* { // special pattern /*[tag:filename]*/ to force linking to a tag file + yyextra->forceTagReference=yytext; + int s=yyextra->forceTagReference.find(':'); + int e=yyextra->forceTagReference.findRev(']'); + yyextra->forceTagReference = yyextra->forceTagReference.mid(s+1,e-s-1); + } +<*>\n{B}*"/*"[!*]/[^/*] { + if (Config_getBool(STRIP_CODE_COMMENTS)) + { + if (YY_START != RemoveSpecialCComment) yyextra->lastSpecialCContext = YY_START; + yyextra->yyLineNr++; + BEGIN(RemoveSpecialCComment); + } + else + { + // check is to prevent getting stuck in skipping C++ comments + if (YY_START != SkipComment && YY_START != SkipCxxComment) + { + yyextra->lastCContext = YY_START ; + } + startFontClass(yyscanner,"comment"); + codifyLines(yyscanner,yytext); + BEGIN(SkipComment); + } + } +<*>^{B}*"/**"[*]+/[^/] { // special C "banner" comment block at a new line + if (Config_getBool(JAVADOC_BANNER) && Config_getBool(STRIP_CODE_COMMENTS)) + { + if (YY_START != RemoveSpecialCComment) yyextra->lastSpecialCContext = YY_START; + BEGIN(RemoveSpecialCComment); + } + else + { + // check is to prevent getting stuck in skipping C++ comments + if (YY_START != SkipComment && YY_START != SkipCxxComment) + { + yyextra->lastCContext = YY_START ; + } + startFontClass(yyscanner,"comment"); + yyextra->code->codify(yytext); + BEGIN(SkipComment); + } + } +<*>^{B}*"/*"[!*]/[^/*] { // special C comment block at a new line + if (Config_getBool(STRIP_CODE_COMMENTS)) + { + if (YY_START != RemoveSpecialCComment) yyextra->lastSpecialCContext = YY_START; + BEGIN(RemoveSpecialCComment); + } + else + { + // check is to prevent getting stuck in skipping C++ comments + if (YY_START != SkipComment && YY_START != SkipCxxComment) + { + yyextra->lastCContext = YY_START ; + } + startFontClass(yyscanner,"comment"); + yyextra->code->codify(yytext); + BEGIN(SkipComment); + } + } +<*>"/*"[!*]/[^/*] { // special C comment block half way a line + if (YY_START==SkipString) REJECT; + if (Config_getBool(STRIP_CODE_COMMENTS)) + { + if (YY_START != RemoveSpecialCComment) yyextra->lastSpecialCContext = YY_START; + BEGIN(RemoveSpecialCComment); + } + else + { + // check is to prevent getting stuck in skipping C++ comments + if (YY_START != SkipComment && YY_START != SkipCxxComment) + { + yyextra->lastCContext = YY_START ; + } + startFontClass(yyscanner,"comment"); + yyextra->code->codify(yytext); + BEGIN(SkipComment); + } + } +<*>"/*"("!"?)"*/" { + if (YY_START==SkipString) REJECT; + if (!Config_getBool(STRIP_CODE_COMMENTS)) + { + startFontClass(yyscanner,"comment"); + yyextra->code->codify(yytext); + endFontClass(yyscanner); + } + } +<SkipComment>[^\*\n]+ { + yyextra->code->codify(yytext); + } +<*>"/*" { + startFontClass(yyscanner,"comment"); + yyextra->code->codify(yytext); + // check is to prevent getting stuck in skipping C++ comments + if (YY_START != SkipComment && YY_START != SkipCxxComment) + { + yyextra->lastCContext = YY_START ; + } + BEGIN( SkipComment ) ; + } +<*>@\" { // C# verbatim string + startFontClass(yyscanner,"stringliteral"); + yyextra->code->codify(yytext); + yyextra->lastVerbStringContext=YY_START; + BEGIN(SkipVerbString); + } +<*>"//" { + startFontClass(yyscanner,"comment"); + yyextra->code->codify(yytext); + yyextra->lastCContext = YY_START ; + BEGIN( SkipCxxComment ) ; + } +<*>"("|"[" { + yyextra->code->codify(yytext); + yyextra->theCallContext.pushScope(yyextra->name, yyextra->type); + } +<*>")"|"]" { + yyextra->code->codify(yytext); + yyextra->theCallContext.popScope(yyextra->name, yyextra->type); + } +<*>\n { + yyextra->yyColNr++; + codifyLines(yyscanner,yytext); + } +<*>. { + yyextra->yyColNr++; + yyextra->code->codify(yytext); + } + /* +<*>([ \t\n]*"\n"){2,} { // combine multiple blank lines + //QCString sepLine=yytext; + //yyextra->code->codify("\n\n"); + //yyextra->yyLineNr+=sepLine.contains('\n'); + //char sepLine[3]="\n\n"; + codifyLines(yyscanner,yytext); + } + */ + +%% + +/*@ ---------------------------------------------------------------------------- + */ + +void VariableContext::addVariable(yyscan_t yyscanner,const QCString &type,const QCString &name) { + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; //printf("VariableContext::addVariable(%s,%s)\n",type.data(),name.data()); QCString ltype = type.simplifyWhiteSpace(); QCString lname = name.simplifyWhiteSpace(); @@ -257,8 +2268,8 @@ void VariableContext::addVariable(const QCString &type,const QCString &name) const ClassDef *varType; int i=0; if ( - (varType=g_codeClassSDict->find(ltype)) || // look for class definitions inside the code block - (varType=getResolvedClass(g_currentDefinition,g_sourceFileDef,ltype)) // look for global class definitions + (varType=yyextra->codeClassSDict->find(ltype)) || // look for class definitions inside the code block + (varType=getResolvedClass(yyextra->currentDefinition,yyextra->sourceFileDef,ltype)) // look for global class definitions ) { DBG_CTX((stderr,"** addVariable type='%s' name='%s'\n",ltype.data(),lname.data())); @@ -272,9 +2283,9 @@ void VariableContext::addVariable(const QCString &type,const QCString &name) QCString templateArgs(ltype.right(ltype.length() - i)); if ( !typeName.isEmpty() && ( // look for class definitions inside the code block - (varType=g_codeClassSDict->find(typeName)) || + (varType=yyextra->codeClassSDict->find(typeName)) || // otherwise look for global class definitions - (varType=getResolvedClass(g_currentDefinition,g_sourceFileDef,typeName,0,0,TRUE,TRUE)) + (varType=getResolvedClass(yyextra->currentDefinition,yyextra->sourceFileDef,typeName,0,0,TRUE,TRUE)) ) && // and it must be a template !varType->templateArguments().empty()) { @@ -288,7 +2299,7 @@ void VariableContext::addVariable(const QCString &type,const QCString &name) else { // Doesn't seem to be a template. Try just the base name. - addVariable(typeName,name); + addVariable(yyscanner,typeName,name); } } else @@ -330,137 +2341,73 @@ ClassDef *VariableContext::findVariable(const QCString &name) return result; } -static VariableContext g_theVarContext; const ClassDef *VariableContext::dummyContext = (ClassDef*)0x8; //------------------------------------------------------------------- -class CallContext -{ - public: - struct Ctx - { - Ctx(QCString _name, QCString _type) : name(_name), type(_type), d(0) {} - QCString name; - QCString type; - const Definition *d; - }; - - CallContext() - { - m_defList.append(new Ctx("","")); - m_defList.setAutoDelete(TRUE); - } - virtual ~CallContext() {} - void setScope(const Definition *d) - { - Ctx *ctx = m_defList.getLast(); - if (ctx) - { - DBG_CTX((stderr,"** Set call context %s (%p)\n",d==0 ? "<null>" : d->name().data(),d)); - ctx->d=d; - } - } - void pushScope(QCString _name, QCString _type) - { - m_defList.append(new Ctx(_name,_type)); - DBG_CTX((stderr,"** Push call context %d\n",m_defList.count())); - } - void popScope(QCString &_name, QCString &_type) - { - if (m_defList.count()>1) - { - DBG_CTX((stderr,"** Pop call context %d\n",m_defList.count())); - Ctx *ctx = m_defList.getLast(); - if (ctx) - { - _name = ctx->name; - _type = ctx->type; - } - m_defList.removeLast(); - } - else - { - DBG_CTX((stderr,"** ILLEGAL: Pop call context\n")); - } - } - void clear() - { - DBG_CTX((stderr,"** Clear call context\n")); - m_defList.clear(); - m_defList.append(new Ctx("","")); - } - const Definition *getScope() const - { - Ctx *ctx = m_defList.getLast(); - if (ctx) return ctx->d; else return 0; - } - - private: - QList<Ctx> m_defList; -}; - -static CallContext g_theCallContext; - -//------------------------------------------------------------------- - /*! add class/namespace name s to the scope */ -static void pushScope(const char *s) +static void pushScope(yyscan_t yyscanner,const char *s) { - g_classScopeLengthStack.push(new int(g_classScope.length())); - if (g_classScope.isEmpty() || leftScopeMatch(s,g_classScope)) + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + yyextra->classScopeLengthStack.push(new int(yyextra->classScope.length())); + if (yyextra->classScope.isEmpty() || leftScopeMatch(s,yyextra->classScope)) { - g_classScope = s; + yyextra->classScope = s; } else { - g_classScope += "::"; - g_classScope += s; + yyextra->classScope += "::"; + yyextra->classScope += s; } - //printf("pushScope(%s) result: '%s'\n",s,g_classScope.data()); + //printf("pushScope(%s) result: '%s'\n",s,yyextra->classScope.data()); } + /*! remove the top class/namespace name from the scope */ -static void popScope() +static void popScope(yyscan_t yyscanner) { - if (!g_classScopeLengthStack.isEmpty()) + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + if (!yyextra->classScopeLengthStack.isEmpty()) { - int *pLength = g_classScopeLengthStack.pop(); - g_classScope.truncate(*pLength); + int *pLength = yyextra->classScopeLengthStack.pop(); + yyextra->classScope.truncate(*pLength); delete pLength; } else { //err("Too many end of scopes found!\n"); } - //printf("popScope() result: '%s'\n",g_classScope.data()); + //printf("popScope() result: '%s'\n",yyextra->classScope.data()); } -static void setCurrentDoc(const QCString &anchor) +static void setCurrentDoc(yyscan_t yyscanner,const QCString &anchor) { + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; if (Doxygen::searchIndex) { - if (g_searchCtx) + if (yyextra->searchCtx) { - g_code->setCurrentDoc(g_searchCtx,g_searchCtx->anchor(),FALSE); + yyextra->code->setCurrentDoc(yyextra->searchCtx,yyextra->searchCtx->anchor(),FALSE); } else { - g_code->setCurrentDoc(g_sourceFileDef,anchor,TRUE); + yyextra->code->setCurrentDoc(yyextra->sourceFileDef,anchor,TRUE); } } } -static void addToSearchIndex(const char *text) +static void addToSearchIndex(yyscan_t yyscanner,const char *text) { + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; if (Doxygen::searchIndex) { - g_code->addWord(text,FALSE); + yyextra->code->addWord(text,FALSE); } } -static void setClassScope(const QCString &name) +static void setClassScope(yyscan_t yyscanner,const QCString &name) { + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; //printf("setClassScope(%s)\n",name.data()); QCString n=name; n=n.simplifyWhiteSpace(); @@ -472,132 +2419,134 @@ static void setClassScope(const QCString &name) // remove template from scope n=n.left(ts)+n.right(n.length()-te-1); } - while (!g_classScopeLengthStack.isEmpty()) + while (!yyextra->classScopeLengthStack.isEmpty()) { - popScope(); + popScope(yyscanner); } - g_classScope.resize(0); + yyextra->classScope.resize(0); int i; while ((i=n.find("::"))!=-1) { - pushScope(n.left(i)); + pushScope(yyscanner,n.left(i)); n = n.mid(i+2); } - pushScope(n); - //printf("--->New class scope '%s'\n",g_classScope.data()); + pushScope(yyscanner,n); + //printf("--->New class scope '%s'\n",yyextra->classScope.data()); } -/*! start a new line of code, inserting a line number if g_sourceFileDef +/*! start a new line of code, inserting a line number if yyextra->sourceFileDef * is TRUE. If a definition starts at the current line, then the line * number is linked to the documentation of that definition. */ -static void startCodeLine() +static void startCodeLine(yyscan_t yyscanner) { - //if (g_currentFontClass) { g_code->endFontClass(); } - if (g_sourceFileDef && g_lineNumbers) + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + //if (yyextra->currentFontClass) { yyextra->code->endFontClass(yyscanner); } + if (yyextra->sourceFileDef && yyextra->lineNumbers) { //QCString lineNumber,lineAnchor; - //lineNumber.sprintf("%05d",g_yyLineNr); - //lineAnchor.sprintf("l%05d",g_yyLineNr); + //lineNumber.sprintf("%05d",yyextra->yyLineNr); + //lineAnchor.sprintf("l%05d",yyextra->yyLineNr); - Definition *d = g_sourceFileDef->getSourceDefinition(g_yyLineNr); - //printf("%s:startCodeLine(%d)=%p\n",g_sourceFileDef->name().data(),g_yyLineNr,d); - if (!g_includeCodeFragment && d) - { - g_currentDefinition = d; - g_currentMemberDef = g_sourceFileDef->getSourceMember(g_yyLineNr); - g_insideBody = FALSE; - g_searchingForBody = TRUE; - g_realScope = d->name(); - //g_classScope = ""; - g_type.resize(0); - g_name.resize(0); - g_args.resize(0); - g_parmType.resize(0); - g_parmName.resize(0); - //printf("Real scope: '%s'\n",g_realScope.data()); - g_bodyCurlyCount = 0; + Definition *d = yyextra->sourceFileDef->getSourceDefinition(yyextra->yyLineNr); + //printf("%s:startCodeLine(%d)=%p\n",yyextra->sourceFileDef->name().data(),yyextra->yyLineNr,d); + if (!yyextra->includeCodeFragment && d) + { + yyextra->currentDefinition = d; + yyextra->currentMemberDef = yyextra->sourceFileDef->getSourceMember(yyextra->yyLineNr); + yyextra->insideBody = FALSE; + yyextra->searchingForBody = TRUE; + yyextra->realScope = d->name(); + //yyextra->classScope = ""; + yyextra->type.resize(0); + yyextra->name.resize(0); + yyextra->args.resize(0); + yyextra->parmType.resize(0); + yyextra->parmName.resize(0); + //printf("Real scope: '%s'\n",yyextra->realScope.data()); + yyextra->bodyCurlyCount = 0; QCString lineAnchor; - lineAnchor.sprintf("l%05d",g_yyLineNr); - if (g_currentMemberDef) + lineAnchor.sprintf("l%05d",yyextra->yyLineNr); + if (yyextra->currentMemberDef) { - g_code->writeLineNumber(g_currentMemberDef->getReference(), - g_currentMemberDef->getOutputFileBase(), - g_currentMemberDef->anchor(),g_yyLineNr); - setCurrentDoc(lineAnchor); + yyextra->code->writeLineNumber(yyextra->currentMemberDef->getReference(), + yyextra->currentMemberDef->getOutputFileBase(), + yyextra->currentMemberDef->anchor(),yyextra->yyLineNr); + setCurrentDoc(yyscanner,lineAnchor); } else if (d->isLinkableInProject()) { - g_code->writeLineNumber(d->getReference(), + yyextra->code->writeLineNumber(d->getReference(), d->getOutputFileBase(), - 0,g_yyLineNr); - setCurrentDoc(lineAnchor); + 0,yyextra->yyLineNr); + setCurrentDoc(yyscanner,lineAnchor); } } else { - g_code->writeLineNumber(0,0,0,g_yyLineNr); + yyextra->code->writeLineNumber(0,0,0,yyextra->yyLineNr); } } - DBG_CTX((stderr,"startCodeLine(%d)\n",g_yyLineNr)); - g_code->startCodeLine(g_sourceFileDef && g_lineNumbers); - if (g_currentFontClass) + DBG_CTX((stderr,"startCodeLine(%d)\n",yyextra->yyLineNr)); + yyextra->code->startCodeLine(yyextra->sourceFileDef && yyextra->lineNumbers); + if (yyextra->currentFontClass) { - g_code->startFontClass(g_currentFontClass); + yyextra->code->startFontClass(yyextra->currentFontClass); } } -static void endFontClass(); -static void startFontClass(const char *s); -static void endCodeLine() +static void endCodeLine(yyscan_t yyscanner) { - DBG_CTX((stderr,"endCodeLine(%d)\n",g_yyLineNr)); - endFontClass(); - g_code->endCodeLine(); + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + DBG_CTX((stderr,"endCodeLine(%d)\n",yyextra->yyLineNr)); + endFontClass(yyscanner); + yyextra->code->endCodeLine(); } -static void nextCodeLine() +static void nextCodeLine(yyscan_t yyscanner) { - const char * fc = g_currentFontClass; - endCodeLine(); - if (g_yyLineNr<g_inputLines) + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + const char * fc = yyextra->currentFontClass; + endCodeLine(yyscanner); + if (yyextra->yyLineNr<yyextra->inputLines) { - g_currentFontClass = fc; - startCodeLine(); + yyextra->currentFontClass = fc; + startCodeLine(yyscanner); } } /*! write a code fragment 'text' that may span multiple lines, inserting * line numbers for each line. */ -static void codifyLines(const char *text) +static void codifyLines(yyscan_t yyscanner,const char *text) { - //printf("codifyLines(%d,\"%s\")\n",g_yyLineNr,text); + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + //printf("codifyLines(%d,\"%s\")\n",yyextra->yyLineNr,text); const char *p=text,*sp=p; char c; bool done=FALSE; while (!done) { sp=p; - while ((c=*p++) && c!='\n') { g_yyColNr++; } + while ((c=*p++) && c!='\n') { yyextra->yyColNr++; } if (c=='\n') { - g_yyLineNr++; - g_yyColNr=1; + yyextra->yyLineNr++; + yyextra->yyColNr=1; //*(p-1)='\0'; int l = (int)(p-sp-1); char *tmp = (char*)malloc(l+1); memcpy(tmp,sp,l); tmp[l]='\0'; - g_code->codify(tmp); + yyextra->code->codify(tmp); free(tmp); - nextCodeLine(); + nextCodeLine(yyscanner); } else { - g_code->codify(sp); + yyextra->code->codify(sp); done=TRUE; } } @@ -607,10 +2556,11 @@ static void codifyLines(const char *text) * line numbers for each line. If \a text contains newlines, the link will be * split into multiple links with the same destination, one for each line. */ -static void writeMultiLineCodeLink(CodeOutputInterface &ol, +static void writeMultiLineCodeLink(yyscan_t yyscanner,CodeOutputInterface &ol, const Definition *d, const char *text) { + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; static bool sourceTooltips = Config_getBool(SOURCE_TOOLTIPS); TooltipManager::instance()->addTooltip(d); QCString ref = d->getReference(); @@ -630,11 +2580,11 @@ static void writeMultiLineCodeLink(CodeOutputInterface &ol, while ((c=*p++) && c!='\n') { } if (c=='\n') { - g_yyLineNr++; + yyextra->yyLineNr++; *(p-1)='\0'; //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp); ol.writeCodeLink(ref,file,anchor,sp,tooltip); - nextCodeLine(); + nextCodeLine(yyscanner); } else { @@ -645,56 +2595,61 @@ static void writeMultiLineCodeLink(CodeOutputInterface &ol, } } -static void addType() +static void addType(yyscan_t yyscanner) { - if (g_name=="const") { g_name.resize(0); return; } - if (!g_type.isEmpty()) g_type += ' ' ; - g_type += g_name ; - g_name.resize(0) ; - if (!g_type.isEmpty()) g_type += ' ' ; - g_type += g_args ; - g_args.resize(0) ; + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + if (yyextra->name=="const") { yyextra->name.resize(0); return; } + if (!yyextra->type.isEmpty()) yyextra->type += ' ' ; + yyextra->type += yyextra->name ; + yyextra->name.resize(0) ; + if (!yyextra->type.isEmpty()) yyextra->type += ' ' ; + yyextra->type += yyextra->args ; + yyextra->args.resize(0) ; } -static void addParmType() +static void addParmType(yyscan_t yyscanner) { - if (g_parmName=="const") { g_parmName.resize(0); return; } - if (!g_parmType.isEmpty()) g_parmType += ' ' ; - g_parmType += g_parmName ; - g_parmName.resize(0) ; + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + if (yyextra->parmName=="const") { yyextra->parmName.resize(0); return; } + if (!yyextra->parmType.isEmpty()) yyextra->parmType += ' ' ; + yyextra->parmType += yyextra->parmName ; + yyextra->parmName.resize(0) ; } -static void addUsingDirective(const char *name) +static void addUsingDirective(yyscan_t yyscanner,const char *name) { - if (g_sourceFileDef && name) + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + if (yyextra->sourceFileDef && name) { NamespaceDef *nd = Doxygen::namespaceSDict->find(name); if (nd) { - g_sourceFileDef->addUsingDirective(nd); + yyextra->sourceFileDef->addUsingDirective(nd); } } } -static void setParameterList(const MemberDef *md) +static void setParameterList(yyscan_t yyscanner,const MemberDef *md) { - g_classScope = md->getClassDef() ? md->getClassDef()->name().data() : ""; + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + yyextra->classScope = md->getClassDef() ? md->getClassDef()->name().data() : ""; for (const Argument &a : md->argumentList()) { - g_parmName = a.name; - g_parmType = a.type; - int i = g_parmType.find('*'); - if (i!=-1) g_parmType = g_parmType.left(i); - i = g_parmType.find('&'); - if (i!=-1) g_parmType = g_parmType.left(i); - g_parmType.stripPrefix("const "); - g_parmType=g_parmType.stripWhiteSpace(); - g_theVarContext.addVariable(g_parmType,g_parmName); + yyextra->parmName = a.name; + yyextra->parmType = a.type; + int i = yyextra->parmType.find('*'); + if (i!=-1) yyextra->parmType = yyextra->parmType.left(i); + i = yyextra->parmType.find('&'); + if (i!=-1) yyextra->parmType = yyextra->parmType.left(i); + yyextra->parmType.stripPrefix("const "); + yyextra->parmType=yyextra->parmType.stripWhiteSpace(); + yyextra->theVarContext.addVariable(yyscanner,yyextra->parmType,yyextra->parmName); } } -static const ClassDef *stripClassName(const char *s,Definition *d=g_currentDefinition) +static const ClassDef *stripClassName(yyscan_t yyscanner,const char *s,Definition *d) { + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; int pos=0; QCString type = s; QCString className; @@ -703,13 +2658,13 @@ static const ClassDef *stripClassName(const char *s,Definition *d=g_currentDefin { QCString clName=className+templSpec; const ClassDef *cd=0; - if (!g_classScope.isEmpty()) + if (!yyextra->classScope.isEmpty()) { - cd=getResolvedClass(d,g_sourceFileDef,g_classScope+"::"+clName); + cd=getResolvedClass(d,yyextra->sourceFileDef,yyextra->classScope+"::"+clName); } if (cd==0) { - cd=getResolvedClass(d,g_sourceFileDef,clName); + cd=getResolvedClass(d,yyextra->sourceFileDef,clName); } //printf("stripClass trying '%s' = %p\n",clName.data(),cd); if (cd) @@ -721,10 +2676,11 @@ static const ClassDef *stripClassName(const char *s,Definition *d=g_currentDefin return 0; } -static MemberDef *setCallContextForVar(const QCString &name) +static MemberDef *setCallContextForVar(yyscan_t yyscanner,const QCString &name) { if (name.isEmpty()) return 0; - DBG_CTX((stderr,"setCallContextForVar(%s) g_classScope=%s\n",name.data(),g_classScope.data())); + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + DBG_CTX((stderr,"setCallContextForVar(%s) yyextra->classScope=%s\n",name.data(),yyextra->classScope.data())); int scopeEnd = name.findRev("::"); if (scopeEnd!=-1) // name with explicit scope @@ -739,7 +2695,7 @@ static MemberDef *setCallContextForVar(const QCString &name) if (md) { //printf("name=%s scope=%s\n",locName.data(),scope.data()); - g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope())); + yyextra->theCallContext.setScope(stripClassName(yyscanner,md->typeString(),md->getOuterScope())); return md; } } @@ -752,7 +2708,7 @@ static MemberDef *setCallContextForVar(const QCString &name) if (md) { //printf("name=%s scope=%s\n",locName.data(),scope.data()); - g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope())); + yyextra->theCallContext.setScope(stripClassName(yyscanner,md->typeString(),md->getOuterScope())); return md; } } @@ -760,21 +2716,21 @@ static MemberDef *setCallContextForVar(const QCString &name) } MemberName *mn; - ClassDef *mcd = g_theVarContext.findVariable(name); + ClassDef *mcd = yyextra->theVarContext.findVariable(name); if (mcd) // local variable { DBG_CTX((stderr,"local variable?\n")); if (mcd!=VariableContext::dummyContext) { DBG_CTX((stderr,"local var '%s' mcd=%s\n",name.data(),mcd->name().data())); - g_theCallContext.setScope(mcd); + yyextra->theCallContext.setScope(mcd); } } else { - DBG_CTX((stderr,"class member? scope=%s\n",g_classScope.data())); + DBG_CTX((stderr,"class member? scope=%s\n",yyextra->classScope.data())); // look for a class member - mcd = getClass(g_classScope); + mcd = getClass(yyextra->classScope); if (mcd) { DBG_CTX((stderr,"Inside class %s\n",mcd->name().data())); @@ -782,10 +2738,10 @@ static MemberDef *setCallContextForVar(const QCString &name) if (md) { DBG_CTX((stderr,"Found member %s\n",md->name().data())); - if (g_scopeStack.top()!=CLASSBLOCK) + if (yyextra->scopeStack.top()!=CLASSBLOCK) { DBG_CTX((stderr,"class member '%s' mcd=%s\n",name.data(),mcd->name().data())); - g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope())); + yyextra->theCallContext.setScope(stripClassName(yyscanner,md->typeString(),md->getOuterScope())); } return md; } @@ -799,9 +2755,9 @@ static MemberDef *setCallContextForVar(const QCString &name) if (mn->count()==1) // global defined only once { MemberDef *md=mn->getFirst(); - if (!md->isStatic() || md->getBodyDef()==g_sourceFileDef) + if (!md->isStatic() || md->getBodyDef()==yyextra->sourceFileDef) { - g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope())); + yyextra->theCallContext.setScope(stripClassName(yyscanner,md->typeString(),md->getOuterScope())); return md; } return 0; @@ -812,19 +2768,19 @@ static MemberDef *setCallContextForVar(const QCString &name) MemberDef *md; for (;(md=it.current());++it) { - //printf("mn=%p md=%p md->getBodyDef()=%p g_sourceFileDef=%p\n", + //printf("mn=%p md=%p md->getBodyDef()=%p yyextra->sourceFileDef=%p\n", // mn,md, - // md->getBodyDef(),g_sourceFileDef); + // md->getBodyDef(),yyextra->sourceFileDef); // in case there are multiple members we could link to, we // only link to members if defined in the same file or // defined as external. - if ((!md->isStatic() || md->getBodyDef()==g_sourceFileDef) && - (g_forceTagReference.isEmpty() || g_forceTagReference==md->getReference()) + if ((!md->isStatic() || md->getBodyDef()==yyextra->sourceFileDef) && + (yyextra->forceTagReference.isEmpty() || yyextra->forceTagReference==md->getReference()) ) { - g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope())); - //printf("returning member %s in source file %s\n",md->name().data(),g_sourceFileDef->name().data()); + yyextra->theCallContext.setScope(stripClassName(yyscanner,md->typeString(),md->getOuterScope())); + //printf("returning member %s in source file %s\n",md->name().data(),yyextra->sourceFileDef->name().data()); return md; } } @@ -834,52 +2790,55 @@ static MemberDef *setCallContextForVar(const QCString &name) return 0; } -static void updateCallContextForSmartPointer() +static void updateCallContextForSmartPointer(yyscan_t yyscanner) { - const Definition *d = g_theCallContext.getScope(); + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + const Definition *d = yyextra->theCallContext.getScope(); //printf("updateCallContextForSmartPointer() cd=%s\n",cd ? d->name().data() : "<none>"); MemberDef *md; if (d && d->definitionType()==Definition::TypeClass && (md=(dynamic_cast<const ClassDef*>(d))->isSmartPointer())) { - const ClassDef *ncd = stripClassName(md->typeString(),md->getOuterScope()); + const ClassDef *ncd = stripClassName(yyscanner,md->typeString(),md->getOuterScope()); if (ncd) { - g_theCallContext.setScope(ncd); + yyextra->theCallContext.setScope(ncd); //printf("Found smart pointer call %s->%s!\n",cd->name().data(),ncd->name().data()); } } } -static bool getLinkInScope(const QCString &c, // scope +static bool getLinkInScope(yyscan_t yyscanner, + const QCString &c, // scope const QCString &m, // member const char *memberText, // exact text CodeOutputInterface &ol, const char *text, - bool varOnly=FALSE + bool varOnly ) { + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; const MemberDef *md = 0; const ClassDef *cd = 0; const FileDef *fd = 0; const NamespaceDef *nd = 0; const GroupDef *gd = 0; DBG_CTX((stderr,"getLinkInScope: trying '%s'::'%s' varOnly=%d\n",c.data(),m.data(),varOnly)); - if (getDefs(c,m,"()",md,cd,fd,nd,gd,FALSE,g_sourceFileDef,FALSE,g_forceTagReference) && + if (getDefs(c,m,"()",md,cd,fd,nd,gd,FALSE,yyextra->sourceFileDef,FALSE,yyextra->forceTagReference) && (!varOnly || md->isVariable())) { if (md->isLinkable()) { //printf("found it %s!\n",md->qualifiedName().data()); - if (g_exampleBlock) + if (yyextra->exampleBlock) { QCString anchor; - anchor.sprintf("a%d",g_anchorCount); - //printf("addExampleFile(%s,%s,%s)\n",anchor.data(),g_exampleName.data(), - // g_exampleFile.data()); - if (const_cast<MemberDef*>(md)->addExample(anchor,g_exampleName,g_exampleFile)) + anchor.sprintf("a%d",yyextra->anchorCount); + //printf("addExampleFile(%s,%s,%s)\n",anchor.data(),yyextra->exampleName.data(), + // yyextra->exampleFile.data()); + if (const_cast<MemberDef*>(md)->addExample(anchor,yyextra->exampleName,yyextra->exampleFile)) { ol.writeCodeAnchor(anchor); - g_anchorCount++; + yyextra->anchorCount++; } } @@ -888,19 +2847,19 @@ static bool getLinkInScope(const QCString &c, // scope if (md->resolveAlias()->getGroupDef()) d = md->resolveAlias()->getGroupDef(); if (d && d->isLinkable()) { - g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope())); - //printf("g_currentDefinition=%p g_currentMemberDef=%p g_insideBody=%d\n", - // g_currentDefinition,g_currentMemberDef,g_insideBody); + yyextra->theCallContext.setScope(stripClassName(yyscanner,md->typeString(),md->getOuterScope())); + //printf("yyextra->currentDefinition=%p yyextra->currentMemberDef=%p yyextra->insideBody=%d\n", + // yyextra->currentDefinition,yyextra->currentMemberDef,yyextra->insideBody); - if (g_currentDefinition && g_currentMemberDef && - md!=g_currentMemberDef && g_insideBody && g_collectXRefs) + if (yyextra->currentDefinition && yyextra->currentMemberDef && + md!=yyextra->currentMemberDef && yyextra->insideBody && yyextra->collectXRefs) { - addDocCrossReference(g_currentMemberDef,const_cast<MemberDef*>(md)); + addDocCrossReference(yyextra->currentMemberDef,const_cast<MemberDef*>(md)); } //printf("d->getReference()='%s' d->getOutputBase()='%s' name='%s' member name='%s'\n",d->getReference().data(),d->getOutputFileBase().data(),d->name().data(),md->name().data()); - writeMultiLineCodeLink(ol,md, text ? text : memberText); - addToSearchIndex(text ? text : memberText); + writeMultiLineCodeLink(yyscanner,ol,md, text ? text : memberText); + addToSearchIndex(yyscanner,text ? text : memberText); return TRUE; } } @@ -908,54 +2867,60 @@ static bool getLinkInScope(const QCString &c, // scope // to the previous member, see bug762760 { DBG_CTX((stderr,"unlinkable member %s\n",md->name().data())); - g_currentMemberDef = 0; + yyextra->currentMemberDef = 0; } } return FALSE; } -static bool getLink(const char *className, +static bool getLink(yyscan_t yyscanner, + const char *className, const char *memberName, CodeOutputInterface &ol, - const char *text=0, - bool varOnly=FALSE) + const char *text, + bool varOnly) { - //printf("getLink(%s,%s) g_curClassName=%s\n",className,memberName,g_curClassName.data()); + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + //printf("getLink(%s,%s) yyextra->curClassName=%s\n",className,memberName,yyextra->curClassName.data()); QCString m=removeRedundantWhiteSpace(memberName); QCString c=className; - if (!getLinkInScope(c,m,memberName,ol,text,varOnly)) + if (!getLinkInScope(yyscanner,c,m,memberName,ol,text,varOnly)) { - if (!g_curClassName.isEmpty()) + if (!yyextra->curClassName.isEmpty()) { if (!c.isEmpty()) c.prepend("::"); - c.prepend(g_curClassName); - return getLinkInScope(c,m,memberName,ol,text,varOnly); + c.prepend(yyextra->curClassName); + return getLinkInScope(yyscanner,c,m,memberName,ol,text,varOnly); } return FALSE; } return TRUE; } -static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName, - bool typeOnly=FALSE,bool varOnly=FALSE) +static void generateClassOrGlobalLink(yyscan_t yyscanner, + CodeOutputInterface &ol, + const char *clName, + bool typeOnly, + bool varOnly) { + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; int i=0; if (*clName=='~') // correct for matching negated values i.s.o. destructors. { - g_code->codify("~"); + yyextra->code->codify("~"); clName++; } QCString className=clName; if (className.isEmpty()) return; - if (g_insideProtocolList) // for Obj-C + if (yyextra->insideProtocolList) // for Obj-C { className+="-p"; } - if (g_insidePHP) + if (yyextra->lang==SrcLangExt_PHP) { className = substitute(className,"\\","::"); // for PHP namespaces } - else if (g_insideCS || g_insideJava) + else if (yyextra->lang==SrcLangExt_CSharp || yyextra->lang==SrcLangExt_Java) { className = substitute(className,".","::"); // for PHP namespaces } @@ -964,13 +2929,13 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName bool isLocal=FALSE; //printf("generateClassOrGlobalLink(className=%s)\n",className.data()); - if (!g_prefixed_with_this_keyword || (lcd=g_theVarContext.findVariable(className))==0) // not a local variable + if (!yyextra->prefixed_with_this_keyword || (lcd=yyextra->theVarContext.findVariable(className))==0) // not a local variable { - Definition *d = g_currentDefinition; - //printf("d=%s g_sourceFileDef=%s\n",d?d->name().data():"<none>",g_sourceFileDef?g_sourceFileDef->name().data():"<none>"); - cd = getResolvedClass(d,g_sourceFileDef,className,&md); + Definition *d = yyextra->currentDefinition; + //printf("d=%s yyextra->sourceFileDef=%s\n",d?d->name().data():"<none>",yyextra->sourceFileDef?yyextra->sourceFileDef->name().data():"<none>"); + cd = getResolvedClass(d,yyextra->sourceFileDef,className,&md); DBG_CTX((stderr,"non-local variable name=%s context=%d cd=%s md=%s!\n", - className.data(),g_theVarContext.count(),cd?cd->name().data():"<none>", + className.data(),yyextra->theVarContext.count(),cd?cd->name().data():"<none>", md?md->name().data():"<none>")); if (cd==0 && md==0 && (i=className.find('<'))!=-1) { @@ -978,15 +2943,15 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName DBG_CTX((stderr,"bareName=%s\n",bareName.data())); if (bareName!=className) { - cd=getResolvedClass(d,g_sourceFileDef,bareName,&md); // try unspecialized version + cd=getResolvedClass(d,yyextra->sourceFileDef,bareName,&md); // try unspecialized version } } const NamespaceDef *nd = getResolvedNamespace(className); if (nd && nd->isLinkable()) { - g_theCallContext.setScope(nd); - addToSearchIndex(className); - writeMultiLineCodeLink(*g_code,nd,clName); + yyextra->theCallContext.setScope(nd); + addToSearchIndex(yyscanner,className); + writeMultiLineCodeLink(yyscanner,*yyextra->code,nd,clName); return; } //printf("md=%s\n",md?md->name().data():"<none>"); @@ -995,7 +2960,7 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName nd?nd->name().data():"<null>")); if (cd==0 && md==0) // also see if it is variable or enum or enum value { - if (getLink(g_classScope,clName,ol,clName,varOnly)) + if (getLink(yyscanner,yyextra->classScope,clName,ol,clName,varOnly)) { return; } @@ -1007,12 +2972,12 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName if (lcd!=VariableContext::dummyContext) { //printf("non-dummy context lcd=%s!\n",lcd->name().data()); - g_theCallContext.setScope(lcd); + yyextra->theCallContext.setScope(lcd); // to following is needed for links to a global variable, but is // no good for a link to a local variable that is also a global symbol. - //if (getLink(g_classScope,clName,ol,clName)) + //if (getLink(yyscanner,yyextra->classScope,clName,ol,clName)) //{ //return; //} @@ -1020,35 +2985,35 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName isLocal=TRUE; DBG_CTX((stderr,"is a local variable cd=%p!\n",cd)); } - g_prefixed_with_this_keyword = FALSE; // discard the "this" prefix for the next calls + yyextra->prefixed_with_this_keyword = FALSE; // discard the "this" prefix for the next calls if (cd && cd->isLinkable()) // is it a linkable class { DBG_CTX((stderr,"is linkable class %s\n",clName)); - if (g_exampleBlock) + if (yyextra->exampleBlock) { QCString anchor; - anchor.sprintf("_a%d",g_anchorCount); - //printf("addExampleClass(%s,%s,%s)\n",anchor.data(),g_exampleName.data(), - // g_exampleFile.data()); - if (const_cast<ClassDef*>(cd)->addExample(anchor,g_exampleName,g_exampleFile)) + anchor.sprintf("_a%d",yyextra->anchorCount); + //printf("addExampleClass(%s,%s,%s)\n",anchor.data(),yyextra->exampleName.data(), + // yyextra->exampleFile.data()); + if (const_cast<ClassDef*>(cd)->addExample(anchor,yyextra->exampleName,yyextra->exampleFile)) { ol.writeCodeAnchor(anchor); - g_anchorCount++; + yyextra->anchorCount++; } } - writeMultiLineCodeLink(ol,cd,clName); - addToSearchIndex(className); - g_theCallContext.setScope(cd); + writeMultiLineCodeLink(yyscanner,ol,cd,clName); + addToSearchIndex(yyscanner,className); + yyextra->theCallContext.setScope(cd); if (md) { const Definition *d = md->getOuterScope()==Doxygen::globalScope ? md->getFileDef() : md->getOuterScope(); if (md->getGroupDef()) d = md->getGroupDef(); if (d && d->isLinkable() && md->isLinkable() && - g_currentMemberDef && g_collectXRefs) + yyextra->currentMemberDef && yyextra->collectXRefs) { - addDocCrossReference(g_currentMemberDef,const_cast<MemberDef*>(md)); + addDocCrossReference(yyextra->currentMemberDef,const_cast<MemberDef*>(md)); } } } @@ -1059,31 +3024,31 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName { if (md==0) // not found as a typedef { - md = setCallContextForVar(clName); - //printf("setCallContextForVar(%s) md=%p g_currentDefinition=%p\n",clName,md,g_currentDefinition); - if (md && g_currentDefinition) + md = setCallContextForVar(yyscanner,clName); + //printf("setCallContextForVar(%s) md=%p yyextra->currentDefinition=%p\n",clName,md,yyextra->currentDefinition); + if (md && yyextra->currentDefinition) { DBG_CTX((stderr,"%s accessible from %s? %d md->getOuterScope=%s\n", - md->name().data(),g_currentDefinition->name().data(), - isAccessibleFrom(g_currentDefinition,g_sourceFileDef,md), + md->name().data(),yyextra->currentDefinition->name().data(), + isAccessibleFrom(yyextra->currentDefinition,yyextra->sourceFileDef,md), md->getOuterScope()->name().data())); } - if (md && g_currentDefinition && - isAccessibleFrom(g_currentDefinition,g_sourceFileDef,md)==-1) + if (md && yyextra->currentDefinition && + isAccessibleFrom(yyextra->currentDefinition,yyextra->sourceFileDef,md)==-1) { md=0; // variable not accessible } } if (md && (!varOnly || md->isVariable())) { - DBG_CTX((stderr,"is a global md=%p g_currentDefinition=%s linkable=%d\n",md,g_currentDefinition?g_currentDefinition->name().data():"<none>",md->isLinkable())); + DBG_CTX((stderr,"is a global md=%p yyextra->currentDefinition=%s linkable=%d\n",md,yyextra->currentDefinition?yyextra->currentDefinition->name().data():"<none>",md->isLinkable())); if (md->isLinkable()) { QCString text; - if (!g_forceTagReference.isEmpty()) // explicit reference to symbol in tag file + if (!yyextra->forceTagReference.isEmpty()) // explicit reference to symbol in tag file { - text=g_forceTagReference; + text=yyextra->forceTagReference; if (text.right(4)==".tag") // strip .tag if present { text=text.left(text.length()-4); @@ -1097,11 +3062,11 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName { text=clName; } - writeMultiLineCodeLink(ol,md,text); - addToSearchIndex(clName); - if (g_currentMemberDef && g_collectXRefs) + writeMultiLineCodeLink(yyscanner,ol,md,text); + addToSearchIndex(yyscanner,clName); + if (yyextra->currentMemberDef && yyextra->collectXRefs) { - addDocCrossReference(g_currentMemberDef,const_cast<MemberDef*>(md)); + addDocCrossReference(yyextra->currentMemberDef,const_cast<MemberDef*>(md)); } return; } @@ -1110,13 +3075,17 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName // nothing found, just write out the word DBG_CTX((stderr,"not found!\n")); - codifyLines(clName); - addToSearchIndex(clName); + codifyLines(yyscanner,clName); + addToSearchIndex(yyscanner,clName); } } -static bool generateClassMemberLink(CodeOutputInterface &ol,MemberDef *xmd,const char *memName) +static bool generateClassMemberLink(yyscan_t yyscanner, + CodeOutputInterface &ol, + MemberDef *xmd, + const char *memName) { + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; // extract class definition of the return type in order to resolve // a->b()->c() like call chains @@ -1124,22 +3093,22 @@ static bool generateClassMemberLink(CodeOutputInterface &ol,MemberDef *xmd,const // xmd->typeString(),xmd->argsString(), // xmd->getClassDef()->name().data()); - if (g_exampleBlock) + if (yyextra->exampleBlock) { QCString anchor; - anchor.sprintf("a%d",g_anchorCount); - //printf("addExampleFile(%s,%s,%s)\n",anchor.data(),g_exampleName.data(), - // g_exampleFile.data()); - if (xmd->addExample(anchor,g_exampleName,g_exampleFile)) + anchor.sprintf("a%d",yyextra->anchorCount); + //printf("addExampleFile(%s,%s,%s)\n",anchor.data(),yyextra->exampleName.data(), + // yyextra->exampleFile.data()); + if (xmd->addExample(anchor,yyextra->exampleName,yyextra->exampleFile)) { ol.writeCodeAnchor(anchor); - g_anchorCount++; + yyextra->anchorCount++; } } - const ClassDef *typeClass = stripClassName(removeAnonymousScopes(xmd->typeString()),xmd->getOuterScope()); + const ClassDef *typeClass = stripClassName(yyscanner,removeAnonymousScopes(xmd->typeString()),xmd->getOuterScope()); DBG_CTX((stderr,"%s -> typeName=%p\n",xmd->typeString(),typeClass)); - g_theCallContext.setScope(typeClass); + yyextra->theCallContext.setScope(typeClass); const Definition *xd = xmd->getOuterScope()==Doxygen::globalScope ? xmd->getFileDef() : xmd->getOuterScope(); @@ -1147,22 +3116,22 @@ static bool generateClassMemberLink(CodeOutputInterface &ol,MemberDef *xmd,const if (xd && xd->isLinkable()) { - //printf("g_currentDefiniton=%p g_currentMemberDef=%p xmd=%p g_insideBody=%d\n",g_currentDefinition,g_currentMemberDef,xmd,g_insideBody); + //printf("yyextra->currentDefinition=%p yyextra->currentMemberDef=%p xmd=%p yyextra->insideBody=%d\n",yyextra->currentDefinition,yyextra->currentMemberDef,xmd,yyextra->insideBody); if (xmd->templateMaster()) xmd = xmd->templateMaster(); if (xmd->isLinkable()) { // add usage reference - if (g_currentDefinition && g_currentMemberDef && - /*xmd!=g_currentMemberDef &&*/ g_insideBody && g_collectXRefs) + if (yyextra->currentDefinition && yyextra->currentMemberDef && + /*xmd!=yyextra->currentMemberDef &&*/ yyextra->insideBody && yyextra->collectXRefs) { - addDocCrossReference(g_currentMemberDef,xmd); + addDocCrossReference(yyextra->currentMemberDef,xmd); } // write the actual link - writeMultiLineCodeLink(ol,xmd,memName); - addToSearchIndex(memName); + writeMultiLineCodeLink(yyscanner,ol,xmd,memName); + addToSearchIndex(yyscanner,memName); return TRUE; } } @@ -1170,8 +3139,12 @@ static bool generateClassMemberLink(CodeOutputInterface &ol,MemberDef *xmd,const return FALSE; } -static bool generateClassMemberLink(CodeOutputInterface &ol,const Definition *def,const char *memName) +static bool generateClassMemberLink(yyscan_t yyscanner, + CodeOutputInterface &ol, + const Definition *def, + const char *memName) { + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; if (def && def->definitionType()==Definition::TypeClass) { const ClassDef *cd = dynamic_cast<const ClassDef*>(def); @@ -1179,16 +3152,16 @@ static bool generateClassMemberLink(CodeOutputInterface &ol,const Definition *de //printf("generateClassMemberLink(class=%s,member=%s)=%p\n",def->name().data(),memName,xmd); if (xmd) { - return generateClassMemberLink(ol,xmd,memName); + return generateClassMemberLink(yyscanner,ol,xmd,memName); } else { Definition *innerDef = cd->findInnerCompound(memName); if (innerDef) { - g_theCallContext.setScope(innerDef); - addToSearchIndex(memName); - writeMultiLineCodeLink(*g_code,innerDef,memName); + yyextra->theCallContext.setScope(innerDef); + addToSearchIndex(yyscanner,memName); + writeMultiLineCodeLink(yyscanner,*yyextra->code,innerDef,memName); return TRUE; } } @@ -1200,31 +3173,34 @@ static bool generateClassMemberLink(CodeOutputInterface &ol,const Definition *de Definition *innerDef = nd->findInnerCompound(memName); if (innerDef) { - g_theCallContext.setScope(innerDef); - addToSearchIndex(memName); - writeMultiLineCodeLink(*g_code,innerDef,memName); + yyextra->theCallContext.setScope(innerDef); + addToSearchIndex(yyscanner,memName); + writeMultiLineCodeLink(yyscanner,*yyextra->code,innerDef,memName); return TRUE; } } return FALSE; } -static void generateMemberLink(CodeOutputInterface &ol,const QCString &varName, - char *memName) +static void generateMemberLink(yyscan_t yyscanner, + CodeOutputInterface &ol, + const QCString &varName, + const char *memName) { + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; //printf("generateMemberLink(object=%s,mem=%s) classScope=%s\n", - // varName.data(),memName,g_classScope.data()); + // varName.data(),memName,yyextra->classScope.data()); if (varName.isEmpty()) return; // look for the variable in the current context - const ClassDef *vcd = g_theVarContext.findVariable(varName); + const ClassDef *vcd = yyextra->theVarContext.findVariable(varName); if (vcd) { if (vcd!=VariableContext::dummyContext) { //printf("Class found!\n"); - if (getLink(vcd->name(),memName,ol)) + if (getLink(yyscanner,vcd->name(),memName,ol)) { //printf("Found result!\n"); return; @@ -1234,7 +3210,7 @@ static void generateMemberLink(CodeOutputInterface &ol,const QCString &varName, BaseClassListIterator bcli(*vcd->baseClasses()); for ( ; bcli.current() ; ++bcli) { - if (getLink(bcli.current()->classDef->name(),memName,ol)) + if (getLink(yyscanner,bcli.current()->classDef->name(),memName,ol)) { //printf("Found result!\n"); return; @@ -1245,10 +3221,10 @@ static void generateMemberLink(CodeOutputInterface &ol,const QCString &varName, } else // variable not in current context, maybe it is in a parent context { - vcd = getResolvedClass(g_currentDefinition,g_sourceFileDef,g_classScope); + vcd = getResolvedClass(yyextra->currentDefinition,yyextra->sourceFileDef,yyextra->classScope); if (vcd && vcd->isLinkable()) { - //printf("Found class %s for variable '%s'\n",g_classScope.data(),varName.data()); + //printf("Found class %s for variable '%s'\n",yyextra->classScope.data(),varName.data()); MemberName *vmn=Doxygen::memberNameSDict->find(varName); if (vmn==0) { @@ -1270,10 +3246,10 @@ static void generateMemberLink(CodeOutputInterface &ol,const QCString &varName, vmd->getClassDef()==jcd) { //printf("Found variable type=%s\n",vmd->typeString()); - const ClassDef *mcd=stripClassName(vmd->typeString(),vmd->getOuterScope()); + const ClassDef *mcd=stripClassName(yyscanner,vmd->typeString(),vmd->getOuterScope()); if (mcd && mcd->isLinkable()) { - if (generateClassMemberLink(ol,mcd,memName)) return; + if (generateClassMemberLink(yyscanner,ol,mcd,memName)) return; } } } @@ -1291,10 +3267,10 @@ static void generateMemberLink(CodeOutputInterface &ol,const QCString &varName, vmd->getClassDef()==vcd) { //printf("Found variable type=%s\n",vmd->typeString()); - const ClassDef *mcd=stripClassName(vmd->typeString(),vmd->getOuterScope()); + const ClassDef *mcd=stripClassName(yyscanner,vmd->typeString(),vmd->getOuterScope()); if (mcd && mcd->isLinkable()) { - if (generateClassMemberLink(ol,mcd,memName)) return; + if (generateClassMemberLink(yyscanner,ol,mcd,memName)) return; } } } @@ -1302,29 +3278,31 @@ static void generateMemberLink(CodeOutputInterface &ol,const QCString &varName, } } // nothing found -> write result as is - codifyLines(memName); - addToSearchIndex(memName); + codifyLines(yyscanner,memName); + addToSearchIndex(yyscanner,memName); return; } -static void generatePHPVariableLink(CodeOutputInterface &ol,const char *varName) +static void generatePHPVariableLink(yyscan_t yyscanner,CodeOutputInterface &ol,const char *varName) { + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; QCString name = varName+7; // strip $this-> name.prepend("$"); - //printf("generatePHPVariableLink(%s) name=%s scope=%s\n",varName,name.data(),g_classScope.data()); - if (!getLink(g_classScope,name,ol,varName)) + //printf("generatePHPVariableLink(%s) name=%s scope=%s\n",varName,name.data(),yyextra->classScope.data()); + if (!getLink(yyscanner,yyextra->classScope,name,ol,varName)) { - codifyLines(varName); + codifyLines(yyscanner,varName); } } -static void generateFunctionLink(CodeOutputInterface &ol,const char *funcName) +static void generateFunctionLink(yyscan_t yyscanner,CodeOutputInterface &ol,const char *funcName) { + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; //CodeClassDef *ccd=0; ClassDef *ccd=0; - QCString locScope=g_classScope; + QCString locScope=yyextra->classScope; QCString locFunc=removeRedundantWhiteSpace(funcName); - if (g_insidePHP && locFunc.startsWith("self::")) locFunc=locFunc.mid(4); + if (yyextra->lang==SrcLangExt_PHP && locFunc.startsWith("self::")) locFunc=locFunc.mid(4); QCString funcScope; QCString funcWithScope=locFunc; QCString funcWithFullScope=locFunc; @@ -1332,15 +3310,15 @@ static void generateFunctionLink(CodeOutputInterface &ol,const char *funcName) DBG_CTX((stdout,"*** locScope=%s locFunc=%s\n",locScope.data(),locFunc.data())); int len=2; int i=locFunc.findRev("::"); - if (g_currentMemberDef && g_currentMemberDef->resolveAlias()->getClassDef() && - funcName==g_currentMemberDef->localName() && - g_currentMemberDef->getDefLine()==g_yyLineNr && - generateClassMemberLink(ol,g_currentMemberDef,funcName) + if (yyextra->currentMemberDef && yyextra->currentMemberDef->resolveAlias()->getClassDef() && + funcName==yyextra->currentMemberDef->localName() && + yyextra->currentMemberDef->getDefLine()==yyextra->yyLineNr && + generateClassMemberLink(yyscanner,ol,yyextra->currentMemberDef,funcName) ) { // special case where funcName is the name of a method that is also // defined on this line. In this case we can directly link to - // g_currentMemberDef, which is not only faster, but + // yyextra->currentMemberDef, which is not only faster, but // in case of overloaded methods, this will make sure that we link to // the correct method, and thereby get the correct reimplemented relations. // See also bug 549022. @@ -1381,49 +3359,50 @@ static void generateFunctionLink(CodeOutputInterface &ol,const char *funcName) funcWithFullScope = locScope+"::"+funcWithScope; } } - if (!fullScope.isEmpty() && (ccd=g_codeClassSDict->find(fullScope))) + if (!fullScope.isEmpty() && (ccd=yyextra->codeClassSDict->find(fullScope))) { - //printf("using classScope %s\n",g_classScope.data()); + //printf("using classScope %s\n",yyextra->classScope.data()); if (ccd->baseClasses()) { BaseClassListIterator bcli(*ccd->baseClasses()); for ( ; bcli.current() ; ++bcli) { - if (getLink(bcli.current()->classDef->name(),locFunc,ol,funcName)) + if (getLink(yyscanner,bcli.current()->classDef->name(),locFunc,ol,funcName)) { goto exit; } } } } - if (!locScope.isEmpty() && fullScope!=locScope && (ccd=g_codeClassSDict->find(locScope))) + if (!locScope.isEmpty() && fullScope!=locScope && (ccd=yyextra->codeClassSDict->find(locScope))) { - //printf("using classScope %s\n",g_classScope.data()); + //printf("using classScope %s\n",yyextra->classScope.data()); if (ccd->baseClasses()) { BaseClassListIterator bcli(*ccd->baseClasses()); for ( ; bcli.current() ; ++bcli) { - if (getLink(bcli.current()->classDef->name(),funcWithScope,ol,funcName)) + if (getLink(yyscanner,bcli.current()->classDef->name(),funcWithScope,ol,funcName)) { goto exit; } } } } - if (!getLink(locScope,funcWithScope,ol,funcName)) + if (!getLink(yyscanner,locScope,funcWithScope,ol,funcName)) { - generateClassOrGlobalLink(ol,funcName); + generateClassOrGlobalLink(yyscanner,ol,funcName); } exit: - g_forceTagReference.resize(0); + yyextra->forceTagReference.resize(0); return; } /*! counts the number of lines in the input */ -static int countLines() +static int countLines(yyscan_t yyscanner) { - const char *p=g_inputString; + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + const char *p=yyextra->inputString; char c; int count=1; while ((c=*p)) @@ -1431,37 +3410,40 @@ static int countLines() p++ ; if (c=='\n') count++; } - if (p>g_inputString && *(p-1)!='\n') + if (p>yyextra->inputString && *(p-1)!='\n') { // last line does not end with a \n, so we add an extra // line and explicitly terminate the line after parsing. count++, - g_needsTermination=TRUE; + yyextra->needsTermination=TRUE; } return count; } -static void endFontClass() +static void endFontClass(yyscan_t yyscanner) { - if (g_currentFontClass) + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + if (yyextra->currentFontClass) { - g_code->endFontClass(); - g_currentFontClass=0; + yyextra->code->endFontClass(); + yyextra->currentFontClass=0; } } -static void startFontClass(const char *s) +static void startFontClass(yyscan_t yyscanner,const char *s) { - endFontClass(); - g_code->startFontClass(s); - g_currentFontClass=s; + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + endFontClass(yyscanner); + yyextra->code->startFontClass(s); + yyextra->currentFontClass=s; } //---------------------------------------------------------------------------- // recursively writes a linkified Objective-C method call -static void writeObjCMethodCall(ObjCCallCtx *ctx) +static void writeObjCMethodCall(yyscan_t yyscanner,ObjCCallCtx *ctx) { if (ctx==0) return; + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; char c; const char *p = ctx->format.data(); if (!ctx->methodName.isEmpty()) @@ -1472,22 +3454,22 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx) { //printf("Looking for object=%s method=%s\n",ctx->objectTypeOrName.data(), // ctx->methodName.data()); - ClassDef *cd = g_theVarContext.findVariable(ctx->objectTypeOrName); + ClassDef *cd = yyextra->theVarContext.findVariable(ctx->objectTypeOrName); if (cd==0) // not a local variable { if (ctx->objectTypeOrName=="self") { - if (g_currentDefinition && - g_currentDefinition->definitionType()==Definition::TypeClass) + if (yyextra->currentDefinition && + yyextra->currentDefinition->definitionType()==Definition::TypeClass) { - ctx->objectType = dynamic_cast<ClassDef *>(g_currentDefinition); + ctx->objectType = dynamic_cast<ClassDef *>(yyextra->currentDefinition); } } else { ctx->objectType = getResolvedClass( - g_currentDefinition, - g_sourceFileDef, + yyextra->currentDefinition, + yyextra->sourceFileDef, ctx->objectTypeOrName, &ctx->method); } @@ -1500,15 +3482,15 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx) else if (ctx->method==0) // search for class variable with the same name { //printf(" no\n"); - //printf("g_currentDefinition=%p\n",g_currentDefinition); - if (g_currentDefinition && - g_currentDefinition->definitionType()==Definition::TypeClass) + //printf("yyextra->currentDefinition=%p\n",yyextra->currentDefinition); + if (yyextra->currentDefinition && + yyextra->currentDefinition->definitionType()==Definition::TypeClass) { - ctx->objectVar = (dynamic_cast<ClassDef *>(g_currentDefinition))->getMemberByName(ctx->objectTypeOrName); + ctx->objectVar = (dynamic_cast<ClassDef *>(yyextra->currentDefinition))->getMemberByName(ctx->objectTypeOrName); //printf(" ctx->objectVar=%p\n",ctx->objectVar); if (ctx->objectVar) { - ctx->objectType = stripClassName(ctx->objectVar->typeString()); + ctx->objectType = stripClassName(yyscanner,ctx->objectVar->typeString(),yyextra->currentDefinition); //printf(" ctx->objectType=%p\n",ctx->objectType); if (ctx->objectType && !ctx->methodName.isEmpty()) { @@ -1539,7 +3521,7 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx) char nc=*p++; if (nc=='$') // escaped $ { - g_code->codify("$"); + yyextra->code->codify("$"); } else // name fragment or reference to a nested call { @@ -1550,20 +3532,20 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx) while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; } p--; int refId=refIdStr.toInt(); - QCString *pName = g_nameDict.find(refId); + QCString *pName = yyextra->nameDict.find(refId); if (pName) { if (ctx->method && ctx->method->isLinkable()) { - writeMultiLineCodeLink(*g_code,ctx->method,pName->data()); - if (g_currentMemberDef && g_collectXRefs) + writeMultiLineCodeLink(yyscanner,*yyextra->code,ctx->method,pName->data()); + if (yyextra->currentMemberDef && yyextra->collectXRefs) { - addDocCrossReference(g_currentMemberDef,const_cast<MemberDef*>(ctx->method)); + addDocCrossReference(yyextra->currentMemberDef,const_cast<MemberDef*>(ctx->method)); } } else { - codifyLines(pName->data()); + codifyLines(yyscanner,pName->data()); } } else @@ -1578,15 +3560,15 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx) while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; } p--; int refId=refIdStr.toInt(); - QCString *pObject = g_objectDict.find(refId); + QCString *pObject = yyextra->objectDict.find(refId); if (pObject) { if (*pObject=="self") { - if (g_currentDefinition && - g_currentDefinition->definitionType()==Definition::TypeClass) + if (yyextra->currentDefinition && + yyextra->currentDefinition->definitionType()==Definition::TypeClass) { - ctx->objectType = dynamic_cast<ClassDef *>(g_currentDefinition); + ctx->objectType = dynamic_cast<ClassDef *>(yyextra->currentDefinition); if (ctx->objectType->categoryOf()) { ctx->objectType = ctx->objectType->categoryOf(); @@ -1596,16 +3578,16 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx) ctx->method = ctx->objectType->getMemberByName(ctx->methodName); } } - startFontClass("keyword"); - codifyLines(pObject->data()); - endFontClass(); + startFontClass(yyscanner,"keyword"); + codifyLines(yyscanner,pObject->data()); + endFontClass(yyscanner); } else if (*pObject=="super") { - if (g_currentDefinition && - g_currentDefinition->definitionType()==Definition::TypeClass) + if (yyextra->currentDefinition && + yyextra->currentDefinition->definitionType()==Definition::TypeClass) { - ClassDef *cd = dynamic_cast<ClassDef *>(g_currentDefinition); + ClassDef *cd = dynamic_cast<ClassDef *>(yyextra->currentDefinition); if (cd->categoryOf()) { cd = cd->categoryOf(); @@ -1628,16 +3610,16 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx) } } } - startFontClass("keyword"); - codifyLines(pObject->data()); - endFontClass(); + startFontClass(yyscanner,"keyword"); + codifyLines(yyscanner,pObject->data()); + endFontClass(yyscanner); } else if (ctx->objectVar && ctx->objectVar->isLinkable()) // object is class variable { - writeMultiLineCodeLink(*g_code,ctx->objectVar,pObject->data()); - if (g_currentMemberDef && g_collectXRefs) + writeMultiLineCodeLink(yyscanner,*yyextra->code,ctx->objectVar,pObject->data()); + if (yyextra->currentMemberDef && yyextra->collectXRefs) { - addDocCrossReference(g_currentMemberDef,const_cast<MemberDef*>(ctx->objectVar)); + addDocCrossReference(yyextra->currentMemberDef,const_cast<MemberDef*>(ctx->objectVar)); } } else if (ctx->objectType && @@ -1646,20 +3628,20 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx) ) // object is class name { const ClassDef *cd = ctx->objectType; - writeMultiLineCodeLink(*g_code,cd,pObject->data()); + writeMultiLineCodeLink(yyscanner,*yyextra->code,cd,pObject->data()); } else // object still needs to be resolved { - const ClassDef *cd = getResolvedClass(g_currentDefinition, - g_sourceFileDef, *pObject); + const ClassDef *cd = getResolvedClass(yyextra->currentDefinition, + yyextra->sourceFileDef, *pObject); if (cd && cd->isLinkable()) { if (ctx->objectType==0) ctx->objectType=cd; - writeMultiLineCodeLink(*g_code,cd,pObject->data()); + writeMultiLineCodeLink(yyscanner,*yyextra->code,cd,pObject->data()); } else { - codifyLines(pObject->data()); + codifyLines(yyscanner,pObject->data()); } } } @@ -1675,10 +3657,10 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx) while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; } p--; int refId=refIdStr.toInt(); - ObjCCallCtx *ictx = g_contextDict.find(refId); + ObjCCallCtx *ictx = yyextra->contextDict.find(refId); if (ictx) // recurse into nested call { - writeObjCMethodCall(ictx); + writeObjCMethodCall(yyscanner,ictx); if (ictx->method) // link to nested call successfully { // get the ClassDef representing the method's return type @@ -1697,7 +3679,7 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx) } else { - ctx->objectType = stripClassName(ictx->method->typeString()); + ctx->objectType = stripClassName(yyscanner,ictx->method->typeString(),yyextra->currentDefinition); if (ctx->objectType && !ctx->methodName.isEmpty()) { ctx->method = ctx->objectType->getMemberByName(ctx->methodName); @@ -1718,10 +3700,10 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx) while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; } p--; int refId=refIdStr.toInt(); - QCString *pWord = g_wordDict.find(refId); + QCString *pWord = yyextra->wordDict.find(refId); if (pWord) { - codifyLines(pWord->data()); + codifyLines(yyscanner,pWord->data()); } } else if (nc=='d') // comment block @@ -1731,12 +3713,12 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx) while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; } p--; int refId=refIdStr.toInt(); - QCString *pComment = g_commentDict.find(refId); + QCString *pComment = yyextra->commentDict.find(refId); if (pComment) { - startFontClass("comment"); - codifyLines(pComment->data()); - endFontClass(); + startFontClass(yyscanner,"comment"); + codifyLines(yyscanner,pComment->data()); + endFontClass(yyscanner); } } else // illegal marker @@ -1749,7 +3731,7 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx) { char s[2]; s[0]=c;s[1]=0; - codifyLines(s); + codifyLines(yyscanner,s); } } //printf("%s %s]\n",ctx->objectTypeOrName.data(),ctx->methodName.data()); @@ -1760,46 +3742,51 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx) // Replaces an Objective-C method name fragment s by a marker of the form // $n12, the number (12) can later be used as a key for obtaining the name -// fragment, from g_nameDict -static QCString escapeName(const char *s) +// fragment, from yyextra->nameDict +static QCString escapeName(yyscan_t yyscanner,const char *s) { + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; QCString result; - result.sprintf("$n%d",g_currentNameId); - g_nameDict.insert(g_currentNameId,new QCString(s)); - g_currentNameId++; + result.sprintf("$n%d",yyextra->currentNameId); + yyextra->nameDict.insert(yyextra->currentNameId,new QCString(s)); + yyextra->currentNameId++; return result; } -static QCString escapeObject(const char *s) +static QCString escapeObject(yyscan_t yyscanner,const char *s) { + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; QCString result; - result.sprintf("$o%d",g_currentObjId); - g_objectDict.insert(g_currentObjId,new QCString(s)); - g_currentObjId++; + result.sprintf("$o%d",yyextra->currentObjId); + yyextra->objectDict.insert(yyextra->currentObjId,new QCString(s)); + yyextra->currentObjId++; return result; } -static QCString escapeWord(const char *s) +static QCString escapeWord(yyscan_t yyscanner,const char *s) { + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; QCString result; - result.sprintf("$w%d",g_currentWordId); - g_wordDict.insert(g_currentWordId,new QCString(s)); - g_currentWordId++; + result.sprintf("$w%d",yyextra->currentWordId); + yyextra->wordDict.insert(yyextra->currentWordId,new QCString(s)); + yyextra->currentWordId++; return result; } -static QCString escapeComment(const char *s) +static QCString escapeComment(yyscan_t yyscanner,const char *s) { + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; QCString result; - result.sprintf("$d%d",g_currentCommentId); - g_commentDict.insert(g_currentCommentId,new QCString(s)); - g_currentCommentId++; + result.sprintf("$d%d",yyextra->currentCommentId); + yyextra->commentDict.insert(yyextra->currentCommentId,new QCString(s)); + yyextra->currentCommentId++; return result; } -static bool skipLanguageSpecificKeyword(const QCString &kw) +static bool skipLanguageSpecificKeyword(yyscan_t yyscanner,const QCString &kw) { - return g_insideCpp && (kw == "remove" || kw == "set" || kw == "get"); + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + return yyextra->lang==SrcLangExt_Cpp && (kw == "remove" || kw == "set" || kw == "get"); } static bool isCastKeyword(const QCString &s) @@ -1810,1971 +3797,117 @@ static bool isCastKeyword(const QCString &s) return kw=="const_cast" || kw=="static_cast" || kw=="dynamic_cast" || kw=="reinterpret_cast"; } -/* ----------------------------------------------------------------- - */ -#undef YY_INPUT -#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); - -static int yyread(char *buf,int max_size) +static int yyread(yyscan_t yyscanner,char *buf,int max_size) { - int c=0; - while( c < max_size && g_inputString[g_inputPosition] ) - { - *buf = g_inputString[g_inputPosition++] ; - c++; buf++; - } - return c; + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + int inputPosition = yyextra->inputPosition; + const char *s = yyextra->inputString + yyextra->inputPosition; + int c=0; + while( c < max_size && *s ) + { + *buf++ = *s++; + c++; + } + yyextra->inputPosition += c; + return c; } -%} - -B [ \t] -BN [ \t\n\r] -ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]* -SEP ("::"|"\\") -SCOPENAME ({SEP}{BN}*)?({ID}{BN}*{SEP}{BN}*)*("~"{BN}*)?{ID} -TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">" -SCOPETNAME (((({ID}{TEMPLIST}?){BN}*)?{SEP}{BN}*)*)((~{BN}*)?{ID}) -SCOPEPREFIX ({ID}{TEMPLIST}?{BN}*{SEP}{BN}*)+ -KEYWORD_OBJC ("@public"|"@private"|"@protected"|"@class"|"@implementation"|"@interface"|"@end"|"@selector"|"@protocol"|"@optional"|"@required"|"@throw"|"@synthesize"|"@property") -KEYWORD ("asm"|"__assume"|"auto"|"class"|"const"|"delete"|"enum"|"explicit"|"extern"|"false"|"friend"|"gcnew"|"gcroot"|"set"|"get"|"inline"|"internal"|"mutable"|"namespace"|"new"|"null"|"nullptr"|"override"|"operator"|"pin_ptr"|"private"|"protected"|"public"|"raise"|"register"|"remove"|"self"|"sizeof"|"static"|"struct"|"__super"|"function"|"template"|"generic"|"this"|"true"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile"|"abstract"|"final"|"import"|"synchronized"|"transient"|"alignas"|"alignof"|{KEYWORD_OBJC}) -FLOWKW ("break"|"catch"|"continue"|"default"|"do"|"else"|"finally"|"return"|"switch"|"throw"|"throws"|"@catch"|"@finally") -FLOWCONDITION ("case"|"for"|"foreach"|"for each"|"goto"|"if"|"try"|"while"|"@try") -TYPEKW ("bool"|"byte"|"char"|"double"|"float"|"int"|"long"|"object"|"short"|"signed"|"unsigned"|"void"|"wchar_t"|"size_t"|"boolean"|"id"|"SEL"|"string"|"nullptr") -TYPEKWSL ("LocalObject"|"Object"|"Value") -CASTKW ("const_cast"|"dynamic_cast"|"reinterpret_cast"|"static_cast") -CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'")) -ARITHOP "+"|"-"|"/"|"*"|"%"|"--"|"++" -ASSIGNOP "="|"*="|"/="|"%="|"+="|"-="|"<<="|">>="|"&="|"^="|"|=" -LOGICOP "=="|"!="|">"|"<"|">="|"<="|"&&"|"||"|"!" -BITOP "&"|"|"|"^"|"<<"|">>"|"~" -OPERATOR {ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP} -RAWBEGIN (u|U|L|u8)?R\"[^ \t\(\)\\]{0,16}"(" -RAWEND ")"[^ \t\(\)\\]{0,16}\" - -%option noyywrap - -%x SkipString -%x SkipStringS -%x SkipVerbString -%x SkipCPP -%x SkipComment -%x SkipCxxComment -%x RemoveSpecialCComment -%x StripSpecialCComment -%x Body -%x FuncCall -%x MemberCall -%x MemberCall2 -%x SkipInits -%x ClassName -%x AlignAs -%x AlignAsEnd -%x PackageName -%x ClassVar -%x CppCliTypeModifierFollowup -%x Bases -%x SkipSharp -%x ReadInclude -%x TemplDecl -%x TemplCast -%x CallEnd -%x ObjCMethod -%x ObjCParams -%x ObjCParamType -%x ObjCCall -%x ObjCMName -%x ObjCSkipStr -%x ObjCCallComment -%x OldStyleArgs -%x UsingName -%x RawString -%x InlineInit - -%% - -<*>\x0d -<Body>^([ \t]*"#"[ \t]*("include"|"import")[ \t]*)("<"|"\"") { - startFontClass("preprocessor"); - g_code->codify(yytext); - BEGIN( ReadInclude ); - } -<Body>("@interface"|"@implementation"|"@protocol")[ \t\n]+ { - g_insideObjC=TRUE; - startFontClass("keyword"); - codifyLines(yytext); - endFontClass(); - if (!g_insideTemplate) - BEGIN( ClassName ); - } -<Body>(("public"|"private"){B}+)?("ref"|"value"|"interface"|"enum"){B}+("class"|"struct") { - if (g_insideTemplate) REJECT; - startFontClass("keyword"); - codifyLines(yytext); - endFontClass(); - BEGIN( ClassName ); - } -<Body>"property"|"event"/{BN}* { - if (g_insideTemplate) REJECT; - startFontClass("keyword"); - codifyLines(yytext); - endFontClass(); - } -<Body>(KEYWORD_CPPCLI_DATATYPE|("partial"{B}+)?"class"|"struct"|"union"|"namespace"|"interface"){B}+ { - startFontClass("keyword"); - codifyLines(yytext); - endFontClass(); - if (!g_insideTemplate) - BEGIN( ClassName ); - } -<Body>("package")[ \t\n]+ { - startFontClass("keyword"); - codifyLines(yytext); - endFontClass(); - BEGIN( PackageName ); - } -<ClassVar>\n { - if (!g_insideObjC) REJECT; - codifyLines(yytext); - BEGIN(Body); - } -<Body,ClassVar,Bases>"-"|"+" { - if (!g_insideObjC || g_insideBody) - { - g_code->codify(yytext); - } - else // Start of Objective-C method - { - //printf("Method!\n"); - g_code->codify(yytext); - BEGIN(ObjCMethod); - } - } -<ObjCMethod>":" { - g_code->codify(yytext); - BEGIN(ObjCParams); - } -<ObjCParams>"(" { - g_code->codify(yytext); - BEGIN(ObjCParamType); - } -<ObjCParams,ObjCMethod>";"|"{" { - g_code->codify(yytext); - if (*yytext=='{') - { - if (g_searchingForBody) - { - g_searchingForBody=FALSE; - g_insideBody=TRUE; - } - if (g_insideBody) g_bodyCurlyCount++; - if (!g_curClassName.isEmpty()) // valid class name - { - pushScope(g_curClassName); - DBG_CTX((stderr,"** scope stack push SCOPEBLOCK\n")); - g_scopeStack.push(SCOPEBLOCK); - } - } - g_type.resize(0); - g_name.resize(0); - BEGIN(Body); - } -<ObjCParams>{ID}{B}*":" { - g_code->codify(yytext); - } -<ObjCParamType>{TYPEKW} { - startFontClass("keywordtype"); - g_code->codify(yytext); - endFontClass(); - g_parmType=yytext; - } -<ObjCParamType>{ID} { - generateClassOrGlobalLink(*g_code,yytext); - g_parmType=yytext; - } -<ObjCParamType>")" { - g_code->codify(yytext); - BEGIN(ObjCParams); - } -<ObjCParams>{ID} { - g_code->codify(yytext); - g_parmName=yytext; - g_theVarContext.addVariable(g_parmType,g_parmName); - g_parmType.resize(0);g_parmName.resize(0); - } -<ObjCMethod,ObjCParams,ObjCParamType>{ID} { - generateClassOrGlobalLink(*g_code,yytext); - } -<ObjCMethod,ObjCParams,ObjCParamType>. { - g_code->codify(yytext); - } -<ObjCMethod,ObjCParams,ObjCParamType>\n { - codifyLines(yytext); - } -<ReadInclude>[^\n\"\>]+/(">"|"\"") { - //FileInfo *f; - bool ambig; - bool found=FALSE; - //QCString absPath = yytext; - //if (g_sourceFileDef && QDir::isRelativePath(absPath)) - //{ - // absPath = QDir::cleanDirPath(g_sourceFileDef->getPath()+"/"+absPath); - //} - FileDef *fd=findFileDef(Doxygen::inputNameDict,yytext,ambig); - //printf("looking for include %s -> %s fd=%p\n",yytext,absPath.data(),fd); - if (fd && fd->isLinkable()) - { - if (ambig) // multiple input files match the name - { - //printf("===== yes %s is ambiguous\n",yytext); - QCString name = QDir::cleanDirPath(yytext).utf8(); - if (!name.isEmpty() && g_sourceFileDef) - { - FileName *fn = Doxygen::inputNameDict->find(name); - if (fn) - { - FileNameIterator fni(*fn); - // for each include name - for (fni.toFirst();!found && (fd=fni.current());++fni) - { - // see if this source file actually includes the file - found = g_sourceFileDef->isIncluded(fd->absFilePath()); - //printf(" include file %s found=%d\n",fd->absFilePath().data(),found); - } - } - } - } - else // not ambiguous - { - found = TRUE; - } - } - //printf(" include file %s found=%d\n",fd ? fd->absFilePath().data() : "<none>",found); - if (found) - { - writeMultiLineCodeLink(*g_code,fd,yytext); - } - else - { - g_code->codify(yytext); - } - char c=yyinput(); - QCString text; - text+=c; - g_code->codify(text); - endFontClass(); - BEGIN( Body ); - } -<Body,Bases>^[ \t]*"#" { - startFontClass("preprocessor"); - g_lastSkipCppContext = YY_START; - g_code->codify(yytext); - BEGIN( SkipCPP ) ; - } -<SkipCPP>. { - g_code->codify(yytext); - } -<SkipCPP>[^\n\/\\]+ { - g_code->codify(yytext); - } -<SkipCPP>\\[\r]?\n { - codifyLines(yytext); - } -<SkipCPP>"//" { - g_code->codify(yytext); - } -<Body,FuncCall>"{" { - g_theVarContext.pushScope(); - - DBG_CTX((stderr,"** scope stack push INNERBLOCK\n")); - g_scopeStack.push(INNERBLOCK); - - if (g_searchingForBody) - { - g_searchingForBody=FALSE; - g_insideBody=TRUE; - } - g_code->codify(yytext); - if (g_insideBody) - { - g_bodyCurlyCount++; - } - g_type.resize(0); - g_name.resize(0); - BEGIN( Body ); - } -<Body,FuncCall,MemberCall,MemberCall2>"}" { - g_theVarContext.popScope(); - g_type.resize(0); - g_name.resize(0); - - int *scope = g_scopeStack.pop(); - DBG_CTX((stderr,"** scope stack pop SCOPEBLOCK=%d\n",scope==SCOPEBLOCK)); - if (scope==SCOPEBLOCK || scope==CLASSBLOCK) - { - popScope(); - } - - g_code->codify(yytext); - - DBG_CTX((stderr,"g_bodyCurlyCount=%d\n",g_bodyCurlyCount)); - if (--g_bodyCurlyCount<=0) - { - g_insideBody=FALSE; - g_currentMemberDef=0; - if (g_currentDefinition) - g_currentDefinition=g_currentDefinition->getOuterScope(); - } - BEGIN(Body); - } -<Body,ClassVar>"@end" { - //printf("End of objc scope fd=%s\n",g_sourceFileDef->name().data()); - if (g_sourceFileDef) - { - FileDef *fd=g_sourceFileDef; - g_insideObjC = fd->name().lower().right(2)==".m" || - fd->name().lower().right(3)==".mm"; - //printf("insideObjC=%d\n",g_insideObjC); - } - else - { - g_insideObjC = FALSE; - } - if (g_insideBody) - { - g_theVarContext.popScope(); - - int *scope = g_scopeStack.pop(); - DBG_CTX((stderr,"** scope stack pop SCOPEBLOCK=%d\n",scope==SCOPEBLOCK)); - if (scope==SCOPEBLOCK || scope==CLASSBLOCK) - { - popScope(); - } - g_insideBody=FALSE; - } - - startFontClass("keyword"); - g_code->codify(yytext); - endFontClass(); - - g_currentMemberDef=0; - if (g_currentDefinition) - g_currentDefinition=g_currentDefinition->getOuterScope(); - BEGIN(Body); - } -<ClassName,ClassVar>";" { - g_code->codify(yytext); - g_searchingForBody=FALSE; - BEGIN( Body ); - } -<ClassName,ClassVar>[*&^%]+ { - g_type=g_curClassName.copy(); - g_name.resize(0); - g_code->codify(yytext); - BEGIN( Body ); // variable of type struct * - } -<ClassName>"__declspec"{B}*"("{B}*{ID}{B}*")" { - startFontClass("keyword"); - g_code->codify(yytext); - endFontClass(); - } -<ClassName>{ID}("."{ID})* | -<ClassName>{ID}("::"{ID})* { - if(g_insideCS) - g_curClassName=substitute(yytext,".","::"); - else - g_curClassName=yytext; - addType(); - if (g_curClassName=="alignas") - { - startFontClass("keyword"); - g_code->codify(yytext); - endFontClass(); - BEGIN( AlignAs ); - } - else - { - generateClassOrGlobalLink(*g_code,yytext); - BEGIN( ClassVar ); - } - } -<AlignAs>"(" { - g_bracketCount=1; - g_code->codify(yytext); - BEGIN( AlignAsEnd ); - } -<AlignAs>\n { g_yyLineNr++; - codifyLines(yytext); - } -<AlignAs>. { g_code->codify(yytext); } -<AlignAsEnd>"(" { g_code->codify(yytext); - g_bracketCount++; - } -<AlignAsEnd>")" { - g_code->codify(yytext); - if (--g_bracketCount<=0) - { - BEGIN(ClassName); - } - } -<AlignAsEnd>\n { g_yyLineNr++; - codifyLines(yytext); - } -<AlignAsEnd>. { g_code->codify(yytext); } -<ClassName>{ID}("\\"{ID})* { // PHP namespace - g_curClassName=substitute(yytext,"\\","::"); - g_scopeStack.push(CLASSBLOCK); - pushScope(g_curClassName); - addType(); - generateClassOrGlobalLink(*g_code,yytext); - BEGIN( ClassVar ); - } -<ClassName>{ID}{B}*"("{ID}")" { // Obj-C category - g_curClassName=removeRedundantWhiteSpace(yytext); - g_scopeStack.push(CLASSBLOCK); - pushScope(g_curClassName); - addType(); - generateClassOrGlobalLink(*g_code,yytext); - BEGIN( ClassVar ); - } -<PackageName>{ID}("."{ID})* { - g_curClassName=substitute(yytext,".","::"); - //printf("found package: %s\n",g_curClassName.data()); - addType(); - codifyLines(yytext); - } -<ClassVar>"=" { - unput(*yytext); - BEGIN( Body ); - } -<ClassVar>("extends"|"implements") { // Java, Slice - startFontClass("keyword"); - codifyLines(yytext); - endFontClass(); - g_curClassBases.clear(); - BEGIN( Bases ); - } -<ClassVar>("sealed"|"abstract")/{BN}*(":"|"{") { - DBG_CTX((stderr,"***** C++/CLI modifier %s on g_curClassName=%s\n",yytext,g_curClassName.data())); - startFontClass("keyword"); - codifyLines(yytext); - endFontClass(); - BEGIN( CppCliTypeModifierFollowup ); - } -<ClassVar>{ID} { - g_type = g_curClassName.copy(); - g_name = yytext; - if (g_insideBody) - { - g_theVarContext.addVariable(g_type,g_name); - } - generateClassOrGlobalLink(*g_code,yytext); - } -<ClassName,ClassVar,CppCliTypeModifierFollowup>{B}*":"{B}* { - codifyLines(yytext); - g_curClassBases.clear(); - BEGIN( Bases ); - } -<PackageName>[ \t]*";" | -<Bases>^{B}*/"@"{ID} | // Objective-C interface -<Bases,ClassName,ClassVar,CppCliTypeModifierFollowup>{B}*"{"{B}* { - g_theVarContext.pushScope(); - g_code->codify(yytext); - if (YY_START==ClassVar && g_curClassName.isEmpty()) - { - g_curClassName = g_name.copy(); - } - if (g_searchingForBody) - { - g_searchingForBody=FALSE; - g_insideBody=TRUE; - } - if (g_insideBody) g_bodyCurlyCount++; - if (!g_curClassName.isEmpty()) // valid class name - { - DBG_CTX((stderr,"** scope stack push CLASSBLOCK\n")); - g_scopeStack.push(CLASSBLOCK); - pushScope(g_curClassName); - DBG_CTX((stderr,"***** g_curClassName=%s\n",g_curClassName.data())); - if (getResolvedClass(g_currentDefinition,g_sourceFileDef,g_curClassName)==0) - { - DBG_CTX((stderr,"Adding new class %s\n",g_curClassName.data())); - ClassDef *ncd=createClassDef("<code>",1,1, - g_curClassName,ClassDef::Class,0,0,FALSE); - g_codeClassSDict->append(g_curClassName,ncd); - // insert base classes. - char *s=g_curClassBases.first(); - while (s) - { - const ClassDef *bcd=g_codeClassSDict->find(s); - if (bcd==0) bcd=getResolvedClass(g_currentDefinition,g_sourceFileDef,s); - if (bcd && bcd!=ncd) - { - ncd->insertBaseClass(const_cast<ClassDef*>(bcd),s,Public,Normal); - } - s=g_curClassBases.next(); - } - } - //printf("g_codeClassList.count()=%d\n",g_codeClassList.count()); - } - else // not a class name -> assume inner block - { - DBG_CTX((stderr,"** scope stack push INNERBLOCK\n")); - g_scopeStack.push(INNERBLOCK); - } - g_curClassName.resize(0); - g_curClassBases.clear(); - BEGIN( Body ); - } -<Bases>"virtual"|"public"|"protected"|"private"|"@public"|"@private"|"@protected" { - startFontClass("keyword"); - g_code->codify(yytext); - endFontClass(); - } -<Bases>{SEP}?({ID}{SEP})*{ID} { - DBG_CTX((stderr,"%s:addBase(%s)\n",g_curClassName.data(),yytext)); - g_curClassBases.inSort(yytext); - generateClassOrGlobalLink(*g_code,yytext); - } -<Bases>"<" { - g_code->codify(yytext); - if (!g_insideObjC) - { - g_sharpCount=1; - BEGIN ( SkipSharp ); - } - else - { - g_insideProtocolList=TRUE; - } - } -<Bases>">" { - g_code->codify(yytext); - g_insideProtocolList=FALSE; - } -<SkipSharp>"<" { - g_code->codify(yytext); - ++g_sharpCount; - } -<SkipSharp>">" { - g_code->codify(yytext); - if (--g_sharpCount<=0) - BEGIN ( Bases ); - } -<SkipSharp>"\"" { - g_code->codify(yytext); - g_lastStringContext=YY_START; - BEGIN(SkipString); - } -<SkipSharp>"\'" { - g_code->codify(yytext); - g_lastStringContext=YY_START; - BEGIN(SkipStringS); - } -<Bases>"(" { - g_code->codify(yytext); - g_sharpCount=1; - BEGIN ( SkipSharp ); - } -<SkipSharp>"(" { - g_code->codify(yytext); - ++g_sharpCount; - } -<SkipSharp>")" { - g_code->codify(yytext); - if (--g_sharpCount<=0) - BEGIN ( Bases ); - } - - -<Bases>"," { - g_code->codify(yytext); - } - - -<Body>{SCOPEPREFIX}?"operator"{B}*"()"{B}*/"(" { - addType(); - generateFunctionLink(*g_code,yytext); - g_bracketCount=0; - g_args.resize(0); - g_name+=yytext; - BEGIN( FuncCall ); - } -<Body>{SCOPEPREFIX}?"operator"/"(" { - addType(); - generateFunctionLink(*g_code,yytext); - g_bracketCount=0; - g_args.resize(0); - g_name+=yytext; - BEGIN( FuncCall ); - } -<Body>{SCOPEPREFIX}?"operator"[^a-z_A-Z0-9\(\n]+/"(" { - addType(); - generateFunctionLink(*g_code,yytext); - g_bracketCount=0; - g_args.resize(0); - g_name+=yytext; - BEGIN( FuncCall ); - } -<Body,TemplDecl>("template"|"generic")/([^a-zA-Z0-9]) { - startFontClass("keyword"); - codifyLines(yytext); - endFontClass(); - g_insideTemplate=TRUE; - g_sharpCount=0; - } -<Body>"using"{BN}+"namespace"{BN}+ { - startFontClass("keyword"); - codifyLines(yytext); - endFontClass(); - BEGIN(UsingName); - } -<UsingName>{ID}("::"{ID})* { addUsingDirective(yytext); - generateClassOrGlobalLink(*g_code,yytext); - DBG_CTX((stderr,"** scope stack push CLASSBLOCK\n")); - g_scopeStack.push(CLASSBLOCK); - pushScope(yytext); - BEGIN(Body); - } -<UsingName>\n { codifyLines(yytext); BEGIN(Body); } -<UsingName>. { codifyLines(yytext); BEGIN(Body); } -<Body,FuncCall>"$"?"this"("->"|".") { g_code->codify(yytext); // this-> for C++, this. for C# - g_prefixed_with_this_keyword = TRUE; - } -<Body>{KEYWORD}/([^a-z_A-Z0-9]) { - if (g_insideJava && qstrcmp("internal",yytext) ==0) REJECT; - if (skipLanguageSpecificKeyword(yytext)) REJECT; - startFontClass("keyword"); - codifyLines(yytext); - if (QCString(yytext)=="typedef") - { - addType(); - g_name+=yytext; - } - endFontClass(); - } -<Body>{KEYWORD}/{B}* { - if (skipLanguageSpecificKeyword(yytext)) REJECT; - startFontClass("keyword"); - codifyLines(yytext); - endFontClass(); - } -<Body>{KEYWORD}/{BN}*"(" { - if (skipLanguageSpecificKeyword(yytext)) REJECT; - startFontClass("keyword"); - codifyLines(yytext); - endFontClass(); - g_name.resize(0);g_type.resize(0); - } -<FuncCall>"in"/{BN}* { - if (!g_inForEachExpression) REJECT; - startFontClass("keywordflow"); - codifyLines(yytext); - endFontClass(); - // insert the variable in the parent scope, see bug 546158 - g_theVarContext.popScope(); - g_theVarContext.addVariable(g_parmType,g_parmName); - g_theVarContext.pushScope(); - g_name.resize(0);g_type.resize(0); - } -<Body>{FLOWKW}/{BN}*"(" { - startFontClass("keywordflow"); - codifyLines(yytext); - endFontClass(); - g_name.resize(0);g_type.resize(0); - g_inForEachExpression = (qstrcmp(yytext,"for each")==0 || qstrcmp(yytext, "foreach")==0); - BEGIN(FuncCall); - } -<Body>{FLOWCONDITION}/{BN}*"(" { - if (g_currentMemberDef && g_currentMemberDef->isFunction()) - { - g_currentMemberDef->incrementFlowKeyWordCount(); - } - startFontClass("keywordflow"); - codifyLines(yytext); - endFontClass(); - g_name.resize(0);g_type.resize(0); - g_inForEachExpression = (strcmp(yytext,"for each")==0 || strcmp(yytext, "foreach")==0); - BEGIN(FuncCall); - } -<Body>{FLOWKW}/([^a-z_A-Z0-9]) { - startFontClass("keywordflow"); - codifyLines(yytext); - endFontClass(); - if (g_inFunctionTryBlock && (qstrcmp(yytext,"catch")==0 || qstrcmp(yytext,"finally")==0)) - { - g_inFunctionTryBlock=FALSE; - } - } -<Body>{FLOWCONDITION}/([^a-z_A-Z0-9]) { - if (g_currentMemberDef && g_currentMemberDef->isFunction()) - { - g_currentMemberDef->incrementFlowKeyWordCount(); - } - startFontClass("keywordflow"); - codifyLines(yytext); - endFontClass(); - if (g_inFunctionTryBlock && (strcmp(yytext,"catch")==0 || strcmp(yytext,"finally")==0)) - { - g_inFunctionTryBlock=FALSE; - } - } -<Body>{FLOWKW}/{B}* { - startFontClass("keywordflow"); - codifyLines(yytext); - endFontClass(); - } -<Body>{FLOWCONDITION}/{B}* { - if (g_currentMemberDef && g_currentMemberDef->isFunction()) - { - g_currentMemberDef->incrementFlowKeyWordCount(); - } - startFontClass("keywordflow"); - codifyLines(yytext); - endFontClass(); - } -<Body>"*"{B}*")" { // end of cast? - g_code->codify(yytext); - g_theCallContext.popScope(g_name, g_type); - g_bracketCount--; - g_parmType = g_name; - BEGIN(FuncCall); - } -<Body>[\\|\)\+\-\/\%\~\!] { - g_code->codify(yytext); - g_name.resize(0);g_type.resize(0); - if (*yytext==')') - { - g_theCallContext.popScope(g_name, g_type); - g_bracketCount--; - BEGIN(FuncCall); - } - } -<Body,TemplDecl,ObjCMethod>{TYPEKW}/{B}* { - startFontClass("keywordtype"); - g_code->codify(yytext); - endFontClass(); - addType(); - g_name+=yytext; - } -<Body,TemplDecl,ObjCMethod>{TYPEKWSL}/{B}* { - if (!g_insideSlice) - { - REJECT; - } - else - { - startFontClass("keywordtype"); - g_code->codify(yytext); - endFontClass(); - addType(); - g_name+=yytext; - } - } -<Body>"generic"/{B}*"<"[^\n\/\-\.\{\"\>]*">"{B}* { - startFontClass("keyword"); - g_code->codify(yytext); - endFontClass(); - g_sharpCount=0; - BEGIN(TemplDecl); - } -<Body>"template"/{B}*"<"[^\n\/\-\.\{\"\>]*">"{B}* { // template<...> - startFontClass("keyword"); - g_code->codify(yytext); - endFontClass(); - g_sharpCount=0; - BEGIN(TemplDecl); - } -<TemplDecl>"class"|"typename" { - startFontClass("keyword"); - codifyLines(yytext); - endFontClass(); - } -<TemplDecl>"<" { - g_code->codify(yytext); - g_sharpCount++; - } -<TemplDecl>">" { - g_code->codify(yytext); - g_sharpCount--; - if (g_sharpCount<=0) - { - BEGIN(Body); - } - } -<TemplCast>">" { - startFontClass("keyword"); - codifyLines(yytext); - endFontClass(); - BEGIN( g_lastTemplCastContext ); - } -<TemplCast>{ID}("::"{ID})* { - generateClassOrGlobalLink(*g_code,yytext); - } -<TemplCast>("const"|"volatile"){B}* { - startFontClass("keyword"); - codifyLines(yytext); - endFontClass(); - } -<TemplCast>[*^]* { - codifyLines(yytext); - } -<Body,MemberCall2,FuncCall>{CASTKW}{B}*"<" { // static_cast<T>( - startFontClass("keyword"); - codifyLines(yytext); - endFontClass(); - g_lastTemplCastContext = YY_START; - BEGIN(TemplCast); - } -<Body>"$this->"{SCOPENAME}/{BN}*[;,)\]] { // PHP member variable - addType(); - generatePHPVariableLink(*g_code,yytext); - g_name+=yytext+7; - } -<Body,TemplCast>{SCOPENAME}{B}*"<"[^\n\/\-\.\{\"\>\(]*">"("::"{ID})*/{B}* { // A<T> *pt; - if (isCastKeyword(yytext) && YY_START==Body) - { - REJECT; - } - addType(); - generateClassOrGlobalLink(*g_code,yytext); - g_name+=yytext; - } -<Body>{SCOPENAME}/{BN}*[:;,)\]] { // "int var;" or "var, var2" or "debug(f) macro" , or int var : 5; - addType(); - // changed this to generateFunctionLink, see bug 624514 - //generateClassOrGlobalLink(*g_code,yytext,FALSE,TRUE); - generateFunctionLink(*g_code,yytext); - g_name+=yytext; - } -<Body>{SCOPENAME}/{B}* { // p->func() - addType(); - generateClassOrGlobalLink(*g_code,yytext); - g_name+=yytext; - } -<Body>"("{B}*("*"{B}*)+{SCOPENAME}*{B}*")"/{B}* { // (*p)->func() but not "if (p) ..." - g_code->codify(yytext); - int s=0;while (s<(int)yyleng && !isId(yytext[s])) s++; - int e=(int)yyleng-1;while (e>=0 && !isId(yytext[e])) e--; - QCString varname = ((QCString)yytext).mid(s,e-s+1); - addType(); - g_name=varname; - } -<Body>{SCOPETNAME}{B}*"<"[^\n\/\-\.\{\"\>]*">"/{BN}*"(" | -<Body>{SCOPETNAME}/{BN}*"(" { // a() or c::a() or t<A,B>::a() or A\B\foo() - if (isCastKeyword(yytext)) - { - REJECT; - } - addType(); - generateFunctionLink(*g_code,yytext); - g_bracketCount=0; - g_args.resize(0); - g_name+=yytext; - BEGIN( FuncCall ); - } -<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>{RAWBEGIN} { - QCString text=yytext; - int i=text.find('R'); - g_code->codify(text.left(i+1)); - startFontClass("stringliteral"); - g_code->codify(yytext+i+1); - g_lastStringContext=YY_START; - g_inForEachExpression = FALSE; - g_delimiter = yytext+i+2; - g_delimiter=g_delimiter.left(g_delimiter.length()-1); - BEGIN( RawString ); - } -<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>\" { - startFontClass("stringliteral"); - g_code->codify(yytext); - g_lastStringContext=YY_START; - g_inForEachExpression = FALSE; - BEGIN( SkipString ); - } -<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>\' { - startFontClass("stringliteral"); - g_code->codify(yytext); - g_lastStringContext=YY_START; - g_inForEachExpression = FALSE; - BEGIN( SkipStringS ); - } -<SkipString>[^\"\\\r\n]* { - g_code->codify(yytext); - } -<SkipStringS>[^\'\\\r\n]* { - g_code->codify(yytext); - } -<SkipString,SkipStringS>"//"|"/*" { - g_code->codify(yytext); - } -<SkipString>@?\" { - g_code->codify(yytext); - endFontClass(); - BEGIN( g_lastStringContext ); - } -<SkipStringS>\' { - g_code->codify(yytext); - endFontClass(); - BEGIN( g_lastStringContext ); - } -<SkipString,SkipStringS>\\. { - g_code->codify(yytext); - } -<RawString>{RAWEND} { - g_code->codify(yytext); - QCString delimiter = yytext+1; - delimiter=delimiter.left(delimiter.length()-1); - if (delimiter==g_delimiter) - { - BEGIN( g_lastStringContext ); - } - } -<RawString>[^)\n]+ { g_code->codify(yytext); } -<RawString>. { g_code->codify(yytext); } -<RawString>\n { codifyLines(yytext); } -<SkipVerbString>[^"\n]+ { - g_code->codify(yytext); - } -<SkipVerbString>\"\" { // escaped quote - g_code->codify(yytext); - } -<SkipVerbString>\" { // end of string - g_code->codify(yytext); - endFontClass(); - BEGIN( g_lastVerbStringContext ); - } -<SkipVerbString>. { - g_code->codify(yytext); - } -<SkipVerbString>\n { - codifyLines(yytext); - } -<Body>":" { - g_code->codify(yytext); - g_name.resize(0);g_type.resize(0); - } -<Body>"<" { - if (g_insideTemplate) - { - g_sharpCount++; - } - g_code->codify(yytext); - } -<Body>">" { - if (g_insideTemplate) - { - if (--g_sharpCount<=0) - { - g_insideTemplate=FALSE; - } - } - g_code->codify(yytext); - } -<Body,MemberCall,MemberCall2,FuncCall>"'"((\\0[Xx0-9]+)|(\\.)|(.))"'" { - startFontClass("charliteral"); - g_code->codify(yytext); - endFontClass(); - } -<Body>"."|"->" { - if (yytext[0]=='-') // -> could be overloaded - { - updateCallContextForSmartPointer(); - } - g_code->codify(yytext); - g_memCallContext = YY_START; - BEGIN( MemberCall ); - } -<MemberCall>{SCOPETNAME}/{BN}*"(" { - if (g_theCallContext.getScope()) - { - if (!generateClassMemberLink(*g_code,g_theCallContext.getScope(),yytext)) - { - g_code->codify(yytext); - addToSearchIndex(yytext); - } - g_name.resize(0); - } - else - { - g_code->codify(yytext); - addToSearchIndex(yytext); - g_name.resize(0); - } - g_type.resize(0); - if (g_memCallContext==Body) - { - BEGIN(FuncCall); - } - else - { - BEGIN(g_memCallContext); - } - } -<MemberCall>{SCOPENAME}/{B}* { - if (g_theCallContext.getScope()) - { - DBG_CTX((stderr,"g_theCallContext.getClass()=%p\n",g_theCallContext.getScope())); - if (!generateClassMemberLink(*g_code,g_theCallContext.getScope(),yytext)) - { - g_code->codify(yytext); - addToSearchIndex(yytext); - } - g_name.resize(0); - } - else - { - DBG_CTX((stderr,"no class context!\n")); - g_code->codify(yytext); - addToSearchIndex(yytext); - g_name.resize(0); - } - g_type.resize(0); - BEGIN(g_memCallContext); - } -<Body>[,=;\[] { - if (g_insideObjC && *yytext=='[') - { - //printf("Found start of ObjC call!\n"); - // start of a method call - g_contextDict.setAutoDelete(TRUE); - g_nameDict.setAutoDelete(TRUE); - g_objectDict.setAutoDelete(TRUE); - g_wordDict.setAutoDelete(TRUE); - g_commentDict.setAutoDelete(TRUE); - g_contextDict.clear(); - g_nameDict.clear(); - g_objectDict.clear(); - g_wordDict.clear(); - g_commentDict.clear(); - g_currentCtxId = 0; - g_currentNameId = 0; - g_currentObjId = 0; - g_currentCtx = 0; - g_braceCount = 0; - unput('['); - BEGIN(ObjCCall); - } - else - { - g_code->codify(yytext); - g_saveName = g_name.copy(); - g_saveType = g_type.copy(); - if (*yytext!='[' && !g_type.isEmpty()) - { - //printf("g_scopeStack.bottom()=%p\n",g_scopeStack.bottom()); - //if (g_scopeStack.top()!=CLASSBLOCK) // commented out for bug731363 - { - //printf("AddVariable: '%s' '%s' context=%d\n", - // g_type.data(),g_name.data(),g_theVarContext.count()); - g_theVarContext.addVariable(g_type,g_name); - } - g_name.resize(0); - } - if (*yytext==';' || *yytext=='=') - { - g_type.resize(0); - g_name.resize(0); - } - else if (*yytext=='[') - { - g_theCallContext.pushScope(g_name, g_type); - } - g_args.resize(0); - g_parmType.resize(0); - g_parmName.resize(0); - } - } - /* -<ObjCMemberCall>{ID} { - if (qstrcmp(yytext,"self")==0 || qstrcmp(yytext,"super")==0) - { - // TODO: get proper base class for "super" - g_theCallContext.setClass(getClass(g_curClassName)); - startFontClass("keyword"); - g_code->codify(yytext); - endFontClass(); - } - else - { - generateClassOrGlobalLink(*g_code,yytext); - } - g_name.resize(0); - BEGIN(ObjCMemberCall2); - } -<ObjCMemberCall>"[" { - g_code->codify(yytext); - g_theCallContext.pushScope(g_name, g_type); - } -<ObjCMemberCall2>{ID}":"? { - g_name+=yytext; - if (g_theCallContext.getClass()) - { - //printf("Calling method %s\n",g_name.data()); - if (!generateClassMemberLink(*g_code,g_theCallContext.getClass(),g_name)) - { - g_code->codify(yytext); - addToSearchIndex(g_name); - } - } - else - { - g_code->codify(yytext); - addToSearchIndex(g_name); - } - g_name.resize(0); - BEGIN(ObjCMemberCall3); - } -<ObjCMemberCall2,ObjCMemberCall3>"]" { - g_theCallContext.popScope(g_name, g_type); - g_code->codify(yytext); - BEGIN(Body); - } - */ -<ObjCCall,ObjCMName>"["|"{" { - saveObjCContext(); - g_currentCtx->format+=*yytext; - BEGIN(ObjCCall); - //printf("open\n"); - } -<ObjCCall,ObjCMName>"]"|"}" { - g_currentCtx->format+=*yytext; - restoreObjCContext(); - BEGIN(ObjCMName); - if (g_currentCtx==0) - { - // end of call - writeObjCMethodCall(g_contextDict.find(0)); - BEGIN(Body); - } - //printf("close\n"); - } -<ObjCCall,ObjCMName>"//".* { - g_currentCtx->format+=escapeComment(yytext); - } -<ObjCCall,ObjCMName>"/*" { - g_lastObjCCallContext = YY_START; - g_currentCtx->comment=yytext; - BEGIN(ObjCCallComment); - } -<ObjCCallComment>"*/" { - g_currentCtx->comment+=yytext; - g_currentCtx->format+=escapeComment(g_currentCtx->comment); - BEGIN(g_lastObjCCallContext); - } -<ObjCCallComment>[^*\n]+ { g_currentCtx->comment+=yytext; } -<ObjCCallComment>"//"|"/*" { g_currentCtx->comment+=yytext; } -<ObjCCallComment>\n { g_currentCtx->comment+=*yytext; } -<ObjCCallComment>. { g_currentCtx->comment+=*yytext; } -<ObjCCall>{ID} { - g_currentCtx->format+=escapeObject(yytext); - if (g_braceCount==0) - { - g_currentCtx->objectTypeOrName=yytext; - //printf("new type=%s\n",g_currentCtx->objectTypeOrName.data()); - BEGIN(ObjCMName); - } - } -<ObjCMName>{ID}/{BN}*"]" { - if (g_braceCount==0 && - g_currentCtx->methodName.isEmpty()) - { - g_currentCtx->methodName=yytext; - g_currentCtx->format+=escapeName(yytext); - } - else - { - g_currentCtx->format+=escapeWord(yytext); - } - } -<ObjCMName>{ID}/{BN}*":" { - if (g_braceCount==0) - { - g_currentCtx->methodName+=yytext; - g_currentCtx->methodName+=":"; - } - g_currentCtx->format+=escapeName(yytext); - } -<ObjCSkipStr>[^\n\"$\\]* { g_currentCtx->format+=yytext; } -<ObjCSkipStr>\\. { g_currentCtx->format+=yytext; } -<ObjCSkipStr>"\"" { g_currentCtx->format+=yytext; - BEGIN(g_lastStringContext); - } -<ObjCCall,ObjCMName>{CHARLIT} { g_currentCtx->format+=yytext; } -<ObjCCall,ObjCMName>"@"?"\"" { g_currentCtx->format+=yytext; - g_lastStringContext=YY_START; - BEGIN(ObjCSkipStr); - } -<ObjCCall,ObjCMName,ObjCSkipStr>"$" { g_currentCtx->format+="$$"; } -<ObjCCall,ObjCMName>"(" { g_currentCtx->format+=*yytext; g_braceCount++; } -<ObjCCall,ObjCMName>")" { g_currentCtx->format+=*yytext; g_braceCount--; } -<ObjCSkipStr>"@"/"\"" { // needed to prevent matching the global rule (for C#) - g_currentCtx->format+=yytext; - } -<ObjCCall,ObjCMName,ObjCSkipStr>{ID} { g_currentCtx->format+=escapeWord(yytext); } -<ObjCCall,ObjCMName,ObjCSkipStr>. { g_currentCtx->format+=*yytext; } -<ObjCCall,ObjCMName,ObjCSkipStr>\n { g_currentCtx->format+=*yytext; } - -<Body>"]" { - g_theCallContext.popScope(g_name, g_type); - g_code->codify(yytext); - // TODO: nested arrays like: a[b[0]->func()]->func() - g_name = g_saveName.copy(); - g_type = g_saveType.copy(); - } -<Body>[0-9]+ { - g_code->codify(yytext); - } -<Body>[0-9]+[xX][0-9A-Fa-f]+ { - g_code->codify(yytext); - } -<MemberCall2,FuncCall>{KEYWORD}/([^a-z_A-Z0-9]) { - //addParmType(); - //g_parmName=yytext; - if (skipLanguageSpecificKeyword(yytext)) REJECT; - startFontClass("keyword"); - g_code->codify(yytext); - endFontClass(); - } -<MemberCall2,FuncCall,OldStyleArgs,TemplCast>{TYPEKW}/([^a-z_A-Z0-9]) { - addParmType(); - g_parmName=yytext; - startFontClass("keywordtype"); - g_code->codify(yytext); - endFontClass(); - } -<MemberCall2,FuncCall,OldStyleArgs,TemplCast>{TYPEKWSL}/([^a-z_A-Z0-9]) { - if (!g_insideSlice) - { - REJECT; - } - else - { - addParmType(); - g_parmName=yytext; - startFontClass("keywordtype"); - g_code->codify(yytext); - endFontClass(); - } - } -<MemberCall2,FuncCall>{FLOWKW}/([^a-z_A-Z0-9]) { - addParmType(); - g_parmName=yytext; - startFontClass("keywordflow"); - g_code->codify(yytext); - endFontClass(); - } -<MemberCall2,FuncCall>{FLOWCONDITION}/([^a-z_A-Z0-9]) { - if (g_currentMemberDef && g_currentMemberDef->isFunction()) - { - g_currentMemberDef->incrementFlowKeyWordCount(); - } - addParmType(); - g_parmName=yytext; - startFontClass("keywordflow"); - g_code->codify(yytext); - endFontClass(); - } -<MemberCall2,FuncCall>{ID}(({B}*"<"[^\n\[\](){}<>]*">")?({B}*"::"{B}*{ID})?)* { - if (isCastKeyword(yytext)) - { - REJECT; - } - addParmType(); - g_parmName=yytext; - generateClassOrGlobalLink(*g_code,yytext,!g_insideBody); - } -<FuncCall>";" { // probably a cast, not a function call - g_code->codify(yytext); - g_inForEachExpression = FALSE; - BEGIN( Body ); - } -<MemberCall2,FuncCall>, { - g_code->codify(yytext); - g_theVarContext.addVariable(g_parmType,g_parmName); - g_parmType.resize(0);g_parmName.resize(0); - } -<MemberCall2,FuncCall>"{" { - if (g_bracketCount>0) - { - g_code->codify(yytext); - g_skipInlineInitContext=YY_START; - g_curlyCount=0; - BEGIN(InlineInit); - } - else - { - REJECT; - } - } -<InlineInit>"{" { g_curlyCount++; - g_code->codify(yytext); - } -<InlineInit>"}" { - g_code->codify(yytext); - if (--g_curlyCount<=0) - { - BEGIN(g_skipInlineInitContext); - } - } -<InlineInit>\n { - codifyLines(yytext); - } -<InlineInit>. { - g_code->codify(yytext); - } -<MemberCall2,FuncCall>"(" { - g_parmType.resize(0);g_parmName.resize(0); - g_code->codify(yytext); - g_bracketCount++; - g_theCallContext.pushScope(g_name, g_type); - if (YY_START==FuncCall && !g_insideBody) - { - g_theVarContext.pushScope(); - } - } -<MemberCall2,FuncCall>{OPERATOR} { // operator - if (qstrcmp(yytext,"*") && - qstrcmp(yytext,"&") && - qstrcmp(yytext,"^") && - qstrcmp(yytext,"%")) // typically a pointer or reference - { - // not a * or &, or C++/CLI's ^ or % - g_parmType.resize(0);g_parmName.resize(0); - } - g_code->codify(yytext); - } -<MemberCall,MemberCall2,FuncCall>("*"{B}*)?")" { - if (yytext[0]==')') // no a pointer cast - { - //printf("addVariable(%s,%s)\n",g_parmType.data(),g_parmName.data()); - if (g_parmType.isEmpty()) - { - g_parmType=g_parmName; - g_parmName.resize(0); - } - g_theVarContext.addVariable(g_parmType,g_parmName); - } - else - { - g_parmType = g_parmName; - g_parmName.resize(0); - g_theVarContext.addVariable(g_parmType,g_parmName); - } - g_theCallContext.popScope(g_name, g_type); - g_inForEachExpression = FALSE; - //g_theCallContext.setClass(0); // commented out, otherwise a()->b() does not work for b(). - g_code->codify(yytext); - if (--g_bracketCount<=0) - { - if (g_name.isEmpty()) - { - BEGIN( Body ); - } - else - { - BEGIN( CallEnd ); - } - } - } -<CallEnd>[ \t\n]* { codifyLines(yytext); } - /* -<MemberCall2,FuncCall>")"[ \t\n]*[;:] { - */ -<CallEnd>[;:] { - codifyLines(yytext); - g_bracketCount=0; - if (*yytext==';') g_searchingForBody=FALSE; - if (!g_type.isEmpty()) - { - DBG_CTX((stderr,"add variable g_type=%s g_name=%s)\n",g_type.data(),g_name.data())); - g_theVarContext.addVariable(g_type,g_name); - } - g_parmType.resize(0);g_parmName.resize(0); - g_theCallContext.setScope(0); - if (*yytext==';' || g_insideBody) - { - if (!g_insideBody) - { - g_theVarContext.popScope(); - } - g_name.resize(0);g_type.resize(0); - BEGIN( Body ); - } - else - { - g_bracketCount=0; - BEGIN( SkipInits ); - } - } -<CallEnd>("const"|"volatile"|"sealed"|"override")({BN}+("const"|"volatile"|"sealed"|"override"))*/{BN}*(";"|"="|"throw"{BN}*"(") { - startFontClass("keyword"); - codifyLines(yytext); - endFontClass(); - } -<CallEnd,OldStyleArgs>("const"|"volatile"|"sealed"|"override")*({BN}+("const"|"volatile"|"sealed"|"override"))*{BN}*"{" { - if (g_insideBody) - { - g_theVarContext.pushScope(); - } - g_theVarContext.addVariable(g_parmType,g_parmName); - //g_theCallContext.popScope(g_name, g_type); - g_parmType.resize(0);g_parmName.resize(0); - int index = g_name.findRev("::"); - DBG_CTX((stderr,"g_name=%s\n",g_name.data())); - if (index!=-1) - { - QCString scope = g_name.left(index); - if (!g_classScope.isEmpty()) scope.prepend(g_classScope+"::"); - const ClassDef *cd=getResolvedClass(Doxygen::globalScope,g_sourceFileDef,scope); - if (cd) - { - setClassScope(cd->name()); - g_scopeStack.push(SCOPEBLOCK); - DBG_CTX((stderr,"** scope stack push SCOPEBLOCK\n")); - } - else - { - //setClassScope(g_realScope); - g_scopeStack.push(INNERBLOCK); - DBG_CTX((stderr,"** scope stack push INNERBLOCK\n")); - } - } - else - { - DBG_CTX((stderr,"** scope stack push INNERBLOCK\n")); - g_scopeStack.push(INNERBLOCK); - } - yytext[yyleng-1]='\0'; - QCString cv(yytext); - if (!cv.stripWhiteSpace().isEmpty()) - { - startFontClass("keyword"); - codifyLines(yytext); - endFontClass(); - } - else // just whitespace - { - codifyLines(yytext); - } - g_code->codify("{"); - if (g_searchingForBody) - { - g_searchingForBody=FALSE; - g_insideBody=TRUE; - } - if (g_insideBody) g_bodyCurlyCount++; - g_type.resize(0); g_name.resize(0); - BEGIN( Body ); - } -<CallEnd>"try" { // function-try-block - startFontClass("keyword"); - g_code->codify(yytext); - endFontClass(); - g_inFunctionTryBlock=TRUE; - } -<CallEnd>{ID} { - if (g_insideBody || !g_parmType.isEmpty()) - { - REJECT; - } - // could be K&R style definition - addParmType(); - g_parmName=yytext; - generateClassOrGlobalLink(*g_code,yytext,!g_insideBody); - BEGIN(OldStyleArgs); - } -<OldStyleArgs>{ID} { - addParmType(); - g_parmName=yytext; - generateClassOrGlobalLink(*g_code,yytext,!g_insideBody); - } -<OldStyleArgs>[,;] { - g_code->codify(yytext); - g_theVarContext.addVariable(g_parmType,g_parmName); - if (*yytext==';') g_parmType.resize(0); - g_parmName.resize(0); - } -<CallEnd,OldStyleArgs>"#" { - startFontClass("preprocessor"); - g_lastSkipCppContext = Body; - g_code->codify(yytext); - BEGIN( SkipCPP ); - } -<CallEnd>. { - unput(*yytext); - if (!g_insideBody) - { - g_theVarContext.popScope(); - } - g_name.resize(0);g_args.resize(0); - g_parmType.resize(0);g_parmName.resize(0); - BEGIN( Body ); - } -<SkipInits>";" { - g_code->codify(yytext); - g_type.resize(0); g_name.resize(0); - BEGIN( Body ); - } -<SkipInits>"{" { - g_code->codify(yytext); - if (g_searchingForBody) - { - g_searchingForBody=FALSE; - g_insideBody=TRUE; - } - if (g_insideBody) g_bodyCurlyCount++; - if (g_name.find("::")!=-1) - { - DBG_CTX((stderr,"** scope stack push SCOPEBLOCK\n")); - g_scopeStack.push(SCOPEBLOCK); - setClassScope(g_realScope); - } - else - { - DBG_CTX((stderr,"** scope stack push INNERBLOCK\n")); - g_scopeStack.push(INNERBLOCK); - } - g_type.resize(0); g_name.resize(0); - BEGIN( Body ); - } -<SkipInits>{ID} { - generateClassOrGlobalLink(*g_code,yytext); - } -<FuncCall>{ID}/"(" { - generateFunctionLink(*g_code,yytext); - } -<FuncCall>{ID}/("."|"->") { - g_name=yytext; - generateClassOrGlobalLink(*g_code,yytext); - BEGIN( MemberCall2 ); - } -<FuncCall,MemberCall2>("("{B}*("*"{B}*)+{ID}*{B}*")"{B}*)/("."|"->") { - g_code->codify(yytext); - int s=0;while (!isId(yytext[s])) s++; - int e=(int)yyleng-1;while (!isId(yytext[e])) e--; - g_name=((QCString)yytext).mid(s,e-s+1); - BEGIN( MemberCall2 ); - } -<MemberCall2>{ID}/([ \t\n]*"(") { - if (!g_args.isEmpty()) - generateMemberLink(*g_code,g_args,yytext); - else - generateClassOrGlobalLink(*g_code,yytext); - g_args.resize(0); - BEGIN( FuncCall ); - } -<MemberCall2>{ID}/([ \t\n]*("."|"->")) { - //g_code->codify(yytext); - g_name=yytext; - generateClassOrGlobalLink(*g_code,yytext); - BEGIN( MemberCall2 ); - } -<MemberCall2>"->"|"." { - if (yytext[0]=='-') // -> could be overloaded - { - updateCallContextForSmartPointer(); - } - g_code->codify(yytext); - g_memCallContext = YY_START; - BEGIN( MemberCall ); - } -<SkipComment>"/*"("!"?)"*/" { - g_code->codify(yytext); - endFontClass(); - BEGIN( g_lastCContext ) ; - } -<SkipComment>"//"|"/*" { - g_code->codify(yytext); - } -<SkipComment>[^*/\n]+ { - g_code->codify(yytext); - } -<SkipComment>[ \t]*"*/" { - g_code->codify(yytext); - endFontClass(); - if (g_lastCContext==SkipCPP) - { - startFontClass("preprocessor"); - } - BEGIN( g_lastCContext ) ; - } -<SkipCxxComment>[^\r\n]*"\\"[\r]?\n { // line continuation - codifyLines(yytext); - } -<SkipCxxComment>[^\r\n]+ { - g_code->codify(yytext); - } -<SkipCxxComment>\r -<SkipCxxComment>\n { - unput('\n'); - endFontClass(); - BEGIN( g_lastCContext ) ; - } -<SkipCxxComment>. { - g_code->codify(yytext); - } -<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*({B}*(("//@"[{}])|("/*@"[{}]"*/")){B}*\n)?{B}*"/*"[*!]/[^/*] { - g_yyLineNr+=QCString(yytext).contains('\n'); - } -<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*({B}*(("//@"[{}])|("/*@"[{}]"*/")){B}*\n)? { - g_yyLineNr+=QCString(yytext).contains('\n'); - nextCodeLine(); - if (g_lastSpecialCContext==SkipCxxComment) - { // force end of C++ comment here - endFontClass(); - BEGIN( g_lastCContext ) ; - } - else - { - BEGIN(g_lastSpecialCContext); - } - } -<RemoveSpecialCComment>"*/" { - BEGIN(g_lastSpecialCContext); - } -<RemoveSpecialCComment>[^*\n]+ -<RemoveSpecialCComment>"//"|"/*" -<RemoveSpecialCComment>\n { g_yyLineNr++; } -<RemoveSpecialCComment>. -<MemberCall>[^a-z_A-Z0-9(\n] { - g_code->codify(yytext); - g_type.resize(0); - g_name.resize(0); - BEGIN(g_memCallContext); - } -<*>\n({B}*"//"[!/][^\n]*\n)+ { // remove special one-line comment - if (YY_START==SkipCPP) REJECT; - if (Config_getBool(STRIP_CODE_COMMENTS)) - { - g_yyLineNr+=((QCString)yytext).contains('\n'); - nextCodeLine(); - } - else - { - startFontClass("comment"); - codifyLines(yytext); - endFontClass(); - } - if (YY_START==SkipCxxComment) - { - endFontClass(); - BEGIN( g_lastCContext ) ; - } - } -<SkipCPP>\n/.*\n { - endFontClass(); - codifyLines(yytext); - BEGIN( g_lastSkipCppContext ) ; - } -<*>\n{B}*"//@"[{}].*\n { // remove one-line group marker - if (Config_getBool(STRIP_CODE_COMMENTS)) - { - g_yyLineNr+=2; - nextCodeLine(); - } - else - { - startFontClass("comment"); - codifyLines(yytext); - endFontClass(); - } - if (YY_START==SkipCxxComment) - { - endFontClass(); - BEGIN( g_lastCContext ) ; - } - } -<*>\n{B}*"/*@"[{}] { // remove one-line group marker - if (Config_getBool(STRIP_CODE_COMMENTS)) - { - if (YY_START != RemoveSpecialCComment) g_lastSpecialCContext = YY_START; - g_yyLineNr++; - BEGIN(RemoveSpecialCComment); - } - else - { - // check is to prevent getting stuck in skipping C++ comments - if (YY_START != SkipComment && YY_START != SkipCxxComment) - { - g_lastCContext = YY_START ; - } - startFontClass("comment"); - codifyLines(yytext); - BEGIN(SkipComment); - } - } -<*>^{B}*"//@"[{}].*\n { // remove one-line group marker - if (Config_getBool(STRIP_CODE_COMMENTS)) - { - g_yyLineNr++; - nextCodeLine(); - } - else - { - startFontClass("comment"); - codifyLines(yytext); - endFontClass(); - } - } -<*>^{B}*"/*@"[{}] { // remove multi-line group marker - if (Config_getBool(STRIP_CODE_COMMENTS)) - { - if (YY_START != RemoveSpecialCComment) g_lastSpecialCContext = YY_START; - BEGIN(RemoveSpecialCComment); - } - else - { - // check is to prevent getting stuck in skipping C++ comments - if (YY_START != SkipComment && YY_START != SkipCxxComment) - { - g_lastCContext = YY_START ; - } - startFontClass("comment"); - g_code->codify(yytext); - BEGIN(SkipComment); - } - } -<*>^{B}*"//"[!/][^\n]*\n { // remove special one-line comment - if (Config_getBool(STRIP_CODE_COMMENTS)) - { - g_yyLineNr++; - //nextCodeLine(); - } - else - { - startFontClass("comment"); - codifyLines(yytext); - endFontClass(); - } - } -<*>"//"[!/][^\n]*\n { // strip special one-line comment - if (YY_START==SkipComment || YY_START==SkipString) REJECT; - if (Config_getBool(STRIP_CODE_COMMENTS)) - { - char c[2]; c[0]='\n'; c[1]=0; - codifyLines(c); - } - else - { - startFontClass("comment"); - codifyLines(yytext); - endFontClass(); - } - } -<*>"/*[tag:"[^\]\n]*"]*/"{B}* { // special pattern /*[tag:filename]*/ to force linking to a tag file - g_forceTagReference=yytext; - int s=g_forceTagReference.find(':'); - int e=g_forceTagReference.findRev(']'); - g_forceTagReference = g_forceTagReference.mid(s+1,e-s-1); - } -<*>\n{B}*"/*"[!*]/[^/*] { - if (Config_getBool(STRIP_CODE_COMMENTS)) - { - if (YY_START != RemoveSpecialCComment) g_lastSpecialCContext = YY_START; - g_yyLineNr++; - BEGIN(RemoveSpecialCComment); - } - else - { - // check is to prevent getting stuck in skipping C++ comments - if (YY_START != SkipComment && YY_START != SkipCxxComment) - { - g_lastCContext = YY_START ; - } - startFontClass("comment"); - codifyLines(yytext); - BEGIN(SkipComment); - } - } -<*>^{B}*"/**"[*]+/[^/] { // special C "banner" comment block at a new line - if (Config_getBool(JAVADOC_BANNER) && Config_getBool(STRIP_CODE_COMMENTS)) - { - if (YY_START != RemoveSpecialCComment) g_lastSpecialCContext = YY_START; - BEGIN(RemoveSpecialCComment); - } - else - { - // check is to prevent getting stuck in skipping C++ comments - if (YY_START != SkipComment && YY_START != SkipCxxComment) - { - g_lastCContext = YY_START ; - } - startFontClass("comment"); - g_code->codify(yytext); - BEGIN(SkipComment); - } - } -<*>^{B}*"/*"[!*]/[^/*] { // special C comment block at a new line - if (Config_getBool(STRIP_CODE_COMMENTS)) - { - if (YY_START != RemoveSpecialCComment) g_lastSpecialCContext = YY_START; - BEGIN(RemoveSpecialCComment); - } - else - { - // check is to prevent getting stuck in skipping C++ comments - if (YY_START != SkipComment && YY_START != SkipCxxComment) - { - g_lastCContext = YY_START ; - } - startFontClass("comment"); - g_code->codify(yytext); - BEGIN(SkipComment); - } - } -<*>"/*"[!*]/[^/*] { // special C comment block half way a line - if (YY_START==SkipString) REJECT; - if (Config_getBool(STRIP_CODE_COMMENTS)) - { - if (YY_START != RemoveSpecialCComment) g_lastSpecialCContext = YY_START; - BEGIN(RemoveSpecialCComment); - } - else - { - // check is to prevent getting stuck in skipping C++ comments - if (YY_START != SkipComment && YY_START != SkipCxxComment) - { - g_lastCContext = YY_START ; - } - startFontClass("comment"); - g_code->codify(yytext); - BEGIN(SkipComment); - } - } -<*>"/*"("!"?)"*/" { - if (YY_START==SkipString) REJECT; - if (!Config_getBool(STRIP_CODE_COMMENTS)) - { - startFontClass("comment"); - g_code->codify(yytext); - endFontClass(); - } - } -<SkipComment>[^\*\n]+ { - g_code->codify(yytext); - } -<*>"/*" { - startFontClass("comment"); - g_code->codify(yytext); - // check is to prevent getting stuck in skipping C++ comments - if (YY_START != SkipComment && YY_START != SkipCxxComment) - { - g_lastCContext = YY_START ; - } - BEGIN( SkipComment ) ; - } -<*>@\" { // C# verbatim string - startFontClass("stringliteral"); - g_code->codify(yytext); - g_lastVerbStringContext=YY_START; - BEGIN(SkipVerbString); - } -<*>"//" { - startFontClass("comment"); - g_code->codify(yytext); - g_lastCContext = YY_START ; - BEGIN( SkipCxxComment ) ; - } -<*>"("|"[" { - g_code->codify(yytext); - g_theCallContext.pushScope(g_name, g_type); - } -<*>")"|"]" { - g_code->codify(yytext); - g_theCallContext.popScope(g_name, g_type); - } -<*>\n { - g_yyColNr++; - codifyLines(yytext); - } -<*>. { - g_yyColNr++; - g_code->codify(yytext); - } - /* -<*>([ \t\n]*"\n"){2,} { // combine multiple blank lines - //QCString sepLine=yytext; - //g_code->codify("\n\n"); - //g_yyLineNr+=sepLine.contains('\n'); - //char sepLine[3]="\n\n"; - codifyLines(yytext); - } - */ - -%% - -/*@ ---------------------------------------------------------------------------- - */ - -static void saveObjCContext() +static void saveObjCContext(yyscan_t yyscanner) { - if (g_currentCtx) + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + if (yyextra->currentCtx) { - g_currentCtx->format+=QCString().sprintf("$c%d",g_currentCtxId); - if (g_braceCount==0 && YY_START==ObjCCall) + yyextra->currentCtx->format+=QCString().sprintf("$c%d",yyextra->currentCtxId); + if (yyextra->braceCount==0 && YY_START==ObjCCall) { - g_currentCtx->objectTypeOrName=g_currentCtx->format.mid(1); - //printf("new type=%s\n",g_currentCtx->objectTypeOrName.data()); + yyextra->currentCtx->objectTypeOrName=yyextra->currentCtx->format.mid(1); + //printf("new type=%s\n",yyextra->currentCtx->objectTypeOrName.data()); } - g_contextStack.push(g_currentCtx); + yyextra->contextStack.push(yyextra->currentCtx); } else { //printf("Trying to save NULL context!\n"); } ObjCCallCtx *newCtx = new ObjCCallCtx; - newCtx->id = g_currentCtxId; + newCtx->id = yyextra->currentCtxId; newCtx->lexState = YY_START; - newCtx->braceCount = g_braceCount; + newCtx->braceCount = yyextra->braceCount; newCtx->objectType = 0; newCtx->objectVar = 0; newCtx->method = 0; //printf("save state=%d\n",YY_START); - g_contextDict.insert(g_currentCtxId,newCtx); - g_currentCtx = newCtx; - g_braceCount = 0; - g_currentCtxId++; + yyextra->contextDict.insert(yyextra->currentCtxId,newCtx); + yyextra->currentCtx = newCtx; + yyextra->braceCount = 0; + yyextra->currentCtxId++; } -static void restoreObjCContext() +static void restoreObjCContext(yyscan_t yyscanner) { - //printf("restore state=%d->%d\n",YY_START,g_currentCtx->lexState); - BEGIN(g_currentCtx->lexState); - g_braceCount = g_currentCtx->braceCount; - if (!g_contextStack.isEmpty()) + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + //printf("restore state=%d->%d\n",YY_START,yyextra->currentCtx->lexState); + BEGIN(yyextra->currentCtx->lexState); + yyextra->braceCount = yyextra->currentCtx->braceCount; + if (!yyextra->contextStack.isEmpty()) { - g_currentCtx = g_contextStack.pop(); + yyextra->currentCtx = yyextra->contextStack.pop(); } else { - g_currentCtx = 0; - //printf("Trying to pop context while g_contextStack is empty!\n"); + yyextra->currentCtx = 0; + //printf("Trying to pop context while yyextra->contextStack is empty!\n"); } } -void resetCCodeParserState() +struct CCodeParser::Private +{ + yyscan_t yyscanner; + codeYY_state state; +}; + +CCodeParser::CCodeParser() : p(std::make_unique<CCodeParser::Private>()) +{ + codeYYlex_init_extra(&p->state,&p->yyscanner); +#ifdef FLEX_DEBUG + codeYYset_debug(1,p->yyscanner); +#endif +} + +CCodeParser::~CCodeParser() { - //printf("***initParseCodeContext()\n"); - g_forceTagReference.resize(0); - g_theVarContext.clear(); - g_classScopeLengthStack.setAutoDelete(TRUE); - g_classScopeLengthStack.clear(); - delete g_codeClassSDict; - g_codeClassSDict = new ClassSDict(17); - g_codeClassSDict->setAutoDelete(TRUE); - g_codeClassSDict->clear(); - g_curClassBases.clear(); - g_anchorCount = 0; + struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner; + yyextra->classScopeLengthStack.clear(); + delete yyextra->codeClassSDict; + yyextra->codeClassSDict=0; + codeYYlex_destroy(p->yyscanner); } -void parseCCode(CodeOutputInterface &od,const char *className,const QCString &s, +void CCodeParser::resetCodeParserState() +{ + struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner; + //printf("***CodeParser::reset()\n"); + yyextra->forceTagReference.resize(0); + yyextra->theVarContext.clear(); + yyextra->classScopeLengthStack.setAutoDelete(TRUE); + yyextra->classScopeLengthStack.clear(); + delete yyextra->codeClassSDict; + yyextra->codeClassSDict = new ClassSDict(17); + yyextra->codeClassSDict->setAutoDelete(TRUE); + yyextra->codeClassSDict->clear(); + yyextra->curClassBases.clear(); + yyextra->anchorCount = 0; +} + +void CCodeParser::parseCode(CodeOutputInterface &od,const char *className,const QCString &s, SrcLangExt lang,bool exBlock, const char *exName,FileDef *fd, int startLine,int endLine,bool inlineFragment, const MemberDef *memberDef,bool showLineNumbers,const Definition *searchCtx, bool collectXRefs) { + yyscan_t yyscanner = p->yyscanner; + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; //printf("***parseCode() exBlock=%d exName=%s fd=%p className=%s searchCtx=%s\n", // exBlock,exName,fd,className,searchCtx?searchCtx->name().data():"<none>"); @@ -3782,117 +3915,93 @@ void parseCCode(CodeOutputInterface &od,const char *className,const QCString &s, printlex(yy_flex_debug, TRUE, __FILE__, fd ? fd->fileName().data(): NULL); - if (g_codeClassSDict==0) + if (yyextra->codeClassSDict==0) { - resetCCodeParserState(); + resetCodeParserState(); } - g_code = &od; - g_inputString = s; - g_inputPosition = 0; - g_currentFontClass = 0; - g_needsTermination = FALSE; - g_searchCtx = searchCtx; - g_collectXRefs = collectXRefs; - g_inFunctionTryBlock = FALSE; + yyextra->code = &od; + yyextra->inputString = s; + yyextra->inputPosition = 0; + codeYYrestart(0,yyscanner); + yyextra->currentFontClass = 0; + yyextra->needsTermination = FALSE; + yyextra->searchCtx = searchCtx; + yyextra->collectXRefs = collectXRefs; + yyextra->inFunctionTryBlock = FALSE; if (startLine!=-1) - g_yyLineNr = startLine; + yyextra->yyLineNr = startLine; else - g_yyLineNr = 1; + yyextra->yyLineNr = 1; if (endLine!=-1) - g_inputLines = endLine+1; + yyextra->inputLines = endLine+1; else - g_inputLines = g_yyLineNr + countLines() - 1; - - g_curlyCount = 0; - g_bodyCurlyCount = 0; - g_bracketCount = 0; - g_sharpCount = 0; - g_insideTemplate = FALSE; - g_theCallContext.clear(); - g_scopeStack.clear(); - g_classScope = className; + yyextra->inputLines = yyextra->yyLineNr + countLines(yyscanner) - 1; + + yyextra->curlyCount = 0; + yyextra->bodyCurlyCount = 0; + yyextra->bracketCount = 0; + yyextra->sharpCount = 0; + yyextra->insideTemplate = FALSE; + yyextra->theCallContext.clear(); + yyextra->scopeStack.clear(); + yyextra->classScope = className; //printf("parseCCode %s\n",className); - g_exampleBlock = exBlock; - g_exampleName = exName; - g_sourceFileDef = fd; - g_lineNumbers = fd!=0 && showLineNumbers; + yyextra->exampleBlock = exBlock; + yyextra->exampleName = exName; + yyextra->sourceFileDef = fd; + yyextra->lineNumbers = fd!=0 && showLineNumbers; bool cleanupSourceDef = FALSE; if (fd==0) { // create a dummy filedef for the example - g_sourceFileDef = createFileDef("",(exName?exName:"generated")); + yyextra->sourceFileDef = createFileDef("",(exName?exName:"generated")); cleanupSourceDef = TRUE; } - g_insideObjC = lang==SrcLangExt_ObjC; - g_insideJava = lang==SrcLangExt_Java; - g_insideCS = lang==SrcLangExt_CSharp; - g_insidePHP = lang==SrcLangExt_PHP; - g_insideCpp = lang==SrcLangExt_Cpp; - g_insideSlice = lang==SrcLangExt_Slice; - if (g_sourceFileDef) + yyextra->lang = lang; + yyextra->insideObjC = lang==SrcLangExt_ObjC; + if (yyextra->sourceFileDef) { - setCurrentDoc("l00001"); + setCurrentDoc(yyscanner,"l00001"); } - g_currentDefinition = 0; - g_currentMemberDef = 0; - g_searchingForBody = exBlock; - g_insideBody = FALSE; - g_bracketCount = 0; - if (!g_exampleName.isEmpty()) + yyextra->currentDefinition = 0; + yyextra->currentMemberDef = 0; + yyextra->searchingForBody = exBlock; + yyextra->insideBody = FALSE; + yyextra->bracketCount = 0; + if (!yyextra->exampleName.isEmpty()) { - g_exampleFile = convertNameToFile(g_exampleName+"-example",FALSE,TRUE); - //printf("g_exampleFile=%s\n",g_exampleFile.data()); + yyextra->exampleFile = convertNameToFile(yyextra->exampleName+"-example",FALSE,TRUE); + //printf("yyextra->exampleFile=%s\n",yyextra->exampleFile.data()); } - g_includeCodeFragment = inlineFragment; + yyextra->includeCodeFragment = inlineFragment; //printf("** exBlock=%d exName=%s include=%d\n",exBlock,exName,inlineFragment); - startCodeLine(); - g_type.resize(0); - g_name.resize(0); - g_args.resize(0); - g_parmName.resize(0); - g_parmType.resize(0); - if (memberDef) setParameterList(memberDef); - codeYYrestart( codeYYin ); + startCodeLine(yyscanner); + yyextra->type.resize(0); + yyextra->name.resize(0); + yyextra->args.resize(0); + yyextra->parmName.resize(0); + yyextra->parmType.resize(0); + if (memberDef) setParameterList(yyscanner,memberDef); BEGIN( Body ); - codeYYlex(); - g_lexInit=TRUE; - if (g_needsTermination) + codeYYlex(yyscanner); + yyextra->lexInit=TRUE; + if (yyextra->needsTermination) { - endFontClass(); - DBG_CTX((stderr,"endCodeLine(%d)\n",g_yyLineNr)); - g_code->endCodeLine(); + endFontClass(yyscanner); + DBG_CTX((stderr,"endCodeLine(%d)\n",yyextra->yyLineNr)); + yyextra->code->endCodeLine(); } if (cleanupSourceDef) { // delete the temporary file definition used for this example - delete g_sourceFileDef; - g_sourceFileDef=0; + delete yyextra->sourceFileDef; + yyextra->sourceFileDef=0; } printlex(yy_flex_debug, FALSE, __FILE__, fd ? fd->fileName().data(): NULL); return; } -void codeFreeScanner() -{ -#if defined(YY_FLEX_SUBMINOR_VERSION) - if (g_lexInit) - { - codeYYlex_destroy(); - } -#endif -} - - - -#if !defined(YY_FLEX_SUBMINOR_VERSION) -extern "C" { // some bogus code to keep the compiler happy - void codeYYdummy() { yy_flex_realloc(0,0); } -} -#elif YY_FLEX_MAJOR_VERSION<=2 && YY_FLEX_MINOR_VERSION<=5 && YY_FLEX_SUBMINOR_VERSION<33 -#error "You seem to be using a version of flex newer than 2.5.4. These are currently incompatible with 2.5.4, and do NOT work with doxygen! Please use version 2.5.4 or expect things to be parsed wrongly! A bug report has been submitted (#732132)." -#endif - #include "code.l.h" diff --git a/src/commentcnv.l b/src/commentcnv.l index f144aec..bd4ed5c 100644 --- a/src/commentcnv.l +++ b/src/commentcnv.l @@ -16,6 +16,8 @@ */ %option never-interactive %option prefix="commentcnvYY" +%option reentrant +%option extra-type="struct commentcnvYY_state *" %{ @@ -41,8 +43,8 @@ #define YY_NO_INPUT 1 #define YY_NO_UNISTD_H 1 -#define ADDCHAR(c) g_outBuf->addChar(c) -#define ADDARRAY(a,s) g_outBuf->addArray(a,s) +#define ADDCHAR(c) yyextra->outBuf->addChar(c) +#define ADDARRAY(a,s) yyextra->outBuf->addArray(a,s) struct CondCtx { @@ -60,185 +62,66 @@ struct CommentCtx int lineNr; }; -static BufStr * g_inBuf; -static BufStr * g_outBuf; -static int g_inBufPos; -static int g_col; -static int g_blockHeadCol; -static bool g_mlBrief; -static int g_readLineCtx; -static bool g_skip; -static QCString g_fileName; -static int g_lineNr; -static int g_condCtx; -static QStack<CondCtx> g_condStack; -static QStack<CommentCtx> g_commentStack; -static QCString g_blockName; -static int g_lastCommentContext; -static bool g_inSpecialComment; -static bool g_inRoseComment; -static int g_stringContext; -static int g_charContext; -static int g_javaBlock; -static bool g_specialComment; +struct commentcnvYY_state +{ + BufStr * inBuf = 0; + BufStr * outBuf = 0; + int inBufPos = 0; + int col = 0; + int blockHeadCol = 0; + bool mlBrief = FALSE; + int readLineCtx = 0; + bool skip = FALSE; + QCString fileName; + int lineNr = 0; + int condCtx = 0; + QStack<CondCtx> condStack; + QStack<CommentCtx> commentStack; + QCString blockName; + int lastCommentContext = 0; + bool inSpecialComment = FALSE; + bool inRoseComment= FALSE; + int stringContext = 0; + int charContext = 0; + int javaBlock = 0; + bool specialComment = FALSE; -static QCString g_aliasString; -static int g_blockCount; -static bool g_lastEscaped; -static int g_lastBlockContext; -static bool g_pythonDocString; -static int g_nestingCount; + QCString aliasString; + int blockCount = 0; + bool lastEscaped = FALSE; + int lastBlockContext= 0; + bool pythonDocString = FALSE; + int nestingCount= 0; -static bool g_vhdl; // for VHDL old style --! comment + bool vhdl = FALSE; // for VHDL old style --! comment -static SrcLangExt g_lang; -static bool isFixedForm; // For Fortran + SrcLangExt lang = SrcLangExt_Unknown; + bool isFixedForm = FALSE; // For Fortran +}; static const char *stateToString(int state); +static inline int computeIndent(const char *s); -static void replaceCommentMarker(const char *s,int len) -{ - const char *p=s; - char c; - // copy leading blanks - while ((c=*p) && (c==' ' || c=='\t' || c=='\n')) - { - ADDCHAR(c); - g_lineNr += c=='\n'; - p++; - } - // replace start of comment marker by blanks and the last character by a * - int blanks=0; - while ((c=*p) && (c=='/' || c=='!' || c=='#')) - { - blanks++; - p++; - if (*p=='<') // comment-after-item marker - { - blanks++; - p++; - } - if (c=='!') // end after first ! - { - break; - } - } - if (blanks>0) - { - while (blanks>2) - { - ADDCHAR(' '); - blanks--; - } - if (blanks>1) ADDCHAR('*'); - ADDCHAR(' '); - } - // copy comment line to output - ADDARRAY(p,len-(int)(p-s)); -} - -static inline int computeIndent(const char *s) -{ - int col=0; - static int tabSize=Config_getInt(TAB_SIZE); - const char *p=s; - char c; - while ((c=*p++)) - { - if (c==' ') col++; - else if (c=='\t') col+=tabSize-(col%tabSize); - else break; - } - return col; -} - -static inline void copyToOutput(const char *s,int len) -{ - int i; - if (g_skip) // only add newlines. - { - for (i=0;i<len;i++) - { - if (s[i]=='\n') - { - ADDCHAR('\n'); - //fprintf(stderr,"---> skip %d\n",g_lineNr); - g_lineNr++; - } - } - } - else if (len>0) - { - ADDARRAY(s,len); - static int tabSize=Config_getInt(TAB_SIZE); - for (i=0;i<len;i++) - { - switch (s[i]) - { - case '\n': g_col=0; - //fprintf(stderr,"---> copy %d\n",g_lineNr); - g_lineNr++; break; - case '\t': g_col+=tabSize-(g_col%tabSize); break; - default: g_col++; break; - } - } - } -} - -static void startCondSection(const char *sectId) -{ - //printf("startCondSection: skip=%d stack=%d\n",g_skip,g_condStack.count()); - CondParser prs; - bool expResult = prs.parse(g_fileName,g_lineNr,sectId); - g_condStack.push(new CondCtx(g_lineNr,sectId,g_skip)); - if (!expResult) // not enabled - { - g_skip=TRUE; - } -} +static void replaceCommentMarker(yyscan_t yyscanner,const char *s,int len); +static inline void copyToOutput(yyscan_t yyscanner,const char *s,int len); +static void startCondSection(yyscan_t yyscanner,const char *sectId); +static void endCondSection(yyscan_t yyscanner); +static void handleCondSectionId(yyscan_t yyscanner,const char *expression); +static void replaceAliases(yyscan_t yyscanner,const char *s); +static int yyread(yyscan_t yyscanner,char *buf,int max_size); +static void replaceComment(yyscan_t yyscanner,int offset); -static void endCondSection() -{ - if (g_condStack.isEmpty()) - { - warn(g_fileName,g_lineNr,"Found \\endcond command without matching \\cond"); - g_skip=FALSE; - } - else - { - CondCtx *ctx = g_condStack.pop(); - g_skip=ctx->skip; - } - //printf("endCondSection: skip=%d stack=%d\n",g_skip,g_condStack.count()); -} -/** copies string \a s with length \a len to the output, while - * replacing any alias commands found in the string. - */ -static void replaceAliases(const char *s) -{ - QCString result = resolveAliasCmd(s); - //printf("replaceAliases(%s)->'%s'\n",s,result.data()); - copyToOutput(result,result.length()); -} #undef YY_INPUT -#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); - -static int yyread(char *buf,int max_size) -{ - int bytesInBuf = g_inBuf->curPos()-g_inBufPos; - int bytesToCopy = QMIN(max_size,bytesInBuf); - memcpy(buf,g_inBuf->data()+g_inBufPos,bytesToCopy); - g_inBufPos+=bytesToCopy; - return bytesToCopy; -} +#define YY_INPUT(buf,result,max_size) result=yyread(yyscanner,buf,max_size); -void replaceComment(int offset); %} +MAILADR ("mailto:")?[a-z_A-Z0-9.+-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]+ + %option noyywrap %x Scan @@ -255,55 +138,55 @@ void replaceComment(int offset); %% <Scan>[^"'!\/\n\\#,\-]* { /* eat anything that is not " / , or \n */ - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yytext,(int)yyleng); } <Scan>[,] { /* eat , so we have a nice separator in long initialization lines */ - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yytext,(int)yyleng); } <Scan>"\"\"\""! { /* start of python long comment */ - if (g_lang!=SrcLangExt_Python) + if (yyextra->lang!=SrcLangExt_Python) { REJECT; } else { - g_pythonDocString = TRUE; - g_nestingCount=1; - g_commentStack.clear(); /* to be on the save side */ - copyToOutput(yytext,(int)yyleng); + yyextra->pythonDocString = TRUE; + yyextra->nestingCount=1; + yyextra->commentStack.clear(); /* to be on the save side */ + copyToOutput(yyscanner,yytext,(int)yyleng); BEGIN(CComment); - g_commentStack.push(new CommentCtx(g_lineNr)); + yyextra->commentStack.push(new CommentCtx(yyextra->lineNr)); } } <Scan>![><!]/.*\n { - if (g_lang!=SrcLangExt_Fortran) + if (yyextra->lang!=SrcLangExt_Fortran) { REJECT; } else { - copyToOutput(yytext,(int)yyleng); - g_nestingCount=0; // Fortran doesn't have an end comment - g_commentStack.clear(); /* to be on the save side */ + copyToOutput(yyscanner,yytext,(int)yyleng); + yyextra->nestingCount=0; // Fortran doesn't have an end comment + yyextra->commentStack.clear(); /* to be on the save side */ BEGIN(CComment); - g_commentStack.push(new CommentCtx(g_lineNr)); + yyextra->commentStack.push(new CommentCtx(yyextra->lineNr)); } } <Scan>[Cc\*][><!]/.*\n { - if (g_lang!=SrcLangExt_Fortran) + if (yyextra->lang!=SrcLangExt_Fortran) { REJECT; } else { /* check for fixed format; we might have some conditional as part of multiline if like C<5 .and. & */ - if (isFixedForm && (g_col == 0)) + if (yyextra->isFixedForm && (yyextra->col == 0)) { - copyToOutput(yytext,(int)yyleng); - g_nestingCount=0; // Fortran doesn't have an end comment - g_commentStack.clear(); /* to be on the safe side */ + copyToOutput(yyscanner,yytext,(int)yyleng); + yyextra->nestingCount=0; // Fortran doesn't have an end comment + yyextra->commentStack.clear(); /* to be on the safe side */ BEGIN(CComment); - g_commentStack.push(new CommentCtx(g_lineNr)); + yyextra->commentStack.push(new CommentCtx(yyextra->lineNr)); } else { @@ -312,25 +195,25 @@ void replaceComment(int offset); } } <Scan>!.*\n { - if (g_lang!=SrcLangExt_Fortran) + if (yyextra->lang!=SrcLangExt_Fortran) { REJECT; } else { - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yytext,(int)yyleng); } } <Scan>[Cc\*].*\n { - if (g_lang!=SrcLangExt_Fortran) + if (yyextra->lang!=SrcLangExt_Fortran) { REJECT; } else { - if (g_col == 0) + if (yyextra->col == 0) { - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yytext,(int)yyleng); } else { @@ -339,24 +222,24 @@ void replaceComment(int offset); } } <Scan>"\"" { /* start of a string */ - copyToOutput(yytext,(int)yyleng); - g_stringContext = YY_START; + copyToOutput(yyscanner,yytext,(int)yyleng); + yyextra->stringContext = YY_START; BEGIN(SkipString); } <Scan>' { - copyToOutput(yytext,(int)yyleng); - g_charContext = YY_START; - if (g_lang!=SrcLangExt_VHDL) + copyToOutput(yyscanner,yytext,(int)yyleng); + yyextra->charContext = YY_START; + if (yyextra->lang!=SrcLangExt_VHDL) { BEGIN(SkipChar); } } <Scan>\n { /* new line */ - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yytext,(int)yyleng); } <Scan>"//!"/.*\n[ \t]*"//"[\/!][^\/] | /* start C++ style special comment block */ <Scan>("///"[/]*)/[^/].*\n[ \t]*"//"[\/!][^\/] { /* start C++ style special comment block */ - if (g_mlBrief) + if (yyextra->mlBrief) { REJECT; // bail out if we do not need to convert } @@ -367,190 +250,194 @@ void replaceComment(int offset); { while (i<(int)yyleng && yytext[i]=='/') i++; } - g_blockHeadCol=g_col; - copyToOutput("/**",3); - replaceAliases(yytext+i); - g_inSpecialComment=TRUE; + yyextra->blockHeadCol=yyextra->col; + copyToOutput(yyscanner,"/**",3); + replaceAliases(yyscanner,yytext+i); + yyextra->inSpecialComment=TRUE; //BEGIN(SComment); - g_readLineCtx=SComment; + yyextra->readLineCtx=SComment; BEGIN(ReadLine); } } <Scan>"//##Documentation".*/\n { /* Start of Rational Rose ANSI C++ comment block */ - if (g_mlBrief) REJECT; + if (yyextra->mlBrief) REJECT; int i=17; //=strlen("//##Documentation"); - g_blockHeadCol=g_col; - copyToOutput("/**",3); - replaceAliases(yytext+i); - g_inRoseComment=TRUE; + yyextra->blockHeadCol=yyextra->col; + copyToOutput(yyscanner,"/**",3); + replaceAliases(yyscanner,yytext+i); + yyextra->inRoseComment=TRUE; BEGIN(SComment); } <Scan>"//"[!\/]/.*\n[ \t]*"//"[|\/][ \t]*[@\\]"}" { // next line contains an end marker, see bug 752712 - g_inSpecialComment=yytext[2]=='/' || yytext[2]=='!'; - copyToOutput(yytext,(int)yyleng); - g_readLineCtx=YY_START; + yyextra->inSpecialComment=yytext[2]=='/' || yytext[2]=='!'; + copyToOutput(yyscanner,yytext,(int)yyleng); + yyextra->readLineCtx=YY_START; BEGIN(ReadLine); } <Scan>"//"/.*\n { /* one line C++ comment */ - g_inSpecialComment=yytext[2]=='/' || yytext[2]=='!'; - copyToOutput(yytext,(int)yyleng); - g_readLineCtx=YY_START; + yyextra->inSpecialComment=yytext[2]=='/' || yytext[2]=='!'; + copyToOutput(yyscanner,yytext,(int)yyleng); + yyextra->readLineCtx=YY_START; BEGIN(ReadLine); } <Scan>"/**/" { /* avoid matching next rule for empty C comment, see bug 711723 */ - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yytext,(int)yyleng); } <Scan>"/*"[*!]? { /* start of a C comment */ - if ((g_lang==SrcLangExt_Python) || (g_lang==SrcLangExt_Tcl)) + if ((yyextra->lang==SrcLangExt_Python) || (yyextra->lang==SrcLangExt_Tcl)) { REJECT; } - g_specialComment=(int)yyleng==3; - g_nestingCount=1; - g_commentStack.clear(); /* to be on the save side */ - copyToOutput(yytext,(int)yyleng); + yyextra->specialComment=(int)yyleng==3; + yyextra->nestingCount=1; + yyextra->commentStack.clear(); /* to be on the save side */ + copyToOutput(yyscanner,yytext,(int)yyleng); BEGIN(CComment); - g_commentStack.push(new CommentCtx(g_lineNr)); + yyextra->commentStack.push(new CommentCtx(yyextra->lineNr)); } <Scan>"#"("#")? { - if (g_lang!=SrcLangExt_Python) + if (yyextra->lang!=SrcLangExt_Python) { REJECT; } else { - copyToOutput(yytext,(int)yyleng); - g_nestingCount=0; // Python doesn't have an end comment for # - g_commentStack.clear(); /* to be on the save side */ + copyToOutput(yyscanner,yytext,(int)yyleng); + yyextra->nestingCount=0; // Python doesn't have an end comment for # + yyextra->commentStack.clear(); /* to be on the save side */ BEGIN(CComment); - g_commentStack.push(new CommentCtx(g_lineNr)); + yyextra->commentStack.push(new CommentCtx(yyextra->lineNr)); } } <Scan>"--!" { - if (g_lang!=SrcLangExt_VHDL) + if (yyextra->lang!=SrcLangExt_VHDL) { REJECT; } else { - g_vhdl = TRUE; - copyToOutput(yytext,(int)yyleng); - g_nestingCount=0; // VHDL doesn't have an end comment - g_commentStack.clear(); /* to be on the save side */ + yyextra->vhdl = TRUE; + copyToOutput(yyscanner,yytext,(int)yyleng); + yyextra->nestingCount=0; // VHDL doesn't have an end comment + yyextra->commentStack.clear(); /* to be on the save side */ BEGIN(CComment); - g_commentStack.push(new CommentCtx(g_lineNr)); + yyextra->commentStack.push(new CommentCtx(yyextra->lineNr)); } } <Scan>![><!] { - if (g_lang!=SrcLangExt_Fortran) + if (yyextra->lang!=SrcLangExt_Fortran) { REJECT; } else { - copyToOutput(yytext,(int)yyleng); - g_nestingCount=0; // Fortran doesn't have an end comment - g_commentStack.clear(); /* to be on the save side */ + copyToOutput(yyscanner,yytext,(int)yyleng); + yyextra->nestingCount=0; // Fortran doesn't have an end comment + yyextra->commentStack.clear(); /* to be on the save side */ BEGIN(CComment); - g_commentStack.push(new CommentCtx(g_lineNr)); + yyextra->commentStack.push(new CommentCtx(yyextra->lineNr)); } } +<CComment,ReadLine>{MAILADR} | +<CComment,ReadLine>"<"{MAILADR}">" { // Mail address, to prevent seeing e.g x@code-factory.org as start of a code block + copyToOutput(yyscanner,yytext,(int)yyleng); + } <CComment>"{@code"/[ \t\n] { - copyToOutput("@code",5); - g_lastCommentContext = YY_START; - g_javaBlock=1; - g_blockName=&yytext[1]; + copyToOutput(yyscanner,"@code",5); + yyextra->lastCommentContext = YY_START; + yyextra->javaBlock=1; + yyextra->blockName=&yytext[1]; BEGIN(VerbatimCode); } <CComment,ReadLine>[\\@]("dot"|"code"|"msc"|"startuml")/[^a-z_A-Z0-9] { /* start of a verbatim block */ - copyToOutput(yytext,(int)yyleng); - g_lastCommentContext = YY_START; - g_javaBlock=0; + copyToOutput(yyscanner,yytext,(int)yyleng); + yyextra->lastCommentContext = YY_START; + yyextra->javaBlock=0; if (qstrcmp(&yytext[1],"startuml")==0) { - g_blockName="uml"; + yyextra->blockName="uml"; } else { - g_blockName=&yytext[1]; + yyextra->blockName=&yytext[1]; } BEGIN(VerbatimCode); } <CComment,ReadLine>[\\@]("f$"|"f["|"f{") { - copyToOutput(yytext,(int)yyleng); - g_blockName=&yytext[1]; - if (g_blockName.at(1)=='[') + copyToOutput(yyscanner,yytext,(int)yyleng); + yyextra->blockName=&yytext[1]; + if (yyextra->blockName.at(1)=='[') { - g_blockName.at(1)=']'; + yyextra->blockName.at(1)=']'; } - else if (g_blockName.at(1)=='{') + else if (yyextra->blockName.at(1)=='{') { - g_blockName.at(1)='}'; + yyextra->blockName.at(1)='}'; } - g_lastCommentContext = YY_START; + yyextra->lastCommentContext = YY_START; BEGIN(Verbatim); } <CComment,ReadLine>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"docbookonly"|"rtfonly"|"manonly")/[^a-z_A-Z0-9] { /* start of a verbatim block */ - copyToOutput(yytext,(int)yyleng); - g_blockName=&yytext[1]; - g_lastCommentContext = YY_START; + copyToOutput(yyscanner,yytext,(int)yyleng); + yyextra->blockName=&yytext[1]; + yyextra->lastCommentContext = YY_START; BEGIN(Verbatim); } -<Scan>. { /* any ather character */ - copyToOutput(yytext,(int)yyleng); +<Scan>. { /* any other character */ + copyToOutput(yyscanner,yytext,(int)yyleng); } <Verbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddocbookonly"|"endrtfonly"|"endmanonly"|"f$"|"f]"|"f}") { /* end of verbatim block */ - copyToOutput(yytext,(int)yyleng); - if (&yytext[1]==g_blockName) // end of formula + copyToOutput(yyscanner,yytext,(int)yyleng); + if (&yytext[1]==yyextra->blockName) // end of formula { - BEGIN(g_lastCommentContext); + BEGIN(yyextra->lastCommentContext); } - else if (&yytext[4]==g_blockName) + else if (&yytext[4]==yyextra->blockName) { - BEGIN(g_lastCommentContext); + BEGIN(yyextra->lastCommentContext); } } <VerbatimCode>"{" { - if (g_javaBlock==0) + if (yyextra->javaBlock==0) { REJECT; } else { - g_javaBlock++; - copyToOutput(yytext,(int)yyleng); + yyextra->javaBlock++; + copyToOutput(yyscanner,yytext,(int)yyleng); } } <VerbatimCode>"}" { - if (g_javaBlock==0) + if (yyextra->javaBlock==0) { REJECT; } else { - g_javaBlock--; - if (g_javaBlock==0) + yyextra->javaBlock--; + if (yyextra->javaBlock==0) { - copyToOutput(" @endcode ",10); - BEGIN(g_lastCommentContext); + copyToOutput(yyscanner," @endcode ",10); + BEGIN(yyextra->lastCommentContext); } else { - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yytext,(int)yyleng); } } } <VerbatimCode>[\\@]("enddot"|"endcode"|"endmsc"|"enduml") { /* end of verbatim block */ - copyToOutput(yytext,(int)yyleng); - if (&yytext[4]==g_blockName) + copyToOutput(yyscanner,yytext,(int)yyleng); + if (&yytext[4]==yyextra->blockName) { - BEGIN(g_lastCommentContext); + BEGIN(yyextra->lastCommentContext); } } <VerbatimCode>^[ \t]*"//"[\!\/]? { /* skip leading comments */ - if (!g_inSpecialComment) + if (!yyextra->inSpecialComment) { - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yytext,(int)yyleng); } else { @@ -559,25 +446,25 @@ void replaceComment(int offset); { l++; } - copyToOutput(yytext,l); + copyToOutput(yyscanner,yytext,l); if (yyleng-l==3) // ends with //! or /// { - copyToOutput(" * ",3); + copyToOutput(yyscanner," * ",3); } else // ends with // { - copyToOutput("//",2); + copyToOutput(yyscanner,"//",2); } } } <Verbatim,VerbatimCode>[^@\/\\\n{}]* { /* any character not a backslash or new line or } */ - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yytext,(int)yyleng); } <Verbatim,VerbatimCode>\n { /* new line in verbatim block */ - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yytext,(int)yyleng); } <Verbatim>^[ \t]*"///" { - if (g_blockName=="dot" || g_blockName=="msc" || g_blockName=="uml" || g_blockName.at(0)=='f') + if (yyextra->blockName=="dot" || yyextra->blockName=="msc" || yyextra->blockName=="uml" || yyextra->blockName.at(0)=='f') { // see bug 487871, strip /// from dot images and formulas. int l=0; @@ -585,8 +472,8 @@ void replaceComment(int offset); { l++; } - copyToOutput(yytext,l); - copyToOutput(" ",3); + copyToOutput(yyscanner,yytext,l); + copyToOutput(yyscanner," ",3); } else // even slashes are verbatim (e.g. \verbatim, \code) { @@ -594,119 +481,119 @@ void replaceComment(int offset); } } <Verbatim,VerbatimCode>. { /* any other character */ - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yytext,(int)yyleng); } <SkipString>\\. { /* escaped character in string */ - if (g_lang==SrcLangExt_Fortran) + if (yyextra->lang==SrcLangExt_Fortran) { unput(yytext[1]); - copyToOutput(yytext,1); + copyToOutput(yyscanner,yytext,1); } else { - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yytext,(int)yyleng); } } <SkipString>"\"" { /* end of string */ - copyToOutput(yytext,(int)yyleng); - BEGIN(g_stringContext); + copyToOutput(yyscanner,yytext,(int)yyleng); + BEGIN(yyextra->stringContext); } <SkipString>. { /* any other string character */ - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yytext,(int)yyleng); } <SkipString>\n { /* new line inside string (illegal for some compilers) */ - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yytext,(int)yyleng); } <SkipChar>\\. { /* escaped character */ - if (g_lang==SrcLangExt_Fortran) + if (yyextra->lang==SrcLangExt_Fortran) { unput(yytext[1]); - copyToOutput(yytext,1); + copyToOutput(yyscanner,yytext,1); } else { - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yytext,(int)yyleng); } } <SkipChar>' { /* end of character literal */ - copyToOutput(yytext,(int)yyleng); - BEGIN(g_charContext); + copyToOutput(yyscanner,yytext,(int)yyleng); + BEGIN(yyextra->charContext); } <SkipChar>. { /* any other string character */ - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yytext,(int)yyleng); } <SkipChar>\n { /* new line character */ - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yytext,(int)yyleng); } -<CComment>[^\\!@*\n{\"\/]* { /* anything that is not a '*' or command */ - copyToOutput(yytext,(int)yyleng); +<CComment>[^ <\\!@*\n{\"\/]* { /* anything that is not a '*' or command */ + copyToOutput(yyscanner,yytext,(int)yyleng); } <CComment>"*"+[^*/\\@\n{\"]* { /* stars without slashes */ - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yytext,(int)yyleng); } <CComment>"\"\"\"" { /* end of Python docstring */ - if (g_lang!=SrcLangExt_Python) + if (yyextra->lang!=SrcLangExt_Python) { REJECT; } else { - g_nestingCount--; - g_pythonDocString = FALSE; - copyToOutput(yytext,(int)yyleng); + yyextra->nestingCount--; + yyextra->pythonDocString = FALSE; + copyToOutput(yyscanner,yytext,(int)yyleng); BEGIN(Scan); } } <CComment>\n { /* new line in comment */ - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yytext,(int)yyleng); /* in case of Fortran always end of comment */ - if (g_lang==SrcLangExt_Fortran) + if (yyextra->lang==SrcLangExt_Fortran) { BEGIN(Scan); } } <CComment>"/"+"*" { /* nested C comment */ - if ((g_lang==SrcLangExt_Python) || (g_lang==SrcLangExt_Tcl)) + if ((yyextra->lang==SrcLangExt_Python) || (yyextra->lang==SrcLangExt_Tcl)) { REJECT; } - g_nestingCount++; - g_commentStack.push(new CommentCtx(g_lineNr)); - copyToOutput(yytext,(int)yyleng); + yyextra->nestingCount++; + yyextra->commentStack.push(new CommentCtx(yyextra->lineNr)); + copyToOutput(yyscanner,yytext,(int)yyleng); } <CComment>"*"+"/" { /* end of C comment */ - if ((g_lang==SrcLangExt_Python) || (g_lang==SrcLangExt_Tcl)) + if ((yyextra->lang==SrcLangExt_Python) || (yyextra->lang==SrcLangExt_Tcl)) { REJECT; } else { - copyToOutput(yytext,(int)yyleng); - g_nestingCount--; - if (g_nestingCount<=0) + copyToOutput(yyscanner,yytext,(int)yyleng); + yyextra->nestingCount--; + if (yyextra->nestingCount<=0) { BEGIN(Scan); } else { - //g_nestingCount--; - delete g_commentStack.pop(); + //yyextra->nestingCount--; + delete yyextra->commentStack.pop(); } } } /* Python an VHDL share CComment, so special attention for ending comments is required */ <CComment>"\n"/[ \t]*"#" { - if (g_lang!=SrcLangExt_VHDL) + if (yyextra->lang!=SrcLangExt_VHDL) { REJECT; } else { - if (g_vhdl) // inside --! comment + if (yyextra->vhdl) // inside --! comment { - g_vhdl = FALSE; - copyToOutput(yytext,(int)yyleng); + yyextra->vhdl = FALSE; + copyToOutput(yyscanner,yytext,(int)yyleng); BEGIN(Scan); } else // C-type comment @@ -716,35 +603,35 @@ void replaceComment(int offset); } } <CComment>"\n"/[ \t]*"-" { - if (g_lang!=SrcLangExt_Python || g_pythonDocString) + if (yyextra->lang!=SrcLangExt_Python || yyextra->pythonDocString) { REJECT; } else { - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yytext,(int)yyleng); BEGIN(Scan); } } <CComment>"\n"/[ \t]*[^ \t#\-] { - if (g_lang==SrcLangExt_Python) + if (yyextra->lang==SrcLangExt_Python) { - if (g_pythonDocString) + if (yyextra->pythonDocString) { REJECT; } else { - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yytext,(int)yyleng); BEGIN(Scan); } } - else if (g_lang==SrcLangExt_VHDL) + else if (yyextra->lang==SrcLangExt_VHDL) { - if (g_vhdl) // inside --! comment + if (yyextra->vhdl) // inside --! comment { - g_vhdl = FALSE; - copyToOutput(yytext,(int)yyleng); + yyextra->vhdl = FALSE; + copyToOutput(yyscanner,yytext,(int)yyleng); BEGIN(Scan); } else // C-type comment @@ -759,122 +646,122 @@ void replaceComment(int offset); } /* removed for bug 674842 (bug was introduced in rev 768) <CComment>"'" { - g_charContext = YY_START; - copyToOutput(yytext,(int)yyleng); + yyextra->charContext = YY_START; + copyToOutput(yyscanner,yytext,(int)yyleng); BEGIN(SkipChar); } <CComment>"\"" { - g_stringContext = YY_START; - copyToOutput(yytext,(int)yyleng); + yyextra->stringContext = YY_START; + copyToOutput(yyscanner,yytext,(int)yyleng); BEGIN(SkipString); } */ <CComment>. { - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yytext,(int)yyleng); } <SComment>^[ \t]*"///"[\/]*/\n { - replaceComment(0); + replaceComment(yyscanner,0); } <SComment>\n[ \t]*"///"[\/]*/\n { - replaceComment(1); + replaceComment(yyscanner,1); } <SComment>^[ \t]*"///"[^\/\n]/.*\n { - replaceComment(0); - g_readLineCtx=YY_START; + replaceComment(yyscanner,0); + yyextra->readLineCtx=YY_START; BEGIN(ReadLine); } <SComment>\n[ \t]*"//"[\/!]("<")?[ \t]*[\\@]"}".*\n { /* See Bug 752712: end the multiline comment when finding a @} or \} command */ - copyToOutput(" */",3); - copyToOutput(yytext,(int)yyleng); - g_inSpecialComment=FALSE; - g_inRoseComment=FALSE; + copyToOutput(yyscanner," */",3); + copyToOutput(yyscanner,yytext,(int)yyleng); + yyextra->inSpecialComment=FALSE; + yyextra->inRoseComment=FALSE; BEGIN(Scan); } <SComment>\n[ \t]*"///"[^\/\n]/.*\n { - replaceComment(1); - g_readLineCtx=YY_START; + replaceComment(yyscanner,1); + yyextra->readLineCtx=YY_START; BEGIN(ReadLine); } <SComment>^[ \t]*"//!" | // just //! <SComment>^[ \t]*"//!<"/.*\n | // or //!< something <SComment>^[ \t]*"//!"[^<]/.*\n { // or //!something - replaceComment(0); - g_readLineCtx=YY_START; + replaceComment(yyscanner,0); + yyextra->readLineCtx=YY_START; BEGIN(ReadLine); } <SComment>\n[ \t]*"//!" | <SComment>\n[ \t]*"//!<"/.*\n | <SComment>\n[ \t]*"//!"[^<\n]/.*\n { - replaceComment(1); - g_readLineCtx=YY_START; + replaceComment(yyscanner,1); + yyextra->readLineCtx=YY_START; BEGIN(ReadLine); } <SComment>^[ \t]*"//##"/.*\n { - if (!g_inRoseComment) + if (!yyextra->inRoseComment) { REJECT; } else { - replaceComment(0); - g_readLineCtx=YY_START; + replaceComment(yyscanner,0); + yyextra->readLineCtx=YY_START; BEGIN(ReadLine); } } <SComment>\n[ \t]*"//##"/.*\n { - if (!g_inRoseComment) + if (!yyextra->inRoseComment) { REJECT; } else { - replaceComment(1); - g_readLineCtx=YY_START; + replaceComment(yyscanner,1); + yyextra->readLineCtx=YY_START; BEGIN(ReadLine); } } <SComment>\n { /* end of special comment */ - copyToOutput(" */",3); - copyToOutput(yytext,(int)yyleng); - g_inSpecialComment=FALSE; - g_inRoseComment=FALSE; + copyToOutput(yyscanner," */",3); + copyToOutput(yyscanner,yytext,(int)yyleng); + yyextra->inSpecialComment=FALSE; + yyextra->inRoseComment=FALSE; BEGIN(Scan); } <ReadLine>"*/" { - copyToOutput("*‍/",7); + copyToOutput(yyscanner,"*‍/",7); } <ReadLine>"*" { - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yytext,(int)yyleng); } <ReadLine>[^\\@\n\*]* { - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yytext,(int)yyleng); } <ReadLine>[^\\@\n\*]*/\n { - copyToOutput(yytext,(int)yyleng); - BEGIN(g_readLineCtx); + copyToOutput(yyscanner,yytext,(int)yyleng); + BEGIN(yyextra->readLineCtx); } <CComment,ReadLine>[\\@][\\@][~a-z_A-Z][a-z_A-Z0-9]*[ \t]* { // escaped command - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yytext,(int)yyleng); } <CComment,ReadLine>[\\@]"cond"/[^a-z_A-Z0-9] { // conditional section - g_condCtx = YY_START; + yyextra->condCtx = YY_START; BEGIN(CondLine); } <CComment,ReadLine>[\\@]"endcond"/[^a-z_A-Z0-9] { // end of conditional section - bool oldSkip=g_skip; - endCondSection(); - if (YY_START==CComment && oldSkip && !g_skip) + bool oldSkip=yyextra->skip; + endCondSection(yyscanner); + if (YY_START==CComment && oldSkip && !yyextra->skip) { //printf("** Adding start of comment!\n"); - if (g_lang!=SrcLangExt_Python && - g_lang!=SrcLangExt_VHDL && - g_lang!=SrcLangExt_Markdown && - g_lang!=SrcLangExt_Fortran) + if (yyextra->lang!=SrcLangExt_Python && + yyextra->lang!=SrcLangExt_VHDL && + yyextra->lang!=SrcLangExt_Markdown && + yyextra->lang!=SrcLangExt_Fortran) { ADDCHAR('/'); ADDCHAR('*'); - if (g_specialComment) + if (yyextra->specialComment) { ADDCHAR('*'); } @@ -882,142 +769,277 @@ void replaceComment(int offset); } } <CondLine>[!()&| \ta-z_A-Z0-9.\-]+ { - bool oldSkip=g_skip; - startCondSection(yytext); - if ((g_condCtx==CComment || g_readLineCtx==SComment) && - !oldSkip && g_skip) - { - if (g_lang!=SrcLangExt_Python && - g_lang!=SrcLangExt_VHDL && - g_lang!=SrcLangExt_Markdown && - g_lang!=SrcLangExt_Fortran) - { - ADDCHAR('*'); - ADDCHAR('/'); - } - } - if (g_readLineCtx==SComment) - { - BEGIN(SComment); - } - else - { - BEGIN(g_condCtx); - } + handleCondSectionId(yyscanner,yytext); } -<CondLine>[ \t]* -<CComment,ReadLine>[\\@]"cond"[ \t\r]*/\n | +<CComment,ReadLine>[\\@]"cond"[ \t\r]*/\n { + yyextra->condCtx=YY_START; + handleCondSectionId(yyscanner," "); // fake section id causing the section to be hidden unconditionally + } <CondLine>. { // forgot section id? - if (YY_START!=CondLine) g_condCtx=YY_START; - bool oldSkip=g_skip; - startCondSection(" "); // fake section id causing the section to be hidden unconditionally - if ((g_condCtx==CComment || g_readLineCtx==SComment) && - !oldSkip && g_skip) - { - //printf("** Adding terminator for comment!\n"); - if (g_lang!=SrcLangExt_Python && - g_lang!=SrcLangExt_VHDL && - g_lang!=SrcLangExt_Markdown && - g_lang!=SrcLangExt_Fortran) - { - ADDCHAR('*'); - ADDCHAR('/'); - } - } - if (*yytext=='\n') g_lineNr++; - if (g_readLineCtx==SComment) - { - BEGIN(SComment); - } - else - { - BEGIN(g_condCtx); - } + handleCondSectionId(yyscanner," "); // fake section id causing the section to be hidden unconditionally + if (*yytext=='\n') yyextra->lineNr++; } <CComment,ReadLine>[\\@][a-z_A-Z][a-z_A-Z0-9]* { // expand alias without arguments - replaceAliases(yytext); + replaceAliases(yyscanner,yytext); } <CComment,ReadLine>[\\@][a-z_A-Z][a-z_A-Z0-9]*"{" { // expand alias with arguments - g_lastBlockContext=YY_START; - g_blockCount=1; - g_aliasString=yytext; - g_lastEscaped=0; + yyextra->lastBlockContext=YY_START; + yyextra->blockCount=1; + yyextra->aliasString=yytext; + yyextra->lastEscaped=0; BEGIN( ReadAliasArgs ); } <ReadAliasArgs>^[ \t]*"//"[/!]/[^\n]+ { // skip leading special comments (see bug 618079) } <ReadAliasArgs>"*/" { // oops, end of comment in the middle of an alias? - if (g_lang==SrcLangExt_Python) + if (yyextra->lang==SrcLangExt_Python) { REJECT; } else // abort the alias, restart scanning { - copyToOutput(g_aliasString,g_aliasString.length()); - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yyextra->aliasString,yyextra->aliasString.length()); + copyToOutput(yyscanner,yytext,(int)yyleng); BEGIN(Scan); } } <ReadAliasArgs>[^{}\n\\\*]+ { - g_aliasString+=yytext; - g_lastEscaped=FALSE; + yyextra->aliasString+=yytext; + yyextra->lastEscaped=FALSE; } <ReadAliasArgs>"\\" { - if (g_lastEscaped) g_lastEscaped=FALSE; - else g_lastEscaped=TRUE; - g_aliasString+=yytext; + if (yyextra->lastEscaped) yyextra->lastEscaped=FALSE; + else yyextra->lastEscaped=TRUE; + yyextra->aliasString+=yytext; } <ReadAliasArgs>\n { - g_aliasString+=yytext; - g_lineNr++; - g_lastEscaped=FALSE; + yyextra->aliasString+=yytext; + yyextra->lineNr++; + yyextra->lastEscaped=FALSE; } <ReadAliasArgs>"{" { - g_aliasString+=yytext; - if (!g_lastEscaped) g_blockCount++; - g_lastEscaped=FALSE; + yyextra->aliasString+=yytext; + if (!yyextra->lastEscaped) yyextra->blockCount++; + yyextra->lastEscaped=FALSE; } <ReadAliasArgs>"}" { - g_aliasString+=yytext; - if (!g_lastEscaped) g_blockCount--; - if (g_blockCount==0) + yyextra->aliasString+=yytext; + if (!yyextra->lastEscaped) yyextra->blockCount--; + if (yyextra->blockCount==0) { - replaceAliases(g_aliasString); - BEGIN( g_lastBlockContext ); + replaceAliases(yyscanner,yyextra->aliasString); + BEGIN( yyextra->lastBlockContext ); } - g_lastEscaped=FALSE; + yyextra->lastEscaped=FALSE; } <ReadAliasArgs>. { - g_aliasString+=yytext; - g_lastEscaped=FALSE; + yyextra->aliasString+=yytext; + yyextra->lastEscaped=FALSE; } <ReadLine>. { - copyToOutput(yytext,(int)yyleng); + copyToOutput(yyscanner,yytext,(int)yyleng); } %% -void replaceComment(int offset) +static void replaceCommentMarker(yyscan_t yyscanner,const char *s,int len) +{ + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + const char *p=s; + char c; + // copy leading blanks + while ((c=*p) && (c==' ' || c=='\t' || c=='\n')) + { + ADDCHAR(c); + yyextra->lineNr += c=='\n'; + p++; + } + // replace start of comment marker by blanks and the last character by a * + int blanks=0; + while ((c=*p) && (c=='/' || c=='!' || c=='#')) + { + blanks++; + p++; + if (*p=='<') // comment-after-item marker + { + blanks++; + p++; + } + if (c=='!') // end after first ! + { + break; + } + } + if (blanks>0) + { + while (blanks>2) + { + ADDCHAR(' '); + blanks--; + } + if (blanks>1) ADDCHAR('*'); + ADDCHAR(' '); + } + // copy comment line to output + ADDARRAY(p,len-(int)(p-s)); +} + +static inline int computeIndent(const char *s) +{ + int col=0; + static int tabSize=Config_getInt(TAB_SIZE); + const char *p=s; + char c; + while ((c=*p++)) + { + if (c==' ') col++; + else if (c=='\t') col+=tabSize-(col%tabSize); + else break; + } + return col; +} + +static inline void copyToOutput(yyscan_t yyscanner,const char *s,int len) +{ + int tabSize=Config_getInt(TAB_SIZE); + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + int i; + if (yyextra->skip) // only add newlines. + { + for (i=0;i<len;i++) + { + switch(s[i]) + { + case '\n': + ADDCHAR('\n'); + yyextra->lineNr++; + yyextra->col=0; + break; + case '\t': + yyextra->col+=tabSize-(yyextra->col%tabSize); + break; + default: + yyextra->col++; + break; + } + } + } + else if (len>0) + { + ADDARRAY(s,len); + for (i=0;i<len;i++) + { + switch (s[i]) + { + case '\n': yyextra->col=0; + //fprintf(stderr,"---> copy %d\n",g_lineNr); + yyextra->lineNr++; break; + case '\t': yyextra->col+=tabSize-(yyextra->col%tabSize); break; + default: yyextra->col++; break; + } + } + } +} + +static void startCondSection(yyscan_t yyscanner,const char *sectId) +{ + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + //printf("startCondSection: skip=%d stack=%d\n",g_skip,g_condStack.count()); + CondParser prs; + bool expResult = prs.parse(yyextra->fileName,yyextra->lineNr,sectId); + yyextra->condStack.push(new CondCtx(yyextra->lineNr,sectId,yyextra->skip)); + if (!expResult) // not enabled + { + yyextra->skip=TRUE; + } +} + +static void endCondSection(yyscan_t yyscanner) +{ + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + if (yyextra->condStack.isEmpty()) + { + warn(yyextra->fileName,yyextra->lineNr,"Found \\endcond command without matching \\cond"); + yyextra->skip=FALSE; + } + else + { + CondCtx *ctx = yyextra->condStack.pop(); + yyextra->skip=ctx->skip; + } + //printf("endCondSection: skip=%d stack=%d\n",g_skip,g_condStack.count()); +} + +static void handleCondSectionId(yyscan_t yyscanner,const char *expression) { - if (g_mlBrief || g_skip) + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + bool oldSkip=yyextra->skip; + startCondSection(yyscanner,expression); + if ((yyextra->condCtx==CComment || yyextra->readLineCtx==SComment) && + !oldSkip && yyextra->skip) + { + if (yyextra->lang!=SrcLangExt_Python && + yyextra->lang!=SrcLangExt_VHDL && + yyextra->lang!=SrcLangExt_Markdown && + yyextra->lang!=SrcLangExt_Fortran) + { + ADDCHAR('*'); + ADDCHAR('/'); + } + } + if (yyextra->readLineCtx==SComment) { - copyToOutput(yytext,(int)yyleng); + BEGIN(SComment); + } + else + { + BEGIN(yyextra->condCtx); + } +} + +/** copies string \a s with length \a len to the output, while + * replacing any alias commands found in the string. + */ +static void replaceAliases(yyscan_t yyscanner,const char *s) +{ + QCString result = resolveAliasCmd(s); + //printf("replaceAliases(%s)->'%s'\n",s,result.data()); + copyToOutput(yyscanner,result,result.length()); +} + + +static int yyread(yyscan_t yyscanner,char *buf,int max_size) +{ + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + int bytesInBuf = yyextra->inBuf->curPos()-yyextra->inBufPos; + int bytesToCopy = QMIN(max_size,bytesInBuf); + memcpy(buf,yyextra->inBuf->data()+yyextra->inBufPos,bytesToCopy); + yyextra->inBufPos+=bytesToCopy; + return bytesToCopy; +} + +static void replaceComment(yyscan_t yyscanner,int offset) +{ + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + if (yyextra->mlBrief || yyextra->skip) + { + copyToOutput(yyscanner,yytext,(int)yyleng); } else { //printf("replaceComment(%s)\n",yytext); int i=computeIndent(&yytext[offset]); - if (i==g_blockHeadCol) + if (i==yyextra->blockHeadCol) { - replaceCommentMarker(yytext,(int)yyleng); + replaceCommentMarker(yyscanner,yytext,(int)yyleng); } else { - copyToOutput(" */",3); + copyToOutput(yyscanner," */",3); int i;for (i=(int)yyleng-1;i>=0;i--) unput(yytext[i]); - g_inSpecialComment=FALSE; - BEGIN(Scan); - } + yyextra->inSpecialComment=FALSE; + BEGIN(Scan); + } } } @@ -1068,83 +1090,86 @@ static bool recognizeFixedForm(const char* contents) */ void convertCppComments(BufStr *inBuf,BufStr *outBuf,const char *fileName) { + yyscan_t yyscanner; + commentcnvYY_state extra; + commentcnvYYlex_init_extra(&extra,&yyscanner); +#ifdef FLEX_DEBUG + commentcnvYYset_debug(1,yyscanner); +#endif + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; //printf("convertCppComments(%s)\n",fileName); - g_inBuf = inBuf; - g_outBuf = outBuf; - g_inBufPos = 0; - g_col = 0; - g_mlBrief = Config_getBool(MULTILINE_CPP_IS_BRIEF); - g_skip = FALSE; - g_fileName = fileName; - g_lang = getLanguageFromFileName(fileName); - g_pythonDocString = FALSE; - g_lineNr = 1; - g_condStack.clear(); - g_condStack.setAutoDelete(TRUE); - g_commentStack.clear(); - g_commentStack.setAutoDelete(TRUE); - g_vhdl = FALSE; + yyextra->inBuf = inBuf; + yyextra->outBuf = outBuf; + yyextra->inBufPos = 0; + yyextra->col = 0; + yyextra->mlBrief = Config_getBool(MULTILINE_CPP_IS_BRIEF); + yyextra->skip = FALSE; + yyextra->fileName = fileName; + yyextra->lang = getLanguageFromFileName(fileName); + yyextra->pythonDocString = FALSE; + yyextra->lineNr = 1; + yyextra->condStack.clear(); + yyextra->condStack.setAutoDelete(TRUE); + yyextra->commentStack.clear(); + yyextra->commentStack.setAutoDelete(TRUE); + yyextra->vhdl = FALSE; printlex(yy_flex_debug, TRUE, __FILE__, fileName); - isFixedForm = FALSE; - if (g_lang==SrcLangExt_Fortran) + yyextra->isFixedForm = FALSE; + if (yyextra->lang==SrcLangExt_Fortran) { - isFixedForm = recognizeFixedForm(inBuf->data()); + yyextra->isFixedForm = recognizeFixedForm(inBuf->data()); } - if (g_lang==SrcLangExt_Markdown) + if (yyextra->lang==SrcLangExt_Markdown) { - g_nestingCount=0; + yyextra->nestingCount=0; BEGIN(CComment); - g_commentStack.push(new CommentCtx(g_lineNr)); + yyextra->commentStack.push(new CommentCtx(yyextra->lineNr)); } else { BEGIN(Scan); } - yylex(); - while (!g_condStack.isEmpty()) + yylex(yyscanner); + while (!yyextra->condStack.isEmpty()) { - CondCtx *ctx = g_condStack.pop(); + CondCtx *ctx = yyextra->condStack.pop(); QCString sectionInfo = " "; if (ctx->sectionId!=" ") sectionInfo.sprintf(" with label '%s' ",ctx->sectionId.stripWhiteSpace().data()); - warn(g_fileName,ctx->lineNr,"Conditional section%sdoes not have " + warn(yyextra->fileName,ctx->lineNr,"Conditional section%sdoes not have " "a corresponding \\endcond command within this file.",sectionInfo.data()); } - if (g_nestingCount>0 && g_lang!=SrcLangExt_Markdown) + if (yyextra->nestingCount>0 && yyextra->lang!=SrcLangExt_Markdown) { QCString tmp= "(probable line reference: "; bool first = TRUE; - while (!g_commentStack.isEmpty()) + while (!yyextra->commentStack.isEmpty()) { - CommentCtx *ctx = g_commentStack.pop(); + CommentCtx *ctx = yyextra->commentStack.pop(); if (!first) tmp += ", "; tmp += QCString().setNum(ctx->lineNr); first = FALSE; delete ctx; } tmp += ")"; - warn(g_fileName,g_lineNr,"Reached end of file while still inside a (nested) comment. " - "Nesting level %d %s",g_nestingCount,tmp.data()); + warn(yyextra->fileName,yyextra->lineNr,"Reached end of file while still inside a (nested) comment. " + "Nesting level %d %s",yyextra->nestingCount,tmp.data()); } - g_commentStack.clear(); - g_nestingCount = 0; + yyextra->commentStack.clear(); + yyextra->nestingCount = 0; if (Debug::isFlagSet(Debug::CommentCnv)) { - g_outBuf->at(g_outBuf->curPos())='\0'; + yyextra->outBuf->at(yyextra->outBuf->curPos())='\0'; Debug::print(Debug::CommentCnv,0,"-----------\nCommentCnv: %s\n" - "output=[\n%s]\n-----------\n",fileName,g_outBuf->data() + "output=[\n%s]\n-----------\n",fileName,yyextra->outBuf->data() ); } printlex(yy_flex_debug, FALSE, __FILE__, fileName); + commentcnvYYlex_destroy(yyscanner); } //---------------------------------------------------------------------------- -#if !defined(YY_FLEX_SUBMINOR_VERSION) -extern "C" { // some bogus code to keep the compiler happy - void commentcnvYYdummy() { yy_flex_realloc(0,0); } -} -#endif #include "commentcnv.l.h" diff --git a/src/commentscan.h b/src/commentscan.h index 7d2189f..f471890 100644 --- a/src/commentscan.h +++ b/src/commentscan.h @@ -19,7 +19,7 @@ #include "types.h" class Entry; -class ParserInterface; +class OutlineParserInterface; /** @file * @brief Interface for the comment block parser */ @@ -72,7 +72,7 @@ QCString preprocessCommentBlock(const QCString &comment, * where to proceed parsing. FALSE indicates no further processing is * needed. */ -bool parseCommentBlock(ParserInterface *parser, +bool parseCommentBlock(OutlineParserInterface *parser, Entry *curEntry, const QCString &comment, const QCString &fileName, diff --git a/src/commentscan.l b/src/commentscan.l index 6e7d373..fa454e5 100644 --- a/src/commentscan.l +++ b/src/commentscan.l @@ -395,7 +395,7 @@ class GuardedSection * statics */ -static ParserInterface *langParser; // the language parser that is calling us +static OutlineParserInterface *langParser; // the language parser that is calling us static QCString inputString; // input string static int inputPosition; // read pointer static QCString yyFileName; // file name that is read from @@ -1970,7 +1970,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" BEGIN(Comment); } <GuardParamEnd>{B}* { - if (!g_spaceBeforeIf.isEmpty()) // needed for 665313 in combation with bug620924 + if (!g_spaceBeforeIf.isEmpty()) // needed for 665313 in combination with bug620924 { addOutput(g_spaceBeforeIf); } @@ -3127,7 +3127,7 @@ QCString preprocessCommentBlock(const QCString &comment, } } -bool parseCommentBlock(/* in */ ParserInterface *parser, +bool parseCommentBlock(/* in */ OutlineParserInterface *parser, /* in */ Entry *curEntry, /* in */ const QCString &comment, /* in */ const QCString &fileName, @@ -3281,13 +3281,4 @@ static void handleGuard(const QCString &expr) } } - - -#if !defined(YY_FLEX_SUBMINOR_VERSION) -//---------------------------------------------------------------------------- -extern "C" { // some bogus code to keep the compiler happy - void commentscanYYdummy() { yy_flex_realloc(0,0); } -} -#endif - #include "commentscan.l.h" diff --git a/src/condparser.cpp b/src/condparser.cpp index 74e26bc..9d7ac45 100644 --- a/src/condparser.cpp +++ b/src/condparser.cpp @@ -257,7 +257,7 @@ bool CondParser::parseLevel3() bool CondParser::parseVar() { - bool ans = 0; + bool ans = false; switch (m_tokenType) { case VARIABLE: diff --git a/src/condparser.h b/src/condparser.h index 09a4f74..1ad13b1 100644 --- a/src/condparser.h +++ b/src/condparser.h @@ -13,7 +13,7 @@ * Documents produced by Doxygen are derivative works derived from the * input used in their production; they are not affected by this license. * - * C++ Expression parser for EXTABLED_SETIONS in Doxygen + * C++ Expression parser for ENABLED_SECTIONS in Doxygen * * Features used: * Operators: diff --git a/src/config.xml b/src/config.xml index d206203..dfe22e2 100644 --- a/src/config.xml +++ b/src/config.xml @@ -953,7 +953,7 @@ Go to the <a href="commands.html">next</a> section or return to the ]]> </docs> </option> - <option type='bool' id='CASE_SENSE_NAMES' defval='0' altdefval='portable_fileSystemIsCaseSensitive()'> + <option type='bool' id='CASE_SENSE_NAMES' defval='0' altdefval='Portable::fileSystemIsCaseSensitive()'> <docs> <![CDATA[ If the \c CASE_SENSE_NAMES tag is set to \c NO then doxygen diff --git a/src/configimpl.l b/src/configimpl.l index 0cc5c88..6987e59 100644 --- a/src/configimpl.l +++ b/src/configimpl.l @@ -603,7 +603,7 @@ static FILE *tryPath(const char *path,const char *fileName) QFileInfo fi(absName); if (fi.exists() && fi.isFile()) { - FILE *f=portable_fopen(absName,"r"); + FILE *f=Portable::fopen(absName,"r"); if (!f) config_err("could not open file %s for reading\n",absName.data()); return f; } @@ -619,7 +619,7 @@ static FILE *findFile(const char *fileName) { return 0; } - if (portable_isAbsolutePath(fileName)) + if (Portable::isAbsolutePath(fileName)) { return tryPath(NULL, fileName); } @@ -1012,7 +1012,7 @@ static void substEnvVarsInString(QCString &s) while ((i=re.match(s,p,&l))!=-1 || (i=re2.match(s,p,&l))!=-1) { //printf("Found environment var s.mid(%d,%d)='%s'\n",i+2,l-3,s.mid(i+2,l-3).data()); - QCString env=portable_getenv(s.mid(i+2,l-3)); + QCString env=Portable::getenv(s.mid(i+2,l-3)); substEnvVarsInString(env); // recursively expand variables if needed. s = s.left(i)+env+s.right(s.length()-i-l); p=i+env.length(); // next time start at the end of the expanded string @@ -1579,7 +1579,7 @@ void Config::checkAndCorrect() } else { - QFileInfo dp(dotPath+"/dot"+portable_commandExtension()); + QFileInfo dp(dotPath+"/dot"+Portable::commandExtension()); if (!dp.exists() || !dp.isFile()) { warn_uncond("the dot tool could not be found at %s\n",dotPath.data()); @@ -1607,10 +1607,10 @@ void Config::checkAndCorrect() QFileInfo pu(plantumlJarPath); if (pu.exists() && pu.isDir()) // PLANTUML_JAR_PATH is directory { - QFileInfo jar(plantumlJarPath+portable_pathSeparator()+"plantuml.jar"); + QFileInfo jar(plantumlJarPath+Portable::pathSeparator()+"plantuml.jar"); if (jar.exists() && jar.isFile()) { - plantumlJarPath = jar.dirPath(TRUE).utf8()+portable_pathSeparator(); + plantumlJarPath = jar.dirPath(TRUE).utf8()+Portable::pathSeparator(); } else { @@ -1621,7 +1621,7 @@ void Config::checkAndCorrect() } else if (pu.exists() && pu.isFile() && plantumlJarPath.right(4)==".jar") // PLANTUML_JAR_PATH is file { - plantumlJarPath = pu.dirPath(TRUE).utf8()+portable_pathSeparator(); + plantumlJarPath = pu.dirPath(TRUE).utf8()+Portable::pathSeparator(); } else { @@ -1635,7 +1635,7 @@ void Config::checkAndCorrect() QCString &diaPath = Config_getString(DIA_PATH); if (!diaPath.isEmpty()) { - QFileInfo dp(diaPath+"/dia"+portable_commandExtension()); + QFileInfo dp(diaPath+"/dia"+Portable::commandExtension()); if (!dp.exists() || !dp.isFile()) { warn_uncond("dia could not be found at %s\n",diaPath.data()); diff --git a/src/constexp.h b/src/constexp.h index 8bf582e..0b52e14 100644 --- a/src/constexp.h +++ b/src/constexp.h @@ -19,24 +19,17 @@ #ifndef _CONSTEXP_H #define _CONSTEXP_H -#include "cppvalue.h" #include <qcstring.h> -#define YYSTYPE CPPValue -typedef void* yyscan_t; -struct constexpYY_state +class ConstExpressionParser { - QCString g_strToken; - CPPValue g_resultValue; - int g_constExpLineNr; - QCString g_constExpFileName; - - const char *g_inputString; - int g_inputPosition; + public: + ConstExpressionParser(); + ~ConstExpressionParser(); + bool parse(const char *fileName,int line,const QCString &expression); + private: + struct Private; + Private *p; }; -extern bool parseconstexp(const char *fileName,int line,const QCString &s); -extern int constexpYYparse(yyscan_t); -extern int constexpYYlex(YYSTYPE *lvalp, yyscan_t); -struct constexpYY_state* constexpYYget_extra (yyscan_t yyscanner ); #endif diff --git a/src/constexp.l b/src/constexp.l index b6b3c5c..eae8a3b 100644 --- a/src/constexp.l +++ b/src/constexp.l @@ -24,6 +24,7 @@ %{ #include "constexp.h" +#include "constexp_p.h" #include "cppvalue.h" #include "ce_parse.hpp" // generated header file #include "message.h" @@ -31,7 +32,6 @@ #define YY_NO_INPUT 1 #define YY_NO_UNISTD_H 1 - static const char *stateToString(int state); static int yyread(char *buf,int max_size,yyscan_t yyscanner); @@ -70,23 +70,23 @@ CONSTSUFFIX ([uU][lL]?[lL]?)|([lL][lL]?[uU]?) "(" { return TOK_LPAREN; } ")" { return TOK_RPAREN; } "'"(([^\'\n\r\\]+)|(\\(([ntvbrfa\\?'\"])|([0-9]+)|([xX][0-9a-fA-F]+))))"'" { - yyextra->g_strToken=yytext; + yyextra->strToken=yytext; return TOK_CHARACTER; } -0[0-7]*{CONSTSUFFIX}? { yyextra->g_strToken=yytext; +0[0-7]*{CONSTSUFFIX}? { yyextra->strToken=yytext; return TOK_OCTALINT; } -[1-9][0-9]*{CONSTSUFFIX}? { yyextra->g_strToken=yytext; +[1-9][0-9]*{CONSTSUFFIX}? { yyextra->strToken=yytext; return TOK_DECIMALINT; } -(0x|0X)[0-9a-fA-F]+{CONSTSUFFIX}? { yyextra->g_strToken=yytext+2; +(0x|0X)[0-9a-fA-F]+{CONSTSUFFIX}? { yyextra->strToken=yytext+2; return TOK_HEXADECIMALINT; } (([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+))([eE]([\-\+])?[0-9]+)?([fFlL])? { - yyextra->g_strToken=yytext; return TOK_FLOAT; + yyextra->strToken=yytext; return TOK_FLOAT; } ([0-9]+[eE])([\-\+])?[0-9]+([fFlL])? { - yyextra->g_strToken=yytext; return TOK_FLOAT; + yyextra->strToken=yytext; return TOK_FLOAT; } . \n @@ -97,43 +97,56 @@ static int yyread(char *buf,int max_size,yyscan_t yyscanner) { struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; int c=0; - while( c < max_size && yyextra->g_inputString[yyextra->g_inputPosition] ) + while( c < max_size && yyextra->inputString[yyextra->inputPosition] ) { - *buf = yyextra->g_inputString[yyextra->g_inputPosition++] ; + *buf = yyextra->inputString[yyextra->inputPosition++] ; c++; buf++; } return c; } +struct ConstExpressionParser::Private +{ + yyscan_t yyscanner; + struct constexpYY_state constexpYY_extra; +}; -static yyscan_t yyscanner; -static struct constexpYY_state constexpYY_extra; -bool parseconstexp(const char *fileName,int lineNr,const QCString &s) +ConstExpressionParser::ConstExpressionParser() { - constexpYYlex_init_extra(&constexpYY_extra, &yyscanner); - struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + p = new Private; + constexpYYlex_init_extra(&p->constexpYY_extra, &p->yyscanner); +} + +ConstExpressionParser::~ConstExpressionParser() +{ + constexpYYlex_destroy(p->yyscanner); + delete p; +} + +bool ConstExpressionParser::parse(const char *fileName,int lineNr,const QCString &s) +{ + struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner; #ifdef FLEX_DEBUG yyset_debug(1,yyscanner); #endif - yyextra->g_constExpFileName = fileName; - yyextra->g_constExpLineNr = lineNr; - yyextra->g_inputString = s; - yyextra->g_inputPosition = 0; - constexpYYrestart( yyin, yyscanner ); + yyextra->constExpFileName = fileName; + yyextra->constExpLineNr = lineNr; + yyextra->inputString = s; + yyextra->inputPosition = 0; + constexpYYrestart( yyin, p->yyscanner ); printlex(yy_flex_debug, TRUE, __FILE__, fileName); //printf("Expression: '%s'\n",s.data()); - constexpYYparse(yyscanner); + constexpYYparse(p->yyscanner); //printf("Result: %ld\n",(long)g_resultValue); printlex(yy_flex_debug, FALSE, __FILE__, fileName); - bool result = (long)yyextra->g_resultValue!=0; + bool result = (long)yyextra->resultValue!=0; - constexpYYlex_destroy(yyscanner); return result; } diff --git a/src/constexp.y b/src/constexp.y index 62a51f3..100614a 100644 --- a/src/constexp.y +++ b/src/constexp.y @@ -19,21 +19,16 @@ %{ #include "cppvalue.h" -#include "constexp.h" +#include "constexp_p.h" #include "message.h" -#if defined(_MSC_VER) -#define MSDOS -#endif - - #include <stdio.h> #include <stdlib.h> int constexpYYerror(yyscan_t yyscanner, const char *s) { struct constexpYY_state* yyextra = constexpYYget_extra(yyscanner); - warn(yyextra->g_constExpFileName, yyextra->g_constExpLineNr, + warn(yyextra->constExpFileName, yyextra->constExpLineNr, "preprocessing issue while doing constant expression evaluation: %s",s); return 0; } @@ -80,7 +75,7 @@ int constexpYYerror(yyscan_t yyscanner, const char *s) start: constant_expression { struct constexpYY_state* yyextra = constexpYYget_extra(yyscanner); - yyextra->g_resultValue = $1; return 0; + yyextra->resultValue = $1; return 0; } ; @@ -272,27 +267,27 @@ primary_expression: constant constant: TOK_OCTALINT { struct constexpYY_state* yyextra = constexpYYget_extra(yyscanner); - $$ = parseOctal(yyextra->g_strToken); + $$ = parseOctal(yyextra->strToken); } | TOK_DECIMALINT { struct constexpYY_state* yyextra = constexpYYget_extra(yyscanner); - $$ = parseDecimal(yyextra->g_strToken); + $$ = parseDecimal(yyextra->strToken); } | TOK_HEXADECIMALINT { struct constexpYY_state* yyextra = constexpYYget_extra(yyscanner); - $$ = parseHexadecimal(yyextra->g_strToken); + $$ = parseHexadecimal(yyextra->strToken); } | TOK_CHARACTER { struct constexpYY_state* yyextra = constexpYYget_extra(yyscanner); - $$ = parseCharacter(yyextra->g_strToken); + $$ = parseCharacter(yyextra->strToken); } | TOK_FLOAT { struct constexpYY_state* yyextra = constexpYYget_extra(yyscanner); - $$ = parseFloat(yyextra->g_strToken); + $$ = parseFloat(yyextra->strToken); } ; diff --git a/src/constexp_p.h b/src/constexp_p.h new file mode 100644 index 0000000..ad09b2d --- /dev/null +++ b/src/constexp_p.h @@ -0,0 +1,44 @@ +/****************************************************************************** + * + * Copyright (C) 1997-2019 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ + +#ifndef _CONSTEXP_P_H +#define _CONSTEXP_P_H + +#include <qcstring.h> + +//! @file +//! @brief Private interface between Parser (constexp.y) and Lexer (constexp.l) + +#include "cppvalue.h" +#define YYSTYPE CPPValue + +typedef void* yyscan_t; +struct constexpYY_state +{ + QCString strToken; + CPPValue resultValue; + int constExpLineNr; + QCString constExpFileName; + + const char *inputString; + int inputPosition; +}; +constexpYY_state* constexpYYget_extra(yyscan_t yyscanner ); + +extern int constexpYYlex(YYSTYPE *lvalp, yyscan_t); +extern int constexpYYparse(yyscan_t); + + +#endif diff --git a/src/context.cpp b/src/context.cpp index 361bfa2..5ee89cd 100644 --- a/src/context.cpp +++ b/src/context.cpp @@ -1079,7 +1079,7 @@ class TranslateContext::Private s_inst.addProperty("fileMembers", &Private::fileMembers); //%% string fileMembersDescription s_inst.addProperty("fileMembersDescription", &Private::fileMembersDescription); - //%% string relatedPagesDescripiton + //%% string relatedPagesDescription s_inst.addProperty("relatedPagesDesc", &Private::relatedPagesDesc); //%% string more s_inst.addProperty("more", &Private::more); @@ -1133,7 +1133,7 @@ class TranslateContext::Private s_inst.addProperty("referencesRelation", &Private::referencesRelation); //%% markerstring inheritedFrom s_inst.addProperty("inheritedFrom", &Private::inheritedFrom); - //%% string addtionalInheritedMembers + //%% string additionalInheritedMembers s_inst.addProperty("additionalInheritedMembers",&Private::additionalInheritedMembers); //%% string includeDependencyGraph:container_name s_inst.addProperty("includeDependencyGraph",&Private::includeDependencyGraph); @@ -1302,8 +1302,8 @@ static TemplateVariant parseDoc(const Definition *def,const QCString &file,int l static TemplateVariant parseCode(MemberDef *md,const QCString &scopeName,const QCString &relPath, const QCString &code,int startLine=-1,int endLine=-1,bool showLineNumbers=FALSE) { - ParserInterface *pIntf = Doxygen::parserManager->getParser(md->getDefFileExtension()); - pIntf->resetCodeParserState(); + CodeParserInterface &intf = Doxygen::parserManager->getCodeParser(md->getDefFileExtension()); + intf.resetCodeParserState(); QGString s; FTextStream t(&s); switch (g_globals.outputFormat) @@ -1311,14 +1311,14 @@ static TemplateVariant parseCode(MemberDef *md,const QCString &scopeName,const Q case ContextOutputFormat_Html: { HtmlCodeGenerator codeGen(t,relPath); - pIntf->parseCode(codeGen,scopeName,code,md->getLanguage(),FALSE,0,md->getBodyDef(), + intf.parseCode(codeGen,scopeName,code,md->getLanguage(),FALSE,0,md->getBodyDef(), startLine,endLine,TRUE,md,showLineNumbers,md); } break; case ContextOutputFormat_Latex: { LatexCodeGenerator codeGen(t,relPath,md->docFile()); - pIntf->parseCode(codeGen,scopeName,code,md->getLanguage(),FALSE,0,md->getBodyDef(), + intf.parseCode(codeGen,scopeName,code,md->getLanguage(),FALSE,0,md->getBodyDef(), startLine,endLine,TRUE,md,showLineNumbers,md); } break; @@ -1333,8 +1333,8 @@ static TemplateVariant parseCode(MemberDef *md,const QCString &scopeName,const Q static TemplateVariant parseCode(const FileDef *fd,const QCString &relPath) { static bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES); - ParserInterface *pIntf = Doxygen::parserManager->getParser(fd->getDefFileExtension()); - pIntf->resetCodeParserState(); + CodeParserInterface &intf = Doxygen::parserManager->getCodeParser(fd->getDefFileExtension()); + intf.resetCodeParserState(); QGString s; FTextStream t(&s); switch (g_globals.outputFormat) @@ -1342,7 +1342,7 @@ static TemplateVariant parseCode(const FileDef *fd,const QCString &relPath) case ContextOutputFormat_Html: { HtmlCodeGenerator codeGen(t,relPath); - pIntf->parseCode(codeGen,0, + intf.parseCode(codeGen,0, fileToString(fd->absFilePath(),filterSourceFiles,TRUE), // the sources fd->getLanguage(), // lang FALSE, // isExampleBlock @@ -1361,7 +1361,7 @@ static TemplateVariant parseCode(const FileDef *fd,const QCString &relPath) case ContextOutputFormat_Latex: { LatexCodeGenerator codeGen(t,relPath,fd->docFile()); - pIntf->parseCode(codeGen,0, + intf.parseCode(codeGen,0, fileToString(fd->absFilePath(),filterSourceFiles,TRUE), // the sources fd->getLanguage(), // lang FALSE, // isExampleBlock @@ -1978,7 +1978,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private> { cg->writeGraph(t,GOF_BITMAP,EOF_Html, g_globals.outputDir, - g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+Doxygen::htmlFileExtension, + g_globals.outputDir+Portable::pathSeparator()+m_classDef->getOutputFileBase()+Doxygen::htmlFileExtension, relPathAsString(),TRUE,TRUE,g_globals.dynSectionId ); } @@ -1987,7 +1987,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private> { cg->writeGraph(t,GOF_EPS,EOF_LaTeX, g_globals.outputDir, - g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+".tex", + g_globals.outputDir+Portable::pathSeparator()+m_classDef->getOutputFileBase()+".tex", relPathAsString(),TRUE,TRUE,g_globals.dynSectionId ); } @@ -2077,7 +2077,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private> { cg->writeGraph(t,GOF_BITMAP,EOF_Html, g_globals.outputDir, - g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+Doxygen::htmlFileExtension, + g_globals.outputDir+Portable::pathSeparator()+m_classDef->getOutputFileBase()+Doxygen::htmlFileExtension, relPathAsString(),TRUE,TRUE,g_globals.dynSectionId ); } @@ -2086,7 +2086,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private> { cg->writeGraph(t,GOF_EPS,EOF_LaTeX, g_globals.outputDir, - g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+".tex", + g_globals.outputDir+Portable::pathSeparator()+m_classDef->getOutputFileBase()+".tex", relPathAsString(),TRUE,TRUE,g_globals.dynSectionId ); } @@ -2353,7 +2353,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private> const ClassDef *cd; for (sdi.toFirst();(cd=sdi.current());++sdi) { - if (cd->name().find('@')==-1 && + if (!cd->isAnonymous() && cd->isLinkableInProject() && cd->isEmbeddedInOuterScope() && cd->partOfGroups()==0 @@ -2941,7 +2941,7 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri const ClassDef *cd; for (sdi.toFirst();(cd=sdi.current());++sdi) { - if (cd->name().find('@')==-1 && + if (!cd->isAnonymous() && cd->isLinkableInProject() && cd->isEmbeddedInOuterScope() && cd->partOfGroups()==0) @@ -3123,7 +3123,7 @@ class FileContext::Private : public DefinitionContext<FileContext::Private> { cg->writeGraph(t,GOF_BITMAP,EOF_Html, g_globals.outputDir, - g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+Doxygen::htmlFileExtension, + g_globals.outputDir+Portable::pathSeparator()+m_fileDef->getOutputFileBase()+Doxygen::htmlFileExtension, relPathAsString(),TRUE,g_globals.dynSectionId ); } @@ -3132,7 +3132,7 @@ class FileContext::Private : public DefinitionContext<FileContext::Private> { cg->writeGraph(t,GOF_EPS,EOF_LaTeX, g_globals.outputDir, - g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+".tex", + g_globals.outputDir+Portable::pathSeparator()+m_fileDef->getOutputFileBase()+".tex", relPathAsString(),TRUE,g_globals.dynSectionId ); } @@ -3175,7 +3175,7 @@ class FileContext::Private : public DefinitionContext<FileContext::Private> { cg->writeGraph(t,GOF_BITMAP,EOF_Html, g_globals.outputDir, - g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+Doxygen::htmlFileExtension, + g_globals.outputDir+Portable::pathSeparator()+m_fileDef->getOutputFileBase()+Doxygen::htmlFileExtension, relPathAsString(),TRUE,g_globals.dynSectionId ); } @@ -3184,7 +3184,7 @@ class FileContext::Private : public DefinitionContext<FileContext::Private> { cg->writeGraph(t,GOF_EPS,EOF_LaTeX, g_globals.outputDir, - g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+".tex", + g_globals.outputDir+Portable::pathSeparator()+m_fileDef->getOutputFileBase()+".tex", relPathAsString(),TRUE,g_globals.dynSectionId ); } @@ -3405,7 +3405,7 @@ class FileContext::Private : public DefinitionContext<FileContext::Private> const ClassDef *cd; for (sdi.toFirst();(cd=sdi.current());++sdi) { - if (cd->name().find('@')==-1 && + if (!cd->isAnonymous() && cd->isLinkableInProject() && cd->isEmbeddedInOuterScope() && cd->partOfGroups()==0) @@ -3613,7 +3613,7 @@ class DirContext::Private : public DefinitionContext<DirContext::Private> graph->writeGraph(t,GOF_BITMAP, EOF_Html, g_globals.outputDir, - g_globals.outputDir+portable_pathSeparator()+m_dirDef->getOutputFileBase()+Doxygen::htmlFileExtension, + g_globals.outputDir+Portable::pathSeparator()+m_dirDef->getOutputFileBase()+Doxygen::htmlFileExtension, relPathAsString(), TRUE, g_globals.dynSectionId, @@ -3625,7 +3625,7 @@ class DirContext::Private : public DefinitionContext<DirContext::Private> graph->writeGraph(t,GOF_EPS, EOF_LaTeX, g_globals.outputDir, - g_globals.outputDir+portable_pathSeparator()+m_dirDef->getOutputFileBase()+".tex", + g_globals.outputDir+Portable::pathSeparator()+m_dirDef->getOutputFileBase()+".tex", relPathAsString(), TRUE, g_globals.dynSectionId, @@ -4450,8 +4450,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private> } TemplateVariant isAnonymous() const { - QCString name = m_memberDef->name(); - return !name.isEmpty() && name.at(0)=='@'; + return m_memberDef->isAnonymous(); } TemplateVariant anonymousType() const { @@ -5027,7 +5026,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private> { cg->writeGraph(t,GOF_BITMAP,EOF_Html, g_globals.outputDir, - g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+Doxygen::htmlFileExtension, + g_globals.outputDir+Portable::pathSeparator()+m_memberDef->getOutputFileBase()+Doxygen::htmlFileExtension, relPathAsString(),TRUE,g_globals.dynSectionId ); } @@ -5036,7 +5035,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private> { cg->writeGraph(t,GOF_EPS,EOF_LaTeX, g_globals.outputDir, - g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+".tex", + g_globals.outputDir+Portable::pathSeparator()+m_memberDef->getOutputFileBase()+".tex", relPathAsString(),TRUE,g_globals.dynSectionId ); } @@ -5099,7 +5098,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private> { cg->writeGraph(t,GOF_BITMAP,EOF_Html, g_globals.outputDir, - g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+Doxygen::htmlFileExtension, + g_globals.outputDir+Portable::pathSeparator()+m_memberDef->getOutputFileBase()+Doxygen::htmlFileExtension, relPathAsString(),TRUE,g_globals.dynSectionId ); } @@ -5108,7 +5107,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private> { cg->writeGraph(t,GOF_EPS,EOF_LaTeX, g_globals.outputDir, - g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+".tex", + g_globals.outputDir+Portable::pathSeparator()+m_memberDef->getOutputFileBase()+".tex", relPathAsString(),TRUE,g_globals.dynSectionId ); } @@ -5369,7 +5368,7 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private> graph->writeGraph(t,GOF_BITMAP, EOF_Html, g_globals.outputDir, - g_globals.outputDir+portable_pathSeparator()+m_groupDef->getOutputFileBase()+Doxygen::htmlFileExtension, + g_globals.outputDir+Portable::pathSeparator()+m_groupDef->getOutputFileBase()+Doxygen::htmlFileExtension, relPathAsString(), TRUE, g_globals.dynSectionId); @@ -5380,7 +5379,7 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private> graph->writeGraph(t,GOF_EPS, EOF_LaTeX, g_globals.outputDir, - g_globals.outputDir+portable_pathSeparator()+m_groupDef->getOutputFileBase()+".tex", + g_globals.outputDir+Portable::pathSeparator()+m_groupDef->getOutputFileBase()+".tex", relPathAsString(), TRUE, g_globals.dynSectionId); @@ -5725,7 +5724,7 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private> const ClassDef *cd; for (sdi.toFirst();(cd=sdi.current());++sdi) { - if (cd->name().find('@')==-1 && + if (!cd->isAnonymous() && cd->isLinkableInProject() && cd->isEmbeddedInOuterScope() && cd->partOfGroups()==0) @@ -6543,7 +6542,7 @@ class NestingContext::Private : public GenericNodeListContext const NamespaceDef *nd; for (nli.toFirst();(nd=nli.current());++nli) { - if (nd->localName().find('@')==-1 && + if (!nd->isAnonymous() && (!rootOnly || nd->getOuterScope()==Doxygen::globalScope)) { bool hasChildren = namespaceHasVisibleChild(nd,addClasses,false,ClassDef::Class); @@ -8432,7 +8431,7 @@ TemplateVariant NamespaceMembersIndexContext::get(const char *name) const //------------------------------------------------------------------------ -//%% struct InheritanceGraph: a connected graph reprenting part of the overall inheritance tree +//%% struct InheritanceGraph: a connected graph representing part of the overall inheritance tree //%% { class InheritanceGraphContext::Private { @@ -8462,7 +8461,7 @@ class InheritanceGraphContext::Private /*GOF_BITMAP, EOF_Html,*/ g_globals.outputDir, - g_globals.outputDir+portable_pathSeparator()+"inherits"+Doxygen::htmlFileExtension, + g_globals.outputDir+Portable::pathSeparator()+"inherits"+Doxygen::htmlFileExtension, m_id); } return TemplateVariant(result.data(),TRUE); @@ -8799,7 +8798,7 @@ class AllMembersListContext::Private : public GenericNodeListContext { MemberDef *md=mi->memberDef; const ClassDef *cd=md->getClassDef(); - if (cd && !md->name().isEmpty() && md->name()[0]!='@') + if (cd && !md->isAnonymous()) { if ((cd->isLinkable() && md->isLinkable()) || (!cd->isArtificial() && !hideUndocMembers && @@ -10297,7 +10296,7 @@ void generateOutputViaTemplate() ctx->set("classMembersIndex",classMembersIndex.get()); //%% NamespaceMembersIndex namespaceMembersIndex: ctx->set("namespaceMembersIndex",namespaceMembersIndex.get()); - //%% SearchIndicaes searchindicaes + //%% SearchIndices searchIndices ctx->set("searchIndices",searchIndices.get()); //%% string space ctx->set("space"," "); diff --git a/src/declinfo.l b/src/declinfo.l index 0ac1516..af94569 100644 --- a/src/declinfo.l +++ b/src/declinfo.l @@ -262,7 +262,7 @@ void parseFuncDecl(const QCString &decl,const SrcLangExt lang,QCString &cl,QCStr struct yyguts_t *yyg = (struct yyguts_t*)g_yyscanner; #ifdef FLEX_DEBUG - yyset_debug(1,g_yyscanner); + declinfoYYset_debug(1,g_yyscanner); #endif printlex(yy_flex_debug, TRUE, __FILE__, NULL); @@ -290,7 +290,7 @@ void parseFuncDecl(const QCString &decl,const SrcLangExt lang,QCString &cl,QCStr // yyextra->type.data(),yyextra->scope.data(),yyextra->name.data(),yyextra->args.data()); int nb = yyextra->name.findRev('['); - if (nb!=-1 && yyextra->args.isEmpty()) // correct for [] in yyextra->name ambigity (due to Java return yyextra->type allowing []) + if (nb!=-1 && yyextra->args.isEmpty()) // correct for [] in yyextra->name ambiguity (due to Java return yyextra->type allowing []) { yyextra->args.prepend(yyextra->name.right(yyextra->name.length()-nb)); yyextra->name=yyextra->name.left(nb); @@ -347,11 +347,6 @@ void parseFuncDecl(const QCString &decl,const SrcLangExt lang,QCString &cl,QCStr return; } -//extern "C" { // some bogus code to keep the compiler happy -// int declinfoYYwrap() { return 1 ; } -// void declinfoYYdummy() { yy_flex_realloc(0,0); } -//} - #if 0 void dumpDecl(const char *s) { @@ -385,11 +380,5 @@ int main() } #endif -#if !defined(YY_FLEX_SUBMINOR_VERSION) -//---------------------------------------------------------------------------- -extern "C" { // some bogus code to keep the compiler happy - void declinfoYYdummy() { yy_flex_realloc(0,0); } -} -#endif #include "declinfo.l.h" diff --git a/src/defargs.l b/src/defargs.l index a213688..eb454ce 100644 --- a/src/defargs.l +++ b/src/defargs.l @@ -635,10 +635,4 @@ void stringToArgumentList(const char *argsString,ArgumentList& al,QCString *extr printlex(yy_flex_debug, FALSE, __FILE__, NULL); } -#if !defined(YY_FLEX_SUBMINOR_VERSION) -extern "C" { // some bogus code to keep the compiler happy - void defargsYYdummy() { yy_flex_realloc(0,0); } -} -#endif - #include "defargs.l.h" diff --git a/src/definition.cpp b/src/definition.cpp index 5b2136c..e18932e 100644 --- a/src/definition.cpp +++ b/src/definition.cpp @@ -51,22 +51,21 @@ class DefinitionImpl::IMPL { public: - IMPL(); ~IMPL(); void init(const char *df, const char *n); void setDefFileName(const QCString &df); - SectionDict *sectionDict; // dictionary of all sections, not accessible + SectionDict *sectionDict = 0; // dictionary of all sections, not accessible - MemberSDict *sourceRefByDict; - MemberSDict *sourceRefsDict; + MemberSDict *sourceRefByDict = 0; + MemberSDict *sourceRefsDict = 0; std::vector<ListItemInfo> xrefListItems; - GroupList *partOfGroups; + GroupList *partOfGroups = 0; - DocInfo *details; // not exported - DocInfo *inbodyDocs; // not exported - BriefInfo *brief; // not exported - BodyInfo *body; // not exported + DocInfo *details = 0; // not exported + DocInfo *inbodyDocs = 0; // not exported + BriefInfo *brief = 0; // not exported + BodyInfo *body = 0; // not exported QCString briefSignatures; QCString docSignatures; @@ -75,16 +74,17 @@ class DefinitionImpl::IMPL QCString qualifiedName; QCString ref; // reference to external documentation - bool hidden; - bool isArtificial; + bool hidden = FALSE; + bool isArtificial = FALSE; + bool isAnonymous = FALSE; - Definition *outerScope; // not owner + Definition *outerScope = 0; // not owner // where the item was defined QCString defFileName; QCString defFileExt; - SrcLangExt lang; + SrcLangExt lang = SrcLangExt_Unknown; QCString id; // clang unique id @@ -96,13 +96,6 @@ class DefinitionImpl::IMPL Cookie *cookie; }; -DefinitionImpl::IMPL::IMPL() - : sectionDict(0), sourceRefByDict(0), sourceRefsDict(0), - partOfGroups(0), - details(0), inbodyDocs(0), brief(0), body(0), hidden(FALSE), isArtificial(FALSE), - outerScope(0), lang(SrcLangExt_Unknown) -{ -} DefinitionImpl::IMPL::~IMPL() { @@ -304,7 +297,7 @@ DefinitionImpl::DefinitionImpl(const char *df,int dl,int dc, const char *d,bool isSymbol) { m_impl = new DefinitionImpl::IMPL; - m_impl->name = name; + setName(name); m_impl->defLine = dl; m_impl->defColumn = dc; m_impl->init(df,name); @@ -406,6 +399,9 @@ void DefinitionImpl::setName(const char *name) { if (name==0) return; m_impl->name = name; + m_impl->isAnonymous = m_impl->name.isEmpty() || + m_impl->name.at(0)=='@' || + m_impl->name.find("::@")!=-1; } void DefinitionImpl::setId(const char *id) @@ -532,7 +528,7 @@ void DefinitionImpl::writeDocAnchorsToTagFile(FTextStream &tagFile) const SectionInfo *si; for (;(si=sdi.current());++sdi) { - if (!si->generated && si->ref.isEmpty()) + if (!si->generated && si->ref.isEmpty() && !si->label.startsWith("autotoc_md")) { //printf("write an entry!\n"); if (definitionType()==TypeMember) tagFile << " "; @@ -748,12 +744,12 @@ class FilterCache // file already processed, get the results after filtering from the tmp file Debug::print(Debug::FilterOutput,0,"Reusing filter result for %s from %s at offset=%d size=%d\n", qPrint(fileName),qPrint(Doxygen::filterDBFileName),(int)item->filePos,(int)item->fileSize); - f = portable_fopen(Doxygen::filterDBFileName,"rb"); + f = Portable::fopen(Doxygen::filterDBFileName,"rb"); if (f) { bool success=TRUE; str.resize(item->fileSize+1); - if (portable_fseek(f,item->filePos,SEEK_SET)==-1) + if (Portable::fseek(f,item->filePos,SEEK_SET)==-1) { err("Failed to seek to position %d in filter database file %s\n",(int)item->filePos,qPrint(Doxygen::filterDBFileName)); success=FALSE; @@ -784,8 +780,8 @@ class FilterCache // filter file QCString cmd=filter+" \""+fileName+"\""; Debug::print(Debug::ExtCmd,0,"Executing popen(`%s`)\n",qPrint(cmd)); - f = portable_popen(cmd,"r"); - FILE *bf = portable_fopen(Doxygen::filterDBFileName,"a+b"); + f = Portable::popen(cmd,"r"); + FILE *bf = Portable::fopen(Doxygen::filterDBFileName,"a+b"); FilterCacheItem *item = new FilterCacheItem; item->filePos = m_endPos; if (bf==0) @@ -794,7 +790,7 @@ class FilterCache err("Error opening filter database file %s\n",qPrint(Doxygen::filterDBFileName)); str.addChar('\0'); delete item; - portable_pclose(f); + Portable::pclose(f); return FALSE; } // append the filtered output to the database file @@ -810,7 +806,7 @@ class FilterCache qPrint(Doxygen::filterDBFileName),bytesWritten,bytesRead); str.addChar('\0'); delete item; - portable_pclose(f); + Portable::pclose(f); fclose(bf); return FALSE; } @@ -825,14 +821,14 @@ class FilterCache qPrint(fileName),qPrint(Doxygen::filterDBFileName),(int)item->filePos,(int)item->fileSize); // update end of file position m_endPos += size; - portable_pclose(f); + Portable::pclose(f); fclose(bf); } else // no filtering { // normal file //printf("getFileContents(%s): no filter\n",qPrint(fileName)); - f = portable_fopen(fileName,"r"); + f = Portable::fopen(fileName,"r"); while (!feof(f)) { int bytesRead = fread(buf,1,blockSize,f); @@ -1001,7 +997,7 @@ bool readCodeFragment(const char *fileName, } result = transcodeCharacterStringToUTF8(result); if (!result.isEmpty() && result.at(result.length()-1)!='\n') result += "\n"; - //fprintf(stderr,"readCodeFragement(%d-%d)=%s\n",startLine,endLine,result.data()); + //printf("readCodeFragment(%d-%d)=%s\n",startLine,endLine,result.data()); return found; } @@ -1266,26 +1262,26 @@ void DefinitionImpl::writeInlineCode(OutputList &ol,const char *scopeName) const { //printf("Adding code fragment '%s' ext='%s'\n", // codeFragment.data(),m_impl->defFileExt.data()); - ParserInterface *pIntf = Doxygen::parserManager->getParser(m_impl->defFileExt); - pIntf->resetCodeParserState(); + CodeParserInterface &intf = Doxygen::parserManager->getCodeParser(m_impl->defFileExt); + intf.resetCodeParserState(); //printf("Read:\n'%s'\n\n",codeFragment.data()); const MemberDef *thisMd = 0; if (definitionType()==TypeMember) thisMd = dynamic_cast <const MemberDef*>(this); ol.startCodeFragment(); - pIntf->parseCode(ol, // codeOutIntf - scopeName, // scope - codeFragment, // input - m_impl->lang, // lang - FALSE, // isExample - 0, // exampleName - m_impl->body->fileDef, // fileDef - actualStart, // startLine - actualEnd, // endLine - TRUE, // inlineFragment - thisMd, // memberDef - TRUE // show line numbers - ); + intf.parseCode(ol, // codeOutIntf + scopeName, // scope + codeFragment, // input + m_impl->lang, // lang + FALSE, // isExample + 0, // exampleName + m_impl->body->fileDef, // fileDef + actualStart, // startLine + actualEnd, // endLine + TRUE, // inlineFragment + thisMd, // memberDef + TRUE // show line numbers + ); ol.endCodeFragment(); } } @@ -1610,7 +1606,7 @@ void DefinitionImpl::makePartOfGroup(GroupDef *gd) void DefinitionImpl::setRefItems(const std::vector<ListItemInfo> &sli) { - m_impl->xrefListItems = sli; + m_impl->xrefListItems.insert(m_impl->xrefListItems.end(), sli.cbegin(), sli.cend()); } void DefinitionImpl::mergeRefItems(Definition *d) @@ -2203,6 +2199,11 @@ QCString DefinitionImpl::name() const return m_impl->name; } +bool DefinitionImpl::isAnonymous() const +{ + return m_impl->isAnonymous; +} + int DefinitionImpl::getDefLine() const { return m_impl->defLine; diff --git a/src/definition.h b/src/definition.h index d458683..b3ece2c 100644 --- a/src/definition.h +++ b/src/definition.h @@ -112,6 +112,11 @@ class Definition : public DefinitionIntf /*! Returns the name of the definition */ virtual QCString name() const = 0; + /*! Returns TRUE iff this definition has an artificially generated name + * (typically starting with a @) that is used for nameless definitions + */ + virtual bool isAnonymous() const = 0; + /*! Returns the name of the definition as it appears in the output */ virtual QCString displayName(bool includeScope=TRUE) const = 0; diff --git a/src/definitionimpl.h b/src/definitionimpl.h index 036c875..2d8886d 100644 --- a/src/definitionimpl.h +++ b/src/definitionimpl.h @@ -32,6 +32,7 @@ class DefinitionImpl : virtual public Definition virtual bool isAlias() const { return FALSE; } virtual QCString name() const; + virtual bool isAnonymous() const; virtual QCString localName() const; virtual QCString qualifiedName() const; virtual QCString symbolName() const; @@ -142,6 +143,8 @@ class DefinitionAliasImpl : virtual public Definition virtual bool isAlias() const { return TRUE; } virtual QCString name() const { return m_def->name(); } + virtual bool isAnonymous() const + { return m_def->isAnonymous(); } virtual QCString localName() const { return m_def->localName(); } virtual QCString qualifiedName() const diff --git a/src/dia.cpp b/src/dia.cpp index 8dab5b0..4a00a17 100644 --- a/src/dia.cpp +++ b/src/dia.cpp @@ -29,7 +29,7 @@ void writeDiaGraphFromFile(const char *inFile,const char *outDir, const char *outFile,DiaOutputFormat format) { QCString absOutFile = outDir; - absOutFile+=portable_pathSeparator(); + absOutFile+=Portable::pathSeparator(); absOutFile+=outFile; // chdir to the output dir, so dot can find the font file. @@ -37,7 +37,7 @@ void writeDiaGraphFromFile(const char *inFile,const char *outDir, // go to the html output directory (i.e. path) QDir::setCurrent(outDir); //printf("Going to dir %s\n",QDir::currentDirPath().data()); - QCString diaExe = Config_getString(DIA_PATH)+"dia"+portable_commandExtension(); + QCString diaExe = Config_getString(DIA_PATH)+"dia"+Portable::commandExtension(); QCString diaArgs; QCString extension; diaArgs+="-n "; @@ -62,26 +62,26 @@ void writeDiaGraphFromFile(const char *inFile,const char *outDir, int exitCode; //printf("*** running: %s %s outDir:%s %s\n",diaExe.data(),diaArgs.data(),outDir,outFile); - portable_sysTimerStart(); - if ((exitCode=portable_system(diaExe,diaArgs,FALSE))!=0) + Portable::sysTimerStart(); + if ((exitCode=Portable::system(diaExe,diaArgs,FALSE))!=0) { err("Problems running %s. Check your installation or look typos in you dia file %s\n", diaExe.data(),inFile); - portable_sysTimerStop(); + Portable::sysTimerStop(); goto error; } - portable_sysTimerStop(); + Portable::sysTimerStop(); if ( (format==DIA_EPS) && (Config_getBool(USE_PDFLATEX)) ) { QCString epstopdfArgs(maxCmdLine); epstopdfArgs.sprintf("\"%s.eps\" --outfile=\"%s.pdf\"", outFile,outFile); - portable_sysTimerStart(); - if (portable_system("epstopdf",epstopdfArgs)!=0) + Portable::sysTimerStart(); + if (Portable::system("epstopdf",epstopdfArgs)!=0) { err("Problems running epstopdf. Check your TeX installation!\n"); } - portable_sysTimerStop(); + Portable::sysTimerStop(); } error: diff --git a/src/diagram.cpp b/src/diagram.cpp index 2dadc12..e8dc83a 100644 --- a/src/diagram.cpp +++ b/src/diagram.cpp @@ -107,7 +107,7 @@ class DiagramRowIterator : public QListIterator<DiagramRow> : QListIterator<DiagramRow>(d) {} }; -/** Class represeting the tree layout for the built-in class diagram. */ +/** Class representing the tree layout for the built-in class diagram. */ class TreeDiagram : public QList<DiagramRow> { public: @@ -308,7 +308,7 @@ QCString DiagramItem::label() const QCString result; if (!templSpec.isEmpty()) { - // we use classDef->name() here and not diplayName() in order + // we use classDef->name() here and not displayName() in order // to get the name used in the inheritance relation. QCString n = classDef->name(); if (/*n.right(2)=="-g" ||*/ n.right(2)=="-p") @@ -1338,14 +1338,14 @@ void ClassDiagram::writeFigure(FTextStream &output,const char *path, epstopdfArgs.sprintf("\"%s.eps\" --outfile=\"%s.pdf\"", epsBaseName.data(),epsBaseName.data()); //printf("Converting eps using '%s'\n",epstopdfArgs.data()); - portable_sysTimerStart(); - if (portable_system("epstopdf",epstopdfArgs)!=0) + Portable::sysTimerStart(); + if (Portable::system("epstopdf",epstopdfArgs)!=0) { err("Problems running epstopdf. Check your TeX installation!\n"); - portable_sysTimerStop(); + Portable::sysTimerStop(); return; } - portable_sysTimerStop(); + Portable::sysTimerStop(); } } diff --git a/src/dirdef.cpp b/src/dirdef.cpp index 5db8b99..ba792e1 100644 --- a/src/dirdef.cpp +++ b/src/dirdef.cpp @@ -94,7 +94,7 @@ static int g_dirCount=0; DirDefImpl::DirDefImpl(const char *path) : DefinitionImpl(path,1,1,path) { bool fullPathNames = Config_getBool(FULL_PATH_NAMES); - // get display name (stipping the paths mentioned in STRIP_FROM_PATH) + // get display name (stripping the paths mentioned in STRIP_FROM_PATH) // get short name (last part of path) m_shortName = path; m_diskName = path; diff --git a/src/docbookgen.cpp b/src/docbookgen.cpp index 7fe849a..083aac3 100644 --- a/src/docbookgen.cpp +++ b/src/docbookgen.cpp @@ -233,7 +233,7 @@ void DocbookCodeGenerator::writeLineNumber(const char *ref,const char *fileName, { m_t << l << " "; } - + m_col=0; } void DocbookCodeGenerator::setCurrentDoc(const Definition *,const char *,bool) { diff --git a/src/docbookvisitor.cpp b/src/docbookvisitor.cpp index ce3a845..43673de 100644 --- a/src/docbookvisitor.cpp +++ b/src/docbookvisitor.cpp @@ -36,6 +36,7 @@ #include "htmlentity.h" #include "emoji.h" #include "plantuml.h" +#include "growbuf.h" #if 0 #define DB_VIS_C DB_VIS_C1(m_t) @@ -49,6 +50,25 @@ #define DB_VIS_C2a(x,y) #endif +static QCString filterId(const char *s) +{ + static GrowBuf growBuf; + growBuf.clear(); + if (s==0) return ""; + const unsigned char *p=(const unsigned char *)s; + char c; + while ((c=*p++)) + { + switch (c) + { + case ':': growBuf.addStr("_1"); break; + default: growBuf.addChar(c); break; + } + } + growBuf.addChar(0); + return growBuf.get(); +} + void DocbookDocVisitor::visitCaption(const QList<DocNode> &children) { QListIterator<DocNode> cli(children); @@ -280,8 +300,8 @@ DB_VIS_C { case DocVerbatim::Code: // fall though m_t << "<literallayout><computeroutput>"; - Doxygen::parserManager->getParser(m_langExt) - ->parseCode(m_ci,s->context(),s->text(),langExt, + Doxygen::parserManager->getCodeParser(m_langExt) + .parseCode(m_ci,s->context(),s->text(),langExt, s->isExample(),s->exampleFile()); m_t << "</computeroutput></literallayout>"; break; @@ -374,7 +394,7 @@ void DocbookDocVisitor::visit(DocAnchor *anc) { DB_VIS_C if (m_hide) return; - m_t << "<anchor xml:id=\"_" << stripPath(anc->file()) << "_1" << anc->anchor() << "\"/>"; + m_t << "<anchor xml:id=\"_" << stripPath(anc->file()) << "_1" << filterId(anc->anchor()) << "\"/>"; } void DocbookDocVisitor::visit(DocInclude *inc) @@ -389,8 +409,8 @@ DB_VIS_C m_t << "<literallayout><computeroutput>"; QFileInfo cfi( inc->file() ); FileDef *fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() ); - Doxygen::parserManager->getParser(inc->extension()) - ->parseCode(m_ci,inc->context(), + Doxygen::parserManager->getCodeParser(inc->extension()) + .parseCode(m_ci,inc->context(), inc->text(), langExt, inc->isExample(), @@ -401,8 +421,8 @@ DB_VIS_C break; case DocInclude::Include: m_t << "<literallayout><computeroutput>"; - Doxygen::parserManager->getParser(inc->extension()) - ->parseCode(m_ci,inc->context(), + Doxygen::parserManager->getCodeParser(inc->extension()) + .parseCode(m_ci,inc->context(), inc->text(), langExt, inc->isExample(), @@ -421,8 +441,8 @@ DB_VIS_C break; case DocInclude::Snippet: m_t << "<literallayout><computeroutput>"; - Doxygen::parserManager->getParser(inc->extension()) - ->parseCode(m_ci, + Doxygen::parserManager->getCodeParser(inc->extension()) + .parseCode(m_ci, inc->context(), extractBlock(inc->text(),inc->blockId()), langExt, @@ -436,8 +456,8 @@ DB_VIS_C QFileInfo cfi( inc->file() ); FileDef *fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() ); m_t << "<literallayout><computeroutput>"; - Doxygen::parserManager->getParser(inc->extension()) - ->parseCode(m_ci, + Doxygen::parserManager->getCodeParser(inc->extension()) + .parseCode(m_ci, inc->context(), extractBlock(inc->text(),inc->blockId()), langExt, @@ -489,8 +509,8 @@ DB_VIS_C fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() ); } - Doxygen::parserManager->getParser(locLangExt) - ->parseCode(m_ci,op->context(), + Doxygen::parserManager->getCodeParser(locLangExt) + .parseCode(m_ci,op->context(), op->text(),langExt,op->isExample(), op->exampleFile(), fd, // fileDef @@ -550,7 +570,7 @@ void DocbookDocVisitor::visit(DocCite *cite) { DB_VIS_C if (m_hide) return; - if (!cite->file().isEmpty()) startLink(cite->file(),cite->anchor()); + if (!cite->file().isEmpty()) startLink(cite->file(),filterId(cite->anchor())); filter(cite->text()); if (!cite->file().isEmpty()) endLink(); } diff --git a/src/docgroup.h b/src/docgroup.h index 47a0a3e..3ccef0d 100644 --- a/src/docgroup.h +++ b/src/docgroup.h @@ -42,9 +42,9 @@ class DocGroup private: int findExistingGroup(int &groupId,const MemberGroupInfo *info); - int m_openCount; + int m_openCount = 0; QCString m_memberGroupHeader; - int m_memberGroupId; + int m_memberGroupId = 0; QCString m_memberGroupRelates; QCString m_memberGroupDocs; std::vector<Grouping> m_autoGroupStack; diff --git a/src/docparser.cpp b/src/docparser.cpp index a22087e..b1e2486 100644 --- a/src/docparser.cpp +++ b/src/docparser.cpp @@ -369,12 +369,12 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type, bool epstopdfArgs.sprintf("\"%s/%s.eps\" --outfile=\"%s/%s.pdf\"", outputDir.data(), baseName.data(), outputDir.data(), baseName.data()); - portable_sysTimerStart(); - if (portable_system("epstopdf",epstopdfArgs)!=0) + Portable::sysTimerStart(); + if (Portable::system("epstopdf",epstopdfArgs)!=0) { err("Problems running epstopdf. Check your TeX installation!\n"); } - portable_sysTimerStop(); + Portable::sysTimerStop(); return baseName; } } @@ -803,14 +803,15 @@ static bool findDocsForMemberOrCompound(const char *commandName, inline void errorHandleDefaultToken(DocNode *parent,int tok, QList<DocNode> &children,const char *txt) { + const char *cmd_start = "\\"; switch (tok) { case TK_COMMAND_AT: - // fall through + cmd_start = "@"; case TK_COMMAND_BS: children.append(new DocWord(parent,TK_COMMAND_CHAR(tok) + g_token->name)); warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a %s", - qPrint(TK_COMMAND_CHAR(tok) + g_token->name), txt); + qPrint(cmd_start + g_token->name),txt); break; case TK_SYMBOL: warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found found as part of a %s", @@ -1817,7 +1818,7 @@ static int internalValidatingParseDoc(DocNode *parent,QList<DocNode> &children, static void readTextFileByName(const QCString &file,QCString &text) { - if (portable_isAbsolutePath(file.data())) + if (Portable::isAbsolutePath(file.data())) { QFileInfo fi(file); if (fi.exists()) @@ -1830,7 +1831,7 @@ static void readTextFileByName(const QCString &file,QCString &text) char *s=examplePathList.first(); while (s) { - QCString absFileName = QCString(s)+portable_pathSeparator()+file; + QCString absFileName = QCString(s)+Portable::pathSeparator()+file; QFileInfo fi(absFileName); if (fi.exists()) { @@ -2312,6 +2313,7 @@ void DocSecRefList::parse() { if (tok==TK_COMMAND_AT || tok == TK_COMMAND_BS) { + const char *cmd_start = (tok==TK_COMMAND_AT ? "@" : "\\"); switch (Mappers::cmdMapper->map(g_token->name)) { case CMD_SECREFITEM: @@ -2339,7 +2341,7 @@ void DocSecRefList::parse() goto endsecreflist; default: warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\secreflist", - qPrint(g_token->name)); + qPrint(cmd_start + g_token->name)); goto endsecreflist; } } @@ -2646,9 +2648,11 @@ QCString DocLink::parse(bool isJavaLink,bool isXmlLink) { if (!defaultHandleToken(this,tok,m_children,FALSE)) { + const char *cmd_start = "\\"; switch (tok) { case TK_COMMAND_AT: + cmd_start = "@"; // fall through case TK_COMMAND_BS: switch (Mappers::cmdMapper->map(g_token->name)) @@ -2661,7 +2665,7 @@ QCString DocLink::parse(bool isJavaLink,bool isXmlLink) goto endlink; default: warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\link", - qPrint(g_token->name)); + qPrint(cmd_start + g_token->name)); break; } break; @@ -2890,7 +2894,7 @@ bool DocImage::isSVG() const QCString locName = m_url.isEmpty() ? m_name : m_url; int len = locName.length(); int fnd = locName.find('?'); // ignore part from ? until end - if (fnd!=-1) fnd=len; + if (fnd==-1) fnd=len; return fnd>=4 && locName.mid(fnd-4,4)==".svg"; } @@ -3793,9 +3797,11 @@ int DocHtmlDescTitle::parse() { if (!defaultHandleToken(this,tok,m_children)) { + const char *cmd_start = "\\"; switch (tok) { case TK_COMMAND_AT: + cmd_start = "@"; // fall through case TK_COMMAND_BS: { @@ -3866,8 +3872,8 @@ int DocHtmlDescTitle::parse() break; default: - warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command \\%s found as part of a <dt> tag", - qPrint(g_token->name)); + warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s found as part of a <dt> tag", + qPrint(cmd_start + g_token->name)); } } break; @@ -4562,7 +4568,7 @@ void DocSimpleSect::appendLinkWord(const QCString &word) { p = (DocPara *)m_children.getLast(); - // Comma-seperate <seealso> links. + // Comma-separate <seealso> links. p->injectToken(TK_WORD,","); p->injectToken(TK_WHITESPACE," "); } diff --git a/src/docparser.h b/src/docparser.h index 02fe135..5999eae 100644 --- a/src/docparser.h +++ b/src/docparser.h @@ -173,10 +173,10 @@ class DocNode protected: /*! Sets whether or not this item is inside a preformatted section */ void setInsidePreformatted(bool p) { m_insidePre = p; } - DocNode *m_parent; + DocNode *m_parent = 0; private: - bool m_insidePre; + bool m_insidePre = false; }; /** Default accept implementation for compound nodes in the abstract @@ -294,7 +294,7 @@ class DocURL : public DocNode private: QCString m_url; - bool m_isEmail; + bool m_isEmail = false; }; /** Node representing a line break */ @@ -401,9 +401,9 @@ class DocStyleChange : public DocNode const HtmlAttribList &attribs() const { return m_attribs; } private: - uint m_position; - Style m_style; - bool m_enable; + uint m_position = 0; + Style m_style = Bold; + bool m_enable = false; HtmlAttribList m_attribs; }; @@ -488,7 +488,7 @@ class DocSymbol : public DocNode static SymType decodeSymbol(const QCString &symName); private: - SymType m_symbol; + SymType m_symbol = Sym_Unknown; }; /** Node representing a n emoji */ @@ -503,7 +503,7 @@ class DocEmoji : public DocNode private: QCString m_symName; - int m_index; + int m_index = 0; }; /** Node representing some amount of white space */ @@ -562,12 +562,12 @@ class DocVerbatim : public DocNode private: QCString m_context; QCString m_text; - Type m_type; - bool m_isExample; + Type m_type = Code; + bool m_isExample = false; QCString m_exampleFile; QCString m_relPath; QCString m_lang; - bool m_isBlock; + bool m_isBlock = false; QCString m_width; QCString m_height; QList<DocNode> m_children; @@ -610,9 +610,9 @@ class DocInclude : public DocNode QCString m_file; QCString m_context; QCString m_text; - Type m_type; - bool m_isExample; - bool m_isBlock; + Type m_type = Include; + bool m_isExample = false; + bool m_isBlock = false; QCString m_exampleFile; QCString m_blockId; }; @@ -656,15 +656,15 @@ class DocIncOperator : public DocNode void parse(); private: - Type m_type; - int m_line; - bool m_showLineNo; + Type m_type = Line; + int m_line = 0; + bool m_showLineNo = false; QCString m_text; QCString m_pattern; QCString m_context; - bool m_isFirst; - bool m_isLast; - bool m_isExample; + bool m_isFirst = false; + bool m_isLast = false; + bool m_isExample = false; QCString m_exampleFile; QCString m_includeFileName; }; @@ -686,7 +686,7 @@ class DocFormula : public DocNode QCString m_name; QCString m_text; QCString m_relPath; - int m_id; + int m_id = 0; }; /** Node representing an entry in the index. */ @@ -704,8 +704,8 @@ class DocIndexEntry : public DocNode private: QCString m_entry; - const Definition *m_scope; - const MemberDef *m_member; + const Definition *m_scope = 0; + const MemberDef *m_member = 0; }; //----------------------------------------------------------------------- @@ -722,9 +722,9 @@ class DocAutoList : public CompAccept<DocAutoList> int parse(); private: - int m_indent; - bool m_isEnumList; - int m_depth; + int m_indent = 0; + bool m_isEnumList = false; + int m_depth = 0; }; /** Node representing an item of a auto list */ @@ -737,8 +737,8 @@ class DocAutoListItem : public CompAccept<DocAutoListItem> int parse(); private: - int m_indent; - int m_itemNum; + int m_indent = 0; + int m_itemNum = 0; }; @@ -770,7 +770,7 @@ class DocXRefItem : public CompAccept<DocXRefItem> bool parse(); private: - int m_id; + int m_id = 0; QCString m_key; QCString m_file; QCString m_anchor; @@ -801,12 +801,12 @@ class DocImage : public CompAccept<DocImage> private: HtmlAttribList m_attribs; QCString m_name; - Type m_type; + Type m_type = Html; QCString m_width; QCString m_height; QCString m_relPath; QCString m_url; - bool m_inlineImage; + bool m_inlineImage = false; }; /** Node representing a dot file */ @@ -929,8 +929,8 @@ class DocRef : public CompAccept<DocRef> private: enum RefType { Unknown, Anchor, Section, Table }; - RefType m_refType; - bool m_isSubPage; + RefType m_refType = Unknown; + bool m_isSubPage = false; QCString m_file; QCString m_relPath; QCString m_ref; @@ -986,7 +986,7 @@ class DocHtmlHeader : public CompAccept<DocHtmlHeader> int parse(); private: - int m_level; + int m_level = 0; HtmlAttribList m_attribs; }; @@ -1033,7 +1033,7 @@ class DocSection : public CompAccept<DocSection> int parse(); private: - int m_level; + int m_level = 0; QCString m_id; QCString m_title; QCString m_anchor; @@ -1117,7 +1117,7 @@ class DocHtmlList : public CompAccept<DocHtmlList> int parseXml(); private: - Type m_type; + Type m_type = Unordered; HtmlAttribList m_attribs; }; @@ -1143,8 +1143,8 @@ class DocSimpleSect : public CompAccept<DocSimpleSect> bool hasTitle() const { return m_title->hasTitle(); } private: - Type m_type; - DocTitle * m_title; + Type m_type = Unknown; + DocTitle * m_title = 0; }; /** Node representing a separator between two simple sections of the @@ -1183,9 +1183,9 @@ class DocParamSect : public CompAccept<DocParamSect> bool hasTypeSpecifier() const { return m_hasTypeSpecifier; } private: - Type m_type; - bool m_hasInOutSpecifier; - bool m_hasTypeSpecifier; + Type m_type = Unknown; + bool m_hasInOutSpecifier = false; + bool m_hasTypeSpecifier = false; }; /** Node representing a paragraph in the documentation tree */ @@ -1230,8 +1230,8 @@ class DocPara : public CompAccept<DocPara> private: QCString m_sectionId; - bool m_isFirst; - bool m_isLast; + bool m_isFirst = false; + bool m_isLast = false; HtmlAttribList m_attribs; }; @@ -1271,10 +1271,10 @@ class DocParamList : public DocNode QList<DocPara> m_paragraphs; QList<DocNode> m_params; QList<DocNode> m_paramTypes; - DocParamSect::Type m_type; - DocParamSect::Direction m_dir; - bool m_isFirst; - bool m_isLast; + DocParamSect::Type m_type = DocParamSect::Unknown; + DocParamSect::Direction m_dir = DocParamSect::Unspecified; + bool m_isFirst = false; + bool m_isLast = false; }; /** Node representing a simple list item */ @@ -1294,7 +1294,7 @@ class DocSimpleListItem : public DocNode } private: - DocPara *m_paragraph; + DocPara *m_paragraph = 0; }; /** Node representing a HTML list item */ @@ -1311,7 +1311,7 @@ class DocHtmlListItem : public CompAccept<DocHtmlListItem> private: HtmlAttribList m_attribs; - int m_itemNum; + int m_itemNum = 0; }; /** Node representing a HTML description data */ @@ -1355,12 +1355,12 @@ class DocHtmlCell : public CompAccept<DocHtmlCell> private: void setRowIndex(int idx) { m_rowIdx = idx; } void setColumnIndex(int idx) { m_colIdx = idx; } - bool m_isHeading; - bool m_isFirst; - bool m_isLast; + bool m_isHeading = false; + bool m_isFirst = false; + bool m_isLast = false; HtmlAttribList m_attribs; - int m_rowIdx; - int m_colIdx; + int m_rowIdx = -1; + int m_colIdx = -1; }; /** Node representing a HTML table caption */ @@ -1377,7 +1377,7 @@ class DocHtmlCaption : public CompAccept<DocHtmlCaption> private: HtmlAttribList m_attribs; - bool m_hasCaptionId; + bool m_hasCaptionId = false; QCString m_file; QCString m_anchor; }; @@ -1414,8 +1414,8 @@ class DocHtmlRow : public CompAccept<DocHtmlRow> private: void setRowIndex(int idx) { m_rowIdx = idx; } HtmlAttribList m_attribs; - int m_visibleCells; - int m_rowIdx; + int m_visibleCells = -1; + int m_rowIdx = -1; }; /** Node representing a HTML table */ @@ -1442,9 +1442,9 @@ class DocHtmlTable : public CompAccept<DocHtmlTable> private: void computeTableGrid(); - DocHtmlCaption *m_caption; + DocHtmlCaption *m_caption = 0; HtmlAttribList m_attribs; - int m_numCols; + int m_numCols = 0; }; /** Node representing an HTML blockquote */ @@ -1483,8 +1483,8 @@ class DocRoot : public CompAccept<DocRoot> bool isEmpty() const { return m_children.isEmpty(); } private: - bool m_indent; - bool m_singleLine; + bool m_indent = false; + bool m_singleLine = false; }; diff --git a/src/doctokenizer.h b/src/doctokenizer.h index f89069c..badf23e 100644 --- a/src/doctokenizer.h +++ b/src/doctokenizer.h @@ -80,8 +80,8 @@ struct TokenInfo // comment blocks // list token info - bool isEnumList; - int indent; + bool isEnumList = false; + int indent = 0; // sections QCString sectionId; @@ -94,22 +94,22 @@ struct TokenInfo QCString verb; // xrefitem - int id; + int id = -1; // html tag HtmlAttribList attribs; - bool endTag; - bool emptyTag; + bool endTag = false; + bool emptyTag = false; // whitespace QCString chars; // url - bool isEMailAddr; + bool isEMailAddr = false; // param attributes enum ParamDir { In=1, Out=2, InOut=3, Unspecified=0 }; - ParamDir paramDir; + ParamDir paramDir = Unspecified; }; // globals diff --git a/src/doctokenizer.l b/src/doctokenizer.l index 59a0a9d..bf9ccf6 100644 --- a/src/doctokenizer.l +++ b/src/doctokenizer.l @@ -329,8 +329,8 @@ static int yyread(char *buf,int max_size) //-------------------------------------------------------------------------- //#define REAL_YY_DECL int doctokenizerYYlex (void) -//#define YY_DECL static int local_doctokinizer(void) -//#define LOCAL_YY_DECL local_doctokinizer() +//#define YY_DECL static int local_doctokenizer(void) +//#define LOCAL_YY_DECL local_doctokenizer() %} @@ -679,7 +679,7 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV} <St_Para,St_HtmlOnly,St_ManOnly,St_LatexOnly,St_RtfOnly,St_XmlOnly,St_DbOnly>"$("{ID}"("{ID}"))" { /* environment variable */ QCString name = &yytext[2]; name = name.left(name.length()-1); - QCString value = portable_getenv(name); + QCString value = Portable::getenv(name); for (int i=value.length()-1;i>=0;i--) unput(value.at(i)); } <St_Para>{HTMLTAG} { /* html tag */ @@ -1616,10 +1616,5 @@ void doctokenizerYYendAutoList() // printlex(yy_flex_debug, FALSE, __FILE__, g_fileName); // return retval; //} -#if !defined(YY_FLEX_SUBMINOR_VERSION) -extern "C" { // some bogus code to keep the compiler happy - void doctokenizerYYdummy() { yy_flex_realloc(0,0); } -} -#endif #include "doctokenizer.l.h" diff --git a/src/dot.cpp b/src/dot.cpp index 5ad3916..4e4c4bc 100644 --- a/src/dot.cpp +++ b/src/dot.cpp @@ -38,12 +38,12 @@ static QCString g_dotFontPath; static void setDotFontPath(const char *path) { ASSERT(g_dotFontPath.isEmpty()); - g_dotFontPath = portable_getenv("DOTFONTPATH"); + g_dotFontPath = Portable::getenv("DOTFONTPATH"); QCString newFontPath = Config_getString(DOT_FONTPATH); QCString spath = path; if (!newFontPath.isEmpty() && !spath.isEmpty()) { - newFontPath.prepend(spath+portable_pathListSeparator()); + newFontPath.prepend(spath+Portable::pathListSeparator()); } else if (newFontPath.isEmpty() && !spath.isEmpty()) { @@ -51,21 +51,21 @@ static void setDotFontPath(const char *path) } else { - portable_unsetenv("DOTFONTPATH"); + Portable::unsetenv("DOTFONTPATH"); return; } - portable_setenv("DOTFONTPATH",newFontPath); + Portable::setenv("DOTFONTPATH",newFontPath); } static void unsetDotFontPath() { if (g_dotFontPath.isEmpty()) { - portable_unsetenv("DOTFONTPATH"); + Portable::unsetenv("DOTFONTPATH"); } else { - portable_setenv("DOTFONTPATH",g_dotFontPath); + Portable::setenv("DOTFONTPATH",g_dotFontPath); } g_dotFontPath=""; } @@ -183,7 +183,7 @@ bool DotManager::run() const setDotFontPath(Config_getString(DOCBOOK_OUTPUT)); setPath=TRUE; } - portable_sysTimerStart(); + Portable::sysTimerStart(); // fill work queue with dot operations DotRunner *dr; int prev=1; @@ -211,7 +211,7 @@ bool DotManager::run() const msg("Running dot for graph %d/%d\n",prev,numDotRuns); prev++; } - portable_sleep(100); + Portable::sleep(100); } while ((int)numDotRuns>=prev) { @@ -229,7 +229,7 @@ bool DotManager::run() const m_workers.at(i)->wait(); } } - portable_sysTimerStop(); + Portable::sysTimerStop(); if (setPath) { unsetDotFontPath(); diff --git a/src/dotcallgraph.cpp b/src/dotcallgraph.cpp index 15d408a..b024f09 100644 --- a/src/dotcallgraph.cpp +++ b/src/dotcallgraph.cpp @@ -212,6 +212,11 @@ bool DotCallGraph::isTrivial() const bool DotCallGraph::isTooBig() const { - int numNodes = m_startNode->children() ? m_startNode->children()->count() : 0; - return numNodes>=DOT_GRAPH_MAX_NODES; + return numNodes()>=DOT_GRAPH_MAX_NODES; } + +int DotCallGraph::numNodes() const +{ + return m_startNode->children() ? m_startNode->children()->count() : 0; +} + diff --git a/src/dotcallgraph.h b/src/dotcallgraph.h index c96b9cf..bba976c 100644 --- a/src/dotcallgraph.h +++ b/src/dotcallgraph.h @@ -28,6 +28,7 @@ class DotCallGraph : public DotGraph ~DotCallGraph(); bool isTrivial() const; bool isTooBig() const; + int numNodes() const; QCString writeGraph(FTextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const char *path,const char *fileName, const char *relPath,bool writeImageMap=TRUE, diff --git a/src/dotclassgraph.cpp b/src/dotclassgraph.cpp index 3f5d228..da272b4 100644 --- a/src/dotclassgraph.cpp +++ b/src/dotclassgraph.cpp @@ -420,13 +420,18 @@ bool DotClassGraph::isTrivial() const bool DotClassGraph::isTooBig() const { + return numNodes()>=DOT_GRAPH_MAX_NODES; +} + +int DotClassGraph::numNodes() const +{ int numNodes = 0; numNodes+= m_startNode->children() ? m_startNode->children()->count() : 0; if (m_graphType==Inheritance) { numNodes+= m_startNode->parents() ? m_startNode->parents()->count() : 0; } - return numNodes>=DOT_GRAPH_MAX_NODES; + return numNodes; } DotClassGraph::~DotClassGraph() diff --git a/src/dotclassgraph.h b/src/dotclassgraph.h index b3b9291..1874f54 100644 --- a/src/dotclassgraph.h +++ b/src/dotclassgraph.h @@ -28,6 +28,7 @@ public: ~DotClassGraph(); bool isTrivial() const; bool isTooBig() const; + int numNodes() const; QCString writeGraph(FTextStream &t,GraphOutputFormat gf,EmbeddedOutputFormat ef, const char *path, const char *fileName, const char *relPath, bool TBRank=TRUE,bool imageMap=TRUE,int graphId=-1); diff --git a/src/dotdirdeps.cpp b/src/dotdirdeps.cpp index 98c7ca7..c70128c 100644 --- a/src/dotdirdeps.cpp +++ b/src/dotdirdeps.cpp @@ -140,8 +140,8 @@ void writeDotDirDepGraph(FTextStream &t,const DirDef *dd,bool linkRelations) for (udi.toFirst();(udir=udi.current());++udi) // foreach used dir { const DirDef *usedDir=udir->dir(); - if ((dir!=dd || !udir->inherited()) && // only show direct dependendies for this dir - (usedDir!=dd || !udir->inherited()) && // only show direct dependendies for this dir + if ((dir!=dd || !udir->inherited()) && // only show direct dependencies for this dir + (usedDir!=dd || !udir->inherited()) && // only show direct dependencies for this dir !usedDir->isParentOf(dir) && // don't point to own parent dirsInGraph.find(usedDir->getOutputFileBase())) // only point to nodes that are in the graph { diff --git a/src/dotdirdeps.h b/src/dotdirdeps.h index f5eef65..a71e8f1 100644 --- a/src/dotdirdeps.h +++ b/src/dotdirdeps.h @@ -43,9 +43,9 @@ class DotDirDeps : public DotGraph virtual QCString getImgAltText() const; private: - const DirDef *m_dir; + const DirDef *m_dir = 0; - bool m_linkRelations; + bool m_linkRelations = false; }; #endif diff --git a/src/dotgraph.cpp b/src/dotgraph.cpp index bbffaf0..9b7ddb7 100644 --- a/src/dotgraph.cpp +++ b/src/dotgraph.cpp @@ -117,7 +117,7 @@ QCString DotGraph::writeGraph( EmbeddedOutputFormat ef, // html, latex, ... const char* path, // output folder const char* fileName, // name of the code file (for code patcher) - const char* relPath, // output folder relativ to code file + const char* relPath, // output folder relative to code file bool generateImageMap, // in case of bitmap, shall there be code generated? int graphId) // number of this graph in the current code, used in svg code { diff --git a/src/dotgraph.h b/src/dotgraph.h index 0eda3a8..edba009 100644 --- a/src/dotgraph.h +++ b/src/dotgraph.h @@ -74,22 +74,22 @@ class DotGraph QCString relImgName() const { return m_relPath + imgName(); } // the following variables are used while writing the graph to a .dot file - GraphOutputFormat m_graphFormat; - EmbeddedOutputFormat m_textFormat; + GraphOutputFormat m_graphFormat = GOF_BITMAP; + EmbeddedOutputFormat m_textFormat = EOF_Html; QDir m_dir; QCString m_fileName; QCString m_relPath; - bool m_generateImageMap; - int m_graphId; + bool m_generateImageMap = false; + int m_graphId = 0; QCString m_absPath; QCString m_baseName; QGString m_theGraph; - bool m_regenerate; - bool m_doNotAddImageToIndex; - bool m_noDivTag; - bool m_zoomable; - bool m_urlOnly; + bool m_regenerate = false; + bool m_doNotAddImageToIndex = false; + bool m_noDivTag = false; + bool m_zoomable = true; + bool m_urlOnly = false; private: DotGraph(const DotGraph &); diff --git a/src/dotgroupcollaboration.cpp b/src/dotgroupcollaboration.cpp index f9a11e7..0a56460 100644 --- a/src/dotgroupcollaboration.cpp +++ b/src/dotgroupcollaboration.cpp @@ -42,6 +42,16 @@ DotGroupCollaboration::DotGroupCollaboration(const GroupDef* gd) DotGroupCollaboration::~DotGroupCollaboration() { + // delete all created Nodes saved in m_usedNodes:QDict + if(m_usedNodes != NULL) + { + QDictIterator<DotNode> it(*m_usedNodes); + for(;it.current(); ++it) + { + delete it.current(); + } + } + delete m_usedNodes; } diff --git a/src/dotincldepgraph.cpp b/src/dotincldepgraph.cpp index 23588db..05a96d9 100644 --- a/src/dotincldepgraph.cpp +++ b/src/dotincldepgraph.cpp @@ -213,8 +213,12 @@ bool DotInclDepGraph::isTrivial() const bool DotInclDepGraph::isTooBig() const { - int numNodes = m_startNode->children() ? m_startNode->children()->count() : 0; - return numNodes>=Config_getInt(DOT_GRAPH_MAX_NODES); + return numNodes()>=Config_getInt(DOT_GRAPH_MAX_NODES); +} + +int DotInclDepGraph::numNodes() const +{ + return m_startNode->children() ? m_startNode->children()->count() : 0; } void DotInclDepGraph::writeXML(FTextStream &t) diff --git a/src/dotincldepgraph.h b/src/dotincldepgraph.h index b664ccb..5807ce8 100644 --- a/src/dotincldepgraph.h +++ b/src/dotincldepgraph.h @@ -32,6 +32,7 @@ class DotInclDepGraph : public DotGraph bool writeImageMap=TRUE,int graphId=-1); bool isTrivial() const; bool isTooBig() const; + int numNodes() const; void writeXML(FTextStream &t); void writeDocbook(FTextStream &t); diff --git a/src/dotrunner.cpp b/src/dotrunner.cpp index a97d8af..fbfeaca 100644 --- a/src/dotrunner.cpp +++ b/src/dotrunner.cpp @@ -34,7 +34,7 @@ // support the PNG format, we need to check the result. static void checkPngResult(const char *imgName) { - FILE *f = portable_fopen(imgName,"rb"); + FILE *f = Portable::fopen(imgName,"rb"); if (f) { char data[4]; @@ -115,7 +115,7 @@ bool DotRunner::readBoundingBox(const char *fileName,int *width,int *height,bool { const char *bb = isEps ? "%%PageBoundingBox:" : "/MediaBox ["; int bblen = strlen(bb); - FILE *f = portable_fopen(fileName,"rb"); + FILE *f = Portable::fopen(fileName,"rb"); if (!f) { //printf("readBoundingBox: could not open %s\n",fileName); @@ -191,14 +191,14 @@ bool DotRunner::run() dotArgs+=' '; dotArgs+=s->args.data(); } - if ((exitCode=portable_system(m_dotExe.data(),dotArgs,FALSE))!=0) goto error; + if ((exitCode=Portable::system(m_dotExe.data(),dotArgs,FALSE))!=0) goto error; } else { for (li.toFirst();(s=li.current());++li) { dotArgs=QCString("\"")+m_file.data()+"\" "+s->args.data(); - if ((exitCode=portable_system(m_dotExe.data(),dotArgs,FALSE))!=0) goto error; + if ((exitCode=Portable::system(m_dotExe.data(),dotArgs,FALSE))!=0) goto error; } } @@ -214,7 +214,7 @@ bool DotRunner::run() { if (!resetPDFSize(width,height,getBaseNameOfOutput(s->output.data()))) goto error; dotArgs=QCString("\"")+m_file.data()+"\" "+s->args.data(); - if ((exitCode=portable_system(m_dotExe.data(),dotArgs,FALSE))!=0) goto error; + if ((exitCode=Portable::system(m_dotExe.data(),dotArgs,FALSE))!=0) goto error; } } @@ -228,14 +228,14 @@ bool DotRunner::run() if (m_cleanUp) { //printf("removing dot file %s\n",m_file.data()); - portable_unlink(m_file.data()); + Portable::unlink(m_file.data()); } // create checksum file if (!m_md5Hash.isEmpty()) { QCString md5Name = getBaseNameOfOutput(m_file.data()) + ".md5"; - FILE *f = portable_fopen(md5Name,"w"); + FILE *f = Portable::fopen(md5Name,"w"); if (f) { fwrite(m_md5Hash.data(),1,32,f); diff --git a/src/doxygen.cpp b/src/doxygen.cpp index 4f4d13b..4c489d2 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -75,10 +75,12 @@ #include "searchindex.h" #include "parserintf.h" #include "htags.h" +#include "pycode.h" #include "pyscanner.h" +#include "fortrancode.h" #include "fortranscanner.h" -#include "xmlscanner.h" -#include "sqlscanner.h" +#include "xmlcode.h" +#include "sqlcode.h" #include "tclscanner.h" #include "code.h" #include "objcache.h" @@ -171,6 +173,7 @@ bool Doxygen::generatingXmlOutput = FALSE; bool Doxygen::markdownSupport = TRUE; GenericsSDict *Doxygen::genericsDict; DocGroup Doxygen::docGroup; +Preprocessor *Doxygen::preprocessor = 0; // locally accessible globals static std::unordered_map< std::string, const Entry* > g_classEntries; @@ -419,9 +422,9 @@ static STLInfo g_stlinfo[] = { 0, 0, 0, 0, 0, 0, 0, FALSE, FALSE } }; -static void addSTLMember(const std::unique_ptr<Entry> &root,const char *type,const char *name) +static void addSTLMember(const std::shared_ptr<Entry> &root,const char *type,const char *name) { - std::unique_ptr<Entry> memEntry = std::make_unique<Entry>(); + std::shared_ptr<Entry> memEntry = std::make_shared<Entry>(); memEntry->name = name; memEntry->type = type; memEntry->protection = Public; @@ -432,9 +435,9 @@ static void addSTLMember(const std::unique_ptr<Entry> &root,const char *type,con root->moveToSubEntryAndKeep(memEntry); } -static void addSTLIterator(const std::unique_ptr<Entry> &classEntry,const char *name) +static void addSTLIterator(const std::shared_ptr<Entry> &classEntry,const char *name) { - std::unique_ptr<Entry> iteratorClassEntry = std::make_unique<Entry>(); + std::shared_ptr<Entry> iteratorClassEntry = std::make_shared<Entry>(); iteratorClassEntry->fileName = "[STL]"; iteratorClassEntry->startLine = 1; iteratorClassEntry->name = name; @@ -445,14 +448,14 @@ static void addSTLIterator(const std::unique_ptr<Entry> &classEntry,const char * classEntry->moveToSubEntryAndKeep(iteratorClassEntry); } -static void addSTLClass(const std::unique_ptr<Entry> &root,const STLInfo *info) +static void addSTLClass(const std::shared_ptr<Entry> &root,const STLInfo *info) { //printf("Adding STL class %s\n",info->className); QCString fullName = info->className; fullName.prepend("std::"); // add fake Entry for the class - std::unique_ptr<Entry> classEntry = std::make_unique<Entry>(); + std::shared_ptr<Entry> classEntry = std::make_shared<Entry>(); classEntry->fileName = "[STL]"; classEntry->startLine = 1; classEntry->name = fullName; @@ -487,9 +490,9 @@ static void addSTLClass(const std::unique_ptr<Entry> &root,const STLInfo *info) addSTLMember(classEntry,info->templType2,info->templName2); } if (fullName=="std::auto_ptr" || fullName=="std::smart_ptr" || fullName=="std::shared_ptr" || - fullName=="std::unique_ptr" || fullName=="std::weak_ptr") + fullName=="std::shared_ptr" || fullName=="std::weak_ptr") { - std::unique_ptr<Entry> memEntry = std::make_unique<Entry>(); + std::shared_ptr<Entry> memEntry = std::make_shared<Entry>(); memEntry->name = "operator->"; memEntry->args = "()"; memEntry->type = "T*"; @@ -520,9 +523,9 @@ static void addSTLClass(const std::unique_ptr<Entry> &root,const STLInfo *info) } -static void addSTLClasses(const std::unique_ptr<Entry> &root) +static void addSTLClasses(const std::shared_ptr<Entry> &root) { - std::unique_ptr<Entry> namespaceEntry = std::make_unique<Entry>(); + std::shared_ptr<Entry> namespaceEntry = std::make_shared<Entry>(); namespaceEntry->fileName = "[STL]"; namespaceEntry->startLine = 1; namespaceEntry->name = "std"; @@ -1317,7 +1320,7 @@ static void addClassToContext(const Entry *root) //printf("ClassDict.insert(%s)\n",fullName.data()); Doxygen::classSDict->append(fullName,cd); - if (cd->isGeneric()) // generics are also stored in a separate dictionary for fast lookup of instantions + if (cd->isGeneric()) // generics are also stored in a separate dictionary for fast lookup of instances { //printf("inserting generic '%s' cd=%p\n",fullName.data(),cd); Doxygen::genericsDict->insert(fullName,cd); @@ -1604,7 +1607,7 @@ static void processTagLessClasses(ClassDef *rootCd, if (type.find(icd->name())!=-1) // matching tag less struct/union { QCString name = md->name(); - if (name.at(0)=='@') name = "__unnamed__"; + if (md->isAnonymous()) name = "__unnamed__"; if (!prefix.isEmpty()) name.prepend(prefix+"."); //printf(" found %s for class %s\n",name.data(),cd->name().data()); ClassDef *ncd = createTagLessInstance(rootCd,icd,name); @@ -2461,7 +2464,7 @@ static MemberDef *addVariableToFile( QCString def; // determine the definition of the global variable - if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@' && + if (nd && !nd->isAnonymous() && !Config_getBool(HIDE_SCOPE_NAMES) ) // variable is inside a namespace, so put the scope before the name @@ -2616,7 +2619,7 @@ static MemberDef *addVariableToFile( addMemberToGroups(root,md); md->setRefItems(root->sli); - if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@') + if (nd && !nd->isAnonymous()) { md->setNamespace(nd); nd->insertMember(md); @@ -6540,7 +6543,7 @@ static void findMember(const Entry *root, // first note that we pass: // (root->tArgLists ? root->tArgLists->last() : 0) - // for the template arguments fo the new "member." + // for the template arguments for the new "member." // this accurately reflects the template arguments of // the related function, which don't have to do with // those of the related class. @@ -7027,7 +7030,7 @@ static void findEnums(const Entry *root) mnsd=Doxygen::memberNameSDict; isGlobal=FALSE; } - else if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@') // found enum inside namespace + else if (nd) // found enum inside namespace { mnsd=Doxygen::functionNameSDict; isGlobal=TRUE; @@ -7076,7 +7079,7 @@ static void findEnums(const Entry *root) baseType.prepend(" : "); } - if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@') + if (nd) { if (isRelated || Config_getBool(HIDE_SCOPE_NAMES)) { @@ -7095,7 +7098,7 @@ static void findEnums(const Entry *root) // even if we have already added the enum to a namespace, we still // also want to add it to other appropriate places such as file // or class. - if (isGlobal) + if (isGlobal && (nd==0 || !nd->isAnonymous())) { if (!defSet) md->setDefinition(name+baseType); if (fd==0 && root->parent()) @@ -7204,7 +7207,7 @@ static void addEnumValuesToEnums(const Entry *root) mnsd=Doxygen::memberNameSDict; isGlobal=FALSE; } - else if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@') // found enum inside namespace + else if (nd && !nd->isAnonymous()) // found enum inside namespace { //printf("Enum in namespace '%s'::'%s'\n",nd->name().data(),name.data()); mnsd=Doxygen::functionNameSDict; @@ -7312,7 +7315,7 @@ static void addEnumValuesToEnums(const Entry *root) { //printf("found enum value with same name %s in scope %s\n", // fmd->name().data(),fmd->getOuterScope()->name().data()); - if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@') + if (nd && !nd->isAnonymous()) { const NamespaceDef *fnd=fmd->getNamespaceDef(); if (fnd==nd) // enum value is inside a namespace @@ -8991,7 +8994,8 @@ static void generateExampleDocs() for (pdi.toFirst();(pd=pdi.current());++pdi) { msg("Generating docs for example %s...\n",pd->name().data()); - resetCCodeParserState(); + CodeParserInterface &intf = Doxygen::parserManager->getCodeParser(".c"); // TODO: do this on code type + intf.resetCodeParserState(); QCString n=pd->getOutputFileBase(); startFile(*g_outputList,n,n,pd->name()); startTitle(*g_outputList,n); @@ -9197,7 +9201,7 @@ static void compareDoxyfile() //---------------------------------------------------------------------------- -static void readTagFile(const std::unique_ptr<Entry> &root,const char *tl) +static void readTagFile(const std::shared_ptr<Entry> &root,const char *tl) { QCString tagLine = tl; QCString fileName; @@ -9347,7 +9351,7 @@ static void copyExtraFiles(QStrList files,const QCString &filesOption,const QCSt //---------------------------------------------------------------------------- -static ParserInterface *getParserForFile(const char *fn) +static OutlineParserInterface &getParserForFile(const char *fn) { QCString fileName=fn; QCString extension; @@ -9362,11 +9366,11 @@ static ParserInterface *getParserForFile(const char *fn) extension = ".no_extension"; } - return Doxygen::parserManager->getParser(extension); + return Doxygen::parserManager->getOutlineParser(extension); } -static void parseFile(ParserInterface *parser, - const std::unique_ptr<Entry> &root,FileDef *fd,const char *fn, +static void parseFile(OutlineParserInterface &parser, + const std::shared_ptr<Entry> &root,FileDef *fd,const char *fn, bool sameTu,QStrList &filesInSameTu) { #if USE_LIBCLANG @@ -9390,12 +9394,12 @@ static void parseFile(ParserInterface *parser, BufStr preBuf(fi.size()+4096); if (Config_getBool(ENABLE_PREPROCESSING) && - parser->needsPreprocessing(extension)) + parser.needsPreprocessing(extension)) { BufStr inBuf(fi.size()+4096); msg("Preprocessing %s...\n",fn); readInputFile(fileName,inBuf); - preprocessFile(fileName,inBuf,preBuf); + Doxygen::preprocessor->processFile(fileName,inBuf,preBuf); } else // no preprocessing { @@ -9419,15 +9423,15 @@ static void parseFile(ParserInterface *parser, fd->getAllIncludeFilesRecursively(filesInSameTu); } - std::unique_ptr<Entry> fileRoot = std::make_unique<Entry>(); + std::shared_ptr<Entry> fileRoot = std::make_shared<Entry>(); // use language parse to parse the file - parser->parseInput(fileName,convBuf.data(),fileRoot,sameTu,filesInSameTu); + parser.parseInput(fileName,convBuf.data(),fileRoot,sameTu,filesInSameTu); fileRoot->setFileDef(fd); root->moveToSubEntryAndKeep(fileRoot); } //! parse the list of input files -static void parseFiles(const std::unique_ptr<Entry> &root) +static void parseFiles(const std::shared_ptr<Entry> &root) { #if USE_LIBCLANG static bool clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING); @@ -9453,8 +9457,8 @@ static void parseFiles(const std::unique_ptr<Entry> &root) if (fd->isSource() && !fd->isReference()) // this is a source file { QStrList filesInSameTu; - ParserInterface * parser = getParserForFile(s->data()); - parser->startTranslationUnit(s->data()); + OutlineParserInterface &parser = getParserForFile(s->data()); + parser.startTranslationUnit(s->data()); parseFile(parser,root,fd,s->data(),FALSE,filesInSameTu); //printf(" got %d extra files in tu\n",filesInSameTu.count()); @@ -9476,7 +9480,7 @@ static void parseFiles(const std::unique_ptr<Entry> &root) } incFile = filesInSameTu.next(); } - parser->finishTranslationUnit(); + parser.finishTranslationUnit(); g_processedFiles.insert(*s,(void*)0x8); } } @@ -9489,15 +9493,15 @@ static void parseFiles(const std::unique_ptr<Entry> &root) QStrList filesInSameTu; FileDef *fd=findFileDef(Doxygen::inputNameDict,s->data(),ambig); ASSERT(fd!=0); - ParserInterface * parser = getParserForFile(s->data()); - parser->startTranslationUnit(s->data()); + OutlineParserInterface &parser = getParserForFile(s->data()); + parser.startTranslationUnit(s->data()); parseFile(parser,root,fd,s->data(),FALSE,filesInSameTu); - parser->finishTranslationUnit(); + parser.finishTranslationUnit(); g_processedFiles.insert(*s,(void*)0x8); } } } - else // normal pocessing + else // normal processing #endif { StringListIterator it(g_inputFiles); @@ -9508,8 +9512,8 @@ static void parseFiles(const std::unique_ptr<Entry> &root) QStrList filesInSameTu; FileDef *fd=findFileDef(Doxygen::inputNameDict,s->data(),ambig); ASSERT(fd!=0); - ParserInterface * parser = getParserForFile(s->data()); - parser->startTranslationUnit(s->data()); + OutlineParserInterface &parser = getParserForFile(s->data()); + parser.startTranslationUnit(s->data()); parseFile(parser,root,fd,s->data(),FALSE,filesInSameTu); } } @@ -9588,7 +9592,7 @@ static QDict<void> g_pathsVisited(1009); //---------------------------------------------------------------------------- // Read all files matching at least one pattern in 'patList' in the // directory represented by 'fi'. -// The directory is read iff the recusiveFlag is set. +// The directory is read iff the recursiveFlag is set. // The contents of all files is append to the input string int readDir(QFileInfo *fi, @@ -10066,32 +10070,55 @@ static const char *getArg(int argc,char **argv,int &optind) //---------------------------------------------------------------------------- +/** @brief /dev/null outline parser */ +class NullOutlineParser : public OutlineParserInterface +{ + public: + void startTranslationUnit(const char *) {} + void finishTranslationUnit() {} + void parseInput(const char *, const char *,const std::shared_ptr<Entry> &, bool, QStrList &) {} + bool needsPreprocessing(const QCString &) const { return FALSE; } + void parsePrototype(const char *) {} +}; + + + void initDoxygen() { initResources(); - const char *lang = portable_getenv("LC_ALL"); - if (lang) portable_setenv("LANG",lang); + const char *lang = Portable::getenv("LC_ALL"); + if (lang) Portable::setenv("LANG",lang); setlocale(LC_ALL,""); setlocale(LC_CTYPE,"C"); // to get isspace(0xA0)==0, needed for UTF-8 setlocale(LC_NUMERIC,"C"); - portable_correct_path(); + Portable::correct_path(); Doxygen::runningTime.start(); - initPreprocessor(); - - Doxygen::parserManager = new ParserManager; - Doxygen::parserManager->registerDefaultParser( new FileParser); - Doxygen::parserManager->registerParser("c", new CLanguageScanner); - Doxygen::parserManager->registerParser("python", new PythonLanguageScanner); - Doxygen::parserManager->registerParser("fortran", new FortranLanguageScanner); - Doxygen::parserManager->registerParser("fortranfree", new FortranLanguageScannerFree); - Doxygen::parserManager->registerParser("fortranfixed", new FortranLanguageScannerFixed); - Doxygen::parserManager->registerParser("vhdl", new VHDLLanguageScanner); - Doxygen::parserManager->registerParser("xml", new XMLScanner); - Doxygen::parserManager->registerParser("sql", new SQLScanner); - Doxygen::parserManager->registerParser("tcl", new TclLanguageScanner); - Doxygen::parserManager->registerParser("md", new MarkdownFileParser); + Doxygen::preprocessor = new Preprocessor(); + + Doxygen::parserManager = new ParserManager( std::make_unique<NullOutlineParser>(), + std::make_unique<FileCodeParser>()); + Doxygen::parserManager->registerParser("c", std::make_unique<COutlineParser>(), + std::make_unique<CCodeParser>()); + Doxygen::parserManager->registerParser("python", std::make_unique<PythonOutlineParser>(), + std::make_unique<PythonCodeParser>()); + Doxygen::parserManager->registerParser("fortran", std::make_unique<FortranOutlineParser>(), + std::make_unique<FortranCodeParser>()); + Doxygen::parserManager->registerParser("fortranfree", std::make_unique<FortranOutlineParserFree>(), + std::make_unique<FortranCodeParserFree>()); + Doxygen::parserManager->registerParser("fortranfixed", std::make_unique<FortranOutlineParserFixed>(), + std::make_unique<FortranCodeParserFixed>()); + Doxygen::parserManager->registerParser("vhdl", std::make_unique<VHDLOutlineParser>(), + std::make_unique<VHDLCodeParser>()); + Doxygen::parserManager->registerParser("xml", std::make_unique<NullOutlineParser>(), + std::make_unique<XMLCodeParser>()); + Doxygen::parserManager->registerParser("sql", std::make_unique<NullOutlineParser>(), + std::make_unique<SQLCodeParser>()); + Doxygen::parserManager->registerParser("tcl", std::make_unique<TclOutlineParser>(), + std::make_unique<TclCodeParser>()); + Doxygen::parserManager->registerParser("md", std::make_unique<MarkdownOutlineParser>(), + std::make_unique<FileCodeParser>()); // register any additional parsers here... @@ -10182,11 +10209,10 @@ void cleanUpDoxygen() delete Doxygen::globalScope; delete Doxygen::xrefLists; delete Doxygen::parserManager; - cleanUpPreprocessor(); + delete Doxygen::preprocessor; delete theTranslator; delete g_outputList; Mappers::freeMappers(); - codeFreeScanner(); if (Doxygen::symbolMap) { @@ -10662,7 +10688,7 @@ void adjustConfiguration() while (s) { QFileInfo fi(s); - addSearchDir(fi.absFilePath().utf8()); + Doxygen::preprocessor->addSearchDir(fi.absFilePath().utf8()); s=includePath.next(); } @@ -11102,7 +11128,7 @@ void parseInput() signal(SIGINT, stopDoxygen); #endif - uint pid = portable_pid(); + uint pid = Portable::pid(); Doxygen::objDBFileName.sprintf("doxygen_objdb_%d.tmp",pid); Doxygen::objDBFileName.prepend(outputDirectory+"/"); Doxygen::entryDBFileName.sprintf("doxygen_entrydb_%d.tmp",pid); @@ -11162,18 +11188,18 @@ void parseInput() QCString curFontPath = Config_getString(DOT_FONTPATH); if (curFontPath.isEmpty()) { - portable_getenv("DOTFONTPATH"); + Portable::getenv("DOTFONTPATH"); QCString newFontPath = "."; if (!curFontPath.isEmpty()) { - newFontPath+=portable_pathListSeparator(); + newFontPath+=Portable::pathListSeparator(); newFontPath+=curFontPath; } - portable_setenv("DOTFONTPATH",newFontPath); + Portable::setenv("DOTFONTPATH",newFontPath); } else { - portable_setenv("DOTFONTPATH",curFontPath); + Portable::setenv("DOTFONTPATH",curFontPath); } } @@ -11240,7 +11266,7 @@ void parseInput() * Handle Tag Files * **************************************************************************/ - std::unique_ptr<Entry> root = std::make_unique<Entry>(); + std::shared_ptr<Entry> root = std::make_shared<Entry>(); msg("Reading and parsing tag files\n"); QStrList &tagFileList = Config_getList(TAGFILES); @@ -11266,8 +11292,6 @@ void parseInput() // we are done with input scanning now, so free up the buffers used by flex // (can be around 4MB) - preFreeScanner(); - scanFreeScanner(); pyscanFreeScanner(); /************************************************************************** @@ -11800,7 +11824,7 @@ void generateOutput() { searchDataFile="searchdata.xml"; } - if (!portable_isAbsolutePath(searchDataFile)) + if (!Portable::isAbsolutePath(searchDataFile)) { searchDataFile.prepend(Config_getString(OUTPUT_DIRECTORY)+"/"); } @@ -11862,12 +11886,13 @@ void generateOutput() g_s.begin("Running html help compiler...\n"); QString oldDir = QDir::currentDirPath(); QDir::setCurrent(Config_getString(HTML_OUTPUT)); - portable_sysTimerStart(); - if (portable_system(Config_getString(HHC_LOCATION), "index.hhp", Debug::isFlagSet(Debug::ExtCmd))!=1) + Portable::setShortDir(); + Portable::sysTimerStart(); + if (Portable::system(Config_getString(HHC_LOCATION), "index.hhp", Debug::isFlagSet(Debug::ExtCmd))!=1) { err("failed to run html help compiler on index.hhp\n"); } - portable_sysTimerStop(); + Portable::sysTimerStop(); QDir::setCurrent(oldDir); g_s.end(); } @@ -11882,12 +11907,12 @@ void generateOutput() QCString const args = QCString().sprintf("%s -o \"%s\"", qhpFileName.data(), qchFileName.data()); QString const oldDir = QDir::currentDirPath(); QDir::setCurrent(Config_getString(HTML_OUTPUT)); - portable_sysTimerStart(); - if (portable_system(Config_getString(QHG_LOCATION), args.data(), FALSE)) + Portable::sysTimerStart(); + if (Portable::system(Config_getString(QHG_LOCATION), args.data(), FALSE)) { err("failed to run qhelpgenerator on index.qhp\n"); } - portable_sysTimerStop(); + Portable::sysTimerStop(); QDir::setCurrent(oldDir); g_s.end(); } @@ -11908,7 +11933,7 @@ void generateOutput() { msg("Total elapsed time: %.3f seconds\n(of which %.3f seconds waiting for external tools to finish)\n", ((double)Doxygen::runningTime.elapsed())/1000.0, - portable_getSysElapsedTime() + Portable::getSysElapsedTime() ); g_s.print(); } @@ -11924,7 +11949,7 @@ void generateOutput() cleanUpDoxygen(); - finializeSearchIndexer(); + finalizeSearchIndexer(); // Doxygen::symbolStorage->close(); QDir thisDir; thisDir.remove(Doxygen::objDBFileName); diff --git a/src/doxygen.h b/src/doxygen.h index c8eee7c..a23a678 100644 --- a/src/doxygen.h +++ b/src/doxygen.h @@ -60,6 +60,7 @@ class FormulaList; class FormulaDict; class FormulaNameDict; class SectionDict; +class Preprocessor; struct MemberGroupInfo; typedef QList<QCString> StringList; @@ -152,6 +153,7 @@ class Doxygen static bool markdownSupport; static GenericsSDict *genericsDict; static DocGroup docGroup; + static Preprocessor *preprocessor; }; void initDoxygen(); diff --git a/src/entry.cpp b/src/entry.cpp index 066c4a0..cc8cd1f 100644 --- a/src/entry.cpp +++ b/src/entry.cpp @@ -116,7 +116,7 @@ Entry::Entry(const Entry &e) m_sublist.reserve(e.m_sublist.size()); for (const auto &cur : e.m_sublist) { - m_sublist.push_back(std::make_unique<Entry>(*cur)); + m_sublist.push_back(std::make_shared<Entry>(*cur)); } } @@ -136,11 +136,11 @@ void Entry::moveToSubEntryAndRefresh(Entry *¤t) current = new Entry; } -void Entry::moveToSubEntryAndRefresh(std::unique_ptr<Entry> ¤t) +void Entry::moveToSubEntryAndRefresh(std::shared_ptr<Entry> ¤t) { current->m_parent=this; - m_sublist.push_back(std::move(current)); - current = std::make_unique<Entry>(); + m_sublist.push_back(current); + current = std::make_shared<Entry>(); } void Entry::moveToSubEntryAndKeep(Entry *current) @@ -149,10 +149,10 @@ void Entry::moveToSubEntryAndKeep(Entry *current) m_sublist.emplace_back(current); } -void Entry::moveToSubEntryAndKeep(std::unique_ptr<Entry> ¤t) +void Entry::moveToSubEntryAndKeep(std::shared_ptr<Entry> ¤t) { current->m_parent=this; - m_sublist.push_back(std::move(current)); + m_sublist.push_back(current); } void Entry::copyToSubEntry(Entry *current) @@ -162,20 +162,20 @@ void Entry::copyToSubEntry(Entry *current) m_sublist.emplace_back(copy); } -void Entry::copyToSubEntry(const std::unique_ptr<Entry> ¤t) +void Entry::copyToSubEntry(const std::shared_ptr<Entry> ¤t) { - std::unique_ptr<Entry> copy = std::make_unique<Entry>(*current); + std::shared_ptr<Entry> copy = std::make_shared<Entry>(*current); copy->m_parent=this; - m_sublist.push_back(std::move(copy)); + m_sublist.push_back(copy); } -void Entry::moveFromSubEntry(const Entry *child,std::unique_ptr<Entry> &moveTo) +void Entry::moveFromSubEntry(const Entry *child,std::shared_ptr<Entry> &moveTo) { auto it = std::find_if(m_sublist.begin(),m_sublist.end(), - [child](const std::unique_ptr<Entry>&elem) { return elem.get()==child; }); + [child](const std::shared_ptr<Entry>&elem) { return elem.get()==child; }); if (it!=m_sublist.end()) { - moveTo = std::move(*it); + moveTo = *it; m_sublist.erase(it); } else @@ -187,7 +187,7 @@ void Entry::moveFromSubEntry(const Entry *child,std::unique_ptr<Entry> &moveTo) void Entry::removeSubEntry(const Entry *e) { auto it = std::find_if(m_sublist.begin(),m_sublist.end(), - [e](const std::unique_ptr<Entry>&elem) { return elem.get()==e; }); + [e](const std::shared_ptr<Entry>&elem) { return elem.get()==e; }); if (it!=m_sublist.end()) { m_sublist.erase(it); diff --git a/src/entry.h b/src/entry.h index 9d4ae9d..0391075 100644 --- a/src/entry.h +++ b/src/entry.h @@ -202,26 +202,26 @@ class Entry /*! Returns the list of children for this Entry * @see addSubEntry() and removeSubEntry() */ - const std::vector< std::unique_ptr<Entry> > &children() const { return m_sublist; } + const std::vector< std::shared_ptr<Entry> > &children() const { return m_sublist; } /*! @name add entry as a child and pass ownership. * @note This makes the entry passed invalid! (TODO: tclscanner.l still has use after move!) * @{ */ void moveToSubEntryAndKeep(Entry* e); - void moveToSubEntryAndKeep(std::unique_ptr<Entry> &e); + void moveToSubEntryAndKeep(std::shared_ptr<Entry> &e); /*! @} */ /*! @name add entry as a child, pass ownership and reinitialize entry */ void moveToSubEntryAndRefresh(Entry* &e); - void moveToSubEntryAndRefresh(std::unique_ptr<Entry> &e); + void moveToSubEntryAndRefresh(std::shared_ptr<Entry> &e); /*! take \a child of of to list of children and move it into \a moveTo */ - void moveFromSubEntry(const Entry *child,std::unique_ptr<Entry> &moveTo); + void moveFromSubEntry(const Entry *child,std::shared_ptr<Entry> &moveTo); /*! make a copy of \a e and add it as a child to this entry */ void copyToSubEntry (Entry* e); - void copyToSubEntry (const std::unique_ptr<Entry> &e); + void copyToSubEntry (const std::shared_ptr<Entry> &e); /*! Removes entry \a e from the list of children. * The entry will be deleted if found. @@ -332,7 +332,7 @@ class Entry private: Entry *m_parent; //!< parent node in the tree - std::vector< std::unique_ptr<Entry> > m_sublist; + std::vector< std::shared_ptr<Entry> > m_sublist; Entry &operator=(const Entry &); FileDef *m_fileDef; }; diff --git a/src/filedef.cpp b/src/filedef.cpp index f358dba..e028bab 100644 --- a/src/filedef.cpp +++ b/src/filedef.cpp @@ -664,7 +664,8 @@ void FileDefImpl::writeIncludeGraph(OutputList &ol) DotInclDepGraph incDepGraph(this,FALSE); if (incDepGraph.isTooBig()) { - warn_uncond("Include graph for '%s' not generated, too many nodes. Consider increasing DOT_GRAPH_MAX_NODES.\n",name().data()); + warn_uncond("Include graph for '%s' not generated, too many nodes (%d), threshold is %d. Consider increasing DOT_GRAPH_MAX_NODES.\n", + name().data(), incDepGraph.numNodes(), Config_getInt(DOT_GRAPH_MAX_NODES)); } else if (!incDepGraph.isTrivial()) { @@ -688,7 +689,8 @@ void FileDefImpl::writeIncludedByGraph(OutputList &ol) DotInclDepGraph incDepGraph(this,TRUE); if (incDepGraph.isTooBig()) { - warn_uncond("Included by graph for '%s' not generated, too many nodes. Consider increasing DOT_GRAPH_MAX_NODES.\n",name().data()); + warn_uncond("Included by graph for '%s' not generated, too many nodes (%d), threshold is %d. Consider increasing DOT_GRAPH_MAX_NODES.\n", + name().data(), incDepGraph.numNodes(), Config_getInt(DOT_GRAPH_MAX_NODES)); } else if (!incDepGraph.isTrivial()) { @@ -735,7 +737,7 @@ void FileDefImpl::writeClassDeclarations(OutputList &ol,const QCString &title,Cl void FileDefImpl::writeInlineClasses(OutputList &ol) { - // temporarily undo the disbling could be done by startMemberDocumentation() + // temporarily undo the disabling could be done by startMemberDocumentation() // as a result of setting SEPARATE_MEMBER_PAGES to YES; see bug730512 bool isEnabled = ol.isEnabled(OutputGenerator::Html); ol.enable(OutputGenerator::Html); @@ -1231,8 +1233,8 @@ void FileDefImpl::writeSource(OutputList &ol,bool sameTu,QStrList &filesInSameTu else #endif { - ParserInterface *pIntf = Doxygen::parserManager->getParser(getDefFileExtension()); - pIntf->resetCodeParserState(); + CodeParserInterface &intf = Doxygen::parserManager->getCodeParser(getDefFileExtension()); + intf.resetCodeParserState(); ol.startCodeFragment(); bool needs2PassParsing = Doxygen::parseSourcesNeeded && // we need to parse (filtered) sources for cross-references @@ -1242,13 +1244,13 @@ void FileDefImpl::writeSource(OutputList &ol,bool sameTu,QStrList &filesInSameTu if (needs2PassParsing) { // parse code for cross-references only (see bug707641) - pIntf->parseCode(devNullIntf,0, + intf.parseCode(devNullIntf,0, fileToString(absFilePath(),TRUE,TRUE), getLanguage(), FALSE,0,this ); } - pIntf->parseCode(ol,0, + intf.parseCode(ol,0, fileToString(absFilePath(),filterSourceFiles,TRUE), getLanguage(), // lang FALSE, // isExampleBlock @@ -1293,9 +1295,9 @@ void FileDefImpl::parseSource(bool sameTu,QStrList &filesInSameTu) else #endif { - ParserInterface *pIntf = Doxygen::parserManager->getParser(getDefFileExtension()); - pIntf->resetCodeParserState(); - pIntf->parseCode( + CodeParserInterface &intf = Doxygen::parserManager->getCodeParser(getDefFileExtension()); + intf.resetCodeParserState(); + intf.parseCode( devNullIntf,0, fileToString(absFilePath(),filterSourceFiles,TRUE), getLanguage(), @@ -2013,7 +2015,7 @@ void FileDefImpl::acquireFileVersion() msg("Version of %s : ",m_filePath.data()); QCString cmd = vercmd+" \""+m_filePath+"\""; Debug::print(Debug::ExtCmd,0,"Executing popen(`%s`)\n",qPrint(cmd)); - FILE *f=portable_popen(cmd,"r"); + FILE *f=Portable::popen(cmd,"r"); if (!f) { err("could not execute %s\n",vercmd.data()); @@ -2022,7 +2024,7 @@ void FileDefImpl::acquireFileVersion() const int bufSize=1024; char buf[bufSize]; int numRead = (int)fread(buf,1,bufSize-1,f); - portable_pclose(f); + Portable::pclose(f); if (numRead>0 && numRead<bufSize) { buf[numRead]='\0'; diff --git a/src/fileparser.cpp b/src/fileparser.cpp index 45bdc81..34085dc 100644 --- a/src/fileparser.cpp +++ b/src/fileparser.cpp @@ -16,7 +16,7 @@ #include "fileparser.h" #include "outputgen.h" -void FileParser::parseCode(CodeOutputInterface &codeOutIntf, +void FileCodeParser::parseCode(CodeOutputInterface &codeOutIntf, const char *, // scopeName const QCString & input, SrcLangExt, // lang diff --git a/src/fileparser.h b/src/fileparser.h index 7c3f40c..3245878 100644 --- a/src/fileparser.h +++ b/src/fileparser.h @@ -18,15 +18,11 @@ #include "parserintf.h" -/** @brief General file parser */ -class FileParser : public ParserInterface +/** @brief Generic code parser */ +class FileCodeParser : public CodeParserInterface { public: - virtual ~FileParser() {} - void startTranslationUnit(const char *) {} - void finishTranslationUnit() {} - void parseInput(const char *, const char *,const std::unique_ptr<Entry> &, bool, QStrList &) {} - bool needsPreprocessing(const QCString &) { return FALSE; } + virtual ~FileCodeParser() {} void parseCode(CodeOutputInterface &codeOutIntf, const char *scopeName, const QCString &input, @@ -43,8 +39,6 @@ class FileParser : public ParserInterface bool collectXRefs=TRUE ); void resetCodeParserState() {} - void parsePrototype(const char *) {} }; - #endif diff --git a/src/formula.cpp b/src/formula.cpp index 534f56a..c884eba 100644 --- a/src/formula.cpp +++ b/src/formula.cpp @@ -100,15 +100,15 @@ void FormulaList::generateBitmaps(const char *path) //printf("Running latex...\n"); //system("latex _formulas.tex </dev/null >/dev/null"); QCString latexCmd = "latex"; - portable_sysTimerStart(); - if (portable_system(latexCmd,"_formulas.tex")!=0) + Portable::sysTimerStart(); + if (Portable::system(latexCmd,"_formulas.tex")!=0) { err("Problems running latex. Check your installation or look " "for typos in _formulas.tex and check _formulas.log!\n"); formulaError=TRUE; //return; } - portable_sysTimerStop(); + Portable::sysTimerStop(); //printf("Running dvips...\n"); QListIterator<int> pli(pagesToGenerate); int *pagePtr; @@ -125,27 +125,27 @@ void FormulaList::generateBitmaps(const char *path) // postscript file. sprintf(dviArgs,"-q -D 600 -n 1 -p %d -o %s_tmp.ps _formulas.dvi", pageIndex,formBase.data()); - portable_sysTimerStart(); - if (portable_system("dvips",dviArgs)!=0) + Portable::sysTimerStart(); + if (Portable::system("dvips",dviArgs)!=0) { err("Problems running dvips. Check your installation!\n"); - portable_sysTimerStop(); + Portable::sysTimerStop(); QDir::setCurrent(oldDir); return; } - portable_sysTimerStop(); + Portable::sysTimerStop(); // run ps2epsi to convert to an encapsulated postscript file with // boundingbox (dvips with -E has some problems here). sprintf(psArgs,"%s_tmp.ps %s.eps",formBase.data(),formBase.data()); - portable_sysTimerStart(); - if (portable_system("ps2epsi",psArgs)!=0) + Portable::sysTimerStart(); + if (Portable::system("ps2epsi",psArgs)!=0) { err("Problems running ps2epsi. Check your installation!\n"); - portable_sysTimerStop(); + Portable::sysTimerStop(); QDir::setCurrent(oldDir); return; } - portable_sysTimerStop(); + Portable::sysTimerStop(); // now we read the generated postscript file to extract the bounding box QFileInfo fi(formBase+".eps"); if (fi.exists()) @@ -193,20 +193,20 @@ void FormulaList::generateBitmaps(const char *path) // used. char gsArgs[4096]; - sprintf(gsArgs,"-q -g%dx%d -r%dx%dx -sDEVICE=ppmraw " - "-sOutputFile=%s.pnm -dNOPAUSE -dBATCH -- %s.ps", + sprintf(gsArgs,"-q -g%dx%d -r%dx%d -sDEVICE=ppmraw " + "-sOutputFile=%s.pnm -dNOPAUSE -dBATCH -dNOSAFER %s.ps", gx,gy,(int)(scaleFactor*72),(int)(scaleFactor*72), formBase.data(),formBase.data() ); - portable_sysTimerStart(); - if (portable_system(portable_ghostScriptCommand(),gsArgs)!=0) + Portable::sysTimerStart(); + if (Portable::system(Portable::ghostScriptCommand(),gsArgs)!=0) { - err("Problem running ghostscript %s %s. Check your installation!\n",portable_ghostScriptCommand(),gsArgs); - portable_sysTimerStop(); + err("Problem running ghostscript %s %s. Check your installation!\n",Portable::ghostScriptCommand(),gsArgs); + Portable::sysTimerStop(); QDir::setCurrent(oldDir); return; } - portable_sysTimerStop(); + Portable::sysTimerStop(); f.setName(formBase+".pnm"); uint imageX=0,imageY=0; // we read the generated image again, to obtain the pixel data. diff --git a/src/fortrancode.h b/src/fortrancode.h index 4df20a9..8391a0b 100644 --- a/src/fortrancode.h +++ b/src/fortrancode.h @@ -18,7 +18,7 @@ #ifndef FORTRANCODE_H #define FORTRANCODE_H -#include "types.h" +#include "parserintf.h" class CodeOutputInterface; class FileDef; @@ -26,13 +26,45 @@ class MemberDef; class QCString; class Definition; -void parseFortranCode(CodeOutputInterface &,const char *,const QCString &, - bool ,const char *,FileDef *fd, - int startLine,int endLine,bool inlineFragment, - const MemberDef *memberDef,bool showLineNumbers,const Definition *searchCtx, - bool collectRefs, FortranFormat format); -void resetFortranCodeParserState(); void codeFreeScanner(); const int fixedCommentAfter = 72; + +class FortranCodeParser : public CodeParserInterface +{ + public: + FortranCodeParser(FortranFormat format=FortranFormat_Unknown) : m_format(format) { } + void parseCode(CodeOutputInterface &codeOutIntf, + const char *scopeName, + const QCString &input, + SrcLangExt lang, + bool isExampleBlock, + const char *exampleName=0, + FileDef *fileDef=0, + int startLine=-1, + int endLine=-1, + bool inlineFragment=FALSE, + const MemberDef *memberDef=0, + bool showLineNumbers=TRUE, + const Definition *searchCtx=0, + bool collectXRefs=TRUE + ); + void resetCodeParserState(); + + private: + FortranFormat m_format; +}; + +class FortranCodeParserFree : public FortranCodeParser +{ + public: + FortranCodeParserFree() : FortranCodeParser(FortranFormat_Free) { } +}; + +class FortranCodeParserFixed : public FortranCodeParser +{ + public: + FortranCodeParserFixed() : FortranCodeParser(FortranFormat_Fixed) { } +}; + #endif diff --git a/src/fortrancode.l b/src/fortrancode.l index 303bbfb..21d1fa5 100644 --- a/src/fortrancode.l +++ b/src/fortrancode.l @@ -17,7 +17,7 @@ */ /** - @todo - continutation lines not always recognized + @todo - continuation lines not always recognized - merging of use-statements with same module name and different only-names - rename part of use-statement - links to interface functions @@ -1395,16 +1395,34 @@ void parseFortranCode(CodeOutputInterface &od,const char *,const QCString &s, return; } -#if !defined(YY_FLEX_SUBMINOR_VERSION) -extern "C" { // some bogus code to keep the compiler happy - void fortrancodeYYdummy() { yy_flex_realloc(0,0); } +//--------------------------------------------------------- + +void FortranCodeParser::parseCode(CodeOutputInterface & codeOutIntf, + const char * scopeName, + const QCString & input, + SrcLangExt /*lang*/, + bool isExampleBlock, + const char * exampleName, + FileDef * fileDef, + int startLine, + int endLine, + bool inlineFragment, + const MemberDef *memberDef, + bool showLineNumbers, + const Definition *searchCtx, + bool collectXRefs + ) +{ + ::parseFortranCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName, + fileDef,startLine,endLine,inlineFragment,memberDef, + showLineNumbers,searchCtx,collectXRefs,m_format); } -#elif YY_FLEX_MAJOR_VERSION<=2 && YY_FLEX_MINOR_VERSION<=5 && YY_FLEX_SUBMINOR_VERSION<33 -#error "You seem to be using a version of flex newer than 2.5.4 but older than 2.5.33. These versions do NOT work with doxygen! Please use version <=2.5.4 or >=2.5.33 or expect things to be parsed wrongly!" -#else -extern "C" { // some bogus code to keep the compiler happy - void fortrancodeYYdummy() { yy_top_state(); } + +void FortranCodeParser::resetCodeParserState() +{ + ::resetFortranCodeParserState(); } -#endif + +//--------------------------------------------------------- #include "fortrancode.l.h" diff --git a/src/fortranscanner.h b/src/fortranscanner.h index 7490cde..7a13f47 100644 --- a/src/fortranscanner.h +++ b/src/fortranscanner.h @@ -24,51 +24,35 @@ * * This is the Fortran language parser for doxygen. */ -class FortranLanguageScanner : public ParserInterface +class FortranOutlineParser : public OutlineParserInterface { public: - FortranLanguageScanner(FortranFormat format=FortranFormat_Unknown) : m_format(format) { } - virtual ~FortranLanguageScanner() {} + FortranOutlineParser(FortranFormat format=FortranFormat_Unknown) : m_format(format) { } void startTranslationUnit(const char *) {} void finishTranslationUnit() {} void parseInput(const char *fileName, const char *fileBuf, - const std::unique_ptr<Entry> &root, + const std::shared_ptr<Entry> &root, bool sameTranslationUnit, QStrList &filesInSameTranslationUnit); - bool needsPreprocessing(const QCString &extension); - void parseCode(CodeOutputInterface &codeOutIntf, - const char *scopeName, - const QCString &input, - SrcLangExt lang, - bool isExampleBlock, - const char *exampleName=0, - FileDef *fileDef=0, - int startLine=-1, - int endLine=-1, - bool inlineFragment=FALSE, - const MemberDef *memberDef=0, - bool showLineNumbers=TRUE, - const Definition *searchCtx=0, - bool collectXRefs=TRUE - ); - void resetCodeParserState(); + bool needsPreprocessing(const QCString &extension) const; void parsePrototype(const char *text); private: FortranFormat m_format; }; -class FortranLanguageScannerFree : public FortranLanguageScanner +class FortranOutlineParserFree : public FortranOutlineParser { public: - FortranLanguageScannerFree() : FortranLanguageScanner(FortranFormat_Free) { } + FortranOutlineParserFree() : FortranOutlineParser(FortranFormat_Free) { } }; -class FortranLanguageScannerFixed : public FortranLanguageScanner +class FortranOutlineParserFixed : public FortranOutlineParser { public: - FortranLanguageScannerFixed() : FortranLanguageScanner(FortranFormat_Fixed) { } + FortranOutlineParserFixed() : FortranOutlineParser(FortranFormat_Fixed) { } }; + #endif diff --git a/src/fortranscanner.l b/src/fortranscanner.l index 161deae..08c7a6a 100644 --- a/src/fortranscanner.l +++ b/src/fortranscanner.l @@ -136,16 +136,16 @@ static const char *directionParam[] = * * statics */ -static ParserInterface *g_thisParser; +static OutlineParserInterface *g_thisParser; static const char * inputString; static int inputPosition; static bool isFixedForm; static QCString inputStringPrepass; ///< Input string for prepass of line cont. '&' -static QCString inputStringSemi; ///< Input string after command separetor ';' +static QCString inputStringSemi; ///< Input string after command separator ';' static unsigned int inputPositionPrepass; static int lineCountPrepass = 0; -static QList<Entry> subrCurrent; +static std::vector< std::shared_ptr<Entry> > subrCurrent; struct CommentInPrepass { int column; @@ -162,14 +162,15 @@ static QFile inputFile; static QCString yyFileName; static int yyLineNr = 1 ; static int yyColNr = 0 ; -static Entry* current_root = 0 ; -static Entry* global_root = 0 ; -static Entry* file_root = 0 ; -static Entry* last_entry = 0 ; -static Entry* last_enum = 0 ; -static std::unique_ptr<Entry> current; +static Entry *current_root = 0; +static Entry *global_scope = 0; +static std::shared_ptr<Entry> global_root; +static std::shared_ptr<Entry> file_root; +static std::shared_ptr<Entry> last_entry; +static std::shared_ptr<Entry> last_enum; +static std::shared_ptr<Entry> current; static ScanVar v_type = V_IGNORE; // type of parsed variable -static std::vector<Entry*> moduleProcedures; // list of all interfaces which contain unresolved +static std::vector<std::shared_ptr<Entry> > moduleProcedures; // list of all interfaces which contain unresolved // module procedures static QCString docBlock; static bool docBlockInBody = FALSE; @@ -202,7 +203,6 @@ static SymbolModifiers currentModifiers; //! Holds program scope->symbol name->symbol modifiers. static QMap<Entry*,QMap<QCString,SymbolModifiers> > modifiers; -static Entry *global_scope = 0; static int anonCount = 0 ; //----------------------------------------------------------------------------- @@ -491,13 +491,13 @@ SCOPENAME ({ID}{BS}"::"{BS})* QCString name = QCString(yytext).stripWhiteSpace(); name = name.right(name.length() - 9).stripWhiteSpace().lower(); addInterface(name, ifType); - startScope(last_entry); + startScope(last_entry.get()); } } <InterfaceBody>^{BS}end{BS}interface({BS_}{ID})? { // end scope only if GENERIC interface - if (ifType == IF_GENERIC)last_entry->parent()->endBodyLine = yyLineNr - 1; + if (ifType == IF_GENERIC) last_entry->parent()->endBodyLine = yyLineNr - 1; if (ifType == IF_GENERIC && !endScope(current_root)) yyterminate(); @@ -510,12 +510,12 @@ SCOPENAME ({ID}{BS}"::"{BS})* <ModuleProcedure>{ID} { if (ifType == IF_ABSTRACT || ifType == IF_SPECIFIC) { addInterface(yytext, ifType); - startScope(last_entry); + startScope(last_entry.get()); } current->section = Entry::FUNCTION_SEC ; current->name = yytext; - moduleProcedures.push_back(current.get()); + moduleProcedures.push_back(current); addCurrentEntry(true); } <ModuleProcedure>"\n" { yyColNr -= 1; @@ -639,7 +639,7 @@ private { current->startLine = yyLineNr; /* if type is part of a module, mod name is necessary for output */ - if ((current_root) && + if (current_root && (current_root->section == Entry::CLASS_SEC || current_root->section == Entry::NAMESPACE_SEC)) { @@ -647,7 +647,7 @@ private { } addCurrentEntry(true); - startScope(last_entry); + startScope(last_entry.get()); BEGIN(TypedefBody); } } @@ -727,7 +727,7 @@ private { if (!endScope(current_root)) yyterminate(); - subrCurrent.remove(0u); + subrCurrent.pop_back(); yy_pop_state() ; } <BlockData>{ @@ -736,7 +736,7 @@ private { } <Start,ModuleBody,TypedefBody,SubprogBody,Enum>{ ^{BS}{TYPE_SPEC}/{SEPARATE} { - last_enum = 0; + last_enum.reset(); if (YY_START == Enum) { argType = "@"; // enum marker @@ -867,7 +867,7 @@ private { { current_root->copyToSubEntry(current); // add to the scope surrounding the enum (copy!) - last_enum = current.get(); + last_enum = current; current_root->parent()->moveToSubEntryAndRefresh(current); initEntry(); } @@ -1066,7 +1066,7 @@ private { } addCurrentEntry(true); - startScope(last_entry); + startScope(last_entry.get()); BEGIN( Enum ) ; } <Enum>"end"{BS}"enum" { @@ -1083,7 +1083,7 @@ private { if (ifType == IF_ABSTRACT || ifType == IF_SPECIFIC) { addInterface("$interface$", ifType); - startScope(last_entry); + startScope(last_entry.get()); } // TYPE_SPEC is for old function style function result @@ -1109,7 +1109,7 @@ private { if (ifType == IF_ABSTRACT || ifType == IF_SPECIFIC) { addInterface("$interface$", ifType); - startScope(last_entry); + startScope(last_entry.get()); } result = QCString(yytext).stripWhiteSpace(); @@ -1136,7 +1136,7 @@ private { current->args += ")"; current->args = removeRedundantWhiteSpace(current->args); addCurrentEntry(true); - startScope(last_entry); + startScope(last_entry.get()); BEGIN(SubprogBody); } <Parameterlist>{COMMA}|{BS} { current->args += yytext; @@ -1162,7 +1162,7 @@ private { newLine(); //printf("3=========> without parameterlist \n"); addCurrentEntry(true); - startScope(last_entry); + startScope(last_entry.get()); BEGIN(SubprogBody); } <SubprogBody>result{BS}\({BS}{ID} { @@ -1214,20 +1214,19 @@ private { unput(*yytext); if (v_type == V_VARIABLE) { - std::unique_ptr<Entry> tmp_entry; - current.swap(tmp_entry); + std::shared_ptr<Entry> tmp_entry = current; // temporarily switch to the previous entry if (last_enum) { - current.reset(last_enum); + current = last_enum; } else { - current.reset(last_entry); + current = last_entry; } handleCommentBlock(docBlock,TRUE); // switch back - tmp_entry.swap(current); + current = tmp_entry; } else if (v_type == V_PARAMETER) { @@ -1779,7 +1778,7 @@ static void popBuffer() { } /** used to copy entry to an interface module procedure */ -static void copyEntry(Entry *dest, const std::unique_ptr<Entry> &src) +static void copyEntry(std::shared_ptr<Entry> dest, const std::shared_ptr<Entry> &src) { dest->type = src->type; dest->fileName = src->fileName; @@ -1841,7 +1840,7 @@ static QCString extractFromParens(const QCString name) return extracted; } -/*! remove unuseful spaces from bind statement */ +/*! remove useless spaces from bind statement */ static QCString extractBind(const QCString name) { QCString parensPart = extractFromParens(name); @@ -2306,7 +2305,7 @@ static int yyread(char *buf,int max_size) static void initParser() { - last_entry = 0; + last_entry.reset(); } static void initEntry() @@ -2333,7 +2332,7 @@ static void addCurrentEntry(bool case_insens) { if (case_insens) current->name = current->name.lower(); //printf("===Adding entry %s to %s\n", current->name.data(), current_root->name.data()); - last_entry = current.get(); + last_entry = current; current_root->moveToSubEntryAndRefresh(current); initEntry(); } @@ -2367,14 +2366,14 @@ static void addModule(const char *name, bool isModule) current->startLine = yyLineNr; current->protection = Public ; addCurrentEntry(true); - startScope(last_entry); + startScope(last_entry.get()); } static void addSubprogram(const char *text) { DBG_CTX((stderr,"1=========> got subprog, type: %s\n",text)); - subrCurrent.prepend(current.get()); + subrCurrent.push_back(current); current->section = Entry::FUNCTION_SEC ; QCString subtype = text; subtype=subtype.lower().stripWhiteSpace(); functionLine = (subtype.find("function") != -1); @@ -2487,7 +2486,7 @@ static void handleCommentBlock(const QCString &doc,bool brief) QCString processedDoc = preprocessCommentBlock(doc,yyFileName,lineNr); while (parseCommentBlock( g_thisParser, - docBlockInBody ? subrCurrent.getFirst() : current.get(), + docBlockInBody ? subrCurrent.back().get() : current.get(), processedDoc, // text yyFileName, // file lineNr, @@ -2515,9 +2514,8 @@ static void subrHandleCommentBlock(const QCString &doc,bool brief) QCString loc_doc; loc_doc = doc.stripWhiteSpace(); - std::unique_ptr<Entry> tmp_entry; - current.swap(tmp_entry); - current.reset(subrCurrent.getFirst()); // temporarily switch to the entry of the subroutine / function + std::shared_ptr<Entry> tmp_entry = current; + current = subrCurrent.back(); // temporarily switch to the entry of the subroutine / function // Still in the specification section so no inbodyDocs yet, but parameter documentation current->inbodyDocs = ""; @@ -2540,7 +2538,7 @@ static void subrHandleCommentBlock(const QCString &doc,bool brief) // strip direction loc_doc = loc_doc.right(loc_doc.length()-strlen(directionParam[SymbolModifiers::IN])); loc_doc.stripWhiteSpace(); - // in case of empty documentation or (now) just name, consider it as no documemntation + // in case of empty documentation or (now) just name, consider it as no documentation if (!loc_doc.isEmpty() && (loc_doc.lower() != argName.lower())) { handleCommentBlock(QCString("\n\n@param ") + directionParam[SymbolModifiers::IN] + " " + @@ -2566,7 +2564,7 @@ static void subrHandleCommentBlock(const QCString &doc,bool brief) loc_doc.stripWhiteSpace(); if (loc_doc.isEmpty() || (loc_doc.lower() == argName.lower())) { - tmp_entry.swap(current); + current = tmp_entry; return; } handleCommentBlock(QCString("\n\n@param ") + directionParam[SymbolModifiers::OUT] + " " + @@ -2610,7 +2608,7 @@ static void subrHandleCommentBlock(const QCString &doc,bool brief) } // reset current back to the part inside the routine - tmp_entry.swap(current); + current = tmp_entry; } //---------------------------------------------------------------------------- /// Handle result description as defined after the declaration of the parameter @@ -2619,9 +2617,8 @@ static void subrHandleCommentBlockResult(const QCString &doc,bool brief) QCString loc_doc; loc_doc = doc.stripWhiteSpace(); - std::unique_ptr<Entry> tmp_entry; - current.swap(tmp_entry); - current.reset(subrCurrent.getFirst()); // temporarily switch to the entry of the subroutine / function + std::shared_ptr<Entry> tmp_entry = current; + current = subrCurrent.back(); // temporarily switch to the entry of the subroutine / function // Still in the specification section so no inbodyDocs yet, but parameter documentation current->inbodyDocs = ""; @@ -2640,7 +2637,7 @@ static void subrHandleCommentBlockResult(const QCString &doc,bool brief) } // reset current back to the part inside the routine - tmp_entry.swap(current); + current = tmp_entry; } //---------------------------------------------------------------------------- @@ -2661,7 +2658,7 @@ level--; static void parseMain(const char *fileName,const char *fileBuf, - const std::unique_ptr<Entry> &rt, FortranFormat format) + const std::shared_ptr<Entry> &rt, FortranFormat format) { char *tmpBuf = NULL; initParser(); @@ -2677,7 +2674,7 @@ static void parseMain(const char *fileName,const char *fileBuf, gstat = FALSE; virt = Normal; current_root = rt.get(); - global_root = rt.get(); + global_root = rt; inputFile.setName(fileName); if (inputFile.open(IO_ReadOnly)) { @@ -2719,11 +2716,11 @@ static void parseMain(const char *fileName,const char *fileBuf, Doxygen::docGroup.enterFile(yyFileName,yyLineNr); // add entry for the file - current = std::make_unique<Entry>(); + current = std::make_shared<Entry>(); current->lang = SrcLangExt_Fortran; current->name = yyFileName; current->section = Entry::SOURCE_SEC; - file_root = current.get(); + file_root = current; current_root->moveToSubEntryAndRefresh(current); current->lang = SrcLangExt_Fortran; @@ -2757,9 +2754,9 @@ static void parseMain(const char *fileName,const char *fileBuf, //---------------------------------------------------------------------------- -void FortranLanguageScanner::parseInput(const char *fileName, +void FortranOutlineParser::parseInput(const char *fileName, const char *fileBuf, - const std::unique_ptr<Entry> &root, + const std::shared_ptr<Entry> &root, bool /*sameTranslationUnit*/, QStrList & /*filesInSameTranslationUnit*/) { @@ -2772,37 +2769,11 @@ void FortranLanguageScanner::parseInput(const char *fileName, printlex(yy_flex_debug, FALSE, __FILE__, fileName); } -void FortranLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf, - const char * scopeName, - const QCString & input, - SrcLangExt /*lang*/, - bool isExampleBlock, - const char * exampleName, - FileDef * fileDef, - int startLine, - int endLine, - bool inlineFragment, - const MemberDef *memberDef, - bool showLineNumbers, - const Definition *searchCtx, - bool collectXRefs - ) -{ - ::parseFortranCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName, - fileDef,startLine,endLine,inlineFragment,memberDef, - showLineNumbers,searchCtx,collectXRefs,m_format); -} - -bool FortranLanguageScanner::needsPreprocessing(const QCString &extension) +bool FortranOutlineParser::needsPreprocessing(const QCString &extension) const { return extension!=extension.lower(); // use preprocessor only for upper case extensions } -void FortranLanguageScanner::resetCodeParserState() -{ - ::resetFortranCodeParserState(); -} - -void FortranLanguageScanner::parsePrototype(const char *text) +void FortranOutlineParser::parsePrototype(const char *text) { QCString buffer = QCString(text); pushBuffer(buffer); @@ -2813,6 +2784,8 @@ void FortranLanguageScanner::parsePrototype(const char *text) popBuffer(); } +//---------------------------------------------------------------------------- + static void scanner_abort() { fprintf(stderr,"********************************************************************\n"); @@ -2823,7 +2796,7 @@ static void scanner_abort() for (const auto &ce : global_root->children()) { - if (ce.get() == file_root) start=TRUE; + if (ce == file_root) start=TRUE; if (start) ce->reset(); } @@ -2836,11 +2809,4 @@ static void scanner_abort() //---------------------------------------------------------------------------- -#if !defined(YY_FLEX_SUBMINOR_VERSION) -//---------------------------------------------------------------------------- -extern "C" { // some bogus code to keep the compiler happy - void fortranscannernerYYdummy() { yy_flex_realloc(0,0); } -} -#endif - #include "fortranscanner.l.h" diff --git a/src/growbuf.h b/src/growbuf.h index 4c49dce..bf6d74e 100644 --- a/src/growbuf.h +++ b/src/growbuf.h @@ -47,6 +47,7 @@ class GrowBuf } const char *get() { return str; } int getPos() const { return pos; } + void setPos(const int newPos) { pos = newPos; } char at(int i) const { return str[i]; } private: char *str; diff --git a/src/htags.cpp b/src/htags.cpp index 51cd6d9..1a240b1 100644 --- a/src/htags.cpp +++ b/src/htags.cpp @@ -89,13 +89,13 @@ bool Htags::execute(const QCString &htmldir) QCString oldDir = QDir::currentDirPath().utf8(); QDir::setCurrent(g_inputDir.absPath()); //printf("CommandLine=[%s]\n",commandLine.data()); - portable_sysTimerStart(); - bool result=portable_system("htags",commandLine,FALSE)==0; + Portable::sysTimerStart(); + bool result=Portable::system("htags",commandLine,FALSE)==0; if (!result) { err("Problems running %s. Check your installation\n", "htags"); } - portable_sysTimerStop(); + Portable::sysTimerStop(); QDir::setCurrent(oldDir); return result; } diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp index 513c3a4..3dec509 100644 --- a/src/htmldocvisitor.cpp +++ b/src/htmldocvisitor.cpp @@ -518,8 +518,8 @@ void HtmlDocVisitor::visit(DocVerbatim *s) case DocVerbatim::Code: forceEndParagraph(s); m_t << PREFRAG_START; - Doxygen::parserManager->getParser(lang) - ->parseCode(m_ci, + Doxygen::parserManager->getCodeParser(lang) + .parseCode(m_ci, s->context(), s->text(), langExt, @@ -666,8 +666,8 @@ void HtmlDocVisitor::visit(DocInclude *inc) case DocInclude::Include: forceEndParagraph(inc); m_t << PREFRAG_START; - Doxygen::parserManager->getParser(inc->extension()) - ->parseCode(m_ci, + Doxygen::parserManager->getCodeParser(inc->extension()) + .parseCode(m_ci, inc->context(), inc->text(), langExt, @@ -690,8 +690,8 @@ void HtmlDocVisitor::visit(DocInclude *inc) m_t << PREFRAG_START; QFileInfo cfi( inc->file() ); FileDef *fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() ); - Doxygen::parserManager->getParser(inc->extension()) - ->parseCode(m_ci, + Doxygen::parserManager->getCodeParser(inc->extension()) + .parseCode(m_ci, inc->context(), inc->text(), langExt, @@ -732,8 +732,8 @@ void HtmlDocVisitor::visit(DocInclude *inc) { forceEndParagraph(inc); m_t << PREFRAG_START; - Doxygen::parserManager->getParser(inc->extension()) - ->parseCode(m_ci, + Doxygen::parserManager->getCodeParser(inc->extension()) + .parseCode(m_ci, inc->context(), extractBlock(inc->text(),inc->blockId()), langExt, @@ -757,8 +757,8 @@ void HtmlDocVisitor::visit(DocInclude *inc) m_t << PREFRAG_START; QFileInfo cfi( inc->file() ); FileDef *fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() ); - Doxygen::parserManager->getParser(inc->extension()) - ->parseCode(m_ci, + Doxygen::parserManager->getCodeParser(inc->extension()) + .parseCode(m_ci, inc->context(), extractBlock(inc->text(),inc->blockId()), langExt, @@ -810,8 +810,8 @@ void HtmlDocVisitor::visit(DocIncOperator *op) QFileInfo cfi( op->includeFileName() ); fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() ); } - Doxygen::parserManager->getParser(locLangExt) - ->parseCode( + Doxygen::parserManager->getCodeParser(locLangExt) + .parseCode( m_ci, op->context(), op->text(), diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp index 402b4e4..19a1869 100644 --- a/src/htmlgen.cpp +++ b/src/htmlgen.cpp @@ -300,12 +300,7 @@ static QCString substituteHtmlKeywords(const QCString &s, treeViewCssJs = "<link href=\"$relpath^navtree.css\" rel=\"stylesheet\" type=\"text/css\"/>\n" "<script type=\"text/javascript\" src=\"$relpath^resize.js\"></script>\n" "<script type=\"text/javascript\" src=\"$relpath^navtreedata.js\"></script>\n" - "<script type=\"text/javascript\" src=\"$relpath^navtree.js\"></script>\n" - "<script type=\"text/javascript\">\n" - "/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */\n" - " $(document).ready(initResizable);\n" - "/* @license-end */" - "</script>"; + "<script type=\"text/javascript\" src=\"$relpath^navtree.js\"></script>\n"; } if (searchEngine) @@ -548,6 +543,7 @@ void HtmlCodeGenerator::writeLineNumber(const char *ref,const char *filename, } m_t << "</span>"; m_t << " "; + m_col=0; } void HtmlCodeGenerator::writeCodeLink(const char *ref,const char *f, @@ -2371,7 +2367,7 @@ QCString HtmlGenerator::writeSplitBarAsString(const char *name,const char *relpa "$(document).ready(function(){initNavTree('") + QCString(name) + Doxygen::htmlFileExtension + QCString("','") + relpath + - QCString("');});\n" + QCString("'); initResizable(); });\n" "/* @license-end */\n" "</script>\n" "<div id=\"doc-content\">\n"); diff --git a/src/htmlhelp.cpp b/src/htmlhelp.cpp index 20cb6ca..c514102 100644 --- a/src/htmlhelp.cpp +++ b/src/htmlhelp.cpp @@ -93,7 +93,7 @@ HtmlHelpIndex::~HtmlHelpIndex() } /*! Stores an item in the index if it is not already present. - * Items are stored in alphetical order, by sorting on the + * Items are stored in alphabetical order, by sorting on the * concatenation of \a level1 and \a level2 (if present). * * \param level1 the string at level 1 in the index. diff --git a/src/index.cpp b/src/index.cpp index 1acd941..edc302b 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -368,7 +368,7 @@ void addMembersToIndex(T *def,LayoutDocManager::LayoutPart part, { const MemberList *enumList = md->enumFieldList(); bool isDir = enumList!=0 && md->isEnumerate(); - bool isAnonymous = md->name().find('@')!=-1; + bool isAnonymous = md->isAnonymous(); static bool hideUndocMembers = Config_getBool(HIDE_UNDOC_MEMBERS); static bool extractStatic = Config_getBool(EXTRACT_STATIC); if (!isAnonymous && @@ -1660,7 +1660,7 @@ static void writeNamespaceTree(const NamespaceSDict *nsDict,FTVHelp *ftv, const NamespaceDef *nd; for (nli.toFirst();(nd=nli.current());++nli) { - if (nd->localName().find('@')==-1 && + if (!nd->isAnonymous() && (!rootOnly || nd->getOuterScope()==Doxygen::globalScope)) { @@ -4060,7 +4060,7 @@ static void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp* { const MemberList *enumList = md->enumFieldList(); bool isDir = enumList!=0 && md->isEnumerate(); - if (md->isVisible() && md->name().find('@')==-1) + if (md->isVisible() && !md->isAnonymous()) { Doxygen::indexList->addContentsItem(isDir, md->name(),md->getReference(), diff --git a/src/languages.py b/src/languages.py index 5bb65cf..ea3f348 100755 --- a/src/languages.py +++ b/src/languages.py @@ -74,7 +74,7 @@ for f in new_list: tmp = tmp.replace("\n","") l = re.sub('[^"]*"([^"]*)".*','\\1',tmp) l1 = l.replace("-","") - # capatalize first letter + # capitalize first letter l = l.title() print("""\ <EnumProperty diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp index a0bbf73..de2335b 100644 --- a/src/latexdocvisitor.cpp +++ b/src/latexdocvisitor.cpp @@ -280,7 +280,10 @@ void LatexDocVisitor::visit(DocLineBreak *) void LatexDocVisitor::visit(DocHorRuler *) { if (m_hide) return; - m_t << "\\DoxyHorRuler\n"; + if (insideTable()) + m_t << "\\DoxyHorRuler{1}\n"; + else + m_t << "\\DoxyHorRuler{0}\n"; } void LatexDocVisitor::visit(DocStyleChange *s) @@ -349,8 +352,8 @@ void LatexDocVisitor::visit(DocVerbatim *s) { m_t << "\n\\begin{DoxyCode}{" << usedTableLevels() << "}\n"; LatexCodeGenerator::setDoxyCodeOpen(TRUE); - Doxygen::parserManager->getParser(lang) - ->parseCode(m_ci,s->context(),s->text(),langExt, + Doxygen::parserManager->getCodeParser(lang) + .parseCode(m_ci,s->context(),s->text(),langExt, s->isExample(),s->exampleFile()); LatexCodeGenerator::setDoxyCodeOpen(FALSE); m_t << "\\end{DoxyCode}\n"; @@ -461,8 +464,8 @@ void LatexDocVisitor::visit(DocInclude *inc) LatexCodeGenerator::setDoxyCodeOpen(TRUE); QFileInfo cfi( inc->file() ); FileDef *fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() ); - Doxygen::parserManager->getParser(inc->extension()) - ->parseCode(m_ci,inc->context(), + Doxygen::parserManager->getCodeParser(inc->extension()) + .parseCode(m_ci,inc->context(), inc->text(), langExt, inc->isExample(), @@ -482,8 +485,8 @@ void LatexDocVisitor::visit(DocInclude *inc) case DocInclude::Include: m_t << "\n\\begin{DoxyCodeInclude}{" << usedTableLevels() << "}\n"; LatexCodeGenerator::setDoxyCodeOpen(TRUE); - Doxygen::parserManager->getParser(inc->extension()) - ->parseCode(m_ci,inc->context(), + Doxygen::parserManager->getCodeParser(inc->extension()) + .parseCode(m_ci,inc->context(), inc->text(),langExt,inc->isExample(), inc->exampleFile(), 0, // fileDef @@ -512,8 +515,8 @@ void LatexDocVisitor::visit(DocInclude *inc) { m_t << "\n\\begin{DoxyCodeInclude}{" << usedTableLevels() << "}\n"; LatexCodeGenerator::setDoxyCodeOpen(TRUE); - Doxygen::parserManager->getParser(inc->extension()) - ->parseCode(m_ci, + Doxygen::parserManager->getCodeParser(inc->extension()) + .parseCode(m_ci, inc->context(), extractBlock(inc->text(),inc->blockId()), langExt, @@ -530,8 +533,8 @@ void LatexDocVisitor::visit(DocInclude *inc) FileDef *fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() ); m_t << "\n\\begin{DoxyCodeInclude}{" << usedTableLevels() << "}\n"; LatexCodeGenerator::setDoxyCodeOpen(TRUE); - Doxygen::parserManager->getParser(inc->extension()) - ->parseCode(m_ci, + Doxygen::parserManager->getCodeParser(inc->extension()) + .parseCode(m_ci, inc->context(), extractBlock(inc->text(),inc->blockId()), langExt, @@ -583,8 +586,8 @@ void LatexDocVisitor::visit(DocIncOperator *op) fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() ); } - Doxygen::parserManager->getParser(locLangExt) - ->parseCode(m_ci,op->context(),op->text(),langExt, + Doxygen::parserManager->getCodeParser(locLangExt) + .parseCode(m_ci,op->context(),op->text(),langExt, op->isExample(),op->exampleFile(), fd, // fileDef op->line(), // startLine diff --git a/src/latexgen.cpp b/src/latexgen.cpp index e6c6861..b7eefe3 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -223,6 +223,7 @@ void LatexCodeGenerator::writeLineNumber(const char *ref,const char *fileName,co { m_t << l << " "; } + m_col=0; } @@ -623,6 +624,11 @@ static void writeDefaultHeaderPart1(FTextStream &t) "}\n" "\\makeatother\n" "\n"; + // + t << "\\makeatletter\n" + "\\newcommand\\hrulefilll{\\leavevmode\\leaders\\hrule\\hskip 0pt plus 1filll\\kern\\z@}\n" + "\\makeatother\n" + "\n"; // Headers & footers QGString genString; @@ -1919,7 +1925,7 @@ void LatexGenerator::endMemberDescription() void LatexGenerator::writeNonBreakableSpace(int) { - //printf("writeNonBreakbleSpace()\n"); + //printf("writeNonBreakableSpace()\n"); if (insideTabbing) { t << "\\>"; diff --git a/src/mandocvisitor.cpp b/src/mandocvisitor.cpp index 21e7cb9..3db556d 100644 --- a/src/mandocvisitor.cpp +++ b/src/mandocvisitor.cpp @@ -204,8 +204,8 @@ void ManDocVisitor::visit(DocVerbatim *s) if (!m_firstCol) m_t << endl; m_t << ".PP" << endl; m_t << ".nf" << endl; - Doxygen::parserManager->getParser(lang) - ->parseCode(m_ci,s->context(),s->text(), + Doxygen::parserManager->getCodeParser(lang) + .parseCode(m_ci,s->context(),s->text(), langExt, s->isExample(),s->exampleFile()); if (!m_firstCol) m_t << endl; @@ -257,8 +257,8 @@ void ManDocVisitor::visit(DocInclude *inc) m_t << ".nf" << endl; QFileInfo cfi( inc->file() ); FileDef *fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() ); - Doxygen::parserManager->getParser(inc->extension()) - ->parseCode(m_ci,inc->context(), + Doxygen::parserManager->getCodeParser(inc->extension()) + .parseCode(m_ci,inc->context(), inc->text(), langExt, inc->isExample(), @@ -281,8 +281,8 @@ void ManDocVisitor::visit(DocInclude *inc) if (!m_firstCol) m_t << endl; m_t << ".PP" << endl; m_t << ".nf" << endl; - Doxygen::parserManager->getParser(inc->extension()) - ->parseCode(m_ci,inc->context(), + Doxygen::parserManager->getCodeParser(inc->extension()) + .parseCode(m_ci,inc->context(), inc->text(), langExt, inc->isExample(), @@ -318,8 +318,8 @@ void ManDocVisitor::visit(DocInclude *inc) if (!m_firstCol) m_t << endl; m_t << ".PP" << endl; m_t << ".nf" << endl; - Doxygen::parserManager->getParser(inc->extension()) - ->parseCode(m_ci, + Doxygen::parserManager->getCodeParser(inc->extension()) + .parseCode(m_ci, inc->context(), extractBlock(inc->text(),inc->blockId()), langExt, @@ -338,8 +338,8 @@ void ManDocVisitor::visit(DocInclude *inc) m_t << ".nf" << endl; QFileInfo cfi( inc->file() ); FileDef *fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() ); - Doxygen::parserManager->getParser(inc->extension()) - ->parseCode(m_ci, + Doxygen::parserManager->getCodeParser(inc->extension()) + .parseCode(m_ci, inc->context(), extractBlock(inc->text(),inc->blockId()), langExt, @@ -397,8 +397,8 @@ void ManDocVisitor::visit(DocIncOperator *op) fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() ); } - Doxygen::parserManager->getParser(locLangExt) - ->parseCode(m_ci,op->context(),op->text(),langExt, + Doxygen::parserManager->getCodeParser(locLangExt) + .parseCode(m_ci,op->context(),op->text(),langExt, op->isExample(),op->exampleFile(), fd, // fileDef op->line(), // startLine diff --git a/src/mangen.h b/src/mangen.h index d912923..192be6d 100644 --- a/src/mangen.h +++ b/src/mangen.h @@ -132,7 +132,7 @@ class ManGenerator : public OutputGenerator void writeAnchor(const char *,const char *) {} void startCodeFragment(); void endCodeFragment(); - void writeLineNumber(const char *,const char *,const char *,int l) { t << l << " "; } + void writeLineNumber(const char *,const char *,const char *,int l) { t << l << " "; col=0; } void startCodeLine(bool) {} void endCodeLine() { codify("\n"); col=0; } void startEmphasis() { t << "\\fI"; firstCol=FALSE; } diff --git a/src/markdown.cpp b/src/markdown.cpp index d1a6a63..42ea2ff 100644 --- a/src/markdown.cpp +++ b/src/markdown.cpp @@ -2021,7 +2021,7 @@ static int writeBlockQuote(GrowBuf &out,const char *data,int size) out.addStr("<blockquote>\n"); } } - else if (level<curLevel) // quote level descreased => add end markers + else if (level<curLevel) // quote level decreased => add end markers { for (l=level;l<curLevel;l++) { @@ -2176,7 +2176,7 @@ static void writeFencedCodeBlock(GrowBuf &out,const char *data,const char *lng, } out.addStr(data+blockStart,blockEnd-blockStart); out.addStr("\n"); - out.addStr("@endcode"); + out.addStr("@endcode\n"); } static QCString processQuotations(const QCString &s,int refIndent) @@ -2470,7 +2470,7 @@ static QCString detab(const QCString &s,int &refIndent) while (stop--) out.addChar(' '); } break; - case '\n': // reset colomn counter + case '\n': // reset column counter out.addChar(c); col=0; break; @@ -2576,13 +2576,13 @@ QCString markdownFileNameToId(const QCString &fileName) } -void MarkdownFileParser::parseInput(const char *fileName, +void MarkdownOutlineParser::parseInput(const char *fileName, const char *fileBuf, - const std::unique_ptr<Entry> &root, + const std::shared_ptr<Entry> &root, bool /*sameTranslationUnit*/, QStrList & /*filesInSameTranslationUnit*/) { - std::unique_ptr<Entry> current = std::make_unique<Entry>(); + std::shared_ptr<Entry> current = std::make_shared<Entry>(); current->lang = SrcLangExt_Markdown; current->fileName = fileName; current->docFile = fileName; @@ -2660,47 +2660,14 @@ void MarkdownFileParser::parseInput(const char *fileName, g_indentLevel=0; } -void MarkdownFileParser::parseCode(CodeOutputInterface &codeOutIntf, - const char *scopeName, - const QCString &input, - SrcLangExt lang, - bool isExampleBlock, - const char *exampleName, - FileDef *fileDef, - int startLine, - int endLine, - bool inlineFragment, - const MemberDef *memberDef, - bool showLineNumbers, - const Definition *searchCtx, - bool collectXRefs - ) +void MarkdownOutlineParser::parsePrototype(const char *text) { - ParserInterface *pIntf = Doxygen::parserManager->getParser("*.cpp"); - if (pIntf!=this) + OutlineParserInterface &intf = Doxygen::parserManager->getOutlineParser("*.cpp"); + if (&intf!=this) { - pIntf->parseCode( - codeOutIntf,scopeName,input,lang,isExampleBlock,exampleName, - fileDef,startLine,endLine,inlineFragment,memberDef,showLineNumbers, - searchCtx,collectXRefs); + intf.parsePrototype(text); } } -void MarkdownFileParser::resetCodeParserState() -{ - ParserInterface *pIntf = Doxygen::parserManager->getParser("*.cpp"); - if (pIntf!=this) - { - pIntf->resetCodeParserState(); - } -} - -void MarkdownFileParser::parsePrototype(const char *text) -{ - ParserInterface *pIntf = Doxygen::parserManager->getParser("*.cpp"); - if (pIntf!=this) - { - pIntf->parsePrototype(text); - } -} +//------------------------------------------------------------------------ diff --git a/src/markdown.h b/src/markdown.h index f101e5a..3ffd155 100644 --- a/src/markdown.h +++ b/src/markdown.h @@ -25,38 +25,20 @@ class Entry; QCString processMarkdown(const QCString &fileName,const int lineNr,Entry *e,const QCString &s); QCString markdownFileNameToId(const QCString &fileName); -class MarkdownFileParser : public ParserInterface +class MarkdownOutlineParser : public OutlineParserInterface { public: - virtual ~MarkdownFileParser() {} + virtual ~MarkdownOutlineParser() {} void startTranslationUnit(const char *) {} void finishTranslationUnit() {} void parseInput(const char *fileName, const char *fileBuf, - const std::unique_ptr<Entry> &root, + const std::shared_ptr<Entry> &root, bool sameTranslationUnit, QStrList &filesInSameTranslationUnit); - bool needsPreprocessing(const QCString &) { return FALSE; } - void parseCode(CodeOutputInterface &codeOutIntf, - const char *scopeName, - const QCString &input, - SrcLangExt lang, - bool isExampleBlock, - const char *exampleName=0, - FileDef *fileDef=0, - int startLine=-1, - int endLine=-1, - bool inlineFragment=FALSE, - const MemberDef *memberDef=0, - bool showLineNumbers=TRUE, - const Definition *searchCtx=0, - bool collectXRefs=TRUE - ); - void resetCodeParserState(); + bool needsPreprocessing(const QCString &) const { return FALSE; } void parsePrototype(const char *text); }; - - #endif diff --git a/src/memberdef.cpp b/src/memberdef.cpp index b79bd50..85d1cdf 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -1300,32 +1300,32 @@ class MemberDefImpl::IMPL const ArgumentList &al,const char *meta ); - ClassDef *classDef; // member of or related to - FileDef *fileDef; // member of file definition - NamespaceDef *nspace; // the namespace this member is in. + ClassDef *classDef = 0; // member of or related to + FileDef *fileDef = 0; // member of file definition + NamespaceDef *nspace = 0; // the namespace this member is in. - MemberDef *enumScope; // the enclosing scope, if this is an enum field - bool livesInsideEnum; - const MemberDef *annEnumType; // the anonymous enum that is the type of this member - MemberList *enumFields; // enumeration fields + MemberDef *enumScope = 0; // the enclosing scope, if this is an enum field + bool livesInsideEnum = false; + const MemberDef *annEnumType = 0; // the anonymous enum that is the type of this member + MemberList *enumFields = 0; // enumeration fields - MemberDef *redefines; // the members that this member redefines - MemberList *redefinedBy; // the list of members that redefine this one + MemberDef *redefines = 0; // the members that this member redefines + MemberList *redefinedBy = 0; // the list of members that redefine this one - MemberDef *memDef; // member definition for this declaration - MemberDef *memDec; // member declaration for this definition - ClassDef *relatedAlso; // points to class marked by relatedAlso + MemberDef *memDef = 0; // member definition for this declaration + MemberDef *memDec = 0; // member declaration for this definition + ClassDef *relatedAlso = 0; // points to class marked by relatedAlso - ExampleSDict *exampleSDict; // a dictionary of all examples for quick access + ExampleSDict *exampleSDict = 0; // a dictionary of all examples for quick access QCString type; // return actual type QCString accessorType; // return type that tell how to get to this member - ClassDef *accessorClass; // class that this member accesses (for anonymous types) + ClassDef *accessorClass = 0; // class that this member accesses (for anonymous types) QCString args; // function arguments/variable array specifiers QCString def; // member definition in code (fully qualified name) QCString anc; // HTML anchor name - Specifier virt; // normal/virtual/pure virtual - Protection prot; // protection type [Public/Protected/Private] + Specifier virt = Normal; // normal/virtual/pure virtual + Protection prot = Public; // protection type [Public/Protected/Private] QCString decl; // member declaration in class QCString bitfields; // struct member bitfields @@ -1335,13 +1335,13 @@ class MemberDefImpl::IMPL QCString initializer; // initializer QCString extraTypeChars; // extra type info found after the argument list QCString enumBaseType; // base type of the enum (C++11) - int initLines; // number of lines in the initializer + int initLines = 0; // number of lines in the initializer - uint64 memSpec; // The specifiers present for this member - MemberType mtype; // returns the kind of member - int maxInitLines; // when the initializer will be displayed - int userInitLines; // result of explicit \hideinitializer or \showinitializer - MemberDef *annMemb; + uint64 memSpec = 0; // The specifiers present for this member + MemberType mtype = MemberType_Define; // returns the kind of member + int maxInitLines = 0; // when the initializer will be displayed + int userInitLines = 0; // result of explicit \hideinitializer or \showinitializer + MemberDef *annMemb = 0; ArgumentList defArgList; // argument list of this member definition ArgumentList declArgList; // argument list of this member declaration @@ -1358,19 +1358,19 @@ class MemberDefImpl::IMPL // as its type then this is computed by // getClassDefOfAnonymousType() and // cached here. - SDict<MemberList> *classSectionSDict; // not accessible + SDict<MemberList> *classSectionSDict = 0; // not accessible - const MemberDef *groupAlias; // Member containing the definition - int grpId; // group id - MemberGroup *memberGroup; // group's member definition - GroupDef *group; // group in which this member is in + const MemberDef *groupAlias = 0; // Member containing the definition + int grpId = 0; // group id + MemberGroup *memberGroup = 0; // group's member definition + GroupDef *group = 0; // group in which this member is in Grouping::GroupPri_t grouppri; // priority of this definition QCString groupFileName; // file where this grouping was defined - int groupStartLine; // line " " " " " - MemberDef *groupMember; + int groupStartLine = 0; // line " " " " " + MemberDef *groupMember = 0; - bool isTypedefValCached; - const ClassDef *cachedTypedefValue; + bool isTypedefValCached = false; + const ClassDef *cachedTypedefValue = 0; QCString cachedTypedefTemplSpec; QCString cachedResolvedType; @@ -1380,41 +1380,41 @@ class MemberDefImpl::IMPL //QCString inbodyDocs; // documentation inheritance - MemberDef *docProvider; + MemberDef *docProvider = 0; // to store the output file base from tag files QCString explicitOutputFileBase; // objective-c - bool implOnly; // function found in implementation but not - // in the interface - mutable bool hasDocumentedParams; - mutable bool hasDocumentedReturnType; - bool isDMember; - Relationship related; // relationship of this to the class - bool stat; // is it a static function? - bool proto; // is it a prototype; - bool docEnumValues; // is an enum with documented enum values. - - mutable bool annScope; // member is part of an anonymous scope - mutable bool annUsed; // ugly: needs to be mutable to allow setAnonymousUsed to act as a - // const member. - bool hasCallGraph; - bool hasCallerGraph; - bool hasReferencedByRelation; - bool hasReferencesRelation; - bool explExt; // member was explicitly declared external - bool tspec; // member is a template specialization - bool groupHasDocs; // true if the entry that caused the grouping was documented - bool docsForDefinition; // TRUE => documentation block is put before - // definition. - // FALSE => block is put before declaration. - ClassDef *category; - MemberDef *categoryRelation; + bool implOnly = false; // function found in implementation but not + // in the interface + mutable bool hasDocumentedParams = false; + mutable bool hasDocumentedReturnType = false; + bool isDMember = false; + Relationship related = Member; // relationship of this to the class + bool stat = false; // is it a static function? + bool proto = false; // is it a prototype? + bool docEnumValues = false; // is an enum with documented enum values. + + mutable bool annScope = false; // member is part of an anonymous scope + mutable bool annUsed = false; // ugly: needs to be mutable to allow setAnonymousUsed to act as a + // const member. + bool hasCallGraph = false; + bool hasCallerGraph = false; + bool hasReferencedByRelation = false; + bool hasReferencesRelation = false; + bool explExt = false; // member was explicitly declared external + bool tspec = false; // member is a template specialization + bool groupHasDocs = false; // true if the entry that caused the grouping was documented + bool docsForDefinition = false; // TRUE => documentation block is put before + // definition. + // FALSE => block is put before declaration. + ClassDef *category = 0; + MemberDef *categoryRelation = 0; QCString declFileName; - int declLine; - int declColumn; - int numberOfFlowKW; + int declLine = 0; + int declColumn = 0; + int numberOfFlowKW = 0; }; MemberDefImpl::IMPL::IMPL() : @@ -1771,7 +1771,7 @@ QCString MemberDefImpl::getOutputFileBase() const return baseName; } } - else if (nspace && nspace->isLinkableInProject()) + else if (nspace) { baseName=nspace->getOutputFileBase(); } @@ -1877,7 +1877,7 @@ void MemberDefImpl::_computeLinkableInProject() m_isLinkableCached = templateMaster()->isLinkableInProject() ? 2 : 1; return; } - if (name().isEmpty() || name().at(0)=='@') + if (isAnonymous()) { //printf("name invalid\n"); m_isLinkableCached = 1; // not a valid or a dummy name @@ -2257,10 +2257,10 @@ void MemberDefImpl::writeDeclaration(OutputList &ol, ol.startMemberDeclaration(); // start a new member declaration - bool isAnonymous = annoClassDef || m_impl->annMemb || m_impl->annEnumType; + bool isAnonType = annoClassDef || m_impl->annMemb || m_impl->annEnumType; ///printf("startMemberItem for %s\n",name().data()); ol.startMemberItem(anchor(), - isAnonymous ? 1 : !m_impl->tArgList.empty() ? 3 : 0, + isAnonType ? 1 : !m_impl->tArgList.empty() ? 3 : 0, inheritId ); @@ -2301,9 +2301,9 @@ void MemberDefImpl::writeDeclaration(OutputList &ol, // *** write template lists if (m_impl->tArgList.hasParameters() && getLanguage()==SrcLangExt_Cpp) { - if (!isAnonymous) ol.startMemberTemplateParams(); + if (!isAnonType) ol.startMemberTemplateParams(); writeTemplatePrefix(ol,m_impl->tArgList); - if (!isAnonymous) ol.endMemberTemplateParams(anchor(),inheritId); + if (!isAnonType) ol.endMemberTemplateParams(anchor(),inheritId); } // *** write type @@ -2343,7 +2343,7 @@ void MemberDefImpl::writeDeclaration(OutputList &ol, QCString varName=ltype.right(ltype.length()-ir).stripWhiteSpace(); //printf(">>>>>> ltype='%s' varName='%s'\n",ltype.data(),varName.data()); ol.docify("}"); - if (varName.isEmpty() && (name().isEmpty() || name().at(0)=='@')) + if (varName.isEmpty() && isAnonymous()) { ol.docify(";"); } @@ -2425,13 +2425,13 @@ void MemberDefImpl::writeDeclaration(OutputList &ol, } // *** write name - if (!name().isEmpty() && name().at(0)!='@') // hide anonymous stuff + if (!isAnonymous()) // hide anonymous stuff { static bool extractPrivate = Config_getBool(EXTRACT_PRIVATE); static bool extractPrivateVirtual = Config_getBool(EXTRACT_PRIV_VIRTUAL); static bool extractStatic = Config_getBool(EXTRACT_STATIC); //printf("Member name=`%s gd=%p md->groupDef=%p inGroup=%d isLinkable()=%d hasDocumentation=%d\n",name().data(),gd,getGroupDef(),inGroup,isLinkable(),hasDocumentation()); - if (!(name().isEmpty() || name().at(0)=='@') && // name valid + if (!name().isEmpty() && // name valid (hasDocumentation() || isReference()) && // has docs !(m_impl->prot==Private && !extractPrivate && (m_impl->virt==Normal || !extractPrivateVirtual) && m_impl->mtype!=MemberType_Friend) && // hidden due to protection !(isStatic() && getClassDef()==0 && !extractStatic) // hidden due to static-ness @@ -2479,7 +2479,7 @@ void MemberDefImpl::writeDeclaration(OutputList &ol, } // add to index - if (isEnumerate() && name().at(0)=='@') + if (isEnumerate() && isAnonymous()) { // don't add to index } @@ -2877,7 +2877,8 @@ void MemberDefImpl::_writeCallGraph(OutputList &ol) const DotCallGraph callGraph(this,FALSE); if (callGraph.isTooBig()) { - warn_uncond("Call graph for '%s' not generated, too many nodes. Consider increasing DOT_GRAPH_MAX_NODES.\n",qPrint(qualifiedName())); + warn_uncond("Call graph for '%s' not generated, too many nodes (%d), threshold is %d. Consider increasing DOT_GRAPH_MAX_NODES.\n", + qPrint(qualifiedName()), callGraph.numNodes(), Config_getInt(DOT_GRAPH_MAX_NODES)); } else if (!callGraph.isTrivial()) { @@ -2900,7 +2901,8 @@ void MemberDefImpl::_writeCallerGraph(OutputList &ol) const DotCallGraph callerGraph(this, TRUE); if (callerGraph.isTooBig()) { - warn_uncond("Caller graph for '%s' not generated, too many nodes. Consider increasing DOT_GRAPH_MAX_NODES.\n",qPrint(qualifiedName())); + warn_uncond("Caller graph for '%s' not generated, too many nodes (%d), threshold is %d. Consider increasing DOT_GRAPH_MAX_NODES.\n", + qPrint(qualifiedName()), callerGraph.numNodes(), Config_getInt(DOT_GRAPH_MAX_NODES)); } else if (!callerGraph.isTrivial()) { @@ -3202,7 +3204,7 @@ QCString MemberDefImpl::displayDefinition() const QCString title = name(); if (isEnumerate()) { - if (title.at(0)=='@') + if (isAnonymous()) { ldef = title = "anonymous enum"; if (!m_impl->enumBaseType.isEmpty()) @@ -3221,7 +3223,7 @@ QCString MemberDefImpl::displayDefinition() const } else if (isEnumValue()) { - if (ldef.at(0)=='@') + if (isAnonymous()) { ldef=ldef.mid(2); } @@ -3705,10 +3707,10 @@ void MemberDefImpl::writeDocumentation(const MemberList *ml, else ol.parseText(theTranslator->trInitialValue()); ol.endBold(); - ParserInterface *pIntf = Doxygen::parserManager->getParser(getDefFileExtension()); - pIntf->resetCodeParserState(); + CodeParserInterface &intf = Doxygen::parserManager->getCodeParser(getDefFileExtension()); + intf.resetCodeParserState(); ol.startCodeFragment(); - pIntf->parseCode(ol,scopeName,m_impl->initializer,lang,FALSE,0,const_cast<FileDef*>(getFileDef()), + intf.parseCode(ol,scopeName,m_impl->initializer,lang,FALSE,0,const_cast<FileDef*>(getFileDef()), -1,-1,TRUE,this,FALSE,this); ol.endCodeFragment(); } diff --git a/src/membergroup.cpp b/src/membergroup.cpp index da52d64..05c38c3 100644 --- a/src/membergroup.cpp +++ b/src/membergroup.cpp @@ -358,7 +358,7 @@ void MemberGroup::findSectionsInDocumentation(const Definition *d) void MemberGroup::setRefItems(const std::vector<ListItemInfo> &sli) { - m_xrefListItems = sli; + m_xrefListItems.insert(m_xrefListItems.end(), sli.cbegin(), sli.cend()); } void MemberGroup::writeTagFile(FTextStream &tagFile) @@ -370,5 +370,5 @@ void MemberGroup::writeTagFile(FTextStream &tagFile) void MemberGroupInfo::setRefItems(const std::vector<ListItemInfo> &sli) { - m_sli = sli; + m_sli.insert(m_sli.end(), sli.cbegin(), sli.cend()); } diff --git a/src/membergroup.h b/src/membergroup.h index 0fda3d7..aa30063 100644 --- a/src/membergroup.h +++ b/src/membergroup.h @@ -89,18 +89,18 @@ class MemberGroup int docLine() const { return m_docLine; } private: - MemberList *memberList; // list of all members in the group - MemberList *inDeclSection; - int grpId; + MemberList *memberList = 0; // list of all members in the group + MemberList *inDeclSection = 0; + int grpId = 0; QCString grpHeader; QCString fileName; // base name of the generated file QCString doc; - bool inSameSection; - int m_numDecMembers; - int m_numDocMembers; - const Definition *m_parent; + bool inSameSection = 0; + int m_numDecMembers = 0; + int m_numDocMembers = 0; + const Definition *m_parent = 0; QCString m_docFile; - int m_docLine; + int m_docLine = 0; std::vector<ListItemInfo> m_xrefListItems; }; diff --git a/src/message.cpp b/src/message.cpp index ddf757a..591267d 100644 --- a/src/message.cpp +++ b/src/message.cpp @@ -90,7 +90,7 @@ void initWarningFormat() if (!Config_getString(WARN_LOGFILE).isEmpty()) { - warnFile = portable_fopen(Config_getString(WARN_LOGFILE),"w"); + warnFile = Portable::fopen(Config_getString(WARN_LOGFILE),"w"); } if (!warnFile) // point it to something valid, because warn() relies on it { diff --git a/src/msc.cpp b/src/msc.cpp index 51e23fa..29c9334 100644 --- a/src/msc.cpp +++ b/src/msc.cpp @@ -95,7 +95,7 @@ void writeMscGraphFromFile(const char *inFile,const char *outDir, const char *outFile,MscOutputFormat format) { QCString absOutFile = outDir; - absOutFile+=portable_pathSeparator(); + absOutFile+=Portable::pathSeparator(); absOutFile+=outFile; mscgen_format_t msc_format; @@ -130,12 +130,12 @@ void writeMscGraphFromFile(const char *inFile,const char *outDir, QCString epstopdfArgs(maxCmdLine); epstopdfArgs.sprintf("\"%s.eps\" --outfile=\"%s.pdf\"", absOutFile.data(),absOutFile.data()); - portable_sysTimerStart(); - if (portable_system("epstopdf",epstopdfArgs)!=0) + Portable::sysTimerStart(); + if (Portable::system("epstopdf",epstopdfArgs)!=0) { err("Problems running epstopdf. Check your TeX installation!\n"); } - portable_sysTimerStop(); + Portable::sysTimerStop(); } Doxygen::indexList->addImageFile(imgName); diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp index fa258a0..220f300 100644 --- a/src/namespacedef.cpp +++ b/src/namespacedef.cpp @@ -124,23 +124,23 @@ class NamespaceDefImpl : public DefinitionImpl, public NamespaceDef QCString fileName; FileList files; - NamespaceSDict *usingDirList; - SDict<Definition> *usingDeclList; - SDict<Definition> *m_innerCompounds; + NamespaceSDict *usingDirList = 0; + SDict<Definition> *usingDeclList = 0; + SDict<Definition> *m_innerCompounds = 0; - MemberSDict *m_allMembersDict; + MemberSDict *m_allMembersDict = 0; QList<MemberList> m_memberLists; - MemberGroupSDict *memberGroupSDict; - ClassSDict *classSDict; - ClassSDict *interfaceSDict; - ClassSDict *structSDict; - ClassSDict *exceptionSDict; - NamespaceSDict *namespaceSDict; - bool m_subGrouping; + MemberGroupSDict *memberGroupSDict = 0; + ClassSDict *classSDict = 0; + ClassSDict *interfaceSDict = 0; + ClassSDict *structSDict = 0; + ClassSDict *exceptionSDict = 0; + NamespaceSDict *namespaceSDict = 0; + bool m_subGrouping = false; enum { NAMESPACE, MODULE, CONSTANT_GROUP, LIBRARY } m_type; - bool m_isPublished; + bool m_isPublished = false; QCString metaData; - bool m_inline; + bool m_inline = false; }; NamespaceDef *createNamespaceDef(const char *defFileName,int defLine,int defColumn, @@ -246,7 +246,7 @@ class NamespaceDefAliasImpl : public DefinitionAliasImpl, public NamespaceDef bool isVisited() const { return m_visited; } private: - bool m_visited; + bool m_visited = false; }; NamespaceDef *createNamespaceDefAlias(const Definition *newScope,const NamespaceDef *nd) diff --git a/src/parserintf.h b/src/parserintf.h index a269bfb..5095a1e 100644 --- a/src/parserintf.h +++ b/src/parserintf.h @@ -18,10 +18,11 @@ #ifndef PARSERINTF_H #define PARSERINTF_H -#include <qdict.h> #include <qstrlist.h> #include <memory> +#include <map> +#include <string> #include "types.h" @@ -31,16 +32,16 @@ class CodeOutputInterface; class MemberDef; class Definition; -/** \brief Abstract interface for programming language parsers. +/** \brief Abstract interface for outline parsers. * * By implementing the methods of this interface one can add - * a new language parser to doxygen. The parser can make use of the + * a new language parser to doxygen. The parser implementation can make use of the * comment block parser to parse the contents of special comment blocks. */ -class ParserInterface +class OutlineParserInterface { public: - virtual ~ParserInterface() {} + virtual ~OutlineParserInterface() {} /** Starts processing a translation unit (source files + headers). * After this call parseInput() is called with sameTranslationUnit @@ -69,7 +70,7 @@ class ParserInterface */ virtual void parseInput(const char *fileName, const char *fileBuf, - const std::unique_ptr<Entry> &root, + const std::shared_ptr<Entry> &root, bool sameTranslationUnit, QStrList &filesInSameTranslationUnit) = 0; @@ -78,8 +79,29 @@ class ParserInterface * parser. * @see parseInput() */ - virtual bool needsPreprocessing(const QCString &extension) = 0; + virtual bool needsPreprocessing(const QCString &extension) const = 0; + /** Callback function called by the comment block scanner. + * It provides a string \a text containing the prototype of a function + * or variable. The parser should parse this and store the information + * in the Entry node that corresponds with the node for which the + * comment block parser was invoked. + */ + virtual void parsePrototype(const char *text) = 0; + +}; + +/** \brief Abstract interface for code parsers. + * + * By implementing the methods of this interface one can add + * a new language parser to doxygen. This interface is used for + * syntax highlighting, but also to extract cross references and call graphs. + */ +class CodeParserInterface +{ + public: + virtual ~CodeParserInterface() {} + /** Parses a source file or fragment with the goal to produce * highlighted and cross-referenced output. * @param[in] codeOutIntf Abstract interface for writing the result. @@ -125,14 +147,6 @@ class ParserInterface */ virtual void resetCodeParserState() = 0; - /** Callback function called by the comment block scanner. - * It provides a string \a text containing the prototype of a function - * or variable. The parser should parse this and store the information - * in the Entry node that corresponds with the node for which the - * comment block parser was invoked. - */ - virtual void parsePrototype(const char *text) = 0; - }; //----------------------------------------------------------------------------- @@ -145,18 +159,22 @@ class ParserInterface class ParserManager { public: - /** Creates the parser manager object. - */ - ParserManager() - : m_defaultParser(0) { m_parsers.setAutoDelete(TRUE); } - ~ParserManager() + struct ParserPair { - delete m_defaultParser; - } + ParserPair(std::unique_ptr<OutlineParserInterface> oli, + std::unique_ptr<CodeParserInterface> cpi) + : outlineParser(std::move(oli)), codeParser(std::move(cpi)) + { + } - void registerDefaultParser(ParserInterface *parser) + std::unique_ptr<OutlineParserInterface> outlineParser; + std::unique_ptr<CodeParserInterface> codeParser; + }; + + ParserManager(std::unique_ptr<OutlineParserInterface> outlineParser, + std::unique_ptr<CodeParserInterface> codeParser) + : m_defaultParsers(std::move(outlineParser),std::move(codeParser)) { - m_defaultParser = parser; } /** Registers an additional parser. @@ -165,9 +183,11 @@ class ParserManager * @param[in] parser The parser that is to be used for the * given name. */ - void registerParser(const char *name,ParserInterface *parser) + void registerParser(const char *name,std::unique_ptr<OutlineParserInterface> outlineParser, + std::unique_ptr<CodeParserInterface> codeParser) { - m_parsers.insert(name,parser); + m_parsers.emplace(std::string(name), + ParserPair(std::move(outlineParser),std::move(codeParser))); } /** Registers a file \a extension with a parser with name \a parserName. @@ -176,13 +196,16 @@ class ParserManager bool registerExtension(const char *extension, const char *parserName) { if (parserName==0 || extension==0) return FALSE; - ParserInterface *intf = m_parsers.find(parserName); - if (intf==0) return FALSE; - if (m_extensions.find(extension)!=0) // extension already exists + + const auto &parserIt = m_parsers.find(parserName); + if (parserIt == m_parsers.end()) return FALSE; + + auto extensionIt = m_extensions.find(extension); + if (extensionIt != m_extensions.end()) // extension already exists { - m_extensions.remove(extension); // remove it + m_extensions.erase(extensionIt); // remove it (e.g. user specified extension overrules built in one) } - m_extensions.insert(extension,intf); // add new mapping + m_extensions.emplace(std::string(extension),parserIt->second); // add new mapping return TRUE; } @@ -190,22 +213,36 @@ class ParserManager * If there is no parser explicitly registered for the supplied extension, * the interface to the default parser will be returned. */ - ParserInterface *getParser(const char *extension) + OutlineParserInterface &getOutlineParser(const char *extension) { - QCString ext = QCString(extension).lower(); + return *getParsers(extension).outlineParser; + } + + /** Gets the interface to the parser associated with given \a extension. + * If there is no parser explicitly registered for the supplied extension, + * the interface to the default parser will be returned. + */ + CodeParserInterface &getCodeParser(const char *extension) + { + return *getParsers(extension).codeParser; + } + + private: + ParserPair &getParsers(const char *extension) + { + QCString ext = QCString(extension).lower().data(); if (ext.isEmpty()) ext=".no_extension"; - ParserInterface *intf = m_extensions.find(ext); - if (intf==0 && ext.length()>4) + auto it = m_extensions.find(ext.data()); + if (it==m_extensions.end() && ext.length()>4) { - intf = m_extensions.find(ext.left(4)); + it = m_extensions.find(ext.left(4).data()); } - return intf ? intf : m_defaultParser; + return it!=m_extensions.end() ? it->second : m_defaultParsers; } - private: - QDict<ParserInterface> m_parsers; - QDict<ParserInterface> m_extensions; - ParserInterface *m_defaultParser; + std::map<std::string,ParserPair> m_parsers; + std::map<std::string,ParserPair &> m_extensions; + ParserPair m_defaultParsers; }; #endif diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp index c8f9273..be226b7 100644 --- a/src/perlmodgen.cpp +++ b/src/perlmodgen.cpp @@ -1792,9 +1792,9 @@ void PerlModGenerator::generatePerlModForClass(const ClassDef *cd) // + standard member sections // + detailed member documentation // - examples using the class - + if (cd->isReference()) return; // skip external references. - if (cd->name().find('@')!=-1) return; // skip anonymous compounds. + if (cd->isAnonymous()) return; // skip anonymous compounds. if (cd->templateMaster()!=0) return; // skip generated template instances. m_output.openHash() diff --git a/src/plantuml.cpp b/src/plantuml.cpp index ff4ebd3..fa50f2d 100644 --- a/src/plantuml.cpp +++ b/src/plantuml.cpp @@ -210,7 +210,7 @@ static void runPlantumlContent(const QDict< QList <QCString> > &plantumlFiles, } while (s) { - pumlArgs += portable_pathListSeparator(); + pumlArgs += Portable::pathListSeparator(); pumlArgs += s; s = pumlIncludePathList.next(); } @@ -227,7 +227,7 @@ static void runPlantumlContent(const QDict< QList <QCString> > &plantumlFiles, pumlArgs += "-graphvizdot \""; pumlArgs += dotPath; pumlArgs += "dot"; - pumlArgs += portable_commandExtension(); + pumlArgs += Portable::commandExtension(); pumlArgs += "\" "; } switch (format) @@ -283,8 +283,8 @@ static void runPlantumlContent(const QDict< QList <QCString> > &plantumlFiles, file.close(); Debug::print(Debug::Plantuml,0,"*** %s Running Plantuml arguments:%s\n","PlantumlManager::runPlantumlContent",qPrint(pumlArguments)); - portable_sysTimerStart(); - if ((exitCode=portable_system(pumlExe,pumlArguments,TRUE))!=0) + Portable::sysTimerStart(); + if ((exitCode=Portable::system(pumlExe,pumlArguments,TRUE))!=0) { err("Problems running PlantUML. Verify that the command 'java -jar \"%splantuml.jar\" -h' works from the command line. Exit code: %d\n", plantumlJarPath.data(),exitCode); @@ -294,7 +294,7 @@ static void runPlantumlContent(const QDict< QList <QCString> > &plantumlFiles, Debug::print(Debug::Plantuml,0,"*** %s Remove %s file\n","PlantumlManager::runPlantumlContent",qPrint(puFileName)); file.remove(); } - portable_sysTimerStop(); + Portable::sysTimerStop(); if ( (format==PlantumlManager::PUML_EPS) && (Config_getBool(USE_PDFLATEX)) ) { @@ -309,12 +309,12 @@ static void runPlantumlContent(const QDict< QList <QCString> > &plantumlFiles, const int maxCmdLine = 40960; QCString epstopdfArgs(maxCmdLine); epstopdfArgs.sprintf("\"%s%s.eps\" --outfile=\"%s%s.pdf\"",qPrint(pumlOutDir),qPrint(*nb),qPrint(pumlOutDir),qPrint(*nb)); - portable_sysTimerStart(); - if ((exitCode=portable_system("epstopdf",epstopdfArgs))!=0) + Portable::sysTimerStart(); + if ((exitCode=Portable::system("epstopdf",epstopdfArgs))!=0) { err("Problems running epstopdf. Check your TeX installation! Exit code: %d\n",exitCode); } - portable_sysTimerStop(); + Portable::sysTimerStop(); } } } diff --git a/src/portable.cpp b/src/portable.cpp index c6e829d..1134351 100644 --- a/src/portable.cpp +++ b/src/portable.cpp @@ -1,36 +1,43 @@ +#include "portable.h" + #include <stdlib.h> -#include <ctype.h> +#include <stdio.h> + #if defined(_WIN32) && !defined(__CYGWIN__) #undef UNICODE #define _WIN32_DCOM #include <windows.h> #else #include <unistd.h> -#include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> #include <errno.h> extern char **environ; #endif +#include <ctype.h> #include <qglobal.h> #include <qdatetime.h> +#include <qglobal.h> +#include <qdir.h> +#include <map> +#include <string> -#if defined(_MSC_VER) || defined(__BORLANDC__) -#define popen _popen -#define pclose _pclose -#endif - -#include "portable.h" #include "util.h" #ifndef NODEBUG #include "debug.h" #endif +#if !defined(_WIN32) || defined(__CYGWIN__) +static bool environmentLoaded = false; +static std::map<std::string,std::string> proc_env = std::map<std::string,std::string>(); +#endif + static double g_sysElapsedTime; static QTime g_time; -int portable_system(const char *command,const char *args,bool commandHasConsole) + +int Portable::system(const char *command,const char *args,bool commandHasConsole) { if (command==0) return 1; @@ -127,7 +134,7 @@ int portable_system(const char *command,const char *args,bool commandHasConsole) #else // Win32 specific if (commandHasConsole) { - return system(fullCmd); + return ::system(fullCmd); } else { @@ -189,13 +196,13 @@ int portable_system(const char *command,const char *args,bool commandHasConsole) } -uint portable_pid() +unsigned int Portable::pid(void) { - uint pid; + unsigned int pid; #if !defined(_WIN32) || defined(__CYGWIN__) - pid = (uint)getpid(); + pid = (unsigned int)getpid(); #else - pid = (uint)GetCurrentProcessId(); + pid = (unsigned int)GetCurrentProcessId(); #endif return pid; } @@ -205,88 +212,50 @@ uint portable_pid() static char **last_environ; #endif -void portable_setenv(const char *name,const char *value) +#if !defined(_WIN32) || defined(__CYGWIN__) +void loadEnvironment() { - if (value==0) value=""; -#if defined(_WIN32) && !defined(__CYGWIN__) - SetEnvironmentVariable(name,value); -#else - char **ep = 0; - size_t size; - const size_t namelen=qstrlen(name); - const size_t vallen=qstrlen(value) + 1; + if(environ != NULL) + { + unsigned int i = 0; + char* current = environ[i]; - size = 0; - if (environ!=0) + while(current != NULL) // parse all strings contained by environ til the last element (NULL) { - for (ep = environ; *ep; ++ep) - { - if (!qstrncmp (*ep, name, (uint)namelen) && - (*ep)[namelen] == '=') - break; - else - ++size; + std::string env_var(current); // load current environment variable string + size_t pos = env_var.find("="); + if(pos != std::string::npos) // only parse the variable, if it is a valid environment variable... + { // ...which has to contain an equal sign as delimiter by definition + std::string name = env_var.substr(0,pos); // the string til the equal sign contains the name + std::string value = env_var.substr(pos + 1); // the string from the equal sign contains the value + + proc_env[name] = value; // save the value by the name as its key in the classes map } + i++; + current = environ[i]; } + } - if (environ==0 || *ep==0) /* add new string */ - { - char **new_environ; - if (environ == last_environ && environ!=0) - { - // We allocated this space; we can extend it. - new_environ = (char **) realloc (last_environ, (size + 2) * sizeof (char *)); - } - else - { - new_environ = (char **) malloc ((size + 2) * sizeof (char *)); - } - - if (new_environ==0) // no more memory - { - return; - } - - new_environ[size] = (char *)malloc (namelen + 1 + vallen); - if (new_environ[size]==0) - { - free (new_environ); - return; - } - - if (environ != last_environ) - { - memcpy ((char *) new_environ, environ, size * sizeof (char *)); - } + environmentLoaded = true; +} +#endif - memcpy(new_environ[size], name, namelen); - new_environ[size][namelen] = '='; - memcpy(&new_environ[size][namelen + 1], value, vallen); - new_environ[size + 1] = 0; - last_environ = environ = new_environ; - } - else /* replace existing string */ - { - size_t len = qstrlen (*ep); - if (len + 1 < namelen + 1 + vallen) - { - /* The existing string is too short; malloc a new one. */ - char *newString = (char *)malloc(namelen + 1 + vallen); - if (newString==0) - { - return; - } - *ep = newString; - } - memcpy(*ep, name, namelen); - (*ep)[namelen] = '='; - memcpy(&(*ep)[namelen + 1], value, vallen); +void Portable::setenv(const char *name,const char *value) +{ + if (value==0) value=""; +#if defined(_WIN32) && !defined(__CYGWIN__) + SetEnvironmentVariable(name,value); +#else + if(!environmentLoaded) // if the environment variables are not loaded already... + { // ...call loadEnvironment to store them in class + loadEnvironment(); } + proc_env[name] = std::string(value); // create or replace exisiting value #endif } -void portable_unsetenv(const char *variable) +void Portable::unsetenv(const char *variable) { #if defined(_WIN32) && !defined(__CYGWIN__) SetEnvironmentVariable(variable,0); @@ -300,32 +269,35 @@ void portable_unsetenv(const char *variable) return; // not properly formatted } - len = qstrlen(variable); - - ep = environ; - while (*ep != NULL) + if(proc_env.find(variable) != proc_env.end()) { - if (!qstrncmp(*ep, variable, (uint)len) && (*ep)[len]=='=') - { - /* Found it. Remove this pointer by moving later ones back. */ - char **dp = ep; - do dp[0] = dp[1]; while (*dp++); - /* Continue the loop in case NAME appears again. */ - } - else - { - ++ep; - } + proc_env[variable].erase(); } #endif } -const char *portable_getenv(const char *variable) -{ - return getenv(variable); +const char *Portable::getenv(const char *variable) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + return ::getenv(variable); +#else + if(!environmentLoaded) // if the environment variables are not loaded already... + { // ...call loadEnvironment to store them in class + loadEnvironment(); + } + + if(proc_env.find(variable) != proc_env.end()) + { + return proc_env[variable].c_str(); + } + else + { + return NULL; + } +#endif } -portable_off_t portable_fseek(FILE *f,portable_off_t offset, int whence) +portable_off_t Portable::fseek(FILE *f,portable_off_t offset, int whence) { #if defined(__MINGW32__) return fseeko64(f,offset,whence); @@ -336,7 +308,7 @@ portable_off_t portable_fseek(FILE *f,portable_off_t offset, int whence) #endif } -portable_off_t portable_ftell(FILE *f) +portable_off_t Portable::ftell(FILE *f) { #if defined(__MINGW32__) return ftello64(f); @@ -347,18 +319,18 @@ portable_off_t portable_ftell(FILE *f) #endif } -FILE *portable_fopen(const char *fileName,const char *mode) +FILE *Portable::fopen(const char *fileName,const char *mode) { #if defined(_WIN32) && !defined(__CYGWIN__) QString fn(fileName); QString m(mode); return _wfopen((wchar_t*)fn.ucs2(),(wchar_t*)m.ucs2()); #else - return fopen(fileName,mode); + return ::fopen(fileName,mode); #endif } -char portable_pathSeparator() +char Portable::pathSeparator(void) { #if defined(_WIN32) && !defined(__CYGWIN__) return '\\'; @@ -367,7 +339,7 @@ char portable_pathSeparator() #endif } -char portable_pathListSeparator() +char Portable::pathListSeparator(void) { #if defined(_WIN32) && !defined(__CYGWIN__) return ';'; @@ -376,7 +348,7 @@ char portable_pathListSeparator() #endif } -const char *portable_ghostScriptCommand() +const char *Portable::ghostScriptCommand(void) { #if defined(_WIN32) && !defined(__CYGWIN__) return "gswin32c.exe"; @@ -385,7 +357,7 @@ const char *portable_ghostScriptCommand() #endif } -const char *portable_commandExtension() +const char *Portable::commandExtension(void) { #if defined(_WIN32) && !defined(__CYGWIN__) return ".exe"; @@ -394,7 +366,7 @@ const char *portable_commandExtension() #endif } -bool portable_fileSystemIsCaseSensitive() +bool Portable::fileSystemIsCaseSensitive(void) { #if defined(_WIN32) || defined(macintosh) || defined(__MACOSX__) || defined(__APPLE__) || defined(__CYGWIN__) return FALSE; @@ -403,32 +375,40 @@ bool portable_fileSystemIsCaseSensitive() #endif } -FILE * portable_popen(const char *name,const char *type) +FILE * Portable::popen(const char *name,const char *type) { - return popen(name,type); + #if defined(_MSC_VER) || defined(__BORLANDC__) + return ::_popen(name,type); + #else + return ::popen(name,type); + #endif } -int portable_pclose(FILE *stream) +int Portable::pclose(FILE *stream) { - return pclose(stream); + #if defined(_MSC_VER) || defined(__BORLANDC__) + return ::_pclose(stream); + #else + return ::pclose(stream); + #endif } -void portable_sysTimerStart() +void Portable::sysTimerStart(void) { g_time.start(); } -void portable_sysTimerStop() +void Portable::sysTimerStop(void) { g_sysElapsedTime+=((double)g_time.elapsed())/1000.0; } -double portable_getSysElapsedTime() +double Portable::getSysElapsedTime(void) { return g_sysElapsedTime; } -void portable_sleep(int ms) +void Portable::sleep(int ms) { #if defined(_WIN32) && !defined(__CYGWIN__) Sleep(ms); @@ -437,7 +417,7 @@ void portable_sleep(int ms) #endif } -bool portable_isAbsolutePath(const char *fileName) +bool Portable::isAbsolutePath(const char *fileName) { # ifdef _WIN32 if (isalpha (fileName [0]) && fileName[1] == ':') @@ -459,22 +439,39 @@ bool portable_isAbsolutePath(const char *fileName) * * This routine was inspired by the cause for bug 766059 was that in the Windows path there were forward slashes. */ -void portable_correct_path(void) +void Portable::correct_path(void) { #if defined(_WIN32) && !defined(__CYGWIN__) - const char *p = portable_getenv("PATH"); + const char *p = Portable::getenv("PATH"); if (!p) return; // no path nothing to correct QCString result = substitute(p,'/','\\'); - if (result!=p) portable_setenv("PATH",result.data()); + if (result!=p) Portable::setenv("PATH",result.data()); #endif } -void portable_unlink(const char *fileName) +void Portable::unlink(const char *fileName) { #if defined(_WIN32) && !defined(__CYGWIN__) _unlink(fileName); #else - unlink(fileName); + ::unlink(fileName); #endif } +void Portable::setShortDir(void) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + long length = 0; + TCHAR* buffer = NULL; + // First obtain the size needed by passing NULL and 0. + length = GetShortPathName(QDir::currentDirPath().data(), NULL, 0); + // Dynamically allocate the correct size + // (terminating null char was included in length) + buffer = new TCHAR[length]; + // Now simply call again using same (long) path. + length = GetShortPathName(QDir::currentDirPath().data(), buffer, length); + // Set the correct directory (short name) + QDir::setCurrent(buffer); + delete [] buffer; +#endif +} diff --git a/src/portable.h b/src/portable.h index 83f90ef..27b7052 100644 --- a/src/portable.h +++ b/src/portable.h @@ -1,9 +1,11 @@ #ifndef PORTABLE_H #define PORTABLE_H -#include <sys/types.h> #include <stdio.h> -#include <qglobal.h> +#include <sys/types.h> + + + #if defined(_WIN32) typedef __int64 portable_off_t; @@ -15,28 +17,33 @@ typedef off_t portable_off_t; * @brief Portable versions of functions that are platform dependent. */ -int portable_system(const char *command,const char *args,bool commandHasConsole=TRUE); -uint portable_pid(); -const char * portable_getenv(const char *variable); -void portable_setenv(const char *variable,const char *value); -void portable_unsetenv(const char *variable); -portable_off_t portable_fseek(FILE *f,portable_off_t offset, int whence); -portable_off_t portable_ftell(FILE *f); -FILE * portable_fopen(const char *fileName,const char *mode); -void portable_unlink(const char *fileName); -char portable_pathSeparator(); -char portable_pathListSeparator(); -const char * portable_ghostScriptCommand(); -const char * portable_commandExtension(); -bool portable_fileSystemIsCaseSensitive(); -FILE * portable_popen(const char *name,const char *type); -int portable_pclose(FILE *stream); -void portable_sysTimerStart(); -void portable_sysTimerStop(); -double portable_getSysElapsedTime(); -void portable_sleep(int ms); -bool portable_isAbsolutePath(const char *fileName); -void portable_correct_path(void); +namespace Portable +{ + int system(const char *command,const char *args,bool commandHasConsole=true); + unsigned int pid(void); + const char * getenv(const char *variable); + void setenv(const char *variable,const char *value); + void unsetenv(const char *variable); + portable_off_t fseek(FILE *f,portable_off_t offset, int whence); + portable_off_t ftell(FILE *f); + FILE * fopen(const char *fileName,const char *mode); + void unlink(const char *fileName); + char pathSeparator(void); + char pathListSeparator(void); + const char * ghostScriptCommand(void); + const char * commandExtension(void); + bool fileSystemIsCaseSensitive(); + FILE * popen(const char *name,const char *type); + int pclose(FILE *stream); + void sysTimerStart(void); + void sysTimerStop(void); + double getSysElapsedTime(void); + void sleep(int ms); + bool isAbsolutePath(const char *fileName); + void correct_path(void); + void setShortDir(void); +} + extern "C" { void * portable_iconv_open(const char* tocode, const char* fromcode); @@ -20,10 +20,16 @@ class BufStr; -void initPreprocessor(); -void cleanUpPreprocessor(); -void addSearchDir(const char *dir); -void preprocessFile(const char *fileName,BufStr &input,BufStr &output); -void preFreeScanner(); +class Preprocessor +{ + public: + Preprocessor(); + ~Preprocessor(); + void processFile(const char *fileName,BufStr &input,BufStr &output); + void addSearchDir(const char *dir); + private: + struct Private; + Private *p; +}; #endif @@ -16,6 +16,8 @@ */ %option never-interactive %option prefix="preYY" +%option reentrant +%option extra-type="struct preYY_state *" %{ @@ -87,7 +89,7 @@ struct FileState }; /** @brief Singleton that manages the defines available while - * proprocessing files. + * preprocessing files. */ class DefineManager { @@ -96,7 +98,8 @@ class DefineManager { public: /** Creates an empty container for defines */ - DefinesPerFile() : m_defines(257), m_includedFiles(17) + DefinesPerFile(DefineManager *parent) + : m_parent(parent), m_defines(257), m_includedFiles(17) { m_defines.setAutoDelete(TRUE); } @@ -126,24 +129,25 @@ class DefineManager } void collectDefines(DefineDict *dict,QDict<void> &includeStack); private: + DefineManager *m_parent; DefineDict m_defines; QDict<void> m_includedFiles; }; public: friend class DefinesPerFile; - /** Returns a reference to the singleton */ - static DefineManager &instance() + + /** Creates a new DefineManager object */ + DefineManager() : m_fileMap(1009), m_contextDefines(1009) { - if (theInstance==0) theInstance = new DefineManager; - return *theInstance; + m_fileMap.setAutoDelete(TRUE); } - /** Deletes the singleton */ - static void deleteInstance() + + /** Destroys the object */ + virtual ~DefineManager() { - delete theInstance; - theInstance = 0; } + /** Starts a context in which defines are collected. * Called at the start of a new file that is preprocessed. * @param fileName the name of the file to process. @@ -157,7 +161,7 @@ class DefineManager if (dpf==0) { //printf("New file!\n"); - dpf = new DefinesPerFile; + dpf = new DefinesPerFile(this); m_fileMap.insert(fileName,dpf); } } @@ -182,7 +186,7 @@ class DefineManager if (dpf==0) { //printf("New file!\n"); - dpf = new DefinesPerFile; + dpf = new DefinesPerFile(this); m_fileMap.insert(fileName,dpf); } else @@ -211,7 +215,7 @@ class DefineManager DefinesPerFile *dpf = m_fileMap.find(fileName); if (dpf==0) { - dpf = new DefinesPerFile; + dpf = new DefinesPerFile(this); m_fileMap.insert(fileName,dpf); } dpf->addDefine(def); @@ -228,7 +232,7 @@ class DefineManager DefinesPerFile *dpf = m_fileMap.find(fromFileName); if (dpf==0) { - dpf = new DefinesPerFile; + dpf = new DefinesPerFile(this); m_fileMap.insert(fromFileName,dpf); } dpf->addInclude(toFileName); @@ -248,9 +252,8 @@ class DefineManager { return m_contextDefines; } - private: - static DefineManager *theInstance; + private: /** Helper function to collect all define for a given file */ void collectDefinesForFile(const char *fileName,DefineDict *dict) { @@ -270,23 +273,10 @@ class DefineManager return m_fileMap.find(fileName); } - /** Creates a new DefineManager object */ - DefineManager() : m_fileMap(1009), m_contextDefines(1009) - { - m_fileMap.setAutoDelete(TRUE); - } - - /** Destroys the object */ - virtual ~DefineManager() - { - } - QDict<DefinesPerFile> m_fileMap; DefineDict m_contextDefines; }; -/** Singleton instance */ -DefineManager *DefineManager::theInstance = 0; /** Collects all defines for a file and all files that the file includes. * This function will recursively call itself for each file. @@ -304,7 +294,7 @@ void DefineManager::DefinesPerFile::collectDefines( for (di.toFirst();(di.current());++di) { QCString incFile = di.currentKey(); - DefinesPerFile *dpf = DefineManager::instance().find(incFile); + DefinesPerFile *dpf = m_parent->find(incFile); if (dpf && includeStack.find(incFile)==0) { //printf(" processing include %s\n",incFile.data()); @@ -334,162 +324,1479 @@ void DefineManager::DefinesPerFile::collectDefines( * scanner's state */ -static int g_yyLineNr = 1; -static int g_yyMLines = 1; -static int g_yyColNr = 1; -static QCString g_yyFileName; -static FileDef *g_yyFileDef; -static FileDef *g_inputFileDef; -static int g_ifcount = 0; -static QStrList *g_pathList = 0; -static QStack<FileState> g_includeStack; -static QDict<int> *g_argDict; -static int g_defArgs = -1; -static QCString g_defName; -static QCString g_defText; -static QCString g_defLitText; -static QCString g_defArgsStr; -static QCString g_defExtraSpacing; -static bool g_defVarArgs; -static int g_level; -static int g_lastCContext; -static int g_lastCPPContext; -static QArray<int> g_levelGuard; -static BufStr *g_inputBuf; -static int g_inputBufPos; -static BufStr *g_outputBuf; -static int g_roundCount; -static bool g_quoteArg; -static DefineDict *g_expandedDict; -static int g_findDefArgContext; -static bool g_expectGuard; -static QCString g_guardName; -static QCString g_lastGuardName; -static QCString g_incName; -static QCString g_guardExpr; -static int g_curlyCount; -static bool g_nospaces; // add extra spaces during macro expansion - -static bool g_macroExpansion; // from the configuration -static bool g_expandOnlyPredef; // from the configuration -static int g_commentCount; -static bool g_insideComment; -static bool g_isImported; -static QCString g_blockName; -static int g_condCtx; -static bool g_skip; -static QStack<CondCtx> g_condStack; -static bool g_insideCS; // C# has simpler preprocessor -static bool g_isSource; - -static bool g_lexInit = FALSE; -static int g_fenceSize = 0; -static bool g_ccomment; -static QCString g_delimiter; - -//DefineDict* getGlobalDefineDict() -//{ -// return g_globalDefineDict; -//} - -static void setFileName(const char *name) +struct preYY_state +{ + preYY_state() : allIncludes(10009) {} + int yyLineNr = 1; + int yyMLines = 1; + int yyColNr = 1; + QCString yyFileName; + FileDef *yyFileDef; + FileDef *inputFileDef; + int ifcount = 0; + QStrList *pathList = 0; + QStack<FileState> includeStack; + QDict<int> *argDict = 0; + int defArgs = -1; + QCString defName; + QCString defText; + QCString defLitText; + QCString defArgsStr; + QCString defExtraSpacing; + bool defVarArgs; + int level; + int lastCContext; + int lastCPPContext; + QArray<int> levelGuard; + BufStr *inputBuf = 0; + int inputBufPos; + BufStr *outputBuf = 0; + int roundCount; + bool quoteArg; + DefineDict *expandedDict = 0; + int findDefArgContext; + bool expectGuard; + QCString guardName; + QCString lastGuardName; + QCString incName; + QCString guardExpr; + int curlyCount; + bool nospaces; // add extra spaces during macro expansion + + bool macroExpansion; // from the configuration + bool expandOnlyPredef; // from the configuration + int commentCount; + bool insideComment; + bool isImported; + QCString blockName; + int condCtx; + bool skip; + QStack<CondCtx> condStack; + bool insideCS; // C# has simpler preprocessor + bool isSource; + + int fenceSize = 0; + bool ccomment; + QCString delimiter; + QDict<void> allIncludes; + QDict<void> expansionDict; + DefineManager defineManager; + ConstExpressionParser constExpParser; +}; + +// stateless functions +static QCString escapeAt(const char *text); +static QCString extractTrailingComment(const char *s); +static char resolveTrigraph(char c); + +// statefull functions +static inline void outputArray(yyscan_t yyscanner,const char *a,int len); +static inline void outputChar(yyscan_t yyscanner,char c); +static QCString expandMacro(yyscan_t yyscanner,const QCString &name); +static void readIncludeFile(yyscan_t yyscanner,const QCString &inc); +static void incrLevel(yyscan_t yyscanner); +static void decrLevel(yyscan_t yyscanner); +static void setCaseDone(yyscan_t yyscanner,bool value); +static bool otherCaseDone(yyscan_t yyscanner); +static bool computeExpression(yyscan_t yyscanner,const QCString &expr); +static void startCondSection(yyscan_t yyscanner,const char *sectId); +static void endCondSection(yyscan_t yyscanner); +static void addDefine(yyscan_t yyscanner); +static Define * newDefine(yyscan_t yyscanner); +static void setFileName(yyscan_t yyscanner,const char *name); +static int yyread(yyscan_t yyscanner,char *buf,int max_size); + +/* ----------------------------------------------------------------- */ + +#undef YY_INPUT +#define YY_INPUT(buf,result,max_size) result=yyread(yyscanner,buf,max_size); + +/* ----------------------------------------------------------------- */ + +%} + +ID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]* +B [ \t] +BN [ \t\r\n] +RAWBEGIN (u|U|L|u8)?R\"[^ \t\(\)\\]{0,16}"(" +RAWEND ")"[^ \t\(\)\\]{0,16}\" +CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) + +%option noyywrap + +%x Start +%x Command +%x SkipCommand +%x SkipLine +%x SkipString +%x CopyLine +%x CopyString +%x CopyStringCs +%x CopyStringFtn +%x CopyStringFtnDouble +%x CopyRawString +%x Include +%x IncludeID +%x EndImport +%x DefName +%x DefineArg +%x DefineText +%x SkipCPPBlock +%x Ifdef +%x Ifndef +%x SkipCComment +%x ArgCopyCComment +%x CopyCComment +%x SkipVerbatim +%x SkipCPPComment +%x RemoveCComment +%x RemoveCPPComment +%x Guard +%x DefinedExpr1 +%x DefinedExpr2 +%x SkipDoubleQuote +%x SkipSingleQuote +%x UndefName +%x IgnoreLine +%x FindDefineArgs +%x ReadString +%x CondLineC +%x CondLineCpp +%x SkipCond + +%% + +<*>\x06 +<*>\x00 +<*>\r +<*>"??"[=/'()!<>-] { // Trigraph + unput(resolveTrigraph(yytext[2])); + } +<Start>^{B}*"#" { BEGIN(Command); yyextra->yyColNr+=yyleng; yyextra->yyMLines=0;} +<Start>^{B}*/[^#] { + outputArray(yyscanner,yytext,(int)yyleng); + BEGIN(CopyLine); + } +<Start>^{B}*[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]+{B}*"("[^\)\n]*")"/{BN}{1,10}*[:{] { // constructors? + int i; + for (i=(int)yyleng-1;i>=0;i--) + { + unput(yytext[i]); + } + BEGIN(CopyLine); + } +<Start>^{B}*[_A-Z][_A-Z0-9]+{B}*"("[^\(\)\n]*"("[^\)\n]*")"[^\)\n]*")"{B}*\n | // function list macro with one (...) argument, e.g. for K_GLOBAL_STATIC_WITH_ARGS +<Start>^{B}*[_A-Z][_A-Z0-9]+{B}*"("[^\)\n]*")"{B}*\n { // function like macro + bool skipFuncMacros = Config_getBool(SKIP_FUNCTION_MACROS); + QCString name(yytext); + name=name.left(name.find('(')).stripWhiteSpace(); + + Define *def=0; + if (skipFuncMacros && + name!="Q_PROPERTY" && + !( + (yyextra->includeStack.isEmpty() || yyextra->curlyCount>0) && + yyextra->macroExpansion && + (def=yyextra->defineManager.isDefined(name)) && + /*macroIsAccessible(def) &&*/ + (!yyextra->expandOnlyPredef || def->isPredefined) + ) + ) + { + outputChar(yyscanner,'\n'); + yyextra->yyLineNr++; + } + else // don't skip + { + int i; + for (i=(int)yyleng-1;i>=0;i--) + { + unput(yytext[i]); + } + BEGIN(CopyLine); + } + } +<CopyLine>"extern"{BN}{0,80}"\"C\""*{BN}{0,80}"{" { + QCString text=yytext; + yyextra->yyLineNr+=text.contains('\n'); + outputArray(yyscanner,yytext,(int)yyleng); + } +<CopyLine>{RAWBEGIN} { + yyextra->delimiter = yytext+2; + yyextra->delimiter=yyextra->delimiter.left(yyextra->delimiter.length()-1); + outputArray(yyscanner,yytext,(int)yyleng); + BEGIN(CopyRawString); + } +<CopyLine>"{" { // count brackets inside the main file + if (yyextra->includeStack.isEmpty()) + { + yyextra->curlyCount++; + } + outputChar(yyscanner,*yytext); + } +<CopyLine>"}" { // count brackets inside the main file + if (yyextra->includeStack.isEmpty() && yyextra->curlyCount>0) + { + yyextra->curlyCount--; + } + outputChar(yyscanner,*yytext); + } +<CopyLine>"'"\\[0-7]{1,3}"'" { + outputArray(yyscanner,yytext,(int)yyleng); + } +<CopyLine>"'"\\."'" { + outputArray(yyscanner,yytext,(int)yyleng); + } +<CopyLine>"'"."'" { + outputArray(yyscanner,yytext,(int)yyleng); + } +<CopyLine>@\" { + if (getLanguageFromFileName(yyextra->yyFileName)!=SrcLangExt_CSharp) REJECT; + outputArray(yyscanner,yytext,(int)yyleng); + BEGIN( CopyStringCs ); + } +<CopyLine>\" { + outputChar(yyscanner,*yytext); + if (getLanguageFromFileName(yyextra->yyFileName)!=SrcLangExt_Fortran) + { + BEGIN( CopyString ); + } + else + { + BEGIN( CopyStringFtnDouble ); + } + } +<CopyLine>\' { + if (getLanguageFromFileName(yyextra->yyFileName)!=SrcLangExt_Fortran) REJECT; + outputChar(yyscanner,*yytext); + BEGIN( CopyStringFtn ); + } +<CopyString>[^\"\\\r\n]+ { + outputArray(yyscanner,yytext,(int)yyleng); + } +<CopyStringCs>[^\"\r\n]+ { + outputArray(yyscanner,yytext,(int)yyleng); + } +<CopyString>\\. { + outputArray(yyscanner,yytext,(int)yyleng); + } +<CopyString,CopyStringCs>\" { + outputChar(yyscanner,*yytext); + BEGIN( CopyLine ); + } +<CopyStringFtnDouble>[^\"\\\r\n]+ { + outputArray(yyscanner,yytext,(int)yyleng); + } +<CopyStringFtnDouble>\\. { + outputArray(yyscanner,yytext,(int)yyleng); + } +<CopyStringFtnDouble>\" { + outputChar(yyscanner,*yytext); + BEGIN( CopyLine ); + } +<CopyStringFtn>[^\'\\\r\n]+ { + outputArray(yyscanner,yytext,(int)yyleng); + } +<CopyStringFtn>\\. { + outputArray(yyscanner,yytext,(int)yyleng); + } +<CopyStringFtn>\' { + outputChar(yyscanner,*yytext); + BEGIN( CopyLine ); + } +<CopyRawString>{RAWEND} { + outputArray(yyscanner,yytext,(int)yyleng); + QCString delimiter = yytext+1; + delimiter=delimiter.left(delimiter.length()-1); + if (delimiter==yyextra->delimiter) + { + BEGIN( CopyLine ); + } + } +<CopyRawString>[^)]+ { + outputArray(yyscanner,yytext,(int)yyleng); + } +<CopyRawString>. { + outputChar(yyscanner,*yytext); + } +<CopyLine>{ID}/{BN}{0,80}"(" { + yyextra->expectGuard = FALSE; + Define *def=0; + //def=yyextra->globalDefineDict->find(yytext); + //def=yyextra->defineManager.isDefined(yytext); + //printf("Search for define %s found=%d yyextra->includeStack.isEmpty()=%d " + // "yyextra->curlyCount=%d yyextra->macroExpansion=%d yyextra->expandOnlyPredef=%d " + // "isPreDefined=%d\n",yytext,def ? 1 : 0, + // yyextra->includeStack.isEmpty(),yyextra->curlyCount,yyextra->macroExpansion,yyextra->expandOnlyPredef, + // def ? def->isPredefined : -1 + // ); + if ((yyextra->includeStack.isEmpty() || yyextra->curlyCount>0) && + yyextra->macroExpansion && + (def=yyextra->defineManager.isDefined(yytext)) && + /*(def->isPredefined || macroIsAccessible(def)) && */ + (!yyextra->expandOnlyPredef || def->isPredefined) + ) + { + //printf("Found it! #args=%d\n",def->nargs); + yyextra->roundCount=0; + yyextra->defArgsStr=yytext; + if (def->nargs==-1) // no function macro + { + QCString result = def->isPredefined ? def->definition : expandMacro(yyscanner,yyextra->defArgsStr); + outputArray(yyscanner,result,result.length()); + } + else // zero or more arguments + { + yyextra->findDefArgContext = CopyLine; + BEGIN(FindDefineArgs); + } + } + else + { + outputArray(yyscanner,yytext,(int)yyleng); + } + } +<CopyLine>{ID} { + Define *def=0; + if ((yyextra->includeStack.isEmpty() || yyextra->curlyCount>0) && + yyextra->macroExpansion && + (def=yyextra->defineManager.isDefined(yytext)) && + def->nargs==-1 && + /*(def->isPredefined || macroIsAccessible(def)) &&*/ + (!yyextra->expandOnlyPredef || def->isPredefined) + ) + { + QCString result=def->isPredefined ? def->definition : expandMacro(yyscanner,yytext); + outputArray(yyscanner,result,result.length()); + } + else + { + outputArray(yyscanner,yytext,(int)yyleng); + } + } +<CopyLine>"\\"\r?/\n { // strip line continuation characters + if (getLanguageFromFileName(yyextra->yyFileName)==SrcLangExt_Fortran) outputChar(yyscanner,*yytext); + } +<CopyLine>. { + outputChar(yyscanner,*yytext); + } +<CopyLine>\n { + outputChar(yyscanner,'\n'); + BEGIN(Start); + yyextra->yyLineNr++; + yyextra->yyColNr=1; + } +<FindDefineArgs>"(" { + yyextra->defArgsStr+='('; + yyextra->roundCount++; + } +<FindDefineArgs>")" { + yyextra->defArgsStr+=')'; + yyextra->roundCount--; + if (yyextra->roundCount==0) + { + QCString result=expandMacro(yyscanner,yyextra->defArgsStr); + //printf("yyextra->defArgsStr='%s'->'%s'\n",yyextra->defArgsStr.data(),result.data()); + if (yyextra->findDefArgContext==CopyLine) + { + outputArray(yyscanner,result,result.length()); + BEGIN(yyextra->findDefArgContext); + } + else // yyextra->findDefArgContext==IncludeID + { + readIncludeFile(yyscanner,result); + yyextra->nospaces=FALSE; + BEGIN(Start); + } + } + } + /* +<FindDefineArgs>")"{B}*"(" { + yyextra->defArgsStr+=yytext; + } + */ +<FindDefineArgs>{CHARLIT} { + yyextra->defArgsStr+=yytext; + } +<FindDefineArgs>"/*"[*]? { + yyextra->defArgsStr+=yytext; + BEGIN(ArgCopyCComment); + } +<FindDefineArgs>\" { + yyextra->defArgsStr+=*yytext; + BEGIN(ReadString); + } +<FindDefineArgs>' { + if (getLanguageFromFileName(yyextra->yyFileName)!=SrcLangExt_Fortran) REJECT; + yyextra->defArgsStr+=*yytext; + BEGIN(ReadString); + } +<FindDefineArgs>\n { + yyextra->defArgsStr+=' '; + yyextra->yyLineNr++; + outputChar(yyscanner,'\n'); + } +<FindDefineArgs>"@" { + yyextra->defArgsStr+="@@"; + } +<FindDefineArgs>. { + yyextra->defArgsStr+=*yytext; + } +<ArgCopyCComment>[^*\n]+ { + yyextra->defArgsStr+=yytext; + } +<ArgCopyCComment>"*/" { + yyextra->defArgsStr+=yytext; + BEGIN(FindDefineArgs); + } +<ArgCopyCComment>\n { + yyextra->defArgsStr+=' '; + yyextra->yyLineNr++; + outputChar(yyscanner,'\n'); + } +<ArgCopyCComment>. { + yyextra->defArgsStr+=yytext; + } +<ReadString>"\"" { + yyextra->defArgsStr+=*yytext; + BEGIN(FindDefineArgs); + } +<ReadString>"'" { + if (getLanguageFromFileName(yyextra->yyFileName)!=SrcLangExt_Fortran) REJECT; + yyextra->defArgsStr+=*yytext; + BEGIN(FindDefineArgs); + } + +<ReadString>"//"|"/*" { + yyextra->defArgsStr+=yytext; + } +<ReadString>\\/\r?\n { // line continuation + } +<ReadString>\\. { + yyextra->defArgsStr+=yytext; + } +<ReadString>. { + yyextra->defArgsStr+=*yytext; + } +<Command>("include"|"import"){B}+/{ID} { + yyextra->isImported = yytext[1]=='m'; + if (yyextra->macroExpansion) + BEGIN(IncludeID); + } +<Command>("include"|"import"){B}*[<"] { + yyextra->isImported = yytext[1]=='m'; + char c[2]; + c[0]=yytext[yyleng-1];c[1]='\0'; + yyextra->incName=c; + BEGIN(Include); + } +<Command>("cmake")?"define"{B}+ { + //printf("!!!DefName\n"); + yyextra->yyColNr+=yyleng; + BEGIN(DefName); + } +<Command>"ifdef"/{B}*"(" { + incrLevel(yyscanner); + yyextra->guardExpr.resize(0); + BEGIN(DefinedExpr2); + } +<Command>"ifdef"/{B}+ { + //printf("Pre.l: ifdef\n"); + incrLevel(yyscanner); + yyextra->guardExpr.resize(0); + BEGIN(DefinedExpr1); + } +<Command>"ifndef"/{B}*"(" { + incrLevel(yyscanner); + yyextra->guardExpr="! "; + BEGIN(DefinedExpr2); + } +<Command>"ifndef"/{B}+ { + incrLevel(yyscanner); + yyextra->guardExpr="! "; + BEGIN(DefinedExpr1); + } +<Command>"if"/[ \t(!] { + incrLevel(yyscanner); + yyextra->guardExpr.resize(0); + BEGIN(Guard); + } +<Command>("elif"|"else"{B}*"if")/[ \t(!] { + if (!otherCaseDone(yyscanner)) + { + yyextra->guardExpr.resize(0); + BEGIN(Guard); + } + else + { + yyextra->ifcount=0; + BEGIN(SkipCPPBlock); + } + } +<Command>"else"/[^a-z_A-Z0-9\x80-\xFF] { + //printf("else yyextra->levelGuard[%d]=%d\n",yyextra->level-1,yyextra->levelGuard[yyextra->level-1]); + if (otherCaseDone(yyscanner)) + { + yyextra->ifcount=0; + BEGIN(SkipCPPBlock); + } + else + { + setCaseDone(yyscanner,TRUE); + //yyextra->levelGuard[yyextra->level-1]=TRUE; + } + } +<Command>"undef"{B}+ { + BEGIN(UndefName); + } +<Command>("elif"|"else"{B}*"if")/[ \t(!] { + if (!otherCaseDone(yyscanner)) + { + yyextra->guardExpr.resize(0); + BEGIN(Guard); + } + } +<Command>"endif"/[^a-z_A-Z0-9\x80-\xFF] { + //printf("Pre.l: #endif\n"); + decrLevel(yyscanner); + } +<Command,IgnoreLine>\n { + outputChar(yyscanner,'\n'); + BEGIN(Start); + yyextra->yyLineNr++; + } +<Command>"pragma"{B}+"once" { + yyextra->expectGuard = FALSE; + } +<Command>{ID} { // unknown directive + BEGIN(IgnoreLine); + } +<IgnoreLine>\\[\r]?\n { + outputChar(yyscanner,'\n'); + yyextra->yyLineNr++; + } +<IgnoreLine>. +<Command>. {yyextra->yyColNr+=yyleng;} +<UndefName>{ID} { + Define *def; + if ((def=yyextra->defineManager.isDefined(yytext)) + /*&& !def->isPredefined*/ + && !def->nonRecursive + ) + { + //printf("undefining %s\n",yytext); + def->undef=TRUE; + } + BEGIN(Start); + } +<Guard>\\[\r]?\n { + outputChar(yyscanner,'\n'); + yyextra->guardExpr+=' '; + yyextra->yyLineNr++; + } +<Guard>"defined"/{B}*"(" { + BEGIN(DefinedExpr2); + } +<Guard>"defined"/{B}+ { + BEGIN(DefinedExpr1); + } +<Guard>{ID} { yyextra->guardExpr+=yytext; } +<Guard>"@" { yyextra->guardExpr+="@@"; } +<Guard>. { yyextra->guardExpr+=*yytext; } +<Guard>\n { + unput(*yytext); + //printf("Guard: '%s'\n", + // yyextra->guardExpr.data()); + bool guard=computeExpression(yyscanner,yyextra->guardExpr); + setCaseDone(yyscanner,guard); + //printf("if yyextra->levelGuard[%d]=%d\n",yyextra->level-1,yyextra->levelGuard[yyextra->level-1]); + if (guard) + { + BEGIN(Start); + } + else + { + yyextra->ifcount=0; + BEGIN(SkipCPPBlock); + } + } +<DefinedExpr1,DefinedExpr2>\\\n { yyextra->yyLineNr++; outputChar(yyscanner,'\n'); } +<DefinedExpr1>{ID} { + if (yyextra->defineManager.isDefined(yytext) || yyextra->guardName==yytext) + yyextra->guardExpr+=" 1L "; + else + yyextra->guardExpr+=" 0L "; + yyextra->lastGuardName=yytext; + BEGIN(Guard); + } +<DefinedExpr2>{ID} { + if (yyextra->defineManager.isDefined(yytext) || yyextra->guardName==yytext) + yyextra->guardExpr+=" 1L "; + else + yyextra->guardExpr+=" 0L "; + yyextra->lastGuardName=yytext; + } +<DefinedExpr1,DefinedExpr2>\n { // should not happen, handle anyway + yyextra->yyLineNr++; + yyextra->ifcount=0; + BEGIN(SkipCPPBlock); + } +<DefinedExpr2>")" { + BEGIN(Guard); + } +<DefinedExpr1,DefinedExpr2>. +<SkipCPPBlock>^{B}*"#" { BEGIN(SkipCommand); } +<SkipCPPBlock>^{B}*/[^#] { BEGIN(SkipLine); } +<SkipCPPBlock>\n { yyextra->yyLineNr++; outputChar(yyscanner,'\n'); } +<SkipCPPBlock>. +<SkipCommand>"if"(("n")?("def"))?/[ \t(!] { + incrLevel(yyscanner); + yyextra->ifcount++; + //printf("#if... depth=%d\n",yyextra->ifcount); + } +<SkipCommand>"else" { + //printf("Else! yyextra->ifcount=%d otherCaseDone=%d\n",yyextra->ifcount,otherCaseDone()); + if (yyextra->ifcount==0 && !otherCaseDone(yyscanner)) + { + setCaseDone(yyscanner,TRUE); + //outputChar(yyscanner,'\n'); + BEGIN(Start); + } + } +<SkipCommand>("elif"|"else"{B}*"if")/[ \t(!] { + if (yyextra->ifcount==0) + { + if (!otherCaseDone(yyscanner)) + { + yyextra->guardExpr.resize(0); + yyextra->lastGuardName.resize(0); + BEGIN(Guard); + } + else + { + BEGIN(SkipCPPBlock); + } + } + } +<SkipCommand>"endif" { + yyextra->expectGuard = FALSE; + decrLevel(yyscanner); + if (--yyextra->ifcount<0) + { + //outputChar(yyscanner,'\n'); + BEGIN(Start); + } + } +<SkipCommand>\n { + outputChar(yyscanner,'\n'); + yyextra->yyLineNr++; + BEGIN(SkipCPPBlock); + } +<SkipCommand>{ID} { // unknown directive + BEGIN(SkipLine); + } +<SkipCommand>. +<SkipLine>[^'"/\n]+ +<SkipLine>{CHARLIT} { } +<SkipLine>\" { + BEGIN(SkipString); + } +<SkipLine>. +<SkipString>"//"/[^\n]* { + } +<SkipLine,SkipCommand,SkipCPPBlock>"//"[^\n]* { + yyextra->lastCPPContext=YY_START; + BEGIN(RemoveCPPComment); + } +<SkipString>"/*"/[^\n]* { + } +<SkipLine,SkipCommand,SkipCPPBlock>"/*"/[^\n]* { + yyextra->lastCContext=YY_START; + BEGIN(RemoveCComment); + } +<SkipLine>\n { + outputChar(yyscanner,'\n'); + yyextra->yyLineNr++; + BEGIN(SkipCPPBlock); + } +<SkipString>[^"\\\n]+ { } +<SkipString>\\. { } +<SkipString>\" { + BEGIN(SkipLine); + } +<SkipString>. { } +<IncludeID>{ID}{B}*/"(" { + yyextra->nospaces=TRUE; + yyextra->roundCount=0; + yyextra->defArgsStr=yytext; + yyextra->findDefArgContext = IncludeID; + BEGIN(FindDefineArgs); + } +<IncludeID>{ID} { + yyextra->nospaces=TRUE; + readIncludeFile(yyscanner,expandMacro(yyscanner,yytext)); + BEGIN(Start); + } +<Include>[^\">\n]+[\">] { + yyextra->incName+=yytext; + readIncludeFile(yyscanner,yyextra->incName); + if (yyextra->isImported) + { + BEGIN(EndImport); + } + else + { + BEGIN(Start); + } + } +<EndImport>[^\\\n]*/\n { + BEGIN(Start); + } +<EndImport>\\[\r]?"\n" { + outputChar(yyscanner,'\n'); + yyextra->yyLineNr++; + } +<EndImport>. { + } +<DefName>{ID}/("\\\n")*"(" { // define with argument + //printf("Define() '%s'\n",yytext); + delete yyextra->argDict; + yyextra->argDict = new QDict<int>(31); + yyextra->argDict->setAutoDelete(TRUE); + yyextra->defArgs = 0; + yyextra->defArgsStr.resize(0); + yyextra->defText.resize(0); + yyextra->defLitText.resize(0); + yyextra->defName = yytext; + yyextra->defVarArgs = FALSE; + yyextra->defExtraSpacing.resize(0); + BEGIN(DefineArg); + } +<DefName>{ID}{B}+"1"/[ \r\t\n] { // special case: define with 1 -> can be "guard" + //printf("Define '%s'\n",yytext); + delete yyextra->argDict; yyextra->argDict=0; + yyextra->defArgs = -1; + yyextra->defArgsStr.resize(0); + yyextra->defName = yytext; + yyextra->defName = yyextra->defName.left(yyextra->defName.length()-1).stripWhiteSpace(); + yyextra->defVarArgs = FALSE; + //printf("Guard check: %s!=%s || %d\n", + // yyextra->defName.data(),yyextra->lastGuardName.data(),yyextra->expectGuard); + if (yyextra->curlyCount>0 || yyextra->defName!=yyextra->lastGuardName || !yyextra->expectGuard) + { // define may appear in the output + QCString tmp=(QCString)"#define "+yyextra->defName; + outputArray(yyscanner,tmp.data(),tmp.length()); + yyextra->quoteArg=FALSE; + yyextra->insideComment=FALSE; + yyextra->lastGuardName.resize(0); + yyextra->defText="1"; + yyextra->defLitText="1"; + BEGIN(DefineText); + } + else // define is a guard => hide + { + //printf("Found a guard %s\n",yytext); + yyextra->defText.resize(0); + yyextra->defLitText.resize(0); + BEGIN(Start); + } + yyextra->expectGuard=FALSE; + } +<DefName>{ID}/{B}*"\n" { // empty define + delete yyextra->argDict; yyextra->argDict=0; + yyextra->defArgs = -1; + yyextra->defName = yytext; + yyextra->defArgsStr.resize(0); + yyextra->defText.resize(0); + yyextra->defLitText.resize(0); + yyextra->defVarArgs = FALSE; + //printf("Guard check: %s!=%s || %d\n", + // yyextra->defName.data(),yyextra->lastGuardName.data(),yyextra->expectGuard); + if (yyextra->curlyCount>0 || yyextra->defName!=yyextra->lastGuardName || !yyextra->expectGuard) + { // define may appear in the output + QCString tmp=(QCString)"#define "+yyextra->defName; + outputArray(yyscanner,tmp.data(),tmp.length()); + yyextra->quoteArg=FALSE; + yyextra->insideComment=FALSE; + if (yyextra->insideCS) yyextra->defText="1"; // for C#, use "1" as define text + BEGIN(DefineText); + } + else // define is a guard => hide + { + //printf("Found a guard %s\n",yytext); + yyextra->guardName = yytext; + yyextra->lastGuardName.resize(0); + BEGIN(Start); + } + yyextra->expectGuard=FALSE; + } +<DefName>{ID}/{B}* { // define with content + //printf("Define '%s'\n",yytext); + delete yyextra->argDict; yyextra->argDict=0; + yyextra->defArgs = -1; + yyextra->defArgsStr.resize(0); + yyextra->defText.resize(0); + yyextra->defLitText.resize(0); + yyextra->defName = yytext; + yyextra->defVarArgs = FALSE; + QCString tmp=(QCString)"#define "+yyextra->defName+yyextra->defArgsStr; + outputArray(yyscanner,tmp.data(),tmp.length()); + yyextra->quoteArg=FALSE; + yyextra->insideComment=FALSE; + BEGIN(DefineText); + } +<DefineArg>"\\\n" { + yyextra->defExtraSpacing+="\n"; + yyextra->yyLineNr++; + } +<DefineArg>","{B}* { yyextra->defArgsStr+=yytext; } +<DefineArg>"("{B}* { yyextra->defArgsStr+=yytext; } +<DefineArg>{B}*")"{B}* { + yyextra->defArgsStr+=yytext; + QCString tmp=(QCString)"#define "+yyextra->defName+yyextra->defArgsStr+yyextra->defExtraSpacing; + outputArray(yyscanner,tmp.data(),tmp.length()); + yyextra->quoteArg=FALSE; + yyextra->insideComment=FALSE; + BEGIN(DefineText); + } +<DefineArg>"..." { // Variadic macro + yyextra->defVarArgs = TRUE; + yyextra->defArgsStr+=yytext; + yyextra->argDict->insert("__VA_ARGS__",new int(yyextra->defArgs)); + yyextra->defArgs++; + } +<DefineArg>{ID}{B}*("..."?) { + //printf("Define addArg(%s)\n",yytext); + QCString argName=yytext; + yyextra->defVarArgs = yytext[yyleng-1]=='.'; + if (yyextra->defVarArgs) // strip ellipsis + { + argName=argName.left(argName.length()-3); + } + argName = argName.stripWhiteSpace(); + yyextra->defArgsStr+=yytext; + yyextra->argDict->insert(argName,new int(yyextra->defArgs)); + yyextra->defArgs++; + } + /* +<DefineText>"/ **"|"/ *!" { + yyextra->defText+=yytext; + yyextra->defLitText+=yytext; + yyextra->insideComment=TRUE; + } +<DefineText>"* /" { + yyextra->defText+=yytext; + yyextra->defLitText+=yytext; + yyextra->insideComment=FALSE; + } + */ +<DefineText>"/*"[!*]? { + yyextra->defText+=yytext; + yyextra->defLitText+=yytext; + yyextra->lastCContext=YY_START; + yyextra->commentCount=1; + BEGIN(CopyCComment); + } +<DefineText>"//"[!/]? { + outputArray(yyscanner,yytext,(int)yyleng); + yyextra->lastCPPContext=YY_START; + yyextra->defLitText+=' '; + BEGIN(SkipCPPComment); + } +<SkipCComment>[/]?"*/" { + if (yytext[0]=='/') outputChar(yyscanner,'/'); + outputChar(yyscanner,'*');outputChar(yyscanner,'/'); + if (--yyextra->commentCount<=0) + { + if (yyextra->lastCContext==Start) + // small hack to make sure that ^... rule will + // match when going to Start... Example: "/*...*/ some stuff..." + { + YY_CURRENT_BUFFER->yy_at_bol=1; + } + BEGIN(yyextra->lastCContext); + } + } +<SkipCComment>"//"("/")* { + outputArray(yyscanner,yytext,(int)yyleng); + } +<SkipCComment>"/*" { + outputChar(yyscanner,'/');outputChar(yyscanner,'*'); + //yyextra->commentCount++; + } +<SkipCComment>[\\@][\\@]("f{"|"f$"|"f[") { + outputArray(yyscanner,yytext,(int)yyleng); + } +<SkipCComment>^({B}*"*"+)?{B}{0,3}"~~~"[~]* { + bool markdownSupport = Config_getBool(MARKDOWN_SUPPORT); + if (!markdownSupport) + { + REJECT; + } + else + { + outputArray(yyscanner,yytext,(int)yyleng); + yyextra->fenceSize=yyleng; + BEGIN(SkipVerbatim); + } + } +<SkipCComment>^({B}*"*"+)?{B}{0,3}"```"[`]* { + bool markdownSupport = Config_getBool(MARKDOWN_SUPPORT); + if (!markdownSupport) + { + REJECT; + } + else + { + outputArray(yyscanner,yytext,(int)yyleng); + yyextra->fenceSize=yyleng; + BEGIN(SkipVerbatim); + } + } +<SkipCComment>[\\@][\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"docbookonly"|"rtfonly"|"manonly"|"dot"|"code"("{"[^}]*"}")?){BN}+ { + outputArray(yyscanner,yytext,(int)yyleng); + yyextra->yyLineNr+=QCString(yytext).contains('\n'); + } +<SkipCComment>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"docbookonly"|"rtfonly"|"manonly"|"dot"|"code"("{"[^}]*"}")?){BN}+ { + outputArray(yyscanner,yytext,(int)yyleng); + yyextra->yyLineNr+=QCString(yytext).contains('\n'); + yyextra->fenceSize=0; + if (yytext[1]=='f') + { + yyextra->blockName="f"; + } + else + { + QCString bn=&yytext[1]; + int i = bn.find('{'); // for \code{.c} + if (i!=-1) bn=bn.left(i); + yyextra->blockName=bn.stripWhiteSpace(); + } + BEGIN(SkipVerbatim); + } +<SkipCComment,SkipCPPComment>[\\@][\\@]"cond"[ \t]+ { // escaped @cond + outputArray(yyscanner,yytext,(int)yyleng); + } +<SkipCPPComment>[\\@]"cond"[ \t]+ { // conditional section + yyextra->ccomment=TRUE; + yyextra->condCtx=YY_START; + BEGIN(CondLineCpp); + } +<SkipCComment>[\\@]"cond"[ \t]+ { // conditional section + yyextra->ccomment=FALSE; + yyextra->condCtx=YY_START; + BEGIN(CondLineC); + } +<CondLineC,CondLineCpp>[!()&| \ta-z_A-Z0-9\x80-\xFF.\-]+ { + startCondSection(yyscanner,yytext); + if (yyextra->skip) + { + if (YY_START==CondLineC) + { + // end C comment + outputArray(yyscanner,"*/",2); + yyextra->ccomment=TRUE; + } + else + { + yyextra->ccomment=FALSE; + } + BEGIN(SkipCond); + } + else + { + BEGIN(yyextra->condCtx); + } + } +<CondLineC,CondLineCpp>. { // non-guard character + unput(*yytext); + startCondSection(yyscanner," "); + if (yyextra->skip) + { + if (YY_START==CondLineC) + { + // end C comment + outputArray(yyscanner,"*/",2); + yyextra->ccomment=TRUE; + } + else + { + yyextra->ccomment=FALSE; + } + BEGIN(SkipCond); + } + else + { + BEGIN(yyextra->condCtx); + } + } +<SkipCComment,SkipCPPComment>[\\@]"cond"[ \t\r]*/\n { // no guard + if (YY_START==SkipCComment) + { + yyextra->ccomment=TRUE; + // end C comment + outputArray(yyscanner,"*/",2); + } + else + { + yyextra->ccomment=FALSE; + } + yyextra->condCtx=YY_START; + startCondSection(yyscanner," "); + BEGIN(SkipCond); + } +<SkipCond>\n { yyextra->yyLineNr++; outputChar(yyscanner,'\n'); } +<SkipCond>. { } +<SkipCond>[^\/\!*\\@\n]+ { } +<SkipCond>"//"[/!] { yyextra->ccomment=FALSE; } +<SkipCond>"/*"[*!] { yyextra->ccomment=TRUE; } +<SkipCond,SkipCComment,SkipCPPComment>[\\@][\\@]"endcond"/[^a-z_A-Z0-9\x80-\xFF] { + if (!yyextra->skip) + { + outputArray(yyscanner,yytext,(int)yyleng); + } + } +<SkipCond>[\\@]"endcond"/[^a-z_A-Z0-9\x80-\xFF] { + bool oldSkip = yyextra->skip; + endCondSection(yyscanner); + if (oldSkip && !yyextra->skip) + { + if (yyextra->ccomment) + { + outputArray(yyscanner,"/** ",4); + } + BEGIN(yyextra->condCtx); + } + } +<SkipCComment,SkipCPPComment>[\\@]"endcond"/[^a-z_A-Z0-9\x80-\xFF] { + bool oldSkip = yyextra->skip; + endCondSection(yyscanner); + if (oldSkip && !yyextra->skip) + { + BEGIN(yyextra->condCtx); + } + } +<SkipVerbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddocbookonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode"|"f$"|"f]"|"f}") { /* end of verbatim block */ + outputArray(yyscanner,yytext,(int)yyleng); + if (yytext[1]=='f' && yyextra->blockName=="f") + { + BEGIN(SkipCComment); + } + else if (&yytext[4]==yyextra->blockName) + { + BEGIN(SkipCComment); + } + } +<SkipVerbatim>^({B}*"*"+)?{B}{0,3}"~~~"[~]* { + outputArray(yyscanner,yytext,(int)yyleng); + if (yyextra->fenceSize==yyleng) + { + BEGIN(SkipCComment); + } + } +<SkipVerbatim>^({B}*"*"+)?{B}{0,3}"```"[`]* { + outputArray(yyscanner,yytext,(int)yyleng); + if (yyextra->fenceSize==yyleng) + { + BEGIN(SkipCComment); + } + } +<SkipVerbatim>"*/"|"/*" { + outputArray(yyscanner,yytext,(int)yyleng); + } +<SkipCComment,SkipVerbatim>[^*\\@\x06~`\n\/]+ { + outputArray(yyscanner,yytext,(int)yyleng); + } +<SkipCComment,SkipVerbatim>\n { + yyextra->yyLineNr++; + outputChar(yyscanner,'\n'); + } +<SkipCComment,SkipVerbatim>. { + outputChar(yyscanner,*yytext); + } +<CopyCComment>[^*a-z_A-Z\x80-\xFF\n]*[^*a-z_A-Z\x80-\xFF\\\n] { + yyextra->defLitText+=yytext; + yyextra->defText+=escapeAt(yytext); + } +<CopyCComment>\\[\r]?\n { + yyextra->defLitText+=yytext; + outputChar(yyscanner,'\n'); + yyextra->defText+=" "; + yyextra->yyLineNr++; + yyextra->yyMLines++; + } +<CopyCComment>"*/" { + yyextra->defLitText+=yytext; + yyextra->defText+=yytext; + BEGIN(yyextra->lastCContext); + } +<CopyCComment>\n { + yyextra->yyLineNr++; + outputChar(yyscanner,'\n'); + yyextra->defLitText+=yytext; + yyextra->defText+=' '; + } +<RemoveCComment>"*/"{B}*"#" { // see bug 594021 for a usecase for this rule + if (yyextra->lastCContext==SkipCPPBlock) + { + BEGIN(SkipCommand); + } + else + { + REJECT; + } + } +<RemoveCComment>"*/" { BEGIN(yyextra->lastCContext); } +<RemoveCComment>"//" +<RemoveCComment>"/*" +<RemoveCComment>[^*\x06\n]+ +<RemoveCComment>\n { yyextra->yyLineNr++; outputChar(yyscanner,'\n'); } +<RemoveCComment>. +<SkipCPPComment>[^\n\/\\@]+ { + outputArray(yyscanner,yytext,(int)yyleng); + } +<SkipCPPComment,RemoveCPPComment>\n { + unput(*yytext); + BEGIN(yyextra->lastCPPContext); + } +<SkipCPPComment>"/*" { + outputChar(yyscanner,'/');outputChar(yyscanner,'*'); + } +<SkipCPPComment>"//" { + outputChar(yyscanner,'/');outputChar(yyscanner,'/'); + } +<SkipCPPComment>[^\x06\@\\\n]+ { + outputArray(yyscanner,yytext,(int)yyleng); + } +<SkipCPPComment>. { + outputChar(yyscanner,*yytext); + } +<RemoveCPPComment>"/*" +<RemoveCPPComment>"//" +<RemoveCPPComment>[^\x06\n]+ +<RemoveCPPComment>. +<DefineText>"#" { + yyextra->quoteArg=TRUE; + yyextra->defLitText+=yytext; + } +<DefineText,CopyCComment>{ID} { + yyextra->defLitText+=yytext; + if (yyextra->quoteArg) + { + yyextra->defText+="\""; + } + if (yyextra->defArgs>0) + { + int *n; + if ((n=(*yyextra->argDict)[yytext])) + { + //if (!yyextra->quoteArg) yyextra->defText+=' '; + yyextra->defText+='@'; + QCString numStr; + numStr.sprintf("%d",*n); + yyextra->defText+=numStr; + //if (!yyextra->quoteArg) yyextra->defText+=' '; + } + else + { + yyextra->defText+=yytext; + } + } + else + { + yyextra->defText+=yytext; + } + if (yyextra->quoteArg) + { + yyextra->defText+="\""; + } + yyextra->quoteArg=FALSE; + } +<CopyCComment>. { + yyextra->defLitText+=yytext; + yyextra->defText+=yytext; + } +<DefineText>\\[\r]?\n { + yyextra->defLitText+=yytext; + outputChar(yyscanner,'\n'); + yyextra->defText += ' '; + yyextra->yyLineNr++; + yyextra->yyMLines++; + } +<DefineText>\n { + QCString comment=extractTrailingComment(yyextra->defLitText); + yyextra->defLitText+=yytext; + if (!comment.isEmpty()) + { + outputArray(yyscanner,comment,comment.length()); + yyextra->defLitText=yyextra->defLitText.left(yyextra->defLitText.length()-comment.length()-1); + } + outputChar(yyscanner,'\n'); + Define *def=0; + //printf("Define name='%s' text='%s' litTexti='%s'\n",yyextra->defName.data(),yyextra->defText.data(),yyextra->defLitText.data()); + if (yyextra->includeStack.isEmpty() || yyextra->curlyCount>0) + { + addDefine(yyscanner); + } + def=yyextra->defineManager.isDefined(yyextra->defName); + if (def==0) // new define + { + //printf("new define '%s'!\n",yyextra->defName.data()); + Define *nd = newDefine(yyscanner); + yyextra->defineManager.addDefine(yyextra->yyFileName,nd); + + // also add it to the local file list if it is a source file + //if (yyextra->isSource && yyextra->includeStack.isEmpty()) + //{ + // yyextra->fileDefineDict->insert(yyextra->defName,nd); + //} + } + else if (def /*&& macroIsAccessible(def)*/) + // name already exists + { + //printf("existing define!\n"); + //printf("define found\n"); + if (def->undef) // undefined name + { + def->undef = FALSE; + def->name = yyextra->defName; + def->definition = yyextra->defText.stripWhiteSpace(); + def->nargs = yyextra->defArgs; + def->fileName = yyextra->yyFileName.copy(); + def->lineNr = yyextra->yyLineNr-yyextra->yyMLines; + def->columnNr = yyextra->yyColNr; + } + else + { + //printf("error: define %s is defined more than once!\n",yyextra->defName.data()); + } + } + delete yyextra->argDict; yyextra->argDict=0; + yyextra->yyLineNr++; + yyextra->yyColNr=1; + yyextra->lastGuardName.resize(0); + BEGIN(Start); + } +<DefineText>{B}* { yyextra->defText += ' '; yyextra->defLitText+=yytext; } +<DefineText>{B}*"##"{B}* { yyextra->defText += "##"; yyextra->defLitText+=yytext; } +<DefineText>"@" { yyextra->defText += "@@"; yyextra->defLitText+=yytext; } +<DefineText>\" { + yyextra->defText += *yytext; + yyextra->defLitText+=yytext; + if (!yyextra->insideComment) + { + BEGIN(SkipDoubleQuote); + } + } +<DefineText>\' { yyextra->defText += *yytext; + yyextra->defLitText+=yytext; + if (!yyextra->insideComment) + { + BEGIN(SkipSingleQuote); + } + } +<SkipDoubleQuote>"//"[/]? { yyextra->defText += yytext; yyextra->defLitText+=yytext; } +<SkipDoubleQuote>"/*" { yyextra->defText += yytext; yyextra->defLitText+=yytext; } +<SkipDoubleQuote>\" { + yyextra->defText += *yytext; yyextra->defLitText+=yytext; + BEGIN(DefineText); + } +<SkipSingleQuote,SkipDoubleQuote>\\. { + yyextra->defText += yytext; yyextra->defLitText+=yytext; + } +<SkipSingleQuote>\' { + yyextra->defText += *yytext; yyextra->defLitText+=yytext; + BEGIN(DefineText); + } +<SkipDoubleQuote>. { yyextra->defText += *yytext; yyextra->defLitText+=yytext; } +<SkipSingleQuote>. { yyextra->defText += *yytext; yyextra->defLitText+=yytext; } +<DefineText>. { yyextra->defText += *yytext; yyextra->defLitText+=yytext; } +<<EOF>> { + DBG_CTX((stderr,"End of include file\n")); + //printf("Include stack depth=%d\n",yyextra->includeStack.count()); + if (yyextra->includeStack.isEmpty()) + { + DBG_CTX((stderr,"Terminating scanner!\n")); + yyterminate(); + } + else + { + FileState *fs=yyextra->includeStack.pop(); + //fileDefineCache->merge(yyextra->yyFileName,fs->fileName); + YY_BUFFER_STATE oldBuf = YY_CURRENT_BUFFER; + yy_switch_to_buffer( fs->bufState, yyscanner ); + yy_delete_buffer( oldBuf, yyscanner ); + yyextra->yyLineNr = fs->lineNr; + //preYYin = fs->oldYYin; + yyextra->inputBuf = fs->oldFileBuf; + yyextra->inputBufPos = fs->oldFileBufPos; + yyextra->curlyCount = fs->curlyCount; + setFileName(yyscanner,fs->fileName); + DBG_CTX((stderr,"######## FileName %s\n",yyextra->yyFileName.data())); + + // Deal with file changes due to + // #include's within { .. } blocks + QCString lineStr(15+yyextra->yyFileName.length()); + lineStr.sprintf("# %d \"%s\" 2",yyextra->yyLineNr,yyextra->yyFileName.data()); + outputArray(yyscanner,lineStr.data(),lineStr.length()); + + delete fs; fs=0; + } + } +<*>"/*"/"*/" | +<*>"/*"[*]? { + if (YY_START==SkipVerbatim || YY_START==SkipCond) + { + REJECT; + } + else + { + outputArray(yyscanner,yytext,(int)yyleng); + yyextra->lastCContext=YY_START; + yyextra->commentCount=1; + if (yyleng==3) yyextra->lastGuardName.resize(0); // reset guard in case the #define is documented! + BEGIN(SkipCComment); + } + } +<*>"//"[/]? { + if (YY_START==SkipVerbatim || YY_START==SkipCond || getLanguageFromFileName(yyextra->yyFileName)==SrcLangExt_Fortran) + { + REJECT; + } + else + { + outputArray(yyscanner,yytext,(int)yyleng); + yyextra->lastCPPContext=YY_START; + if (yyleng==3) yyextra->lastGuardName.resize(0); // reset guard in case the #define is documented! + BEGIN(SkipCPPComment); + } + } +<*>\n { + outputChar(yyscanner,'\n'); + yyextra->yyLineNr++; + } +<*>. { + yyextra->expectGuard = FALSE; + outputChar(yyscanner,*yytext); + } + +%% + +///////////////////////////////////////////////////////////////////////////////////// + +static int yyread(yyscan_t yyscanner,char *buf,int max_size) +{ + YY_EXTRA_TYPE state = preYYget_extra(yyscanner); + int bytesInBuf = state->inputBuf->curPos()-state->inputBufPos; + int bytesToCopy = QMIN(max_size,bytesInBuf); + memcpy(buf,state->inputBuf->data()+state->inputBufPos,bytesToCopy); + state->inputBufPos+=bytesToCopy; + return bytesToCopy; +} + +static void setFileName(yyscan_t yyscanner,const char *name) { + YY_EXTRA_TYPE state = preYYget_extra(yyscanner); bool ambig; QFileInfo fi(name); - g_yyFileName=fi.absFilePath().utf8(); - g_yyFileDef=findFileDef(Doxygen::inputNameDict,g_yyFileName,ambig); - if (g_yyFileDef==0) // if this is not an input file check if it is an + state->yyFileName=fi.absFilePath().utf8(); + state->yyFileDef=findFileDef(Doxygen::inputNameDict,state->yyFileName,ambig); + if (state->yyFileDef==0) // if this is not an input file check if it is an // include file { - g_yyFileDef=findFileDef(Doxygen::includeNameDict,g_yyFileName,ambig); + state->yyFileDef=findFileDef(Doxygen::includeNameDict,state->yyFileName,ambig); } - //printf("setFileName(%s) g_yyFileName=%s g_yyFileDef=%p\n", - // name,g_yyFileName.data(),g_yyFileDef); - if (g_yyFileDef && g_yyFileDef->isReference()) g_yyFileDef=0; - g_insideCS = getLanguageFromFileName(g_yyFileName)==SrcLangExt_CSharp; - g_isSource = guessSection(g_yyFileName); + //printf("setFileName(%s) state->yyFileName=%s state->yyFileDef=%p\n", + // name,state->yyFileName.data(),state->yyFileDef); + if (state->yyFileDef && state->yyFileDef->isReference()) state->yyFileDef=0; + state->insideCS = getLanguageFromFileName(state->yyFileName)==SrcLangExt_CSharp; + state->isSource = guessSection(state->yyFileName); } -static void incrLevel() +static void incrLevel(yyscan_t yyscanner) { - g_level++; - g_levelGuard.resize(g_level); - g_levelGuard[g_level-1]=FALSE; - //printf("%s line %d: incrLevel %d\n",g_yyFileName.data(),g_yyLineNr,g_level); + YY_EXTRA_TYPE state = preYYget_extra(yyscanner); + state->level++; + state->levelGuard.resize(state->level); + state->levelGuard[state->level-1]=FALSE; + //printf("%s line %d: incrLevel %d\n",yyextra->yyFileName.data(),yyextra->yyLineNr,yyextra->level); } -static void decrLevel() +static void decrLevel(yyscan_t yyscanner) { - //printf("%s line %d: decrLevel %d\n",g_yyFileName.data(),g_yyLineNr,g_level); - if (g_level > 0) + YY_EXTRA_TYPE state = preYYget_extra(yyscanner); + //printf("%s line %d: decrLevel %d\n",state->yyFileName.data(),state->yyLineNr,state->level); + if (state->level > 0) { - g_level--; - g_levelGuard.resize(g_level); + state->level--; + state->levelGuard.resize(state->level); } else { - warn(g_yyFileName,g_yyLineNr,"More #endif's than #if's found.\n"); + warn(state->yyFileName,state->yyLineNr,"More #endif's than #if's found.\n"); } } -static bool otherCaseDone() +static bool otherCaseDone(yyscan_t yyscanner) { - if (g_level==0) + YY_EXTRA_TYPE state = preYYget_extra(yyscanner); + if (state->level==0) { - warn(g_yyFileName,g_yyLineNr,"Found an #else without a preceding #if.\n"); + warn(state->yyFileName,state->yyLineNr,"Found an #else without a preceding #if.\n"); return TRUE; } else { - return g_levelGuard[g_level-1]; + return state->levelGuard[state->level-1]; } } -static void setCaseDone(bool value) +static void setCaseDone(yyscan_t yyscanner,bool value) { - g_levelGuard[g_level-1]=value; + YY_EXTRA_TYPE state = preYYget_extra(yyscanner); + state->levelGuard[state->level-1]=value; } -static QDict<void> g_allIncludes(10009); -static FileState *checkAndOpenFile(const QCString &fileName,bool &alreadyIncluded) +static FileState *checkAndOpenFile(yyscan_t yyscanner,const QCString &fileName,bool &alreadyIncluded) { + YY_EXTRA_TYPE state = preYYget_extra(yyscanner); alreadyIncluded = FALSE; FileState *fs = 0; //printf("checkAndOpenFile(%s)\n",fileName.data()); QFileInfo fi(fileName); if (fi.exists() && fi.isFile()) { - static QStrList &exclPatterns = Config_getList(EXCLUDE_PATTERNS); + const QStrList &exclPatterns = Config_getList(EXCLUDE_PATTERNS); if (patternMatch(fi,&exclPatterns)) return 0; QCString absName = fi.absFilePath().utf8(); // global guard - if (g_curlyCount==0) // not #include inside { ... } + if (state->curlyCount==0) // not #include inside { ... } { - if (g_allIncludes.find(absName)!=0) + if (state->allIncludes.find(absName)!=0) { alreadyIncluded = TRUE; //printf(" already included 1\n"); return 0; // already done } - g_allIncludes.insert(absName,(void *)0x8); + state->allIncludes.insert(absName,(void *)0x8); } // check include stack for absName QStack<FileState> tmpStack; - g_includeStack.setAutoDelete(FALSE); - while ((fs=g_includeStack.pop())) + state->includeStack.setAutoDelete(FALSE); + while ((fs=state->includeStack.pop())) { if (fs->fileName==absName) alreadyIncluded=TRUE; tmpStack.push(fs); } while ((fs=tmpStack.pop())) { - g_includeStack.push(fs); + state->includeStack.push(fs); } - g_includeStack.setAutoDelete(TRUE); + state->includeStack.setAutoDelete(TRUE); if (alreadyIncluded) { @@ -508,23 +1815,24 @@ static FileState *checkAndOpenFile(const QCString &fileName,bool &alreadyInclude } else { - fs->oldFileBuf = g_inputBuf; - fs->oldFileBufPos = g_inputBufPos; + fs->oldFileBuf = state->inputBuf; + fs->oldFileBufPos = state->inputBufPos; } } return fs; } -static FileState *findFile(const char *fileName,bool localInclude,bool &alreadyIncluded) +static FileState *findFile(yyscan_t yyscanner, const char *fileName,bool localInclude,bool &alreadyIncluded) { - //printf("** findFile(%s,%d) g_yyFileName=%s\n",fileName,localInclude,g_yyFileName.data()); - if (portable_isAbsolutePath(fileName)) + YY_EXTRA_TYPE state = preYYget_extra(yyscanner); + //printf("** findFile(%s,%d) state->yyFileName=%s\n",fileName,localInclude,state->yyFileName.data()); + if (Portable::isAbsolutePath(fileName)) { - FileState *fs = checkAndOpenFile(fileName,alreadyIncluded); + FileState *fs = checkAndOpenFile(yyscanner,fileName,alreadyIncluded); if (fs) { - setFileName(fileName); - g_yyLineNr=1; + setFileName(yyscanner,fileName); + state->yyLineNr=1; return fs; } else if (alreadyIncluded) @@ -532,17 +1840,17 @@ static FileState *findFile(const char *fileName,bool localInclude,bool &alreadyI return 0; } } - if (localInclude && !g_yyFileName.isEmpty()) + if (localInclude && !state->yyFileName.isEmpty()) { - QFileInfo fi(g_yyFileName); + QFileInfo fi(state->yyFileName); if (fi.exists()) { QCString absName = QCString(fi.dirPath(TRUE).data())+"/"+fileName; - FileState *fs = checkAndOpenFile(absName,alreadyIncluded); + FileState *fs = checkAndOpenFile(yyscanner,absName,alreadyIncluded); if (fs) { - setFileName(absName); - g_yyLineNr=1; + setFileName(yyscanner,absName); + state->yyLineNr=1; return fs; } else if (alreadyIncluded) @@ -551,20 +1859,20 @@ static FileState *findFile(const char *fileName,bool localInclude,bool &alreadyI } } } - if (g_pathList==0) + if (state->pathList==0) { return 0; } - char *s=g_pathList->first(); + char *s=state->pathList->first(); while (s) { QCString absName = (QCString)s+"/"+fileName; //printf(" Looking for %s in %s\n",fileName,s); - FileState *fs = checkAndOpenFile(absName,alreadyIncluded); + FileState *fs = checkAndOpenFile(yyscanner,absName,alreadyIncluded); if (fs) { - setFileName(absName); - g_yyLineNr=1; + setFileName(yyscanner,absName); + state->yyLineNr=1; //printf(" -> found it\n"); return fs; } @@ -573,7 +1881,7 @@ static FileState *findFile(const char *fileName,bool localInclude,bool &alreadyI return 0; } - s=g_pathList->next(); + s=state->pathList->next(); } return 0; } @@ -623,10 +1931,10 @@ static QCString extractTrailingComment(const char *s) return ""; } -static int getNextChar(const QCString &expr,QCString *rest,uint &pos); -static int getCurrentChar(const QCString &expr,QCString *rest,uint pos); -static void unputChar(const QCString &expr,QCString *rest,uint &pos,char c); -static void expandExpression(QCString &expr,QCString *rest,int pos); +static int getNextChar(yyscan_t yyscanner,const QCString &expr,QCString *rest,uint &pos); +static int getCurrentChar(yyscan_t yyscanner,const QCString &expr,QCString *rest,uint pos); +static void unputChar(yyscan_t yyscanner,const QCString &expr,QCString *rest,uint &pos,char c); +static bool expandExpression(yyscan_t yyscanner,QCString &expr,QCString *rest,int pos,int level); static QCString stringize(const QCString &s) { @@ -736,19 +2044,19 @@ static void processConcatOperators(QCString &expr) //printf("processConcatOperators: out='%s'\n",expr.data()); } -static void yyunput (int c,char *buf_ptr ); -static void returnCharToStream(char c) +static void returnCharToStream(yyscan_t yyscanner,char c) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; unput(c); } -static inline void addTillEndOfString(const QCString &expr,QCString *rest, +static inline void addTillEndOfString(yyscan_t yyscanner,const QCString &expr,QCString *rest, uint &pos,char term,QCString &arg) { int cc; - while ((cc=getNextChar(expr,rest,pos))!=EOF && cc!=0) + while ((cc=getNextChar(yyscanner,expr,rest,pos))!=EOF && cc!=0) { - if (cc=='\\') arg+=(char)cc,cc=getNextChar(expr,rest,pos); + if (cc=='\\') arg+=(char)cc,cc=getNextChar(yyscanner,expr,rest,pos); else if (cc==term) return; arg+=(char)cc; } @@ -761,24 +2069,25 @@ static inline void addTillEndOfString(const QCString &expr,QCString *rest, * The replacement string will be returned in \a result and the * length of the (unexpanded) argument list is stored in \a len. */ -static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int &len,const Define *def,QCString &result) +static bool replaceFunctionMacro(yyscan_t yyscanner,const QCString &expr,QCString *rest,int pos,int &len,const Define *def,QCString &result,int level) { - //printf("replaceFunctionMacro(expr=%s,rest=%s,pos=%d,def=%s) level=%d\n",expr.data(),rest ? rest->data() : 0,pos,def->name.data(),g_level); + YY_EXTRA_TYPE state = preYYget_extra(yyscanner); + //printf(">replaceFunctionMacro(expr='%s',rest='%s',pos=%d,def='%s') level=%d\n",expr.data(),rest ? rest->data() : 0,pos,def->name.data(),state->level); uint j=pos; len=0; result.resize(0); int cc; - while ((cc=getCurrentChar(expr,rest,j))!=EOF && isspace(cc)) + while ((cc=getCurrentChar(yyscanner,expr,rest,j))!=EOF && isspace(cc)) { len++; - getNextChar(expr,rest,j); + getNextChar(yyscanner,expr,rest,j); } if (cc!='(') { - unputChar(expr,rest,j,' '); + unputChar(yyscanner,expr,rest,j,cc); return FALSE; } - getNextChar(expr,rest,j); // eat the '(' character + getNextChar(yyscanner,expr,rest,j); // eat the '(' character QDict<QCString> argTable; // list of arguments argTable.setAutoDelete(TRUE); @@ -789,7 +2098,7 @@ static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int // PHASE 1: read the macro arguments if (def->nargs==0) { - while ((cc=getNextChar(expr,rest,j))!=EOF && cc!=0) + while ((cc=getNextChar(yyscanner,expr,rest,j))!=EOF && cc!=0) { char c = (char)cc; if (c==')') break; @@ -798,7 +2107,7 @@ static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int else { while (!done && (argCount<def->nargs || def->varArgs) && - ((cc=getNextChar(expr,rest,j))!=EOF && cc!=0) + ((cc=getNextChar(yyscanner,expr,rest,j))!=EOF && cc!=0) ) { char c=(char)cc; @@ -807,14 +2116,14 @@ static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int int level=1; arg+=c; //char term='\0'; - while ((cc=getNextChar(expr,rest,j))!=EOF && cc!=0) + while ((cc=getNextChar(yyscanner,expr,rest,j))!=EOF && cc!=0) { char c=(char)cc; //printf("processing %c: term=%c (%d)\n",c,term,term); if (c=='\'' || c=='\"') // skip ('s and )'s inside strings { arg+=c; - addTillEndOfString(expr,rest,j,c,arg); + addTillEndOfString(yyscanner,expr,rest,j,c,arg); } if (c==')') { @@ -856,14 +2165,14 @@ static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int { arg+=c; bool found=FALSE; - while (!found && (cc=getNextChar(expr,rest,j))!=EOF && cc!=0) + while (!found && (cc=getNextChar(yyscanner,expr,rest,j))!=EOF && cc!=0) { found = cc=='"'; if (cc=='\\') { c=(char)cc; arg+=c; - if ((cc=getNextChar(expr,rest,j))==EOF || cc==0) break; + if ((cc=getNextChar(yyscanner,expr,rest,j))==EOF || cc==0) break; } c=(char)cc; arg+=c; @@ -873,14 +2182,14 @@ static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int { arg+=c; bool found=FALSE; - while (!found && (cc=getNextChar(expr,rest,j))!=EOF && cc!=0) + while (!found && (cc=getNextChar(yyscanner,expr,rest,j))!=EOF && cc!=0) { found = cc=='\''; if (cc=='\\') { c=(char)cc; arg+=c; - if ((cc=getNextChar(expr,rest,j))==EOF || cc==0) break; + if ((cc=getNextChar(yyscanner,expr,rest,j))==EOF || cc==0) break; } c=(char)cc; arg+=c; @@ -890,9 +2199,9 @@ static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int { char prevChar = '\0'; arg+=c; - if ((cc=getCurrentChar(expr,rest,j)) == '*') // we have a comment + if ((cc=getCurrentChar(yyscanner,expr,rest,j)) == '*') // we have a comment { - while ((cc=getNextChar(expr,rest,j))!=EOF && cc!=0) + while ((cc=getNextChar(yyscanner,expr,rest,j))!=EOF && cc!=0) { c=(char)cc; arg+=c; @@ -917,7 +2226,7 @@ static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int // substitution of all formal arguments QCString resExpr; const QCString d=def->definition.stripWhiteSpace(); - //printf("Macro definition: %s\n",d.data()); + //printf("Macro definition: '%s'\n",d.data()); bool inString=FALSE; while (k<d.length()) { @@ -961,7 +2270,10 @@ static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int //printf("substArg='%s'\n",substArg.data()); // only if no ## operator is before or after the argument // marker we do macro expansion. - if (!hash) expandExpression(substArg,0,0); + if (!hash) + { + expandExpression(yyscanner,substArg,0,0,level+1); + } if (inString) { //printf("'%s'=stringize('%s')\n",stringize(*subst).data(),subst->data()); @@ -976,7 +2288,7 @@ static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int { resExpr+="@E"; // empty argument will be remove later on } - else if (g_nospaces) + else if (state->nospaces) { resExpr+=substArg; } @@ -1003,10 +2315,10 @@ static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int } len=j-pos; result=resExpr; - //printf("result after substitution '%s' expr='%s'\n", - // result.data(),expr.mid(pos,len).data()); + //printf("<replaceFunctionMacro(expr='%s',rest='%s',pos=%d,def='%s',result='%s') level=%d return=TRUE\n",expr.data(),rest ? rest->data() : 0,pos,def->name.data(),result.data(),state->level); return TRUE; } + //printf("<replaceFunctionMacro(expr='%s',rest='%s',pos=%d,def='%s',result='%s') level=%d return=FALSE\n",expr.data(),rest ? rest->data() : 0,pos,def->name.data(),result.data(),state->level); return FALSE; } @@ -1072,12 +2384,25 @@ static int getNextId(const QCString &expr,int p,int *l) /*! performs recursive macro expansion on the string \a expr * starting at position \a pos. * May read additional characters from the input while re-scanning! - * If \a expandAll is \c TRUE then all macros in the expression are - * expanded, otherwise only the first is expanded. */ -static void expandExpression(QCString &expr,QCString *rest,int pos) +static bool expandExpression(yyscan_t yyscanner,QCString &expr,QCString *rest,int pos,int level) { - //printf("expandExpression(%s,%s)\n",expr.data(),rest ? rest->data() : 0); + YY_EXTRA_TYPE state = preYYget_extra(yyscanner); + //printf(">expandExpression(expr='%s',rest='%s',pos=%d,level=%d)\n",expr.data(),rest ? rest->data() : "", pos, level); + if (expr.isEmpty()) + { + //printf("<expandExpression: empty\n"); + return TRUE; + } + if (state->expansionDict.find(expr)!=0) // check for recursive expansions + { + //printf("<expandExpression: already expanded expr='%s'\n",expr.data()); + return FALSE; + } + else + { + state->expansionDict.insert(expr,(void*)0x8); + } QCString macroName; QCString expMacro; bool definedTest=FALSE; @@ -1086,12 +2411,12 @@ static void expandExpression(QCString &expr,QCString *rest,int pos) { bool replaced=FALSE; macroName=expr.mid(p,l); - //printf("macroName=%s\n",macroName.data()); + //printf(" p=%d macroName=%s\n",p,macroName.data()); if (p<2 || !(expr.at(p-2)=='@' && expr.at(p-1)=='-')) // no-rescan marker? { - if (g_expandedDict->find(macroName)==0) // expand macro + if (state->expandedDict->find(macroName)==0) // expand macro { - Define *def=DefineManager::instance().isDefined(macroName); + Define *def=state->defineManager.isDefined(macroName); if (macroName=="defined") { //printf("found defined inside macro definition '%s'\n",expr.right(expr.length()-p).data()); @@ -1108,7 +2433,7 @@ static void expandExpression(QCString &expr,QCString *rest,int pos) { // substitute the definition of the macro //printf("macro '%s'->'%s'\n",macroName.data(),def->definition.data()); - if (g_nospaces) + if (state->nospaces) { expMacro=def->definition.stripWhiteSpace(); } @@ -1123,29 +2448,42 @@ static void expandExpression(QCString &expr,QCString *rest,int pos) } else if (def && def->nargs>=0) // function macro { - replaced=replaceFunctionMacro(expr,rest,p+l,len,def,expMacro); + //printf(" >>>> call replaceFunctionMacro\n"); + replaced=replaceFunctionMacro(yyscanner,expr,rest,p+l,len,def,expMacro,level); + //printf(" <<<< call replaceFunctionMacro: replaced=%d\n",replaced); len+=l; } + //printf(" macroName='%s' expMacro='%s' replaced=%d\n",macroName.data(),expMacro.data(),replaced); if (replaced) // expand the macro and rescan the expression { - //printf("replacing '%s'->'%s'\n",expr.mid(p,len).data(),expMacro.data()); + //printf(" replacing '%s'->'%s'\n",expr.mid(p,len).data(),expMacro.data()); QCString resultExpr=expMacro; QCString restExpr=expr.right(expr.length()-len-p); processConcatOperators(resultExpr); + //printf(" macroName=%s restExpr='%s' def->nonRecursive=%d\n",macroName.data(),restExpr.data(),def->nonRecursive); + bool expanded=false; if (def && !def->nonRecursive) { - g_expandedDict->insert(macroName,def); - expandExpression(resultExpr,&restExpr,0); - g_expandedDict->remove(macroName); + state->expandedDict->insert(macroName,def); + expanded = expandExpression(yyscanner,resultExpr,&restExpr,0,level+1); + state->expandedDict->remove(macroName); } - expr=expr.left(p)+resultExpr+restExpr; - i=p; - //printf("new expression: %s\n",expr.data()); + if (expanded) + { + expr=expr.left(p)+resultExpr+restExpr; + //printf(" new expression: '%s' old i=%d new i=%d\n",expr.data(),i,p); + i=p; + } + else + { + expr=expr.left(p)+"@-"+expr.right(expr.length()-p); + i=p+l+2; + } } else // move to the next macro name { - //printf("moving to the next macro old=%d new=%d\n",i,p+l); + //printf(" moving to the next macro old i=%d new i=%d\n",i,p+l); i=p+l; } } @@ -1163,6 +2501,8 @@ static void expandExpression(QCString &expr,QCString *rest,int pos) i=p+l; } } + //printf("<expandExpression(expr='%s',rest='%s',pos=%d,level=%d)\n",expr.data(),rest ? rest->data() : 0, pos,level); + return TRUE; } /*! @brief Process string or character literal. @@ -1171,7 +2511,7 @@ static void expandExpression(QCString &expr,QCString *rest,int pos) * the routine will return a pointer to just after the end of the literal * the character making up the literal will be added to \a result. */ -const char *processUntilMatchingTerminator(const char *inputStr,QCString &result) +static const char *processUntilMatchingTerminator(const char *inputStr,QCString &result) { if (inputStr==0) return inputStr; char term = *inputStr; // capture start character of the literal @@ -1207,7 +2547,7 @@ const char *processUntilMatchingTerminator(const char *inputStr,QCString &result * and removes all occurrences of @@E. * All identifiers found are replaced by 0L */ -QCString removeIdsAndMarkers(const char *s) +static QCString removeIdsAndMarkers(const char *s) { //printf("removeIdsAndMarkers(%s)\n",s); const char *p=s; @@ -1326,7 +2666,7 @@ nextChar: * \par assumption: * \a s only contains pairs of @@'s */ -QCString removeMarkers(const char *s) +static QCString removeMarkers(const char *s) { const char *p=s; char c; @@ -1387,41 +2727,46 @@ QCString removeMarkers(const char *s) * If needed the function may read additional characters from the input. */ -bool computeExpression(const QCString &expr) +static bool computeExpression(yyscan_t yyscanner,const QCString &expr) { + YY_EXTRA_TYPE state = preYYget_extra(yyscanner); QCString e=expr; - expandExpression(e,0,0); + state->expansionDict.clear(); + expandExpression(yyscanner,e,0,0,0); //printf("after expansion '%s'\n",e.data()); e = removeIdsAndMarkers(e); if (e.isEmpty()) return FALSE; //printf("parsing '%s'\n",e.data()); - return parseconstexp(g_yyFileName,g_yyLineNr,e); + return state->constExpParser.parse(state->yyFileName,state->yyLineNr,e); } /*! expands the macro definition in \a name * If needed the function may read additional characters from the input */ -QCString expandMacro(const QCString &name) +static QCString expandMacro(yyscan_t yyscanner,const QCString &name) { + YY_EXTRA_TYPE state = preYYget_extra(yyscanner); QCString n=name; - expandExpression(n,0,0); + state->expansionDict.clear(); + expandExpression(yyscanner,n,0,0,0); n=removeMarkers(n); //printf("expandMacro '%s'->'%s'\n",name.data(),n.data()); return n; } -Define *newDefine() +static Define *newDefine(yyscan_t yyscanner) { + YY_EXTRA_TYPE state = preYYget_extra(yyscanner); Define *def=new Define; - def->name = g_defName; - def->definition = g_defText.stripWhiteSpace(); - def->nargs = g_defArgs; - def->fileName = g_yyFileName; - def->fileDef = g_yyFileDef; - def->lineNr = g_yyLineNr-g_yyMLines; - def->columnNr = g_yyColNr; - def->varArgs = g_defVarArgs; + def->name = state->defName; + def->definition = state->defText.stripWhiteSpace(); + def->nargs = state->defArgs; + def->fileName = state->yyFileName; + def->fileDef = state->yyFileDef; + def->lineNr = state->yyLineNr-state->yyMLines; + def->columnNr = state->yyColNr; + def->varArgs = state->defVarArgs; //printf("newDefine: %s %s file: %s\n",def->name.data(),def->definition.data(), // def->fileDef ? def->fileDef->name().data() : def->fileName.data()); //printf("newDefine: '%s'->'%s'\n",def->name.data(),def->definition.data()); @@ -1432,76 +2777,88 @@ Define *newDefine() return def; } -void addDefine() +static void addDefine(yyscan_t yyscanner) { - if (g_skip) return; // do not add this define as it is inside a + YY_EXTRA_TYPE state = preYYget_extra(yyscanner); + if (state->skip) return; // do not add this define as it is inside a // conditional section (cond command) that is disabled. if (!Doxygen::gatherDefines) return; - //printf("addDefine %s %s\n",g_defName.data(),g_defArgsStr.data()); + //printf("addDefine '%s' '%s'\n",state->defName.data(),state->defArgsStr.data()); //ArgumentList *al = new ArgumentList; - //stringToArgumentList(g_defArgsStr,al); + //stringToArgumentList(state->defArgsStr,al); MemberDef *md=createMemberDef( - g_yyFileName,g_yyLineNr-g_yyMLines,g_yyColNr, - "#define",g_defName,g_defArgsStr,0, + state->yyFileName,state->yyLineNr-state->yyMLines,state->yyColNr, + "#define",state->defName,state->defArgsStr,0, Public,Normal,FALSE,Member,MemberType_Define,ArgumentList(),ArgumentList(),""); - if (!g_defArgsStr.isEmpty()) + if (!state->defArgsStr.isEmpty()) { ArgumentList argList; - //printf("addDefine() g_defName='%s' g_defArgsStr='%s'\n",g_defName.data(),g_defArgsStr.data()); - stringToArgumentList(g_defArgsStr,argList); + //printf("addDefine() state->defName='%s' state->defArgsStr='%s'\n",state->defName.data(),state->defArgsStr.data()); + stringToArgumentList(state->defArgsStr,argList); md->setArgumentList(argList); } - //printf("Setting initializer for '%s' to '%s'\n",g_defName.data(),g_defText.data()); - int l=g_defLitText.find('\n'); - if (l>0 && g_defLitText.left(l).stripWhiteSpace()=="\\") + //printf("Setting initializer for '%s' to '%s'\n",state->defName.data(),state->defText.data()); + int l=state->defLitText.find('\n'); + if (l>0 && state->defLitText.left(l).stripWhiteSpace()=="\\") { // strip first line if it only contains a slash - g_defLitText = g_defLitText.right(g_defLitText.length()-l-1); + state->defLitText = state->defLitText.right(state->defLitText.length()-l-1); } else if (l>0) { // align the items on the first line with the items on the second line int k=l+1; - const char *p=g_defLitText.data()+k; + const char *p=state->defLitText.data()+k; char c; while ((c=*p++) && (c==' ' || c=='\t')) k++; - g_defLitText=g_defLitText.mid(l+1,k-l-1)+g_defLitText.stripWhiteSpace(); + state->defLitText=state->defLitText.mid(l+1,k-l-1)+state->defLitText.stripWhiteSpace(); + } + QCString defLitTextStripped = state->defLitText.stripWhiteSpace(); + if (defLitTextStripped.contains('\n')>=1) + { + md->setInitializer(state->defLitText); + } + else + { + md->setInitializer(defLitTextStripped); } - md->setInitializer(g_defLitText.stripWhiteSpace()); - //printf("pre.l: md->setFileDef(%p)\n",g_inputFileDef); - md->setFileDef(g_inputFileDef); - md->setDefinition("#define "+g_defName); + //printf("pre.l: md->setFileDef(%p)\n",state->inputFileDef); + md->setFileDef(state->inputFileDef); + md->setDefinition("#define "+state->defName); - MemberName *mn=Doxygen::functionNameSDict->find(g_defName); + MemberName *mn=Doxygen::functionNameSDict->find(state->defName); if (mn==0) { - mn = new MemberName(g_defName); - Doxygen::functionNameSDict->append(g_defName,mn); + mn = new MemberName(state->defName); + Doxygen::functionNameSDict->append(state->defName,mn); } mn->append(md); - if (g_yyFileDef) + if (state->yyFileDef) { - g_yyFileDef->insertMember(md); + state->yyFileDef->insertMember(md); } //Define *d; - //if ((d=defineDict[g_defName])==0) defineDict.insert(g_defName,newDefine()); + //if ((d=defineDict[state->defName])==0) defineDict.insert(state->defName,newDefine()); } -static inline void outputChar(char c) +static inline void outputChar(yyscan_t yyscanner,char c) { - if (g_includeStack.isEmpty() || g_curlyCount>0) g_outputBuf->addChar(c); + YY_EXTRA_TYPE state = preYYget_extra(yyscanner); + if (state->includeStack.isEmpty() || state->curlyCount>0) state->outputBuf->addChar(c); } -static inline void outputArray(const char *a,int len) +static inline void outputArray(yyscan_t yyscanner,const char *a,int len) { - if (g_includeStack.isEmpty() || g_curlyCount>0) g_outputBuf->addArray(a,len); + YY_EXTRA_TYPE state = preYYget_extra(yyscanner); + if (state->includeStack.isEmpty() || state->curlyCount>0) state->outputBuf->addArray(a,len); } -static void readIncludeFile(const QCString &inc) +static void readIncludeFile(yyscan_t yyscanner,const QCString &inc) { + YY_EXTRA_TYPE state = preYYget_extra(yyscanner); static bool searchIncludes = Config_getBool(SEARCH_INCLUDES); uint i=0; @@ -1529,15 +2886,15 @@ static void readIncludeFile(const QCString &inc) return; } - QCString oldFileName = g_yyFileName; - FileDef *oldFileDef = g_yyFileDef; - int oldLineNr = g_yyLineNr; + QCString oldFileName = state->yyFileName; + FileDef *oldFileDef = state->yyFileDef; + int oldLineNr = state->yyLineNr; //printf("Searching for '%s'\n",incFileName.data()); // absIncFileName avoids difficulties for incFileName starting with "../" (bug 641336) QCString absIncFileName = incFileName; { - QFileInfo fi(g_yyFileName); + QFileInfo fi(state->yyFileName); if (fi.exists()) { QCString absName = QCString(fi.dirPath(TRUE).data())+"/"+incFileName; @@ -1571,19 +2928,19 @@ static void readIncludeFile(const QCString &inc) //printf( "absIncFileName = %s\n", absIncFileName.data() ); } } - DefineManager::instance().addInclude(g_yyFileName,absIncFileName); - DefineManager::instance().addFileToContext(absIncFileName); + state->defineManager.addInclude(state->yyFileName,absIncFileName); + state->defineManager.addFileToContext(absIncFileName); - // findFile will overwrite g_yyFileDef if found + // findFile will overwrite state->yyFileDef if found FileState *fs; bool alreadyIncluded = FALSE; //printf("calling findFile(%s)\n",incFileName.data()); - if ((fs=findFile(incFileName,localInclude,alreadyIncluded))) // see if the include file can be found + if ((fs=findFile(yyscanner,incFileName,localInclude,alreadyIncluded))) // see if the include file can be found { //printf("Found include file!\n"); if (Debug::isFlagSet(Debug::Preprocessor)) { - for (i=0;i<g_includeStack.count();i++) + for (i=0;i<state->includeStack.count();i++) { Debug::print(Debug::Preprocessor,0," "); } @@ -1595,38 +2952,39 @@ static void readIncludeFile(const QCString &inc) bool ambig; // change to absolute name for bug 641336 FileDef *incFd = findFileDef(Doxygen::inputNameDict,absIncFileName,ambig); - oldFileDef->addIncludeDependency(ambig ? 0 : incFd,incFileName,localInclude,g_isImported,FALSE); + oldFileDef->addIncludeDependency(ambig ? 0 : incFd,incFileName,localInclude,state->isImported,FALSE); // add included by dependency - if (g_yyFileDef) + if (state->yyFileDef) { //printf("Adding include dependency %s->%s\n",oldFileDef->name().data(),incFileName.data()); - g_yyFileDef->addIncludedByDependency(oldFileDef,oldFileDef->docName(),localInclude,g_isImported); + state->yyFileDef->addIncludedByDependency(oldFileDef,oldFileDef->docName(),localInclude,state->isImported); } } - else if (g_inputFileDef) + else if (state->inputFileDef) { - g_inputFileDef->addIncludeDependency(0,absIncFileName,localInclude,g_isImported,TRUE); + state->inputFileDef->addIncludeDependency(0,absIncFileName,localInclude,state->isImported,TRUE); } + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; fs->bufState = YY_CURRENT_BUFFER; fs->lineNr = oldLineNr; fs->fileName = oldFileName; - fs->curlyCount = g_curlyCount; - g_curlyCount = 0; + fs->curlyCount = state->curlyCount; + state->curlyCount = 0; // push the state on the stack - g_includeStack.push(fs); + state->includeStack.push(fs); // set the scanner to the include file // Deal with file changes due to // #include's within { .. } blocks - QCString lineStr(g_yyFileName.length()+20); - lineStr.sprintf("# 1 \"%s\" 1\n",g_yyFileName.data()); - outputArray(lineStr.data(),lineStr.length()); + QCString lineStr(state->yyFileName.length()+20); + lineStr.sprintf("# 1 \"%s\" 1\n",state->yyFileName.data()); + outputArray(yyscanner,lineStr.data(),lineStr.length()); DBG_CTX((stderr,"Switching to include file %s\n",incFileName.data())); - g_expectGuard=TRUE; - g_inputBuf = &fs->fileBuf; - g_inputBufPos=0; - yy_switch_to_buffer(yy_create_buffer(0, YY_BUF_SIZE)); + state->expectGuard=TRUE; + state->inputBuf = &fs->fileBuf; + state->inputBufPos=0; + yy_switch_to_buffer(yy_create_buffer(0, YY_BUF_SIZE, yyscanner),yyscanner); } else { @@ -1645,17 +3003,17 @@ static void readIncludeFile(const QCString &inc) FileDef *fd = findFileDef(Doxygen::inputNameDict,absIncFileName,ambig); //printf("%s::findFileDef(%s)=%p\n",oldFileDef->name().data(),incFileName.data(),fd); // add include dependency to the file in which the #include was found - oldFileDef->addIncludeDependency(ambig ? 0 : fd,incFileName,localInclude,g_isImported,FALSE); + oldFileDef->addIncludeDependency(ambig ? 0 : fd,incFileName,localInclude,state->isImported,FALSE); // add included by dependency if (fd) { //printf("Adding include dependency (2) %s->%s ambig=%d\n",oldFileDef->name().data(),fd->name().data(),ambig); - fd->addIncludedByDependency(oldFileDef,oldFileDef->docName(),localInclude,g_isImported); + fd->addIncludedByDependency(oldFileDef,oldFileDef->docName(),localInclude,state->isImported); } } - else if (g_inputFileDef) + else if (state->inputFileDef) { - g_inputFileDef->addIncludeDependency(0,absIncFileName,localInclude,g_isImported,TRUE); + state->inputFileDef->addIncludeDependency(0,absIncFileName,localInclude,state->isImported,TRUE); } if (Debug::isFlagSet(Debug::Preprocessor)) { @@ -1669,9 +3027,9 @@ static void readIncludeFile(const QCString &inc) } //printf("error: include file %s not found\n",yytext); } - if (g_curlyCount>0 && !alreadyIncluded) // failed to find #include inside { ... } + if (state->curlyCount>0 && !alreadyIncluded) // failed to find #include inside { ... } { - warn(g_yyFileName,g_yyLineNr,"include file %s not found, perhaps you forgot to add its directory to INCLUDE_PATH?",incFileName.data()); + warn(state->yyFileName,state->yyLineNr,"include file %s not found, perhaps you forgot to add its directory to INCLUDE_PATH?",incFileName.data()); } } } @@ -1679,41 +3037,44 @@ static void readIncludeFile(const QCString &inc) /* ----------------------------------------------------------------- */ -static void startCondSection(const char *sectId) +static void startCondSection(yyscan_t yyscanner,const char *sectId) { - //printf("startCondSection: skip=%d stack=%d\n",g_skip,g_condStack.count()); + YY_EXTRA_TYPE state = preYYget_extra(yyscanner); + //printf("startCondSection: skip=%d stack=%d\n",state->skip,state->condStack.count()); CondParser prs; - bool expResult = prs.parse(g_yyFileName,g_yyLineNr,sectId); - g_condStack.push(new CondCtx(g_yyLineNr,sectId,g_skip)); + bool expResult = prs.parse(state->yyFileName,state->yyLineNr,sectId); + state->condStack.push(new CondCtx(state->yyLineNr,sectId,state->skip)); if (!expResult) { - g_skip=TRUE; + state->skip=TRUE; } - //printf(" expResult=%d skip=%d\n",expResult,g_skip); + //printf(" expResult=%d skip=%d\n",expResult,state->skip); } -static void endCondSection() +static void endCondSection(yyscan_t yyscanner) { - if (g_condStack.isEmpty()) + YY_EXTRA_TYPE state = preYYget_extra(yyscanner); + if (state->condStack.isEmpty()) { - g_skip=FALSE; + state->skip=FALSE; } else { - CondCtx *ctx = g_condStack.pop(); - g_skip=ctx->skip; + CondCtx *ctx = state->condStack.pop(); + state->skip=ctx->skip; delete ctx; } - //printf("endCondSection: skip=%d stack=%d\n",g_skip,g_condStack.count()); + //printf("endCondSection: skip=%d stack=%d\n",state->skip,state->condStack.count()); } -static void forceEndCondSection() +static void forceEndCondSection(yyscan_t yyscanner) { - while (!g_condStack.isEmpty()) + YY_EXTRA_TYPE state = preYYget_extra(yyscanner); + while (!state->condStack.isEmpty()) { - delete g_condStack.pop(); + delete state->condStack.pop(); } - g_skip=FALSE; + state->skip=FALSE; } static QCString escapeAt(const char *text) @@ -1748,1295 +3109,10 @@ static char resolveTrigraph(char c) return '?'; } -/* ----------------------------------------------------------------- */ - -#undef YY_INPUT -#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); - -static int yyread(char *buf,int max_size) -{ - int bytesInBuf = g_inputBuf->curPos()-g_inputBufPos; - int bytesToCopy = QMIN(max_size,bytesInBuf); - memcpy(buf,g_inputBuf->data()+g_inputBufPos,bytesToCopy); - g_inputBufPos+=bytesToCopy; - return bytesToCopy; -} - -/* ----------------------------------------------------------------- */ - -%} - -ID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]* -B [ \t] -BN [ \t\r\n] -RAWBEGIN (u|U|L|u8)?R\"[^ \t\(\)\\]{0,16}"(" -RAWEND ")"[^ \t\(\)\\]{0,16}\" -CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) - -%option noyywrap - -%x Start -%x Command -%x SkipCommand -%x SkipLine -%x SkipString -%x CopyLine -%x CopyString -%x CopyStringCs -%x CopyStringFtn -%x CopyStringFtnDouble -%x CopyRawString -%x Include -%x IncludeID -%x EndImport -%x DefName -%x DefineArg -%x DefineText -%x SkipCPPBlock -%x Ifdef -%x Ifndef -%x SkipCComment -%x ArgCopyCComment -%x CopyCComment -%x SkipVerbatim -%x SkipCPPComment -%x RemoveCComment -%x RemoveCPPComment -%x Guard -%x DefinedExpr1 -%x DefinedExpr2 -%x SkipDoubleQuote -%x SkipSingleQuote -%x UndefName -%x IgnoreLine -%x FindDefineArgs -%x ReadString -%x CondLineC -%x CondLineCpp -%x SkipCond - -%% - -<*>\x06 -<*>\x00 -<*>\r -<*>"??"[=/'()!<>-] { // Trigraph - unput(resolveTrigraph(yytext[2])); - } -<Start>^{B}*"#" { BEGIN(Command); g_yyColNr+=yyleng; g_yyMLines=0;} -<Start>^{B}*/[^#] { - outputArray(yytext,(int)yyleng); - BEGIN(CopyLine); - } -<Start>^{B}*[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]+{B}*"("[^\)\n]*")"/{BN}{1,10}*[:{] { // constructors? - int i; - for (i=(int)yyleng-1;i>=0;i--) - { - unput(yytext[i]); - } - BEGIN(CopyLine); - } -<Start>^{B}*[_A-Z][_A-Z0-9]+{B}*"("[^\(\)\n]*"("[^\)\n]*")"[^\)\n]*")"{B}*\n | // function list macro with one (...) argument, e.g. for K_GLOBAL_STATIC_WITH_ARGS -<Start>^{B}*[_A-Z][_A-Z0-9]+{B}*"("[^\)\n]*")"{B}*\n { // function like macro - static bool skipFuncMacros = Config_getBool(SKIP_FUNCTION_MACROS); - QCString name(yytext); - name=name.left(name.find('(')).stripWhiteSpace(); - - Define *def=0; - if (skipFuncMacros && - name!="Q_PROPERTY" && - !( - (g_includeStack.isEmpty() || g_curlyCount>0) && - g_macroExpansion && - (def=DefineManager::instance().isDefined(name)) && - /*macroIsAccessible(def) &&*/ - (!g_expandOnlyPredef || def->isPredefined) - ) - ) - { - outputChar('\n'); - g_yyLineNr++; - } - else // don't skip - { - int i; - for (i=(int)yyleng-1;i>=0;i--) - { - unput(yytext[i]); - } - BEGIN(CopyLine); - } - } -<CopyLine>"extern"{BN}{0,80}"\"C\""*{BN}{0,80}"{" { - QCString text=yytext; - g_yyLineNr+=text.contains('\n'); - outputArray(yytext,(int)yyleng); - } -<CopyLine>{RAWBEGIN} { - g_delimiter = yytext+2; - g_delimiter=g_delimiter.left(g_delimiter.length()-1); - outputArray(yytext,(int)yyleng); - BEGIN(CopyRawString); - } -<CopyLine>"{" { // count brackets inside the main file - if (g_includeStack.isEmpty()) - { - g_curlyCount++; - } - outputChar(*yytext); - } -<CopyLine>"}" { // count brackets inside the main file - if (g_includeStack.isEmpty() && g_curlyCount>0) - { - g_curlyCount--; - } - outputChar(*yytext); - } -<CopyLine>"'"\\[0-7]{1,3}"'" { - outputArray(yytext,(int)yyleng); - } -<CopyLine>"'"\\."'" { - outputArray(yytext,(int)yyleng); - } -<CopyLine>"'"."'" { - outputArray(yytext,(int)yyleng); - } -<CopyLine>@\" { - if (getLanguageFromFileName(g_yyFileName)!=SrcLangExt_CSharp) REJECT; - outputArray(yytext,(int)yyleng); - BEGIN( CopyStringCs ); - } -<CopyLine>\" { - outputChar(*yytext); - if (getLanguageFromFileName(g_yyFileName)!=SrcLangExt_Fortran) - { - BEGIN( CopyString ); - } - else - { - BEGIN( CopyStringFtnDouble ); - } - } -<CopyLine>\' { - if (getLanguageFromFileName(g_yyFileName)!=SrcLangExt_Fortran) REJECT; - outputChar(*yytext); - BEGIN( CopyStringFtn ); - } -<CopyString>[^\"\\\r\n]+ { - outputArray(yytext,(int)yyleng); - } -<CopyStringCs>[^\"\r\n]+ { - outputArray(yytext,(int)yyleng); - } -<CopyString>\\. { - outputArray(yytext,(int)yyleng); - } -<CopyString,CopyStringCs>\" { - outputChar(*yytext); - BEGIN( CopyLine ); - } -<CopyStringFtnDouble>[^\"\\\r\n]+ { - outputArray(yytext,(int)yyleng); - } -<CopyStringFtnDouble>\\. { - outputArray(yytext,(int)yyleng); - } -<CopyStringFtnDouble>\" { - outputChar(*yytext); - BEGIN( CopyLine ); - } -<CopyStringFtn>[^\'\\\r\n]+ { - outputArray(yytext,(int)yyleng); - } -<CopyStringFtn>\\. { - outputArray(yytext,(int)yyleng); - } -<CopyStringFtn>\' { - outputChar(*yytext); - BEGIN( CopyLine ); - } -<CopyRawString>{RAWEND} { - outputArray(yytext,(int)yyleng); - QCString delimiter = yytext+1; - delimiter=delimiter.left(delimiter.length()-1); - if (delimiter==g_delimiter) - { - BEGIN( CopyLine ); - } - } -<CopyRawString>[^)]+ { - outputArray(yytext,(int)yyleng); - } -<CopyRawString>. { - outputChar(*yytext); - } -<CopyLine>{ID}/{BN}{0,80}"(" { - g_expectGuard = FALSE; - Define *def=0; - //def=g_globalDefineDict->find(yytext); - //def=DefineManager::instance().isDefined(yytext); - //printf("Search for define %s found=%d g_includeStack.isEmpty()=%d " - // "g_curlyCount=%d g_macroExpansion=%d g_expandOnlyPredef=%d " - // "isPreDefined=%d\n",yytext,def ? 1 : 0, - // g_includeStack.isEmpty(),g_curlyCount,g_macroExpansion,g_expandOnlyPredef, - // def ? def->isPredefined : -1 - // ); - if ((g_includeStack.isEmpty() || g_curlyCount>0) && - g_macroExpansion && - (def=DefineManager::instance().isDefined(yytext)) && - /*(def->isPredefined || macroIsAccessible(def)) && */ - (!g_expandOnlyPredef || def->isPredefined) - ) - { - //printf("Found it! #args=%d\n",def->nargs); - g_roundCount=0; - g_defArgsStr=yytext; - if (def->nargs==-1) // no function macro - { - QCString result = def->isPredefined ? def->definition : expandMacro(g_defArgsStr); - outputArray(result,result.length()); - } - else // zero or more arguments - { - g_findDefArgContext = CopyLine; - BEGIN(FindDefineArgs); - } - } - else - { - outputArray(yytext,(int)yyleng); - } - } -<CopyLine>{ID} { - Define *def=0; - if ((g_includeStack.isEmpty() || g_curlyCount>0) && - g_macroExpansion && - (def=DefineManager::instance().isDefined(yytext)) && - def->nargs==-1 && - /*(def->isPredefined || macroIsAccessible(def)) &&*/ - (!g_expandOnlyPredef || def->isPredefined) - ) - { - QCString result=def->isPredefined ? def->definition : expandMacro(yytext); - outputArray(result,result.length()); - } - else - { - outputArray(yytext,(int)yyleng); - } - } -<CopyLine>"\\"\r?/\n { // strip line continuation characters - if (getLanguageFromFileName(g_yyFileName)==SrcLangExt_Fortran) outputChar(*yytext); - } -<CopyLine>. { - outputChar(*yytext); - } -<CopyLine>\n { - outputChar('\n'); - BEGIN(Start); - g_yyLineNr++; - g_yyColNr=1; - } -<FindDefineArgs>"(" { - g_defArgsStr+='('; - g_roundCount++; - } -<FindDefineArgs>")" { - g_defArgsStr+=')'; - g_roundCount--; - if (g_roundCount==0) - { - QCString result=expandMacro(g_defArgsStr); - //printf("g_defArgsStr='%s'->'%s'\n",g_defArgsStr.data(),result.data()); - if (g_findDefArgContext==CopyLine) - { - outputArray(result,result.length()); - BEGIN(g_findDefArgContext); - } - else // g_findDefArgContext==IncludeID - { - readIncludeFile(result); - g_nospaces=FALSE; - BEGIN(Start); - } - } - } - /* -<FindDefineArgs>")"{B}*"(" { - g_defArgsStr+=yytext; - } - */ -<FindDefineArgs>{CHARLIT} { - g_defArgsStr+=yytext; - } -<FindDefineArgs>"/*"[*]? { - g_defArgsStr+=yytext; - BEGIN(ArgCopyCComment); - } -<FindDefineArgs>\" { - g_defArgsStr+=*yytext; - BEGIN(ReadString); - } -<FindDefineArgs>' { - if (getLanguageFromFileName(g_yyFileName)!=SrcLangExt_Fortran) REJECT; - g_defArgsStr+=*yytext; - BEGIN(ReadString); - } -<FindDefineArgs>\n { - g_defArgsStr+=' '; - g_yyLineNr++; - outputChar('\n'); - } -<FindDefineArgs>"@" { - g_defArgsStr+="@@"; - } -<FindDefineArgs>. { - g_defArgsStr+=*yytext; - } -<ArgCopyCComment>[^*\n]+ { - g_defArgsStr+=yytext; - } -<ArgCopyCComment>"*/" { - g_defArgsStr+=yytext; - BEGIN(FindDefineArgs); - } -<ArgCopyCComment>\n { - g_defArgsStr+=' '; - g_yyLineNr++; - outputChar('\n'); - } -<ArgCopyCComment>. { - g_defArgsStr+=yytext; - } -<ReadString>"\"" { - g_defArgsStr+=*yytext; - BEGIN(FindDefineArgs); - } -<ReadString>"'" { - if (getLanguageFromFileName(g_yyFileName)!=SrcLangExt_Fortran) REJECT; - g_defArgsStr+=*yytext; - BEGIN(FindDefineArgs); - } - -<ReadString>"//"|"/*" { - g_defArgsStr+=yytext; - } -<ReadString>\\/\r?\n { // line continuation - } -<ReadString>\\. { - g_defArgsStr+=yytext; - } -<ReadString>. { - g_defArgsStr+=*yytext; - } -<Command>("include"|"import"){B}+/{ID} { - g_isImported = yytext[1]=='m'; - if (g_macroExpansion) - BEGIN(IncludeID); - } -<Command>("include"|"import"){B}*[<"] { - g_isImported = yytext[1]=='m'; - char c[2]; - c[0]=yytext[yyleng-1];c[1]='\0'; - g_incName=c; - BEGIN(Include); - } -<Command>("cmake")?"define"{B}+ { - //printf("!!!DefName\n"); - g_yyColNr+=yyleng; - BEGIN(DefName); - } -<Command>"ifdef"/{B}*"(" { - incrLevel(); - g_guardExpr.resize(0); - BEGIN(DefinedExpr2); - } -<Command>"ifdef"/{B}+ { - //printf("Pre.l: ifdef\n"); - incrLevel(); - g_guardExpr.resize(0); - BEGIN(DefinedExpr1); - } -<Command>"ifndef"/{B}*"(" { - incrLevel(); - g_guardExpr="! "; - BEGIN(DefinedExpr2); - } -<Command>"ifndef"/{B}+ { - incrLevel(); - g_guardExpr="! "; - BEGIN(DefinedExpr1); - } -<Command>"if"/[ \t(!] { - incrLevel(); - g_guardExpr.resize(0); - BEGIN(Guard); - } -<Command>("elif"|"else"{B}*"if")/[ \t(!] { - if (!otherCaseDone()) - { - g_guardExpr.resize(0); - BEGIN(Guard); - } - else - { - g_ifcount=0; - BEGIN(SkipCPPBlock); - } - } -<Command>"else"/[^a-z_A-Z0-9\x80-\xFF] { - //printf("else g_levelGuard[%d]=%d\n",g_level-1,g_levelGuard[g_level-1]); - if (otherCaseDone()) - { - g_ifcount=0; - BEGIN(SkipCPPBlock); - } - else - { - setCaseDone(TRUE); - //g_levelGuard[g_level-1]=TRUE; - } - } -<Command>"undef"{B}+ { - BEGIN(UndefName); - } -<Command>("elif"|"else"{B}*"if")/[ \t(!] { - if (!otherCaseDone()) - { - g_guardExpr.resize(0); - BEGIN(Guard); - } - } -<Command>"endif"/[^a-z_A-Z0-9\x80-\xFF] { - //printf("Pre.l: #endif\n"); - decrLevel(); - } -<Command,IgnoreLine>\n { - outputChar('\n'); - BEGIN(Start); - g_yyLineNr++; - } -<Command>"pragma"{B}+"once" { - g_expectGuard = FALSE; - } -<Command>{ID} { // unknown directive - BEGIN(IgnoreLine); - } -<IgnoreLine>\\[\r]?\n { - outputChar('\n'); - g_yyLineNr++; - } -<IgnoreLine>. -<Command>. {g_yyColNr+=yyleng;} -<UndefName>{ID} { - Define *def; - if ((def=DefineManager::instance().isDefined(yytext)) - /*&& !def->isPredefined*/ - && !def->nonRecursive - ) - { - //printf("undefining %s\n",yytext); - def->undef=TRUE; - } - BEGIN(Start); - } -<Guard>\\[\r]?\n { - outputChar('\n'); - g_guardExpr+=' '; - g_yyLineNr++; - } -<Guard>"defined"/{B}*"(" { - BEGIN(DefinedExpr2); - } -<Guard>"defined"/{B}+ { - BEGIN(DefinedExpr1); - } -<Guard>{ID} { g_guardExpr+=yytext; } -<Guard>"@" { g_guardExpr+="@@"; } -<Guard>. { g_guardExpr+=*yytext; } -<Guard>\n { - unput(*yytext); - //printf("Guard: '%s'\n", - // g_guardExpr.data()); - bool guard=computeExpression(g_guardExpr); - setCaseDone(guard); - //printf("if g_levelGuard[%d]=%d\n",g_level-1,g_levelGuard[g_level-1]); - if (guard) - { - BEGIN(Start); - } - else - { - g_ifcount=0; - BEGIN(SkipCPPBlock); - } - } -<DefinedExpr1,DefinedExpr2>\\\n { g_yyLineNr++; outputChar('\n'); } -<DefinedExpr1>{ID} { - if (DefineManager::instance().isDefined(yytext) || g_guardName==yytext) - g_guardExpr+=" 1L "; - else - g_guardExpr+=" 0L "; - g_lastGuardName=yytext; - BEGIN(Guard); - } -<DefinedExpr2>{ID} { - if (DefineManager::instance().isDefined(yytext) || g_guardName==yytext) - g_guardExpr+=" 1L "; - else - g_guardExpr+=" 0L "; - g_lastGuardName=yytext; - } -<DefinedExpr1,DefinedExpr2>\n { // should not happen, handle anyway - g_yyLineNr++; - g_ifcount=0; - BEGIN(SkipCPPBlock); - } -<DefinedExpr2>")" { - BEGIN(Guard); - } -<DefinedExpr1,DefinedExpr2>. -<SkipCPPBlock>^{B}*"#" { BEGIN(SkipCommand); } -<SkipCPPBlock>^{B}*/[^#] { BEGIN(SkipLine); } -<SkipCPPBlock>\n { g_yyLineNr++; outputChar('\n'); } -<SkipCPPBlock>. -<SkipCommand>"if"(("n")?("def"))?/[ \t(!] { - incrLevel(); - g_ifcount++; - //printf("#if... depth=%d\n",g_ifcount); - } -<SkipCommand>"else" { - //printf("Else! g_ifcount=%d otherCaseDone=%d\n",g_ifcount,otherCaseDone()); - if (g_ifcount==0 && !otherCaseDone()) - { - setCaseDone(TRUE); - //outputChar('\n'); - BEGIN(Start); - } - } -<SkipCommand>("elif"|"else"{B}*"if")/[ \t(!] { - if (g_ifcount==0) - { - if (!otherCaseDone()) - { - g_guardExpr.resize(0); - g_lastGuardName.resize(0); - BEGIN(Guard); - } - else - { - BEGIN(SkipCPPBlock); - } - } - } -<SkipCommand>"endif" { - g_expectGuard = FALSE; - decrLevel(); - if (--g_ifcount<0) - { - //outputChar('\n'); - BEGIN(Start); - } - } -<SkipCommand>\n { - outputChar('\n'); - g_yyLineNr++; - BEGIN(SkipCPPBlock); - } -<SkipCommand>{ID} { // unknown directive - BEGIN(SkipLine); - } -<SkipCommand>. -<SkipLine>[^'"/\n]+ -<SkipLine>{CHARLIT} { } -<SkipLine>\" { - BEGIN(SkipString); - } -<SkipLine>. -<SkipString>"//"/[^\n]* { - } -<SkipLine,SkipCommand,SkipCPPBlock>"//"[^\n]* { - g_lastCPPContext=YY_START; - BEGIN(RemoveCPPComment); - } -<SkipString>"/*"/[^\n]* { - } -<SkipLine,SkipCommand,SkipCPPBlock>"/*"/[^\n]* { - g_lastCContext=YY_START; - BEGIN(RemoveCComment); - } -<SkipLine>\n { - outputChar('\n'); - g_yyLineNr++; - BEGIN(SkipCPPBlock); - } -<SkipString>[^"\\\n]+ { } -<SkipString>\\. { } -<SkipString>\" { - BEGIN(SkipLine); - } -<SkipString>. { } -<IncludeID>{ID}{B}*/"(" { - g_nospaces=TRUE; - g_roundCount=0; - g_defArgsStr=yytext; - g_findDefArgContext = IncludeID; - BEGIN(FindDefineArgs); - } -<IncludeID>{ID} { - g_nospaces=TRUE; - readIncludeFile(expandMacro(yytext)); - BEGIN(Start); - } -<Include>[^\">\n]+[\">] { - g_incName+=yytext; - readIncludeFile(g_incName); - if (g_isImported) - { - BEGIN(EndImport); - } - else - { - BEGIN(Start); - } - } -<EndImport>[^\\\n]*/\n { - BEGIN(Start); - } -<EndImport>\\[\r]?"\n" { - outputChar('\n'); - g_yyLineNr++; - } -<EndImport>. { - } -<DefName>{ID}/("\\\n")*"(" { // define with argument - //printf("Define() '%s'\n",yytext); - delete g_argDict; - g_argDict = new QDict<int>(31); - g_argDict->setAutoDelete(TRUE); - g_defArgs = 0; - g_defArgsStr.resize(0); - g_defText.resize(0); - g_defLitText.resize(0); - g_defName = yytext; - g_defVarArgs = FALSE; - g_defExtraSpacing.resize(0); - BEGIN(DefineArg); - } -<DefName>{ID}{B}+"1"/[ \r\t\n] { // special case: define with 1 -> can be "guard" - //printf("Define '%s'\n",yytext); - delete g_argDict; g_argDict=0; - g_defArgs = -1; - g_defArgsStr.resize(0); - g_defName = yytext; - g_defName = g_defName.left(g_defName.length()-1).stripWhiteSpace(); - g_defVarArgs = FALSE; - //printf("Guard check: %s!=%s || %d\n", - // g_defName.data(),g_lastGuardName.data(),g_expectGuard); - if (g_curlyCount>0 || g_defName!=g_lastGuardName || !g_expectGuard) - { // define may appear in the output - QCString tmp=(QCString)"#define "+g_defName; - outputArray(tmp.data(),tmp.length()); - g_quoteArg=FALSE; - g_insideComment=FALSE; - g_lastGuardName.resize(0); - g_defText="1"; - g_defLitText="1"; - BEGIN(DefineText); - } - else // define is a guard => hide - { - //printf("Found a guard %s\n",yytext); - g_defText.resize(0); - g_defLitText.resize(0); - BEGIN(Start); - } - g_expectGuard=FALSE; - } -<DefName>{ID}/{B}*"\n" { // empty define - delete g_argDict; g_argDict=0; - g_defArgs = -1; - g_defName = yytext; - g_defArgsStr.resize(0); - g_defText.resize(0); - g_defLitText.resize(0); - g_defVarArgs = FALSE; - //printf("Guard check: %s!=%s || %d\n", - // g_defName.data(),g_lastGuardName.data(),g_expectGuard); - if (g_curlyCount>0 || g_defName!=g_lastGuardName || !g_expectGuard) - { // define may appear in the output - QCString tmp=(QCString)"#define "+g_defName; - outputArray(tmp.data(),tmp.length()); - g_quoteArg=FALSE; - g_insideComment=FALSE; - if (g_insideCS) g_defText="1"; // for C#, use "1" as define text - BEGIN(DefineText); - } - else // define is a guard => hide - { - //printf("Found a guard %s\n",yytext); - g_guardName = yytext; - g_lastGuardName.resize(0); - BEGIN(Start); - } - g_expectGuard=FALSE; - } -<DefName>{ID}/{B}* { // define with content - //printf("Define '%s'\n",yytext); - delete g_argDict; g_argDict=0; - g_defArgs = -1; - g_defArgsStr.resize(0); - g_defText.resize(0); - g_defLitText.resize(0); - g_defName = yytext; - g_defVarArgs = FALSE; - QCString tmp=(QCString)"#define "+g_defName+g_defArgsStr; - outputArray(tmp.data(),tmp.length()); - g_quoteArg=FALSE; - g_insideComment=FALSE; - BEGIN(DefineText); - } -<DefineArg>"\\\n" { - g_defExtraSpacing+="\n"; - g_yyLineNr++; - } -<DefineArg>","{B}* { g_defArgsStr+=yytext; } -<DefineArg>"("{B}* { g_defArgsStr+=yytext; } -<DefineArg>{B}*")"{B}* { - g_defArgsStr+=yytext; - QCString tmp=(QCString)"#define "+g_defName+g_defArgsStr+g_defExtraSpacing; - outputArray(tmp.data(),tmp.length()); - g_quoteArg=FALSE; - g_insideComment=FALSE; - BEGIN(DefineText); - } -<DefineArg>"..." { // Variadic macro - g_defVarArgs = TRUE; - g_defArgsStr+=yytext; - g_argDict->insert("__VA_ARGS__",new int(g_defArgs)); - g_defArgs++; - } -<DefineArg>{ID}{B}*("..."?) { - //printf("Define addArg(%s)\n",yytext); - QCString argName=yytext; - g_defVarArgs = yytext[yyleng-1]=='.'; - if (g_defVarArgs) // strip ellipsis - { - argName=argName.left(argName.length()-3); - } - argName = argName.stripWhiteSpace(); - g_defArgsStr+=yytext; - g_argDict->insert(argName,new int(g_defArgs)); - g_defArgs++; - } - /* -<DefineText>"/ **"|"/ *!" { - g_defText+=yytext; - g_defLitText+=yytext; - g_insideComment=TRUE; - } -<DefineText>"* /" { - g_defText+=yytext; - g_defLitText+=yytext; - g_insideComment=FALSE; - } - */ -<DefineText>"/*"[!*]? { - g_defText+=yytext; - g_defLitText+=yytext; - g_lastCContext=YY_START; - g_commentCount=1; - BEGIN(CopyCComment); - } -<DefineText>"//"[!/]? { - outputArray(yytext,(int)yyleng); - g_lastCPPContext=YY_START; - g_defLitText+=' '; - BEGIN(SkipCPPComment); - } -<SkipCComment>[/]?"*/" { - if (yytext[0]=='/') outputChar('/'); - outputChar('*');outputChar('/'); - if (--g_commentCount<=0) - { - if (g_lastCContext==Start) - // small hack to make sure that ^... rule will - // match when going to Start... Example: "/*...*/ some stuff..." - { - YY_CURRENT_BUFFER->yy_at_bol=1; - } - BEGIN(g_lastCContext); - } - } -<SkipCComment>"//"("/")* { - outputArray(yytext,(int)yyleng); - } -<SkipCComment>"/*" { - outputChar('/');outputChar('*'); - //g_commentCount++; - } -<SkipCComment>[\\@][\\@]("f{"|"f$"|"f[") { - outputArray(yytext,(int)yyleng); - } -<SkipCComment>^({B}*"*"+)?{B}{0,3}"~~~"[~]* { - static bool markdownSupport = Config_getBool(MARKDOWN_SUPPORT); - if (!markdownSupport) - { - REJECT; - } - else - { - outputArray(yytext,(int)yyleng); - g_fenceSize=yyleng; - BEGIN(SkipVerbatim); - } - } -<SkipCComment>^({B}*"*"+)?{B}{0,3}"```"[`]* { - static bool markdownSupport = Config_getBool(MARKDOWN_SUPPORT); - if (!markdownSupport) - { - REJECT; - } - else - { - outputArray(yytext,(int)yyleng); - g_fenceSize=yyleng; - BEGIN(SkipVerbatim); - } - } -<SkipCComment>[\\@][\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"docbookonly"|"rtfonly"|"manonly"|"dot"|"code"("{"[^}]*"}")?){BN}+ { - outputArray(yytext,(int)yyleng); - g_yyLineNr+=QCString(yytext).contains('\n'); - } -<SkipCComment>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"docbookonly"|"rtfonly"|"manonly"|"dot"|"code"("{"[^}]*"}")?){BN}+ { - outputArray(yytext,(int)yyleng); - g_yyLineNr+=QCString(yytext).contains('\n'); - g_fenceSize=0; - if (yytext[1]=='f') - { - g_blockName="f"; - } - else - { - QCString bn=&yytext[1]; - int i = bn.find('{'); // for \code{.c} - if (i!=-1) bn=bn.left(i); - g_blockName=bn.stripWhiteSpace(); - } - BEGIN(SkipVerbatim); - } -<SkipCComment,SkipCPPComment>[\\@][\\@]"cond"[ \t]+ { // escaped @cond - outputArray(yytext,(int)yyleng); - } -<SkipCPPComment>[\\@]"cond"[ \t]+ { // conditional section - g_ccomment=TRUE; - g_condCtx=YY_START; - BEGIN(CondLineCpp); - } -<SkipCComment>[\\@]"cond"[ \t]+ { // conditional section - g_ccomment=FALSE; - g_condCtx=YY_START; - BEGIN(CondLineC); - } -<CondLineC,CondLineCpp>[!()&| \ta-z_A-Z0-9\x80-\xFF.\-]+ { - startCondSection(yytext); - if (g_skip) - { - if (YY_START==CondLineC) - { - // end C comment - outputArray("*/",2); - g_ccomment=TRUE; - } - else - { - g_ccomment=FALSE; - } - BEGIN(SkipCond); - } - else - { - BEGIN(g_condCtx); - } - } -<CondLineC,CondLineCpp>. { // non-guard character - unput(*yytext); - startCondSection(" "); - if (g_skip) - { - if (YY_START==CondLineC) - { - // end C comment - outputArray("*/",2); - g_ccomment=TRUE; - } - else - { - g_ccomment=FALSE; - } - BEGIN(SkipCond); - } - else - { - BEGIN(g_condCtx); - } - } -<SkipCComment,SkipCPPComment>[\\@]"cond"[ \t\r]*/\n { // no guard - if (YY_START==SkipCComment) - { - g_ccomment=TRUE; - // end C comment - outputArray("*/",2); - } - else - { - g_ccomment=FALSE; - } - g_condCtx=YY_START; - startCondSection(" "); - BEGIN(SkipCond); - } -<SkipCond>\n { g_yyLineNr++; outputChar('\n'); } -<SkipCond>. { } -<SkipCond>[^\/\!*\\@\n]+ { } -<SkipCond>"//"[/!] { g_ccomment=FALSE; } -<SkipCond>"/*"[*!] { g_ccomment=TRUE; } -<SkipCond,SkipCComment,SkipCPPComment>[\\@][\\@]"endcond"/[^a-z_A-Z0-9\x80-\xFF] { - if (!g_skip) - { - outputArray(yytext,(int)yyleng); - } - } -<SkipCond>[\\@]"endcond"/[^a-z_A-Z0-9\x80-\xFF] { - bool oldSkip = g_skip; - endCondSection(); - if (oldSkip && !g_skip) - { - if (g_ccomment) - { - outputArray("/** ",4); - } - BEGIN(g_condCtx); - } - } -<SkipCComment,SkipCPPComment>[\\@]"endcond"/[^a-z_A-Z0-9\x80-\xFF] { - bool oldSkip = g_skip; - endCondSection(); - if (oldSkip && !g_skip) - { - BEGIN(g_condCtx); - } - } -<SkipVerbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddocbookonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode"|"f$"|"f]"|"f}") { /* end of verbatim block */ - outputArray(yytext,(int)yyleng); - if (yytext[1]=='f' && g_blockName=="f") - { - BEGIN(SkipCComment); - } - else if (&yytext[4]==g_blockName) - { - BEGIN(SkipCComment); - } - } -<SkipVerbatim>^({B}*"*"+)?{B}{0,3}"~~~"[~]* { - outputArray(yytext,(int)yyleng); - if (g_fenceSize==yyleng) - { - BEGIN(SkipCComment); - } - } -<SkipVerbatim>^({B}*"*"+)?{B}{0,3}"```"[`]* { - outputArray(yytext,(int)yyleng); - if (g_fenceSize==yyleng) - { - BEGIN(SkipCComment); - } - } -<SkipVerbatim>"*/"|"/*" { - outputArray(yytext,(int)yyleng); - } -<SkipCComment,SkipVerbatim>[^*\\@\x06~`\n\/]+ { - outputArray(yytext,(int)yyleng); - } -<SkipCComment,SkipVerbatim>\n { - g_yyLineNr++; - outputChar('\n'); - } -<SkipCComment,SkipVerbatim>. { - outputChar(*yytext); - } -<CopyCComment>[^*a-z_A-Z\x80-\xFF\n]*[^*a-z_A-Z\x80-\xFF\\\n] { - g_defLitText+=yytext; - g_defText+=escapeAt(yytext); - } -<CopyCComment>\\[\r]?\n { - g_defLitText+=yytext; - outputChar('\n'); - g_defText+=" "; - g_yyLineNr++; - g_yyMLines++; - } -<CopyCComment>"*/" { - g_defLitText+=yytext; - g_defText+=yytext; - BEGIN(g_lastCContext); - } -<CopyCComment>\n { - g_yyLineNr++; - outputChar('\n'); - g_defLitText+=yytext; - g_defText+=' '; - } -<RemoveCComment>"*/"{B}*"#" { // see bug 594021 for a usecase for this rule - if (g_lastCContext==SkipCPPBlock) - { - BEGIN(SkipCommand); - } - else - { - REJECT; - } - } -<RemoveCComment>"*/" { BEGIN(g_lastCContext); } -<RemoveCComment>"//" -<RemoveCComment>"/*" -<RemoveCComment>[^*\x06\n]+ -<RemoveCComment>\n { g_yyLineNr++; outputChar('\n'); } -<RemoveCComment>. -<SkipCPPComment>[^\n\/\\@]+ { - outputArray(yytext,(int)yyleng); - } -<SkipCPPComment,RemoveCPPComment>\n { - unput(*yytext); - BEGIN(g_lastCPPContext); - } -<SkipCPPComment>"/*" { - outputChar('/');outputChar('*'); - } -<SkipCPPComment>"//" { - outputChar('/');outputChar('/'); - } -<SkipCPPComment>[^\x06\@\\\n]+ { - outputArray(yytext,(int)yyleng); - } -<SkipCPPComment>. { - outputChar(*yytext); - } -<RemoveCPPComment>"/*" -<RemoveCPPComment>"//" -<RemoveCPPComment>[^\x06\n]+ -<RemoveCPPComment>. -<DefineText>"#" { - g_quoteArg=TRUE; - g_defLitText+=yytext; - } -<DefineText,CopyCComment>{ID} { - g_defLitText+=yytext; - if (g_quoteArg) - { - g_defText+="\""; - } - if (g_defArgs>0) - { - int *n; - if ((n=(*g_argDict)[yytext])) - { - //if (!g_quoteArg) g_defText+=' '; - g_defText+='@'; - QCString numStr; - numStr.sprintf("%d",*n); - g_defText+=numStr; - //if (!g_quoteArg) g_defText+=' '; - } - else - { - g_defText+=yytext; - } - } - else - { - g_defText+=yytext; - } - if (g_quoteArg) - { - g_defText+="\""; - } - g_quoteArg=FALSE; - } -<CopyCComment>. { - g_defLitText+=yytext; - g_defText+=yytext; - } -<DefineText>\\[\r]?\n { - g_defLitText+=yytext; - outputChar('\n'); - g_defText += ' '; - g_yyLineNr++; - g_yyMLines++; - } -<DefineText>\n { - QCString comment=extractTrailingComment(g_defLitText); - g_defLitText+=yytext; - if (!comment.isEmpty()) - { - outputArray(comment,comment.length()); - g_defLitText=g_defLitText.left(g_defLitText.length()-comment.length()-1); - } - outputChar('\n'); - Define *def=0; - //printf("Define name='%s' text='%s' litTexti='%s'\n",g_defName.data(),g_defText.data(),g_defLitText.data()); - if (g_includeStack.isEmpty() || g_curlyCount>0) - { - addDefine(); - } - def=DefineManager::instance().isDefined(g_defName); - if (def==0) // new define - { - //printf("new define '%s'!\n",g_defName.data()); - Define *nd = newDefine(); - DefineManager::instance().addDefine(g_yyFileName,nd); - - // also add it to the local file list if it is a source file - //if (g_isSource && g_includeStack.isEmpty()) - //{ - // g_fileDefineDict->insert(g_defName,nd); - //} - } - else if (def /*&& macroIsAccessible(def)*/) - // name already exists - { - //printf("existing define!\n"); - //printf("define found\n"); - if (def->undef) // undefined name - { - def->undef = FALSE; - def->name = g_defName; - def->definition = g_defText.stripWhiteSpace(); - def->nargs = g_defArgs; - def->fileName = g_yyFileName.copy(); - def->lineNr = g_yyLineNr-g_yyMLines; - def->columnNr = g_yyColNr; - } - else - { - //printf("error: define %s is defined more than once!\n",g_defName.data()); - } - } - delete g_argDict; g_argDict=0; - g_yyLineNr++; - g_yyColNr=1; - g_lastGuardName.resize(0); - BEGIN(Start); - } -<DefineText>{B}* { g_defText += ' '; g_defLitText+=yytext; } -<DefineText>{B}*"##"{B}* { g_defText += "##"; g_defLitText+=yytext; } -<DefineText>"@" { g_defText += "@@"; g_defLitText+=yytext; } -<DefineText>\" { - g_defText += *yytext; - g_defLitText+=yytext; - if (!g_insideComment) - { - BEGIN(SkipDoubleQuote); - } - } -<DefineText>\' { g_defText += *yytext; - g_defLitText+=yytext; - if (!g_insideComment) - { - BEGIN(SkipSingleQuote); - } - } -<SkipDoubleQuote>"//"[/]? { g_defText += yytext; g_defLitText+=yytext; } -<SkipDoubleQuote>"/*" { g_defText += yytext; g_defLitText+=yytext; } -<SkipDoubleQuote>\" { - g_defText += *yytext; g_defLitText+=yytext; - BEGIN(DefineText); - } -<SkipSingleQuote,SkipDoubleQuote>\\. { - g_defText += yytext; g_defLitText+=yytext; - } -<SkipSingleQuote>\' { - g_defText += *yytext; g_defLitText+=yytext; - BEGIN(DefineText); - } -<SkipDoubleQuote>. { g_defText += *yytext; g_defLitText+=yytext; } -<SkipSingleQuote>. { g_defText += *yytext; g_defLitText+=yytext; } -<DefineText>. { g_defText += *yytext; g_defLitText+=yytext; } -<<EOF>> { - DBG_CTX((stderr,"End of include file\n")); - //printf("Include stack depth=%d\n",g_includeStack.count()); - if (g_includeStack.isEmpty()) - { - DBG_CTX((stderr,"Terminating scanner!\n")); - yyterminate(); - } - else - { - FileState *fs=g_includeStack.pop(); - //fileDefineCache->merge(g_yyFileName,fs->fileName); - YY_BUFFER_STATE oldBuf = YY_CURRENT_BUFFER; - yy_switch_to_buffer( fs->bufState ); - yy_delete_buffer( oldBuf ); - g_yyLineNr = fs->lineNr; - //preYYin = fs->oldYYin; - g_inputBuf = fs->oldFileBuf; - g_inputBufPos = fs->oldFileBufPos; - g_curlyCount = fs->curlyCount; - setFileName(fs->fileName); - DBG_CTX((stderr,"######## FileName %s\n",g_yyFileName.data())); - - // Deal with file changes due to - // #include's within { .. } blocks - QCString lineStr(15+g_yyFileName.length()); - lineStr.sprintf("# %d \"%s\" 2",g_yyLineNr,g_yyFileName.data()); - outputArray(lineStr.data(),lineStr.length()); - - delete fs; fs=0; - } - } -<*>"/*"/"*/" | -<*>"/*"[*]? { - if (YY_START==SkipVerbatim || YY_START==SkipCond) - { - REJECT; - } - else - { - 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); - } - } -<*>"//"[/]? { - if (YY_START==SkipVerbatim || YY_START==SkipCond || getLanguageFromFileName(g_yyFileName)==SrcLangExt_Fortran) - { - REJECT; - } - else - { - 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); - } - } -<*>\n { - outputChar('\n'); - g_yyLineNr++; - } -<*>. { - g_expectGuard = FALSE; - outputChar(*yytext); - } - -%% - /*@ ---------------------------------------------------------------------------- */ -static int getNextChar(const QCString &expr,QCString *rest,uint &pos) +static int getNextChar(yyscan_t yyscanner,const QCString &expr,QCString *rest,uint &pos) { //printf("getNextChar(%s,%s,%d)\n",expr.data(),rest ? rest->data() : 0,pos); if (pos<expr.length()) @@ -3053,13 +3129,13 @@ static int getNextChar(const QCString &expr,QCString *rest,uint &pos) } else { - int cc=yyinput(); + int cc=yyinput(yyscanner); //printf("%d=yyinput() %d\n",cc,EOF); return cc; } } -static int getCurrentChar(const QCString &expr,QCString *rest,uint pos) +static int getCurrentChar(yyscan_t yyscanner,const QCString &expr,QCString *rest,uint pos) { //printf("getCurrentChar(%s,%s,%d)\n",expr.data(),rest ? rest->data() : 0,pos); if (pos<expr.length()) @@ -3075,15 +3151,15 @@ static int getCurrentChar(const QCString &expr,QCString *rest,uint pos) } else { - int cc=yyinput(); - returnCharToStream(cc); + int cc=yyinput(yyscanner); + returnCharToStream(yyscanner,cc); //unput((char)cc); //printf("%c=yyinput()\n",cc); return cc; } } -static void unputChar(const QCString &expr,QCString *rest,uint &pos,char c) +static void unputChar(yyscan_t yyscanner,const QCString &expr,QCString *rest,uint &pos,char c) { //printf("unputChar(%s,%s,%d,%c)\n",expr.data(),rest ? rest->data() : 0,pos,c); if (pos<expr.length()) @@ -3099,61 +3175,85 @@ static void unputChar(const QCString &expr,QCString *rest,uint &pos,char c) else { //unput(c); - returnCharToStream(c); + returnCharToStream(yyscanner,c); } //printf("result: unputChar(%s,%s,%d,%c)\n",expr.data(),rest ? rest->data() : 0,pos,c); } -void addSearchDir(const char *dir) +/////////////////////////////////////////////////////////////////////////////////////////////// + +struct Preprocessor::Private +{ + yyscan_t yyscanner; + preYY_state state; + bool firstTime = FALSE; +}; + +void Preprocessor::addSearchDir(const char *dir) { + YY_EXTRA_TYPE state = preYYget_extra(p->yyscanner); QFileInfo fi(dir); - if (fi.isDir()) g_pathList->append(fi.absFilePath().utf8()); + if (fi.isDir()) state->pathList->append(fi.absFilePath().utf8()); } -void initPreprocessor() +Preprocessor::Preprocessor() { - g_pathList = new QStrList; + p = new Private; + preYYlex_init_extra(&p->state,&p->yyscanner); + YY_EXTRA_TYPE state = preYYget_extra(p->yyscanner); + state->pathList = new QStrList; addSearchDir("."); - g_expandedDict = new DefineDict(17); + state->expandedDict = new DefineDict(17); } -void cleanUpPreprocessor() +Preprocessor::~Preprocessor() { - delete g_expandedDict; g_expandedDict=0; - delete g_pathList; g_pathList=0; - DefineManager::deleteInstance(); + YY_EXTRA_TYPE state = preYYget_extra(p->yyscanner); + delete state->expandedDict; + state->expandedDict=0; + delete state->pathList; + state->pathList=0; + preYYlex_destroy(p->yyscanner); + delete p; } - -void preprocessFile(const char *fileName,BufStr &input,BufStr &output) +void Preprocessor::processFile(const char *fileName,BufStr &input,BufStr &output) { + yyscan_t yyscanner = p->yyscanner; + YY_EXTRA_TYPE state = preYYget_extra(p->yyscanner); + struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner; + +#ifdef FLEX_DEBUG + preYYset_debug(1,yyscanner); +#endif + printlex(yy_flex_debug, TRUE, __FILE__, fileName); uint orgOffset=output.curPos(); //printf("##########################\n%s\n####################\n", // input.data()); - g_macroExpansion = Config_getBool(MACRO_EXPANSION); - g_expandOnlyPredef = Config_getBool(EXPAND_ONLY_PREDEF); - g_skip=FALSE; - g_curlyCount=0; - g_nospaces=FALSE; - g_inputBuf=&input; - g_inputBufPos=0; - g_outputBuf=&output; - g_includeStack.setAutoDelete(TRUE); - g_includeStack.clear(); - g_expandedDict->setAutoDelete(FALSE); - g_expandedDict->clear(); - g_condStack.setAutoDelete(TRUE); - g_condStack.clear(); - //g_fileDefineDict->clear(); - - setFileName(fileName); - g_inputFileDef = g_yyFileDef; - DefineManager::instance().startContext(g_yyFileName); + state->macroExpansion = Config_getBool(MACRO_EXPANSION); + state->expandOnlyPredef = Config_getBool(EXPAND_ONLY_PREDEF); + state->skip=FALSE; + state->curlyCount=0; + state->nospaces=FALSE; + state->inputBuf=&input; + state->inputBufPos=0; + state->outputBuf=&output; + state->includeStack.setAutoDelete(TRUE); + state->includeStack.clear(); + state->expandedDict->setAutoDelete(FALSE); + state->expandedDict->clear(); + state->condStack.setAutoDelete(TRUE); + state->condStack.clear(); + //state->fileDefineDict->clear(); + + setFileName(yyscanner,fileName); + state->inputFileDef = state->yyFileDef; + state->defineManager.startContext(state->yyFileName); - static bool firstTime=TRUE; - if (firstTime) + p->firstTime=TRUE; + if (p->firstTime) { // add predefined macros char *defStr; @@ -3226,13 +3326,14 @@ void preprocessFile(const char *fileName,BufStr &input,BufStr &output) def->nargs = count; def->isPredefined = TRUE; def->nonRecursive = nonRecursive; - def->fileDef = g_yyFileDef; + def->fileDef = state->yyFileDef; def->fileName = fileName; - DefineManager::instance().addDefine(g_yyFileName,def); + state->defineManager.addDefine(state->yyFileName,def); + + //printf("#define '%s' '%s' #nargs=%d\n", + // def->name.data(),def->definition.data(),def->nargs); } - //printf("#define '%s' '%s' #nargs=%d\n", - // def->name.data(),def->definition.data(),def->nargs); } else if ((i_obrace==-1 || i_obrace>i_equals) && (i_cbrace==-1 || i_cbrace>i_equals) && @@ -3257,9 +3358,9 @@ void preprocessFile(const char *fileName,BufStr &input,BufStr &output) def->nargs = -1; def->isPredefined = TRUE; def->nonRecursive = nonRecursive; - def->fileDef = g_yyFileDef; + def->fileDef = state->yyFileDef; def->fileName = fileName; - DefineManager::instance().addDefine(g_yyFileName,def); + state->defineManager.addDefine(state->yyFileName,def); } else { @@ -3273,24 +3374,23 @@ void preprocessFile(const char *fileName,BufStr &input,BufStr &output) //firstTime=FALSE; } - g_yyLineNr = 1; - g_yyColNr = 1; - g_level = 0; - g_ifcount = 0; + state->yyLineNr = 1; + state->yyColNr = 1; + state->level = 0; + state->ifcount = 0; BEGIN( Start ); - g_expectGuard = guessSection(fileName)==Entry::HEADER_SEC; - g_guardName.resize(0); - g_lastGuardName.resize(0); - g_guardExpr.resize(0); + state->expectGuard = guessSection(fileName)==Entry::HEADER_SEC; + state->guardName.resize(0); + state->lastGuardName.resize(0); + state->guardExpr.resize(0); - preYYlex(); - g_lexInit=TRUE; + preYYlex(yyscanner); - while (!g_condStack.isEmpty()) + while (!state->condStack.isEmpty()) { - CondCtx *ctx = g_condStack.pop(); + CondCtx *ctx = state->condStack.pop(); QCString sectionInfo = " "; if (ctx->sectionId!=" ") sectionInfo.sprintf(" with label '%s' ",ctx->sectionId.stripWhiteSpace().data()); warn(fileName,ctx->lineNr,"Conditional section%sdoes not have " @@ -3298,18 +3398,18 @@ void preprocessFile(const char *fileName,BufStr &input,BufStr &output) delete ctx; } // make sure we don't extend a \cond with missing \endcond over multiple files (see bug 624829) - forceEndCondSection(); + forceEndCondSection(yyscanner); // remove locally defined macros so they can be redefined in another source file - //if (g_fileDefineDict->count()>0) + //if (state->fileDefineDict->count()>0) //{ - // QDictIterator<Define> di(*g_fileDefineDict); + // QDictIterator<Define> di(*state->fileDefineDict); // Define *d; // for (di.toFirst();(d=di.current());++di) // { - // g_globalDefineDict->remove(di.currentKey()); + // state->globalDefineDict->remove(di.currentKey()); // } - // g_fileDefineDict->clear(); + // state->fileDefineDict->clear(); //} if (Debug::isFlagSet(Debug::Preprocessor)) @@ -3326,11 +3426,11 @@ void preprocessFile(const char *fileName,BufStr &input,BufStr &output) orgPos++; } Debug::print(Debug::Preprocessor,0,"\n---------\n"); - if (DefineManager::instance().defineContext().count()>0) + if (state->defineManager.defineContext().count()>0) { Debug::print(Debug::Preprocessor,0,"Macros accessible in this file:\n"); Debug::print(Debug::Preprocessor,0,"---------\n"); - QDictIterator<Define> di(DefineManager::instance().defineContext()); + QDictIterator<Define> di(state->defineManager.defineContext()); Define *def; for (di.toFirst();(def=di.current());++di) { @@ -3343,25 +3443,9 @@ void preprocessFile(const char *fileName,BufStr &input,BufStr &output) Debug::print(Debug::Preprocessor,0,"No macros accessible in this file.\n"); } } - DefineManager::instance().endContext(); + state->defineManager.endContext(); printlex(yy_flex_debug, FALSE, __FILE__, fileName); } -void preFreeScanner() -{ -#if defined(YY_FLEX_SUBMINOR_VERSION) - if (g_lexInit) - { - preYYlex_destroy(); - } -#endif -} - -#if !defined(YY_FLEX_SUBMINOR_VERSION) -extern "C" { // some bogus code to keep the compiler happy -// int preYYwrap() { return 1 ; } - void preYYdummy() { yy_flex_realloc(0,0); } -} -#endif #include "pre.l.h" diff --git a/src/pycode.h b/src/pycode.h index de0a8a9..e3a01b4 100644 --- a/src/pycode.h +++ b/src/pycode.h @@ -25,7 +25,7 @@ #ifndef PYCODE_H #define PYCODE_H -#include "types.h" +#include "parserintf.h" class CodeOutputInterface; class FileDef; @@ -33,11 +33,26 @@ class MemberDef; class QCString; class Definition; -extern void parsePythonCode(CodeOutputInterface &,const char *,const QCString &, - bool ,const char *,FileDef *fd, - int startLine,int endLine,bool inlineFragment, - const MemberDef *memberDef,bool showLineNumbers,const Definition *searchCtx, - bool collectXRefs); -extern void resetPythonCodeParserState(); +class PythonCodeParser : public CodeParserInterface +{ + public: + void parseCode(CodeOutputInterface &codeOutIntf, + const char *scopeName, + const QCString &input, + SrcLangExt lang, + bool isExampleBlock, + const char *exampleName=0, + FileDef *fileDef=0, + int startLine=-1, + int endLine=-1, + bool inlineFragment=FALSE, + const MemberDef *memberDef=0, + bool showLineNumbers=TRUE, + const Definition *searchCtx=0, + bool collectXrefs=TRUE + ); + void resetCodeParserState(); +}; + #endif diff --git a/src/pycode.l b/src/pycode.l index 8cae0e2..f7e255f 100644 --- a/src/pycode.l +++ b/src/pycode.l @@ -1276,7 +1276,7 @@ TARGET ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUT {BB}/({NONEMPTY}|{EXPCHAR}) { // This implements poor - // indendation-tracking; + // indentation-tracking; // should be improved. // (translate tabs to space, etc) codifyLines(yytext); @@ -1638,13 +1638,33 @@ void parsePythonCode(CodeOutputInterface &od,const char * /*className*/, return; } +//---------------------------------------------------------------------------- + +void PythonCodeParser::parseCode(CodeOutputInterface &codeOutIntf, + const char *scopeName, + const QCString &input, + SrcLangExt /*lang*/, + bool isExampleBlock, + const char *exampleName, + FileDef *fileDef, + int startLine, + int endLine, + bool inlineFragment, + const MemberDef *memberDef, + bool showLineNumbers, + const Definition *searchCtx, + bool collectXRefs + ) +{ + ::parsePythonCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName, + fileDef,startLine,endLine,inlineFragment,memberDef, + showLineNumbers,searchCtx,collectXRefs); +} -#if !defined(YY_FLEX_SUBMINOR_VERSION) -extern "C" { // some bogus code to keep the compiler happy - void pycodeYYdummy() { yy_flex_realloc(0,0); } +void PythonCodeParser::resetCodeParserState() +{ + ::resetPythonCodeParserState(); } -#elif YY_FLEX_MAJOR_VERSION<=2 && YY_FLEX_MINOR_VERSION<=5 && YY_FLEX_SUBMINOR_VERSION<33 -#error "You seem to be using a version of flex newer than 2.5.4. These are currently incompatible with 2.5.4, and do NOT work with doxygen! Please use version 2.5.4 or expect things to be parsed wrongly! A bug report has been submitted (#732132)." -#endif + #include "pycode.l.h" diff --git a/src/pyscanner.h b/src/pyscanner.h index 13b10b9..6cfadf6 100644 --- a/src/pyscanner.h +++ b/src/pyscanner.h @@ -31,34 +31,17 @@ * * This is the Python language parser for doxygen. */ -class PythonLanguageScanner : public ParserInterface +class PythonOutlineParser : public OutlineParserInterface { public: - virtual ~PythonLanguageScanner() {} void startTranslationUnit(const char *) {} void finishTranslationUnit() {} void parseInput(const char * fileName, const char *fileBuf, - const std::unique_ptr<Entry> &root, + const std::shared_ptr<Entry> &root, bool sameTranslationUnit, QStrList &filesInSameTranslationUnit); - bool needsPreprocessing(const QCString &extension); - void parseCode(CodeOutputInterface &codeOutIntf, - const char *scopeName, - const QCString &input, - SrcLangExt lang, - bool isExampleBlock, - const char *exampleName=0, - FileDef *fileDef=0, - int startLine=-1, - int endLine=-1, - bool inlineFragment=FALSE, - const MemberDef *memberDef=0, - bool showLineNumbers=TRUE, - const Definition *searchCtx=0, - bool collectXrefs=TRUE - ); - void resetCodeParserState(); + bool needsPreprocessing(const QCString &extension) const; void parsePrototype(const char *text); }; diff --git a/src/pyscanner.l b/src/pyscanner.l index 829980c..efdc943 100644 --- a/src/pyscanner.l +++ b/src/pyscanner.l @@ -65,17 +65,17 @@ */ -static ParserInterface *g_thisParser; +static OutlineParserInterface *g_thisParser; static const char * inputString; static int inputPosition; static QFile inputFile; static Protection protection; -static Entry* current_root = 0 ; -static std::unique_ptr<Entry> current; -static Entry* previous = 0 ; -static Entry* bodyEntry = 0 ; +static std::shared_ptr<Entry> current_root; +static std::shared_ptr<Entry> current; +static std::shared_ptr<Entry> previous; +static std::shared_ptr<Entry> bodyEntry; static int yyLineNr = 1 ; static QCString yyFileName; static MethodTypes mtype; @@ -151,7 +151,7 @@ static void initEntry() static void newEntry() { - previous = current.get(); + previous = current; current_root->moveToSubEntryAndRefresh(current); initEntry(); } @@ -292,7 +292,7 @@ static void handleCommentBlock(const QCString &doc,bool brief) QCString processedDoc = preprocessCommentBlock(doc,yyFileName,lineNr); while (parseCommentBlock( g_thisParser, - (docBlockInBody && previous) ? previous : current.get(), + (docBlockInBody && previous) ? previous.get() : current.get(), processedDoc, // text yyFileName, // file lineNr, @@ -913,7 +913,7 @@ STARTDOCSYMS "##" } {B}":"{B} { // function without arguments g_specialBlock = TRUE; // expecting a docstring - bodyEntry = current.get(); + bodyEntry = current; BEGIN(FunctionBody); } @@ -1300,7 +1300,7 @@ STARTDOCSYMS "##" current->program+=yytext; //current->startLine = yyLineNr; g_curIndent=computeIndent(yytext); - bodyEntry = current.get(); + bodyEntry = current; DBG_CTX((stderr,"setting indent %d\n",g_curIndent)); //printf("current->program=[%s]\n",current->program.data()); //g_hideClassDocs = TRUE; @@ -1706,12 +1706,12 @@ STARTDOCSYMS "##" //---------------------------------------------------------------------------- -static void parseCompounds(Entry *rt) +static void parseCompounds(std::shared_ptr<Entry> rt) { //printf("parseCompounds(%s)\n",rt->name.data()); for (int i=0; i<rt->children().size(); ++i) { - Entry *ce = rt->children()[i].get(); + std::shared_ptr<Entry> ce = rt->children()[i]; if (!ce->program.isEmpty()) { //printf("-- %s ---------\n%s\n---------------\n", @@ -1727,14 +1727,14 @@ static void parseCompounds(Entry *rt) } else if (ce->parent()) { - current_root = ce->parent(); + current_root = rt; //printf("Searching for member variables in %s parent=%s\n", // ce->name.data(),ce->parent->name.data()); BEGIN( SearchMemVars ); } yyFileName = ce->fileName; yyLineNr = ce->bodyLine ; - current = std::make_unique<Entry>(); + current = std::make_shared<Entry>(); initEntry(); QCString name = ce->name; @@ -1754,7 +1754,7 @@ static void parseCompounds(Entry *rt) //---------------------------------------------------------------------------- -static void parseMain(const char *fileName,const char *fileBuf,const std::unique_ptr<Entry> &rt) +static void parseMain(const char *fileName,const char *fileBuf,const std::shared_ptr<Entry> &rt) { initParser(); @@ -1765,7 +1765,7 @@ static void parseMain(const char *fileName,const char *fileBuf,const std::unique mtype = Method; gstat = FALSE; virt = Normal; - current_root = rt.get(); + current_root = rt; g_specialBlock = FALSE; @@ -1789,7 +1789,7 @@ static void parseMain(const char *fileName,const char *fileBuf,const std::unique g_moduleScope+=baseName; } - current = std::make_unique<Entry>(); + current = std::make_shared<Entry>(); initEntry(); current->name = g_moduleScope; current->section = Entry::NAMESPACE_SEC; @@ -1798,7 +1798,7 @@ static void parseMain(const char *fileName,const char *fileBuf,const std::unique current->startLine = yyLineNr; current->bodyLine = yyLineNr; - current_root = current.get(); + current_root = current; rt->moveToSubEntryAndRefresh(current); @@ -1886,9 +1886,9 @@ void pyscanFreeScanner() //---------------------------------------------------------------------------- -void PythonLanguageScanner::parseInput(const char *fileName, +void PythonOutlineParser::parseInput(const char *fileName, const char *fileBuf, - const std::unique_ptr<Entry> &root, + const std::shared_ptr<Entry> &root, bool /*sameTranslationUnit*/, QStrList & /*filesInSameTranslationUnit*/) { @@ -1901,50 +1901,17 @@ void PythonLanguageScanner::parseInput(const char *fileName, // printAST(global_root); } -bool PythonLanguageScanner::needsPreprocessing(const QCString &) +bool PythonOutlineParser::needsPreprocessing(const QCString &) const { return FALSE; } -void PythonLanguageScanner::parseCode(CodeOutputInterface &codeOutIntf, - const char *scopeName, - const QCString &input, - SrcLangExt /*lang*/, - bool isExampleBlock, - const char *exampleName, - FileDef *fileDef, - int startLine, - int endLine, - bool inlineFragment, - const MemberDef *memberDef, - bool showLineNumbers, - const Definition *searchCtx, - bool collectXRefs - ) -{ - ::parsePythonCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName, - fileDef,startLine,endLine,inlineFragment,memberDef, - showLineNumbers,searchCtx,collectXRefs); -} - -void PythonLanguageScanner::parsePrototype(const char *text) +void PythonOutlineParser::parsePrototype(const char *text) { ::parsePrototype(text); } -void PythonLanguageScanner::resetCodeParserState() -{ - ::resetPythonCodeParserState(); -} - -//---------------------------------------------------------------------------- - -#if !defined(YY_FLEX_SUBMINOR_VERSION) //---------------------------------------------------------------------------- -extern "C" { // some bogus code to keep the compiler happy - void pyscannerYYdummy() { yy_flex_realloc(0,0); } -} -#endif #include "pyscanner.l.h" diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp index 43ac362..5a8e49d 100644 --- a/src/rtfdocvisitor.cpp +++ b/src/rtfdocvisitor.cpp @@ -305,8 +305,8 @@ void RTFDocVisitor::visit(DocVerbatim *s) m_t << "{" << endl; m_t << "\\par" << endl; m_t << rtf_Style_Reset << getStyle("CodeExample"); - Doxygen::parserManager->getParser(lang) - ->parseCode(m_ci,s->context(),s->text(),langExt, + Doxygen::parserManager->getCodeParser(lang) + .parseCode(m_ci,s->context(),s->text(),langExt, s->isExample(),s->exampleFile()); //m_t << "\\par" << endl; m_t << "}" << endl; @@ -432,8 +432,8 @@ void RTFDocVisitor::visit(DocInclude *inc) m_t << rtf_Style_Reset << getStyle("CodeExample"); QFileInfo cfi( inc->file() ); FileDef *fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() ); - Doxygen::parserManager->getParser(inc->extension()) - ->parseCode(m_ci,inc->context(), + Doxygen::parserManager->getCodeParser(inc->extension()) + .parseCode(m_ci,inc->context(), inc->text(), langExt, inc->isExample(), @@ -454,8 +454,8 @@ void RTFDocVisitor::visit(DocInclude *inc) m_t << "{" << endl; m_t << "\\par" << endl; m_t << rtf_Style_Reset << getStyle("CodeExample"); - Doxygen::parserManager->getParser(inc->extension()) - ->parseCode(m_ci,inc->context(), + Doxygen::parserManager->getCodeParser(inc->extension()) + .parseCode(m_ci,inc->context(), inc->text(),langExt,inc->isExample(), inc->exampleFile(), 0, // fileDef @@ -485,8 +485,8 @@ void RTFDocVisitor::visit(DocInclude *inc) m_t << "{" << endl; if (!m_lastIsPara) m_t << "\\par" << endl; m_t << rtf_Style_Reset << getStyle("CodeExample"); - Doxygen::parserManager->getParser(inc->extension()) - ->parseCode(m_ci, + Doxygen::parserManager->getCodeParser(inc->extension()) + .parseCode(m_ci, inc->context(), extractBlock(inc->text(),inc->blockId()), langExt, @@ -502,8 +502,8 @@ void RTFDocVisitor::visit(DocInclude *inc) m_t << "{" << endl; if (!m_lastIsPara) m_t << "\\par" << endl; m_t << rtf_Style_Reset << getStyle("CodeExample"); - Doxygen::parserManager->getParser(inc->extension()) - ->parseCode(m_ci, + Doxygen::parserManager->getCodeParser(inc->extension()) + .parseCode(m_ci, inc->context(), extractBlock(inc->text(),inc->blockId()), langExt, @@ -560,8 +560,8 @@ void RTFDocVisitor::visit(DocIncOperator *op) fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() ); } - Doxygen::parserManager->getParser(locLangExt) - ->parseCode(m_ci,op->context(),op->text(),langExt, + Doxygen::parserManager->getCodeParser(locLangExt) + .parseCode(m_ci,op->context(),op->text(),langExt, op->isExample(),op->exampleFile(), fd, // fileDef op->line(), // startLine diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp index f32936e..92740f4 100644 --- a/src/rtfgen.cpp +++ b/src/rtfgen.cpp @@ -1952,7 +1952,7 @@ void RTFGenerator::endCodeFragment() { //newParagraph(); //styleStack.pop(); - //printf("RTFGenerator::endCodeFrament() top=%s\n",styleStack.top()); + //printf("RTFGenerator::endCodeFragment() top=%s\n",styleStack.top()); //t << rtf_Style_Reset << styleStack.top() << endl; //endCodeLine checks is there is still an open code line, if so closes it. endCodeLine(); @@ -3052,6 +3052,7 @@ void RTFGenerator::writeLineNumber(const char *,const char *,const char *,int l) QCString lineNumber; lineNumber.sprintf("%05d",l); t << lineNumber << " "; + col=0; } void RTFGenerator::startCodeLine(bool) { diff --git a/src/rtfgen.h b/src/rtfgen.h index b5f06f0..575b9a3 100644 --- a/src/rtfgen.h +++ b/src/rtfgen.h @@ -283,7 +283,7 @@ class RTFGenerator : public OutputGenerator bool m_prettyCode; bool m_bstartedBody; // has startbody been called yet? - int m_listLevel; // // RTF does not really have a addative indent...manually set list level. + int m_listLevel; // // RTF does not really have a additive indent...manually set list level. bool m_omitParagraph; // should a the next paragraph command be ignored? int m_numCols; // number of columns in a table QCString relPath; diff --git a/src/scanner.h b/src/scanner.h index 7103cb0..70df660 100644 --- a/src/scanner.h +++ b/src/scanner.h @@ -26,37 +26,24 @@ * supports C++ and various languages that are closely related to C++, * such as C, C#, Objective-C, Java, PHP, and IDL. */ -class CLanguageScanner : public ParserInterface +class COutlineParser : public OutlineParserInterface { public: - virtual ~CLanguageScanner() {} + COutlineParser(); + virtual ~COutlineParser(); void startTranslationUnit(const char *fileName); void finishTranslationUnit(); void parseInput(const char *fileName, const char *fileBuf, - const std::unique_ptr<Entry> &root, + const std::shared_ptr<Entry> &root, bool sameTranslationUnit, QStrList &filesInSameTranslationUnit); - bool needsPreprocessing(const QCString &extension); - void parseCode(CodeOutputInterface &codeOutIntf, - const char *scopeName, - const QCString &input, - SrcLangExt lang, - bool isExampleBlock, - const char *exampleName=0, - FileDef *fileDef=0, - int startLine=-1, - int endLine=-1, - bool inlineFragment=FALSE, - const MemberDef *memberDef=0, - bool showLineNumbers=TRUE, - const Definition *searchCtx=0, - bool collectXRefs=TRUE - ); - void resetCodeParserState(); + bool needsPreprocessing(const QCString &extension) const; void parsePrototype(const char *text); + private: + struct Private; + std::unique_ptr<Private> p; }; -void scanFreeScanner(); #endif diff --git a/src/scanner.l b/src/scanner.l index 2259085..7115129 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -16,6 +16,8 @@ */ %option never-interactive %option prefix="scannerYY" +%option reentrant +%option extra-type="struct scannerYY_state *" %{ @@ -54,492 +56,170 @@ #define YY_NO_INPUT 1 #define YY_NO_UNISTD_H 1 -/* ----------------------------------------------------------------- - * - * statics - */ -static ParserInterface *g_thisParser; -static const char * inputString; -static int inputPosition; -static QFile inputFile; -static int lastContext; -static int lastCContext; -static int lastDocContext; -static int lastCPPContext; -static int lastSkipSharpContext; -static int lastSkipRoundContext; -static int lastStringContext; -static int lastCurlyContext; -static int lastRoundContext; -static int lastSquareContext; -static int lastInitializerContext; -static int lastClassTemplSpecContext; -static int lastPreLineCtrlContext; -static int lastSkipVerbStringContext; -static int lastCommentInArgContext; -static int lastRawStringContext; -static int lastCSConstraint; -static int lastHereDocContext; -static int lastDefineContext; -static int lastAlignAsContext; -static int lastC11AttributeContext; -static int lastModifierContext; -static Protection protection; -static Protection baseProt; -static int sharpCount = 0 ; -static int roundCount = 0 ; -static int curlyCount = 0 ; -static int squareCount = 0 ; -static int padCount = 0 ; -static std::unique_ptr<Entry> current; -static Entry* current_root = 0 ; -static Entry* global_root = 0 ; -static Entry* previous = 0 ; -static std::unique_ptr<Entry> tempEntry; -static Entry* firstTypedefEntry = 0 ; -static Entry* memspecEntry = 0 ; -static int yyLineNr = 1 ; -static int yyBegLineNr = yyLineNr ; -static int yyColNr = 1 ; -static int yyBegColNr = yyColNr ; -static int anonCount = 0 ; -static int anonNSCount = 0 ; -static QCString yyFileName; -static MethodTypes mtype; -static bool gstat; -static bool removeSlashes; -static Specifier virt; -static Specifier baseVirt; -static QCString msType,msName,msArgs; -static bool isTypedef; -static int tmpDocType; -static QCString sectionLabel; -static QCString sectionTitle; -static QCString funcPtrType; -static QCString templateStr; -static QCString aliasName; -static QCString baseName; -static QCString* specName; -static QCString formulaText; -static bool useOverrideCommands = FALSE; - -static SrcLangExt language; -static bool insideIDL = FALSE; //!< processing IDL code? -static bool insideJava = FALSE; //!< processing Java code? -static bool insideCS = FALSE; //!< processing C# code? -static bool insideD = FALSE; //!< processing D code? -static bool insidePHP = FALSE; //!< processing PHP code? -static bool insideObjC = FALSE; //!< processing Objective C code? -static bool insideCli = FALSE; //!< processing C++/CLI code? -static bool insideJS = FALSE; //!< processing JavaScript code? -static bool insideSlice = FALSE; //!< processing Slice code? -static bool insideCpp = TRUE; //!< processing C/C++ code - -static bool sliceOpt = FALSE; - -static bool insideCppQuote = FALSE; -static bool insideProtocolList = FALSE; - -static int argRoundCount; -static int argSharpCount; -static int currentArgumentContext; -static int lastCopyArgStringContext; -static int lastCopyArgContext; -static QCString *copyArgString; -static QCString fullArgString; -static QCString dummyRawString; - -static ArgumentList *currentArgumentList; -static char lastCopyArgChar; - -static QCString *pCopyQuotedString; -static QCString *pCopyRoundString; -static QCString *pCopyCurlyString; -static QCString *pCopyRawString; - -static QGString *pCopyCurlyGString; -static QGString *pCopyRoundGString; -static QGString *pCopySquareGString; -static QGString *pCopyQuotedGString; -static QGString *pCopyHereDocGString; -static QGString *pCopyRawGString; -static QGString *pSkipVerbString; -static QStack<Grouping> autoGroupStack; - -static bool insideFormula; -static bool insideTryBlock=FALSE; -static bool insideCode; -static bool needsSemi; - -//static int depthIf; -static int initBracketCount; - -static QCString oldStyleArgType; -static QCString docBackup; -static QCString briefBackup; - -static int docBlockContext; -static QGString docBlock; -static QCString docBlockName; -static bool docBlockInBody; -static bool docBlockAutoBrief; -static char docBlockTerm; - -static QCString idlAttr; -static QCString idlProp; -static bool odlProp; - -static bool g_lexInit = FALSE; -static bool externC; - -static QCString g_delimiter; - -static int g_column; - -static int g_fencedSize=0; -static bool g_nestedComment=0; - -static std::vector< std::pair<Entry*,std::unique_ptr<Entry> > > g_outerScopeEntries; - -static const char *stateToString(int state); -//----------------------------------------------------------------------------- - -// forward declarations -//static void handleGroupStartCommand(const char *header); -//static void handleGroupEndCommand(); - -//----------------------------------------------------------------------------- - -static void initParser() -{ - g_outerScopeEntries.clear(); - sectionLabel.resize(0); - sectionTitle.resize(0); - baseName.resize(0); - formulaText.resize(0); - protection = Public; - baseProt = Public; - sharpCount = 0; - roundCount = 0; - curlyCount = 0; - mtype = Method; - gstat = FALSE; - virt = Normal; - baseVirt = Normal; - isTypedef = FALSE; - autoGroupStack.clear(); - insideTryBlock = FALSE; - autoGroupStack.setAutoDelete(TRUE); - insideFormula = FALSE; - insideCode=FALSE; - insideCli=Config_getBool(CPP_CLI_SUPPORT); - sliceOpt=Config_getBool(OPTIMIZE_OUTPUT_SLICE); - previous = 0; - firstTypedefEntry = 0; - memspecEntry =0; -} - -static void initEntry() -{ - if (insideJava) - { - protection = (current_root->spec & (Entry::Interface|Entry::Enum)) ? Public : Package; - } - current->protection = protection ; - current->mtype = mtype; - current->virt = virt; - current->stat = gstat; - current->lang = language; - //printf("*** initEntry() language=%d\n",language); - Doxygen::docGroup.initGroupInfo(current.get()); - isTypedef=FALSE; -} - - -//----------------------------------------------------------------------------- - -static void lineCount() -{ - static int tabSize = Config_getInt(TAB_SIZE); - const char *p; - for (p = yytext ; *p ; ++p ) - { - if (*p=='\n') - { - yyLineNr++,g_column=0,yyColNr=1; - } - else if (*p=='\t') - { - g_column+=tabSize - (g_column%tabSize); - } - else - { - g_column++,yyColNr++; - } - } - //printf("lineCount()=%d\n",g_column); -} - -static inline int computeIndent(const char *s,int startIndent) -{ - int col=startIndent; - static int tabSize=Config_getInt(TAB_SIZE); - const char *p=s; - char c; - while ((c=*p++)) - { - if (c=='\t') col+=tabSize-(col%tabSize); - else if (c=='\n') col=0; - else col++; - } - return col; -} - -static void addType() -{ - uint tl=current->type.length(); - if( tl>0 && !current->name.isEmpty() && current->type.at(tl-1)!='.') - { - current->type += ' ' ; - } - current->type += current->name ; - current->name.resize(0) ; - tl=current->type.length(); - if( tl>0 && !current->args.isEmpty() && current->type.at(tl-1)!='.') - { - current->type += ' ' ; - } - current->type += current->args ; - current->args.resize(0) ; - current->argList.clear(); -} - - -static QCString stripQuotes(const char *s) -{ - QCString name; - if (s==0 || *s==0) return name; - name=s; - if (name.at(0)=='"' && name.at(name.length()-1)=='"') - { - name=name.mid(1,name.length()-2); - } - return name; -} - -//----------------------------------------------------------------- - -static void startCommentBlock(bool); -static void handleCommentBlock(const QCString &doc,bool brief); -static void handleParametersCommentBlocks(ArgumentList &al); - -//----------------------------------------------------------------- - -static bool nameIsOperator(QCString &name) -{ - int i=name.find("operator"); - if (i==-1) return FALSE; - if (i==0 && !isId(name.at(8))) return TRUE; // case operator ::X - if (i>0 && !isId(name.at(i-1)) && !isId(name.at(i+8))) return TRUE; // case X::operator - return FALSE; // case TEXToperatorTEXT -} - -//----------------------------------------------------------------------------- - -static void setContext() -{ - QCString fileName = yyFileName; - language = getLanguageFromFileName(fileName); - insideIDL = language==SrcLangExt_IDL; - insideJava = language==SrcLangExt_Java; - insideCS = language==SrcLangExt_CSharp; - insideD = language==SrcLangExt_D; - insidePHP = language==SrcLangExt_PHP; - insideObjC = language==SrcLangExt_ObjC; - insideJS = language==SrcLangExt_JS; - insideSlice = language==SrcLangExt_Slice; - insideCpp = language==SrcLangExt_Cpp; - if ( insidePHP ) - { - useOverrideCommands = TRUE; - } - //printf("setContext(%s) insideIDL=%d insideJava=%d insideCS=%d " - // "insideD=%d insidePHP=%d insideObjC=%d\n", - // yyFileName.data(),insideIDL,insideJava,insideCS,insideD,insidePHP,insideObjC - // ); -} - -//----------------------------------------------------------------------------- - -static void prependScope() -{ - if (current_root->section & Entry::SCOPE_MASK) - { - //printf("--- prependScope %s to %s\n",current_root->name.data(),current->name.data()); - current->name.prepend(current_root->name+"::"); - //printf("prependScope #=%d #current=%d\n",current_root->tArgLists->count(),current->tArgLists->count()); - for (const ArgumentList &srcAl : current_root->tArgLists) - { - current->tArgLists.insert(current->tArgLists.begin(),srcAl); - } - } -} - -//----------------------------------------------------------------------------- - -/*! Returns TRUE iff the current entry could be a K&R style C function */ -static bool checkForKnRstyleC() -{ - if (((QCString)yyFileName).right(2).lower()!=".c") return FALSE; // must be a C file - if (current->argList.empty()) return FALSE; // must have arguments - for (const Argument &a : current->argList) - { - // in K&R style argument do not have a type, but doxygen expects a type - // so it will think the argument has no name - if (a.type.isEmpty() || !a.name.isEmpty()) return FALSE; - } - return TRUE; -} - -//----------------------------------------------------------------------------- - -static void splitKnRArg(QCString &oldStyleArgPtr,QCString &oldStyleArgName) -{ - int si = current->args.length(); - if (oldStyleArgType.isEmpty()) // new argument - { - static QRegExp re("([^)]*)"); - int bi1 = current->args.findRev(re); - int bi2 = bi1!=-1 ? current->args.findRev(re,bi1-1) : -1; - char c; - if (bi1!=-1 && bi2!=-1) // found something like "int (*func)(int arg)" - { - int s=bi2+1; - oldStyleArgType = current->args.left(s); - int i=s; - while (i<si && ((c=current->args.at(i))=='*' || isspace((uchar)c))) i++; - oldStyleArgType += current->args.mid(s,i-s); - s=i; - while (i<si && isId(current->args.at(i))) i++; - oldStyleArgName = current->args.mid(s,i-s); - oldStyleArgType+=current->args.mid(i); - } - else if (bi1!=-1) // redundant braces like in "int (*var)" - { - int s=bi1; - oldStyleArgType = current->args.left(s); - s++; - int i=s+1; - while (i<si && ((c=current->args.at(i))=='*' || isspace((uchar)c))) i++; - oldStyleArgType += current->args.mid(s,i-s); - s=i; - while (i<si && isId(current->args.at(i))) i++; - oldStyleArgName = current->args.mid(s,i-s); - } - else // normal "int *var" - { - int l=si,i=l-1,j; - char c; - // look for start of name in "type *name" - while (i>=0 && isId(current->args.at(i))) i--; - j=i+1; - // look for start of *'s - while (i>=0 && ((c=current->args.at(i))=='*' || isspace((uchar)c))) i--; - i++; - if (i!=l) - { - oldStyleArgType=current->args.left(i); - oldStyleArgPtr=current->args.mid(i,j-i); - oldStyleArgName=current->args.mid(j).stripWhiteSpace(); - } - else - { - oldStyleArgName=current->args.copy().stripWhiteSpace(); - } - } - } - else // continuation like *arg2 in "int *args,*arg2" - { - int l=si,j=0; - char c; - while (j<l && ((c=current->args.at(j))=='*' || isspace((uchar)c))) j++; - if (j>0) - { - oldStyleArgPtr=current->args.left(j); - oldStyleArgName=current->args.mid(j).stripWhiteSpace(); - } - else - { - oldStyleArgName=current->args.copy().stripWhiteSpace(); - } - } -} - -//----------------------------------------------------------------------------- - -/*! Update the argument \a name with additional \a type info. For K&R style - * function the type is found \e after the argument list, so this routine - * in needed to fix up. - */ -static void addKnRArgInfo(const QCString &type,const QCString &name, - const QCString &brief,const QCString &docs) +struct scannerYY_state { - for (Argument &a : current->argList) - { - if (a.type==name) - { - a.type=type.stripWhiteSpace(); - if (a.type.left(9)=="register ") // strip keyword - { - a.type=a.type.mid(9); - } - a.name=name.stripWhiteSpace(); - if (!brief.isEmpty() && !docs.isEmpty()) - { - a.docs=brief+"\n\n"+docs; - } - else if (!brief.isEmpty()) - { - a.docs=brief; - } - else - { - a.docs=docs; - } - } - } -} + OutlineParserInterface *thisParser; + const char * inputString = 0; + int inputPosition = 0; + int lastContext = 0; + int lastCContext = 0; + int lastDocContext = 0; + int lastCPPContext = 0; + int lastSkipSharpContext = 0; + int lastSkipRoundContext = 0; + int lastStringContext = 0; + int lastCurlyContext = 0; + int lastRoundContext = 0; + int lastSquareContext = 0; + int lastInitializerContext = 0; + int lastClassTemplSpecContext = 0; + int lastPreLineCtrlContext = 0; + int lastSkipVerbStringContext = 0; + int lastCommentInArgContext = 0; + int lastRawStringContext = 0; + int lastCSConstraint = 0; + int lastHereDocContext = 0; + int lastDefineContext = 0; + int lastAlignAsContext = 0; + int lastC11AttributeContext = 0; + int lastModifierContext = 0; + Protection protection = Public; + Protection baseProt = Public; + int sharpCount = 0 ; + int roundCount = 0 ; + int curlyCount = 0 ; + int squareCount = 0 ; + int padCount = 0 ; + std::shared_ptr<Entry> current; + std::shared_ptr<Entry> current_root; + std::shared_ptr<Entry> previous; + std::shared_ptr<Entry> tempEntry; + std::shared_ptr<Entry> firstTypedefEntry; + std::shared_ptr<Entry> memspecEntry; + int yyLineNr = 1 ; + int yyBegLineNr = 1 ; + int yyColNr = 1 ; + int yyBegColNr = 1 ; + int anonCount = 0 ; + int anonNSCount = 0 ; + QCString yyFileName; + MethodTypes mtype = Method; + bool stat = false; + Specifier virt = Normal; + Specifier baseVirt = Normal; + QCString msType; + QCString msName; + QCString msArgs; + bool isTypedef = false; + QCString funcPtrType; + QCString templateStr; + QCString aliasName; + QCString baseName; + QCString* specName = 0; + + SrcLangExt language = SrcLangExt_Unknown; + bool insideIDL = false; //!< processing IDL code? + bool insideJava = false; //!< processing Java code? + bool insideCS = false; //!< processing C# code? + bool insideD = false; //!< processing D code? + bool insidePHP = false; //!< processing PHP code? + bool insideObjC = false; //!< processing Objective C code? + bool insideCli = false; //!< processing C++/CLI code? + bool insideJS = false; //!< processing JavaScript code? + bool insideSlice = false; //!< processing Slice code? + bool insideCpp = true; //!< processing C/C++ code + + bool insideCppQuote = false; + bool insideProtocolList = false; + + int argRoundCount = 0; + int argSharpCount = 0; + int currentArgumentContext = 0; + int lastCopyArgStringContext = 0; + int lastCopyArgContext = 0; + QCString *copyArgString = 0; + QCString fullArgString; + QCString dummyRawString; + + ArgumentList *currentArgumentList = 0; + char lastCopyArgChar = '\0'; + + QCString *pCopyQuotedString = 0; + QCString *pCopyRoundString = 0; + QCString *pCopyCurlyString = 0; + QCString *pCopyRawString = 0; + QGString *pCopyCurlyGString = 0; + QGString *pCopyRoundGString = 0; + QGString *pCopySquareGString = 0; + QGString *pCopyQuotedGString = 0; + QGString *pCopyHereDocGString = 0; + QGString *pCopyRawGString = 0; + QGString *pSkipVerbString = 0; + QStack<Grouping> autoGroupStack; + + bool insideFormula = false; + bool insideTryBlock = false; + bool insideCode = false; + bool needsSemi = false; + + int initBracketCount = 0; + + QCString oldStyleArgType; + QCString docBackup; + QCString briefBackup; + + int docBlockContext = 0; + QGString docBlock; + QCString docBlockName; + bool docBlockInBody = false; + bool docBlockAutoBrief = false; + char docBlockTerm = '\0'; + + QCString idlAttr; + QCString idlProp; + bool odlProp = false; + + bool lexInit = false; + bool externC = false; + + QCString delimiter; + + int column = 0; + + int fencedSize = 0; + bool nestedComment = false; + std::vector< std::pair<Entry*,std::shared_ptr<Entry> > > outerScopeEntries; +}; +static const char *stateToString(int state); //----------------------------------------------------------------------------- +// forward declarations for stateless functions +static inline int computeIndent(const char *s,int startIndent); +static QCString stripQuotes(const char *s); +static bool nameIsOperator(QCString &name); +void fixArgumentListForJavaScript(ArgumentList &al); + +// forward declarations for statefull functions +static void initParser(yyscan_t yyscanner); +static void initEntry(yyscan_t yyscanner); +static void lineCount(yyscan_t yyscanner); +static void addType(yyscan_t yyscanner); +static void setContext(yyscan_t yyscanner); +static void prependScope(yyscan_t yyscanner); +static void startCommentBlock(yyscan_t yyscanner,bool); +static void handleCommentBlock(yyscan_t yyscanner,const QCString &doc,bool brief); +static void handleParametersCommentBlocks(yyscan_t yyscanner,ArgumentList &al); +static bool checkForKnRstyleC(yyscan_t yyscanner); +static void splitKnRArg(yyscan_t yyscanner,QCString &oldStyleArgPtr,QCString &oldStyleArgName); +static void addKnRArgInfo(yyscan_t yyscanner,const QCString &type,const QCString &name, + const QCString &brief,const QCString &docs); +static int yyread(yyscan_t yyscanner,char *buf,int max_size); -void fixArgumentListForJavaScript(ArgumentList &al) -{ - for (Argument &a : al) - { - if (!a.type.isEmpty() && a.name.isEmpty()) - { // a->type is actually the (typeless) parameter name, so move it - a.name=a.type; - a.type.resize(0); - } - } -} /* ----------------------------------------------------------------- */ #undef YY_INPUT -#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); - -static int yyread(char *buf,int max_size) -{ - int c=0; - while( c < max_size && inputString[inputPosition] ) - { - *buf = inputString[inputPosition++] ; - //printf("%d (%c)\n",*buf,*buf); - c++; buf++; - } - return c; -} +#define YY_INPUT(buf,result,max_size) result=yyread(yyscanner,buf,max_size); %} @@ -736,32 +416,32 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) %% <NextSemi>"{" { - curlyCount=0; - needsSemi = TRUE; + yyextra->curlyCount=0; + yyextra->needsSemi = TRUE; BEGIN(SkipCurlyBlock); } <NextSemi>"(" { - roundCount=0; + yyextra->roundCount=0; BEGIN(SkipRoundBlock); } <SkipRoundBlock>"(" { - ++roundCount; + ++yyextra->roundCount; } <SkipRoundBlock>")" { - if (roundCount ) - --roundCount ; + if (yyextra->roundCount ) + --yyextra->roundCount ; else BEGIN( NextSemi ) ; } <SkipCurlyBlock>"{" { - ++curlyCount ; + ++yyextra->curlyCount ; } <SkipCurlyBlock>"}" { - if( curlyCount ) + if( yyextra->curlyCount ) { - --curlyCount ; + --yyextra->curlyCount ; } - else if (needsSemi) + else if (yyextra->needsSemi) { BEGIN( NextSemi ); } @@ -771,15 +451,15 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } } <NextSemi>\' { - if (insidePHP) + if (yyextra->insidePHP) { - lastStringContext=NextSemi; + yyextra->lastStringContext=NextSemi; BEGIN(SkipPHPString); } } -<NextSemi>{CHARLIT} { if (insidePHP) REJECT; } +<NextSemi>{CHARLIT} { if (yyextra->insidePHP) REJECT; } <NextSemi>\" { - lastStringContext=NextSemi; + yyextra->lastStringContext=NextSemi; BEGIN(SkipString); } <NextSemi>[;,] { @@ -791,22 +471,22 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) BEGIN( FindMembers ); } <EnumBaseType>[{;,] { - current->args = current->args.simplifyWhiteSpace(); + yyextra->current->args = yyextra->current->args.simplifyWhiteSpace(); unput(*yytext); BEGIN( ClassVar ); } <FindMembers>"<?php" { // PHP code with unsupported extension? - insidePHP = TRUE; + yyextra->insidePHP = TRUE; } <FindMembersPHP>"<?"("php"?) { // PHP code start BEGIN( FindMembers ); } <FindMembersPHP>"<script"{BN}+"language"{BN}*"="{BN}*['"]?"php"['"]?{BN}*">" { // PHP code start - lineCount() ; + lineCount(yyscanner) ; BEGIN( FindMembers ); } <FindMembers>"?>"|"</script>" { // PHP code end - if (insidePHP) + if (yyextra->insidePHP) BEGIN( FindMembersPHP ); else REJECT; @@ -814,100 +494,100 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) <FindMembersPHP>[^\n<]+ { // Non-PHP code text, ignore } <FindMembersPHP>\n { // Non-PHP code text, ignore - lineCount(); + lineCount(yyscanner); } <FindMembersPHP>. { // Non-PHP code text, ignore } -<FindMembers>{PHPKW} { if (insidePHP) +<FindMembers>{PHPKW} { if (yyextra->insidePHP) BEGIN( NextSemi ); else REJECT; } <FindMembers>"%{"[^\n]* { // Mozilla XPIDL lang-specific block - if (!insideIDL) + if (!yyextra->insideIDL) REJECT; } <FindMembers>"%}" { // Mozilla XPIDL lang-specific block end - if (!insideIDL) + if (!yyextra->insideIDL) REJECT; } <FindMembers>{B}*("properties"){BN}*":"{BN}* { // IDL or Borland C++ builder property - current->mtype = mtype = Property; - current->protection = protection = Public ; - current->type.resize(0); - current->name.resize(0); - current->args.resize(0); - current->argList.clear(); - lineCount() ; + yyextra->current->mtype = yyextra->mtype = Property; + yyextra->current->protection = yyextra->protection = Public ; + yyextra->current->type.resize(0); + yyextra->current->name.resize(0); + yyextra->current->args.resize(0); + yyextra->current->argList.clear(); + lineCount(yyscanner) ; } -<FindMembers>{B}*"k_dcop"{BN}*":"{BN}* { current->mtype = mtype = DCOP; - current->protection = protection = Public ; - current->type.resize(0); - current->name.resize(0); - current->args.resize(0); - current->argList.clear(); - lineCount() ; +<FindMembers>{B}*"k_dcop"{BN}*":"{BN}* { yyextra->current->mtype = yyextra->mtype = DCOP; + yyextra->current->protection = yyextra->protection = Public ; + yyextra->current->type.resize(0); + yyextra->current->name.resize(0); + yyextra->current->args.resize(0); + yyextra->current->argList.clear(); + lineCount(yyscanner) ; } -<FindMembers>{B}*("signals"|"Q_SIGNALS"){BN}*":"{BN}* { current->mtype = mtype = Signal; +<FindMembers>{B}*("signals"|"Q_SIGNALS"){BN}*":"{BN}* { yyextra->current->mtype = yyextra->mtype = Signal; - current->protection = protection = Public ; - current->type.resize(0); - current->name.resize(0); - current->args.resize(0); - current->argList.clear(); - lineCount() ; + yyextra->current->protection = yyextra->protection = Public ; + yyextra->current->type.resize(0); + yyextra->current->name.resize(0); + yyextra->current->args.resize(0); + yyextra->current->argList.clear(); + lineCount(yyscanner) ; } <FindMembers>{B}*"public"{BN}*("slots"|"Q_SLOTS"){BN}*":"{BN}* { - current->protection = protection = Public ; - current->mtype = mtype = Slot; - current->type.resize(0); - current->name.resize(0); - current->args.resize(0); - current->argList.clear(); - lineCount(); + yyextra->current->protection = yyextra->protection = Public ; + yyextra->current->mtype = yyextra->mtype = Slot; + yyextra->current->type.resize(0); + yyextra->current->name.resize(0); + yyextra->current->args.resize(0); + yyextra->current->argList.clear(); + lineCount(yyscanner); } <FindMembers>{B}*"protected"{BN}*("slots"|"Q_SLOTS"){BN}*":"{BN}* { - current->protection = protection = Protected ; - current->mtype = mtype = Slot; - current->type.resize(0); - current->name.resize(0); - current->args.resize(0); - current->argList.clear(); - lineCount(); + yyextra->current->protection = yyextra->protection = Protected ; + yyextra->current->mtype = yyextra->mtype = Slot; + yyextra->current->type.resize(0); + yyextra->current->name.resize(0); + yyextra->current->args.resize(0); + yyextra->current->argList.clear(); + lineCount(yyscanner); } <FindMembers>{B}*"private"{BN}*("slots"|"Q_SLOTS"){BN}*":"{BN}* { - current->protection = protection = Private ; - current->mtype = mtype = Slot; - current->type.resize(0); - current->name.resize(0); - current->args.resize(0); - current->argList.clear(); - lineCount(); + yyextra->current->protection = yyextra->protection = Private ; + yyextra->current->mtype = yyextra->mtype = Slot; + yyextra->current->type.resize(0); + yyextra->current->name.resize(0); + yyextra->current->args.resize(0); + yyextra->current->argList.clear(); + lineCount(yyscanner); } <FindMembers>{B}*("public"|"methods"|"__published"){BN}*":"{BN}* { - current->protection = protection = Public ; - current->mtype = mtype = Method; - current->type.resize(0); - current->name.resize(0); - current->args.resize(0); - current->argList.clear(); - lineCount() ; + yyextra->current->protection = yyextra->protection = Public ; + yyextra->current->mtype = yyextra->mtype = Method; + yyextra->current->type.resize(0); + yyextra->current->name.resize(0); + yyextra->current->args.resize(0); + yyextra->current->argList.clear(); + lineCount(yyscanner) ; } <FindMembers>{B}*"internal"{BN}*":"{BN}* { // for now treat C++/CLI's internal as package... - if (insideCli) + if (yyextra->insideCli) { - current->protection = protection = Package ; - current->mtype = mtype = Method; - current->type.resize(0); - current->name.resize(0); - current->args.resize(0); - current->argList.clear(); - lineCount() ; + yyextra->current->protection = yyextra->protection = Package ; + yyextra->current->mtype = yyextra->mtype = Method; + yyextra->current->type.resize(0); + yyextra->current->name.resize(0); + yyextra->current->args.resize(0); + yyextra->current->argList.clear(); + lineCount(yyscanner) ; } else { @@ -915,38 +595,38 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } } <FindMembers>{B}*"protected"{BN}*":"{BN}* { - current->protection = protection = Protected ; - current->mtype = mtype = Method; - current->type.resize(0); - current->name.resize(0); - current->args.resize(0); - current->argList.clear(); - lineCount() ; + yyextra->current->protection = yyextra->protection = Protected ; + yyextra->current->mtype = yyextra->mtype = Method; + yyextra->current->type.resize(0); + yyextra->current->name.resize(0); + yyextra->current->args.resize(0); + yyextra->current->argList.clear(); + lineCount(yyscanner) ; } <FindMembers>{B}*"private"{BN}*":"{BN}* { - current->protection = protection = Private ; - current->mtype = mtype = Method; - current->type.resize(0); - current->name.resize(0); - current->args.resize(0); - current->argList.clear(); - lineCount() ; + yyextra->current->protection = yyextra->protection = Private ; + yyextra->current->mtype = yyextra->mtype = Method; + yyextra->current->type.resize(0); + yyextra->current->name.resize(0); + yyextra->current->args.resize(0); + yyextra->current->argList.clear(); + lineCount(yyscanner) ; } <FindMembers>{B}*"event"{BN}+ { - if (insideCli) + if (yyextra->insideCli) { // C++/CLI event - lineCount() ; - current->mtype = mtype = Event; - current->bodyLine = yyLineNr; - curlyCount=0; + lineCount(yyscanner) ; + yyextra->current->mtype = yyextra->mtype = Event; + yyextra->current->bodyLine = yyextra->yyLineNr; + yyextra->curlyCount=0; BEGIN( CliPropertyType ); } - else if (insideCS) + else if (yyextra->insideCS) { - lineCount() ; - current->mtype = Event; - current->bodyLine = yyLineNr; + lineCount(yyscanner) ; + yyextra->current->mtype = Event; + yyextra->current->bodyLine = yyextra->yyLineNr; } else { @@ -954,13 +634,13 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } } <FindMembers>{B}*"property"{BN}+ { - if (insideCli) + if (yyextra->insideCli) { // C++/CLI property - lineCount() ; - current->mtype = mtype = Property; - current->bodyLine = yyLineNr; - curlyCount=0; + lineCount(yyscanner) ; + yyextra->current->mtype = yyextra->mtype = Property; + yyextra->current->bodyLine = yyextra->yyLineNr; + yyextra->curlyCount=0; BEGIN( CliPropertyType ); } else @@ -969,16 +649,16 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } } <CliPropertyType>{ID} { - addType(); - current->name = yytext; + addType(yyscanner); + yyextra->current->name = yytext; } <CliPropertyType>"[" { // C++/CLI indexed property - current->args = "["; + yyextra->current->args = "["; BEGIN( CliPropertyIndex ); } <CliPropertyType>"{" { - curlyCount=0; - //printf("event: '%s' '%s'\n",current->type.data(),current->name.data()); + yyextra->curlyCount=0; + //printf("event: '%s' '%s'\n",yyextra->current->type.data(),yyextra->current->name.data()); BEGIN( CSAccessorDecl ); } <CliPropertyType>";" { @@ -986,84 +666,84 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) BEGIN( FindMembers ); } <CliPropertyType>\n { - lineCount(); + lineCount(yyscanner); } <CliPropertyType>{B}* { } <CliPropertyType>. { - addType(); - current->type += yytext; + addType(yyscanner); + yyextra->current->type += yytext; } <CliPropertyIndex>"]" { BEGIN( CliPropertyType ); - current->args+=yytext; + yyextra->current->args+=yytext; } <CliPropertyIndex>. { - current->args+=yytext; + yyextra->current->args+=yytext; } /* <FindMembers>{B}*"property"{BN}+ { - if (!current->type.isEmpty()) + if (!yyextra->current->type.isEmpty()) { REJECT; } else { - current->mtype = mtype = Property; - lineCount(); + yyextra->current->mtype = yyextra->mtype = Property; + lineCount(yyscanner); } } */ <FindMembers>{B}*"@private"{BN}+ { - current->protection = protection = Private ; - current->mtype = mtype = Method; - current->type.resize(0); - current->name.resize(0); - current->args.resize(0); - current->argList.clear(); - lineCount() ; + yyextra->current->protection = yyextra->protection = Private ; + yyextra->current->mtype = yyextra->mtype = Method; + yyextra->current->type.resize(0); + yyextra->current->name.resize(0); + yyextra->current->args.resize(0); + yyextra->current->argList.clear(); + lineCount(yyscanner) ; } <FindMembers>{B}*"@protected"{BN}+ { - current->protection = protection = Protected ; - current->mtype = mtype = Method; - current->type.resize(0); - current->name.resize(0); - current->args.resize(0); - current->argList.clear(); - lineCount() ; + yyextra->current->protection = yyextra->protection = Protected ; + yyextra->current->mtype = yyextra->mtype = Method; + yyextra->current->type.resize(0); + yyextra->current->name.resize(0); + yyextra->current->args.resize(0); + yyextra->current->argList.clear(); + lineCount(yyscanner) ; } <FindMembers>{B}*"@public"{BN}+ { - current->protection = protection = Public ; - current->mtype = mtype = Method; - current->type.resize(0); - current->name.resize(0); - current->args.resize(0); - current->argList.clear(); - lineCount() ; + yyextra->current->protection = yyextra->protection = Public ; + yyextra->current->mtype = yyextra->mtype = Method; + yyextra->current->type.resize(0); + yyextra->current->name.resize(0); + yyextra->current->args.resize(0); + yyextra->current->argList.clear(); + lineCount(yyscanner) ; } <FindMembers>[\-+]{BN}* { - if (!insideObjC) + if (!yyextra->insideObjC) { REJECT; } else { - lineCount(); - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - current->bodyLine = yyLineNr; - current->section = Entry::FUNCTION_SEC; - current->protection = protection = Public ; - language = current->lang = SrcLangExt_ObjC; - insideObjC = TRUE; - current->virt = Virtual; - current->stat=yytext[0]=='+'; - current->mtype = mtype = Method; - current->type.resize(0); - current->name.resize(0); - current->args.resize(0); - current->argList.clear(); + lineCount(yyscanner); + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->bodyLine = yyextra->yyLineNr; + yyextra->current->section = Entry::FUNCTION_SEC; + yyextra->current->protection = yyextra->protection = Public ; + yyextra->language = yyextra->current->lang = SrcLangExt_ObjC; + yyextra->insideObjC = TRUE; + yyextra->current->virt = Virtual; + yyextra->current->stat=yytext[0]=='+'; + yyextra->current->mtype = yyextra->mtype = Method; + yyextra->current->type.resize(0); + yyextra->current->name.resize(0); + yyextra->current->args.resize(0); + yyextra->current->argList.clear(); BEGIN( ObjCMethod ); } } @@ -1071,24 +751,24 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) BEGIN( ObjCReturnType ); } <ObjCMethod>{ID} { // found method name - if (current->type.isEmpty()) + if (yyextra->current->type.isEmpty()) { - current->type = "id"; + yyextra->current->type = "id"; } - current->name = yytext; - if (insideCpp || insideObjC) + yyextra->current->name = yytext; + if (yyextra->insideCpp || yyextra->insideObjC) { - current->id = ClangParser::instance()->lookup(yyLineNr,yytext); + yyextra->current->id = ClangParser::instance()->lookup(yyextra->yyLineNr,yytext); } } <ObjCMethod>":"{B}* { // start of parameter list - current->name += ':'; + yyextra->current->name += ':'; Argument a; - current->argList.push_back(a); + yyextra->current->argList.push_back(a); BEGIN( ObjCParams ); } <ObjCReturnType>[^)]* { // TODO: check if nested braches are possible. - current->type = yytext; + yyextra->current->type = yytext; } <ObjCReturnType>")" { BEGIN( ObjCMethod ); @@ -1098,140 +778,140 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) keyw=keyw.left(keyw.length()-1).stripWhiteSpace(); // strip : if (keyw.isEmpty()) { - current->name += " :"; + yyextra->current->name += " :"; } else { - current->name += keyw+":"; + yyextra->current->name += keyw+":"; } - if (current->argList.back().type.isEmpty()) + if (yyextra->current->argList.back().type.isEmpty()) { - current->argList.back().type="id"; + yyextra->current->argList.back().type="id"; } Argument a; a.attrib=(QCString)"["+keyw+"]"; - current->argList.push_back(a); + yyextra->current->argList.push_back(a); } <ObjCParams>{ID}{BN}* { // name of parameter - lineCount(); - current->argList.back().name=QCString(yytext).stripWhiteSpace(); + lineCount(yyscanner); + yyextra->current->argList.back().name=QCString(yytext).stripWhiteSpace(); } <ObjCParams>","{BN}*"..." { // name of parameter - lineCount(); + lineCount(yyscanner); // do we want the comma as part of the name? - //current->name += ","; + //yyextra->current->name += ","; Argument a; a.attrib="[,]"; a.type="..."; - current->argList.push_back(a); + yyextra->current->argList.push_back(a); } /* <ObjCParams>":" { - current->name += ':'; + yyextra->current->name += ':'; } */ <ObjCParams>"(" { - roundCount=0; - current->argList.back().type.resize(0); + yyextra->roundCount=0; + yyextra->current->argList.back().type.resize(0); BEGIN( ObjCParamType ); } <ObjCParamType>"(" { - roundCount++; - current->argList.back().type+=yytext; + yyextra->roundCount++; + yyextra->current->argList.back().type+=yytext; } <ObjCParamType>")"/{B}* { - if (roundCount<=0) + if (yyextra->roundCount<=0) { BEGIN( ObjCParams ); } else { - current->argList.back().type+=yytext; - roundCount--; + yyextra->current->argList.back().type+=yytext; + yyextra->roundCount--; } } <ObjCParamType>[^()]* { - current->argList.back().type+=QCString(yytext).stripWhiteSpace(); + yyextra->current->argList.back().type+=QCString(yytext).stripWhiteSpace(); } <ObjCMethod,ObjCParams>";" { // end of method declaration - if (!current->argList.empty() && current->argList.back().type.isEmpty()) + if (!yyextra->current->argList.empty() && yyextra->current->argList.back().type.isEmpty()) { - current->argList.back().type="id"; + yyextra->current->argList.back().type="id"; } - if (current->argList.empty()) // method without parameters + if (yyextra->current->argList.empty()) // method without parameters { - current->argList.noParameters = TRUE; + yyextra->current->argList.noParameters = TRUE; } - current->args = argListToString(current->argList); - //printf("argList=%s\n",current->args.data()); + yyextra->current->args = argListToString(yyextra->current->argList); + //printf("argList=%s\n",yyextra->current->args.data()); unput(';'); BEGIN( Function ); } <ObjCMethod,ObjCParams>(";"{BN}+)?"{" { // start of a method body - lineCount(); + lineCount(yyscanner); //printf("Type=%s Name=%s args=%s\n", - // current->type.data(),current->name.data(),argListToString(current->argList).data() + // yyextra->current->type.data(),yyextra->current->name.data(),argListToString(yyextra->current->argList).data() // ); - if (!current->argList.empty() && current->argList.back().type.isEmpty()) + if (!yyextra->current->argList.empty() && yyextra->current->argList.back().type.isEmpty()) { - current->argList.back().type="id"; + yyextra->current->argList.back().type="id"; } - if (current->argList.empty()) // method without parameters + if (yyextra->current->argList.empty()) // method without parameters { - current->argList.noParameters = TRUE; + yyextra->current->argList.noParameters = TRUE; } - current->args = argListToString(current->argList); + yyextra->current->args = argListToString(yyextra->current->argList); unput('{'); BEGIN( Function ); } <FindMembers>{B}*"sequence"{BN}*"<"{BN}* { - if (insideSlice) - { - lineCount(); - current->bodyLine = yyLineNr; - current->fileName = yyFileName ; - current->startLine = yyLineNr ; - current->startColumn = yyColNr; - current->args.resize(0); - current->section = Entry::TYPEDEF_SEC ; - isTypedef = TRUE; + if (yyextra->insideSlice) + { + lineCount(yyscanner); + yyextra->current->bodyLine = yyextra->yyLineNr; + yyextra->current->fileName = yyextra->yyFileName ; + yyextra->current->startLine = yyextra->yyLineNr ; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->args.resize(0); + yyextra->current->section = Entry::TYPEDEF_SEC ; + yyextra->isTypedef = TRUE; BEGIN( SliceSequence ); } else REJECT; } <FindMembers>{B}*"dictionary"{BN}*"<"{BN}* { - if (insideSlice) - { - lineCount(); - current->bodyLine = yyLineNr; - current->fileName = yyFileName ; - current->startLine = yyLineNr ; - current->startColumn = yyColNr; - current->args.resize(0); - current->section = Entry::TYPEDEF_SEC ; - isTypedef = TRUE; + if (yyextra->insideSlice) + { + lineCount(yyscanner); + yyextra->current->bodyLine = yyextra->yyLineNr; + yyextra->current->fileName = yyextra->yyFileName ; + yyextra->current->startLine = yyextra->yyLineNr ; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->args.resize(0); + yyextra->current->section = Entry::TYPEDEF_SEC ; + yyextra->isTypedef = TRUE; BEGIN( SliceDictionary ); } else REJECT; } <FindMembers>{BN}{1,80} { - lineCount(); + lineCount(yyscanner); } <FindMembers>"@"({ID}".")*{ID}{BN}*"(" { - if (insideJava) // Java annotation + if (yyextra->insideJava) // Java annotation { - lineCount(); - lastSkipRoundContext = YY_START; - roundCount=0; + lineCount(yyscanner); + yyextra->lastSkipRoundContext = YY_START; + yyextra->roundCount=0; BEGIN( SkipRound ); } else if (qstrncmp(yytext,"@property",9)==0) // ObjC 2.0 property { - current->mtype = mtype = Property; - current->spec|=Entry::Readable | Entry::Writable | Entry::Assign; - current->protection = Public ; + yyextra->current->mtype = yyextra->mtype = Property; + yyextra->current->spec|=Entry::Readable | Entry::Writable | Entry::Assign; + yyextra->current->protection = Public ; unput('('); BEGIN( ObjCPropAttr ); } @@ -1241,54 +921,54 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } } <ObjCPropAttr>"getter="{ID} { - current->read = yytext+7; + yyextra->current->read = yytext+7; } <ObjCPropAttr>"setter="{ID} { - current->write = yytext+7; + yyextra->current->write = yytext+7; } <ObjCPropAttr>"readonly" { - current->spec&=~Entry::Writable; + yyextra->current->spec&=~Entry::Writable; } <ObjCPropAttr>"readwrite" { // default } <ObjCPropAttr>"assign" { // default } <ObjCPropAttr>"unsafe_unretained" { - current->spec&=~Entry::Assign; - current->spec|=Entry::Unretained; + yyextra->current->spec&=~Entry::Assign; + yyextra->current->spec|=Entry::Unretained; } <ObjCPropAttr>"retain" { - current->spec&=~Entry::Assign; - current->spec|=Entry::Retain; + yyextra->current->spec&=~Entry::Assign; + yyextra->current->spec|=Entry::Retain; } <ObjCPropAttr>"copy" { - current->spec&=~Entry::Assign; - current->spec|=Entry::Copy; + yyextra->current->spec&=~Entry::Assign; + yyextra->current->spec|=Entry::Copy; } <ObjCPropAttr>"weak" { - current->spec&=~Entry::Assign; - current->spec|=Entry::Weak; + yyextra->current->spec&=~Entry::Assign; + yyextra->current->spec|=Entry::Weak; } <ObjCPropAttr>"strong" { - current->spec&=~Entry::Assign; - current->spec|=Entry::Strong; + yyextra->current->spec&=~Entry::Assign; + yyextra->current->spec|=Entry::Strong; } <ObjCPropAttr>"nonatomic" { - current->spec|=Entry::NonAtomic; + yyextra->current->spec|=Entry::NonAtomic; } <ObjCPropAttr>")" { BEGIN(FindMembers); } <FindMembers>"@"{ID} { - if (insideJava) // Java annotation + if (yyextra->insideJava) // Java annotation { // skip annotation } else if (qstrcmp(yytext,"@property")==0) // ObjC 2.0 property { - current->mtype = mtype = Property; - current->spec|=Entry::Writable | Entry::Readable; - current->protection = Public ; + yyextra->current->mtype = yyextra->mtype = Property; + yyextra->current->spec|=Entry::Writable | Entry::Readable; + yyextra->current->protection = Public ; } else if (qstrcmp(yytext,"@synthesize")==0) { @@ -1307,58 +987,58 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) BEGIN(FindMembers); } <PackageName>{ID}(("."|"\\"){ID})* { - isTypedef=FALSE; - //printf("Found namespace %s lang=%d\n",yytext,current->lang); - current->name = yytext; - current->name = substitute(current->name,".","::"); - current->name = substitute(current->name,"\\","::"); - current->section = Entry::NAMESPACE_SEC; - current->type = "namespace" ; - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - current->bodyLine = yyLineNr; - lineCount(); + yyextra->isTypedef=FALSE; + //printf("Found namespace %s lang=%d\n",yytext,yyextra->current->lang); + yyextra->current->name = yytext; + yyextra->current->name = substitute(yyextra->current->name,".","::"); + yyextra->current->name = substitute(yyextra->current->name,"\\","::"); + yyextra->current->section = Entry::NAMESPACE_SEC; + yyextra->current->type = "namespace" ; + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->bodyLine = yyextra->yyLineNr; + lineCount(yyscanner); } <PackageName>";" { - Entry *tmp = current.get(); - current_root->moveToSubEntryAndRefresh(current); - current_root = tmp; - initEntry(); + std::shared_ptr<Entry> tmp = yyextra->current; + yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current); + yyextra->current_root = tmp; + initEntry(yyscanner); BEGIN(FindMembers); } <PackageName>"{" { - curlyCount=0; + yyextra->curlyCount=0; BEGIN( ReadNSBody ); } <FindMembers>{B}*"initonly"{BN}+ { - current->type += " initonly "; - if (insideCli) current->spec |= Entry::Initonly; - lineCount(); + yyextra->current->type += " initonly "; + if (yyextra->insideCli) yyextra->current->spec |= Entry::Initonly; + lineCount(yyscanner); } -<FindMembers>{B}*"static"{BN}+ { current->type += " static "; - current->stat = TRUE; - lineCount(); +<FindMembers>{B}*"static"{BN}+ { yyextra->current->type += " static "; + yyextra->current->stat = TRUE; + lineCount(yyscanner); } <FindMembers>{B}*"extern"{BN}+ { - current->stat = FALSE; - current->explicitExternal = TRUE; - lineCount(); + yyextra->current->stat = FALSE; + yyextra->current->explicitExternal = TRUE; + lineCount(yyscanner); } -<FindMembers>{B}*"const"{BN}+ { current->type += " const "; - if (insideCS) current->stat = TRUE; - lineCount(); +<FindMembers>{B}*"const"{BN}+ { yyextra->current->type += " const "; + if (yyextra->insideCS) yyextra->current->stat = TRUE; + lineCount(yyscanner); } -<FindMembers>{B}*"virtual"{BN}+ { current->type += " virtual "; - current->virt = Virtual; - lineCount(); +<FindMembers>{B}*"virtual"{BN}+ { yyextra->current->type += " virtual "; + yyextra->current->virt = Virtual; + lineCount(yyscanner); } <FindMembers>{B}*"constexpr"{BN}+ { - if (insideCpp) + if (yyextra->insideCpp) { - current->type += " constexpr "; - current->spec |= Entry::ConstExpr; - lineCount(); + yyextra->current->type += " constexpr "; + yyextra->current->spec |= Entry::ConstExpr; + lineCount(yyscanner); } else { @@ -1366,10 +1046,10 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } } <FindMembers>{B}*"published"{BN}+ { // UNO IDL published keyword - if (insideIDL) + if (yyextra->insideIDL) { - lineCount(); - current->spec |= Entry::Published; + lineCount(yyscanner); + yyextra->current->spec |= Entry::Published; } else { @@ -1377,60 +1057,60 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } } <FindMembers>{B}*"abstract"{BN}+ { - if (!insidePHP) + if (!yyextra->insidePHP) { - current->type += " abstract "; - if (!insideJava) + yyextra->current->type += " abstract "; + if (!yyextra->insideJava) { - current->virt = Pure; + yyextra->current->virt = Pure; } else { - current->spec|=Entry::Abstract; + yyextra->current->spec|=Entry::Abstract; } } else { - current->spec|=Entry::Abstract; + yyextra->current->spec|=Entry::Abstract; } - lineCount(); + lineCount(yyscanner); } -<FindMembers>{B}*"inline"{BN}+ { current->spec|=Entry::Inline; - lineCount(); +<FindMembers>{B}*"inline"{BN}+ { yyextra->current->spec|=Entry::Inline; + lineCount(yyscanner); } -<FindMembers>{B}*"mutable"{BN}+ { current->spec|=Entry::Mutable; - lineCount(); +<FindMembers>{B}*"mutable"{BN}+ { yyextra->current->spec|=Entry::Mutable; + lineCount(yyscanner); } -<FindMembers>{B}*"explicit"{BN}+ { current->spec|=Entry::Explicit; - lineCount(); +<FindMembers>{B}*"explicit"{BN}+ { yyextra->current->spec|=Entry::Explicit; + lineCount(yyscanner); } -<FindMembers>{B}*"local"{BN}+ { current->spec|=Entry::Local; - lineCount(); +<FindMembers>{B}*"local"{BN}+ { yyextra->current->spec|=Entry::Local; + lineCount(yyscanner); } <FindMembers>{B}*"@required"{BN}+ { // Objective C 2.0 protocol required section - current->spec=(current->spec & ~Entry::Optional) | Entry::Required; - lineCount(); + yyextra->current->spec=(yyextra->current->spec & ~Entry::Optional) | Entry::Required; + lineCount(yyscanner); } <FindMembers>{B}*"@optional"{BN}+ { // Objective C 2.0 protocol optional section - current->spec=(current->spec & ~Entry::Required) | Entry::Optional; - lineCount(); + yyextra->current->spec=(yyextra->current->spec & ~Entry::Required) | Entry::Optional; + lineCount(yyscanner); } /* <FindMembers>{B}*"import"{BN}+ { // IDL import keyword BEGIN( NextSemi ); } */ -<FindMembers>{B}*"typename"{BN}+ { lineCount(); } +<FindMembers>{B}*"typename"{BN}+ { lineCount(yyscanner); } <FindMembers>{B}*"namespace"{BN}*/[^a-z_A-Z0-9] { - isTypedef=FALSE; - current->section = Entry::NAMESPACE_SEC; - current->type = "namespace" ; - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - current->bodyLine = yyLineNr; - lineCount(); - if (insidePHP) + yyextra->isTypedef=FALSE; + yyextra->current->section = Entry::NAMESPACE_SEC; + yyextra->current->type = "namespace" ; + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->bodyLine = yyextra->yyLineNr; + lineCount(yyscanner); + if (yyextra->insidePHP) { BEGIN( PackageName ); } @@ -1440,449 +1120,449 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } } <FindMembers>{B}*"module"{BN}+ { - lineCount(); - if (insideIDL || insideSlice) - { - isTypedef=FALSE; - current->section = Entry::NAMESPACE_SEC; - current->type = "module" ; - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - current->bodyLine = yyLineNr; + lineCount(yyscanner); + if (yyextra->insideIDL || yyextra->insideSlice) + { + yyextra->isTypedef=FALSE; + yyextra->current->section = Entry::NAMESPACE_SEC; + yyextra->current->type = "module" ; + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->bodyLine = yyextra->yyLineNr; BEGIN( CompoundName ); } - else if (insideD) + else if (yyextra->insideD) { - lineCount(); + lineCount(yyscanner); BEGIN(PackageName); } else { - addType(); - current->name = QCString(yytext).stripWhiteSpace(); + addType(yyscanner); + yyextra->current->name = QCString(yytext).stripWhiteSpace(); } } <FindMembers>{B}*"library"{BN}+ { - lineCount(); - if (insideIDL) - { - isTypedef=FALSE; - current->section = Entry::NAMESPACE_SEC; - current->type = "library" ; - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - current->bodyLine = yyLineNr; + lineCount(yyscanner); + if (yyextra->insideIDL) + { + yyextra->isTypedef=FALSE; + yyextra->current->section = Entry::NAMESPACE_SEC; + yyextra->current->type = "library" ; + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->bodyLine = yyextra->yyLineNr; BEGIN( CompoundName ); } else { - addType(); - current->name = QCString(yytext).stripWhiteSpace(); + addType(yyscanner); + yyextra->current->name = QCString(yytext).stripWhiteSpace(); } } <FindMembers>{B}*"constants"{BN}+ { // UNO IDL constant group - lineCount(); - if (insideIDL) - { - isTypedef=FALSE; - current->section = Entry::NAMESPACE_SEC; - current->type = "constants"; - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - current->bodyLine = yyLineNr; + lineCount(yyscanner); + if (yyextra->insideIDL) + { + yyextra->isTypedef=FALSE; + yyextra->current->section = Entry::NAMESPACE_SEC; + yyextra->current->type = "constants"; + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->bodyLine = yyextra->yyLineNr; BEGIN( CompoundName ); } else { - addType(); - current->name = QCString(yytext).stripWhiteSpace(); + addType(yyscanner); + yyextra->current->name = QCString(yytext).stripWhiteSpace(); } } <FindMembers>{BN}*("service"){BN}+ { // UNO IDL service - lineCount(); - if (insideIDL) + lineCount(yyscanner); + if (yyextra->insideIDL) { - isTypedef=FALSE; - current->section = Entry::CLASS_SEC; - current->spec = Entry::Service | + yyextra->isTypedef=FALSE; + yyextra->current->section = Entry::CLASS_SEC; + yyextra->current->spec = Entry::Service | // preserve UNO IDL [optional] or published - (current->spec & (Entry::Optional|Entry::Published)); - addType(); - current->type += " service " ; - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->bodyLine = yyLineNr; + (yyextra->current->spec & (Entry::Optional|Entry::Published)); + addType(yyscanner); + yyextra->current->type += " service " ; + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->bodyLine = yyextra->yyLineNr; BEGIN( CompoundName ); } else // TODO is addType right? just copy/pasted { - addType(); - current->name = QCString(yytext).stripWhiteSpace(); + addType(yyscanner); + yyextra->current->name = QCString(yytext).stripWhiteSpace(); } } <FindMembers>{BN}*("singleton"){BN}+ { // UNO IDL singleton - lineCount(); - if (insideIDL) - { - isTypedef=FALSE; - current->section = Entry::CLASS_SEC; - current->spec = Entry::Singleton | - (current->spec & Entry::Published); // preserve - addType(); - current->type += " singleton " ; - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->bodyLine = yyLineNr; + lineCount(yyscanner); + if (yyextra->insideIDL) + { + yyextra->isTypedef=FALSE; + yyextra->current->section = Entry::CLASS_SEC; + yyextra->current->spec = Entry::Singleton | + (yyextra->current->spec & Entry::Published); // preserve + addType(yyscanner); + yyextra->current->type += " singleton " ; + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->bodyLine = yyextra->yyLineNr; BEGIN( CompoundName ); } else // TODO is addType right? just copy/pasted { - addType(); - current->name = QCString(yytext).stripWhiteSpace(); + addType(yyscanner); + yyextra->current->name = QCString(yytext).stripWhiteSpace(); } } <FindMembers>{BN}*((("disp")?"interface")|"valuetype"){BN}+ { // M$/Corba/UNO IDL/Java/Slice interface - lineCount(); - if (insideIDL || insideJava || insideCS || insideD || insidePHP || insideSlice) + lineCount(yyscanner); + if (yyextra->insideIDL || yyextra->insideJava || yyextra->insideCS || yyextra->insideD || yyextra->insidePHP || yyextra->insideSlice) { - isTypedef=FALSE; - current->section = Entry::CLASS_SEC; - current->spec = Entry::Interface | + yyextra->isTypedef=FALSE; + yyextra->current->section = Entry::CLASS_SEC; + yyextra->current->spec = Entry::Interface | // preserve UNO IDL [optional], published, Slice local - (current->spec & (Entry::Optional|Entry::Published|Entry::Local)); - addType(); - current->type += " interface" ; - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - current->bodyLine = yyLineNr; + (yyextra->current->spec & (Entry::Optional|Entry::Published|Entry::Local)); + addType(yyscanner); + yyextra->current->type += " interface" ; + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->bodyLine = yyextra->yyLineNr; BEGIN( CompoundName ); } else { - addType(); - current->name = QCString(yytext).stripWhiteSpace(); + addType(yyscanner); + yyextra->current->name = QCString(yytext).stripWhiteSpace(); } } <FindMembers>{B}*"@implementation"{BN}+ { // Objective-C class implementation - lineCount(); - isTypedef=FALSE; - current->section = Entry::OBJCIMPL_SEC; - language = current->lang = SrcLangExt_ObjC; - insideObjC = TRUE; - current->protection = protection = Public ; - addType(); - current->type += " implementation" ; - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->bodyLine = yyLineNr; + lineCount(yyscanner); + yyextra->isTypedef=FALSE; + yyextra->current->section = Entry::OBJCIMPL_SEC; + yyextra->language = yyextra->current->lang = SrcLangExt_ObjC; + yyextra->insideObjC = TRUE; + yyextra->current->protection = yyextra->protection = Public ; + addType(yyscanner); + yyextra->current->type += " implementation" ; + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->bodyLine = yyextra->yyLineNr; BEGIN( CompoundName ); } <FindMembers>{B}*"@interface"{BN}+ { // Objective-C class interface, or Java attribute - lineCount(); - isTypedef=FALSE; - current->section = Entry::CLASS_SEC; - current->spec = Entry::Interface; - if (!insideJava) - { - language = current->lang = SrcLangExt_ObjC; - insideObjC = TRUE; - } - current->protection = protection = Public ; - addType(); - current->type += " interface" ; - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - current->bodyLine = yyLineNr; + lineCount(yyscanner); + yyextra->isTypedef=FALSE; + yyextra->current->section = Entry::CLASS_SEC; + yyextra->current->spec = Entry::Interface; + if (!yyextra->insideJava) + { + yyextra->language = yyextra->current->lang = SrcLangExt_ObjC; + yyextra->insideObjC = TRUE; + } + yyextra->current->protection = yyextra->protection = Public ; + addType(yyscanner); + yyextra->current->type += " interface" ; + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->bodyLine = yyextra->yyLineNr; BEGIN( CompoundName ); } <FindMembers>{B}*"@protocol"{BN}+ { // Objective-C protocol definition - lineCount(); - isTypedef=FALSE; - current->section = Entry::CLASS_SEC; - current->spec = Entry::Protocol; - language = current->lang = SrcLangExt_ObjC; - insideObjC = TRUE; - current->protection = protection = Public ; - addType(); - current->type += " protocol" ; - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - current->bodyLine = yyLineNr; + lineCount(yyscanner); + yyextra->isTypedef=FALSE; + yyextra->current->section = Entry::CLASS_SEC; + yyextra->current->spec = Entry::Protocol; + yyextra->language = yyextra->current->lang = SrcLangExt_ObjC; + yyextra->insideObjC = TRUE; + yyextra->current->protection = yyextra->protection = Public ; + addType(yyscanner); + yyextra->current->type += " protocol" ; + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->bodyLine = yyextra->yyLineNr; BEGIN( CompoundName ); } <FindMembers>{B}*"exception"{BN}+ { // Corba IDL/Slice exception - isTypedef=FALSE; - current->section = Entry::CLASS_SEC; + yyextra->isTypedef=FALSE; + yyextra->current->section = Entry::CLASS_SEC; // preserve UNO IDL, Slice local - current->spec = Entry::Exception | - (current->spec & Entry::Published) | - (current->spec & Entry::Local); - addType(); - current->type += " exception" ; - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - current->bodyLine = yyLineNr; - lineCount(); + yyextra->current->spec = Entry::Exception | + (yyextra->current->spec & Entry::Published) | + (yyextra->current->spec & Entry::Local); + addType(yyscanner); + yyextra->current->type += " exception" ; + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->bodyLine = yyextra->yyLineNr; + lineCount(yyscanner); BEGIN( CompoundName ); } <FindMembers>"@class" | // for Objective C class declarations <FindMembers>{B}*{TYPEDEFPREFIX}"class{" | <FindMembers>{B}*{TYPEDEFPREFIX}"class"{BN}+ { QCString decl = yytext; - isTypedef=decl.find("typedef")!=-1; + yyextra->isTypedef=decl.find("typedef")!=-1; bool isConst=decl.find("const")!=-1; bool isVolatile=decl.find("volatile")!=-1; - current->section = Entry::CLASS_SEC; - addType(); - uint64 spec = current->spec; - if (insidePHP && current->spec&Entry::Abstract) + yyextra->current->section = Entry::CLASS_SEC; + addType(yyscanner); + uint64 spec = yyextra->current->spec; + if (yyextra->insidePHP && yyextra->current->spec&Entry::Abstract) { // convert Abstract to AbstractClass - current->spec=(current->spec&~Entry::Abstract)|Entry::AbstractClass; + yyextra->current->spec=(yyextra->current->spec&~Entry::Abstract)|Entry::AbstractClass; } - if (insideSlice && spec&Entry::Local) + if (yyextra->insideSlice && spec&Entry::Local) { - current->spec|=Entry::Local; + yyextra->current->spec|=Entry::Local; } if (isConst) { - current->type += " const"; + yyextra->current->type += " const"; } else if (isVolatile) { - current->type += " volatile"; + yyextra->current->type += " volatile"; } - current->type += " class" ; - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - current->bodyLine = yyLineNr; + yyextra->current->type += " class" ; + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->bodyLine = yyextra->yyLineNr; if (yytext[0]=='@') { - language = current->lang = SrcLangExt_ObjC; - insideObjC = TRUE; + yyextra->language = yyextra->current->lang = SrcLangExt_ObjC; + yyextra->insideObjC = TRUE; } - lineCount() ; + lineCount(yyscanner) ; if (yytext[yyleng-1]=='{') unput('{'); BEGIN( CompoundName ) ; } <FindMembers>{B}*"value class{" | // C++/CLI extension <FindMembers>{B}*"value class"{BN}+ { - isTypedef=FALSE; - current->section = Entry::CLASS_SEC; - current->spec = Entry::Value; - addType(); - current->type += " value class" ; - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - current->bodyLine = yyLineNr; - lineCount() ; + yyextra->isTypedef=FALSE; + yyextra->current->section = Entry::CLASS_SEC; + yyextra->current->spec = Entry::Value; + addType(yyscanner); + yyextra->current->type += " value class" ; + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->bodyLine = yyextra->yyLineNr; + lineCount(yyscanner) ; if (yytext[yyleng-1]=='{') unput('{'); BEGIN( CompoundName ) ; } <FindMembers>{B}*"ref class{" | // C++/CLI extension <FindMembers>{B}*"ref class"{BN}+ { - isTypedef=FALSE; - current->section = Entry::CLASS_SEC; - current->spec = Entry::Ref; - addType(); - current->type += " ref class" ; - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - current->bodyLine = yyLineNr; - lineCount() ; + yyextra->isTypedef=FALSE; + yyextra->current->section = Entry::CLASS_SEC; + yyextra->current->spec = Entry::Ref; + addType(yyscanner); + yyextra->current->type += " ref class" ; + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->bodyLine = yyextra->yyLineNr; + lineCount(yyscanner) ; if (yytext[yyleng-1]=='{') unput('{'); BEGIN( CompoundName ) ; } <FindMembers>{B}*"interface class{" | // C++/CLI extension <FindMembers>{B}*"interface class"{BN}+ { - isTypedef=FALSE; - current->section = Entry::CLASS_SEC; - current->spec = Entry::Interface; - addType(); - current->type += " interface class" ; - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - current->bodyLine = yyLineNr; - lineCount() ; + yyextra->isTypedef=FALSE; + yyextra->current->section = Entry::CLASS_SEC; + yyextra->current->spec = Entry::Interface; + addType(yyscanner); + yyextra->current->type += " interface class" ; + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->bodyLine = yyextra->yyLineNr; + lineCount(yyscanner) ; if (yytext[yyleng-1]=='{') unput('{'); BEGIN( CompoundName ) ; } <FindMembers>{B}*"coclass"{BN}+ { - if (insideIDL) - { - isTypedef=FALSE; - current->section = Entry::CLASS_SEC; - addType(); - current->type += " coclass" ; - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - current->bodyLine = yyLineNr; - lineCount() ; + if (yyextra->insideIDL) + { + yyextra->isTypedef=FALSE; + yyextra->current->section = Entry::CLASS_SEC; + addType(yyscanner); + yyextra->current->type += " coclass" ; + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->bodyLine = yyextra->yyLineNr; + lineCount(yyscanner) ; BEGIN( CompoundName ) ; } else { - addType(); - current->name = yytext; - current->name = current->name.stripWhiteSpace(); - lineCount(); + addType(yyscanner); + yyextra->current->name = yytext; + yyextra->current->name = yyextra->current->name.stripWhiteSpace(); + lineCount(yyscanner); } } <FindMembers>{B}*{TYPEDEFPREFIX}"struct{" | <FindMembers>{B}*{TYPEDEFPREFIX}"struct"/{BN}+ { QCString decl = yytext; - isTypedef=decl.find("typedef")!=-1; + yyextra->isTypedef=decl.find("typedef")!=-1; bool isConst=decl.find("const")!=-1; bool isVolatile=decl.find("volatile")!=-1; - uint64 spec = current->spec; - current->section = Entry::CLASS_SEC ; + uint64 spec = yyextra->current->spec; + yyextra->current->section = Entry::CLASS_SEC ; // preserve UNO IDL & Inline attributes, Slice local - current->spec = Entry::Struct | - (current->spec & Entry::Published) | - (current->spec & Entry::Inline) | - (current->spec & Entry::Local); - // bug 582676: can be a struct nested in an interface so keep insideObjC state - //current->objc = insideObjC = FALSE; - addType(); + yyextra->current->spec = Entry::Struct | + (yyextra->current->spec & Entry::Published) | + (yyextra->current->spec & Entry::Inline) | + (yyextra->current->spec & Entry::Local); + // bug 582676: can be a struct nested in an interface so keep yyextra->insideObjC state + //yyextra->current->objc = yyextra->insideObjC = FALSE; + addType(yyscanner); if (isConst) { - current->type += " const"; + yyextra->current->type += " const"; } else if (isVolatile) { - current->type += " volatile"; + yyextra->current->type += " volatile"; } - current->type += " struct" ; - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - current->bodyLine = yyLineNr; - lineCount() ; + yyextra->current->type += " struct" ; + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->bodyLine = yyextra->yyLineNr; + lineCount(yyscanner) ; if (yytext[yyleng-1]=='{') unput('{'); BEGIN( CompoundName ) ; } <FindMembers>{B}*"value struct{" | // C++/CLI extension <FindMembers>{B}*"value struct"{BN}+ { - isTypedef=FALSE; - current->section = Entry::CLASS_SEC; - current->spec = Entry::Struct | Entry::Value; - addType(); - current->type += " value struct" ; - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - current->bodyLine = yyLineNr; - lineCount() ; + yyextra->isTypedef=FALSE; + yyextra->current->section = Entry::CLASS_SEC; + yyextra->current->spec = Entry::Struct | Entry::Value; + addType(yyscanner); + yyextra->current->type += " value struct" ; + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->bodyLine = yyextra->yyLineNr; + lineCount(yyscanner) ; if (yytext[yyleng-1]=='{') unput('{'); BEGIN( CompoundName ) ; } <FindMembers>{B}*"ref struct{" | // C++/CLI extension <FindMembers>{B}*"ref struct"{BN}+ { - isTypedef=FALSE; - current->section = Entry::CLASS_SEC; - current->spec = Entry::Struct | Entry::Ref; - addType(); - current->type += " ref struct" ; - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - current->bodyLine = yyLineNr; - lineCount() ; + yyextra->isTypedef=FALSE; + yyextra->current->section = Entry::CLASS_SEC; + yyextra->current->spec = Entry::Struct | Entry::Ref; + addType(yyscanner); + yyextra->current->type += " ref struct" ; + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->bodyLine = yyextra->yyLineNr; + lineCount(yyscanner) ; if (yytext[yyleng-1]=='{') unput('{'); BEGIN( CompoundName ) ; } <FindMembers>{B}*"interface struct{" | // C++/CLI extension <FindMembers>{B}*"interface struct"{BN}+ { - isTypedef=FALSE; - current->section = Entry::CLASS_SEC; - current->spec = Entry::Struct | Entry::Interface; - addType(); - current->type += " interface struct"; - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - current->bodyLine = yyLineNr; - lineCount() ; + yyextra->isTypedef=FALSE; + yyextra->current->section = Entry::CLASS_SEC; + yyextra->current->spec = Entry::Struct | Entry::Interface; + addType(yyscanner); + yyextra->current->type += " interface struct"; + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->bodyLine = yyextra->yyLineNr; + lineCount(yyscanner) ; if (yytext[yyleng-1]=='{') unput('{'); BEGIN( CompoundName ) ; } <FindMembers>{B}*{TYPEDEFPREFIX}"union{" | <FindMembers>{B}*{TYPEDEFPREFIX}"union"{BN}+ { QCString decl=yytext; - isTypedef=decl.find("typedef")!=-1; + yyextra->isTypedef=decl.find("typedef")!=-1; bool isConst=decl.find("const")!=-1; bool isVolatile=decl.find("volatile")!=-1; - current->section = Entry::CLASS_SEC; - current->spec = Entry::Union; - // bug 582676: can be a struct nested in an interface so keep insideObjC state - //current->objc = insideObjC = FALSE; - addType(); + yyextra->current->section = Entry::CLASS_SEC; + yyextra->current->spec = Entry::Union; + // bug 582676: can be a struct nested in an interface so keep yyextra->insideObjC state + //yyextra->current->objc = yyextra->insideObjC = FALSE; + addType(yyscanner); if (isConst) { - current->type += " const"; + yyextra->current->type += " const"; } else if (isVolatile) { - current->type += " volatile"; + yyextra->current->type += " volatile"; } - current->type += " union" ; - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - current->bodyLine = yyLineNr; - lineCount() ; + yyextra->current->type += " union" ; + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->bodyLine = yyextra->yyLineNr; + lineCount(yyscanner) ; if (yytext[yyleng-1]=='{') unput('{'); BEGIN( CompoundName ) ; } <FindMembers>{B}*{TYPEDEFPREFIX}{IDLATTR}?"enum"({BN}+("class"|"struct"))?"{" | <FindMembers>{B}*{TYPEDEFPREFIX}{IDLATTR}?"enum"({BN}+("class"|"struct"))?{BN}+ { // for IDL: typedef [something] enum QCString text=yytext; - isTypedef = text.find("typedef")!=-1; - bool isStrongEnum = text.find("struct")!=-1 || text.find("class")!=-1 || insideCS; - if (insideJava) + yyextra->isTypedef = text.find("typedef")!=-1; + bool isStrongEnum = text.find("struct")!=-1 || text.find("class")!=-1 || yyextra->insideCS; + if (yyextra->insideJava) { - current->section = Entry::CLASS_SEC; - current->spec = Entry::Enum; + yyextra->current->section = Entry::CLASS_SEC; + yyextra->current->spec = Entry::Enum; } else { - current->section = Entry::ENUM_SEC ; + yyextra->current->section = Entry::ENUM_SEC ; } - addType(); - current->type += " enum"; + addType(yyscanner); + yyextra->current->type += " enum"; if (isStrongEnum) { - current->spec |= Entry::Strong; + yyextra->current->spec |= Entry::Strong; } - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - current->bodyLine = yyLineNr; - lineCount() ; + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->bodyLine = yyextra->yyLineNr; + lineCount(yyscanner) ; if (yytext[yyleng-1]=='{') unput('{'); BEGIN( CompoundName ) ; } <Operator>"("{BN}*")"({BN}*"<"[^>]*">"){BN}*/"(" { // A::operator()<int>(int arg) - lineCount(); - current->name += "()"; + lineCount(yyscanner); + yyextra->current->name += "()"; BEGIN( FindMembers ); } <Operator>"("{BN}*")"{BN}*/"(" { - lineCount(); - current->name += yytext ; - current->name = current->name.simplifyWhiteSpace(); + lineCount(yyscanner); + yyextra->current->name += yytext ; + yyextra->current->name = yyextra->current->name.simplifyWhiteSpace(); BEGIN( FindMembers ) ; } <Operator>";" { // can occur when importing members @@ -1890,85 +1570,85 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) BEGIN( FindMembers ) ; } <Operator>[^(] { - lineCount(); - current->name += *yytext ; + lineCount(yyscanner); + yyextra->current->name += *yytext ; } <Operator>"<>" { /* skip guided templ specifiers */ } <Operator>"(" { - current->name = current->name.simplifyWhiteSpace(); + yyextra->current->name = yyextra->current->name.simplifyWhiteSpace(); unput(*yytext); BEGIN( FindMembers ) ; } <FindMembers>("template"|"generic")({BN}*)"<"/[>]? { // generic is a C++/CLI extension - lineCount(); + lineCount(yyscanner); ArgumentList al; - //current->spec |= (yytext[0]=='g') ? Entry::Generic : Entry::Template; - current->tArgLists.push_back(al); - currentArgumentList = ¤t->tArgLists.back(); - templateStr="<"; - fullArgString = templateStr; - copyArgString = &templateStr; - currentArgumentContext = FindMembers; + //yyextra->current->spec |= (yytext[0]=='g') ? Entry::Generic : Entry::Template; + yyextra->current->tArgLists.push_back(al); + yyextra->currentArgumentList = &yyextra->current->tArgLists.back(); + yyextra->templateStr="<"; + yyextra->fullArgString = yyextra->templateStr; + yyextra->copyArgString = &yyextra->templateStr; + yyextra->currentArgumentContext = FindMembers; BEGIN( ReadTempArgs ); } <FindMembers>"namespace"{BN}+/{ID}{BN}*"=" { // namespace alias - lineCount(); + lineCount(yyscanner); BEGIN( NSAliasName ); } <NSAliasName>{ID} { - aliasName = yytext; + yyextra->aliasName = yytext; BEGIN( NSAliasArg ); } <NSAliasArg>({ID}"::")*{ID} { - //printf("Inserting namespace alias %s::%s->%s\n",current_root->name.data(),aliasName.data(),yytext); - //if (current_root->name.isEmpty()) + //printf("Inserting namespace alias %s::%s->%s\n",yyextra->current_root->name.data(),yyextra->aliasName.data(),yytext); + //if (yyextra->current_root->name.isEmpty()) //{ // TODO: namespace aliases are now treated as global entities // while they should be aware of the scope they are in - Doxygen::namespaceAliasDict.insert(aliasName,new QCString(yytext)); + Doxygen::namespaceAliasDict.insert(yyextra->aliasName,new QCString(yytext)); //} //else //{ - // Doxygen::namespaceAliasDict.insert(current_root->name+"::"+aliasName, - // new QCString(current_root->name+"::"+yytext)); + // Doxygen::namespaceAliasDict.insert(yyextra->current_root->name+"::"+yyextra->aliasName, + // new QCString(yyextra->current_root->name+"::"+yytext)); //} } <NSAliasArg>";" { BEGIN( FindMembers ); } <PHPUse>({ID}{BN}*"\\"{BN}*)*{ID}/{BN}+"as" { - lineCount(); - aliasName=yytext; + lineCount(yyscanner); + yyextra->aliasName=yytext; BEGIN(PHPUseAs); } <PHPUse>({ID}{BN}*"\\"{BN}*)*{ID} { - lineCount(); - current->name=removeRedundantWhiteSpace(substitute(yytext,"\\","::")); - //printf("PHP: adding use relation: %s\n",current->name.data()); - current->fileName = yyFileName; + lineCount(yyscanner); + yyextra->current->name=removeRedundantWhiteSpace(substitute(yytext,"\\","::")); + //printf("PHP: adding use relation: %s\n",yyextra->current->name.data()); + yyextra->current->fileName = yyextra->yyFileName; // add a using declaration - current->section=Entry::USINGDECL_SEC; - current_root->copyToSubEntry(current); + yyextra->current->section=Entry::USINGDECL_SEC; + yyextra->current_root->copyToSubEntry(yyextra->current); // also add it as a using directive - current->section=Entry::USINGDIR_SEC; - current_root->moveToSubEntryAndRefresh(current); - initEntry(); - aliasName.resize(0); + yyextra->current->section=Entry::USINGDIR_SEC; + yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current); + initEntry(yyscanner); + yyextra->aliasName.resize(0); } <PHPUseAs>{BN}+"as"{BN}+ { - lineCount(); + lineCount(yyscanner); } <PHPUseAs>{PHPUSEKW} { } <PHPUseAs>{ID} { - //printf("PHP: adding use as relation: %s->%s\n",yytext,aliasName.data()); - if (!aliasName.isEmpty()) + //printf("PHP: adding use as relation: %s->%s\n",yytext,yyextra->aliasName.data()); + if (!yyextra->aliasName.isEmpty()) { Doxygen::namespaceAliasDict.insert(yytext, new QCString(removeRedundantWhiteSpace( - substitute(aliasName,"\\","::")))); + substitute(yyextra->aliasName,"\\","::")))); } - aliasName.resize(0); + yyextra->aliasName.resize(0); } <PHPUse,PHPUseAs>[,;] { if (*yytext==',') @@ -1981,62 +1661,62 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } } <JavaImport>({ID}{BN}*"."{BN}*)+"*" { // package import => add as a using directive - lineCount(); + lineCount(yyscanner); QCString scope=yytext; - current->name=removeRedundantWhiteSpace(substitute(scope.left(scope.length()-1),".","::")); - current->fileName = yyFileName; - current->section=Entry::USINGDIR_SEC; - current_root->moveToSubEntryAndRefresh(current); - initEntry(); + yyextra->current->name=removeRedundantWhiteSpace(substitute(scope.left(scope.length()-1),".","::")); + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->section=Entry::USINGDIR_SEC; + yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current); + initEntry(yyscanner); BEGIN(Using); } <JavaImport>({ID}{BN}*"."{BN}*)+{ID} { // class import => add as a using declaration - lineCount(); + lineCount(yyscanner); QCString scope=yytext; - current->name=removeRedundantWhiteSpace(substitute(scope,".","::")); - current->fileName = yyFileName; - if (insideD) + yyextra->current->name=removeRedundantWhiteSpace(substitute(scope,".","::")); + yyextra->current->fileName = yyextra->yyFileName; + if (yyextra->insideD) { - current->section=Entry::USINGDIR_SEC; + yyextra->current->section=Entry::USINGDIR_SEC; } else { - //printf("import name = %s -> %s\n",yytext,current->name.data()); - current->section=Entry::USINGDECL_SEC; + //printf("import name = %s -> %s\n",yytext,yyextra->current->name.data()); + yyextra->current->section=Entry::USINGDECL_SEC; } - previous = current.get(); - current_root->moveToSubEntryAndRefresh(current); - initEntry(); + yyextra->previous = yyextra->current; + yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current); + initEntry(yyscanner); BEGIN(Using); } <FindMembers>"using"{BN}+ { - current->startLine=yyLineNr; - current->startColumn = yyColNr; - lineCount(); + yyextra->current->startLine=yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + lineCount(yyscanner); BEGIN(Using); } -<Using>"namespace"{BN}+ { lineCount(); BEGIN(UsingDirective); } +<Using>"namespace"{BN}+ { lineCount(yyscanner); BEGIN(UsingDirective); } <Using>({ID}{BN}*("::"|"."){BN}*)*({ID}|{OPERATOR}) { - lineCount(); - current->name=yytext; - current->fileName = yyFileName; - current->section=Entry::USINGDECL_SEC; - current->startLine = yyLineNr; - previous = current.get(); - current_root->moveToSubEntryAndRefresh(current); - initEntry(); - if (insideCS) /* Hack: in C# a using declaration and + lineCount(yyscanner); + yyextra->current->name=yytext; + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->section=Entry::USINGDECL_SEC; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->previous = yyextra->current; + yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current); + initEntry(yyscanner); + if (yyextra->insideCS) /* Hack: in C# a using declaration and directive have the same syntax, so we also add it as a using directive here */ { - current->name=yytext; - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - current->section=Entry::USINGDIR_SEC; - current_root->moveToSubEntryAndRefresh(current); - initEntry(); + yyextra->current->name=yytext; + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->section=Entry::USINGDIR_SEC; + yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current); + initEntry(yyscanner); } BEGIN(Using); } @@ -2044,119 +1724,119 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) BEGIN(UsingAlias); } <UsingAlias>";" { - previous->section=Entry::VARIABLE_SEC; - previous->type = "typedef "+previous->args; - previous->type=previous->type.simplifyWhiteSpace(); - previous->args.resize(0); - previous->name=previous->name.stripWhiteSpace(); - previous->bodyLine = yyLineNr; - previous->spec |= Entry::Alias; + yyextra->previous->section=Entry::VARIABLE_SEC; + yyextra->previous->type = "typedef "+yyextra->previous->args; + yyextra->previous->type=yyextra->previous->type.simplifyWhiteSpace(); + yyextra->previous->args.resize(0); + yyextra->previous->name=yyextra->previous->name.stripWhiteSpace(); + yyextra->previous->bodyLine = yyextra->yyLineNr; + yyextra->previous->spec |= Entry::Alias; BEGIN(FindMembers); } <UsingAlias>";"{BN}*("/**"|"//!"|"/*!"|"///")"<" { - docBlockContext = UsingAliasEnd; - docBlockInBody = FALSE; - docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) || + yyextra->docBlockContext = UsingAliasEnd; + yyextra->docBlockInBody = FALSE; + yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) || ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) ); QCString indent; - indent.fill(' ',computeIndent(yytext,g_column)); - docBlock=indent; - lineCount(); + indent.fill(' ',computeIndent(yytext,yyextra->column)); + yyextra->docBlock=indent; + lineCount(yyscanner); - docBlockTerm = ';'; + yyextra->docBlockTerm = ';'; if (yytext[yyleng-3]=='/') { - startCommentBlock(TRUE); + startCommentBlock(yyscanner,TRUE); BEGIN( DocLine ); } else { - startCommentBlock(FALSE); + startCommentBlock(yyscanner,FALSE); BEGIN( DocBlock ); } } <UsingAlias>">>" { - previous->args+="> >"; // see bug769552 + yyextra->previous->args+="> >"; // see bug769552 } <UsingAlias>. { - previous->args+=yytext; + yyextra->previous->args+=yytext; } <UsingAlias>\n { - previous->args+=yytext; - lineCount(); + yyextra->previous->args+=yytext; + lineCount(yyscanner); } <UsingAliasEnd>";" { - previous->doc = current->doc; - previous->brief = current->brief; - current->doc.resize(0); - current->brief.resize(0); + yyextra->previous->doc = yyextra->current->doc; + yyextra->previous->brief = yyextra->current->brief; + yyextra->current->doc.resize(0); + yyextra->current->brief.resize(0); unput(';'); BEGIN(UsingAlias); } -<UsingDirective>{SCOPENAME} { current->name=removeRedundantWhiteSpace(yytext); - current->fileName = yyFileName; - current->section=Entry::USINGDIR_SEC; - current_root->moveToSubEntryAndRefresh(current); - initEntry(); +<UsingDirective>{SCOPENAME} { yyextra->current->name=removeRedundantWhiteSpace(yytext); + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->section=Entry::USINGDIR_SEC; + yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current); + initEntry(yyscanner); BEGIN(Using); } <Using>";" { BEGIN(FindMembers); } <FindMembers>{SCOPENAME}{BN}*"<>" { // guided template decl QCString n=yytext; - addType(); - current->name=n.left(n.length()-2); + addType(yyscanner); + yyextra->current->name=n.left(n.length()-2); } <FindMembers>{SCOPENAME}{BN}*/"<" { // Note: this could be a return type! - roundCount=0; - sharpCount=0; - lineCount(); - addType(); - current->name=yytext; - current->name=current->name.stripWhiteSpace(); - //current->scopeSpec.resize(0); - // currentTemplateSpec = ¤t->scopeSpec; - if (nameIsOperator(current->name)) + yyextra->roundCount=0; + yyextra->sharpCount=0; + lineCount(yyscanner); + addType(yyscanner); + yyextra->current->name=yytext; + yyextra->current->name=yyextra->current->name.stripWhiteSpace(); + //yyextra->current->scopeSpec.resize(0); + // yyextra->currentTemplateSpec = &yyextra->current->scopeSpec; + if (nameIsOperator(yyextra->current->name)) BEGIN( Operator ); else BEGIN( EndTemplate ); } <FindMemberName>{SCOPENAME}{BN}*/"<" { - sharpCount=0; - roundCount=0; - lineCount(); - current->name+=((QCString)yytext).stripWhiteSpace(); - //current->memberSpec.resize(0); - // currentTemplateSpec = ¤t->memberSpec; - if (nameIsOperator(current->name)) + yyextra->sharpCount=0; + yyextra->roundCount=0; + lineCount(yyscanner); + yyextra->current->name+=((QCString)yytext).stripWhiteSpace(); + //yyextra->current->memberSpec.resize(0); + // yyextra->currentTemplateSpec = &yyextra->current->memberSpec; + if (nameIsOperator(yyextra->current->name)) BEGIN( Operator ); else BEGIN( EndTemplate ); } <EndTemplate>"<<<" { - if (!insidePHP) + if (!yyextra->insidePHP) { REJECT; } else { - lastHereDocContext = YY_START; + yyextra->lastHereDocContext = YY_START; BEGIN(HereDoc); } } <ClassTemplSpec,EndTemplate>"<<" { - current->name+=yytext; - // *currentTemplateSpec+=yytext; + yyextra->current->name+=yytext; + // *yyextra->currentTemplateSpec+=yytext; } <EndTemplate>"<" { - if (roundCount==0) + if (yyextra->roundCount==0) { - // *currentTemplateSpec+='<'; - sharpCount++; + // *yyextra->currentTemplateSpec+='<'; + yyextra->sharpCount++; } - current->name+=yytext; + yyextra->current->name+=yytext; } <ClassTemplSpec,EndTemplate>">>" { - if (insideJava || insideCS || insideCli || roundCount==0) + if (yyextra->insideJava || yyextra->insideCS || yyextra->insideCli || yyextra->roundCount==0) { unput('>'); unput(' '); @@ -2164,117 +1844,118 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } else { - current->name+=yytext; + yyextra->current->name+=yytext; } - // *currentTemplateSpec+=yytext; + // *yyextra->currentTemplateSpec+=yytext; } <EndTemplate>">" { - current->name+='>'; - // *currentTemplateSpec+='>'; - if (roundCount==0 && --sharpCount<=0) + yyextra->current->name+='>'; + // *yyextra->currentTemplateSpec+='>'; + if (yyextra->roundCount==0 && --yyextra->sharpCount<=0) { - //printf("Found %s\n",current->name.data()); + //printf("Found %s\n",yyextra->current->name.data()); BEGIN(FindMembers); } } <EndTemplate>">"{BN}*"(" { - lineCount(); - current->name+='>'; - // *currentTemplateSpec+='>'; - if (roundCount==0 && --sharpCount<=0) - { - current->bodyLine = yyLineNr; - current->args = "("; - currentArgumentContext = FuncQual; - fullArgString = current->args.copy(); - copyArgString = ¤t->args; - //printf("Found %s\n",current->name.data()); + lineCount(yyscanner); + yyextra->current->name+='>'; + // *yyextra->currentTemplateSpec+='>'; + if (yyextra->roundCount==0 && --yyextra->sharpCount<=0) + { + yyextra->current->bodyLine = yyextra->yyLineNr; + yyextra->current->args = "("; + yyextra->currentArgumentContext = FuncQual; + yyextra->fullArgString = yyextra->current->args.copy(); + yyextra->copyArgString = &yyextra->current->args; + //printf("Found %s\n",yyextra->current->name.data()); BEGIN( ReadFuncArgType ) ; } } <EndTemplate>">"{BN}*/"("({BN}*{ID}{BN}*"::")*({BN}*"*"{BN}*)+ { // function pointer returning a template instance - lineCount(); - current->name+='>'; - if (roundCount==0) + lineCount(yyscanner); + yyextra->current->name+='>'; + if (yyextra->roundCount==0) { BEGIN(FindMembers); } } <EndTemplate>">"{BN}*/"::" { - lineCount(); - current->name+='>'; - // *currentTemplateSpec+='>'; - if (roundCount==0 && --sharpCount<=0) + lineCount(yyscanner); + yyextra->current->name+='>'; + // *yyextra->currentTemplateSpec+='>'; + if (yyextra->roundCount==0 && --yyextra->sharpCount<=0) { BEGIN(FindMemberName); } } -<ClassTemplSpec,EndTemplate>"(" { current->name+=*yytext; - roundCount++; +<ClassTemplSpec,EndTemplate>"(" { yyextra->current->name+=*yytext; + yyextra->roundCount++; } -<ClassTemplSpec,EndTemplate>")" { current->name+=*yytext; - if (roundCount>0) roundCount--; +<ClassTemplSpec,EndTemplate>")" { yyextra->current->name+=*yytext; + if (yyextra->roundCount>0) yyextra->roundCount--; } <EndTemplate>. { - current->name+=*yytext; - // *currentTemplateSpec+=*yytext; + yyextra->current->name+=*yytext; + // *yyextra->currentTemplateSpec+=*yytext; } <FindMembers>"define"{BN}*"("{BN}*["'] { - if (insidePHP) + if (yyextra->insidePHP) { - current->bodyLine = yyLineNr; + yyextra->current->bodyLine = yyextra->yyLineNr; BEGIN( DefinePHP ); } else REJECT; } <CopyHereDoc>{ID} { // PHP heredoc - g_delimiter = yytext; - *pCopyHereDocGString += yytext; + yyextra->delimiter = yytext; + *yyextra->pCopyHereDocGString += yytext; BEGIN(CopyHereDocEnd); } <CopyHereDoc>"'"{ID}/"'" { // PHP nowdoc - g_delimiter = &yytext[1]; - *pCopyHereDocGString += yytext; + yyextra->delimiter = &yytext[1]; + *yyextra->pCopyHereDocGString += yytext; BEGIN(CopyHereDocEnd); } <HereDoc>{ID} { // PHP heredoc - g_delimiter = yytext; + yyextra->delimiter = yytext; BEGIN(HereDocEnd); } <HereDoc>"'"{ID}/"'" { // PHP nowdoc - g_delimiter = &yytext[1]; + yyextra->delimiter = &yytext[1]; BEGIN(HereDocEnd); } <HereDocEnd>^{ID} { // id at start of the line could mark the end of the block - if (g_delimiter==yytext) // it is the end marker + if (yyextra->delimiter==yytext) // it is the end marker { - BEGIN(lastHereDocContext); + BEGIN(yyextra->lastHereDocContext); } } <HereDocEnd>. { } <CopyHereDocEnd>^{ID} { // id at start of the line could mark the end of the block - *pCopyHereDocGString += yytext; - if (g_delimiter==yytext) // it is the end marker + *yyextra->pCopyHereDocGString += yytext; + if (yyextra->delimiter==yytext) // it is the end marker { - BEGIN(lastHereDocContext); + BEGIN(yyextra->lastHereDocContext); } } <CopyHereDocEnd>\n { - *pCopyHereDocGString += yytext; + lineCount(yyscanner); + *yyextra->pCopyHereDocGString += yytext; } <CopyHereDocEnd>{ID} { - *pCopyHereDocGString += yytext; + *yyextra->pCopyHereDocGString += yytext; } <CopyHereDocEnd>. { - *pCopyHereDocGString += yytext; + *yyextra->pCopyHereDocGString += yytext; } <FindMembers>"Q_OBJECT" { // Qt object macro } <FindMembers>"Q_PROPERTY" { // Qt property declaration - current->protection = Public ; // see bug734245 & bug735462 - current->mtype = mtype = Property; - current->type.resize(0); + yyextra->current->protection = Public ; // see bug734245 & bug735462 + yyextra->current->mtype = yyextra->mtype = Property; + yyextra->current->type.resize(0); BEGIN(QtPropType); } <QtPropType>"(" { // start of property arguments @@ -2284,25 +1965,25 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) BEGIN(FindMembers); } <QtPropType>"const"|"volatile"|"unsigned"|"signed"|"long"|"short" { - current->type+=yytext; + yyextra->current->type+=yytext; } <QtPropType>{B}+ { - current->type+=yytext; + yyextra->current->type+=yytext; } <QtPropType>({TSCOPE}"::")*{TSCOPE} { - current->type+=yytext; + yyextra->current->type+=yytext; BEGIN(QtPropName); } <QtPropName>{ID} { - current->name=yytext; + yyextra->current->name=yytext; BEGIN(QtPropAttr); } <QtPropAttr>"READ" { - current->spec |= Entry::Readable; + yyextra->current->spec |= Entry::Readable; BEGIN(QtPropRead); } <QtPropAttr>"WRITE" { - current->spec |= Entry::Writable; + yyextra->current->spec |= Entry::Writable; BEGIN(QtPropWrite); } <QtPropAttr>"RESET"{B}+{ID} { // reset method => not supported yet @@ -2312,163 +1993,163 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) <QtPropAttr>"DESIGNABLE"{B}+{ID} { // designable property => not supported yet } <QtPropRead>{ID} { - current->read = yytext; + yyextra->current->read = yytext; BEGIN(QtPropAttr); } <QtPropWrite>{ID} { - current->write = yytext; + yyextra->current->write = yytext; BEGIN(QtPropAttr); } <FindMembers>"friend"{BN}+("class"|"union"|"struct"){BN}+ { - current->name=yytext; + yyextra->current->name=yytext; BEGIN(FindMembers); } <FindMembers,FindMemberName>{SCOPENAME} { - if (insideCpp || insideObjC) + if (yyextra->insideCpp || yyextra->insideObjC) { - current->id = ClangParser::instance()->lookup(yyLineNr,yytext); + yyextra->current->id = ClangParser::instance()->lookup(yyextra->yyLineNr,yytext); } - yyBegColNr=yyColNr; - yyBegLineNr=yyLineNr; - lineCount(); - if (insideIDL && yyleng==9 && qstrcmp(yytext,"cpp_quote")==0) + yyextra->yyBegColNr=yyextra->yyColNr; + yyextra->yyBegLineNr=yyextra->yyLineNr; + lineCount(yyscanner); + if (yyextra->insideIDL && yyleng==9 && qstrcmp(yytext,"cpp_quote")==0) { BEGIN(CppQuote); } - else if ((insideIDL || insideJava || insideD) && yyleng==6 && qstrcmp(yytext,"import")==0) + else if ((yyextra->insideIDL || yyextra->insideJava || yyextra->insideD) && yyleng==6 && qstrcmp(yytext,"import")==0) { - if (insideIDL) + if (yyextra->insideIDL) BEGIN(NextSemi); - else // insideJava or insideD + else // yyextra->insideJava or yyextra->insideD BEGIN(JavaImport); } - else if (insidePHP && qstrcmp(yytext,"use")==0) + else if (yyextra->insidePHP && qstrcmp(yytext,"use")==0) { BEGIN(PHPUse); } - else if (insideJava && qstrcmp(yytext,"package")==0) + else if (yyextra->insideJava && qstrcmp(yytext,"package")==0) { - lineCount(); + lineCount(yyscanner); BEGIN(PackageName); } - else if (insideIDL && qstrcmp(yytext,"case")==0) + else if (yyextra->insideIDL && qstrcmp(yytext,"case")==0) { BEGIN(IDLUnionCase); } - else if (insideTryBlock && qstrcmp(yytext,"catch")==0) + else if (yyextra->insideTryBlock && qstrcmp(yytext,"catch")==0) { - insideTryBlock=FALSE; + yyextra->insideTryBlock=FALSE; BEGIN(TryFunctionBlock); } - else if (insideCpp && qstrcmp(yytext,"alignas")==0) + else if (yyextra->insideCpp && qstrcmp(yytext,"alignas")==0) { - lastAlignAsContext = YY_START; + yyextra->lastAlignAsContext = YY_START; BEGIN(AlignAs); } - else if (insideJS && qstrcmp(yytext,"var")==0) + else if (yyextra->insideJS && qstrcmp(yytext,"var")==0) { // javascript variable - current->type="var"; + yyextra->current->type="var"; } - else if (insideJS && qstrcmp(yytext,"function")==0) + else if (yyextra->insideJS && qstrcmp(yytext,"function")==0) { // javascript function - current->type="function"; + yyextra->current->type="function"; } - else if (insideCS && qstrcmp(yytext,"this")==0) + else if (yyextra->insideCS && qstrcmp(yytext,"this")==0) { // C# indexer - addType(); - current->name="this"; + addType(yyscanner); + yyextra->current->name="this"; BEGIN(CSIndexer); } - else if (insideCpp && qstrcmp(yytext,"static_assert")==0) + else if (yyextra->insideCpp && qstrcmp(yytext,"static_assert")==0) { // C++11 static_assert BEGIN(StaticAssert); } - else if (insideCpp && qstrcmp(yytext,"decltype")==0) + else if (yyextra->insideCpp && qstrcmp(yytext,"decltype")==0) { // C++11 decltype(x) - current->type+=yytext; + yyextra->current->type+=yytext; BEGIN(DeclType); } - else if (insideSlice && qstrcmp(yytext,"optional")==0) + else if (yyextra->insideSlice && qstrcmp(yytext,"optional")==0) { - if (current->type.isEmpty()) + if (yyextra->current->type.isEmpty()) { - current->type = "optional"; + yyextra->current->type = "optional"; } else { - current->type += " optional"; + yyextra->current->type += " optional"; } - lastModifierContext = YY_START; + yyextra->lastModifierContext = YY_START; BEGIN(SliceOptional); } else { if (YY_START==FindMembers) { - addType(); + addType(yyscanner); } - bool javaLike = insideJava || insideCS || insideD || insidePHP || insideJS; + bool javaLike = yyextra->insideJava || yyextra->insideCS || yyextra->insideD || yyextra->insidePHP || yyextra->insideJS; if (javaLike && qstrcmp(yytext,"public")==0) { - current->protection = Public; + yyextra->current->protection = Public; } else if (javaLike && qstrcmp(yytext,"protected")==0) { - current->protection = Protected; + yyextra->current->protection = Protected; } - else if ((insideCS || insideD || insidePHP || insideJS) && qstrcmp(yytext,"internal")==0) + else if ((yyextra->insideCS || yyextra->insideD || yyextra->insidePHP || yyextra->insideJS) && qstrcmp(yytext,"internal")==0) { - current->protection = Package; + yyextra->current->protection = Package; } else if (javaLike && qstrcmp(yytext,"private")==0) { - current->protection = Private; + yyextra->current->protection = Private; } else if (javaLike && qstrcmp(yytext,"static")==0) { if (YY_START==FindMembers) - current->name = yytext; + yyextra->current->name = yytext; else - current->name += yytext; - current->stat = TRUE; + yyextra->current->name += yytext; + yyextra->current->stat = TRUE; } else { if (YY_START==FindMembers) - current->name = yytext; + yyextra->current->name = yytext; else - current->name += yytext; - if (current->name.left(7)=="static ") + yyextra->current->name += yytext; + if (yyextra->current->name.left(7)=="static ") { - current->stat = TRUE; - current->name= current->name.mid(7); + yyextra->current->stat = TRUE; + yyextra->current->name= yyextra->current->name.mid(7); } - else if (current->name.left(7)=="inline ") + else if (yyextra->current->name.left(7)=="inline ") { - if (current->type.isEmpty()) + if (yyextra->current->type.isEmpty()) { - current->type="inline"; + yyextra->current->type="inline"; } else { - current->type+="inline "; + yyextra->current->type+="inline "; } - current->name= current->name.mid(7); + yyextra->current->name= yyextra->current->name.mid(7); } - else if (current->name.left(6)=="const ") + else if (yyextra->current->name.left(6)=="const ") { - if (current->type.isEmpty()) + if (yyextra->current->type.isEmpty()) { - current->type="const"; + yyextra->current->type="const"; } else { - current->type+="const "; + yyextra->current->type+="const "; } - current->name=current->name.mid(6); + yyextra->current->name=yyextra->current->name.mid(6); } } QCString tmp=yytext; @@ -2478,64 +2159,64 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } else { - externC=FALSE; // see bug759247 + yyextra->externC=FALSE; // see bug759247 BEGIN(FindMembers); } } } <StaticAssert>"(" { - lastSkipRoundContext = FindMembers; - roundCount=0; + yyextra->lastSkipRoundContext = FindMembers; + yyextra->roundCount=0; BEGIN(SkipRound); } -<StaticAssert>{BN}+ { lineCount(); } +<StaticAssert>{BN}+ { lineCount(yyscanner); } <StaticAssert>. { // variable with static_assert as name? unput(*yytext); BEGIN(FindMembers); } <DeclType>"(" { - current->type+=yytext; - lastRoundContext=FindMembers; - pCopyRoundString=¤t->type; - roundCount=0; + yyextra->current->type+=yytext; + yyextra->lastRoundContext=FindMembers; + yyextra->pCopyRoundString=&yyextra->current->type; + yyextra->roundCount=0; BEGIN(CopyRound); } -<DeclType>{BN}+ { lineCount(); } +<DeclType>{BN}+ { lineCount(yyscanner); } <DeclType>. { unput(*yytext); BEGIN(FindMembers); } <CSIndexer>"["[^\n\]]*"]" { - current->name+=removeRedundantWhiteSpace(yytext); + yyextra->current->name+=removeRedundantWhiteSpace(yytext); BEGIN(FindMembers); } <FindMembers>[0-9]{ID} { // some number where we did not expect one } <FindMembers>"." { - if (insideJava || insideCS || insideD) + if (yyextra->insideJava || yyextra->insideCS || yyextra->insideD) { - current->name+="."; + yyextra->current->name+="."; } } <FindMembers>"::" { - current->name+=yytext; + yyextra->current->name+=yytext; } <CppQuote>"("{B}*"\"" { - insideCppQuote=TRUE; + yyextra->insideCppQuote=TRUE; BEGIN(FindMembers); } <IDLUnionCase>"::" <IDLUnionCase>":" { BEGIN(FindMembers); } -<IDLUnionCase>\n { lineCount(); } +<IDLUnionCase>\n { lineCount(yyscanner); } <IDLUnionCase>. -<TryFunctionBlock>\n { lineCount(); } +<TryFunctionBlock>\n { lineCount(yyscanner); } <TryFunctionBlock>"{" { - curlyCount=0; - lastCurlyContext = TryFunctionBlockEnd ; + yyextra->curlyCount=0; + yyextra->lastCurlyContext = TryFunctionBlockEnd ; BEGIN( SkipCurly ); } <TryFunctionBlock>. -<TryFunctionBlockEnd>{BN}*"catch" { lineCount(); BEGIN(TryFunctionBlock); // {BN}* added to fix bug 611193 +<TryFunctionBlockEnd>{BN}*"catch" { lineCount(yyscanner); BEGIN(TryFunctionBlock); // {BN}* added to fix bug 611193 } <TryFunctionBlockEnd>\n { unput(*yytext); // rule added to fix bug id 601138 BEGIN( FindMembers ); @@ -2544,159 +2225,159 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) BEGIN( FindMembers ); } <EndCppQuote>")" { - insideCppQuote=FALSE; + yyextra->insideCppQuote=FALSE; BEGIN(FindMembers); } -<FindMembers,FindFields>{B}*"#" { if (insidePHP) +<FindMembers,FindFields>{B}*"#" { if (yyextra->insidePHP) REJECT; - lastCPPContext = YY_START; + yyextra->lastCPPContext = YY_START; BEGIN( SkipCPP ) ; } <FindMembers,FindFields>{B}*"#"{B}*("cmake")?"define" { - if (insidePHP) + if (yyextra->insidePHP) REJECT; - current->bodyLine = yyLineNr; - lastDefineContext = YY_START; + yyextra->current->bodyLine = yyextra->yyLineNr; + yyextra->lastDefineContext = YY_START; BEGIN( Define ); } <FindMembers,ReadBody,ReadNSBody,ReadBodyIntf,SkipCurly,SkipCurlyCpp>{B}*"#"{B}+[0-9]+{B}+/"\"" { /* line control directive */ - yyLineNr = atoi(&yytext[1]); - //printf("setting line number to %d\n",yyLineNr); - lastPreLineCtrlContext = YY_START; + yyextra->yyLineNr = atoi(&yytext[1]); + //printf("setting line number to %d\n",yyextra->yyLineNr); + yyextra->lastPreLineCtrlContext = YY_START; if (YY_START==ReadBody || YY_START==ReadNSBody || YY_START==ReadBodyIntf) { - current->program+=yytext; + yyextra->current->program+=yytext; } BEGIN( PreLineCtrl ); } <PreLineCtrl>"\""[^\n\"]*"\"" { - yyFileName = stripQuotes(yytext); - if (lastPreLineCtrlContext==ReadBody || - lastPreLineCtrlContext==ReadNSBody || - lastPreLineCtrlContext==ReadBodyIntf) + yyextra->yyFileName = stripQuotes(yytext); + if (yyextra->lastPreLineCtrlContext==ReadBody || + yyextra->lastPreLineCtrlContext==ReadNSBody || + yyextra->lastPreLineCtrlContext==ReadBodyIntf) { - current->program+=yytext; + yyextra->current->program+=yytext; } } <PreLineCtrl>. { - if (lastPreLineCtrlContext==ReadBody || - lastPreLineCtrlContext==ReadNSBody || - lastPreLineCtrlContext==ReadBodyIntf) + if (yyextra->lastPreLineCtrlContext==ReadBody || + yyextra->lastPreLineCtrlContext==ReadNSBody || + yyextra->lastPreLineCtrlContext==ReadBodyIntf) { - current->program+=yytext; + yyextra->current->program+=yytext; } } <PreLineCtrl>\n { - if (lastPreLineCtrlContext==ReadBody || - lastPreLineCtrlContext==ReadNSBody || - lastPreLineCtrlContext==ReadBodyIntf) + if (yyextra->lastPreLineCtrlContext==ReadBody || + yyextra->lastPreLineCtrlContext==ReadNSBody || + yyextra->lastPreLineCtrlContext==ReadBodyIntf) { - current->program+=yytext; + yyextra->current->program+=yytext; } - lineCount(); - BEGIN( lastPreLineCtrlContext ); + lineCount(yyscanner); + BEGIN( yyextra->lastPreLineCtrlContext ); } <SkipCPP>. -<SkipCPP>\\[\r]*"\n"[\r]* { lineCount(); } -<SkipCPP>[\r]*\n[\r]* { lineCount(); - BEGIN( lastCPPContext) ; +<SkipCPP>\\[\r]*"\n"[\r]* { lineCount(yyscanner); } +<SkipCPP>[\r]*\n[\r]* { lineCount(yyscanner); + BEGIN( yyextra->lastCPPContext) ; } <Define>{ID}{B}*"(" { - current->name = yytext; - current->name = current->name.left(current->name.length()-1).stripWhiteSpace(); - current->args = "("; - current->bodyLine = yyLineNr; - currentArgumentContext = DefineEnd; - fullArgString=current->args.copy(); - copyArgString=¤t->args; + yyextra->current->name = yytext; + yyextra->current->name = yyextra->current->name.left(yyextra->current->name.length()-1).stripWhiteSpace(); + yyextra->current->args = "("; + yyextra->current->bodyLine = yyextra->yyLineNr; + yyextra->currentArgumentContext = DefineEnd; + yyextra->fullArgString=yyextra->current->args.copy(); + yyextra->copyArgString=&yyextra->current->args; BEGIN( ReadFuncArgType ) ; } /* <DefineArg>")" { //printf("Define with args\n"); - current->args += ')'; + yyextra->current->args += ')'; BEGIN( DefineEnd ); } <DefineArg>. { - current->args += *yytext; + yyextra->current->args += *yytext; } */ <Define>{ID} { //printf("Define '%s' without args\n",yytext); - if (insideCpp || insideObjC) + if (yyextra->insideCpp || yyextra->insideObjC) { - current->id = ClangParser::instance()->lookup(yyLineNr,yytext); + yyextra->current->id = ClangParser::instance()->lookup(yyextra->yyLineNr,yytext); } - current->bodyLine = yyLineNr; - current->name = yytext; + yyextra->current->bodyLine = yyextra->yyLineNr; + yyextra->current->name = yytext; BEGIN(DefineEnd); } <DefineEnd>\n { - //printf("End define: doc=%s docFile=%s docLine=%d\n",current->doc.data(),current->docFile.data(),current->docLine); - lineCount(); - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - current->type.resize(0); - current->args = current->args.simplifyWhiteSpace(); - current->name = current->name.stripWhiteSpace(); - current->section = Entry::DEFINE_SEC; - current_root->moveToSubEntryAndRefresh(current); - initEntry(); - BEGIN(lastDefineContext); + //printf("End define: doc=%s docFile=%s docLine=%d\n",yyextra->current->doc.data(),yyextra->current->docFile.data(),yyextra->current->docLine); + lineCount(yyscanner); + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->type.resize(0); + yyextra->current->args = yyextra->current->args.simplifyWhiteSpace(); + yyextra->current->name = yyextra->current->name.stripWhiteSpace(); + yyextra->current->section = Entry::DEFINE_SEC; + yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current); + initEntry(yyscanner); + BEGIN(yyextra->lastDefineContext); } <DefinePHPEnd>";" { //printf("End define\n"); - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - current->type.resize(0); - current->type = "const"; - QCString init = current->initializer.data(); + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->type.resize(0); + yyextra->current->type = "const"; + QCString init = yyextra->current->initializer.data(); init = init.simplifyWhiteSpace(); init = init.left(init.length()-1); - current->initializer = init; - current->name = current->name.stripWhiteSpace(); - current->section = Entry::VARIABLE_SEC; - current_root->moveToSubEntryAndRefresh(current); - initEntry(); + yyextra->current->initializer = init; + yyextra->current->name = yyextra->current->name.stripWhiteSpace(); + yyextra->current->section = Entry::VARIABLE_SEC; + yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current); + initEntry(yyscanner); BEGIN(FindMembers); } <DefinePHPEnd>. <DefineEnd>\\[\r]?\n { - lineCount(); + lineCount(yyscanner); } <DefineEnd>\" { - if (insideIDL && insideCppQuote) + if (yyextra->insideIDL && yyextra->insideCppQuote) { BEGIN(EndCppQuote); } else { - lastStringContext=DefineEnd; + yyextra->lastStringContext=DefineEnd; BEGIN(SkipString); } } <DefineEnd>. <DefinePHP>{ID}["']{BN}*","{BN}* { - current->name = yytext; - current->name = current->name.stripWhiteSpace(); - current->name = current->name.left(current->name.length()-1).stripWhiteSpace(); - current->name = current->name.left(current->name.length()-1); - current->bodyLine = yyLineNr; - lastRoundContext = DefinePHPEnd; - pCopyRoundGString = ¤t->initializer; - roundCount = 0; + yyextra->current->name = yytext; + yyextra->current->name = yyextra->current->name.stripWhiteSpace(); + yyextra->current->name = yyextra->current->name.left(yyextra->current->name.length()-1).stripWhiteSpace(); + yyextra->current->name = yyextra->current->name.left(yyextra->current->name.length()-1); + yyextra->current->bodyLine = yyextra->yyLineNr; + yyextra->lastRoundContext = DefinePHPEnd; + yyextra->pCopyRoundGString = &yyextra->current->initializer; + yyextra->roundCount = 0; BEGIN( GCopyRound ); } <FindMembers>[\^%] { // ^ and % are C++/CLI extensions - if (insideCli) + if (yyextra->insideCli) { - addType(); - current->name = yytext ; + addType(yyscanner); + yyextra->current->name = yytext ; } else { @@ -2704,128 +2385,128 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } } <FindMembers>[*&]+ { - current->name += yytext ; - addType(); + yyextra->current->name += yytext ; + addType(yyscanner); } <FindMembers,MemberSpec,Function,NextSemi,EnumBaseType,BitFields,ReadInitializer,OldStyleArgs,DefinePHPEnd>";"{BN}*("/**"|"//!"|"/*!"|"///")"<" { - if (current->bodyLine==-1) + if (yyextra->current->bodyLine==-1) { - current->bodyLine=yyLineNr; + yyextra->current->bodyLine=yyextra->yyLineNr; } - docBlockContext = YY_START; - docBlockInBody = FALSE; - docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) || + yyextra->docBlockContext = YY_START; + yyextra->docBlockInBody = FALSE; + yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) || ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) ); QCString indent; - indent.fill(' ',computeIndent(yytext,g_column)); - docBlock=indent; - //printf("indent=%d\n",computeIndent(yytext+1,g_column)); - lineCount(); + indent.fill(' ',computeIndent(yytext,yyextra->column)); + yyextra->docBlock=indent; + //printf("indent=%d\n",computeIndent(yytext+1,yyextra->column)); + lineCount(yyscanner); - docBlockTerm = ';'; - if (YY_START==EnumBaseType && current->section==Entry::ENUM_SEC) + yyextra->docBlockTerm = ';'; + if (YY_START==EnumBaseType && yyextra->current->section==Entry::ENUM_SEC) { - current->bitfields = ":"+current->args; - current->args.resize(0); - current->section=Entry::VARIABLE_SEC; + yyextra->current->bitfields = ":"+yyextra->current->args; + yyextra->current->args.resize(0); + yyextra->current->section=Entry::VARIABLE_SEC; } if (yytext[yyleng-3]=='/') { - startCommentBlock(TRUE); + startCommentBlock(yyscanner,TRUE); BEGIN( DocLine ); } else { - startCommentBlock(FALSE); + startCommentBlock(yyscanner,FALSE); BEGIN( DocBlock ); } } <MemberSpec,FindFields,FindMembers,NextSemi,EnumBaseType,BitFields,ReadInitializer,OldStyleArgs>","{BN}*("/**"|"//!"|"/*!"|"///")"<" { - docBlockContext = YY_START; - docBlockInBody = FALSE; - docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) || + yyextra->docBlockContext = YY_START; + yyextra->docBlockInBody = FALSE; + yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) || ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) ); QCString indent; - indent.fill(' ',computeIndent(yytext,g_column)); - docBlock=indent; - lineCount(); + indent.fill(' ',computeIndent(yytext,yyextra->column)); + yyextra->docBlock=indent; + lineCount(yyscanner); - docBlockTerm = ','; - if (YY_START==EnumBaseType && current->section==Entry::ENUM_SEC) + yyextra->docBlockTerm = ','; + if (YY_START==EnumBaseType && yyextra->current->section==Entry::ENUM_SEC) { - current->bitfields = ":"+current->args; - current->args.resize(0); - current->section=Entry::VARIABLE_SEC; + yyextra->current->bitfields = ":"+yyextra->current->args; + yyextra->current->args.resize(0); + yyextra->current->section=Entry::VARIABLE_SEC; } if (yytext[yyleng-3]=='/') { - startCommentBlock(TRUE); + startCommentBlock(yyscanner,TRUE); BEGIN( DocLine ); } else { - startCommentBlock(FALSE); + startCommentBlock(yyscanner,FALSE); BEGIN( DocBlock ); } } <DefineEnd,FindFields,FindFieldArg,ReadInitializer,OldStyleArgs>{BN}*("/**"|"//!"|"/*!"|"///")"<" { - if (current->bodyLine==-1) + if (yyextra->current->bodyLine==-1) { - current->bodyLine=yyLineNr; + yyextra->current->bodyLine=yyextra->yyLineNr; } - docBlockContext = YY_START; - docBlockInBody = FALSE; - docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) || + yyextra->docBlockContext = YY_START; + yyextra->docBlockInBody = FALSE; + yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) || ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) ); QCString indent; - indent.fill(' ',computeIndent(yytext,g_column)); - docBlock=indent; - lineCount(); + indent.fill(' ',computeIndent(yytext,yyextra->column)); + yyextra->docBlock=indent; + lineCount(yyscanner); - docBlockTerm = 0; + yyextra->docBlockTerm = 0; if (yytext[yyleng-3]=='/') { - startCommentBlock(TRUE); + startCommentBlock(yyscanner,TRUE); BEGIN( DocLine ); } else { - startCommentBlock(FALSE); + startCommentBlock(yyscanner,FALSE); BEGIN( DocBlock ); } } <FindMembers,FindFields>("//"([!/]){B}*{CMD}"{")|("/*"([!*]){B}*{CMD}"{") { - //handleGroupStartCommand(current->name); - if (previous && previous->section==Entry::GROUPDOC_SEC) + //handleGroupStartCommand(yyextra->current->name); + if (yyextra->previous && yyextra->previous->section==Entry::GROUPDOC_SEC) { - // link open command to the group defined in the previous entry - Doxygen::docGroup.open(previous,yyFileName,yyLineNr); + // link open command to the group defined in the yyextra->previous entry + Doxygen::docGroup.open(yyextra->previous.get(),yyextra->yyFileName,yyextra->yyLineNr); } else { - // link open command to the current entry - Doxygen::docGroup.open(current.get(),yyFileName,yyLineNr); + // link open command to the yyextra->current entry + Doxygen::docGroup.open(yyextra->current.get(),yyextra->yyFileName,yyextra->yyLineNr); } - //current = tmp; - initEntry(); + //yyextra->current = tmp; + initEntry(yyscanner); if (yytext[1]=='/') { if (yytext[2]=='!' || yytext[2]=='/') { - docBlockContext = YY_START; - docBlockInBody = FALSE; - docBlockAutoBrief = FALSE; - docBlock.resize(0); - docBlockTerm = 0; - startCommentBlock(TRUE); + yyextra->docBlockContext = YY_START; + yyextra->docBlockInBody = FALSE; + yyextra->docBlockAutoBrief = FALSE; + yyextra->docBlock.resize(0); + yyextra->docBlockTerm = 0; + startCommentBlock(yyscanner,TRUE); BEGIN(DocLine); } else { - lastCContext=YY_START; + yyextra->lastCContext=YY_START; BEGIN(SkipCxxComment); } } @@ -2833,497 +2514,498 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) { if (yytext[2]=='!' || yytext[2]=='*') { - docBlockContext = YY_START; - docBlockInBody = FALSE; - docBlock.resize(0); - docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) || + yyextra->docBlockContext = YY_START; + yyextra->docBlockInBody = FALSE; + yyextra->docBlock.resize(0); + yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) || ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) ); - docBlockTerm = 0; - startCommentBlock(FALSE); + yyextra->docBlockTerm = 0; + startCommentBlock(yyscanner,FALSE); BEGIN(DocBlock); } else { - lastCContext=YY_START; + yyextra->lastCContext=YY_START; BEGIN(SkipComment); } } } <FindMembers,FindFields,ReadInitializer>"//"([!/]){B}*{CMD}"}".*|"/*"([!*]){B}*{CMD}"}"[^*]*"*/" { - bool insideEnum = YY_START==FindFields || (YY_START==ReadInitializer && lastInitializerContext==FindFields); // see bug746226 - Doxygen::docGroup.close(current.get(),yyFileName,yyLineNr,insideEnum); + bool insideEnum = YY_START==FindFields || (YY_START==ReadInitializer && yyextra->lastInitializerContext==FindFields); // see bug746226 + Doxygen::docGroup.close(yyextra->current.get(),yyextra->yyFileName,yyextra->yyLineNr,insideEnum); + lineCount(yyscanner); } <FindMembers>"=" { // in PHP code this could also be due to "<?=" - current->bodyLine = yyLineNr; - current->initializer = yytext; - lastInitializerContext = YY_START; - initBracketCount=0; + yyextra->current->bodyLine = yyextra->yyLineNr; + yyextra->current->initializer = yytext; + yyextra->lastInitializerContext = YY_START; + yyextra->initBracketCount=0; BEGIN(ReadInitializer); } <UNOIDLAttributeBlock>{BN}*[gs]"et"{BN}+"raises"{BN}*"("{BN}*{SCOPENAME}{BN}*(","{BN}*{SCOPENAME}{BN}*)*")"{BN}*";" { - lineCount(); - current->exception += " "; - current->exception += removeRedundantWhiteSpace(yytext); + lineCount(yyscanner); + yyextra->current->exception += " "; + yyextra->current->exception += removeRedundantWhiteSpace(yytext); } <UNOIDLAttributeBlock>"}" { - current->exception += " }"; + yyextra->current->exception += " }"; BEGIN(FindMembers); } /* Read initializer rules */ <ReadInitializer>"(" { - lastRoundContext=YY_START; - pCopyRoundGString=¤t->initializer; - roundCount=0; - current->initializer+=*yytext; + yyextra->lastRoundContext=YY_START; + yyextra->pCopyRoundGString=&yyextra->current->initializer; + yyextra->roundCount=0; + yyextra->current->initializer+=*yytext; BEGIN(GCopyRound); } <ReadInitializer>"[" { - if (!insidePHP) REJECT; - lastSquareContext=YY_START; - pCopySquareGString=¤t->initializer; - squareCount=0; - current->initializer+=*yytext; + if (!yyextra->insidePHP) REJECT; + yyextra->lastSquareContext=YY_START; + yyextra->pCopySquareGString=&yyextra->current->initializer; + yyextra->squareCount=0; + yyextra->current->initializer+=*yytext; BEGIN(GCopySquare); } <ReadInitializer>"{" { - lastCurlyContext=YY_START; - pCopyCurlyGString=¤t->initializer; - curlyCount=0; - current->initializer+=*yytext; + yyextra->lastCurlyContext=YY_START; + yyextra->pCopyCurlyGString=&yyextra->current->initializer; + yyextra->curlyCount=0; + yyextra->current->initializer+=*yytext; BEGIN(GCopyCurly); } <ReadInitializer>[;,] { - //printf(">> initializer '%s' <<\n",current->initializer.data()); - if (*yytext==';' && (current_root->spec&Entry::Enum)) - { - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - current->args = current->args.simplifyWhiteSpace(); - current->name = current->name.stripWhiteSpace(); - current->section = Entry::VARIABLE_SEC; - current_root->moveToSubEntryAndRefresh(current); - initEntry(); + //printf(">> initializer '%s' <<\n",yyextra->current->initializer.data()); + if (*yytext==';' && (yyextra->current_root->spec&Entry::Enum)) + { + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->args = yyextra->current->args.simplifyWhiteSpace(); + yyextra->current->name = yyextra->current->name.stripWhiteSpace(); + yyextra->current->section = Entry::VARIABLE_SEC; + yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current); + initEntry(yyscanner); BEGIN(FindMembers); } - else if (*yytext==';' || (lastInitializerContext==FindFields && initBracketCount==0)) // initBracketCount==0 was added for bug 665778 + else if (*yytext==';' || (yyextra->lastInitializerContext==FindFields && yyextra->initBracketCount==0)) // yyextra->initBracketCount==0 was added for bug 665778 { unput(*yytext); - BEGIN(lastInitializerContext); + BEGIN(yyextra->lastInitializerContext); } - else if (*yytext==',' && initBracketCount==0) // for "int a=0,b=0" + else if (*yytext==',' && yyextra->initBracketCount==0) // for "int a=0,b=0" { unput(*yytext); - BEGIN(lastInitializerContext); + BEGIN(yyextra->lastInitializerContext); } else { - current->initializer+=*yytext; + yyextra->current->initializer+=*yytext; } } <ReadInitializer>{RAWBEGIN} { // C++11 raw string - if (!insideCpp) + if (!yyextra->insideCpp) { REJECT; } else { QCString text=yytext; - current->initializer+=text; + yyextra->current->initializer+=text; int i=text.find('"'); - g_delimiter = yytext+i+1; - g_delimiter=g_delimiter.left(g_delimiter.length()-1); - lastRawStringContext = YY_START; - pCopyRawGString = ¤t->initializer; + yyextra->delimiter = yytext+i+1; + yyextra->delimiter=yyextra->delimiter.left(yyextra->delimiter.length()-1); + yyextra->lastRawStringContext = YY_START; + yyextra->pCopyRawGString = &yyextra->current->initializer; BEGIN(RawGString); //printf("RawGString delimiter='%s'\n",delimiter.data()); } } <RawGString>{RAWEND} { - *pCopyRawGString+=yytext; + *yyextra->pCopyRawGString+=yytext; QCString delimiter = yytext+1; delimiter=delimiter.left(delimiter.length()-1); - if (delimiter==g_delimiter) + if (delimiter==yyextra->delimiter) { - BEGIN(lastRawStringContext); + BEGIN(yyextra->lastRawStringContext); } } <RawGString>[^)\n]+ { - *pCopyRawGString+=yytext; + *yyextra->pCopyRawGString+=yytext; } <RawGString>. { - *pCopyRawGString+=yytext; + *yyextra->pCopyRawGString+=yytext; } <RawGString>\n { - *pCopyRawGString+=yytext; - lineCount(); + *yyextra->pCopyRawGString+=yytext; + lineCount(yyscanner); } <RawString>{RAWEND} { - *pCopyRawString+=yytext; - fullArgString+=yytext; + *yyextra->pCopyRawString+=yytext; + yyextra->fullArgString+=yytext; QCString delimiter = yytext+1; delimiter=delimiter.left(delimiter.length()-1); - if (delimiter==g_delimiter) + if (delimiter==yyextra->delimiter) { - BEGIN(lastRawStringContext); + BEGIN(yyextra->lastRawStringContext); } } <RawString>[^)]+ { - *pCopyRawString+=yytext; - fullArgString+=yytext; + *yyextra->pCopyRawString+=yytext; + yyextra->fullArgString+=yytext; } <RawString>. { - *pCopyRawString+=yytext; - fullArgString+=yytext; + *yyextra->pCopyRawString+=yytext; + yyextra->fullArgString+=yytext; } <RawString>\n { - *pCopyRawString+=yytext; - fullArgString+=yytext; - lineCount(); + *yyextra->pCopyRawString+=yytext; + yyextra->fullArgString+=yytext; + lineCount(yyscanner); } <ReadInitializer>\" { - if (insideIDL && insideCppQuote) + if (yyextra->insideIDL && yyextra->insideCppQuote) { BEGIN(EndCppQuote); } else { - lastStringContext=YY_START; - current->initializer+=yytext; - pCopyQuotedGString=¤t->initializer; + yyextra->lastStringContext=YY_START; + yyextra->current->initializer+=yytext; + yyextra->pCopyQuotedGString=&yyextra->current->initializer; BEGIN(CopyGString); } } <ReadInitializer>"->" { - current->initializer+=yytext; + yyextra->current->initializer+=yytext; } <ReadInitializer>"<<" { - current->initializer+=yytext; + yyextra->current->initializer+=yytext; } <ReadInitializer>">>" { - current->initializer+=yytext; + yyextra->current->initializer+=yytext; } <ReadInitializer>[<\[{(] { - initBracketCount++; - current->initializer+=*yytext; + yyextra->initBracketCount++; + yyextra->current->initializer+=*yytext; } <ReadInitializer>[>\]})] { - initBracketCount--; - current->initializer+=*yytext; + yyextra->initBracketCount--; + yyextra->current->initializer+=*yytext; } <ReadInitializer>\' { - if (insidePHP) + if (yyextra->insidePHP) { - current->initializer+=yytext; - pCopyQuotedGString = ¤t->initializer; - lastStringContext=YY_START; + yyextra->current->initializer+=yytext; + yyextra->pCopyQuotedGString = &yyextra->current->initializer; + yyextra->lastStringContext=YY_START; BEGIN(CopyPHPGString); } else { - current->initializer+=yytext; + yyextra->current->initializer+=yytext; } } <ReadInitializer>{CHARLIT} { - if (insidePHP) + if (yyextra->insidePHP) { REJECT; } else { - current->initializer+=yytext; + yyextra->current->initializer+=yytext; } } <ReadInitializer>\n { - current->initializer+=*yytext; - lineCount(); + yyextra->current->initializer+=*yytext; + lineCount(yyscanner); } <ReadInitializer>"@\"" { - //printf("insideCS=%d\n",insideCS); - current->initializer+=yytext; - if (!insideCS && !insideObjC) + //printf("yyextra->insideCS=%d\n",yyextra->insideCS); + yyextra->current->initializer+=yytext; + if (!yyextra->insideCS && !yyextra->insideObjC) { REJECT; } else { // C#/ObjC verbatim string - lastSkipVerbStringContext=YY_START; - pSkipVerbString=¤t->initializer; + yyextra->lastSkipVerbStringContext=YY_START; + yyextra->pSkipVerbString=&yyextra->current->initializer; BEGIN(SkipVerbString); } } <SkipVerbString>[^\n"]+ { - *pSkipVerbString+=yytext; + *yyextra->pSkipVerbString+=yytext; } <SkipVerbString>"\"\"" { // quote escape - *pSkipVerbString+=yytext; + *yyextra->pSkipVerbString+=yytext; } <SkipVerbString>"\"" { - *pSkipVerbString+=*yytext; - BEGIN(lastSkipVerbStringContext); + *yyextra->pSkipVerbString+=*yytext; + BEGIN(yyextra->lastSkipVerbStringContext); } <SkipVerbString>\n { - *pSkipVerbString+=*yytext; - lineCount(); + *yyextra->pSkipVerbString+=*yytext; + lineCount(yyscanner); } <SkipVerbString>. { - *pSkipVerbString+=*yytext; + *yyextra->pSkipVerbString+=*yytext; } <ReadInitializer>"?>" { - if (insidePHP) + if (yyextra->insidePHP) BEGIN( FindMembersPHP ); else - current->initializer+=yytext; + yyextra->current->initializer+=yytext; } <ReadInitializer>. { - current->initializer+=*yytext; + yyextra->current->initializer+=*yytext; } /* generic quoted string copy rules */ <CopyString,CopyPHPString>\\. { - *pCopyQuotedString+=yytext; + *yyextra->pCopyQuotedString+=yytext; } <CopyString>\" { - *pCopyQuotedString+=*yytext; - BEGIN( lastStringContext ); + *yyextra->pCopyQuotedString+=*yytext; + BEGIN( yyextra->lastStringContext ); } <CopyPHPString>\' { - *pCopyQuotedString+=*yytext; - BEGIN( lastStringContext ); + *yyextra->pCopyQuotedString+=*yytext; + BEGIN( yyextra->lastStringContext ); } <CopyString,CopyPHPString>"/*"|"*/"|"//" { - *pCopyQuotedString+=yytext; + *yyextra->pCopyQuotedString+=yytext; } <CopyString,CopyPHPString>\n { - *pCopyQuotedString+=*yytext; - lineCount(); + *yyextra->pCopyQuotedString+=*yytext; + lineCount(yyscanner); } <CopyString,CopyPHPString>. { - *pCopyQuotedString+=*yytext; + *yyextra->pCopyQuotedString+=*yytext; } /* generic quoted growable string copy rules */ <CopyGString,CopyPHPGString>\\. { - *pCopyQuotedGString+=yytext; + *yyextra->pCopyQuotedGString+=yytext; } <CopyGString>\" { - *pCopyQuotedGString+=*yytext; - BEGIN( lastStringContext ); + *yyextra->pCopyQuotedGString+=*yytext; + BEGIN( yyextra->lastStringContext ); } <CopyPHPGString>\' { - *pCopyQuotedGString+=*yytext; - BEGIN( lastStringContext ); + *yyextra->pCopyQuotedGString+=*yytext; + BEGIN( yyextra->lastStringContext ); } <CopyGString,CopyPHPGString>"<?php" { // we had an odd number of quotes. - *pCopyQuotedGString += yytext; - BEGIN( lastStringContext ); + *yyextra->pCopyQuotedGString += yytext; + BEGIN( yyextra->lastStringContext ); } <CopyGString,CopyPHPGString>"/*"|"*/"|"//" { - *pCopyQuotedGString+=yytext; + *yyextra->pCopyQuotedGString+=yytext; } <CopyGString,CopyPHPGString>\n { - *pCopyQuotedGString+=*yytext; - lineCount(); + *yyextra->pCopyQuotedGString+=*yytext; + lineCount(yyscanner); } <CopyGString,CopyPHPGString>. { - *pCopyQuotedGString+=*yytext; + *yyextra->pCopyQuotedGString+=*yytext; } /* generic round bracket list copy rules */ <CopyRound>\" { - *pCopyRoundString+=*yytext; - pCopyQuotedString=pCopyRoundString; - lastStringContext=YY_START; + *yyextra->pCopyRoundString+=*yytext; + yyextra->pCopyQuotedString=yyextra->pCopyRoundString; + yyextra->lastStringContext=YY_START; BEGIN(CopyString); } <CopyRound>"(" { - *pCopyRoundString+=*yytext; - roundCount++; + *yyextra->pCopyRoundString+=*yytext; + yyextra->roundCount++; } <CopyRound>")" { - *pCopyRoundString+=*yytext; - if (--roundCount<0) - BEGIN(lastRoundContext); + *yyextra->pCopyRoundString+=*yytext; + if (--yyextra->roundCount<0) + BEGIN(yyextra->lastRoundContext); } <CopyRound>\n { - lineCount(); - *pCopyRoundString+=*yytext; + lineCount(yyscanner); + *yyextra->pCopyRoundString+=*yytext; } <CopyRound>\' { - if (insidePHP) + if (yyextra->insidePHP) { - current->initializer+=yytext; - pCopyQuotedString = pCopyRoundString; - lastStringContext=YY_START; + yyextra->current->initializer+=yytext; + yyextra->pCopyQuotedString = yyextra->pCopyRoundString; + yyextra->lastStringContext=YY_START; BEGIN(CopyPHPString); } else { - *pCopyRoundString+=yytext; + *yyextra->pCopyRoundString+=yytext; } } <CopyRound>{CHARLIT} { - if (insidePHP) + if (yyextra->insidePHP) { REJECT; } else { - *pCopyRoundString+=yytext; + *yyextra->pCopyRoundString+=yytext; } } <CopyRound>[^"'()\n]+ { - *pCopyRoundString+=yytext; + *yyextra->pCopyRoundString+=yytext; } <CopyRound>. { - *pCopyRoundString+=*yytext; + *yyextra->pCopyRoundString+=*yytext; } /* generic round bracket list copy rules for growable strings */ <GCopyRound>\" { - *pCopyRoundGString+=*yytext; - pCopyQuotedGString=pCopyRoundGString; - lastStringContext=YY_START; + *yyextra->pCopyRoundGString+=*yytext; + yyextra->pCopyQuotedGString=yyextra->pCopyRoundGString; + yyextra->lastStringContext=YY_START; BEGIN(CopyGString); } <GCopyRound>"(" { - *pCopyRoundGString+=*yytext; - roundCount++; + *yyextra->pCopyRoundGString+=*yytext; + yyextra->roundCount++; } <GCopyRound>")" { - *pCopyRoundGString+=*yytext; - if (--roundCount<0) - BEGIN(lastRoundContext); + *yyextra->pCopyRoundGString+=*yytext; + if (--yyextra->roundCount<0) + BEGIN(yyextra->lastRoundContext); } <GCopyRound>\n { - lineCount(); - *pCopyRoundGString+=*yytext; + lineCount(yyscanner); + *yyextra->pCopyRoundGString+=*yytext; } <GCopyRound>\' { - if (insidePHP) + if (yyextra->insidePHP) { - current->initializer+=yytext; - pCopyQuotedGString = pCopyRoundGString; - lastStringContext=YY_START; + yyextra->current->initializer+=yytext; + yyextra->pCopyQuotedGString = yyextra->pCopyRoundGString; + yyextra->lastStringContext=YY_START; BEGIN(CopyPHPGString); } else { - *pCopyRoundGString+=yytext; + *yyextra->pCopyRoundGString+=yytext; } } <GCopyRound>{CHARLIT} { - if (insidePHP) + if (yyextra->insidePHP) { REJECT; } else { - *pCopyRoundGString+=yytext; + *yyextra->pCopyRoundGString+=yytext; } } <GCopyRound>[^"'()\n/]+ { - *pCopyRoundGString+=yytext; + *yyextra->pCopyRoundGString+=yytext; } <GCopyRound>. { - *pCopyRoundGString+=*yytext; + *yyextra->pCopyRoundGString+=*yytext; } - /* generic square bracket list copy rules for growable strings, we should only enter here in case of php, left the test part as in GCopyRound to keep it compatible with te round bracket version */ + /* generic square bracket list copy rules for growable strings, we should only enter here in case of php, left the test part as in GCopyRound to keep it compatible with the round bracket version */ <GCopySquare>\" { - *pCopySquareGString+=*yytext; - pCopyQuotedGString=pCopySquareGString; - lastStringContext=YY_START; + *yyextra->pCopySquareGString+=*yytext; + yyextra->pCopyQuotedGString=yyextra->pCopySquareGString; + yyextra->lastStringContext=YY_START; BEGIN(CopyGString); } <GCopySquare>"[" { - *pCopySquareGString+=*yytext; - squareCount++; + *yyextra->pCopySquareGString+=*yytext; + yyextra->squareCount++; } <GCopySquare>"]" { - *pCopySquareGString+=*yytext; - if (--squareCount<0) - BEGIN(lastSquareContext); + *yyextra->pCopySquareGString+=*yytext; + if (--yyextra->squareCount<0) + BEGIN(yyextra->lastSquareContext); } <GCopySquare>\n { - lineCount(); - *pCopySquareGString+=*yytext; + lineCount(yyscanner); + *yyextra->pCopySquareGString+=*yytext; } <GCopySquare>\' { - if (insidePHP) + if (yyextra->insidePHP) { - current->initializer+=yytext; - pCopyQuotedGString = pCopySquareGString; - lastStringContext=YY_START; + yyextra->current->initializer+=yytext; + yyextra->pCopyQuotedGString = yyextra->pCopySquareGString; + yyextra->lastStringContext=YY_START; BEGIN(CopyPHPGString); } else { - *pCopySquareGString+=yytext; + *yyextra->pCopySquareGString+=yytext; } } <GCopySquare>{CHARLIT} { - if (insidePHP) + if (yyextra->insidePHP) { REJECT; } else { - *pCopySquareGString+=yytext; + *yyextra->pCopySquareGString+=yytext; } } <GCopySquare>[^"\[\]\n/]+ { - *pCopySquareGString+=yytext; + *yyextra->pCopySquareGString+=yytext; } <GCopySquare>. { - *pCopySquareGString+=*yytext; + *yyextra->pCopySquareGString+=*yytext; } /* generic curly bracket list copy rules */ <CopyCurly>\" { - *pCopyCurlyString+=*yytext; - pCopyQuotedString=pCopyCurlyString; - lastStringContext=YY_START; + *yyextra->pCopyCurlyString+=*yytext; + yyextra->pCopyQuotedString=yyextra->pCopyCurlyString; + yyextra->lastStringContext=YY_START; BEGIN(CopyString); } <CopyCurly>\' { - *pCopyCurlyString+=*yytext; - if (insidePHP) + *yyextra->pCopyCurlyString+=*yytext; + if (yyextra->insidePHP) { - pCopyQuotedString=pCopyCurlyString; - lastStringContext=YY_START; + yyextra->pCopyQuotedString=yyextra->pCopyCurlyString; + yyextra->lastStringContext=YY_START; BEGIN(CopyPHPString); } } <CopyCurly>"{" { - *pCopyCurlyString+=*yytext; - curlyCount++; + *yyextra->pCopyCurlyString+=*yytext; + yyextra->curlyCount++; } <CopyCurly>"}" { - *pCopyCurlyString+=*yytext; - if (--curlyCount<0) - BEGIN(lastCurlyContext); + *yyextra->pCopyCurlyString+=*yytext; + if (--yyextra->curlyCount<0) + BEGIN(yyextra->lastCurlyContext); } -<CopyCurly>{CHARLIT} { if (insidePHP) +<CopyCurly>{CHARLIT} { if (yyextra->insidePHP) { REJECT; } else { - *pCopyCurlyString+=yytext; + *yyextra->pCopyCurlyString+=yytext; } } <CopyCurly>[^"'{}\/\n]+ { - *pCopyCurlyString+=yytext; + *yyextra->pCopyCurlyString+=yytext; } -<CopyCurly>"/" { *pCopyCurlyString+=yytext; } +<CopyCurly>"/" { *yyextra->pCopyCurlyString+=yytext; } <CopyCurly>\n { - lineCount(); - *pCopyCurlyString+=*yytext; + lineCount(yyscanner); + *yyextra->pCopyCurlyString+=*yytext; } <CopyCurly>. { - *pCopyCurlyString+=*yytext; + *yyextra->pCopyCurlyString+=*yytext; } /* generic curly bracket list copy rules for growable strings */ @@ -3333,444 +3015,444 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) QCString line = QCString(yytext); int s = line.find(' '); int e = line.find('"',s); - yyLineNr = line.mid(s,e-s).toInt(); + yyextra->yyLineNr = line.mid(s,e-s).toInt(); if (yytext[yyleng-1]=='\n') { - lineCount(); - g_column=0; + lineCount(yyscanner); + yyextra->column=0; } } <GCopyCurly>\" { - *pCopyCurlyGString+=*yytext; - pCopyQuotedGString=pCopyCurlyGString; - lastStringContext=YY_START; + *yyextra->pCopyCurlyGString+=*yytext; + yyextra->pCopyQuotedGString=yyextra->pCopyCurlyGString; + yyextra->lastStringContext=YY_START; BEGIN(CopyGString); } <GCopyCurly>\' { - *pCopyCurlyGString+=*yytext; - if (insidePHP) + *yyextra->pCopyCurlyGString+=*yytext; + if (yyextra->insidePHP) { - pCopyQuotedGString=pCopyCurlyGString; - lastStringContext=YY_START; + yyextra->pCopyQuotedGString=yyextra->pCopyCurlyGString; + yyextra->lastStringContext=YY_START; BEGIN(CopyPHPGString); } } <GCopyCurly>"{" { - *pCopyCurlyGString+=*yytext; - curlyCount++; + *yyextra->pCopyCurlyGString+=*yytext; + yyextra->curlyCount++; } <GCopyCurly>"}" { - *pCopyCurlyGString+=*yytext; - if (--curlyCount<0) - BEGIN(lastCurlyContext); + *yyextra->pCopyCurlyGString+=*yytext; + if (--yyextra->curlyCount<0) + BEGIN(yyextra->lastCurlyContext); } -<GCopyCurly>{CHARLIT} { if (insidePHP) +<GCopyCurly>{CHARLIT} { if (yyextra->insidePHP) { REJECT; } else { - *pCopyCurlyGString+=yytext; + *yyextra->pCopyCurlyGString+=yytext; } } <GCopyCurly>[^"'{}\/\n,]+ { - *pCopyCurlyGString+=yytext; + *yyextra->pCopyCurlyGString+=yytext; } <GCopyCurly>[,]+ { - *pCopyCurlyGString+=yytext; + *yyextra->pCopyCurlyGString+=yytext; } -<GCopyCurly>"/" { *pCopyCurlyGString+=yytext; } +<GCopyCurly>"/" { *yyextra->pCopyCurlyGString+=yytext; } <GCopyCurly>\n { - lineCount(); - *pCopyCurlyGString+=*yytext; + lineCount(yyscanner); + *yyextra->pCopyCurlyGString+=*yytext; } <GCopyCurly>. { - *pCopyCurlyGString+=*yytext; + *yyextra->pCopyCurlyGString+=*yytext; } /* ---------------------- */ <FindMembers>":" { - if (current->type.isEmpty() && - current->name=="enum") // see bug 69041, C++11 style anon enum: 'enum : unsigned int {...}' + if (yyextra->current->type.isEmpty() && + yyextra->current->name=="enum") // see bug 69041, C++11 style anon enum: 'enum : unsigned int {...}' { - current->section=Entry::ENUM_SEC; - current->name.resize(0); - current->args.resize(0); + yyextra->current->section=Entry::ENUM_SEC; + yyextra->current->name.resize(0); + yyextra->current->args.resize(0); BEGIN(EnumBaseType); } else { - if (current->type.isEmpty()) // anonymous padding field, e.g. "int :7;" + if (yyextra->current->type.isEmpty()) // anonymous padding field, e.g. "int :7;" { - addType(); - current->name.sprintf("__pad%d__",padCount++); + addType(yyscanner); + yyextra->current->name.sprintf("__pad%d__",yyextra->padCount++); } BEGIN(BitFields); - current->bitfields+=":"; + yyextra->current->bitfields+=":"; } } <BitFields>. { - current->bitfields+=*yytext; + yyextra->current->bitfields+=*yytext; } <EnumBaseType>. { - current->args+=*yytext; + yyextra->current->args+=*yytext; } <EnumBaseType>\n { - lineCount(); - current->args+=' '; + lineCount(yyscanner); + yyextra->current->args+=' '; } <FindMembers>[;,] { - QCString oldType = current->type; - if (current->bodyLine==-1) + QCString oldType = yyextra->current->type; + if (yyextra->current->bodyLine==-1) { - current->bodyLine = yyLineNr; + yyextra->current->bodyLine = yyextra->yyLineNr; } - if ( insidePHP && current->type.left(3) == "var" ) + if ( yyextra->insidePHP && yyextra->current->type.left(3) == "var" ) { - current->type = current->type.mid(3); + yyextra->current->type = yyextra->current->type.mid(3); } - if (isTypedef && current->type.left(8)!="typedef ") + if (yyextra->isTypedef && yyextra->current->type.left(8)!="typedef ") { - current->type.prepend("typedef "); + yyextra->current->type.prepend("typedef "); } - bool stat = current->stat; - if (!current->name.isEmpty() && current->section!=Entry::ENUM_SEC) + bool stat = yyextra->current->stat; + if (!yyextra->current->name.isEmpty() && yyextra->current->section!=Entry::ENUM_SEC) { - current->type=current->type.simplifyWhiteSpace(); - current->args=removeRedundantWhiteSpace(current->args); - current->name=current->name.stripWhiteSpace(); - if (current->section==Entry::CLASS_SEC) // remove spec for "struct Bla bla;" + yyextra->current->type=yyextra->current->type.simplifyWhiteSpace(); + yyextra->current->args=removeRedundantWhiteSpace(yyextra->current->args); + yyextra->current->name=yyextra->current->name.stripWhiteSpace(); + if (yyextra->current->section==Entry::CLASS_SEC) // remove spec for "struct Bla bla;" { - current->spec = 0; + yyextra->current->spec = 0; } - current->section = Entry::VARIABLE_SEC ; - current->fileName = yyFileName; - current->startLine = yyBegLineNr; - current->startColumn = yyBegColNr; - current_root->moveToSubEntryAndRefresh( current ) ; - initEntry(); + yyextra->current->section = Entry::VARIABLE_SEC ; + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyBegLineNr; + yyextra->current->startColumn = yyextra->yyBegColNr; + yyextra->current_root->moveToSubEntryAndRefresh( yyextra->current ) ; + initEntry(yyscanner); } if ( *yytext == ',') { - current->stat = stat; // the static attribute holds for all variables - current->name.resize(0); - current->args.resize(0); - current->brief.resize(0); - current->doc.resize(0); - current->initializer.resize(0); - current->bitfields.resize(0); + yyextra->current->stat = stat; // the static attribute holds for all variables + yyextra->current->name.resize(0); + yyextra->current->args.resize(0); + yyextra->current->brief.resize(0); + yyextra->current->doc.resize(0); + yyextra->current->initializer.resize(0); + yyextra->current->bitfields.resize(0); int i=oldType.length(); while (i>0 && (oldType[i-1]=='*' || oldType[i-1]=='&' || oldType[i-1]==' ')) i--; - current->type = oldType.left(i); + yyextra->current->type = oldType.left(i); } else { - mtype = Method; - virt = Normal; - current->groups.clear(); - initEntry(); + yyextra->mtype = Method; + yyextra->virt = Normal; + yyextra->current->groups.clear(); + initEntry(yyscanner); } } <FindMembers>"[" { - if (insideSlice) + if (yyextra->insideSlice) { - squareCount=1; - lastSquareContext = YY_START; - current->metaData += "["; + yyextra->squareCount=1; + yyextra->lastSquareContext = YY_START; + yyextra->current->metaData += "["; BEGIN( SliceMetadata ); } - else if (!insideCS && - (current->name.isEmpty() || - current->name=="typedef" + else if (!yyextra->insideCS && + (yyextra->current->name.isEmpty() || + yyextra->current->name=="typedef" ) ) // IDL function property { - squareCount=1; - lastSquareContext = YY_START; - idlAttr.resize(0); - idlProp.resize(0); - current->mtype = mtype; + yyextra->squareCount=1; + yyextra->lastSquareContext = YY_START; + yyextra->idlAttr.resize(0); + yyextra->idlProp.resize(0); + yyextra->current->mtype = yyextra->mtype; if (Config_getBool(IDL_PROPERTY_SUPPORT) && - current->mtype == Property) - { // we are inside the properties section of a dispinterface - odlProp = true; - current->spec |= Entry::Gettable; - current->spec |= Entry::Settable; + yyextra->current->mtype == Property) + { // we are yyextra->inside the properties section of a dispinterface + yyextra->odlProp = true; + yyextra->current->spec |= Entry::Gettable; + yyextra->current->spec |= Entry::Settable; } BEGIN( IDLAttribute ); } - else if (insideCS && - current->name.isEmpty()) + else if (yyextra->insideCS && + yyextra->current->name.isEmpty()) { - squareCount=1; - lastSquareContext = YY_START; + yyextra->squareCount=1; + yyextra->lastSquareContext = YY_START; // Skip the C# attribute // for this member - current->args.resize(0); + yyextra->current->args.resize(0); BEGIN( SkipSquare ); } else { - current->args += yytext ; - squareCount=1; - externC=FALSE; // see bug759247 + yyextra->current->args += yytext ; + yyextra->squareCount=1; + yyextra->externC=FALSE; // see bug759247 BEGIN( Array ) ; } } <SliceMetadata>"[" { // Global metadata. - squareCount++; - current->metaData += "["; + yyextra->squareCount++; + yyextra->current->metaData += "["; } <SliceMetadata>{BN}* { - lineCount(); + lineCount(yyscanner); } <SliceMetadata>\"[^\"]*\" { - current->metaData += yytext; + yyextra->current->metaData += yytext; } <SliceMetadata>"," { - current->metaData += yytext; + yyextra->current->metaData += yytext; } <SliceMetadata>"]" { - current->metaData += yytext; - if (--squareCount<=0) + yyextra->current->metaData += yytext; + if (--yyextra->squareCount<=0) { - BEGIN (lastSquareContext); + BEGIN (yyextra->lastSquareContext); } } <SliceOptional>"(" { - current->type += "("; - roundCount++; + yyextra->current->type += "("; + yyextra->roundCount++; } <SliceOptional>[0-9]+ { - current->type += yytext; + yyextra->current->type += yytext; } <SliceOptional>")" { - current->type += ")"; - if(--roundCount<=0) + yyextra->current->type += ")"; + if(--yyextra->roundCount<=0) { - BEGIN (lastModifierContext); + BEGIN (yyextra->lastModifierContext); } } <IDLAttribute>"]" { // end of IDL function attribute - if (--squareCount<=0) + if (--yyextra->squareCount<=0) { - lineCount(); - if (current->mtype == Property) + lineCount(yyscanner); + if (yyextra->current->mtype == Property) BEGIN( IDLPropName ); else - BEGIN( lastSquareContext ); + BEGIN( yyextra->lastSquareContext ); } } <IDLAttribute>"propput" { if (Config_getBool(IDL_PROPERTY_SUPPORT)) { - current->mtype = Property; + yyextra->current->mtype = Property; } - current->spec |= Entry::Settable; + yyextra->current->spec |= Entry::Settable; } <IDLAttribute>"propget" { if (Config_getBool(IDL_PROPERTY_SUPPORT)) { - current->mtype = Property; + yyextra->current->mtype = Property; } - current->spec |= Entry::Gettable; + yyextra->current->spec |= Entry::Gettable; } <IDLAttribute>"property" { // UNO IDL property - current->spec |= Entry::Property; + yyextra->current->spec |= Entry::Property; } <IDLAttribute>"attribute" { // UNO IDL attribute - current->spec |= Entry::Attribute; + yyextra->current->spec |= Entry::Attribute; } <IDLAttribute>"optional" { // on UNO IDL interface/service/attribute/property - current->spec |= Entry::Optional; + yyextra->current->spec |= Entry::Optional; } <IDLAttribute>"readonly" { // on UNO IDL attribute or property - if (Config_getBool(IDL_PROPERTY_SUPPORT) && odlProp) + if (Config_getBool(IDL_PROPERTY_SUPPORT) && yyextra->odlProp) { - current->spec ^= Entry::Settable; + yyextra->current->spec ^= Entry::Settable; } else { - current->spec |= Entry::Readonly; + yyextra->current->spec |= Entry::Readonly; } } <IDLAttribute>"bound" { // on UNO IDL attribute or property - current->spec |= Entry::Bound; + yyextra->current->spec |= Entry::Bound; } <IDLAttribute>"removable" { // on UNO IDL property - current->spec |= Entry::Removable; + yyextra->current->spec |= Entry::Removable; } <IDLAttribute>"constrained" { // on UNO IDL property - current->spec |= Entry::Constrained; + yyextra->current->spec |= Entry::Constrained; } <IDLAttribute>"transient" { // on UNO IDL property - current->spec |= Entry::Transient; + yyextra->current->spec |= Entry::Transient; } <IDLAttribute>"maybevoid" { // on UNO IDL property - current->spec |= Entry::MaybeVoid; + yyextra->current->spec |= Entry::MaybeVoid; } <IDLAttribute>"maybedefault" { // on UNO IDL property - current->spec |= Entry::MaybeDefault; + yyextra->current->spec |= Entry::MaybeDefault; } <IDLAttribute>"maybeambiguous" { // on UNO IDL property - current->spec |= Entry::MaybeAmbiguous; + yyextra->current->spec |= Entry::MaybeAmbiguous; } <IDLAttribute>. { } <IDLPropName>{BN}*{ID}{BN}* { // return type (probably HRESULT) - skip it - if (odlProp) + if (yyextra->odlProp) { // property type - idlProp = yytext; + yyextra->idlProp = yytext; } } <IDLPropName>{ID}{BN}*"(" { - current->name = yytext; - current->name = current->name.left(current->name.length()-1).stripWhiteSpace(); - current->startLine = yyLineNr; - current->startColumn = yyColNr; + yyextra->current->name = yytext; + yyextra->current->name = yyextra->current->name.left(yyextra->current->name.length()-1).stripWhiteSpace(); + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; BEGIN( IDLProp ); } <IDLPropName>{BN}*"("{BN}*{ID}{BN}*")"{BN}* { - if (odlProp) + if (yyextra->odlProp) { - idlProp += yytext; + yyextra->idlProp += yytext; } } <IDLPropName>{ID}{BN}*/";" { - if (odlProp) + if (yyextra->odlProp) { - current->name = yytext; - idlProp = idlProp.stripWhiteSpace(); - odlProp = false; + yyextra->current->name = yytext; + yyextra->idlProp = yyextra->idlProp.stripWhiteSpace(); + yyextra->odlProp = false; BEGIN( IDLProp ); } } <IDLProp>{BN}*"["[^\]]*"]"{BN}* { // attribute of a parameter - idlAttr = yytext; - idlAttr=idlAttr.stripWhiteSpace(); + yyextra->idlAttr = yytext; + yyextra->idlAttr=yyextra->idlAttr.stripWhiteSpace(); } <IDLProp>{ID} { // property type - idlProp = yytext; + yyextra->idlProp = yytext; } <IDLProp>{BN}*{ID}{BN}*"," { // Rare: Another parameter ([propput] HRESULT Item(int index, [in] Type theRealProperty);) - if (!current->args) - current->args = "("; + if (!yyextra->current->args) + yyextra->current->args = "("; else - current->args += ", "; - current->args += idlAttr; - current->args += " "; - current->args += idlProp; // prop was actually type of extra parameter - current->args += " "; - current->args += yytext; - current->args = current->args.left(current->args.length() - 1); // strip comma - idlProp.resize(0); - idlAttr.resize(0); + yyextra->current->args += ", "; + yyextra->current->args += yyextra->idlAttr; + yyextra->current->args += " "; + yyextra->current->args += yyextra->idlProp; // prop was actually type of extra parameter + yyextra->current->args += " "; + yyextra->current->args += yytext; + yyextra->current->args = yyextra->current->args.left(yyextra->current->args.length() - 1); // strip comma + yyextra->idlProp.resize(0); + yyextra->idlAttr.resize(0); BEGIN( IDLProp ); } <IDLProp>{BN}*{ID}{BN}*")"{BN}* { // the parameter name for the property - just skip. } <IDLProp>";" { - current->fileName = yyFileName; - current->type = idlProp; - current->args = current->args.simplifyWhiteSpace(); - if (current->args) - current->args += ")"; - current->name = current->name.stripWhiteSpace(); - current->section = Entry::VARIABLE_SEC; - current_root->moveToSubEntryAndRefresh(current); - initEntry(); + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->type = yyextra->idlProp; + yyextra->current->args = yyextra->current->args.simplifyWhiteSpace(); + if (yyextra->current->args) + yyextra->current->args += ")"; + yyextra->current->name = yyextra->current->name.stripWhiteSpace(); + yyextra->current->section = Entry::VARIABLE_SEC; + yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current); + initEntry(yyscanner); BEGIN( FindMembers ); } <IDLProp>. { // spaces, *, or other stuff - //idlProp+=yytext; + //yyextra->idlProp+=yytext; } -<Array>"]" { current->args += *yytext ; - if (--squareCount<=0) +<Array>"]" { yyextra->current->args += *yytext ; + if (--yyextra->squareCount<=0) BEGIN( FindMembers ) ; } -<FuncFuncArray>"]" { current->args += *yytext ; - if (--squareCount<=0) +<FuncFuncArray>"]" { yyextra->current->args += *yytext ; + if (--yyextra->squareCount<=0) BEGIN( Function ) ; } -<Array,FuncFuncArray>"[" { current->args += *yytext ; - squareCount++; +<Array,FuncFuncArray>"[" { yyextra->current->args += *yytext ; + yyextra->squareCount++; } -<Array,FuncFuncArray>. { current->args += *yytext ; } -<SkipSquare>"[" { squareCount++; } +<Array,FuncFuncArray>. { yyextra->current->args += *yytext ; } +<SkipSquare>"[" { yyextra->squareCount++; } <SkipSquare>"]" { - if (--squareCount<=0) - BEGIN( lastSquareContext ); + if (--yyextra->squareCount<=0) + BEGIN( yyextra->lastSquareContext ); } <SkipSquare>\" { - lastStringContext=YY_START; + yyextra->lastStringContext=YY_START; BEGIN( SkipString ); } <SkipSquare>[^\n\[\]\"]+ -<FindMembers>"<" { addType(); - current->type += yytext ; +<FindMembers>"<" { addType(yyscanner); + yyextra->current->type += yytext ; BEGIN( Sharp ) ; } -<Sharp>">" { current->type += *yytext ; - if (--sharpCount<=0) +<Sharp>">" { yyextra->current->type += *yytext ; + if (--yyextra->sharpCount<=0) BEGIN( FindMembers ) ; } -<Sharp>"<" { current->type += *yytext ; - sharpCount++; +<Sharp>"<" { yyextra->current->type += *yytext ; + yyextra->sharpCount++; } <Sharp>{BN}+ { - current->type += ' '; - lineCount(); + yyextra->current->type += ' '; + lineCount(yyscanner); } -<Sharp>. { current->type += *yytext ; } +<Sharp>. { yyextra->current->type += *yytext ; } <FindFields>{ID} { - if (insideCpp || insideObjC) + if (yyextra->insideCpp || yyextra->insideObjC) { - current->id = ClangParser::instance()->lookup(yyLineNr,yytext); + yyextra->current->id = ClangParser::instance()->lookup(yyextra->yyLineNr,yytext); } - current->bodyLine = yyLineNr; - current->name = yytext; + yyextra->current->bodyLine = yyextra->yyLineNr; + yyextra->current->name = yytext; } <FindFields>"(" { // Java enum initializer unput('('); - lastInitializerContext = YY_START; - initBracketCount=0; - current->initializer = "="; + yyextra->lastInitializerContext = YY_START; + yyextra->initBracketCount=0; + yyextra->current->initializer = "="; BEGIN(ReadInitializer); } <FindFields>"=" { - lastInitializerContext = YY_START; - initBracketCount=0; - current->initializer = yytext; + yyextra->lastInitializerContext = YY_START; + yyextra->initBracketCount=0; + yyextra->current->initializer = yytext; BEGIN(ReadInitializer); } <FindFields>";" { - if (insideJava) // last enum field in Java class + if (yyextra->insideJava) // yyextra->last enum field in Java class { - if (!current->name.isEmpty()) + if (!yyextra->current->name.isEmpty()) { - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - if (!(current_root->spec&Entry::Enum)) + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + if (!(yyextra->current_root->spec&Entry::Enum)) { - current->type = "@"; // enum marker + yyextra->current->type = "@"; // enum marker } - current->args = current->args.simplifyWhiteSpace(); - current->name = current->name.stripWhiteSpace(); - current->section = Entry::VARIABLE_SEC; - current_root->moveToSubEntryAndRefresh(current); - initEntry(); + yyextra->current->args = yyextra->current->args.simplifyWhiteSpace(); + yyextra->current->name = yyextra->current->name.stripWhiteSpace(); + yyextra->current->section = Entry::VARIABLE_SEC; + yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current); + initEntry(yyscanner); } BEGIN( FindMembers ); @@ -3781,70 +3463,70 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } } <SkipRemainder>\n { - lineCount(); + lineCount(yyscanner); } <SkipRemainder>[^\n]* <FindFields>"," { //printf("adding '%s' '%s' '%s' to enum '%s' (mGrpId=%d)\n", - // current->type.data(), current->name.data(), - // current->args.data(), current_root->name.data(),current->mGrpId); - if (!current->name.isEmpty()) - { - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->startColumn = yyColNr; - if (!(current_root->spec&Entry::Enum)) + // yyextra->current->type.data(), yyextra->current->name.data(), + // yyextra->current->args.data(), yyextra->current_root->name.data(),yyextra->current->mGrpId); + if (!yyextra->current->name.isEmpty()) + { + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyLineNr; + yyextra->current->startColumn = yyextra->yyColNr; + if (!(yyextra->current_root->spec&Entry::Enum)) { - current->type = "@"; // enum marker + yyextra->current->type = "@"; // enum marker } - current->args = current->args.simplifyWhiteSpace(); - current->name = current->name.stripWhiteSpace(); - current->section = Entry::VARIABLE_SEC; + yyextra->current->args = yyextra->current->args.simplifyWhiteSpace(); + yyextra->current->name = yyextra->current->name.stripWhiteSpace(); + yyextra->current->section = Entry::VARIABLE_SEC; // add to the scope of the enum - if (!insideCS && !insideJava && - !(current_root->spec&Entry::Strong)) + if (!yyextra->insideCS && !yyextra->insideJava && + !(yyextra->current_root->spec&Entry::Strong)) // for C# and Java 1.5+ enum values always have to be explicitly qualified, // same for C++11 style enums (enum class Name {}) { // add to the scope surrounding the enum (copy!) // we cannot during it directly as that would invalidate the iterator in parseCompounds. - //printf("*** adding outer scope entry for %s\n",current->name.data()); - g_outerScopeEntries.emplace_back(current_root->parent(), std::make_unique<Entry>(*current)); + //printf("*** adding outer scope entry for %s\n",yyextra->current->name.data()); + yyextra->outerScopeEntries.emplace_back(yyextra->current_root->parent(), std::make_shared<Entry>(*yyextra->current)); } - current_root->moveToSubEntryAndRefresh(current); - initEntry(); + yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current); + initEntry(yyscanner); } else // probably a redundant , { - current->reset(); - initEntry(); + yyextra->current->reset(); + initEntry(yyscanner); } } <FindFields>"[" { // attribute list in IDL - squareCount=1; - lastSquareContext = YY_START; + yyextra->squareCount=1; + yyextra->lastSquareContext = YY_START; BEGIN(SkipSquare); } /* <FindFieldArg>"," { unput(*yytext); BEGIN(FindFields); } */ -<ReadBody,ReadNSBody,ReadBodyIntf>[^\r\n\#{}"@'/<]* { current->program += yytext ; } -<ReadBody,ReadNSBody,ReadBodyIntf>"//".* { current->program += yytext ; } -<ReadBody,ReadNSBody,ReadBodyIntf>"#".* { if (!insidePHP) +<ReadBody,ReadNSBody,ReadBodyIntf>[^\r\n\#{}"@'/<]* { yyextra->current->program += yytext ; } +<ReadBody,ReadNSBody,ReadBodyIntf>"//".* { yyextra->current->program += yytext ; } +<ReadBody,ReadNSBody,ReadBodyIntf>"#".* { if (!yyextra->insidePHP) REJECT; // append PHP comment. - current->program += yytext ; + yyextra->current->program += yytext ; } -<ReadBody,ReadNSBody,ReadBodyIntf>@\" { current->program += yytext ; - pSkipVerbString = ¤t->program; - lastSkipVerbStringContext=YY_START; +<ReadBody,ReadNSBody,ReadBodyIntf>@\" { yyextra->current->program += yytext ; + yyextra->pSkipVerbString = &yyextra->current->program; + yyextra->lastSkipVerbStringContext=YY_START; BEGIN( SkipVerbString ); } -<ReadBody,ReadNSBody,ReadBodyIntf>"<<<" { if (insidePHP) +<ReadBody,ReadNSBody,ReadBodyIntf>"<<<" { if (yyextra->insidePHP) { - current->program += yytext ; - pCopyHereDocGString = ¤t->program; - lastHereDocContext=YY_START; + yyextra->current->program += yytext ; + yyextra->pCopyHereDocGString = &yyextra->current->program; + yyextra->lastHereDocContext=YY_START; BEGIN( CopyHereDoc ); } else @@ -3852,139 +3534,155 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) REJECT; } } -<ReadBody,ReadNSBody,ReadBodyIntf>\" { current->program += yytext ; - pCopyQuotedGString = ¤t->program; - lastStringContext=YY_START; +<ReadBody,ReadNSBody,ReadBodyIntf>\" { yyextra->current->program += yytext ; + yyextra->pCopyQuotedGString = &yyextra->current->program; + yyextra->lastStringContext=YY_START; BEGIN( CopyGString ); } -<ReadBody,ReadNSBody,ReadBodyIntf>"/*"{B}* { current->program += yytext ; - lastContext = YY_START ; +<ReadBody,ReadNSBody,ReadBodyIntf>"/*"{B}* { yyextra->current->program += yytext ; + yyextra->lastContext = YY_START ; BEGIN( Comment ) ; } -<ReadBody,ReadNSBody,ReadBodyIntf>"/*"{BL} { current->program += yytext ; - ++yyLineNr ; - lastContext = YY_START ; +<ReadBody,ReadNSBody,ReadBodyIntf>"/*"{BL} { yyextra->current->program += yytext ; + ++yyextra->yyLineNr ; + yyextra->lastContext = YY_START ; BEGIN( Comment ) ; } <ReadBody,ReadNSBody,ReadBodyIntf>"'" { - if (!insidePHP) + if (!yyextra->insidePHP) { - current->program += yytext; + yyextra->current->program += yytext; } else { // begin of single quoted string - current->program += yytext; - pCopyQuotedGString = ¤t->program; - lastStringContext=YY_START; + yyextra->current->program += yytext; + yyextra->pCopyQuotedGString = &yyextra->current->program; + yyextra->lastStringContext=YY_START; BEGIN(CopyPHPGString); } } <ReadBody,ReadNSBody,ReadBodyIntf>{CHARLIT} { - if (insidePHP) + if (yyextra->insidePHP) { REJECT; // for PHP code single quotes // are used for strings of arbitrary length } else { - current->program += yytext; + yyextra->current->program += yytext; } } -<ReadBody,ReadNSBody,ReadBodyIntf>"{" { current->program += yytext ; - ++curlyCount ; +<ReadBody,ReadNSBody,ReadBodyIntf>"{" { yyextra->current->program += yytext ; + ++yyextra->curlyCount ; } <ReadBodyIntf>"}" { - current->program += yytext ; - --curlyCount ; + yyextra->current->program += yytext ; + --yyextra->curlyCount ; } -<ReadBody,ReadNSBody>"}" { //err("ReadBody count=%d\n",curlyCount); - if ( curlyCount>0 ) +<ReadBody,ReadNSBody>"}" { //err("ReadBody count=%d\n",yyextra->curlyCount); + if ( yyextra->curlyCount>0 ) { - current->program += yytext ; - --curlyCount ; + yyextra->current->program += yytext ; + --yyextra->curlyCount ; } else { - current->endBodyLine = yyLineNr; - Entry * original_root = current_root; // save root this namespace is in - if (current->section == Entry::NAMESPACE_SEC && current->type == "namespace") + yyextra->current->endBodyLine = yyextra->yyLineNr; + std::shared_ptr<Entry> original_root = yyextra->current_root; // save root this namespace is in + if (yyextra->current->section == Entry::NAMESPACE_SEC && yyextra->current->type == "namespace") { int split_point; - while ((split_point = current->name.find("::")) != -1) + // save documentation values + QCString doc = yyextra->current->doc; + int docLine = yyextra->current->docLine; + QCString docFile = yyextra->current->docFile; + QCString brief = yyextra->current->brief; + int briefLine = yyextra->current->briefLine; + QCString briefFile = yyextra->current->briefFile; + // reset documentation values + yyextra->current->doc = ""; + yyextra->current->docLine = 0; + yyextra->current->docFile = ""; + yyextra->current->brief = ""; + yyextra->current->briefLine = 0; + yyextra->current->briefFile = ""; + while ((split_point = yyextra->current->name.find("::")) != -1) { - std::unique_ptr<Entry> new_current = std::make_unique<Entry>(*current); - current->program = ""; - new_current->doc = ""; - new_current->docLine = 0; - new_current->docFile = ""; - new_current->brief = ""; - new_current->briefLine = 0; - new_current->briefFile = ""; - new_current->name = current->name.mid(split_point + 2); - current->name = current->name.left(split_point); - if (!current_root->name.isEmpty()) current->name.prepend(current_root->name+"::"); - - Entry *tmp = current.get(); - current_root->moveToSubEntryAndKeep(current); - current_root = tmp; - current.swap(new_current); + std::shared_ptr<Entry> new_current = std::make_shared<Entry>(*yyextra->current); + yyextra->current->program = ""; + new_current->name = yyextra->current->name.mid(split_point + 2); + yyextra->current->name = yyextra->current->name.left(split_point); + if (!yyextra->current_root->name.isEmpty()) yyextra->current->name.prepend(yyextra->current_root->name+"::"); + + std::shared_ptr<Entry> tmp = yyextra->current; + yyextra->current_root->moveToSubEntryAndKeep(yyextra->current); + yyextra->current_root = tmp; + + yyextra->current = new_current; } + // restore documentation values + yyextra->current->doc = doc; + yyextra->current->docLine = docLine; + yyextra->current->docFile = docFile; + yyextra->current->brief = brief; + yyextra->current->briefLine = briefLine; + yyextra->current->briefFile = briefFile; } - QCString &cn = current->name; - QCString rn = current_root->name.copy(); - //printf("cn='%s' rn='%s' isTypedef=%d\n",cn.data(),rn.data(),isTypedef); + QCString &cn = yyextra->current->name; + QCString rn = yyextra->current_root->name.copy(); + //printf("cn='%s' rn='%s' yyextra->isTypedef=%d\n",cn.data(),rn.data(),yyextra->isTypedef); if (!cn.isEmpty() && !rn.isEmpty()) { - prependScope(); + prependScope(yyscanner); } - if (isTypedef && cn.isEmpty()) + if (yyextra->isTypedef && cn.isEmpty()) { //printf("Typedef Name\n"); BEGIN( TypedefName ); } else { - if ((current->section == Entry::ENUM_SEC) || (current->spec&Entry::Enum)) + if ((yyextra->current->section == Entry::ENUM_SEC) || (yyextra->current->spec&Entry::Enum)) { - current->program+=','; // add field terminator + yyextra->current->program+=','; // add field terminator } // add compound definition to the tree - current->args=removeRedundantWhiteSpace(current->args); - // was: current->args.simplifyWhiteSpace(); - current->type = current->type.simplifyWhiteSpace(); - current->name = current->name.stripWhiteSpace(); - //printf("adding '%s' '%s' '%s' brief=%s insideObjC=%d %x\n",current->type.data(),current->name.data(),current->args.data(),current->brief.data(),insideObjC,current->section); - if (insideObjC && - ((current->spec&Entry::Interface) || (current->spec==Entry::Category)) + yyextra->current->args=removeRedundantWhiteSpace(yyextra->current->args); + // was: yyextra->current->args.simplifyWhiteSpace(); + yyextra->current->type = yyextra->current->type.simplifyWhiteSpace(); + yyextra->current->name = yyextra->current->name.stripWhiteSpace(); + //printf("adding '%s' '%s' '%s' brief=%s yyextra->insideObjC=%d %x\n",yyextra->current->type.data(),yyextra->current->name.data(),yyextra->current->args.data(),yyextra->current->brief.data(),yyextra->insideObjC,yyextra->current->section); + if (yyextra->insideObjC && + ((yyextra->current->spec&Entry::Interface) || (yyextra->current->spec==Entry::Category)) ) // method definition follows { BEGIN( ReadBodyIntf ) ; } else { - memspecEntry = current.get(); - current_root->copyToSubEntry( current ) ; - if (current->section==Entry::NAMESPACE_SEC || - (current->spec==Entry::Interface) || - insideJava || insidePHP || insideCS || insideD || insideJS || - insideSlice + yyextra->memspecEntry = yyextra->current; + yyextra->current_root->copyToSubEntry( yyextra->current ) ; + if (yyextra->current->section==Entry::NAMESPACE_SEC || + (yyextra->current->spec==Entry::Interface) || + yyextra->insideJava || yyextra->insidePHP || yyextra->insideCS || yyextra->insideD || yyextra->insideJS || + yyextra->insideSlice ) { // namespaces and interfaces and java classes ends with a closing bracket without semicolon - current->reset(); - current_root = original_root; // restore scope from before namespace descent - initEntry(); - memspecEntry = 0; + yyextra->current->reset(); + yyextra->current_root = original_root; // restore scope from before namespace descent + initEntry(yyscanner); + yyextra->memspecEntry.reset(); BEGIN( FindMembers ) ; } else { static QRegExp re("@[0-9]+$"); - if (!isTypedef && memspecEntry && - memspecEntry->name.find(re)==-1) // not typedef or anonymous type (see bug691071) + if (!yyextra->isTypedef && yyextra->memspecEntry && + yyextra->memspecEntry->name.find(re)==-1) // not typedef or anonymous type (see bug691071) { // enabled the next two lines for bug 623424 - current->doc.resize(0); - current->brief.resize(0); + yyextra->current->doc.resize(0); + yyextra->current->brief.resize(0); } BEGIN( MemberSpec ) ; } @@ -3992,113 +3690,113 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } } } -<ReadBody>"}"{BN}+"typedef"{BN}+ { //err("ReadBody count=%d\n",curlyCount); - lineCount(); - if ( curlyCount>0 ) +<ReadBody>"}"{BN}+"typedef"{BN}+ { //err("ReadBody count=%d\n",yyextra->curlyCount); + lineCount(yyscanner); + if ( yyextra->curlyCount>0 ) { - current->program += yytext ; - --curlyCount ; + yyextra->current->program += yytext ; + --yyextra->curlyCount ; } else { - isTypedef = TRUE; - current->endBodyLine = yyLineNr; - QCString &cn = current->name; - QCString rn = current_root->name.copy(); + yyextra->isTypedef = TRUE; + yyextra->current->endBodyLine = yyextra->yyLineNr; + QCString &cn = yyextra->current->name; + QCString rn = yyextra->current_root->name.copy(); if (!cn.isEmpty() && !rn.isEmpty()) { - prependScope(); + prependScope(yyscanner); } BEGIN( TypedefName ); } } <TypedefName>("const"|"volatile"){BN} { // late "const" or "volatile" keyword - lineCount(); - current->type.prepend(yytext); + lineCount(yyscanner); + yyextra->current->type.prepend(yytext); } <TypedefName>{ID} { - if ((current->section == Entry::ENUM_SEC) || (current->spec&Entry::Enum)) + if ((yyextra->current->section == Entry::ENUM_SEC) || (yyextra->current->spec&Entry::Enum)) { - current->program+=","; // add field terminator + yyextra->current->program+=","; // add field terminator } - current->name=yytext; - prependScope(); - current->args = current->args.simplifyWhiteSpace(); - current->type = current->type.simplifyWhiteSpace(); - //printf("Adding compound %s %s %s\n",current->type.data(),current->name.data(),current->args.data()); - if (!firstTypedefEntry) + yyextra->current->name=yytext; + prependScope(yyscanner); + yyextra->current->args = yyextra->current->args.simplifyWhiteSpace(); + yyextra->current->type = yyextra->current->type.simplifyWhiteSpace(); + //printf("Adding compound %s %s %s\n",yyextra->current->type.data(),yyextra->current->name.data(),yyextra->current->args.data()); + if (!yyextra->firstTypedefEntry) { - firstTypedefEntry = current.get(); + yyextra->firstTypedefEntry = yyextra->current; } - current_root->moveToSubEntryAndRefresh( current ) ; - initEntry(); - isTypedef=TRUE; // to undo reset by initEntry() + yyextra->current_root->moveToSubEntryAndRefresh( yyextra->current ) ; + initEntry(yyscanner); + yyextra->isTypedef=TRUE; // to undo reset by initEntry(yyscanner) BEGIN(MemberSpecSkip); } <TypedefName>";" { /* typedef of anonymous type */ - current->name.sprintf("@%d",anonCount++); - if ((current->section == Entry::ENUM_SEC) || (current->spec&Entry::Enum)) + yyextra->current->name.sprintf("@%d",yyextra->anonCount++); + if ((yyextra->current->section == Entry::ENUM_SEC) || (yyextra->current->spec&Entry::Enum)) { - current->program+=','; // add field terminator + yyextra->current->program+=','; // add field terminator } // add compound definition to the tree - current->args = current->args.simplifyWhiteSpace(); - current->type = current->type.simplifyWhiteSpace(); - memspecEntry = current.get(); - current_root->moveToSubEntryAndRefresh( current ) ; - initEntry(); + yyextra->current->args = yyextra->current->args.simplifyWhiteSpace(); + yyextra->current->type = yyextra->current->type.simplifyWhiteSpace(); + yyextra->memspecEntry = yyextra->current; + yyextra->current_root->moveToSubEntryAndRefresh( yyextra->current ) ; + initEntry(yyscanner); unput(';'); BEGIN( MemberSpec ) ; } <MemberSpec>([*&]*{BN}*)*{ID}{BN}*("["[^\]\n]*"]")* { // the [] part could be improved. - lineCount(); + lineCount(yyscanner); int i=0,l=(int)yyleng,j; while (i<l && (!isId(yytext[i]))) i++; - msName = QCString(yytext).right(l-i).stripWhiteSpace(); - j=msName.find("["); + yyextra->msName = QCString(yytext).right(l-i).stripWhiteSpace(); + j=yyextra->msName.find("["); if (j!=-1) { - msArgs=msName.right(msName.length()-j); - msName=msName.left(j); + yyextra->msArgs=yyextra->msName.right(yyextra->msName.length()-j); + yyextra->msName=yyextra->msName.left(j); } - msType=QCString(yytext).left(i); + yyextra->msType=QCString(yytext).left(i); // handle *pName in: typedef { ... } name, *pName; - if (firstTypedefEntry) + if (yyextra->firstTypedefEntry) { - if (firstTypedefEntry->spec&Entry::Struct) + if (yyextra->firstTypedefEntry->spec&Entry::Struct) { - msType.prepend("struct "+firstTypedefEntry->name); + yyextra->msType.prepend("struct "+yyextra->firstTypedefEntry->name); } - else if (firstTypedefEntry->spec&Entry::Union) + else if (yyextra->firstTypedefEntry->spec&Entry::Union) { - msType.prepend("union "+firstTypedefEntry->name); + yyextra->msType.prepend("union "+yyextra->firstTypedefEntry->name); } - else if (firstTypedefEntry->section==Entry::ENUM_SEC) + else if (yyextra->firstTypedefEntry->section==Entry::ENUM_SEC) { - msType.prepend("enum "+firstTypedefEntry->name); + yyextra->msType.prepend("enum "+yyextra->firstTypedefEntry->name); } else { - msType.prepend(firstTypedefEntry->name); + yyextra->msType.prepend(yyextra->firstTypedefEntry->name); } } } <MemberSpec>"(" { // function with struct return type - addType(); - current->name = msName; - current->spec = 0; + addType(yyscanner); + yyextra->current->name = yyextra->msName; + yyextra->current->spec = 0; unput('('); BEGIN(FindMembers); } <MemberSpec>[,;] { - if (msName.isEmpty() && !current->name.isEmpty()) + if (yyextra->msName.isEmpty() && !yyextra->current->name.isEmpty()) { - // see if the compound does not have a name or is inside another + // see if the compound does not have a name or is yyextra->inside another // anonymous compound. If so we insert a // special 'anonymous' variable. - //Entry *p=current_root; - const Entry *p=current.get(); + //Entry *p=yyextra->current_root; + const Entry *p=yyextra->current.get(); while (p) { // only look for class scopes, not namespace scopes @@ -4109,164 +3807,164 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) int pi = (i==-1) ? 0 : i+2; if (p->name.at(pi)=='@') { - // anonymous compound inside -> insert dummy variable name + // anonymous compound yyextra->inside -> insert dummy variable name //printf("Adding anonymous variable for scope %s\n",p->name.data()); - msName.sprintf("@%d",anonCount++); + yyextra->msName.sprintf("@%d",yyextra->anonCount++); break; } } //p=p->parent; - if (p==current.get()) p=current_root; else p=p->parent(); + if (p==yyextra->current.get()) p=yyextra->current_root.get(); else p=p->parent(); } } - //printf("msName=%s current->name=%s\n",msName.data(),current->name.data()); - if (!msName.isEmpty() - /*&& msName!=current->name*/) // skip typedef T {} T;, removed due to bug608493 + //printf("yyextra->msName=%s yyextra->current->name=%s\n",yyextra->msName.data(),yyextra->current->name.data()); + if (!yyextra->msName.isEmpty() + /*&& yyextra->msName!=yyextra->current->name*/) // skip typedef T {} T;, removed due to bug608493 { - static bool typedefHidesStruct = Config_getBool(TYPEDEF_HIDES_STRUCT); + bool typedefHidesStruct = Config_getBool(TYPEDEF_HIDES_STRUCT); // case 1: typedef struct _S { ... } S_t; // -> omit typedef and use S_t as the struct name if (typedefHidesStruct && - isTypedef && - ((current->spec&(Entry::Struct|Entry::Union)) || - current->section==Entry::ENUM_SEC )&& - msType.stripWhiteSpace().isEmpty() && - memspecEntry) + yyextra->isTypedef && + ((yyextra->current->spec&(Entry::Struct|Entry::Union)) || + yyextra->current->section==Entry::ENUM_SEC )&& + yyextra->msType.stripWhiteSpace().isEmpty() && + yyextra->memspecEntry) { - memspecEntry->name=msName; + yyextra->memspecEntry->name=yyextra->msName; } else // case 2: create a typedef field { - std::unique_ptr<Entry> varEntry=std::make_unique<Entry>(); - varEntry->lang = language; - varEntry->protection = current->protection ; - varEntry->mtype = current->mtype; - varEntry->virt = current->virt; - varEntry->stat = current->stat; + std::shared_ptr<Entry> varEntry=std::make_shared<Entry>(); + varEntry->lang = yyextra->language; + varEntry->protection = yyextra->current->protection ; + varEntry->mtype = yyextra->current->mtype; + varEntry->virt = yyextra->current->virt; + varEntry->stat = yyextra->current->stat; varEntry->section = Entry::VARIABLE_SEC; - varEntry->name = msName.stripWhiteSpace(); - varEntry->type = current->type.simplifyWhiteSpace()+" "; - varEntry->args = msArgs; - if (isTypedef) + varEntry->name = yyextra->msName.stripWhiteSpace(); + varEntry->type = yyextra->current->type.simplifyWhiteSpace()+" "; + varEntry->args = yyextra->msArgs; + if (yyextra->isTypedef) { varEntry->type.prepend("typedef "); - // //printf("current->name = %s %s\n",current->name.data(),msName.data()); + // //printf("yyextra->current->name = %s %s\n",yyextra->current->name.data(),yyextra->msName.data()); } if (typedefHidesStruct && - isTypedef && - (current->spec&(Entry::Struct|Entry::Union)) && - memspecEntry + yyextra->isTypedef && + (yyextra->current->spec&(Entry::Struct|Entry::Union)) && + yyextra->memspecEntry ) // case 1: use S_t as type for pS_t in "typedef struct _S {} S_t, *pS_t;" { - varEntry->type+=memspecEntry->name+msType; + varEntry->type+=yyextra->memspecEntry->name+yyextra->msType; } else // case 2: use _S as type for for pS_t { - varEntry->type+=current->name+msType; + varEntry->type+=yyextra->current->name+yyextra->msType; } - varEntry->fileName = yyFileName; - varEntry->startLine = yyLineNr; - varEntry->startColumn = yyColNr; - varEntry->doc = current->doc.copy(); - varEntry->brief = current->brief.copy(); - varEntry->mGrpId = current->mGrpId; - varEntry->initializer = current->initializer; - varEntry->groups = current->groups; - varEntry->sli = current->sli; + varEntry->fileName = yyextra->yyFileName; + varEntry->startLine = yyextra->yyLineNr; + varEntry->startColumn = yyextra->yyColNr; + varEntry->doc = yyextra->current->doc.copy(); + varEntry->brief = yyextra->current->brief.copy(); + varEntry->mGrpId = yyextra->current->mGrpId; + varEntry->initializer = yyextra->current->initializer; + varEntry->groups = yyextra->current->groups; + varEntry->sli = yyextra->current->sli; //printf("Add: type='%s',name='%s',args='%s' brief=%s doc=%s\n", // varEntry->type.data(),varEntry->name.data(), // varEntry->args.data(),varEntry->brief.data(),varEntry->doc.data()); - current_root->moveToSubEntryAndKeep(varEntry); + yyextra->current_root->moveToSubEntryAndKeep(varEntry); } } if (*yytext==';') // end of a struct/class ... { - if (!isTypedef && msName.isEmpty() && memspecEntry && (current->section&Entry::COMPOUND_MASK)) + if (!yyextra->isTypedef && yyextra->msName.isEmpty() && yyextra->memspecEntry && (yyextra->current->section&Entry::COMPOUND_MASK)) { // case where a class/struct has a doc block after it - if (!current->doc.isEmpty()) + if (!yyextra->current->doc.isEmpty()) { - memspecEntry->doc += current->doc; + yyextra->memspecEntry->doc += yyextra->current->doc; } - if (!current->brief.isEmpty()) + if (!yyextra->current->brief.isEmpty()) { - memspecEntry->brief += current->brief; + yyextra->memspecEntry->brief += yyextra->current->brief; } } - msType.resize(0); - msName.resize(0); - msArgs.resize(0); - isTypedef=FALSE; - firstTypedefEntry=0; - memspecEntry=0; - current->reset(); - initEntry(); + yyextra->msType.resize(0); + yyextra->msName.resize(0); + yyextra->msArgs.resize(0); + yyextra->isTypedef=FALSE; + yyextra->firstTypedefEntry.reset(); + yyextra->memspecEntry.reset(); + yyextra->current->reset(); + initEntry(yyscanner); BEGIN( FindMembers ); } else { - current->doc.resize(0); - current->brief.resize(0); + yyextra->current->doc.resize(0); + yyextra->current->brief.resize(0); } } <MemberSpec>"=" { - lastInitializerContext=YY_START; - initBracketCount=0; - current->initializer = yytext; + yyextra->lastInitializerContext=YY_START; + yyextra->initBracketCount=0; + yyextra->current->initializer = yytext; BEGIN(ReadInitializer); /* BEGIN(MemberSpecSkip); */ } /* <MemberSpecSkip>"{" { - curlyCount=0; - lastCurlyContext = MemberSpecSkip; - previous = current; + yyextra->curlyCount=0; + yyextra->lastCurlyContext = MemberSpecSkip; + yyextra->previous = yyextra->current; BEGIN(SkipCurly); } */ <MemberSpecSkip>"," { BEGIN(MemberSpec); } <MemberSpecSkip>";" { unput(';'); BEGIN(MemberSpec); } -<ReadBody,ReadNSBody,ReadBodyIntf>{BN}{1,80} { current->program += yytext ; - lineCount() ; +<ReadBody,ReadNSBody,ReadBodyIntf>{BN}{1,80} { yyextra->current->program += yytext ; + lineCount(yyscanner) ; } <ReadBodyIntf>"@end"/[^a-z_A-Z0-9] { // end of Objective C block - current_root->moveToSubEntryAndRefresh( current ) ; - initEntry(); - language = current->lang = SrcLangExt_Cpp; // see bug746361 - insideObjC=FALSE; + yyextra->current_root->moveToSubEntryAndRefresh( yyextra->current ) ; + initEntry(yyscanner); + yyextra->language = yyextra->current->lang = SrcLangExt_Cpp; // see bug746361 + yyextra->insideObjC=FALSE; BEGIN( FindMembers ); } -<ReadBody,ReadNSBody,ReadBodyIntf>. { current->program += yytext ; } +<ReadBody,ReadNSBody,ReadBodyIntf>. { yyextra->current->program += yytext ; } <FindMembers>"("/{BN}*"::"*{BN}*({TSCOPE}{BN}*"::")*{TSCOPE}{BN}*")"{BN}*"(" | /* typedef void (A<int>::func_t)(args...) */ <FindMembers>("("({BN}*"::"*{BN}*{TSCOPE}{BN}*"::")*({BN}*[*&\^]{BN}*)+)+ { /* typedef void (A::*ptr_t)(args...) or int (*func(int))[], the ^ is for Obj-C blocks */ - if (insidePHP) // reference parameter + if (yyextra->insidePHP) // reference parameter { REJECT } else { - current->bodyLine = yyLineNr; - lineCount(); - addType(); - funcPtrType=yytext; - roundCount=0; - //current->type += yytext; + yyextra->current->bodyLine = yyextra->yyLineNr; + lineCount(yyscanner); + addType(yyscanner); + yyextra->funcPtrType=yytext; + yyextra->roundCount=0; + //yyextra->current->type += yytext; BEGIN( FuncPtr ); } } <FuncPtr>{SCOPENAME} { - current->name = yytext; - if (nameIsOperator(current->name)) + yyextra->current->name = yytext; + if (nameIsOperator(yyextra->current->name)) { BEGIN( FuncPtrOperator ); } else { - if (current->name=="const" || current->name=="volatile") + if (yyextra->current->name=="const" || yyextra->current->name=="volatile") { - funcPtrType += current->name; + yyextra->funcPtrType += yyextra->current->name; } else { @@ -4275,213 +3973,213 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } } <FuncPtr>. { - //printf("error: FuncPtr '%c' unexpected at line %d of %s\n",*yytext,yyLineNr,yyFileName); + //printf("error: FuncPtr '%c' unexpected at line %d of %s\n",*yytext,yyextra->yyLineNr,yyextra->yyFileName); } <FuncPtrOperator>"("{BN}*")"{BN}*/"(" { - current->name += yytext; - current->name = current->name.simplifyWhiteSpace(); - lineCount(); + yyextra->current->name += yytext; + yyextra->current->name = yyextra->current->name.simplifyWhiteSpace(); + lineCount(yyscanner); } <FuncPtrOperator>\n { - lineCount(); - current->name += *yytext; + lineCount(yyscanner); + yyextra->current->name += *yytext; } <FuncPtrOperator>"(" { unput(*yytext); BEGIN( EndFuncPtr ); } <FuncPtrOperator>. { - current->name += *yytext; + yyextra->current->name += *yytext; } <EndFuncPtr>")"{BN}*/";" { // a variable with extra braces - lineCount(); - current->type+=funcPtrType.data()+1; + lineCount(yyscanner); + yyextra->current->type+=yyextra->funcPtrType.data()+1; BEGIN(FindMembers); } <EndFuncPtr>")"{BN}*/"(" { // a function pointer - lineCount(); - current->type+=funcPtrType+")"; + lineCount(yyscanner); + yyextra->current->type+=yyextra->funcPtrType+")"; BEGIN(FindMembers); } <EndFuncPtr>")"{BN}*/"[" { // an array of variables - lineCount(); - current->type+=funcPtrType.data(); - current->args += ")"; + lineCount(yyscanner); + yyextra->current->type+=yyextra->funcPtrType.data(); + yyextra->current->args += ")"; BEGIN(FindMembers); } <EndFuncPtr>"(" { // a function returning a function or // a function returning a pointer to an array - current->args += *yytext ; - //roundCount=0; + yyextra->current->args += *yytext ; + //yyextra->roundCount=0; //BEGIN( FuncFunc ); - current->bodyLine = yyLineNr; - currentArgumentContext = FuncFuncEnd; - fullArgString=current->args.copy(); - copyArgString=¤t->args; + yyextra->current->bodyLine = yyextra->yyLineNr; + yyextra->currentArgumentContext = FuncFuncEnd; + yyextra->fullArgString=yyextra->current->args.copy(); + yyextra->copyArgString=&yyextra->current->args; BEGIN( ReadFuncArgType ) ; } <EndFuncPtr>"["[^\n\]]*"]" { - funcPtrType+=yytext; + yyextra->funcPtrType+=yytext; } <EndFuncPtr>")" { BEGIN(FindMembers); } <FuncFunc>"(" { - current->args += *yytext ; - ++roundCount; + yyextra->current->args += *yytext ; + ++yyextra->roundCount; } <FuncFunc>")" { - current->args += *yytext ; - if ( roundCount ) - --roundCount; + yyextra->current->args += *yytext ; + if ( yyextra->roundCount ) + --yyextra->roundCount; else { BEGIN(FuncFuncEnd); } } <FuncFuncEnd>")"{BN}*"(" { - lineCount(); - current->type+=funcPtrType+")("; + lineCount(yyscanner); + yyextra->current->type+=yyextra->funcPtrType+")("; BEGIN(FuncFuncType); } <FuncFuncEnd>")"{BN}*/[;{] { - lineCount(); - current->type+=funcPtrType.data()+1; + lineCount(yyscanner); + yyextra->current->type+=yyextra->funcPtrType.data()+1; BEGIN(Function); } <FuncFuncEnd>")"{BN}*/"[" { // function returning a pointer to an array - lineCount(); - current->type+=funcPtrType; - current->args+=")"; + lineCount(yyscanner); + yyextra->current->type+=yyextra->funcPtrType; + yyextra->current->args+=")"; BEGIN(FuncFuncArray); } <FuncFuncEnd>. { - current->args += *yytext; + yyextra->current->args += *yytext; } <FuncFuncType>"(" { - current->type += *yytext; - roundCount++; + yyextra->current->type += *yytext; + yyextra->roundCount++; } <FuncFuncType>")" { - current->type += *yytext; - if (roundCount) - --roundCount; + yyextra->current->type += *yytext; + if (yyextra->roundCount) + --yyextra->roundCount; else BEGIN(Function); } -<FuncFuncType>{BN}*","{BN}* { lineCount() ; current->type += ", " ; } -<FuncFuncType>{BN}+ { lineCount() ; current->type += ' ' ; } +<FuncFuncType>{BN}*","{BN}* { lineCount(yyscanner) ; yyextra->current->type += ", " ; } +<FuncFuncType>{BN}+ { lineCount(yyscanner) ; yyextra->current->type += ' ' ; } <FuncFuncType>. { - current->type += *yytext; + yyextra->current->type += *yytext; } <FindMembers>"("/{BN}*{ID}{BN}*"*"{BN}*{ID}*")"{BN}*"(" { // for catching typedef void (__stdcall *f)() like definitions - if (current->type.left(7)=="typedef" && current->bodyLine==-1) + if (yyextra->current->type.left(7)=="typedef" && yyextra->current->bodyLine==-1) // the bodyLine check is to prevent this guard to be true more than once { - current->bodyLine = yyLineNr; + yyextra->current->bodyLine = yyextra->yyLineNr; BEGIN( GetCallType ); } - else if (!current->name.isEmpty()) // normal function + else if (!yyextra->current->name.isEmpty()) // normal function { - current->args = yytext; - current->bodyLine = yyLineNr; - currentArgumentContext = FuncQual; - fullArgString=current->args.copy(); - copyArgString=¤t->args; + yyextra->current->args = yytext; + yyextra->current->bodyLine = yyextra->yyLineNr; + yyextra->currentArgumentContext = FuncQual; + yyextra->fullArgString=yyextra->current->args.copy(); + yyextra->copyArgString=&yyextra->current->args; BEGIN( ReadFuncArgType ) ; //printf(">>> Read function arguments!\n"); } } <GetCallType>{BN}*{ID}{BN}*"*" { - lineCount(); - addType(); - funcPtrType="("; - funcPtrType+=yytext; - roundCount=0; + lineCount(yyscanner); + addType(yyscanner); + yyextra->funcPtrType="("; + yyextra->funcPtrType+=yytext; + yyextra->roundCount=0; BEGIN( FuncPtr ); } <FindMembers>"(" { - if (!current->name.isEmpty()) + if (!yyextra->current->name.isEmpty()) { - current->args = yytext; - current->bodyLine = yyLineNr; - currentArgumentContext = FuncQual; - fullArgString=current->args.copy(); - copyArgString=¤t->args; + yyextra->current->args = yytext; + yyextra->current->bodyLine = yyextra->yyLineNr; + yyextra->currentArgumentContext = FuncQual; + yyextra->fullArgString=yyextra->current->args.copy(); + yyextra->copyArgString=&yyextra->current->args; BEGIN( ReadFuncArgType ) ; - //printf(">>> Read function arguments current->argList.size()=%d\n",current->argList.size()); + //printf(">>> Read function arguments yyextra->current->argList.size()=%d\n",yyextra->current->argList.size()); } } /* <FindMembers>"("{BN}*("void"{BN}*)?")" { - lineCount(); - current->args = "()"; + lineCount(yyscanner); + yyextra->current->args = "()"; BEGIN( FuncQual ); } */ /*- Function argument reading rules ---------------------------------------*/ -<ReadFuncArgType>[^ \/\r\t\n\)\(\"\'#]+ { *copyArgString+=yytext; - fullArgString+=yytext; +<ReadFuncArgType>[^ \/\r\t\n\)\(\"\'#]+ { *yyextra->copyArgString+=yytext; + yyextra->fullArgString+=yytext; } -<CopyArgString,CopyArgPHPString>[^\n\\\"\']+ { *copyArgString+=yytext; - fullArgString+=yytext; +<CopyArgString,CopyArgPHPString>[^\n\\\"\']+ { *yyextra->copyArgString+=yytext; + yyextra->fullArgString+=yytext; } <CopyArgRound>[^\/\n\)\(\"\']+ { - *copyArgString+=yytext; - fullArgString+=yytext; + *yyextra->copyArgString+=yytext; + yyextra->fullArgString+=yytext; } <ReadFuncArgType,ReadTempArgs>{BN}* { - *copyArgString+=" "; - fullArgString+=" "; - lineCount(); + *yyextra->copyArgString+=" "; + yyextra->fullArgString+=" "; + lineCount(yyscanner); } <ReadFuncArgType,CopyArgRound,CopyArgSharp,ReadTempArgs>{RAWBEGIN} { - g_delimiter = yytext+2; - g_delimiter=g_delimiter.left(g_delimiter.length()-1); - lastRawStringContext = YY_START; - pCopyRawString = copyArgString; - *pCopyRawString+=yytext; - fullArgString+=yytext; + yyextra->delimiter = yytext+2; + yyextra->delimiter=yyextra->delimiter.left(yyextra->delimiter.length()-1); + yyextra->lastRawStringContext = YY_START; + yyextra->pCopyRawString = yyextra->copyArgString; + *yyextra->pCopyRawString+=yytext; + yyextra->fullArgString+=yytext; BEGIN(RawString); } <ReadFuncArgType,CopyArgRound,CopyArgSharp,ReadTempArgs>\" { - *copyArgString+=*yytext; - fullArgString+=*yytext; - lastCopyArgStringContext = YY_START; + *yyextra->copyArgString+=*yytext; + yyextra->fullArgString+=*yytext; + yyextra->lastCopyArgStringContext = YY_START; BEGIN( CopyArgString ); } <ReadFuncArgType,ReadTempArgs>"(" { - *copyArgString+=*yytext; - fullArgString+=*yytext; - argRoundCount=0; - lastCopyArgContext = YY_START; + *yyextra->copyArgString+=*yytext; + yyextra->fullArgString+=*yytext; + yyextra->argRoundCount=0; + yyextra->lastCopyArgContext = YY_START; BEGIN( CopyArgRound ); } <ReadFuncArgType>")" { - *copyArgString+=*yytext; - fullArgString+=*yytext; - stringToArgumentList(fullArgString,current->argList); - if (insideJS) + *yyextra->copyArgString+=*yytext; + yyextra->fullArgString+=*yytext; + stringToArgumentList(yyextra->fullArgString,yyextra->current->argList); + if (yyextra->insideJS) { - fixArgumentListForJavaScript(current->argList); + fixArgumentListForJavaScript(yyextra->current->argList); } - handleParametersCommentBlocks(current->argList); + handleParametersCommentBlocks(yyscanner,yyextra->current->argList); - /* remember the current documentation block, since + /* remember the yyextra->current documentation block, since we could overwrite it with the documentation of a function argument, which we then have to correct later on */ - docBackup = current->doc; - briefBackup = current->brief; + yyextra->docBackup = yyextra->current->doc; + yyextra->briefBackup = yyextra->current->brief; - BEGIN( currentArgumentContext ); + BEGIN( yyextra->currentArgumentContext ); } /* a special comment */ <ReadFuncArgType,ReadTempArgs>("/*"[*!]|"//"[/!])("<"?) { - if (currentArgumentContext==DefineEnd) + if (yyextra->currentArgumentContext==DefineEnd) { // for defines we interpret a comment // as documentation for the define @@ -4489,17 +4187,17 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) { unput(yytext[i]); } - stringToArgumentList(fullArgString,current->argList); - handleParametersCommentBlocks(current->argList); - BEGIN( currentArgumentContext ); + stringToArgumentList(yyextra->fullArgString,yyextra->current->argList); + handleParametersCommentBlocks(yyscanner,yyextra->current->argList); + BEGIN( yyextra->currentArgumentContext ); } else // not a define { // for functions we interpret a comment // as documentation for the argument - fullArgString+=yytext; - lastCopyArgChar=0; - lastCommentInArgContext=YY_START; + yyextra->fullArgString+=yytext; + yyextra->lastCopyArgChar=0; + yyextra->lastCommentInArgContext=YY_START; if (yytext[1]=='/') BEGIN( CopyArgCommentLine ); else @@ -4509,30 +4207,30 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) /* a non-special comment */ <ReadFuncArgType,ReadTempArgs>"/**/" { /* empty comment */ } <ReadFuncArgType,ReadTempArgs>"/*" { - lastCContext = YY_START; + yyextra->lastCContext = YY_START; BEGIN( SkipComment ); } <ReadFuncArgType,ReadTempArgs>"//" { - lastCContext = YY_START; + yyextra->lastCContext = YY_START; BEGIN( SkipCxxComment ); } /* -<ReadFuncArgType,ReadTempArgs>"'#" { if (insidePHP) +<ReadFuncArgType,ReadTempArgs>"'#" { if (yyextra->insidePHP) REJECT; - *copyArgString+=yytext; - fullArgString+=yytext; + *yyextra->copyArgString+=yytext; + yyextra->fullArgString+=yytext; } <ReadFuncArgType,ReadTempArgs>"#" { - if (!insidePHP) + if (!yyextra->insidePHP) REJECT; - lastCContext = YY_START; + yyextra->lastCContext = YY_START; BEGIN( SkipCxxComment ); } */ /* ')' followed by a special comment */ <ReadFuncArgType>")"{BN}*("/*"[*!]|"//"[/!])"<" { - lineCount(); - if (currentArgumentContext==DefineEnd) + lineCount(yyscanner); + if (yyextra->currentArgumentContext==DefineEnd) { // for defines we interpret a comment // as documentation for the define @@ -4540,21 +4238,21 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) { unput(yytext[i]); } - *copyArgString+=*yytext; - fullArgString+=*yytext; - stringToArgumentList(fullArgString,current->argList); - handleParametersCommentBlocks(current->argList); - BEGIN( currentArgumentContext ); + *yyextra->copyArgString+=*yytext; + yyextra->fullArgString+=*yytext; + stringToArgumentList(yyextra->fullArgString,yyextra->current->argList); + handleParametersCommentBlocks(yyscanner,yyextra->current->argList); + BEGIN( yyextra->currentArgumentContext ); } else { // for functions we interpret a comment - // as documentation for the last argument - lastCopyArgChar=*yytext; + // as documentation for the yyextra->last argument + yyextra->lastCopyArgChar=*yytext; QCString text=&yytext[1]; text=text.stripWhiteSpace(); - lastCommentInArgContext=YY_START; - fullArgString+=text; + yyextra->lastCommentInArgContext=YY_START; + yyextra->fullArgString+=text; if (text.find("//")!=-1) BEGIN( CopyArgCommentLine ); else @@ -4562,152 +4260,152 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } } <CopyArgComment>^{B}*"*"+/{BN}+ -<CopyArgComment>[^\n\\\@\*]+ { fullArgString+=yytext; } -<CopyArgComment>"*/" { fullArgString+=yytext; - if (lastCopyArgChar!=0) - unput(lastCopyArgChar); - BEGIN( lastCommentInArgContext ); - } -<CopyArgCommentLine>\n { fullArgString+=yytext; - lineCount(); - if (lastCopyArgChar!=0) - unput(lastCopyArgChar); - BEGIN( lastCommentInArgContext ); +<CopyArgComment>[^\n\\\@\*]+ { yyextra->fullArgString+=yytext; } +<CopyArgComment>"*/" { yyextra->fullArgString+=yytext; + if (yyextra->lastCopyArgChar!=0) + unput(yyextra->lastCopyArgChar); + BEGIN( yyextra->lastCommentInArgContext ); + } +<CopyArgCommentLine>\n { yyextra->fullArgString+=yytext; + lineCount(yyscanner); + if (yyextra->lastCopyArgChar!=0) + unput(yyextra->lastCopyArgChar); + BEGIN( yyextra->lastCommentInArgContext ); } <CopyArgCommentLine>{CMD}("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"manonly"|"dot"|"code")/[^a-z_A-Z0-9\-] { // verbatim command (which could contain nested comments!) - docBlockName=&yytext[1]; - fullArgString+=yytext; + yyextra->docBlockName=&yytext[1]; + yyextra->fullArgString+=yytext; BEGIN(CopyArgVerbatim); } <CopyArgCommentLine>{CMD}("f$"|"f["|"f{") { - docBlockName=&yytext[1]; - if (docBlockName.at(1)=='[') + yyextra->docBlockName=&yytext[1]; + if (yyextra->docBlockName.at(1)=='[') { - docBlockName.at(1)='}'; + yyextra->docBlockName.at(1)='}'; } - if (docBlockName.at(1)=='{') + if (yyextra->docBlockName.at(1)=='{') { - docBlockName.at(1)='}'; + yyextra->docBlockName.at(1)='}'; } - fullArgString+=yytext; + yyextra->fullArgString+=yytext; BEGIN(CopyArgVerbatim); } <CopyArgVerbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddocbookonly"|"endmanonly"|"enddot"|"endcode"|"f$"|"f]"|"f}")/[^a-z_A-Z0-9\-] { // end of verbatim block - fullArgString+=yytext; + yyextra->fullArgString+=yytext; if (yytext[1]=='f') // end of formula { BEGIN(CopyArgCommentLine); } - if (&yytext[4]==docBlockName) + if (&yytext[4]==yyextra->docBlockName) { BEGIN(CopyArgCommentLine); } } -<CopyArgCommentLine>[^\\\@\n]+ { fullArgString+=yytext; } -<CopyArgCommentLine>. { fullArgString+=*yytext; } -<CopyArgComment,CopyArgVerbatim>\n { fullArgString+=*yytext; lineCount(); } -<CopyArgComment,CopyArgVerbatim>. { fullArgString+=*yytext; } +<CopyArgCommentLine>[^\\\@\n]+ { yyextra->fullArgString+=yytext; } +<CopyArgCommentLine>. { yyextra->fullArgString+=*yytext; } +<CopyArgComment,CopyArgVerbatim>\n { yyextra->fullArgString+=*yytext; lineCount(yyscanner); } +<CopyArgComment,CopyArgVerbatim>. { yyextra->fullArgString+=*yytext; } <CopyArgComment>{CMD}("brief"|"short"){B}+ { - warn(yyFileName,yyLineNr, - "Ignoring %cbrief command inside argument documentation",*yytext + warn(yyextra->yyFileName,yyextra->yyLineNr, + "Ignoring %cbrief command yyextra->inside argument documentation",*yytext ); - fullArgString+=' '; + yyextra->fullArgString+=' '; } <ReadTempArgs>"<" { - *copyArgString+=*yytext; - fullArgString+=*yytext; - argSharpCount=1; + *yyextra->copyArgString+=*yytext; + yyextra->fullArgString+=*yytext; + yyextra->argSharpCount=1; BEGIN( CopyArgSharp ); } <ReadTempArgs>">" { - *copyArgString+=*yytext; - fullArgString+=*yytext; - //printf("end template list '%s'\n",copyArgString->data()); - stringToArgumentList(fullArgString,*currentArgumentList); - BEGIN( currentArgumentContext ); + *yyextra->copyArgString+=*yytext; + yyextra->fullArgString+=*yytext; + //printf("end template list '%s'\n",yyextra->copyArgString->data()); + stringToArgumentList(yyextra->fullArgString,*yyextra->currentArgumentList); + BEGIN( yyextra->currentArgumentContext ); } <CopyArgRound>"(" { - argRoundCount++; - *copyArgString+=*yytext; - fullArgString+=*yytext; + yyextra->argRoundCount++; + *yyextra->copyArgString+=*yytext; + yyextra->fullArgString+=*yytext; } <CopyArgRound>")" { - *copyArgString+=*yytext; - fullArgString+=*yytext; - if (argRoundCount>0) - argRoundCount--; + *yyextra->copyArgString+=*yytext; + yyextra->fullArgString+=*yytext; + if (yyextra->argRoundCount>0) + yyextra->argRoundCount--; else - BEGIN( lastCopyArgContext ); + BEGIN( yyextra->lastCopyArgContext ); } <CopyArgSharp>"(" { - *copyArgString+=*yytext; - fullArgString+=*yytext; - argRoundCount=0; - lastCopyArgContext = YY_START; + *yyextra->copyArgString+=*yytext; + yyextra->fullArgString+=*yytext; + yyextra->argRoundCount=0; + yyextra->lastCopyArgContext = YY_START; BEGIN( CopyArgRound ); } <CopyArgSharp>"<" { - argSharpCount++; - //printf("argSharpCount++=%d copy\n",argSharpCount); - *copyArgString+=*yytext; - fullArgString+=*yytext; + yyextra->argSharpCount++; + //printf("yyextra->argSharpCount++=%d copy\n",yyextra->argSharpCount); + *yyextra->copyArgString+=*yytext; + yyextra->fullArgString+=*yytext; } <CopyArgSharp>">" { - *copyArgString+=*yytext; - fullArgString+=*yytext; - argSharpCount--; - if (argSharpCount>0) + *yyextra->copyArgString+=*yytext; + yyextra->fullArgString+=*yytext; + yyextra->argSharpCount--; + if (yyextra->argSharpCount>0) { - //printf("argSharpCount--=%d copy\n",argSharpCount); + //printf("yyextra->argSharpCount--=%d copy\n",yyextra->argSharpCount); } else { BEGIN( ReadTempArgs ); - //printf("end of argSharpCount\n"); + //printf("end of yyextra->argSharpCount\n"); } } <CopyArgString,CopyArgPHPString>\\. { - *copyArgString+=yytext; - fullArgString+=yytext; + *yyextra->copyArgString+=yytext; + yyextra->fullArgString+=yytext; } <CopyArgString>\" { - *copyArgString+=*yytext; - fullArgString+=*yytext; - BEGIN( lastCopyArgStringContext ); + *yyextra->copyArgString+=*yytext; + yyextra->fullArgString+=*yytext; + BEGIN( yyextra->lastCopyArgStringContext ); } <CopyArgPHPString>\' { - *copyArgString+=*yytext; - fullArgString+=*yytext; - BEGIN( lastCopyArgStringContext ); + *yyextra->copyArgString+=*yytext; + yyextra->fullArgString+=*yytext; + BEGIN( yyextra->lastCopyArgStringContext ); } <ReadFuncArgType,ReadTempArgs,CopyArgRound,CopyArgSharp>{CHARLIT} { - if (insidePHP) + if (yyextra->insidePHP) { REJECT; } else { - *copyArgString+=yytext; - fullArgString+=yytext; + *yyextra->copyArgString+=yytext; + yyextra->fullArgString+=yytext; } } <ReadFuncArgType,ReadTempArgs,CopyArgRound,CopyArgSharp>\' { - *copyArgString+=yytext; - fullArgString+=yytext; - if (insidePHP) + *yyextra->copyArgString+=yytext; + yyextra->fullArgString+=yytext; + if (yyextra->insidePHP) { - lastCopyArgStringContext=YY_START; + yyextra->lastCopyArgStringContext=YY_START; BEGIN(CopyArgPHPString); } } <ReadFuncArgType,ReadTempArgs,CopyArgString,CopyArgPHPString,CopyArgRound,CopyArgSharp>\n { - lineCount(); - *copyArgString+=*yytext; - fullArgString+=*yytext; + lineCount(yyscanner); + *yyextra->copyArgString+=*yytext; + yyextra->fullArgString+=*yytext; } <ReadFuncArgType,ReadTempArgs,CopyArgString,CopyArgPHPString,CopyArgRound,CopyArgSharp>. { - *copyArgString+=*yytext; - fullArgString+=*yytext; + *yyextra->copyArgString+=*yytext; + yyextra->fullArgString+=*yytext; } @@ -4715,29 +4413,29 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) /*------------------------------------------------------------------------*/ -<FuncRound>"(" { current->args += *yytext ; - ++roundCount ; +<FuncRound>"(" { yyextra->current->args += *yytext ; + ++yyextra->roundCount ; } -<FuncRound>")" { current->args += *yytext ; - if ( roundCount ) - --roundCount ; +<FuncRound>")" { yyextra->current->args += *yytext ; + if ( yyextra->roundCount ) + --yyextra->roundCount ; else BEGIN( FuncQual ) ; } /* -<FuncQual>"#" { if (insidePHP) +<FuncQual>"#" { if (yyextra->insidePHP) REJECT; - lastCPPContext = YY_START; + yyextra->lastCPPContext = YY_START; BEGIN(SkipCPP); } */ <FuncQual>[{:;,] { if ( qstrcmp(yytext,";")==0 && - insidePHP && - !containsWord(current->type,"function") ) + yyextra->insidePHP && + !containsWord(yyextra->current->type,"function") ) { - current->reset(); - initEntry(); + yyextra->current->reset(); + initEntry(yyscanner); BEGIN( FindMembers ); } else @@ -4746,89 +4444,89 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } } <FuncQual>{BN}*"abstract"{BN}* { // pure virtual member function - lineCount() ; - current->virt = Pure; - current->args += " override "; + lineCount(yyscanner) ; + yyextra->current->virt = Pure; + yyextra->current->args += " override "; } <FuncQual,TrailingReturn>{BN}*"override"{BN}* { // C++11 overridden virtual member function - lineCount() ; - current->spec |= Entry::Override; - current->args += " override "; + lineCount(yyscanner) ; + yyextra->current->spec |= Entry::Override; + yyextra->current->args += " override "; BEGIN(FuncQual); } <FuncQual,TrailingReturn>{BN}*"final"{BN}* { // C++11 final method - lineCount() ; - current->spec |= Entry::Final; - current->args += " final "; + lineCount(yyscanner) ; + yyextra->current->spec |= Entry::Final; + yyextra->current->args += " final "; BEGIN(FuncQual); } <FuncQual>{BN}*"sealed"{BN}* { // sealed member function - lineCount() ; - current->spec |= Entry::Sealed; - current->args += " sealed "; + lineCount(yyscanner) ; + yyextra->current->spec |= Entry::Sealed; + yyextra->current->args += " sealed "; } <FuncQual>{BN}*"new"{BN}* { // new member function - lineCount() ; - current->spec |= Entry::New; - current->args += " new "; + lineCount(yyscanner) ; + yyextra->current->spec |= Entry::New; + yyextra->current->args += " new "; } <FuncQual>{BN}*"const"{BN}* { // const member function - lineCount() ; - current->args += " const "; - current->argList.constSpecifier=TRUE; + lineCount(yyscanner) ; + yyextra->current->args += " const "; + yyextra->current->argList.constSpecifier=TRUE; } <FuncQual>{BN}*"volatile"{BN}* { // volatile member function - lineCount() ; - current->args += " volatile "; - current->argList.volatileSpecifier=TRUE; + lineCount(yyscanner) ; + yyextra->current->args += " volatile "; + yyextra->current->argList.volatileSpecifier=TRUE; } <FuncQual>{BN}*"noexcept"{BN}* { // noexcept qualifier - lineCount() ; - current->args += " noexcept "; - current->spec |= Entry::NoExcept; + lineCount(yyscanner) ; + yyextra->current->args += " noexcept "; + yyextra->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; + lineCount(yyscanner) ; + yyextra->current->args += " noexcept("; + yyextra->current->spec |= Entry::NoExcept; + yyextra->lastRoundContext=FuncQual; + yyextra->pCopyRoundString=&yyextra->current->args; + yyextra->roundCount=0; BEGIN(CopyRound); } <FuncQual>{BN}*"&" { - current->args += " &"; - current->argList.refQualifier=RefQualifierLValue; + yyextra->current->args += " &"; + yyextra->current->argList.refQualifier=RefQualifierLValue; } <FuncQual>{BN}*"&&" { - current->args += " &&"; - current->argList.refQualifier=RefQualifierRValue; + yyextra->current->args += " &&"; + yyextra->current->argList.refQualifier=RefQualifierRValue; } <FuncQual,TrailingReturn>{BN}*"="{BN}*"0"{BN}* { // pure virtual member function - lineCount() ; - current->args += " = 0"; - current->virt = Pure; - current->argList.pureSpecifier=TRUE; + lineCount(yyscanner) ; + yyextra->current->args += " = 0"; + yyextra->current->virt = Pure; + yyextra->current->argList.pureSpecifier=TRUE; BEGIN(FuncQual); } <FuncQual,TrailingReturn>{BN}*"="{BN}*"delete"{BN}* { // C++11 explicitly delete member - lineCount(); - current->args += " = delete"; - current->spec |= Entry::Delete; - current->argList.isDeleted=TRUE; + lineCount(yyscanner); + yyextra->current->args += " = delete"; + yyextra->current->spec |= Entry::Delete; + yyextra->current->argList.isDeleted=TRUE; BEGIN(FuncQual); } <FuncQual,TrailingReturn>{BN}*"="{BN}*"default"{BN}* { // C++11 explicitly defaulted constructor/assignment operator - lineCount(); - current->args += " = default"; - current->spec |= Entry::Default; + lineCount(yyscanner); + yyextra->current->args += " = default"; + yyextra->current->spec |= Entry::Default; BEGIN(FuncQual); } <FuncQual>{BN}*"->"{BN}* { - lineCount(); - current->argList.trailingReturnType = " -> "; - current->args += " -> "; + lineCount(yyscanner); + yyextra->current->argList.trailingReturnType = " -> "; + yyextra->current->args += " -> "; BEGIN(TrailingReturn); } <TrailingReturn>[{;] { @@ -4836,30 +4534,30 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) BEGIN(FuncQual); } <TrailingReturn>. { - current->argList.trailingReturnType+=yytext; - current->args+=yytext; + yyextra->current->argList.trailingReturnType+=yytext; + yyextra->current->args+=yytext; } <TrailingReturn>\n { - lineCount(); - current->argList.trailingReturnType+=yytext; - current->args+=' '; + lineCount(yyscanner); + yyextra->current->argList.trailingReturnType+=yytext; + yyextra->current->args+=' '; } <FuncRound,FuncFunc>{BN}*","{BN}* { - lineCount() ; - current->args += ", " ; + lineCount(yyscanner) ; + yyextra->current->args += ", " ; } <FuncQual,FuncRound,FuncFunc>{BN}+ { - lineCount() ; - current->args += ' ' ; + lineCount(yyscanner) ; + yyextra->current->args += ' ' ; } -<Function,FuncQual,FuncRound,FuncFunc>"#" { if (insidePHP) +<Function,FuncQual,FuncRound,FuncFunc>"#" { if (yyextra->insidePHP) REJECT; - lastCPPContext = YY_START; + yyextra->lastCPPContext = YY_START; BEGIN(SkipCPP); } <FuncQual>"=" { - if (insideCli && - (current_root->section&Entry::COMPOUND_MASK) + if (yyextra->insideCli && + (yyextra->current_root->section&Entry::COMPOUND_MASK) ) { BEGIN(CliOverride); @@ -4867,9 +4565,9 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) else { // typically an initialized function pointer - lastInitializerContext=YY_START; - initBracketCount=0; - current->initializer = yytext; + yyextra->lastInitializerContext=YY_START; + yyextra->initBracketCount=0; + yyextra->current->initializer = yytext; BEGIN(ReadInitializer); } } @@ -4880,7 +4578,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) BEGIN(FuncQual); } <CliOverride>\n { - lineCount(); + lineCount(yyscanner); } <CliOverride>. { } @@ -4889,96 +4587,96 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) BEGIN(FuncQual); } <FuncPtrInit>\" { - current->args += *yytext; - pCopyQuotedString=¤t->args; - lastStringContext=FuncPtrInit; + yyextra->current->args += *yytext; + yyextra->pCopyQuotedString=&yyextra->current->args; + yyextra->lastStringContext=FuncPtrInit; BEGIN(CopyString); } <FuncPtrInit>\' { - current->args += *yytext; - if (insidePHP) + yyextra->current->args += *yytext; + if (yyextra->insidePHP) { - pCopyQuotedString=¤t->args; - lastStringContext=FuncPtrInit; + yyextra->pCopyQuotedString=&yyextra->current->args; + yyextra->lastStringContext=FuncPtrInit; BEGIN(CopyPHPString); } } <FuncPtrInit>{CHARLIT} { - if (insidePHP) + if (yyextra->insidePHP) { REJECT; } else { - current->args += yytext; + yyextra->current->args += yytext; } } <FuncPtrInit>{ID} { - current->args += yytext; + yyextra->current->args += yytext; } <FuncPtrInit>. { - current->args += *yytext; + yyextra->current->args += *yytext; } <FuncPtrInit>\n { - current->args += *yytext; - lineCount(); + yyextra->current->args += *yytext; + lineCount(yyscanner); } <FuncQual>{ID} { // typically a K&R style C function - if (insideCS && qstrcmp(yytext,"where")==0) + if (yyextra->insideCS && qstrcmp(yytext,"where")==0) { // type constraint for a method - current->typeConstr.clear(); - current->typeConstr.push_back(Argument()); - lastCSConstraint = YY_START; + yyextra->current->typeConstr.clear(); + yyextra->current->typeConstr.push_back(Argument()); + yyextra->lastCSConstraint = YY_START; BEGIN( CSConstraintName ); } - else if (checkForKnRstyleC()) + else if (checkForKnRstyleC(yyscanner)) { - current->args = yytext; - oldStyleArgType.resize(0); + yyextra->current->args = yytext; + yyextra->oldStyleArgType.resize(0); BEGIN(OldStyleArgs); } else { - current->args += yytext; + yyextra->current->args += yytext; } } <OldStyleArgs>[,;] { QCString oldStyleArgPtr; QCString oldStyleArgName; - splitKnRArg(oldStyleArgPtr,oldStyleArgName); + splitKnRArg(yyscanner,oldStyleArgPtr,oldStyleArgName); QCString doc,brief; - if (current->doc!=docBackup) + if (yyextra->current->doc!=yyextra->docBackup) { - doc=current->doc.copy(); - current->doc=docBackup; + doc=yyextra->current->doc.copy(); + yyextra->current->doc=yyextra->docBackup; } - if (current->brief!=briefBackup) + if (yyextra->current->brief!=yyextra->briefBackup) { - brief=current->brief.copy(); - current->brief=briefBackup; + brief=yyextra->current->brief.copy(); + yyextra->current->brief=yyextra->briefBackup; } - addKnRArgInfo(oldStyleArgType+oldStyleArgPtr, + addKnRArgInfo(yyscanner,yyextra->oldStyleArgType+oldStyleArgPtr, oldStyleArgName,brief,doc); - current->args.resize(0); - if (*yytext==';') oldStyleArgType.resize(0); + yyextra->current->args.resize(0); + if (*yytext==';') yyextra->oldStyleArgType.resize(0); } -<OldStyleArgs>{ID} { current->args += yytext; } +<OldStyleArgs>{ID} { yyextra->current->args += yytext; } <OldStyleArgs>"{" { - if (current->argList.empty()) + if (yyextra->current->argList.empty()) { - current->argList.noParameters=TRUE; + yyextra->current->argList.noParameters=TRUE; } - current->args = argListToString(current->argList); + yyextra->current->args = argListToString(yyextra->current->argList); unput('{'); BEGIN(FuncQual); } -<OldStyleArgs>. { current->args += *yytext; } -<FuncQual,FuncRound,FuncFunc>. { current->args += *yytext; } +<OldStyleArgs>. { yyextra->current->args += *yytext; } +<FuncQual,FuncRound,FuncFunc>. { yyextra->current->args += *yytext; } <FuncQual>{BN}*"try:" | <FuncQual>{BN}*"try"{BN}+ { /* try-function-block */ - insideTryBlock=TRUE; - lineCount(); + yyextra->insideTryBlock=TRUE; + lineCount(yyscanner); if (yytext[yyleng-1]==':') { unput(':'); @@ -4986,33 +4684,33 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } } <FuncQual>{BN}*"throw"{BN}*"(" { // C++ style throw clause - current->exception = " throw (" ; - roundCount=0; - lineCount() ; + yyextra->current->exception = " throw (" ; + yyextra->roundCount=0; + lineCount(yyscanner) ; BEGIN( ExcpRound ) ; } <FuncQual>{BN}*"raises"{BN}*"(" { - current->exception = " raises (" ; - lineCount() ; - roundCount=0; + yyextra->current->exception = " raises (" ; + lineCount(yyscanner) ; + yyextra->roundCount=0; BEGIN( ExcpRound ) ; } <FuncQual>{BN}*"throws"{BN}+ { // Java style throw clause - current->exception = " throws " ; - lineCount() ; + yyextra->current->exception = " throws " ; + lineCount(yyscanner) ; BEGIN( ExcpList ); } -<ExcpRound>"(" { current->exception += *yytext ; - ++roundCount ; +<ExcpRound>"(" { yyextra->current->exception += *yytext ; + ++yyextra->roundCount ; } -<ExcpRound>")" { current->exception += *yytext ; - if ( roundCount ) - --roundCount ; +<ExcpRound>")" { yyextra->current->exception += *yytext ; + if ( yyextra->roundCount ) + --yyextra->roundCount ; else BEGIN( FuncQual ) ; } <ExcpRound>. { - current->exception += *yytext; + yyextra->current->exception += *yytext; } <ExcpList>"{" { unput('{'); BEGIN( FuncQual ); @@ -5021,101 +4719,101 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) unput(';'); BEGIN( FuncQual ); } <ExcpList>"\n" { - current->exception += ' '; - lineCount(); + yyextra->current->exception += ' '; + lineCount(yyscanner); } <ExcpList>. { - current->exception += *yytext; + yyextra->current->exception += *yytext; } -<Function>"(" { current->type += current->name ; - current->name = current->args ; - current->args = yytext ; - roundCount=0; +<Function>"(" { yyextra->current->type += yyextra->current->name ; + yyextra->current->name = yyextra->current->args ; + yyextra->current->args = yytext ; + yyextra->roundCount=0; BEGIN( FuncRound ) ; } <Function>":" { - if (!insidePHP) BEGIN(SkipInits); + if (!yyextra->insidePHP) BEGIN(SkipInits); } <Function>[;{,] { - current->name=current->name.simplifyWhiteSpace(); - current->type=current->type.simplifyWhiteSpace(); - current->args=removeRedundantWhiteSpace(current->args); - // was: current->args.simplifyWhiteSpace(); - current->fileName = yyFileName; - current->startLine = yyBegLineNr; - current->startColumn = yyBegColNr; + yyextra->current->name=yyextra->current->name.simplifyWhiteSpace(); + yyextra->current->type=yyextra->current->type.simplifyWhiteSpace(); + yyextra->current->args=removeRedundantWhiteSpace(yyextra->current->args); + // was: yyextra->current->args.simplifyWhiteSpace(); + yyextra->current->fileName = yyextra->yyFileName; + yyextra->current->startLine = yyextra->yyBegLineNr; + yyextra->current->startColumn = yyextra->yyBegColNr; static QRegExp re("([^)]*[*&][^)]*)"); // (...*...) - if (*yytext!=';' || (current_root->section&Entry::COMPOUND_MASK) ) + if (*yytext!=';' || (yyextra->current_root->section&Entry::COMPOUND_MASK) ) { - int tempArg=current->name.find('<'); - int ts=current->type.find('<'); - int te=current->type.findRev('>'); - int ti=current->type.find(re,0); + int tempArg=yyextra->current->name.find('<'); + int ts=yyextra->current->type.find('<'); + int te=yyextra->current->type.findRev('>'); + int ti=yyextra->current->type.find(re,0); // bug677315: A<int(void *, char *)> get(); is not a function pointer bool isFunction = ti==-1 || // not a (...*...) pattern (ts!=-1 && ts<te && ts<ti && ti<te); // (...*...) is part of a template argument list //printf("type=%s ts=%d te=%d ti=%d isFunction=%d\n", - // current->type.data(),ts,te,ti,isFunction); + // yyextra->current->type.data(),ts,te,ti,isFunction); QCString tempName; - if (tempArg==-1) tempName=current->name; else tempName=current->name.left(tempArg); - if (!current->type.isEmpty() && - (!isFunction || current->type.left(8)=="typedef ")) + if (tempArg==-1) tempName=yyextra->current->name; else tempName=yyextra->current->name.left(tempArg); + if (!yyextra->current->type.isEmpty() && + (!isFunction || yyextra->current->type.left(8)=="typedef ")) { - //printf("Scanner.l: found in class variable: '%s' '%s' '%s'\n", current->type.data(),current->name.data(),current->args.data()); - if (isTypedef && current->type.left(8)!="typedef ") + //printf("Scanner.l: found in class variable: '%s' '%s' '%s'\n", yyextra->current->type.data(),yyextra->current->name.data(),yyextra->current->args.data()); + if (yyextra->isTypedef && yyextra->current->type.left(8)!="typedef ") { - current->type.prepend("typedef "); + yyextra->current->type.prepend("typedef "); } - current->section = Entry::VARIABLE_SEC ; + yyextra->current->section = Entry::VARIABLE_SEC ; } else { - //printf("Scanner.l: found in class function: '%s' '%s' '%s'\n", current->type.data(),current->name.data(),current->args.data()); - current->section = Entry::FUNCTION_SEC ; - current->proto = *yytext==';'; + //printf("Scanner.l: found in class function: '%s' '%s' '%s'\n", yyextra->current->type.data(),yyextra->current->name.data(),yyextra->current->args.data()); + yyextra->current->section = Entry::FUNCTION_SEC ; + yyextra->current->proto = *yytext==';'; } } else // a global function prototype or function variable { - //printf("Scanner.l: prototype? type='%s' name='%s' args='%s'\n",current->type.data(),current->name.data(),current->args.data()); - if (!current->type.isEmpty() && - (current->type.find(re,0)!=-1 || current->type.left(8)=="typedef ")) + //printf("Scanner.l: prototype? type='%s' name='%s' args='%s'\n",yyextra->current->type.data(),yyextra->current->name.data(),yyextra->current->args.data()); + if (!yyextra->current->type.isEmpty() && + (yyextra->current->type.find(re,0)!=-1 || yyextra->current->type.left(8)=="typedef ")) { - if (isTypedef && current->type.left(8)!="typedef ") + if (yyextra->isTypedef && yyextra->current->type.left(8)!="typedef ") { - current->type.prepend("typedef "); + yyextra->current->type.prepend("typedef "); } //printf("Scanner.l: found function variable!\n"); - current->section = Entry::VARIABLE_SEC; + yyextra->current->section = Entry::VARIABLE_SEC; } else { //printf("Scanner.l: found prototype\n"); - current->section = Entry::FUNCTION_SEC; - current->proto = TRUE; + yyextra->current->section = Entry::FUNCTION_SEC; + yyextra->current->proto = TRUE; } } - //printf("Adding entry '%s'\n",current->name.data()); - if ( insidePHP) + //printf("Adding entry '%s'\n",yyextra->current->name.data()); + if ( yyextra->insidePHP) { - if (findAndRemoveWord(current->type,"final")) + if (findAndRemoveWord(yyextra->current->type,"final")) { - current->spec |= Entry::Final; + yyextra->current->spec |= Entry::Final; } - if (findAndRemoveWord(current->type,"abstract")) + if (findAndRemoveWord(yyextra->current->type,"abstract")) { - current->spec |= Entry::Abstract; + yyextra->current->spec |= Entry::Abstract; } } - if ( insidePHP && !containsWord(current->type,"function")) + if ( yyextra->insidePHP && !containsWord(yyextra->current->type,"function")) { - initEntry(); + initEntry(yyscanner); if ( *yytext == '{' ) { - lastCurlyContext = FindMembers; - curlyCount=0; + yyextra->lastCurlyContext = FindMembers; + yyextra->curlyCount=0; BEGIN( SkipCurly ); } else @@ -5125,66 +4823,66 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } else { - if ( insidePHP) + if ( yyextra->insidePHP) { - findAndRemoveWord(current->type,"function"); + findAndRemoveWord(yyextra->current->type,"function"); } - previous = current.get(); - current_root->moveToSubEntryAndRefresh(current); - initEntry(); + yyextra->previous = yyextra->current; + yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current); + initEntry(yyscanner); // Objective C 2.0: Required/Optional section - if (previous->spec & (Entry::Optional | Entry::Required)) + if (yyextra->previous->spec & (Entry::Optional | Entry::Required)) { - current->spec |= previous->spec & (Entry::Optional|Entry::Required); + yyextra->current->spec |= yyextra->previous->spec & (Entry::Optional|Entry::Required); } - lastCurlyContext = FindMembers; + yyextra->lastCurlyContext = FindMembers; if ( *yytext == ',' ) { - current->type = previous->type; + yyextra->current->type = yyextra->previous->type; // we need to strip any trailing * and & (see bugs 623023 and 649103 for test cases) - int i=current->type.length(); - while (i>0 && (current->type[i-1]=='*' || current->type[i-1]=='&' || current->type[i-1]==' ')) i--; - current->type = current->type.left(i); + int i=yyextra->current->type.length(); + while (i>0 && (yyextra->current->type[i-1]=='*' || yyextra->current->type[i-1]=='&' || yyextra->current->type[i-1]==' ')) i--; + yyextra->current->type = yyextra->current->type.left(i); } if ( *yytext == '{' ) { - if ( !insidePHP && (current_root->section & Entry::COMPOUND_MASK) ) + if ( !yyextra->insidePHP && (yyextra->current_root->section & Entry::COMPOUND_MASK) ) { - previous->spec |= Entry::Inline; + yyextra->previous->spec |= Entry::Inline; } //addToBody(yytext); - curlyCount=0; + yyextra->curlyCount=0; BEGIN( SkipCurly ) ; } else { - if (previous->section!=Entry::VARIABLE_SEC) - previous->bodyLine=-1; // a function/member declaration + if (yyextra->previous->section!=Entry::VARIABLE_SEC) + yyextra->previous->bodyLine=-1; // a function/member declaration BEGIN( FindMembers ) ; } } } <SkipInits>">"{BN}*"{" { // C++11 style initializer (see bug 790788) - lineCount(); - curlyCount=1; + lineCount(yyscanner); + yyextra->curlyCount=1; BEGIN(SkipC11Inits); } <SkipInits>{ID}{BN}*"{" { // C++11 style initializer (see bug 688647) - lineCount(); - curlyCount=1; + lineCount(yyscanner); + yyextra->curlyCount=1; BEGIN(SkipC11Inits); } <SkipC11Inits>"{" { - ++curlyCount; + ++yyextra->curlyCount; } <SkipC11Inits>"}" { - if ( --curlyCount<=0 ) + if ( --yyextra->curlyCount<=0 ) { BEGIN(SkipInits); } } <SkipC11Attribute>"]]" { - BEGIN(lastC11AttributeContext); + BEGIN(yyextra->lastC11AttributeContext); } <SkipInits>"{" { // C++11 style initializer unput('{'); @@ -5192,197 +4890,197 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } <SkipCurly>"{" { //addToBody(yytext); - ++curlyCount ; + ++yyextra->curlyCount ; } <SkipCurly>"}"/{BN}*("/*!"|"/**"|"//!"|"///")"<!--" | /* see bug710917 */ <SkipCurly>"}" { //addToBody(yytext); - if( curlyCount ) + if( yyextra->curlyCount ) { - --curlyCount ; + --yyextra->curlyCount ; } else { - if (!current->sli.empty() && previous) // copy special list items + if (!yyextra->current->sli.empty() && yyextra->previous) // copy special list items { - previous->sli = current->sli; - current->sli.clear(); + yyextra->previous->sli = yyextra->current->sli; + yyextra->current->sli.clear(); } - if (previous) previous->endBodyLine=yyLineNr; - BEGIN( lastCurlyContext ) ; + if (yyextra->previous) yyextra->previous->endBodyLine=yyextra->yyLineNr; + BEGIN( yyextra->lastCurlyContext ) ; } } <SkipCurly>"}"{BN}*("/*!"|"/**"|"//!"|"///")"<" { - lineCount(); - if ( curlyCount ) + lineCount(yyscanner); + if ( yyextra->curlyCount ) { //addToBody(yytext); - --curlyCount ; + --yyextra->curlyCount ; } else { - current->endBodyLine=yyLineNr; - // take previous out of current_root and move it into current - current.swap(tempEntry); // remember current - current_root->moveFromSubEntry(previous,current); - previous = 0; + yyextra->current->endBodyLine=yyextra->yyLineNr; + // take yyextra->previous out of yyextra->current_root and move it into yyextra->current + yyextra->tempEntry = yyextra->current; // remember yyextra->current + yyextra->current_root->moveFromSubEntry(yyextra->previous.get(),yyextra->current); + yyextra->previous.reset(); - docBlockContext = SkipCurlyEndDoc; - docBlockInBody = FALSE; - docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) || + yyextra->docBlockContext = SkipCurlyEndDoc; + yyextra->docBlockInBody = FALSE; + yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) || ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) ); - docBlock.resize(0); - docBlockTerm = '}'; + yyextra->docBlock.resize(0); + yyextra->docBlockTerm = '}'; if (yytext[yyleng-3]=='/') { - startCommentBlock(TRUE); + startCommentBlock(yyscanner,TRUE); BEGIN( DocLine ); } else { - startCommentBlock(FALSE); + startCommentBlock(yyscanner,FALSE); BEGIN( DocBlock ); } } } <SkipCurlyEndDoc>"}"{BN}*("/*!"|"/**"|"//!"|"///")"<" { // desc is followed by another one - docBlockContext = SkipCurlyEndDoc; - docBlockInBody = FALSE; - docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) || + yyextra->docBlockContext = SkipCurlyEndDoc; + yyextra->docBlockInBody = FALSE; + yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) || ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) ); - docBlock.resize(0); - docBlockTerm = '}'; + yyextra->docBlock.resize(0); + yyextra->docBlockTerm = '}'; if (yytext[yyleng-3]=='/') { - startCommentBlock(TRUE); + startCommentBlock(yyscanner,TRUE); BEGIN( DocLine ); } else { - startCommentBlock(FALSE); + startCommentBlock(yyscanner,FALSE); BEGIN( DocBlock ); } } <SkipCurlyEndDoc>"}" { //addToBody("}"); - if (tempEntry) // we can only switch back to current if no new item was created + if (yyextra->tempEntry) // we can only switch back to yyextra->current if no new item was created { - tempEntry.swap(current); - tempEntry.reset(); + yyextra->current = yyextra->tempEntry; + yyextra->tempEntry.reset(); } - BEGIN( lastCurlyContext ); + BEGIN( yyextra->lastCurlyContext ); } <SkipCurly>\" { //addToBody(yytext); - lastStringContext=SkipCurly; + yyextra->lastStringContext=SkipCurly; BEGIN( SkipString ); } <SkipCurly>^{B}*"#" { - if (insidePHP) + if (yyextra->insidePHP) REJECT; //addToBody(yytext); BEGIN( SkipCurlyCpp ); } <SkipCurly,SkipC11Inits,SkipInits,SkipC11Attribute>\n { - lineCount(); + lineCount(yyscanner); //addToBody(yytext); } <SkipCurly,SkipCurlyCpp,ReadInitializer>"<<<" { - if (!insidePHP) + if (!yyextra->insidePHP) { REJECT; } else { - lastHereDocContext = YY_START; + yyextra->lastHereDocContext = YY_START; BEGIN(HereDoc); } } <SkipCurly,SkipCurlyCpp>{B}*{RAWBEGIN} { QCString raw=QCString(yytext).stripWhiteSpace(); - g_delimiter = raw.data()+2; - g_delimiter=g_delimiter.left(g_delimiter.length()-1); - lastRawStringContext = YY_START; - dummyRawString.resize(0); - pCopyRawString = &dummyRawString; - *pCopyRawString+=yytext; + yyextra->delimiter = raw.data()+2; + yyextra->delimiter=yyextra->delimiter.left(yyextra->delimiter.length()-1); + yyextra->lastRawStringContext = YY_START; + yyextra->dummyRawString.resize(0); + yyextra->pCopyRawString = &yyextra->dummyRawString; + *yyextra->pCopyRawString+=yytext; BEGIN(RawString); } <SkipCurly,SkipCurlyCpp>[^\n#"'@\\/{}<]+ { - lineCount(); // for g_column updates + lineCount(yyscanner); // for yyextra->column updates //addToBody(yytext); } <SkipCurlyCpp>\n { //addToBody(yytext); - lineCount(); - lastCurlyContext = FindMembers; + lineCount(yyscanner); + yyextra->lastCurlyContext = FindMembers; BEGIN( SkipCurly ); } <SkipCurlyCpp>\\[\r]*"\n"[\r]* { //addToBody(yytext); - lineCount(); + lineCount(yyscanner); } <SkipInits,SkipC11Inits,SkipCurly,SkipCurlyCpp,SkipC11Attribute>"/*" { //addToBody(yytext); - lastCContext = YY_START; + yyextra->lastCContext = YY_START; BEGIN(SkipComment); } <SkipInits,SkipC11Inits,SkipCurly,SkipCurlyCpp,SkipC11Attribute>"//" { //addToBody(yytext); - lastCContext = YY_START; + yyextra->lastCContext = YY_START; BEGIN(SkipCxxComment); } <SkipInits,SkipC11Inits,SkipC11Attribute>"(" { - roundCount=0; - lastSkipRoundContext=YY_START; + yyextra->roundCount=0; + yyextra->lastSkipRoundContext=YY_START; BEGIN(SkipRound); } <SkipInits,SkipC11Inits,SkipC11Attribute>\" { - lastStringContext=YY_START; + yyextra->lastStringContext=YY_START; BEGIN( SkipString ); } <SkipInits>; { - warn(yyFileName,yyLineNr, + warn(yyextra->yyFileName,yyextra->yyLineNr, "Found ';' while parsing initializer list! " "(doxygen could be confused by a macro call without semicolon)" ); BEGIN( FindMembers ); } <SkipInits,SkipCurly,SkipCurlyCpp>"#" { - if (!insidePHP) + if (!yyextra->insidePHP) REJECT; //addToBody(yytext); - lastCContext = YY_START; + yyextra->lastCContext = YY_START; BEGIN(SkipCxxComment); } <SkipInits,SkipCurly,SkipCurlyCpp>@\" { - if (!insideCS) REJECT; + if (!yyextra->insideCS) REJECT; // C# verbatim string - lastSkipVerbStringContext=YY_START; - pSkipVerbString=¤t->initializer; + yyextra->lastSkipVerbStringContext=YY_START; + yyextra->pSkipVerbString=&yyextra->current->initializer; BEGIN(SkipVerbString); } <SkipInits,SkipCurly,SkipCurlyCpp>{CHARLIT} { - if (insidePHP) REJECT; + if (yyextra->insidePHP) REJECT; } <SkipInits,SkipCurly,SkipCurlyCpp>\' { - if (insidePHP) + if (yyextra->insidePHP) { - lastStringContext=YY_START; + yyextra->lastStringContext=YY_START; BEGIN(SkipPHPString); } } <SkipInits,SkipC11Inits,SkipCurly,SkipCurlyCpp,SkipC11Attribute>. { } <SkipString,SkipPHPString>\\. { } <SkipString>\" { - BEGIN( lastStringContext ); + BEGIN( yyextra->lastStringContext ); } <SkipPHPString>\' { - BEGIN( lastStringContext ); + BEGIN( yyextra->lastStringContext ); } <SkipString,SkipPHPString>"/*"|"*/"|"//" { } <SkipString,SkipPHPString>\n { - lineCount(); + lineCount(yyscanner); } <SkipString,SkipPHPString>. { } <CompoundName>":" { // for "class : public base {} var;" construct, see bug 608359 @@ -5390,243 +5088,243 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) BEGIN(ClassVar); } <CompoundName>";" { - current->section = Entry::EMPTY_SEC ; - current->type.resize(0) ; - current->name.resize(0) ; - current->args.resize(0) ; - current->argList.clear(); + yyextra->current->section = Entry::EMPTY_SEC ; + yyextra->current->type.resize(0) ; + yyextra->current->name.resize(0) ; + yyextra->current->args.resize(0) ; + yyextra->current->argList.clear(); BEGIN( FindMembers ) ; } <Bases>";" { - if (insideIDL && (current->spec & (Entry::Singleton | + if (yyextra->insideIDL && (yyextra->current->spec & (Entry::Singleton | Entry::Service))) { // in UNO IDL a service or singleton may be defined // completely like this: "service Foo : XFoo;" - if (!current->name.isEmpty() && !current_root->name.isEmpty()) + if (!yyextra->current->name.isEmpty() && !yyextra->current_root->name.isEmpty()) { - prependScope(); + prependScope(yyscanner); } - current->name = current->name.stripWhiteSpace(); + yyextra->current->name = yyextra->current->name.stripWhiteSpace(); // there can be only one base class here - if (!baseName.isEmpty()) + if (!yyextra->baseName.isEmpty()) { - current->extends.push_back( - BaseInfo(baseName,Public,Normal)); - baseName.resize(0); + yyextra->current->extends.push_back( + BaseInfo(yyextra->baseName,Public,Normal)); + yyextra->baseName.resize(0); } - current_root->moveToSubEntryAndRefresh( current ) ; - initEntry(); + yyextra->current_root->moveToSubEntryAndRefresh( yyextra->current ) ; + initEntry(yyscanner); } else { - current->section = Entry::EMPTY_SEC ; - current->type.resize(0) ; - current->name.resize(0) ; - current->args.resize(0) ; - current->argList.clear(); + yyextra->current->section = Entry::EMPTY_SEC ; + yyextra->current->type.resize(0) ; + yyextra->current->name.resize(0) ; + yyextra->current->args.resize(0) ; + yyextra->current->argList.clear(); } BEGIN( FindMembers ) ; } <CompoundName>{SCOPENAME}/{BN}*"<" { - sharpCount = 0; - current->name = yytext ; - if (current->spec & Entry::Protocol) + yyextra->sharpCount = 0; + yyextra->current->name = yytext ; + if (yyextra->current->spec & Entry::Protocol) { - current->name+="-p"; + yyextra->current->name+="-p"; } - lineCount(); - lastClassTemplSpecContext = ClassVar; - if (insideObjC) // protocol list + lineCount(yyscanner); + yyextra->lastClassTemplSpecContext = ClassVar; + if (yyextra->insideObjC) // protocol list { BEGIN( ObjCProtocolList ); } - else if (insideCS) // C# generic class + else if (yyextra->insideCS) // C# generic class { - //current->name+="-g"; + //yyextra->current->name+="-g"; BEGIN( CSGeneric ); } else // C++ template specialization { - roundCount=0; + yyextra->roundCount=0; BEGIN( ClassTemplSpec ); } } <CSGeneric>"<" { ArgumentList al; // check bug 612858 before enabling the next line - //current->spec |= Entry::Template; - current->tArgLists.push_back(al); - currentArgumentList = ¤t->tArgLists.back(); - templateStr="<"; - current->name += "<"; - fullArgString = templateStr; - copyArgString = ¤t->name; - //copyArgString = &templateStr; - currentArgumentContext = ClassVar; + //yyextra->current->spec |= Entry::Template; + yyextra->current->tArgLists.push_back(al); + yyextra->currentArgumentList = &yyextra->current->tArgLists.back(); + yyextra->templateStr="<"; + yyextra->current->name += "<"; + yyextra->fullArgString = yyextra->templateStr; + yyextra->copyArgString = &yyextra->current->name; + //yyextra->copyArgString = &yyextra->templateStr; + yyextra->currentArgumentContext = ClassVar; BEGIN( ReadTempArgs ); } <ObjCProtocolList>"<" { - insideProtocolList=TRUE; + yyextra->insideProtocolList=TRUE; BEGIN( Bases ); } <ClassTemplSpec>">"({BN}*"::"{BN}*{SCOPENAME})? { - current->name += yytext; - lineCount(); - if (roundCount==0 && --sharpCount<=0) + yyextra->current->name += yytext; + lineCount(yyscanner); + if (yyextra->roundCount==0 && --yyextra->sharpCount<=0) { - current->name = removeRedundantWhiteSpace(current->name); - if (current->spec & Entry::Protocol) + yyextra->current->name = removeRedundantWhiteSpace(yyextra->current->name); + if (yyextra->current->spec & Entry::Protocol) { // Objective-C protocol unput('{'); // fake start of body BEGIN( ClassVar ); } else { - BEGIN( lastClassTemplSpecContext ); + BEGIN( yyextra->lastClassTemplSpecContext ); } } } <ClassTemplSpec>"<" { - current->name += yytext; - if (roundCount==0) sharpCount++; + yyextra->current->name += yytext; + if (yyextra->roundCount==0) yyextra->sharpCount++; } <ClassTemplSpec>. { - current->name += yytext; + yyextra->current->name += yytext; } <CompoundName>{SCOPENAME}{BN}*";" { // forward declaration - if (!current->tArgLists.empty()) + if (!yyextra->current->tArgLists.empty()) { // found a forward template declaration, this has // a purpose of its own - current->name = yytext; - current->name=current->name.left(current->name.length()-1).stripWhiteSpace(); - //printf("template class declaration for %s!\n",current->name.data()); - QCString rn = current_root->name.copy(); - //printf("cn='%s' rn='%s' isTypedef=%d\n",cn.data(),rn.data(),isTypedef); - if (!current->name.isEmpty() && !rn.isEmpty()) + yyextra->current->name = yytext; + yyextra->current->name=yyextra->current->name.left(yyextra->current->name.length()-1).stripWhiteSpace(); + //printf("template class declaration for %s!\n",yyextra->current->name.data()); + QCString rn = yyextra->current_root->name.copy(); + //printf("cn='%s' rn='%s' yyextra->isTypedef=%d\n",cn.data(),rn.data(),yyextra->isTypedef); + if (!yyextra->current->name.isEmpty() && !rn.isEmpty()) { - prependScope(); + prependScope(yyscanner); } - current->spec|=Entry::ForwardDecl; - current_root->moveToSubEntryAndRefresh(current); + yyextra->current->spec|=Entry::ForwardDecl; + yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current); } - else if (insideIDL && - (((current_root->spec & (Entry::Interface | + else if (yyextra->insideIDL && + (((yyextra->current_root->spec & (Entry::Interface | Entry::Service)) && - (current->spec & Entry::Interface)) || - ((current_root->spec & (Entry::Service | + (yyextra->current->spec & Entry::Interface)) || + ((yyextra->current_root->spec & (Entry::Service | Entry::Singleton)) && - (current->spec & Entry::Service)))) + (yyextra->current->spec & Entry::Service)))) { - // interface inside of UNO IDL service or interface - // service inside of UNO IDL service or singleton + // interface yyextra->inside of UNO IDL service or interface + // service yyextra->inside of UNO IDL service or singleton // there may be documentation on the member, // so do not throw it away... - current->name = yytext; - current->name=current->name.left(current->name.length()-1).stripWhiteSpace(); - current->section = (current->spec & Entry::Interface) + yyextra->current->name = yytext; + yyextra->current->name=yyextra->current->name.left(yyextra->current->name.length()-1).stripWhiteSpace(); + yyextra->current->section = (yyextra->current->spec & Entry::Interface) ? Entry::EXPORTED_INTERFACE_SEC : Entry::INCLUDED_SERVICE_SEC; -// current->section = Entry::MEMBERDOC_SEC; - current->spec &= ~(Entry::Interface|Entry::Service); // FIXME: horrible: Interface == Gettable, so need to clear it - actually we're mixing values from different enums in this case... granted only Optional and Interface are actually valid in this context but urgh... - current_root->moveToSubEntryAndRefresh(current); +// yyextra->current->section = Entry::MEMBERDOC_SEC; + yyextra->current->spec &= ~(Entry::Interface|Entry::Service); // FIXME: horrible: Interface == Gettable, so need to clear it - actually we're mixing values from different enums in this case... granted only Optional and Interface are actually valid in this context but urgh... + yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current); } unput(';'); - current->reset(); - initEntry(); - if (insideObjC) // see bug746361 + yyextra->current->reset(); + initEntry(yyscanner); + if (yyextra->insideObjC) // see bug746361 { - language = current->lang = SrcLangExt_Cpp; - insideObjC = FALSE; + yyextra->language = yyextra->current->lang = SrcLangExt_Cpp; + yyextra->insideObjC = FALSE; } - if (isTypedef) // typedef of a class, put typedef keyword back + if (yyextra->isTypedef) // typedef of a class, put typedef keyword back { - current->type.prepend("typedef"); + yyextra->current->type.prepend("typedef"); } BEGIN( FindMembers ); } <CompoundName>{SCOPENAME}/{BN}*"(" { - current->name = yytext ; - lineCount(); - if (insideCpp && current->name=="alignas") // C++11 + yyextra->current->name = yytext ; + lineCount(yyscanner); + if (yyextra->insideCpp && yyextra->current->name=="alignas") // C++11 { - lastAlignAsContext = YY_START; + yyextra->lastAlignAsContext = YY_START; BEGIN( AlignAs ); } else { - if (current->spec & Entry::Protocol) + if (yyextra->current->spec & Entry::Protocol) { - current->name += "-p"; + yyextra->current->name += "-p"; } BEGIN( ClassVar ); } } -<AlignAs>"(" { roundCount=0; +<AlignAs>"(" { yyextra->roundCount=0; BEGIN( AlignAsEnd ); } -<AlignAs>\n { lineCount(); } +<AlignAs>\n { lineCount(yyscanner); } <AlignAs>. -<AlignAsEnd>"(" { roundCount++; } -<AlignAsEnd>")" { if (--roundCount<0) +<AlignAsEnd>"(" { yyextra->roundCount++; } +<AlignAsEnd>")" { if (--yyextra->roundCount<0) { - BEGIN( lastAlignAsContext ); + BEGIN( yyextra->lastAlignAsContext ); } } -<AlignAsEnd>\n { lineCount(); } +<AlignAsEnd>\n { lineCount(yyscanner); } <AlignAsEnd>. <CompoundName>{SCOPENAME}/{BN}*"," { // multiple forward declarations on one line // e.g. @protocol A,B; - current->reset(); - initEntry(); + yyextra->current->reset(); + initEntry(yyscanner); } <CompoundName>{SCOPENAME} { - current->name = yytext ; - if (insideCpp || insideObjC) + yyextra->current->name = yytext ; + if (yyextra->insideCpp || yyextra->insideObjC) { - current->id = ClangParser::instance()->lookup(yyLineNr,yytext); + yyextra->current->id = ClangParser::instance()->lookup(yyextra->yyLineNr,yytext); } - lineCount(); - if (current->spec & Entry::Protocol) + lineCount(yyscanner); + if (yyextra->current->spec & Entry::Protocol) { - current->name += "-p"; + yyextra->current->name += "-p"; } - if ((current->spec & Entry::Protocol) || - current->section == Entry::OBJCIMPL_SEC) + if ((yyextra->current->spec & Entry::Protocol) || + yyextra->current->section == Entry::OBJCIMPL_SEC) { unput('{'); // fake start of body } BEGIN( ClassVar ); } <CompoundName>{CSSCOPENAME} { // C# style scope - current->name = substitute(yytext,".","::"); - lineCount(); + yyextra->current->name = substitute(yytext,".","::"); + lineCount(yyscanner); BEGIN( ClassVar ); } <ClassVar>{SCOPENAME}{BN}*/"(" { - if (insideIDL && qstrncmp(yytext,"switch",6)==0 && !isId(yytext[6])) + if (yyextra->insideIDL && qstrncmp(yytext,"switch",6)==0 && !isId(yytext[6])) { // Corba IDL style union - roundCount=0; + yyextra->roundCount=0; BEGIN(SkipUnionSwitch); } else { - addType(); - current->name = yytext; - current->name = current->name.stripWhiteSpace(); - lineCount(); + addType(yyscanner); + yyextra->current->name = yytext; + yyextra->current->name = yyextra->current->name.stripWhiteSpace(); + lineCount(yyscanner); BEGIN( FindMembers ); } } <ClassVar>"," { - if (isTypedef) + if (yyextra->isTypedef) { // multiple types in one typedef unput(','); - current->type.prepend("typedef "); + yyextra->current->type.prepend("typedef "); BEGIN(FindMembers); } else @@ -5635,12 +5333,12 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } } <ClassVar>("sealed"|"abstract")/{BN}*(":"|"{") { - if (insideCli) + if (yyextra->insideCli) { if (yytext[0]=='s') // sealed - current->spec |= Entry::SealedClass; + yyextra->current->spec |= Entry::SealedClass; else // abstract - current->spec |= Entry::AbstractClass; + yyextra->current->spec |= Entry::AbstractClass; BEGIN( ClassVar ); } else @@ -5649,66 +5347,66 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } } <ClassVar>{ID} { - if (insideCpp || insideObjC) + if (yyextra->insideCpp || yyextra->insideObjC) { - current->id = ClangParser::instance()->lookup(yyLineNr,yytext); + yyextra->current->id = ClangParser::instance()->lookup(yyextra->yyLineNr,yytext); } - if (insideIDL && qstrcmp(yytext,"switch")==0) + if (yyextra->insideIDL && qstrcmp(yytext,"switch")==0) { // Corba IDL style union - roundCount=0; + yyextra->roundCount=0; BEGIN(SkipUnionSwitch); } - else if ((insideJava || insidePHP || insideJS || insideSlice) && (qstrcmp(yytext,"implements")==0 || qstrcmp(yytext,"extends")==0)) + else if ((yyextra->insideJava || yyextra->insidePHP || yyextra->insideJS || yyextra->insideSlice) && (qstrcmp(yytext,"implements")==0 || qstrcmp(yytext,"extends")==0)) { - current->type.resize(0); - baseProt=Public; - baseVirt=Normal; - baseName.resize(0); + yyextra->current->type.resize(0); + yyextra->baseProt=Public; + yyextra->baseVirt=Normal; + yyextra->baseName.resize(0); BEGIN( BasesProt ) ; } - else if (insideCS && qstrcmp(yytext,"where")==0) // C# type constraint + else if (yyextra->insideCS && qstrcmp(yytext,"where")==0) // C# type constraint { - current->typeConstr.clear(); - current->typeConstr.push_back(Argument()); - lastCSConstraint = YY_START; + yyextra->current->typeConstr.clear(); + yyextra->current->typeConstr.push_back(Argument()); + yyextra->lastCSConstraint = YY_START; BEGIN( CSConstraintName ); } - else if (insideCli && qstrcmp(yytext,"abstract")==0) + else if (yyextra->insideCli && qstrcmp(yytext,"abstract")==0) { - current->spec|=Entry::Abstract; + yyextra->current->spec|=Entry::Abstract; } - else if (insideCli && qstrcmp(yytext,"sealed")==0) + else if (yyextra->insideCli && qstrcmp(yytext,"sealed")==0) { - current->spec|=Entry::Sealed; + yyextra->current->spec|=Entry::Sealed; } else if (qstrcmp(yytext,"final")==0) { - current->spec|=Entry::Final; + yyextra->current->spec|=Entry::Final; } else { - if (current->section == Entry::ENUM_SEC) + if (yyextra->current->section == Entry::ENUM_SEC) { // found "enum a b" -> variable - current->section = Entry::VARIABLE_SEC ; + yyextra->current->section = Entry::VARIABLE_SEC ; } - current->type += ' ' ; - current->type += current->name ; - current->name = yytext ; + yyextra->current->type += ' ' ; + yyextra->current->type += yyextra->current->name ; + yyextra->current->name = yytext ; - if (nameIsOperator(current->name)) + if (nameIsOperator(yyextra->current->name)) { BEGIN( Operator ); } } } <ClassVar>[(\[] { - if (insideObjC && *yytext=='(') // class category + if (yyextra->insideObjC && *yytext=='(') // class category { - current->name+='('; - //if (current->section!=Entry::OBJCIMPL_SEC) + yyextra->current->name+='('; + //if (yyextra->current->section!=Entry::OBJCIMPL_SEC) //{ - current->spec|=Entry::Category; + yyextra->current->spec|=Entry::Category; //} BEGIN( ClassCategory ); } @@ -5721,73 +5419,73 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } <CSConstraintType,CSConstraintName>"/**/" { /* empty comment */ } <CSConstraintType,CSConstraintName>("/*"[*!]|"//"[/!])("<"?) { // special comment - fullArgString.resize(0); - lastCopyArgChar='#'; // end marker - lastCommentInArgContext=YY_START; + yyextra->fullArgString.resize(0); + yyextra->lastCopyArgChar='#'; // end marker + yyextra->lastCommentInArgContext=YY_START; if (yytext[1]=='/') BEGIN( CopyArgCommentLine ); else BEGIN( CopyArgComment ); } <CSConstraintType,CSConstraintName>"#" { // artificially inserted token to signal end of comment block - current->typeConstr.back().docs = fullArgString; + yyextra->current->typeConstr.back().docs = yyextra->fullArgString; } <CSConstraintType>"{" { // end of type constraint reached // parse documentation of the constraints - handleParametersCommentBlocks(current->typeConstr); + handleParametersCommentBlocks(yyscanner,yyextra->current->typeConstr); unput('{'); - BEGIN( lastCSConstraint ); + BEGIN( yyextra->lastCSConstraint ); } <CSConstraintType,CSConstraintName>";" { - handleParametersCommentBlocks(current->typeConstr); + handleParametersCommentBlocks(yyscanner,yyextra->current->typeConstr); unput(';'); - BEGIN( lastCSConstraint ); + BEGIN( yyextra->lastCSConstraint ); } <CSConstraintName>":" { BEGIN( CSConstraintType ); } <CSConstraintName>{ID} { // parameter name - current->typeConstr.back().name=yytext; + yyextra->current->typeConstr.back().name=yytext; } <CSConstraintType>"where" { // another constraint for a different param - current->typeConstr.push_back(Argument()); + yyextra->current->typeConstr.push_back(Argument()); BEGIN( CSConstraintName ); } <CSConstraintType>({ID}".")*{ID}("<"{ID}">")?("()")? { - if (current->typeConstr.back().type.isEmpty()) + if (yyextra->current->typeConstr.back().type.isEmpty()) // first type constraint for this parameter { - current->typeConstr.back().type=yytext; + yyextra->current->typeConstr.back().type=yytext; } else // new type constraint for same parameter { - QCString name = current->typeConstr.back().name; - current->typeConstr.push_back(Argument()); - current->typeConstr.back().name=name; - current->typeConstr.back().type=yytext; + QCString name = yyextra->current->typeConstr.back().name; + yyextra->current->typeConstr.push_back(Argument()); + yyextra->current->typeConstr.back().name=name; + yyextra->current->typeConstr.back().type=yytext; } } <CSConstraintName,CSConstraintType>\n { - lineCount(); + lineCount(yyscanner); } <CSConstraintName,CSConstraintType>. { } <ClassCategory>{ID} { - current->name+=yytext; + yyextra->current->name+=yytext; } <ClassCategory>")"/{BN}*"{" { - current->name+=')'; + yyextra->current->name+=')'; BEGIN( ClassVar ); } <ClassCategory>")"/{BN}*"<" { - current->name+=')'; + yyextra->current->name+=')'; BEGIN( ObjCProtocolList ); } <ClassCategory>")" { - current->name+=')'; - if ((current->section & Entry::Protocol) || - current->section == Entry::OBJCIMPL_SEC) + yyextra->current->name+=')'; + if ((yyextra->current->section & Entry::Protocol) || + yyextra->current->section == Entry::OBJCIMPL_SEC) { unput('{'); // fake start of body } @@ -5799,61 +5497,61 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) BEGIN( ClassVar ); } <ClassVar>":" { - if (current->section==Entry::VARIABLE_SEC) // enum A B:2, see bug 748208 + if (yyextra->current->section==Entry::VARIABLE_SEC) // enum A B:2, see bug 748208 { - current->bitfields+=":"; - current->args.resize(0); + yyextra->current->bitfields+=":"; + yyextra->current->args.resize(0); BEGIN(BitFields); } - else if (current->section==Entry::ENUM_SEC) // enum E:2, see bug 313527, + else if (yyextra->current->section==Entry::ENUM_SEC) // enum E:2, see bug 313527, // or C++11 style enum: 'E : unsigned int {...}' { - current->args.resize(0); + yyextra->current->args.resize(0); BEGIN(EnumBaseType); } else { - current->type.resize(0); - if ((current->spec & Entry::Interface) || - (current->spec & Entry::Struct) || - (current->spec & Entry::Ref) || - (current->spec & Entry::Value) || - insidePHP || insideCS || insideD || insideObjC || insideIDL + yyextra->current->type.resize(0); + if ((yyextra->current->spec & Entry::Interface) || + (yyextra->current->spec & Entry::Struct) || + (yyextra->current->spec & Entry::Ref) || + (yyextra->current->spec & Entry::Value) || + yyextra->insidePHP || yyextra->insideCS || yyextra->insideD || yyextra->insideObjC || yyextra->insideIDL ) - baseProt=Public; + yyextra->baseProt=Public; else - baseProt=Private; - baseVirt=Normal; - baseName.resize(0); + yyextra->baseProt=Private; + yyextra->baseVirt=Normal; + yyextra->baseName.resize(0); BEGIN( BasesProt ) ; } } <ClassVar>[;=*&] { unput(*yytext); - if (isTypedef) // typedef of a class, put typedef keyword back + if (yyextra->isTypedef) // typedef of a class, put typedef keyword back { - current->type.prepend("typedef"); + yyextra->current->type.prepend("typedef"); } if ((yytext[0]=='*' || yytext[0]=='&') && - current->section == Entry::ENUM_SEC) + yyextra->current->section == Entry::ENUM_SEC) { // found "enum a *b" -> variable - current->section = Entry::VARIABLE_SEC ; + yyextra->current->section = Entry::VARIABLE_SEC ; } BEGIN( FindMembers ); } <Bases,ClassVar>"///"/[^/] { - if (!insideObjC) + if (!yyextra->insideObjC) { REJECT; } else { - lineCount(); - current->program+=yytext; - current->fileName = yyFileName ; - current->startLine = yyLineNr ; - current->startColumn = yyColNr; - curlyCount=0; + lineCount(yyscanner); + yyextra->current->program+=yytext; + yyextra->current->fileName = yyextra->yyFileName ; + yyextra->current->startLine = yyextra->yyLineNr ; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->curlyCount=0; BEGIN( ReadBodyIntf ); } } @@ -5861,56 +5559,56 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) <Bases,ClassVar>("//"{B}*)?"/*!" | <Bases,ClassVar>"//!" | <Bases,ClassVar>[\-+]{BN}* { - if (!insideObjC) + if (!yyextra->insideObjC) { REJECT; } else { - lineCount(); - current->program+=yytext; - current->fileName = yyFileName ; - current->startLine = yyLineNr ; - current->startColumn = yyColNr; - curlyCount=0; + lineCount(yyscanner); + yyextra->current->program+=yytext; + yyextra->current->fileName = yyextra->yyFileName ; + yyextra->current->startLine = yyextra->yyLineNr ; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->curlyCount=0; BEGIN( ReadBodyIntf ); } } <CompoundName,ClassVar>{B}*"{"{B}* { - current->fileName = yyFileName ; - current->startLine = yyLineNr ; - current->startColumn = yyColNr; - current->name = removeRedundantWhiteSpace(current->name); - if (current->name.isEmpty() && !isTypedef) // anonymous compound + yyextra->current->fileName = yyextra->yyFileName ; + yyextra->current->startLine = yyextra->yyLineNr ; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->name = removeRedundantWhiteSpace(yyextra->current->name); + if (yyextra->current->name.isEmpty() && !yyextra->isTypedef) // anonymous compound { - if (current->section==Entry::NAMESPACE_SEC) // allow reopening of anonymous namespaces + if (yyextra->current->section==Entry::NAMESPACE_SEC) // allow reopening of anonymous namespaces { if (Config_getBool(EXTRACT_ANON_NSPACES)) // use visible name { - current->name="anonymous_namespace{"+stripPath(current->fileName)+"}"; + yyextra->current->name="anonymous_namespace{"+stripPath(yyextra->current->fileName)+"}"; } else // use invisible name { - current->name.sprintf("@%d",anonNSCount); + yyextra->current->name.sprintf("@%d",yyextra->anonNSCount); } } else { - current->name.sprintf("@%d",anonCount++); + yyextra->current->name.sprintf("@%d",yyextra->anonCount++); } } - curlyCount=0; - if (current_root && // not a nested struct inside an @interface section - !(current_root->spec & Entry::Interface) && - ((current->spec & (Entry::Interface | Entry::Protocol | Entry::Category) || - current->section==Entry::OBJCIMPL_SEC) + yyextra->curlyCount=0; + if (yyextra->current_root && // not a nested struct yyextra->inside an @interface section + !(yyextra->current_root->spec & Entry::Interface) && + ((yyextra->current->spec & (Entry::Interface | Entry::Protocol | Entry::Category) || + yyextra->current->section==Entry::OBJCIMPL_SEC) ) && - insideObjC + yyextra->insideObjC ) { // ObjC body that ends with @end BEGIN( ReadBodyIntf ); } - else if (current->section==Entry::NAMESPACE_SEC) + else if (yyextra->current->section==Entry::NAMESPACE_SEC) { // namespace body BEGIN( ReadNSBody ); } @@ -5919,60 +5617,60 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) BEGIN( ReadBody ) ; } } -<BasesProt>"virtual"{BN}+ { lineCount(); baseVirt = Virtual; } -<BasesProt>"public"{BN}+ { lineCount(); baseProt = Public; } -<BasesProt>"protected"{BN}+ { lineCount(); baseProt = Protected; } -<BasesProt>"internal"{BN}+ { if (!insideCli) REJECT ; lineCount(); baseProt = Package; } -<BasesProt>"private"{BN}+ { lineCount(); baseProt = Private; } -<BasesProt>{BN} { lineCount(); } +<BasesProt>"virtual"{BN}+ { lineCount(yyscanner); yyextra->baseVirt = Virtual; } +<BasesProt>"public"{BN}+ { lineCount(yyscanner); yyextra->baseProt = Public; } +<BasesProt>"protected"{BN}+ { lineCount(yyscanner); yyextra->baseProt = Protected; } +<BasesProt>"internal"{BN}+ { if (!yyextra->insideCli) REJECT ; lineCount(yyscanner); yyextra->baseProt = Package; } +<BasesProt>"private"{BN}+ { lineCount(yyscanner); yyextra->baseProt = Private; } +<BasesProt>{BN} { lineCount(yyscanner); } <BasesProt>. { unput(*yytext); BEGIN(Bases); } <Bases>("\\")?({ID}"\\")*{ID} { // PHP namespace token, not sure if interspacing is allowed but it gives problems (see bug 640847) - if (!insidePHP) + if (!yyextra->insidePHP) { REJECT; } else // PHP base class of the form \Ns\Cl or Ns\Cl { - lineCount(); + lineCount(yyscanner); QCString bn=yytext; bn = substitute(bn,"\\","::"); - baseName += bn; - current->args += ' '; - current->args += yytext; + yyextra->baseName += bn; + yyextra->current->args += ' '; + yyextra->current->args += yytext; } } <Bases>("::")?{BN}*({ID}{BN}*"::"{BN}*)*{ID} { - lineCount(); + lineCount(yyscanner); QCString baseScope = yytext; - if (insideCS && baseScope.stripWhiteSpace()=="where") + if (yyextra->insideCS && baseScope.stripWhiteSpace()=="where") { // type constraint for a class - current->typeConstr.clear(); - current->typeConstr.push_back(Argument()); - lastCSConstraint = YY_START; + yyextra->current->typeConstr.clear(); + yyextra->current->typeConstr.push_back(Argument()); + yyextra->lastCSConstraint = YY_START; BEGIN( CSConstraintName ); } else { - baseName+=yytext; - current->args += ' '; - current->args += yytext; + yyextra->baseName+=yytext; + yyextra->current->args += ' '; + yyextra->current->args += yytext; } } <Bases>{BN}*{ID}("."{ID})* { // Java style class QCString name = substitute(yytext,".","::"); - baseName += name; - current->args += ' '; - current->args += name; + yyextra->baseName += name; + yyextra->current->args += ' '; + yyextra->current->args += name; } <ClassVar,Bases>\n/{BN}*[^{, \t\n] { - if (!insideObjC) + if (!yyextra->insideObjC) { REJECT; } else { - lineCount(); + lineCount(yyscanner); unput('{'); } } @@ -5984,53 +5682,53 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) unput('}'); unput('{'); } -<ClassVar>"<" { current->name += *yytext; - sharpCount=1; - roundCount=0; - lastSkipSharpContext = YY_START; - specName = ¤t->name; +<ClassVar>"<" { yyextra->current->name += *yytext; + yyextra->sharpCount=1; + yyextra->roundCount=0; + yyextra->lastSkipSharpContext = YY_START; + yyextra->specName = &yyextra->current->name; BEGIN ( Specialization ); } <Bases>{BN}*"<" { - lineCount(); - sharpCount=1; - roundCount=0; - lastSkipSharpContext = YY_START; - if (insideObjC) // start of protocol list + lineCount(yyscanner); + yyextra->sharpCount=1; + yyextra->roundCount=0; + yyextra->lastSkipSharpContext = YY_START; + if (yyextra->insideObjC) // start of protocol list { unput(','); } else // template specialization { - //if (insideCS) // generic + //if (yyextra->insideCS) // generic //{ - // baseName+="-g"; + // yyextra->baseName+="-g"; //} - templateStr = yytext; - specName = &templateStr; + yyextra->templateStr = yytext; + yyextra->specName = &yyextra->templateStr; BEGIN ( Specialization ); } } -<Specialization>"<" { *specName += *yytext; - if (roundCount==0) sharpCount++; +<Specialization>"<" { *yyextra->specName += *yytext; + if (yyextra->roundCount==0) yyextra->sharpCount++; } <Specialization>">" { - *specName += *yytext; - if (roundCount==0 && --sharpCount<=0) + *yyextra->specName += *yytext; + if (yyextra->roundCount==0 && --yyextra->sharpCount<=0) { - baseName+=removeRedundantWhiteSpace(*specName); - BEGIN(lastSkipSharpContext); + yyextra->baseName+=removeRedundantWhiteSpace(*yyextra->specName); + BEGIN(yyextra->lastSkipSharpContext); } } -<Specialization>{BN}+ { lineCount(); *specName +=' '; } -<Specialization>"<<" { *specName += yytext; } +<Specialization>{BN}+ { lineCount(yyscanner); *yyextra->specName +=' '; } +<Specialization>"<<" { *yyextra->specName += yytext; } <Specialization>">>"/{B}*"::" { // M$ C++ extension to allow >> to close a template... unput('>'); unput(' '); unput('>'); } <Specialization>">>" { - if (insideCS) // for C# >> ends a nested template + if (yyextra->insideCS) // for C# >> ends a nested template { REJECT; } @@ -6040,9 +5738,9 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) // We require the bitshift to be enclosed in braces. // See http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1757.html { - if (roundCount>0) + if (yyextra->roundCount>0) { - *specName += yytext; + *yyextra->specName += yytext; } else { @@ -6052,64 +5750,64 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } } } -<Specialization>"typename"{BN}+ { lineCount(); } -<Specialization>"(" { *specName += *yytext; roundCount++; } -<Specialization>")" { *specName += *yytext; roundCount--; } - -<Specialization>"\\\\" { *specName += *yytext;} -<Specialization>"\\'" { *specName += *yytext;} -<Specialization>"\\\"" { *specName += *yytext;} -<Specialization>"'" { *specName += *yytext;BEGIN(SpecializationSingleQuote);} -<Specialization>"\"" { *specName += *yytext;BEGIN(SpecializationDoubleQuote);} -<SpecializationSingleQuote,SpecializationDoubleQuote>"\\\\" { *specName += *yytext;} -<SpecializationSingleQuote>"\\'" { *specName += *yytext;} -<SpecializationSingleQuote>"'" { *specName += *yytext; BEGIN(Specialization);} -<SpecializationDoubleQuote>"\\\"" { *specName += *yytext;} -<SpecializationDoubleQuote>"\"" { *specName += *yytext; BEGIN(Specialization);} -<SpecializationSingleQuote,SpecializationDoubleQuote>. { *specName += *yytext;} +<Specialization>"typename"{BN}+ { lineCount(yyscanner); } +<Specialization>"(" { *yyextra->specName += *yytext; yyextra->roundCount++; } +<Specialization>")" { *yyextra->specName += *yytext; yyextra->roundCount--; } + +<Specialization>"\\\\" { *yyextra->specName += *yytext;} +<Specialization>"\\'" { *yyextra->specName += *yytext;} +<Specialization>"\\\"" { *yyextra->specName += *yytext;} +<Specialization>"'" { *yyextra->specName += *yytext;BEGIN(SpecializationSingleQuote);} +<Specialization>"\"" { *yyextra->specName += *yytext;BEGIN(SpecializationDoubleQuote);} +<SpecializationSingleQuote,SpecializationDoubleQuote>"\\\\" { *yyextra->specName += *yytext;} +<SpecializationSingleQuote>"\\'" { *yyextra->specName += *yytext;} +<SpecializationSingleQuote>"'" { *yyextra->specName += *yytext; BEGIN(Specialization);} +<SpecializationDoubleQuote>"\\\"" { *yyextra->specName += *yytext;} +<SpecializationDoubleQuote>"\"" { *yyextra->specName += *yytext; BEGIN(Specialization);} +<SpecializationSingleQuote,SpecializationDoubleQuote>. { *yyextra->specName += *yytext;} <Specialization>. { - *specName += *yytext; + *yyextra->specName += *yytext; } -<SkipRound>"(" { ++roundCount; } -<SkipRound>")" { if (--roundCount<0) - BEGIN ( lastSkipRoundContext ); +<SkipRound>"(" { ++yyextra->roundCount; } +<SkipRound>")" { if (--yyextra->roundCount<0) + BEGIN ( yyextra->lastSkipRoundContext ); } <SkipRound>\" { - lastStringContext=SkipRound; + yyextra->lastStringContext=SkipRound; BEGIN(SkipString); } -<Bases>","|(">"({BN}*"{")?)|({BN}+"implements"{BN}*) { lineCount(); - if (insideProtocolList) +<Bases>","|(">"({BN}*"{")?)|({BN}+"implements"{BN}*) { lineCount(yyscanner); + if (yyextra->insideProtocolList) { - baseName+="-p"; + yyextra->baseName+="-p"; } else { - current->args += ',' ; + yyextra->current->args += ',' ; } - current->name = removeRedundantWhiteSpace(current->name); - if (!baseName.isEmpty()) + yyextra->current->name = removeRedundantWhiteSpace(yyextra->current->name); + if (!yyextra->baseName.isEmpty()) { - current->extends.push_back( - BaseInfo(baseName,baseProt,baseVirt) + yyextra->current->extends.push_back( + BaseInfo(yyextra->baseName,yyextra->baseProt,yyextra->baseVirt) ); } - if ((current->spec & (Entry::Interface|Entry::Struct)) || - insideJava || insidePHP || insideCS || - insideD || insideObjC || insideIDL || insideSlice) + if ((yyextra->current->spec & (Entry::Interface|Entry::Struct)) || + yyextra->insideJava || yyextra->insidePHP || yyextra->insideCS || + yyextra->insideD || yyextra->insideObjC || yyextra->insideIDL || yyextra->insideSlice) { - baseProt=Public; + yyextra->baseProt=Public; } else { - baseProt=Private; + yyextra->baseProt=Private; } - baseVirt=Normal; - baseName.resize(0); + yyextra->baseVirt=Normal; + yyextra->baseName.resize(0); if (*yytext=='>') { // end of a ObjC protocol list - insideProtocolList=FALSE; + yyextra->insideProtocolList=FALSE; if (yyleng==1) { unput('{'); // dummy start body @@ -6121,23 +5819,23 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } else { - if (*yytext==',' && insideObjC) // Begin of protocol list + if (*yytext==',' && yyextra->insideObjC) // Begin of protocol list { - insideProtocolList=TRUE; + yyextra->insideProtocolList=TRUE; } BEGIN(BasesProt); } } -<Bases>{B}*"{"{B}* { current->fileName = yyFileName ; - current->startLine = yyLineNr ; - current->startColumn = yyColNr; - current->name = removeRedundantWhiteSpace(current->name); - if (!baseName.isEmpty()) - current->extends.push_back( - BaseInfo(baseName,baseProt,baseVirt) +<Bases>{B}*"{"{B}* { yyextra->current->fileName = yyextra->yyFileName ; + yyextra->current->startLine = yyextra->yyLineNr ; + yyextra->current->startColumn = yyextra->yyColNr; + yyextra->current->name = removeRedundantWhiteSpace(yyextra->current->name); + if (!yyextra->baseName.isEmpty()) + yyextra->current->extends.push_back( + BaseInfo(yyextra->baseName,yyextra->baseProt,yyextra->baseVirt) ); - curlyCount=0; - if (insideObjC) + yyextra->curlyCount=0; + if (yyextra->insideObjC) { BEGIN( ReadBodyIntf ); } @@ -6147,217 +5845,214 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } } <SkipUnionSwitch>{B}*"(" { - roundCount++; + yyextra->roundCount++; } <SkipUnionSwitch>")" { - if (--roundCount==0) + if (--yyextra->roundCount==0) { BEGIN(ClassVar); } } -<SkipUnionSwitch>\n { lineCount(); } +<SkipUnionSwitch>\n { lineCount(yyscanner); } <SkipUnionSwitch>. -<Comment>{BN}+ { current->program += yytext ; - lineCount() ; +<Comment>{BN}+ { yyextra->current->program += yytext ; + lineCount(yyscanner) ; } -<Comment>"/*" { current->program += yytext ; } -<Comment>"//" { current->program += yytext ; } +<Comment>"/*" { yyextra->current->program += yytext ; } +<Comment>"//" { yyextra->current->program += yytext ; } <Comment>{CMD}("code"|"verbatim") { - insideCode=TRUE; - current->program += yytext ; + yyextra->insideCode=TRUE; + yyextra->current->program += yytext ; } <Comment>{CMD}("endcode"|"endverbatim") { - insideCode=FALSE; - current->program += yytext ; + yyextra->insideCode=FALSE; + yyextra->current->program += yytext ; } -<Comment>[^ \.\t\r\n\/\*]+ { current->program += yytext ; } -<Comment>"*/" { current->program += yytext ; - if (!insideCode) BEGIN( lastContext ) ; +<Comment>[^ \.\t\r\n\/\*]+ { yyextra->current->program += yytext ; } +<Comment>"*/" { yyextra->current->program += yytext ; + if (!yyextra->insideCode) BEGIN( yyextra->lastContext ) ; } -<Comment>. { current->program += *yytext ; } +<Comment>. { yyextra->current->program += *yytext ; } <FindMembers,FindFields,MemberSpec,FuncQual,SkipCurly,Operator,ClassVar,SkipInits,SkipC11Inits,SkipC11Attribute,Bases,OldStyleArgs>("//"{B}*)?"/*!" { - //printf("Start doc block at %d\n",yyLineNr); - removeSlashes=(yytext[1]=='/'); - tmpDocType=-1; - if (!current->doc.isEmpty()) + //printf("Start doc block at %d\n",yyextra->yyLineNr); + if (!yyextra->current->doc.isEmpty()) { - current->doc+="\n\n"; + yyextra->current->doc+="\n\n"; } else { - current->docLine = yyLineNr; - current->docFile = yyFileName; + yyextra->current->docLine = yyextra->yyLineNr; + yyextra->current->docFile = yyextra->yyFileName; } - lastDocContext = YY_START; - if (current_root->section & Entry::SCOPE_MASK) + yyextra->lastDocContext = YY_START; + if (yyextra->current_root->section & Entry::SCOPE_MASK) { - current->inside = current_root->name+"::"; + yyextra->current->inside = yyextra->current_root->name+"::"; } - docBlockContext = YY_START; - docBlockInBody = YY_START==SkipCurly; - docBlockAutoBrief = Config_getBool(QT_AUTOBRIEF); + yyextra->docBlockContext = YY_START; + yyextra->docBlockInBody = YY_START==SkipCurly; + yyextra->docBlockAutoBrief = Config_getBool(QT_AUTOBRIEF); QCString indent; - indent.fill(' ',computeIndent(yytext,g_column)); - docBlock=indent; + indent.fill(' ',computeIndent(yytext,yyextra->column)); + yyextra->docBlock=indent; - if (docBlockAutoBrief) + if (yyextra->docBlockAutoBrief) { - current->briefLine = yyLineNr; - current->briefFile = yyFileName; + yyextra->current->briefLine = yyextra->yyLineNr; + yyextra->current->briefFile = yyextra->yyFileName; } - startCommentBlock(FALSE); + startCommentBlock(yyscanner,FALSE); BEGIN( DocBlock ); } <FindMembers,FindFields,MemberSpec,FuncQual,SkipCurly,Operator,ClassVar,SkipInits,Bases,OldStyleArgs>"/**"[*]+{BL} { + bool javadocBanner = Config_getBool(JAVADOC_BANNER); + lineCount(yyscanner); - static bool javadocBanner = Config_getBool(JAVADOC_BANNER); - - if( javadocBanner ) { - lastDocContext = YY_START; + if( javadocBanner ) + { + yyextra->lastDocContext = YY_START; - //printf("Found comment banner at %s:%d\n",yyFileName,yyLineNr); - if (current_root->section & Entry::SCOPE_MASK) - { - current->inside = current_root->name+"::"; - } - current->docLine = yyLineNr; - current->docFile = yyFileName; - docBlockContext = YY_START; - docBlockInBody = YY_START==SkipCurly; - static bool javadocAutoBrief = Config_getBool(JAVADOC_AUTOBRIEF); - docBlockAutoBrief = javadocAutoBrief; + //printf("Found comment banner at %s:%d\n",yyextra->yyFileName,yyextra->yyLineNr); + if (yyextra->current_root->section & Entry::SCOPE_MASK) + { + yyextra->current->inside = yyextra->current_root->name+"::"; + } + yyextra->current->docLine = yyextra->yyLineNr; + yyextra->current->docFile = yyextra->yyFileName; + yyextra->docBlockContext = YY_START; + yyextra->docBlockInBody = YY_START==SkipCurly; + bool javadocAutoBrief = Config_getBool(JAVADOC_AUTOBRIEF); + yyextra->docBlockAutoBrief = javadocAutoBrief; - QCString indent; - indent.fill(' ',computeIndent(yytext,g_column)); - docBlock=indent; + QCString indent; + indent.fill(' ',computeIndent(yytext,yyextra->column)); + yyextra->docBlock=indent; - if (docBlockAutoBrief) - { - current->briefLine = yyLineNr; - current->briefFile = yyFileName; - } - startCommentBlock(FALSE); - BEGIN( DocBlock ); - } else { - current->program += yytext ; - lastContext = YY_START ; - BEGIN( Comment ) ; + if (yyextra->docBlockAutoBrief) + { + yyextra->current->briefLine = yyextra->yyLineNr; + yyextra->current->briefFile = yyextra->yyFileName; + } + startCommentBlock(yyscanner,FALSE); + BEGIN( DocBlock ); + } + else + { + yyextra->current->program += yytext ; + yyextra->lastContext = YY_START ; + BEGIN( Comment ) ; } - } <FindMembers,FindFields,MemberSpec,FuncQual,SkipCurly,Operator,ClassVar,SkipInits,Bases,OldStyleArgs>("//"{B}*)?"/**"/[^/*] { - removeSlashes=(yytext[1]=='/'); - lastDocContext = YY_START; + yyextra->lastDocContext = YY_START; - //printf("Found comment block at %s:%d\n",yyFileName,yyLineNr); - if (current_root->section & Entry::SCOPE_MASK) + //printf("Found comment block at %s:%d\n",yyextra->yyFileName,yyextra->yyLineNr); + if (yyextra->current_root->section & Entry::SCOPE_MASK) { - current->inside = current_root->name+"::"; + yyextra->current->inside = yyextra->current_root->name+"::"; } - current->docLine = yyLineNr; - current->docFile = yyFileName; - docBlockContext = YY_START; - docBlockInBody = YY_START==SkipCurly; - static bool javadocAutoBrief = Config_getBool(JAVADOC_AUTOBRIEF); - docBlockAutoBrief = javadocAutoBrief; + yyextra->current->docLine = yyextra->yyLineNr; + yyextra->current->docFile = yyextra->yyFileName; + yyextra->docBlockContext = YY_START; + yyextra->docBlockInBody = YY_START==SkipCurly; + bool javadocAutoBrief = Config_getBool(JAVADOC_AUTOBRIEF); + yyextra->docBlockAutoBrief = javadocAutoBrief; QCString indent; - indent.fill(' ',computeIndent(yytext,g_column)); - docBlock=indent; + indent.fill(' ',computeIndent(yytext,yyextra->column)); + yyextra->docBlock=indent; - if (docBlockAutoBrief) + if (yyextra->docBlockAutoBrief) { - current->briefLine = yyLineNr; - current->briefFile = yyFileName; + yyextra->current->briefLine = yyextra->yyLineNr; + yyextra->current->briefFile = yyextra->yyFileName; } - startCommentBlock(FALSE); + startCommentBlock(yyscanner,FALSE); BEGIN( DocBlock ); } <FindMembers,FindFields,MemberSpec,SkipCurly,FuncQual,Operator,ClassVar,Bases,OldStyleArgs>"//!" { - tmpDocType=-1; - lastDocContext = YY_START; - if (current_root->section & Entry::SCOPE_MASK) + yyextra->lastDocContext = YY_START; + if (yyextra->current_root->section & Entry::SCOPE_MASK) { - current->inside = current_root->name+"::"; + yyextra->current->inside = yyextra->current_root->name+"::"; } - docBlockContext = YY_START; - docBlockInBody = YY_START==SkipCurly; - docBlockAutoBrief = FALSE; + yyextra->docBlockContext = YY_START; + yyextra->docBlockInBody = YY_START==SkipCurly; + yyextra->docBlockAutoBrief = FALSE; QCString indent; - indent.fill(' ',computeIndent(yytext,g_column)); - docBlock=indent; + indent.fill(' ',computeIndent(yytext,yyextra->column)); + yyextra->docBlock=indent; - startCommentBlock(current->brief.isEmpty()); + startCommentBlock(yyscanner,yyextra->current->brief.isEmpty()); BEGIN( DocLine ); } <FindMembers,FindFields,MemberSpec,SkipCurly,FuncQual,Operator,ClassVar,Bases,OldStyleArgs>"///"/[^/] { - tmpDocType=-1; - lastDocContext = YY_START; - if (current_root->section & Entry::SCOPE_MASK) + yyextra->lastDocContext = YY_START; + if (yyextra->current_root->section & Entry::SCOPE_MASK) { - current->inside = current_root->name+"::"; + yyextra->current->inside = yyextra->current_root->name+"::"; } - docBlockContext = YY_START; - docBlockInBody = YY_START==SkipCurly; - docBlockAutoBrief = FALSE; + yyextra->docBlockContext = YY_START; + yyextra->docBlockInBody = YY_START==SkipCurly; + yyextra->docBlockAutoBrief = FALSE; QCString indent; - indent.fill(' ',computeIndent(yytext,g_column)); - docBlock=indent; - startCommentBlock(current->brief.isEmpty()); + indent.fill(' ',computeIndent(yytext,yyextra->column)); + yyextra->docBlock=indent; + startCommentBlock(yyscanner,yyextra->current->brief.isEmpty()); BEGIN( DocLine ); } <FindMembers>"extern"{BN}*"\"C"("++")?"\""{BN}*("{")? { - lineCount(); - externC=TRUE; + lineCount(yyscanner); + yyextra->externC=TRUE; } <FindMembers>"{" { - if (externC) + if (yyextra->externC) { - externC=FALSE; + yyextra->externC=FALSE; } - else if (insideCS && - !current->name.isEmpty() && - !current->type.isEmpty()) + else if (yyextra->insideCS && + !yyextra->current->name.isEmpty() && + !yyextra->current->type.isEmpty()) { - if (containsWord(current->type,"event")) // event + if (containsWord(yyextra->current->type,"event")) // event { - current->mtype = mtype = Event; + yyextra->current->mtype = yyextra->mtype = Event; } else // property { - current->mtype = mtype = Property; + yyextra->current->mtype = yyextra->mtype = Property; } - current->bodyLine = yyLineNr; - curlyCount=0; + yyextra->current->bodyLine = yyextra->yyLineNr; + yyextra->curlyCount=0; BEGIN( CSAccessorDecl ); } - else if (insideIDL && (current->spec & Entry::Attribute)) + else if (yyextra->insideIDL && (yyextra->current->spec & Entry::Attribute)) { // UNO IDL: attributes may have setter and getter // exception specifications - current->exception = " {"; + yyextra->current->exception = " {"; BEGIN(UNOIDLAttributeBlock); } else { - if ((insideJava || insideCS || insideD) && - current->name.isEmpty() + if ((yyextra->insideJava || yyextra->insideCS || yyextra->insideD) && + yyextra->current->name.isEmpty() ) { // static Java initializer - needsSemi = FALSE; - if (current->stat) + yyextra->needsSemi = FALSE; + if (yyextra->current->stat) { - current->name="[static initializer]"; - current->type.resize(0); + yyextra->current->name="[static initializer]"; + yyextra->current->type.resize(0); } else { - current->name="[instance initializer]"; + yyextra->current->name="[instance initializer]"; } unput(*yytext); BEGIN( Function ); @@ -6365,122 +6060,122 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) else { // pre C++11 code -> ignore the initializer - //needsSemi = TRUE; - //current->type.resize(0); - //current->name.resize(0); - //current->args.resize(0); - //current->argList.clear(); - //curlyCount=0; + //yyextra->needsSemi = TRUE; + //yyextra->current->type.resize(0); + //yyextra->current->name.resize(0); + //yyextra->current->args.resize(0); + //yyextra->current->argList.clear(); + //yyextra->curlyCount=0; //BEGIN( SkipCurlyBlock ); // C++11 style initializer list - current->bodyLine = yyLineNr; - current->initializer = yytext; - lastInitializerContext = YY_START; - initBracketCount=1; + yyextra->current->bodyLine = yyextra->yyLineNr; + yyextra->current->initializer = yytext; + yyextra->lastInitializerContext = YY_START; + yyextra->initBracketCount=1; BEGIN(ReadInitializer); } } } -<CSAccessorDecl>"{" { curlyCount++; } +<CSAccessorDecl>"{" { yyextra->curlyCount++; } <CSAccessorDecl>"}"{B}*"=" { // fall back to next rule if it's not the right bracket - if (curlyCount != 0) REJECT; - current->initializer = "="; - current->endBodyLine=yyLineNr; - lastInitializerContext = FindMembers; + if (yyextra->curlyCount != 0) REJECT; + yyextra->current->initializer = "="; + yyextra->current->endBodyLine=yyextra->yyLineNr; + yyextra->lastInitializerContext = FindMembers; BEGIN(ReadInitializer); } <CSAccessorDecl>"}" { - if (curlyCount) + if (yyextra->curlyCount) { - curlyCount--; + yyextra->curlyCount--; } else { - mtype = Method; - virt = Normal; + yyextra->mtype = Method; + yyextra->virt = Normal; // not really important, but while we are at it - current->endBodyLine=yyLineNr; + yyextra->current->endBodyLine=yyextra->yyLineNr; unput(';'); BEGIN(FindMembers); } } -<CSAccessorDecl>"private "{BN}*"set" { if (curlyCount==0) current->spec |= Entry::PrivateSettable; } -<CSAccessorDecl>"protected "{BN}*"set" { if (curlyCount==0) current->spec |= Entry::ProtectedSettable; } -<CSAccessorDecl>"private "{BN}*"get" { if (curlyCount==0) current->spec |= Entry::PrivateGettable; } -<CSAccessorDecl>"protected "{BN}*"get" { if (curlyCount==0) current->spec |= Entry::ProtectedGettable; } -<CSAccessorDecl>"set" { if (curlyCount==0) current->spec |= Entry::Settable; } -<CSAccessorDecl>"get" { if (curlyCount==0) current->spec |= Entry::Gettable; } -<CSAccessorDecl>"add" { if (curlyCount==0) current->spec |= Entry::Addable; } -<CSAccessorDecl>"remove" { if (curlyCount==0) current->spec |= Entry::Removable; } -<CSAccessorDecl>"raise" { if (curlyCount==0) current->spec |= Entry::Raisable; } +<CSAccessorDecl>"private "{BN}*"set" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::PrivateSettable; } +<CSAccessorDecl>"protected "{BN}*"set" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::ProtectedSettable; } +<CSAccessorDecl>"private "{BN}*"get" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::PrivateGettable; } +<CSAccessorDecl>"protected "{BN}*"get" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::ProtectedGettable; } +<CSAccessorDecl>"set" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::Settable; } +<CSAccessorDecl>"get" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::Gettable; } +<CSAccessorDecl>"add" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::Addable; } +<CSAccessorDecl>"remove" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::Removable; } +<CSAccessorDecl>"raise" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::Raisable; } <CSAccessorDecl>"\"" { BEGIN(CSString);} <CSAccessorDecl>"." {} -<CSAccessorDecl>\n { lineCount(); } +<CSAccessorDecl>\n { lineCount(yyscanner); } <CSString>"\"" { BEGIN(CSAccessorDecl);} <CSString>"//" {} // Otherwise the rule <*>"//" will kick in <CSString>"/*" {} // Otherwise the rule <*>"/*" will kick in -<CSString>\n { lineCount(); } +<CSString>\n { lineCount(yyscanner); } <CSString>"." {} /* ---- Slice-specific rules ------ */ <SliceSequence>{SCOPENAME} { - if (current->spec&Entry::Local) + if (yyextra->current->spec&Entry::Local) { - current->type = "local "; + yyextra->current->type = "local "; } - current->type += "sequence<"; - current->type += yytext; - current->type += ">"; + yyextra->current->type += "sequence<"; + yyextra->current->type += yytext; + yyextra->current->type += ">"; } <SliceSequence>{BN}*">"{BN}* { - lineCount(); + lineCount(yyscanner); BEGIN(SliceSequenceName); } <SliceSequenceName>{ID}{BN}* { - lineCount(); - current->name = yytext ; - current->name = current->name.stripWhiteSpace(); + lineCount(yyscanner); + yyextra->current->name = yytext ; + yyextra->current->name = yyextra->current->name.stripWhiteSpace(); } <SliceSequenceName>";" { - current->section = Entry::VARIABLE_SEC; - current_root->moveToSubEntryAndRefresh(current); - initEntry(); + yyextra->current->section = Entry::VARIABLE_SEC; + yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current); + initEntry(yyscanner); BEGIN(FindMembers); } <SliceDictionary>{SCOPENAME}{BN}*","{BN}*{SCOPENAME} { - lineCount(); - if (current->spec&Entry::Local) + lineCount(yyscanner); + if (yyextra->current->spec&Entry::Local) { - current->type = "local "; + yyextra->current->type = "local "; } - current->type += "dictionary<"; - current->type += yytext; - current->type += ">"; - current->type = current->type.simplifyWhiteSpace(); + yyextra->current->type += "dictionary<"; + yyextra->current->type += yytext; + yyextra->current->type += ">"; + yyextra->current->type = yyextra->current->type.simplifyWhiteSpace(); } <SliceDictionary>{BN}*">"{BN}* { - lineCount(); + lineCount(yyscanner); BEGIN(SliceDictionaryName); } <SliceDictionaryName>{ID}{BN}* { - lineCount(); - current->name = yytext ; - current->name = current->name.stripWhiteSpace(); + lineCount(yyscanner); + yyextra->current->name = yytext ; + yyextra->current->name = yyextra->current->name.stripWhiteSpace(); } <SliceDictionaryName>";" { - current->section = Entry::VARIABLE_SEC; - current_root->moveToSubEntryAndRefresh(current); - initEntry(); + yyextra->current->section = Entry::VARIABLE_SEC; + yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current); + initEntry(yyscanner); BEGIN(FindMembers); } @@ -6490,100 +6185,100 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) /* ---- Single line comments ------ */ <DocLine>[^\n]*"\n"[ \t]*"//"[/!][<]? { // continuation of multiline C++-style comment - docBlock+=yytext; + yyextra->docBlock+=yytext; int markerLen = yytext[yyleng-1]=='<' ? 4 : 3; - docBlock.resize(docBlock.length() - markerLen); - lineCount(); + yyextra->docBlock.resize(yyextra->docBlock.length() - markerLen); + lineCount(yyscanner); } <DocLine>{B}*"///"[/]+{B}*/"\n" { // ignore marker line (see bug700345) - handleCommentBlock(docBlock.data(),current->brief.isEmpty()); - BEGIN( docBlockContext ); + handleCommentBlock(yyscanner,yyextra->docBlock.data(),yyextra->current->brief.isEmpty()); + BEGIN( yyextra->docBlockContext ); } <DocLine>[^\n]*/"\n"{B}*"//"[!/]{B}*{CMD}"}" { // next line is an end group marker, see bug 752712 - docBlock+=yytext; - handleCommentBlock(docBlock.data(),current->brief.isEmpty()); - BEGIN( docBlockContext ); + yyextra->docBlock+=yytext; + handleCommentBlock(yyscanner,yyextra->docBlock.data(),yyextra->current->brief.isEmpty()); + BEGIN( yyextra->docBlockContext ); } <DocLine>[^\n]*/"\n" { // whole line - docBlock+=yytext; - handleCommentBlock(docBlock.data(),current->brief.isEmpty()); - BEGIN( docBlockContext ); + yyextra->docBlock+=yytext; + handleCommentBlock(yyscanner,yyextra->docBlock.data(),yyextra->current->brief.isEmpty()); + BEGIN( yyextra->docBlockContext ); } /* ---- Comments blocks ------ */ <DocBlock>"*"*"*/" { // end of comment block - handleCommentBlock(docBlock.data(),FALSE); - BEGIN(docBlockContext); + handleCommentBlock(yyscanner,yyextra->docBlock.data(),FALSE); + BEGIN(yyextra->docBlockContext); } <DocBlock>^{B}*"*"+/[^/] { QCString indent; - indent.fill(' ',computeIndent(yytext,g_column)); - docBlock+=indent; + indent.fill(' ',computeIndent(yytext,yyextra->column)); + yyextra->docBlock+=indent; } <DocBlock>^{B}*("//")?{B}*"*"+/[^//a-z_A-Z0-9*] { // start of a comment line QCString indent; - indent.fill(' ',computeIndent(yytext,g_column)); - docBlock+=indent; + indent.fill(' ',computeIndent(yytext,yyextra->column)); + yyextra->docBlock+=indent; } <DocBlock>^{B}*("//"){B}* { // strip embedded C++ comments if at the start of a line } <DocBlock>"//" { // slashes in the middle of a comment block - docBlock+=yytext; + yyextra->docBlock+=yytext; } <DocBlock>"/*" { // start of a new comment in the // middle of a comment block - docBlock+=yytext; + yyextra->docBlock+=yytext; } <DocBlock>({CMD}{CMD}){ID}/[^a-z_A-Z0-9] { // escaped command - docBlock+=yytext; + yyextra->docBlock+=yytext; } <DocBlock>{CMD}("f$"|"f["|"f{") { - docBlock+=yytext; - docBlockName=&yytext[1]; - if (docBlockName.at(1)=='{') + yyextra->docBlock+=yytext; + yyextra->docBlockName=&yytext[1]; + if (yyextra->docBlockName.at(1)=='{') { - docBlockName.at(1)='}'; + yyextra->docBlockName.at(1)='}'; } - g_fencedSize=0; - g_nestedComment=FALSE; + yyextra->fencedSize=0; + yyextra->nestedComment=FALSE; BEGIN(DocCopyBlock); } <DocBlock>{B}*"<"{PRE}">" { - docBlock+=yytext; - docBlockName="<pre>"; - g_fencedSize=0; - g_nestedComment=FALSE; + yyextra->docBlock+=yytext; + yyextra->docBlockName="<pre>"; + yyextra->fencedSize=0; + yyextra->nestedComment=FALSE; BEGIN(DocCopyBlock); } <DocBlock>{CMD}("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"manonly"|"dot"|"code")/[^a-z_A-Z0-9\-] { // verbatim command (which could contain nested comments!) - docBlock+=yytext; - docBlockName=&yytext[1]; - g_fencedSize=0; - g_nestedComment=FALSE; + yyextra->docBlock+=yytext; + yyextra->docBlockName=&yytext[1]; + yyextra->fencedSize=0; + yyextra->nestedComment=FALSE; BEGIN(DocCopyBlock); } <DocBlock>^({B}*"*"+)?{B}{0,3}"~~~"[~]* { - docBlock+=substitute(yytext,"*"," "); - docBlockName="~~~"; - g_fencedSize=yyleng; - g_nestedComment=FALSE; + yyextra->docBlock+=substitute(yytext,"*"," "); + yyextra->docBlockName="~~~"; + yyextra->fencedSize=yyleng; + yyextra->nestedComment=FALSE; BEGIN(DocCopyBlock); } <DocBlock>^({B}*"*"+)?{B}{0,3}"```"[`]* { - docBlock+=substitute(yytext,"*"," "); - docBlockName="```"; - g_fencedSize=yyleng; - g_nestedComment=FALSE; + yyextra->docBlock+=substitute(yytext,"*"," "); + yyextra->docBlockName="```"; + yyextra->fencedSize=yyleng; + yyextra->nestedComment=FALSE; BEGIN(DocCopyBlock); } <DocBlock>{B}*"<code>" { - if (insideCS) + if (yyextra->insideCS) { - docBlock+=yytext; - docBlockName="<code>"; - g_nestedComment=FALSE; + yyextra->docBlock+=yytext; + yyextra->docBlockName="<code>"; + yyextra->nestedComment=FALSE; BEGIN(DocCopyBlock); } else @@ -6592,49 +6287,49 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } } <DocBlock>[^@*~\/\\\n]+ { // any character that isn't special - docBlock+=yytext; + yyextra->docBlock+=yytext; } <DocBlock>\n { // newline - lineCount(); - docBlock+=*yytext; + lineCount(yyscanner); + yyextra->docBlock+=*yytext; } <DocBlock>. { // command block - docBlock+=*yytext; + yyextra->docBlock+=*yytext; } /* ---- Copy verbatim sections ------ */ <DocCopyBlock>"</"{PRE}">" { // end of a <pre> block - docBlock+=yytext; - if (docBlockName=="<pre>") + yyextra->docBlock+=yytext; + if (yyextra->docBlockName=="<pre>") { BEGIN(DocBlock); } } <DocCopyBlock>"</"{CODE}">" { // end of a <code> block - docBlock+=yytext; - if (docBlockName=="<code>") + yyextra->docBlock+=yytext; + if (yyextra->docBlockName=="<code>") { BEGIN(DocBlock); } } <DocCopyBlock>[\\@]("f$"|"f]"|"f}") { - docBlock+=yytext; + yyextra->docBlock+=yytext; BEGIN(DocBlock); } <DocCopyBlock>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddocbookonly"|"endmanonly"|"enddot"|"endcode")/[^a-z_A-Z0-9] { // end of verbatim block - docBlock+=yytext; - if (&yytext[4]==docBlockName) + yyextra->docBlock+=yytext; + if (&yytext[4]==yyextra->docBlockName) { BEGIN(DocBlock); } } <DocCopyBlock>^{B}*"*"+/{BN}+ { // start of a comment line - if (docBlockName=="verbatim") + if (yyextra->docBlockName=="verbatim") { REJECT; } - else if (docBlockName=="code") + else if (yyextra->docBlockName=="code") { REJECT; } @@ -6642,15 +6337,15 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) { QCString indent; indent.fill(' ',computeIndent(yytext,0)); - docBlock+=indent; + yyextra->docBlock+=indent; } } <DocCopyBlock>^{B}*"*"+/{B}+"*"{BN}* { // start of a comment line with two *'s - if (docBlockName=="code") + if (yyextra->docBlockName=="code") { QCString indent; indent.fill(' ',computeIndent(yytext,0)); - docBlock+=indent; + yyextra->docBlock+=indent; } else { @@ -6658,11 +6353,11 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } } <DocCopyBlock>^{B}*"*"+/({ID}|"(") { // Assume *var or *(... is part of source code (see bug723516) - if (docBlockName=="code") + if (yyextra->docBlockName=="code") { QCString indent; indent.fill(' ',computeIndent(yytext,-1)); - docBlock+=indent+"*"; + yyextra->docBlock+=indent+"*"; } else { @@ -6670,18 +6365,18 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } } <DocCopyBlock>^{B}*"*"+/{BN}* { // start of a comment line with one * - if (docBlockName=="code") + if (yyextra->docBlockName=="code") { QCString indent; - if (g_nestedComment) // keep * it is part of the code + if (yyextra->nestedComment) // keep * it is part of the code { indent.fill(' ',computeIndent(yytext,-1)); - docBlock+=indent+"*"; + yyextra->docBlock+=indent+"*"; } else // remove * it is part of the comment block { indent.fill(' ',computeIndent(yytext,0)); - docBlock+=indent; + yyextra->docBlock+=indent; } } else @@ -6690,45 +6385,45 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } } <DocCopyBlock>^({B}*"*"+)?{B}{0,3}"~~~"[~]* { - docBlock+=substitute(yytext,"*"," "); - if (g_fencedSize==yyleng) + yyextra->docBlock+=substitute(yytext,"*"," "); + if (yyextra->fencedSize==yyleng) { BEGIN(DocBlock); } } <DocCopyBlock>^({B}*"*"+)?{B}{0,3}"```"[`]* { - docBlock+=substitute(yytext,"*"," "); - if (g_fencedSize==yyleng) + yyextra->docBlock+=substitute(yytext,"*"," "); + if (yyextra->fencedSize==yyleng) { BEGIN(DocBlock); } } <DocCopyBlock>[^\<@/*\]~\$\\\n]+ { // any character that is not special - docBlock+=yytext; + yyextra->docBlock+=yytext; } <DocCopyBlock>"/*"|"*/"|"//" { if (yytext[1]=='*') { - g_nestedComment=TRUE; + yyextra->nestedComment=TRUE; } else if (yytext[0]=='*') { - g_nestedComment=FALSE; + yyextra->nestedComment=FALSE; } - docBlock+=yytext; + yyextra->docBlock+=yytext; } <DocCopyBlock>\n { // newline - docBlock+=*yytext; - lineCount(); + yyextra->docBlock+=*yytext; + lineCount(yyscanner); } <DocCopyBlock>. { // any other character - docBlock+=*yytext; + yyextra->docBlock+=*yytext; } <DocCopyBlock><<EOF>> { - warn(yyFileName,yyLineNr, - "reached end of file while inside a '%s' block!\n" + warn(yyextra->yyFileName,yyextra->yyLineNr, + "reached end of file while yyextra->inside a '%s' block!\n" "The command that should end the block seems to be missing!\n", - docBlockName.data()); + yyextra->docBlockName.data()); yyterminate(); } @@ -6736,69 +6431,69 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) /* ------------- Prototype parser -------------- */ <Prototype>"operator"{B}*"("{B}*")" { - current->name+=yytext; + yyextra->current->name+=yytext; } <Prototype>"(" { - current->args+=*yytext; - currentArgumentContext = PrototypeQual; - fullArgString = current->args.copy(); - copyArgString = ¤t->args; + yyextra->current->args+=*yytext; + yyextra->currentArgumentContext = PrototypeQual; + yyextra->fullArgString = yyextra->current->args.copy(); + yyextra->copyArgString = &yyextra->current->args; BEGIN( ReadFuncArgType ) ; } <Prototype>"("({ID}"::")*({B}*[&*])+ { - current->type+=current->name+yytext; - current->name.resize(0); + yyextra->current->type+=yyextra->current->name+yytext; + yyextra->current->name.resize(0); BEGIN( PrototypePtr ); } <PrototypePtr>{SCOPENAME} { - current->name+=yytext; + yyextra->current->name+=yytext; } <PrototypePtr>"(" { - current->args+=*yytext; - currentArgumentContext = PrototypeQual; - fullArgString = current->args.copy(); - copyArgString = ¤t->args; + yyextra->current->args+=*yytext; + yyextra->currentArgumentContext = PrototypeQual; + yyextra->fullArgString = yyextra->current->args.copy(); + yyextra->copyArgString = &yyextra->current->args; BEGIN( ReadFuncArgType ) ; } <PrototypePtr>")" { - current->type+=')'; + yyextra->current->type+=')'; BEGIN( Prototype ); } <PrototypePtr>. { - current->name+=yytext; + yyextra->current->name+=yytext; } <PrototypeQual>"{" { BEGIN( PrototypeSkipLine); } <PrototypeQual>{B}*"const"{B}* { - current->args += " const "; - current->argList.constSpecifier=TRUE; + yyextra->current->args += " const "; + yyextra->current->argList.constSpecifier=TRUE; } <PrototypeQual>{B}*"volatile"{B}* { - current->args += " volatile "; - current->argList.volatileSpecifier=TRUE; + yyextra->current->args += " volatile "; + yyextra->current->argList.volatileSpecifier=TRUE; } <PrototypeQual>{B}*"="{B}*"0"{B}* { - current->args += " = 0"; - current->virt = Pure; - current->argList.pureSpecifier=TRUE; + yyextra->current->args += " = 0"; + yyextra->current->virt = Pure; + yyextra->current->argList.pureSpecifier=TRUE; } <PrototypeQual>"throw"{B}*"(" { - current->exception = "throw("; + yyextra->current->exception = "throw("; BEGIN(PrototypeExc); } <PrototypeExc>")" { - current->exception += ')'; + yyextra->current->exception += ')'; BEGIN(PrototypeQual); } <PrototypeExc>. { - current->exception += *yytext; + yyextra->current->exception += *yytext; } <PrototypeQual>. { - current->args += *yytext; + yyextra->current->args += *yytext; } <Prototype>. { - current->name += *yytext; + yyextra->current->name += *yytext; } <PrototypeSkipLine>. { } @@ -6807,149 +6502,475 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) <SkipCxxComment>.*"\\\n" { // line continuation - if (insideCS) + if (yyextra->insideCS) { REJECT; } else { - lineCount(); + lineCount(yyscanner); } } <SkipCxxComment>.*/\n { - BEGIN( lastCContext ) ; + BEGIN( yyextra->lastCContext ) ; } <SkipComment>[^\*\n]+ /* ------------ Generic rules -------------- */ <*>"[[" { // C++11 attribute - if (!insideCpp) REJECT; + if (!yyextra->insideCpp) REJECT; if (YY_START == CopyGString || YY_START == CopyGString) REJECT; - lastC11AttributeContext = YY_START; + yyextra->lastC11AttributeContext = YY_START; BEGIN( SkipC11Attribute ); } -<*>\n { lineCount(); } +<*>\n { lineCount(yyscanner); } <*>\" { - if (insideIDL && insideCppQuote) + if (yyextra->insideIDL && yyextra->insideCppQuote) { BEGIN(EndCppQuote); } } <*>"#" { - if (!insidePHP) + if (!yyextra->insidePHP) REJECT; - lastCContext = YY_START ; + yyextra->lastCContext = YY_START ; BEGIN( SkipCxxComment ) ; } <*>\' { - if (insidePHP) + if (yyextra->insidePHP) { - lastStringContext=YY_START; + yyextra->lastStringContext=YY_START; BEGIN(SkipPHPString); } } <*>\" { - if (insidePHP) + if (yyextra->insidePHP) { - lastStringContext=YY_START; + yyextra->lastStringContext=YY_START; BEGIN(SkipString); } } <*>\? { - if (insideCS && (YY_START != SkipRound)) + if (yyextra->insideCS && (YY_START != SkipRound)) { - if (current->type.isEmpty()) + if (yyextra->current->type.isEmpty()) { - if (current->name.isEmpty()) - current->name="?"; + if (yyextra->current->name.isEmpty()) + yyextra->current->name="?"; else - current->name+="?"; + yyextra->current->name+="?"; } else { - current->type+="?"; + yyextra->current->type+="?"; } } } <*>. <SkipComment>"//"|"/*" -<*>"/*" { lastCContext = YY_START ; +<*>"/*" { yyextra->lastCContext = YY_START ; BEGIN( SkipComment ) ; } -<SkipComment>{B}*"*/" { BEGIN( lastCContext ) ; } +<SkipComment>{B}*"*/" { BEGIN( yyextra->lastCContext ) ; } <*>"//" { - lastCContext = YY_START ; + yyextra->lastCContext = YY_START ; BEGIN( SkipCxxComment ) ; } %% //---------------------------------------------------------------------------- +static int yyread(yyscan_t yyscanner,char *buf,int max_size) +{ + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + int c=0; + while( c < max_size && yyextra->inputString[yyextra->inputPosition] ) + { + *buf = yyextra->inputString[yyextra->inputPosition++] ; + //printf("%d (%c)\n",*buf,*buf); + c++; buf++; + } + return c; +} + + +static void initParser(yyscan_t yyscanner) +{ + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + yyextra->outerScopeEntries.clear(); + yyextra->baseName.resize(0); + yyextra->protection = Public; + yyextra->baseProt = Public; + yyextra->sharpCount = 0; + yyextra->roundCount = 0; + yyextra->curlyCount = 0; + yyextra->mtype = Method; + yyextra->stat = FALSE; + yyextra->virt = Normal; + yyextra->baseVirt = Normal; + yyextra->isTypedef = FALSE; + yyextra->autoGroupStack.clear(); + yyextra->insideTryBlock = FALSE; + yyextra->autoGroupStack.setAutoDelete(TRUE); + yyextra->insideFormula = FALSE; + yyextra->insideCode=FALSE; + yyextra->insideCli=Config_getBool(CPP_CLI_SUPPORT); + yyextra->previous = 0; + yyextra->firstTypedefEntry.reset(); + yyextra->memspecEntry.reset(); +} -static void startCommentBlock(bool brief) +static void initEntry(yyscan_t yyscanner) { + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + if (yyextra->insideJava) + { + yyextra->protection = (yyextra->current_root->spec & (Entry::Interface|Entry::Enum)) ? Public : Package; + } + yyextra->current->protection = yyextra->protection ; + yyextra->current->mtype = yyextra->mtype; + yyextra->current->virt = yyextra->virt; + yyextra->current->stat = yyextra->stat; + yyextra->current->lang = yyextra->language; + //printf("*** initEntry(yyscanner) yyextra->language=%d\n",yyextra->language); + Doxygen::docGroup.initGroupInfo(yyextra->current.get()); + yyextra->isTypedef=FALSE; +} + + +//----------------------------------------------------------------------------- + +static void lineCount(yyscan_t yyscanner) +{ + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + int tabSize = Config_getInt(TAB_SIZE); + const char *p; + for (p = yytext ; *p ; ++p ) + { + if (*p=='\n') + { + yyextra->yyLineNr++,yyextra->column=0,yyextra->yyColNr=1; + } + else if (*p=='\t') + { + yyextra->column+=tabSize - (yyextra->column%tabSize); + } + else + { + yyextra->column++,yyextra->yyColNr++; + } + } + //printf("lineCount()=%d\n",yyextra->column); +} + +static inline int computeIndent(const char *s,int startIndent) +{ + int col=startIndent; + int tabSize=Config_getInt(TAB_SIZE); + const char *p=s; + char c; + while ((c=*p++)) + { + if (c=='\t') col+=tabSize-(col%tabSize); + else if (c=='\n') col=0; + else col++; + } + return col; +} + +static void addType(yyscan_t yyscanner) +{ + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + uint tl=yyextra->current->type.length(); + if( tl>0 && !yyextra->current->name.isEmpty() && yyextra->current->type.at(tl-1)!='.') + { + yyextra->current->type += ' ' ; + } + yyextra->current->type += yyextra->current->name ; + yyextra->current->name.resize(0) ; + tl=yyextra->current->type.length(); + if( tl>0 && !yyextra->current->args.isEmpty() && yyextra->current->type.at(tl-1)!='.') + { + yyextra->current->type += ' ' ; + } + yyextra->current->type += yyextra->current->args ; + yyextra->current->args.resize(0) ; + yyextra->current->argList.clear(); +} + + +static QCString stripQuotes(const char *s) +{ + QCString name; + if (s==0 || *s==0) return name; + name=s; + if (name.at(0)=='"' && name.at(name.length()-1)=='"') + { + name=name.mid(1,name.length()-2); + } + return name; +} + +//----------------------------------------------------------------- + +static bool nameIsOperator(QCString &name) +{ + int i=name.find("operator"); + if (i==-1) return FALSE; + if (i==0 && !isId(name.at(8))) return TRUE; // case operator ::X + if (i>0 && !isId(name.at(i-1)) && !isId(name.at(i+8))) return TRUE; // case X::operator + return FALSE; // case TEXToperatorTEXT +} + +//----------------------------------------------------------------------------- + +static void setContext(yyscan_t yyscanner) +{ + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + yyextra->language = getLanguageFromFileName(yyextra->yyFileName); + yyextra->insideIDL = yyextra->language==SrcLangExt_IDL; + yyextra->insideJava = yyextra->language==SrcLangExt_Java; + yyextra->insideCS = yyextra->language==SrcLangExt_CSharp; + yyextra->insideD = yyextra->language==SrcLangExt_D; + yyextra->insidePHP = yyextra->language==SrcLangExt_PHP; + yyextra->insideObjC = yyextra->language==SrcLangExt_ObjC; + yyextra->insideJS = yyextra->language==SrcLangExt_JS; + yyextra->insideSlice = yyextra->language==SrcLangExt_Slice; + yyextra->insideCpp = yyextra->language==SrcLangExt_Cpp; + //printf("setContext(%s) yyextra->insideIDL=%d yyextra->insideJava=%d yyextra->insideCS=%d " + // "yyextra->insideD=%d yyextra->insidePHP=%d yyextra->insideObjC=%d\n", + // yyextra->yyFileName.data(),yyextra->insideIDL,yyextra->insideJava,yyextra->insideCS,yyextra->insideD,yyextra->insidePHP,yyextra->insideObjC + // ); +} + +//----------------------------------------------------------------------------- + +static void prependScope(yyscan_t yyscanner) +{ + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + if (yyextra->current_root->section & Entry::SCOPE_MASK) + { + //printf("--- prependScope %s to %s\n",yyextra->current_root->name.data(),yyextra->current->name.data()); + yyextra->current->name.prepend(yyextra->current_root->name+"::"); + //printf("prependScope #=%d #yyextra->current=%d\n",yyextra->current_root->tArgLists->count(),yyextra->current->tArgLists->count()); + for (const ArgumentList &srcAl : yyextra->current_root->tArgLists) + { + yyextra->current->tArgLists.insert(yyextra->current->tArgLists.begin(),srcAl); + } + } +} + +//----------------------------------------------------------------------------- + +/*! Returns TRUE iff the yyextra->current entry could be a K&R style C function */ +static bool checkForKnRstyleC(yyscan_t yyscanner) +{ + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + if (((QCString)yyextra->yyFileName).right(2).lower()!=".c") return FALSE; // must be a C file + if (yyextra->current->argList.empty()) return FALSE; // must have arguments + for (const Argument &a : yyextra->current->argList) + { + // in K&R style argument do not have a type, but doxygen expects a type + // so it will think the argument has no name + if (a.type.isEmpty() || !a.name.isEmpty()) return FALSE; + } + return TRUE; +} + +//----------------------------------------------------------------------------- + +static void splitKnRArg(yyscan_t yyscanner,QCString &oldStyleArgPtr,QCString &oldStyleArgName) +{ + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + int si = yyextra->current->args.length(); + if (yyextra->oldStyleArgType.isEmpty()) // new argument + { + static QRegExp re("([^)]*)"); + int bi1 = yyextra->current->args.findRev(re); + int bi2 = bi1!=-1 ? yyextra->current->args.findRev(re,bi1-1) : -1; + char c; + if (bi1!=-1 && bi2!=-1) // found something like "int (*func)(int arg)" + { + int s=bi2+1; + yyextra->oldStyleArgType = yyextra->current->args.left(s); + int i=s; + while (i<si && ((c=yyextra->current->args.at(i))=='*' || isspace((uchar)c))) i++; + yyextra->oldStyleArgType += yyextra->current->args.mid(s,i-s); + s=i; + while (i<si && isId(yyextra->current->args.at(i))) i++; + oldStyleArgName = yyextra->current->args.mid(s,i-s); + yyextra->oldStyleArgType+=yyextra->current->args.mid(i); + } + else if (bi1!=-1) // redundant braces like in "int (*var)" + { + int s=bi1; + yyextra->oldStyleArgType = yyextra->current->args.left(s); + s++; + int i=s+1; + while (i<si && ((c=yyextra->current->args.at(i))=='*' || isspace((uchar)c))) i++; + yyextra->oldStyleArgType += yyextra->current->args.mid(s,i-s); + s=i; + while (i<si && isId(yyextra->current->args.at(i))) i++; + oldStyleArgName = yyextra->current->args.mid(s,i-s); + } + else // normal "int *var" + { + int l=si,i=l-1,j; + char c; + // look for start of name in "type *name" + while (i>=0 && isId(yyextra->current->args.at(i))) i--; + j=i+1; + // look for start of *'s + while (i>=0 && ((c=yyextra->current->args.at(i))=='*' || isspace((uchar)c))) i--; + i++; + if (i!=l) + { + yyextra->oldStyleArgType=yyextra->current->args.left(i); + oldStyleArgPtr=yyextra->current->args.mid(i,j-i); + oldStyleArgName=yyextra->current->args.mid(j).stripWhiteSpace(); + } + else + { + oldStyleArgName=yyextra->current->args.copy().stripWhiteSpace(); + } + } + } + else // continuation like *arg2 in "int *args,*arg2" + { + int l=si,j=0; + char c; + while (j<l && ((c=yyextra->current->args.at(j))=='*' || isspace((uchar)c))) j++; + if (j>0) + { + oldStyleArgPtr=yyextra->current->args.left(j); + oldStyleArgName=yyextra->current->args.mid(j).stripWhiteSpace(); + } + else + { + oldStyleArgName=yyextra->current->args.copy().stripWhiteSpace(); + } + } +} + +//----------------------------------------------------------------------------- + +/*! Update the argument \a name with additional \a type info. For K&R style + * function the type is found \e after the argument list, so this routine + * in needed to fix up. + */ +static void addKnRArgInfo(yyscan_t yyscanner,const QCString &type,const QCString &name, + const QCString &brief,const QCString &docs) +{ + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + for (Argument &a : yyextra->current->argList) + { + if (a.type==name) + { + a.type=type.stripWhiteSpace(); + if (a.type.left(9)=="register ") // strip keyword + { + a.type=a.type.mid(9); + } + a.name=name.stripWhiteSpace(); + if (!brief.isEmpty() && !docs.isEmpty()) + { + a.docs=brief+"\n\n"+docs; + } + else if (!brief.isEmpty()) + { + a.docs=brief; + } + else + { + a.docs=docs; + } + } + } +} + +//----------------------------------------------------------------------------- + + +void fixArgumentListForJavaScript(ArgumentList &al) +{ + for (Argument &a : al) + { + if (!a.type.isEmpty() && a.name.isEmpty()) + { // a->type is actually the (typeless) parameter name, so move it + a.name=a.type; + a.type.resize(0); + } + } +} + + +static void startCommentBlock(yyscan_t yyscanner,bool brief) +{ + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; if (brief) { - current->briefFile = yyFileName; - current->briefLine = yyLineNr; + yyextra->current->briefFile = yyextra->yyFileName; + yyextra->current->briefLine = yyextra->yyLineNr; } else { - current->docFile = yyFileName; - current->docLine = yyLineNr; + yyextra->current->docFile = yyextra->yyFileName; + yyextra->current->docLine = yyextra->yyLineNr; } } //---------------------------------------------------------------------------- -static void newEntry() +static void newEntry(yyscan_t yyscanner) { - if (tempEntry==0) // if temp entry is not 0, it holds current, - // and current is actually replaced by previous which was - // already added to current_root, so we should not add it again + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + if (yyextra->tempEntry==0) // if temp entry is not 0, it holds yyextra->current, + // and yyextra->current is actually replaced by yyextra->previous which was + // already added to yyextra->current_root, so we should not add it again // (see bug723314) { - previous = current.get(); - current_root->moveToSubEntryAndRefresh(current); + yyextra->previous = yyextra->current; + yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current); } else { - previous = current.get(); - tempEntry.swap(current); - tempEntry.reset(); + yyextra->previous = yyextra->current; + yyextra->current = yyextra->tempEntry; + yyextra->tempEntry.reset(); } - initEntry(); + initEntry(yyscanner); } -static void handleCommentBlock(const QCString &doc,bool brief) +static void handleCommentBlock(yyscan_t yyscanner,const QCString &doc,bool brief) { - static bool hideInBodyDocs = Config_getBool(HIDE_IN_BODY_DOCS); - if (docBlockInBody && hideInBodyDocs) return; + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + bool hideInBodyDocs = Config_getBool(HIDE_IN_BODY_DOCS); + if (yyextra->docBlockInBody && hideInBodyDocs) return; //printf("parseCommentBlock [%s] brief=%d\n",doc.data(),brief); - int lineNr = brief ? current->briefLine : current->docLine; // line of block start + int lineNr = brief ? yyextra->current->briefLine : yyextra->current->docLine; // line of block start // fill in inbodyFile && inbodyLine the first time, see bug 633891 - Entry *docEntry = docBlockInBody && previous ? previous : current.get(); - if (docBlockInBody && docEntry && docEntry->inbodyLine==-1) + std::shared_ptr<Entry> docEntry = yyextra->docBlockInBody && yyextra->previous ? yyextra->previous : yyextra->current; + if (yyextra->docBlockInBody && docEntry && docEntry->inbodyLine==-1) { - docEntry->inbodyFile = yyFileName; + docEntry->inbodyFile = yyextra->yyFileName; docEntry->inbodyLine = lineNr; } int position=0; bool needsEntry=FALSE; - QCString processedDoc = preprocessCommentBlock(stripIndentation(doc),yyFileName,lineNr); + QCString processedDoc = preprocessCommentBlock(stripIndentation(doc),yyextra->yyFileName,lineNr); while (parseCommentBlock( - g_thisParser, - docBlockInBody && previous ? previous : current.get(), + yyextra->thisParser, + yyextra->docBlockInBody && yyextra->previous ? yyextra->previous.get() : yyextra->current.get(), processedDoc, // text - yyFileName, // file + yyextra->yyFileName, // file lineNr, // line of block start - docBlockInBody ? FALSE : brief, // isBrief - docBlockInBody ? FALSE : docBlockAutoBrief, // isJavaDocStyle - docBlockInBody, // isInBody - protection, + yyextra->docBlockInBody ? FALSE : brief, // isBrief + yyextra->docBlockInBody ? FALSE : yyextra->docBlockAutoBrief, // isJavaDocStyle + yyextra->docBlockInBody, // isInBody + yyextra->protection, position, needsEntry ) @@ -6958,26 +6979,27 @@ static void handleCommentBlock(const QCString &doc,bool brief) //printf("parseCommentBlock position=%d [%s]\n",position,doc.data()+position); if (needsEntry) { - QCString docFile = current->docFile; - newEntry(); - current->docFile = docFile; - current->docLine = lineNr; + QCString docFile = yyextra->current->docFile; + newEntry(yyscanner); + yyextra->current->docFile = docFile; + yyextra->current->docLine = lineNr; } } if (needsEntry) { - newEntry(); + newEntry(yyscanner); } - if (docBlockTerm) + if (yyextra->docBlockTerm) { - unput(docBlockTerm); - docBlockTerm=0; + unput(yyextra->docBlockTerm); + yyextra->docBlockTerm=0; } } -static void handleParametersCommentBlocks(ArgumentList &al) +static void handleParametersCommentBlocks(yyscan_t yyscanner,ArgumentList &al) { + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; //printf(">>>>>>> handleParametersCommentBlocks()\n"); for (Argument &a : al) { @@ -6989,44 +7011,44 @@ static void handleParametersCommentBlocks(ArgumentList &al) bool needsEntry; // save context - QCString orgDoc = current->doc; - QCString orgBrief = current->brief; - int orgDocLine = current->docLine; - int orgBriefLine = current->briefLine; + QCString orgDoc = yyextra->current->doc; + QCString orgBrief = yyextra->current->brief; + int orgDocLine = yyextra->current->docLine; + int orgBriefLine = yyextra->current->briefLine; - current->doc.resize(0); - current->brief.resize(0); + yyextra->current->doc.resize(0); + yyextra->current->brief.resize(0); //printf("handleParametersCommentBlock [%s]\n",doc.data()); while (parseCommentBlock( - g_thisParser, - current.get(), + yyextra->thisParser, + yyextra->current.get(), a.docs, // text - yyFileName, // file - current->docLine, // line of block start + yyextra->yyFileName, // file + yyextra->current->docLine, // line of block start FALSE, FALSE, FALSE, - protection, + yyextra->protection, position, needsEntry ) ) { //printf("handleParametersCommentBlock position=%d [%s]\n",position,doc.data()+position); - if (needsEntry) newEntry(); + if (needsEntry) newEntry(yyscanner); } if (needsEntry) { - newEntry(); + newEntry(yyscanner); } - a.docs = current->doc; + a.docs = yyextra->current->doc; // restore context - current->doc = orgDoc; - current->brief = orgBrief; - current->docLine = orgDocLine; - current->briefLine = orgBriefLine; + yyextra->current->doc = orgDoc; + yyextra->current->brief = orgBrief; + yyextra->current->docLine = orgDocLine; + yyextra->current->briefLine = orgBriefLine; } } } @@ -7034,8 +7056,9 @@ static void handleParametersCommentBlocks(ArgumentList &al) //---------------------------------------------------------------------------- -static void parseCompounds(const std::unique_ptr<Entry> &rt) +static void parseCompounds(yyscan_t yyscanner,const std::shared_ptr<Entry> &rt) { + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; //printf("parseCompounds(%s)\n",rt->name.data()); for (const auto &ce : rt->children()) { @@ -7044,29 +7067,28 @@ static void parseCompounds(const std::unique_ptr<Entry> &rt) //printf("-- %s ---------\n%s\n---------------\n", // ce->name.data(),ce->program.data()); // init scanner state - padCount=0; + yyextra->padCount=0; //depthIf = 0; - g_column=0; - inputString = ce->program; - inputPosition = 0; - scannerYYrestart( scannerYYin ) ; + yyextra->column=0; + yyextra->inputString = ce->program; + yyextra->inputPosition = 0; if (ce->section==Entry::ENUM_SEC || (ce->spec&Entry::Enum)) BEGIN( FindFields ) ; else BEGIN( FindMembers ) ; - current_root = ce.get() ; - yyFileName = ce->fileName; + yyextra->current_root = ce; + yyextra->yyFileName = ce->fileName; //setContext(); - yyLineNr = ce->startLine ; - yyColNr = ce->startColumn ; - insideObjC = ce->lang==SrcLangExt_ObjC; - //printf("---> Inner block starts at line %d objC=%d\n",yyLineNr,insideObjC); - current = std::make_unique<Entry>(); - gstat = FALSE; - initEntry(); + yyextra->yyLineNr = ce->startLine ; + yyextra->yyColNr = ce->startColumn ; + yyextra->insideObjC = ce->lang==SrcLangExt_ObjC; + //printf("---> Inner block starts at line %d objC=%d\n",yyextra->yyLineNr,yyextra->insideObjC); + yyextra->current = std::make_shared<Entry>(); + yyextra->stat = FALSE; + initEntry(yyscanner); // deep copy group list from parent (see bug 727732) - static bool autoGroupNested = Config_getBool(GROUP_NESTED_COMPOUNDS); + bool autoGroupNested = Config_getBool(GROUP_NESTED_COMPOUNDS); if (autoGroupNested && ce->section!=Entry::ENUM_SEC && !(ce->spec&Entry::Enum)) { ce->groups = rt->groups; @@ -7076,182 +7098,180 @@ static void parseCompounds(const std::unique_ptr<Entry> &rt) // set default protection based on the compound type if( ce->section==Entry::CLASS_SEC ) // class { - if (insidePHP || insideD || insideJS || insideIDL || insideSlice) + if (yyextra->insidePHP || yyextra->insideD || yyextra->insideJS || yyextra->insideIDL || yyextra->insideSlice) { - current->protection = protection = Public ; + yyextra->current->protection = yyextra->protection = Public ; } - else if (insideJava) + else if (yyextra->insideJava) { - current->protection = protection = (ce->spec & (Entry::Interface|Entry::Enum)) ? Public : Package; + yyextra->current->protection = yyextra->protection = (ce->spec & (Entry::Interface|Entry::Enum)) ? Public : Package; } else if (ce->spec&(Entry::Interface | Entry::Ref | Entry::Value | Entry::Struct | Entry::Union)) { if (ce->lang==SrcLangExt_ObjC) { - current->protection = protection = Protected ; + yyextra->current->protection = yyextra->protection = Protected ; } else { - current->protection = protection = Public ; + yyextra->current->protection = yyextra->protection = Public ; } } else { - current->protection = protection = Private ; + yyextra->current->protection = yyextra->protection = Private ; } } else if (ce->section == Entry::ENUM_SEC ) // enum { - current->protection = protection = ce->protection; + yyextra->current->protection = yyextra->protection = ce->protection; } else if (!ce->name.isEmpty() && ce->name.at(ni)=='@') // unnamed union or namespace { if (ce->section == Entry::NAMESPACE_SEC ) // unnamed namespace { - current->stat = gstat = TRUE; + yyextra->current->stat = yyextra->stat = TRUE; } - current->protection = protection = ce->protection; + yyextra->current->protection = yyextra->protection = ce->protection; } else // named struct, union, protocol, category { - current->protection = protection = Public ; + yyextra->current->protection = yyextra->protection = Public ; } - mtype = Method; - virt = Normal; - //printf("name=%s current->stat=%d gstat=%d\n",ce->name.data(),current->stat,gstat); + yyextra->mtype = Method; + yyextra->virt = Normal; + //printf("name=%s yyextra->current->stat=%d yyextra->stat=%d\n",ce->name.data(),yyextra->current->stat,yyextra->stat); //memberGroupId = DOX_NOGROUP; //memberGroupRelates.resize(0); //memberGroupInside.resize(0); QCString name = ce->name; - Doxygen::docGroup.enterCompound(yyFileName,yyLineNr,name); + Doxygen::docGroup.enterCompound(yyextra->yyFileName,yyextra->yyLineNr,name); - scannerYYlex() ; - g_lexInit=TRUE; + scannerYYlex(yyscanner); + yyextra->lexInit=TRUE; //forceEndGroup(); - Doxygen::docGroup.leaveCompound(yyFileName,yyLineNr,name); + Doxygen::docGroup.leaveCompound(yyextra->yyFileName,yyextra->yyLineNr,name); ce->program.resize(0); //if (depthIf>0) //{ - // warn(yyFileName,yyLineNr,"Documentation block ended in the middle of a conditional section!"); + // warn(yyextra->yyFileName,yyextra->yyLineNr,"Documentation block ended in the middle of a conditional section!"); //} } - parseCompounds(ce); + parseCompounds(yyscanner,ce); } } //---------------------------------------------------------------------------- -static void parseMain(const char *fileName, +static void parseMain(yyscan_t yyscanner, + const char *fileName, const char *fileBuf, - const std::unique_ptr<Entry> &rt, + const std::shared_ptr<Entry> &rt, bool sameTranslationUnit, QStrList & filesInSameTranslationUnit) { - initParser(); + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + initParser(yyscanner); - inputString = fileBuf; - inputPosition = 0; - g_column = 0; + yyextra->inputString = fileBuf; + yyextra->inputPosition = 0; + yyextra->column = 0; + scannerYYrestart(0,yyscanner); - //anonCount = 0; // don't reset per file + //yyextra->anonCount = 0; // don't reset per file //depthIf = 0; - protection = Public; - mtype = Method; - gstat = FALSE; - virt = Normal; - current_root = rt.get(); - global_root = rt.get(); - inputFile.setName(fileName); - if (inputFile.open(IO_ReadOnly)) + yyextra->protection = Public; + yyextra->mtype = Method; + yyextra->stat = FALSE; + yyextra->virt = Normal; + yyextra->current_root = rt; + yyextra->yyLineNr = 1 ; + yyextra->yyBegLineNr = 1; + yyextra->yyBegColNr = 0; + yyextra->yyFileName = fileName; + setContext(yyscanner); + bool processWithClang = yyextra->insideCpp || yyextra->insideObjC; + if (processWithClang) { - yyLineNr= 1 ; - yyFileName = fileName; - setContext(); - bool processWithClang = insideCpp || insideObjC; - if (processWithClang) - { - if (!sameTranslationUnit) // new file - { - ClangParser::instance()->start(fileName,filesInSameTranslationUnit); - } - else - { - ClangParser::instance()->switchToFile(fileName); - } - } - rt->lang = language; - msg("Parsing file %s...\n",yyFileName.data()); - - current_root = rt.get() ; - initParser(); - Doxygen::docGroup.enterFile(yyFileName,yyLineNr); - current = std::make_unique<Entry>(); - //printf("current=%p current_root=%p\n",current,current_root); - int sec=guessSection(yyFileName); - if (sec) + if (!sameTranslationUnit) // new file { - current->name = yyFileName; - current->section = sec; - current_root->moveToSubEntryAndRefresh(current); - } - current->reset(); - initEntry(); - scannerYYrestart( scannerYYin ); - if ( insidePHP ) - { - BEGIN( FindMembersPHP ); + ClangParser::instance()->start(fileName,filesInSameTranslationUnit); } else { - BEGIN( FindMembers ); - } - - scannerYYlex(); - g_lexInit=TRUE; - - if (YY_START==Comment) - { - warn(yyFileName,yyLineNr,"File ended in the middle of a comment block! Perhaps a missing \\endcode?"); + ClangParser::instance()->switchToFile(fileName); } + } + rt->lang = yyextra->language; + msg("Parsing file %s...\n",yyextra->yyFileName.data()); + + yyextra->current_root = rt; + initParser(yyscanner); + Doxygen::docGroup.enterFile(yyextra->yyFileName,yyextra->yyLineNr); + yyextra->current = std::make_shared<Entry>(); + //printf("yyextra->current=%p yyextra->current_root=%p\n",yyextra->current,yyextra->current_root); + int sec=guessSection(yyextra->yyFileName); + if (sec) + { + yyextra->current->name = yyextra->yyFileName; + yyextra->current->section = sec; + yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current); + } + yyextra->current->reset(); + initEntry(yyscanner); + if ( yyextra->insidePHP ) + { + BEGIN( FindMembersPHP ); + } + else + { + BEGIN( FindMembers ); + } - //forceEndGroup(); - Doxygen::docGroup.leaveFile(yyFileName,yyLineNr); + scannerYYlex(yyscanner); + yyextra->lexInit=TRUE; - rt->program.resize(0); + if (YY_START==Comment) + { + warn(yyextra->yyFileName,yyextra->yyLineNr,"File ended in the middle of a comment block! Perhaps a missing \\endcode?"); + } - parseCompounds(rt); + //forceEndGroup(); + Doxygen::docGroup.leaveFile(yyextra->yyFileName,yyextra->yyLineNr); - inputFile.close(); + rt->program.resize(0); - anonNSCount++; + parseCompounds(yyscanner,rt); - // add additional entries that were created during processing - for (auto &kv: g_outerScopeEntries) - { - //printf(">>> adding '%s' to scope '%s'\n",kv.second->name.data(),kv.first->name.data()); - kv.first->moveToSubEntryAndKeep(kv.second); - } - g_outerScopeEntries.clear(); + yyextra->anonNSCount++; + // add additional entries that were created during processing + for (auto &kv: yyextra->outerScopeEntries) + { + //printf(">>> adding '%s' to scope '%s'\n",kv.second->name.data(),kv.first->name.data()); + kv.first->moveToSubEntryAndKeep(kv.second); } + yyextra->outerScopeEntries.clear(); + } //---------------------------------------------------------------------------- -static void parsePrototype(const QCString &text) +static void parsePrototype(yyscan_t yyscanner,const QCString &text) { + struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; //printf("**** parsePrototype(%s) begin\n",text.data()); if (text.isEmpty()) { - warn(yyFileName,yyLineNr,"Empty prototype found!"); + warn(yyextra->yyFileName,yyextra->yyLineNr,"Empty prototype found!"); return; } - if (!current) // nothing to store (see bug683516) + if (!yyextra->current) // nothing to store (see bug683516) { return; } @@ -7262,44 +7282,34 @@ static void parsePrototype(const QCString &text) // save scanner state orgState = YY_CURRENT_BUFFER; - yy_switch_to_buffer(yy_create_buffer(scannerYYin, YY_BUF_SIZE)); - orgInputString = inputString; - orgInputPosition = inputPosition; + yy_switch_to_buffer(yy_create_buffer(0, YY_BUF_SIZE, yyscanner), yyscanner); + orgInputString = yyextra->inputString; + orgInputPosition = yyextra->inputPosition; // set new string - inputString = text; - inputPosition = 0; - g_column = 0; - scannerYYrestart( scannerYYin ); + yyextra->inputString = text; + yyextra->inputPosition = 0; + yyextra->column = 0; + scannerYYrestart(0, yyscanner); BEGIN(Prototype); - scannerYYlex(); - g_lexInit=TRUE; + scannerYYlex(yyscanner); + yyextra->lexInit=TRUE; - current->name = current->name.stripWhiteSpace(); - if (current->section == Entry::MEMBERDOC_SEC && current->args.isEmpty()) - current->section = Entry::VARIABLEDOC_SEC; + yyextra->current->name = yyextra->current->name.stripWhiteSpace(); + if (yyextra->current->section == Entry::MEMBERDOC_SEC && yyextra->current->args.isEmpty()) + yyextra->current->section = Entry::VARIABLEDOC_SEC; // restore original scanner state YY_BUFFER_STATE tmpState = YY_CURRENT_BUFFER; - yy_switch_to_buffer(orgState); - yy_delete_buffer(tmpState); - inputString = orgInputString; - inputPosition = orgInputPosition; + yy_switch_to_buffer(orgState, yyscanner); + yy_delete_buffer(tmpState, yyscanner); + yyextra->inputString = orgInputString; + yyextra->inputPosition = orgInputPosition; //printf("**** parsePrototype end\n"); } -void scanFreeScanner() -{ -#if defined(YY_FLEX_SUBMINOR_VERSION) - if (g_lexInit) - { - scannerYYlex_destroy(); - } -#endif -} - //static void handleGroupStartCommand(const char *header) //{ // memberGroupHeader=header; @@ -7309,62 +7319,63 @@ void scanFreeScanner() //static void handleGroupEndCommand() //{ // endGroup(); -// previous=0; +// g_previous=0; //} //---------------------------------------------------------------------------- -void CLanguageScanner::startTranslationUnit(const char *) +struct COutlineParser::Private { + yyscan_t yyscanner; + scannerYY_state state; +}; + +COutlineParser::COutlineParser() : p(std::make_unique<COutlineParser::Private>()) +{ + scannerYYlex_init_extra(&p->state,&p->yyscanner); +#ifdef FLEX_DEBUG + scannerYYset_debug(1,p->yyscanner); +#endif } -void CLanguageScanner::finishTranslationUnit() +COutlineParser::~COutlineParser() { - bool processWithClang = insideCpp || insideObjC; + scannerYYlex_destroy(p->yyscanner); +} + +void COutlineParser::startTranslationUnit(const char *) +{ +} + +void COutlineParser::finishTranslationUnit() +{ + struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner; + bool processWithClang = yyextra->insideCpp || yyextra->insideObjC; if (processWithClang) { ClangParser::instance()->finish(); } } -void CLanguageScanner::parseInput(const char *fileName, +void COutlineParser::parseInput(const char *fileName, const char *fileBuf, - const std::unique_ptr<Entry> &root, + const std::shared_ptr<Entry> &root, bool sameTranslationUnit, QStrList & filesInSameTranslationUnit) { - g_thisParser = this; + struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner; + yyextra->thisParser = this; printlex(yy_flex_debug, TRUE, __FILE__, fileName); - ::parseMain(fileName,fileBuf,root, + ::parseMain(p->yyscanner, fileName,fileBuf,root, sameTranslationUnit,filesInSameTranslationUnit); printlex(yy_flex_debug, FALSE, __FILE__, fileName); } -void CLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf, - const char * scopeName, - const QCString & input, - SrcLangExt lang, - bool isExampleBlock, - const char * exampleName, - FileDef * fileDef, - int startLine, - int endLine, - bool inlineFragment, - const MemberDef *memberDef, - bool showLineNumbers, - const Definition *searchCtx, - bool collectXRefs - ) -{ - ::parseCCode(codeOutIntf,scopeName,input,lang,isExampleBlock,exampleName, - fileDef,startLine,endLine,inlineFragment,memberDef, - showLineNumbers,searchCtx,collectXRefs); -} -bool CLanguageScanner::needsPreprocessing(const QCString &extension) +bool COutlineParser::needsPreprocessing(const QCString &extension) const { QCString fe=extension.lower(); SrcLangExt lang = getLanguageFromFileName(extension); @@ -7374,23 +7385,11 @@ bool CLanguageScanner::needsPreprocessing(const QCString &extension) ); } -void CLanguageScanner::resetCodeParserState() +void COutlineParser::parsePrototype(const char *text) { - ::resetCCodeParserState(); -} - -void CLanguageScanner::parsePrototype(const char *text) -{ - ::parsePrototype(text); + ::parsePrototype(p->yyscanner,text); } //---------------------------------------------------------------------------- -#if !defined(YY_FLEX_SUBMINOR_VERSION) -//---------------------------------------------------------------------------- -extern "C" { // some bogus code to keep the compiler happy - void scannerYYdummy() { yy_flex_realloc(0,0); } -} -#endif - #include "scanner.l.h" diff --git a/src/searchindex.cpp b/src/searchindex.cpp index b21d587..22d33b6 100644 --- a/src/searchindex.cpp +++ b/src/searchindex.cpp @@ -426,7 +426,7 @@ struct SearchIndexExternal::Private { Private() : docEntries(12251) {} SDict<SearchDocEntry> docEntries; - SearchDocEntry *current; + SearchDocEntry *current = 0; }; SearchIndexExternal::SearchIndexExternal() : SearchIndexIntf(External) @@ -1372,7 +1372,7 @@ void initSearchIndexer() } } -void finializeSearchIndexer() +void finalizeSearchIndexer() { delete Doxygen::searchIndex; } diff --git a/src/searchindex.h b/src/searchindex.h index 9a612ad..8cbe352 100644 --- a/src/searchindex.h +++ b/src/searchindex.h @@ -34,7 +34,7 @@ class MemberDef; /*! Initialize the search indexer */ void initSearchIndexer(); /*! Cleanup the search indexer */ -void finializeSearchIndexer(); +void finalizeSearchIndexer(); //------- server side search index ---------------------- diff --git a/src/sortdict.h b/src/sortdict.h index 0e0b5c1..203ae5e 100644 --- a/src/sortdict.h +++ b/src/sortdict.h @@ -244,7 +244,7 @@ class SDict return m_list->find(item); } - /*! Equavalent to find(). */ + /*! Equivalent to find(). */ T *operator[](const char *key) const { return m_dict->find(key); @@ -553,7 +553,7 @@ class SIntDict return m_dict->find(key); } - /*! Equavalent to find(). */ + /*! Equivalent to find(). */ T *operator[](int key) const { return m_dict->find(key); diff --git a/src/sqlcode.h b/src/sqlcode.h index d8a09b7..20e20f7 100644 --- a/src/sqlcode.h +++ b/src/sqlcode.h @@ -19,7 +19,7 @@ #ifndef SQLCODE_H #define SQLCODE_H -#include "types.h" +#include "parserintf.h" class CodeOutputInterface; class FileDef; @@ -27,11 +27,28 @@ class MemberDef; class QCString; class Definition; -extern void parseSqlCode(CodeOutputInterface &,const char *,const QCString &, - bool ,const char *,FileDef *fd, - int startLine,int endLine,bool inlineFragment, - const MemberDef *memberDef,bool showLineNumbers,const Definition *searchCtx, - bool collectXRefs); -extern void resetSqlCodeParserState(); +/** SQL scanner. Only support syntax highlighting of code at the moment. + */ +class SQLCodeParser : public CodeParserInterface +{ + public: + void parseCode(CodeOutputInterface &codeOutIntf, + const char *scopeName, + const QCString &input, + SrcLangExt, + bool isExampleBlock, + const char *exampleName=0, + FileDef *fileDef=0, + int startLine=-1, + int endLine=-1, + bool inlineFragment=FALSE, + const MemberDef *memberDef=0, + bool showLineNumbers=TRUE, + const Definition *searchCtx=0, + bool collectXRefs=TRUE + ); + void resetCodeParserState(); +}; + #endif diff --git a/src/sqlcode.l b/src/sqlcode.l index 2685c46..02c2c14 100644 --- a/src/sqlcode.l +++ b/src/sqlcode.l @@ -383,7 +383,7 @@ void parseSqlCode( struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; #ifdef FLEX_DEBUG - yyset_debug(1,yyscanner); + sqlcodeYYset_debug(1,yyscanner); #endif printlex(yy_flex_debug, TRUE, __FILE__, fd ? fd->fileName().data(): NULL); @@ -454,12 +454,34 @@ void resetSqlCodeParserState() yyextra->currentMemberDef = 0; } -#if !defined(YY_FLEX_SUBMINOR_VERSION) -extern "C" { // some bogus code to keep the compiler happy - void sqlcodeYYdummy() { yy_flex_realloc(0,0); } +//--------------------------------------------------------------------------------- + +void SQLCodeParser::parseCode(CodeOutputInterface &codeOutIntf, + const char *scopeName, + const QCString &input, + SrcLangExt, + bool isExampleBlock, + const char *exampleName, + FileDef *fileDef, + int startLine, + int endLine, + bool inlineFragment, + const MemberDef *memberDef, + bool showLineNumbers, + const Definition *searchCtx, + bool collectXRefs + ) +{ + parseSqlCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName, + fileDef,startLine,endLine,inlineFragment,memberDef, + showLineNumbers,searchCtx,collectXRefs); } -#elif YY_FLEX_MAJOR_VERSION<=2 && YY_FLEX_MINOR_VERSION<=5 && YY_FLEX_SUBMINOR_VERSION<33 -#error "You seem to be using a version of flex newer than 2.5.4. These are currently incompatible with 2.5.4, and do NOT work with doxygen! Please use version 2.5.4 or expect things to be parsed wrongly! A bug report has been submitted (#732132)." -#endif + +void SQLCodeParser::resetCodeParserState() +{ + resetSqlCodeParserState(); +} + +//--------------------------------------------------------------------------------- #include "sqlcode.l.h" diff --git a/src/sqlite3gen.cpp b/src/sqlite3gen.cpp index dc0cc85..14a73d8 100644 --- a/src/sqlite3gen.cpp +++ b/src/sqlite3gen.cpp @@ -1099,7 +1099,7 @@ static void insertMemberFunctionParams(int memberdef_id, const MemberDef *md, co static void insertMemberDefineParams(int memberdef_id,const MemberDef *md, const Definition *def) { if (md->argumentList().empty()) // special case for "foo()" to - // disguish it from "foo". + // distinguish it from "foo". { DBG_CTX(("no params\n")); } @@ -1125,7 +1125,7 @@ static void associateMember(const MemberDef *md, struct Refid member_refid, stru // TODO: skip EnumValue only to guard against recording refids and member records // for enumvalues until we can support documenting them as entities. if (md->memberType()==MemberType_EnumValue) return; - if (md->name().at(0)!='@') // skip anonymous members + if (!md->isAnonymous()) // skip anonymous members { bindIntParameter(member_insert, ":scope_rowid", scope_refid.rowid); bindIntParameter(member_insert, ":memberdef_rowid", member_refid.rowid); @@ -1276,7 +1276,7 @@ static void writeInnerClasses(const ClassSDict *cl, struct Refid outer_refid) const ClassDef *cd; for (cli.toFirst();(cd=cli.current());++cli) { - if (!cd->isHidden() && cd->name().find('@')==-1) // skip anonymous scopes + if (!cd->isHidden() && !cd->isAnonymous()) { struct Refid inner_refid = insertRefid(cd->getOutputFileBase()); @@ -1365,7 +1365,7 @@ static void writeInnerNamespaces(const NamespaceSDict *nl, struct Refid outer_re const NamespaceDef *nd; for (nli.toFirst();(nd=nli.current());++nli) { - if (!nd->isHidden() && nd->name().find('@')==-1) // skip anonymous scopes + if (!nd->isHidden() && !nd->isAnonymous()) { struct Refid inner_refid = insertRefid(nd->getOutputFileBase()); @@ -1954,7 +1954,7 @@ static void generateSqlite3ForClass(const ClassDef *cd) if (cd->isReference()) return; // skip external references. if (cd->isHidden()) return; // skip hidden classes. - if (cd->name().find('@')!=-1) return; // skip anonymous compounds. + if (cd->isAnonymous()) return; // skip anonymous compounds. if (cd->templateMaster()!=0) return; // skip generated template instances. struct Refid refid = insertRefid(cd->getOutputFileBase()); diff --git a/src/sqlscanner.h b/src/sqlscanner.h deleted file mode 100644 index b981b5b..0000000 --- a/src/sqlscanner.h +++ /dev/null @@ -1,65 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 1997-2015 by Dimitri van Heesch. - * - * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software - * for any purpose. It is provided "as is" without express or implied warranty. - * See the GNU General Public License for more details. - * - * Documents produced by Doxygen are derivative works derived from the - * input used in their production; they are not affected by this license. - * - */ - -#ifndef SQLSCANNER_H -#define SQLSCANNER_H - -#include "parserintf.h" -#include "sqlcode.h" - -/** SQL scanner. Only support syntax highlighting of code at the moment. - */ -class SQLScanner : public ParserInterface -{ -public: - SQLScanner() {} - virtual ~SQLScanner() {} - void startTranslationUnit(const char *) {} - void finishTranslationUnit() {} - void parseInput(const char *, const char *, const std::unique_ptr<Entry> &, bool , QStrList &) {} - bool needsPreprocessing(const QCString &) { return FALSE; } - - void parseCode(CodeOutputInterface &codeOutIntf, - const char *scopeName, - const QCString &input, - SrcLangExt, - bool isExampleBlock, - const char *exampleName=0, - FileDef *fileDef=0, - int startLine=-1, - int endLine=-1, - bool inlineFragment=FALSE, - const MemberDef *memberDef=0, - bool showLineNumbers=TRUE, - const Definition *searchCtx=0, - bool collectXRefs=TRUE - ) - { - parseSqlCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName, - fileDef,startLine,endLine,inlineFragment,memberDef, - showLineNumbers,searchCtx,collectXRefs); - } - - void resetCodeParserState() - { - resetSqlCodeParserState(); - } - - void parsePrototype(const char *) {} - -private: -}; - -#endif diff --git a/src/tagreader.cpp b/src/tagreader.cpp index 65336e3..4b99f0d 100644 --- a/src/tagreader.cpp +++ b/src/tagreader.cpp @@ -496,6 +496,23 @@ class TagFileParser : public QXmlDefaultHandler void endDocAnchor() { + // Check whether or not the tag is automatically generate, in that case ignore the tag. + switch(m_state) + { + case InClass: + case InFile: + case InNamespace: + case InGroup: + case InPage: + case InMember: + case InPackage: + case InDir: + if (QString(m_curString).startsWith("autotoc_md")) return; + break; + default: + warn("Unexpected tag 'docanchor' found"); + return; + } switch(m_state) { case InClass: m_curClass->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString,m_title)); break; @@ -506,7 +523,7 @@ class TagFileParser : public QXmlDefaultHandler case InMember: m_curMember->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString,m_title)); break; case InPackage: m_curPackage->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString,m_title)); break; case InDir: m_curDir->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString,m_title)); break; - default: warn("Unexpected tag 'docanchor' found"); break; + default: break; // will not be reached } } @@ -909,12 +926,12 @@ class TagFileParser : public QXmlDefaultHandler } void dump(); - void buildLists(const std::unique_ptr<Entry> &root); + void buildLists(const std::shared_ptr<Entry> &root); void addIncludes(); private: - void buildMemberList(const std::unique_ptr<Entry> &ce,QList<TagMemberInfo> &members); - void addDocAnchors(const std::unique_ptr<Entry> &e,const TagAnchorInfoList &l); + void buildMemberList(const std::shared_ptr<Entry> &ce,QList<TagMemberInfo> &members); + void addDocAnchors(const std::shared_ptr<Entry> &e,const TagAnchorInfoList &l); QList<TagClassInfo> m_tagFileClasses; QList<TagFileInfo> m_tagFileFiles; QList<TagNamespaceInfo> m_tagFileNamespaces; @@ -1139,7 +1156,7 @@ void TagFileParser::dump() } } -void TagFileParser::addDocAnchors(const std::unique_ptr<Entry> &e,const TagAnchorInfoList &l) +void TagFileParser::addDocAnchors(const std::shared_ptr<Entry> &e,const TagAnchorInfoList &l) { QListIterator<TagAnchorInfo> tli(l); TagAnchorInfo *ta; @@ -1161,13 +1178,13 @@ void TagFileParser::addDocAnchors(const std::unique_ptr<Entry> &e,const TagAncho } } -void TagFileParser::buildMemberList(const std::unique_ptr<Entry> &ce,QList<TagMemberInfo> &members) +void TagFileParser::buildMemberList(const std::shared_ptr<Entry> &ce,QList<TagMemberInfo> &members) { QListIterator<TagMemberInfo> mii(members); TagMemberInfo *tmi; for (;(tmi=mii.current());++mii) { - std::unique_ptr<Entry> me = std::make_unique<Entry>(); + std::shared_ptr<Entry> me = std::make_shared<Entry>(); me->type = tmi->type; me->name = tmi->name; me->args = tmi->arglist; @@ -1182,7 +1199,7 @@ void TagFileParser::buildMemberList(const std::unique_ptr<Entry> &ce,QList<TagMe TagEnumValueInfo *evi; for (evii.toFirst();(evi=evii.current());++evii) { - std::unique_ptr<Entry> ev = std::make_unique<Entry>(); + std::shared_ptr<Entry> ev = std::make_shared<Entry>(); ev->type = "@"; ev->name = evi->name; ev->id = evi->clangid; @@ -1296,14 +1313,14 @@ static QCString stripPath(const QCString &s) * This tree contains the information extracted from the input in a * "unrelated" form. */ -void TagFileParser::buildLists(const std::unique_ptr<Entry> &root) +void TagFileParser::buildLists(const std::shared_ptr<Entry> &root) { // build class list QListIterator<TagClassInfo> cit(m_tagFileClasses); TagClassInfo *tci; for (cit.toFirst();(tci=cit.current());++cit) { - std::unique_ptr<Entry> ce = std::make_unique<Entry>(); + std::shared_ptr<Entry> ce = std::make_shared<Entry>(); ce->section = Entry::CLASS_SEC; switch (tci->kind) { @@ -1360,7 +1377,7 @@ void TagFileParser::buildLists(const std::unique_ptr<Entry> &root) TagFileInfo *tfi; for (fit.toFirst();(tfi=fit.current());++fit) { - std::unique_ptr<Entry> fe = std::make_unique<Entry>(); + std::shared_ptr<Entry> fe = std::make_shared<Entry>(); fe->section = guessSection(tfi->name); fe->name = tfi->name; addDocAnchors(fe,tfi->docAnchors); @@ -1396,7 +1413,7 @@ void TagFileParser::buildLists(const std::unique_ptr<Entry> &root) TagNamespaceInfo *tni; for (nit.toFirst();(tni=nit.current());++nit) { - std::unique_ptr<Entry> ne = std::make_unique<Entry>(); + std::shared_ptr<Entry> ne = std::make_shared<Entry>(); ne->section = Entry::NAMESPACE_SEC; ne->name = tni->name; addDocAnchors(ne,tni->docAnchors); @@ -1414,7 +1431,7 @@ void TagFileParser::buildLists(const std::unique_ptr<Entry> &root) TagPackageInfo *tpgi; for (pit.toFirst();(tpgi=pit.current());++pit) { - std::unique_ptr<Entry> pe = std::make_unique<Entry>(); + std::shared_ptr<Entry> pe = std::make_shared<Entry>(); pe->section = Entry::PACKAGE_SEC; pe->name = tpgi->name; addDocAnchors(pe,tpgi->docAnchors); @@ -1431,7 +1448,7 @@ void TagFileParser::buildLists(const std::unique_ptr<Entry> &root) TagGroupInfo *tgi; for (git.toFirst();(tgi=git.current());++git) { - std::unique_ptr<Entry> ge = std::make_unique<Entry>(); + std::shared_ptr<Entry> ge = std::make_shared<Entry>(); ge->section = Entry::GROUPDOC_SEC; ge->name = tgi->name; ge->type = tgi->title; @@ -1455,7 +1472,7 @@ void TagFileParser::buildLists(const std::unique_ptr<Entry> &root) //for (eli.toFirst();(childNode=eli.current());++eli) const auto &children = root->children(); auto i = std::find_if(children.begin(),children.end(), - [&](const std::unique_ptr<Entry> &e) { return e->name = *it; }); + [&](const std::shared_ptr<Entry> &e) { return e->name = *it; }); if (i!=children.end()) { (*i)->groups.push_back(Grouping(tgi->name,Grouping::GROUPING_INGROUP)); @@ -1468,7 +1485,7 @@ void TagFileParser::buildLists(const std::unique_ptr<Entry> &root) TagPageInfo *tpi; for (pgit.toFirst();(tpi=pgit.current());++pgit) { - std::unique_ptr<Entry> pe = std::make_unique<Entry>(); + std::shared_ptr<Entry> pe = std::make_shared<Entry>(); pe->section = tpi->filename=="index" ? Entry::MAINPAGEDOC_SEC : Entry::PAGEDOC_SEC; pe->name = tpi->name; pe->args = tpi->title; @@ -1527,7 +1544,7 @@ void TagFileParser::addIncludes() } } -void parseTagFile(const std::unique_ptr<Entry> &root,const char *fullName) +void parseTagFile(const std::shared_ptr<Entry> &root,const char *fullName) { QFileInfo fi(fullName); if (!fi.exists()) return; diff --git a/src/tagreader.h b/src/tagreader.h index 4c09a04..454060b 100644 --- a/src/tagreader.h +++ b/src/tagreader.h @@ -23,6 +23,6 @@ class Entry; #include <memory> -void parseTagFile(const std::unique_ptr<Entry> &root,const char *fullPathName); +void parseTagFile(const std::shared_ptr<Entry> &root,const char *fullPathName); #endif diff --git a/src/tclscanner.h b/src/tclscanner.h index 482fb1f..cdd56d8 100644 --- a/src/tclscanner.h +++ b/src/tclscanner.h @@ -25,18 +25,23 @@ * * This is the Tcl language parser for doxygen. */ -class TclLanguageScanner : public ParserInterface +class TclOutlineParser : public OutlineParserInterface { public: - virtual ~TclLanguageScanner() {} void startTranslationUnit(const char *) {} void finishTranslationUnit() {} void parseInput(const char *fileName, const char *fileBuf, - const std::unique_ptr<Entry> &root, + const std::shared_ptr<Entry> &root, bool sameTranslationUnit, QStrList &filesInSameTranslationUnit); - bool needsPreprocessing(const QCString &extension); + bool needsPreprocessing(const QCString &extension) const; + void parsePrototype(const char *text); +}; + +class TclCodeParser : public CodeParserInterface +{ + public: void parseCode(CodeOutputInterface &codeOutIntf, const char *scopeName, const QCString &input, @@ -53,7 +58,6 @@ class TclLanguageScanner : public ParserInterface bool collectXRefs=TRUE ); void resetCodeParserState(); - void parsePrototype(const char *text); }; #endif diff --git a/src/tclscanner.l b/src/tclscanner.l index 4a262bc..a4709ce 100644 --- a/src/tclscanner.l +++ b/src/tclscanner.l @@ -429,7 +429,7 @@ static struct QCString input_string; // file contents int input_position; // position in file QCString file_name; // name of used file - ParserInterface *this_parser; // myself + OutlineParserInterface *this_parser; // myself int command; // true if command was found int comment; // set true if comment was scanned int brace_level; // bookkeeping of braces @@ -486,6 +486,8 @@ Entry* tcl_entry_new() // myEntry->mtype = Method; // myEntry->virt = Normal; // myEntry->stat = FALSE; + myEntry->docFile = tcl.file_name; + myEntry->inbodyFile = tcl.file_name; myEntry->fileName = tcl.file_name; myEntry->lang = SrcLangExt_Tcl; Doxygen::docGroup.initGroupInfo(myEntry); @@ -535,6 +537,13 @@ static void tcl_name(const QCString &ns0, const QCString &name0, QCString &ns, Q ns = ""; name = myNm; } + else if (myNm.length()-myStart == 2) + { + // ending with :: so get name equal to last component + ns = myNm.mid(0,myStart); + myStart = ns.findRev("::"); + name = myNm.mid(myStart+2); + } else { ns = myNm.mid(0,myStart); @@ -1494,7 +1503,7 @@ tcl_inf("-> %s\n",(const char *)tcl.string_comment); { tcl_inf("-> %s\n",(const char *)tcl.string_comment); int myPos=0; - bool myNew=0; + bool myNew=false; int myLine=tcl.line_comment; BufStr myI(1024); BufStr myO(1024); @@ -2146,6 +2155,8 @@ D tcl.entry_current->mtype = Method; tcl.entry_current->name = myName; tcl.entry_current->startLine = tcl.line_command; + tcl.entry_current->docLine = tcl.line_comment; + tcl.entry_current->inbodyLine = tcl.line_comment; tcl.entry_current->bodyLine = tcl.line_body0; tcl.entry_current->endBodyLine = tcl.line_body1; tcl_protection(tcl.entry_current); @@ -2188,6 +2199,8 @@ D tcl.entry_current->mtype = Method; tcl.entry_current->name = myName; tcl.entry_current->startLine = tcl.line_command; + tcl.entry_current->docLine = tcl.line_comment; + tcl.entry_current->inbodyLine = tcl.line_comment; tcl.entry_current->bodyLine = tcl.line_body0; tcl.entry_current->endBodyLine = tcl.line_body1; tcl_protection(tcl.entry_current); @@ -2225,6 +2238,8 @@ D tcl.entry_current->mtype = Method; tcl.entry_current->name = myName; tcl.entry_current->startLine = tcl.line_command; + tcl.entry_current->docLine = tcl.line_comment; + tcl.entry_current->inbodyLine = tcl.line_comment; tcl.entry_current->bodyLine = tcl.line_body0; tcl.entry_current->endBodyLine = tcl.line_body1; tcl_protection(tcl.entry_current); @@ -2260,6 +2275,8 @@ D tcl.entry_current->mtype = Method; tcl.entry_current->name = myName; tcl.entry_current->startLine = tcl.line_command; + tcl.entry_current->docLine = tcl.line_comment; + tcl.entry_current->inbodyLine = tcl.line_comment; tcl.entry_current->bodyLine = tcl.line_body0; tcl.entry_current->endBodyLine = tcl.line_body1; tcl_protection(tcl.entry_current); @@ -2293,6 +2310,8 @@ D tcl.entry_current->section = Entry::NAMESPACE_SEC; tcl.entry_current->name = myName; tcl.entry_current->startLine = tcl.line_command; + tcl.entry_current->docLine = tcl.line_comment; + tcl.entry_current->inbodyLine = tcl.line_comment; tcl.entry_current->bodyLine = tcl.line_body0; tcl.entry_current->endBodyLine = tcl.line_body1; tcl.entry_main->moveToSubEntryAndKeep(tcl.entry_current); @@ -2331,6 +2350,8 @@ D tcl.entry_current->section = Entry::CLASS_SEC; tcl.entry_current->name = myName; tcl.entry_current->startLine = tcl.line_command; + tcl.entry_current->docLine = tcl.line_comment; + tcl.entry_current->inbodyLine = tcl.line_comment; tcl.entry_current->bodyLine = tcl.line_body0; tcl.entry_current->endBodyLine = tcl.line_body1; tcl.entry_main->moveToSubEntryAndKeep(tcl.entry_current); @@ -2363,6 +2384,8 @@ D tcl.entry_current->section = Entry::CLASS_SEC; tcl.entry_current->name = myName; tcl.entry_current->startLine = tcl.line_command; + tcl.entry_current->docLine = tcl.line_comment; + tcl.entry_current->inbodyLine = tcl.line_comment; tcl.entry_current->bodyLine = tcl.line_body0; tcl.entry_current->endBodyLine = tcl.line_body1; tcl.entry_main->moveToSubEntryAndKeep(tcl.entry_current); @@ -2415,6 +2438,8 @@ D tcl.entry_current->mtype = Method; tcl.entry_current->name = myMethod; tcl.entry_current->startLine = tcl.line_command; + tcl.entry_current->docLine = tcl.line_comment; + tcl.entry_current->inbodyLine = tcl.line_comment; tcl.entry_current->bodyLine = tcl.line_body0; tcl.entry_current->endBodyLine = tcl.line_body1; tcl_protection(tcl.entry_current); @@ -2485,6 +2510,8 @@ D tcl.entry_current->section = Entry::VARIABLE_SEC; tcl.entry_current->name = myName; tcl.entry_current->startLine = tcl.line_command; + tcl.entry_current->docLine = tcl.line_comment; + tcl.entry_current->inbodyLine = tcl.line_comment; tcl.entry_current->bodyLine = tcl.line_body0; tcl.entry_current->endBodyLine = tcl.line_body1; tcl_protection(tcl.entry_current); @@ -2937,9 +2964,9 @@ static void tcl_parse(const QCString ns, const QCString cls) } //! Parse text file and build up entry tree. -void TclLanguageScanner::parseInput(const char *fileName, +void TclOutlineParser::parseInput(const char *fileName, const char *input, - const std::unique_ptr<Entry> &root, + const std::shared_ptr<Entry> &root, bool /*sameTranslationUnit*/, QStrList & /*filesInSameTranslationUnit*/) { @@ -2968,8 +2995,40 @@ tcl_inf("%s\n",fileName); printlex(yy_flex_debug, FALSE, __FILE__, fileName); } + +bool TclOutlineParser::needsPreprocessing(const QCString &extension) const +{ + (void)extension; + return FALSE; +} + +void TclOutlineParser::parsePrototype(const char *text) +{ + (void)text; +} + +static int yyread(char *buf,int max_size) +{ + int c=0; + + *buf = '\0'; + while ( c < max_size && tcl.input_string.at(tcl.input_position) ) + { + *buf = tcl.input_string.at(tcl.input_position++) ; + c++; buf++; + } + //printf("Read from=%d size=%d max=%d c=%d\n",tcl.input_position,strlen(&tcl.input_string[tcl.input_position]),max_size,c); + return c; +} + +//---------------------------------------------------------------------------- + +void TclCodeParser::resetCodeParserState() +{ +} + //! Parse file and codify. -void TclLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf, +void TclCodeParser::parseCode(CodeOutputInterface & codeOutIntf, const char * scopeName, const QCString & input, SrcLangExt lang, @@ -3073,36 +3132,6 @@ tcl_inf("%s (%d,%d) %d %d\n",myStr.data(),startLine,endLine,isExampleBlock,inlin tcl.entry.clear(); printlex(yy_flex_debug, FALSE, __FILE__, fileDef ? fileDef->fileName().data(): NULL); } - -bool TclLanguageScanner::needsPreprocessing(const QCString &extension) -{ - (void)extension; - return FALSE; -} - -void TclLanguageScanner::resetCodeParserState() -{ -} - -void TclLanguageScanner::parsePrototype(const char *text) -{ - (void)text; -} - -static int yyread(char *buf,int max_size) -{ - int c=0; - - *buf = '\0'; - while ( c < max_size && tcl.input_string.at(tcl.input_position) ) - { - *buf = tcl.input_string.at(tcl.input_position++) ; - c++; buf++; - } - //printf("Read from=%d size=%d max=%d c=%d\n",tcl.input_position,strlen(&tcl.input_string[tcl.input_position]),max_size,c); - return c; -} - //---------------------------------------------------------------------------- // to avoid a warning @@ -3111,11 +3140,4 @@ void tclDummy() yy_top_state(); } -#if !defined(YY_FLEX_SUBMINOR_VERSION) -//---------------------------------------------------------------------------- -extern "C" { // some bogus code to keep the compiler happy - void tclscannerYYdummy() { yy_flex_realloc(0,0); } -} -#endif - #include "tclscanner.l.h" diff --git a/src/template.cpp b/src/template.cpp index 228da4d..ca28c73 100644 --- a/src/template.cpp +++ b/src/template.cpp @@ -245,7 +245,7 @@ class TemplateStruct::Private Private() : fields(17), refCount(0) { fields.setAutoDelete(TRUE); } QDict<TemplateVariant> fields; - int refCount; + int refCount = 0; }; TemplateStruct::TemplateStruct() @@ -306,8 +306,8 @@ class TemplateList::Private public: Private() : index(-1), refCount(0) {} QValueList<TemplateVariant> elems; - int index; - int refCount; + int index = -1; + int refCount = 0; }; @@ -398,7 +398,7 @@ class TemplateListConstIterator : public TemplateListIntf::ConstIterator private: const TemplateList &m_list; QValueList<TemplateVariant>::ConstIterator m_it; - int m_index; + int m_index = 0; }; TemplateListIntf::ConstIterator *TemplateList::createIterator() const @@ -565,21 +565,21 @@ class TemplateContextImpl : public TemplateContext void addIndexEntry(const QCString &indexName,const QValueList<TemplateKeyValue> &arguments); private: - const TemplateEngine *m_engine; + const TemplateEngine *m_engine = 0; QCString m_templateName; - int m_line; + int m_line = 0; QCString m_outputDir; QList< QDict<TemplateVariant> > m_contextStack; TemplateBlockContext m_blockContext; QDict<TemplateEscapeIntf*> m_escapeIntfDict; - TemplateEscapeIntf *m_activeEscapeIntf; - TemplateSpacelessIntf *m_spacelessIntf; - bool m_spacelessEnabled; - bool m_tabbingEnabled; + TemplateEscapeIntf *m_activeEscapeIntf = 0; + TemplateSpacelessIntf *m_spacelessIntf = 0; + bool m_spacelessEnabled = false; + bool m_tabbingEnabled = false; TemplateAutoRef<TemplateStruct> m_indices; QDict< QStack<TemplateVariant> > m_indexStacks; QCString m_encoding; - void *m_fromUtf8; + void *m_fromUtf8 = 0; }; //----------------------------------------------------------------------------- @@ -1445,7 +1445,7 @@ class ExprAstNumber : public ExprAst int number() const { return m_number; } virtual TemplateVariant resolve(TemplateContext *) { return TemplateVariant(m_number); } private: - int m_number; + int m_number = 0; }; /** @brief Class representing a variable in the AST */ @@ -1497,7 +1497,7 @@ class ExprAstFunctionVariable : public ExprAst return v; } private: - ExprAst *m_var; + ExprAst *m_var = 0; QList<ExprAst> m_args; }; @@ -1526,7 +1526,7 @@ class ExprAstFilter : public ExprAst } private: QCString m_name; - ExprAst *m_arg; + ExprAst *m_arg = 0; }; /** @brief Class representing a filter applied to an expression in the AST */ @@ -1542,7 +1542,7 @@ class ExprAstFilterAppl : public ExprAst return m_filter->apply(m_expr->resolve(c),c); } private: - ExprAst *m_expr; + ExprAst *m_expr = 0; ExprAstFilter *m_filter; }; @@ -1568,7 +1568,7 @@ class ExprAstNegate : public ExprAst virtual TemplateVariant resolve(TemplateContext *c) { return TemplateVariant(!m_expr->resolve(c).toBool()); } private: - ExprAst *m_expr; + ExprAst *m_expr = 0; }; class ExprAstUnary : public ExprAst @@ -1589,8 +1589,8 @@ class ExprAstUnary : public ExprAst } } private: - Operator::Type m_operator; - ExprAst *m_exp; + Operator::Type m_operator = Operator::Or; + ExprAst *m_exp = 0; }; /** @brief Class representing a binary operator in the AST */ @@ -1696,9 +1696,9 @@ class ExprAstBinary : public ExprAst } } private: - Operator::Type m_operator; - ExprAst *m_lhs; - ExprAst *m_rhs; + Operator::Type m_operator = Operator::Or; + ExprAst *m_lhs = 0; + ExprAst *m_rhs = 0; }; //---------------------------------------------------------- @@ -1715,7 +1715,7 @@ class TemplateNode TemplateNode *parent() { return m_parent; } private: - TemplateNode *m_parent; + TemplateNode *m_parent = 0; }; //---------------------------------------------------------- @@ -1736,7 +1736,7 @@ class TemplateParser QCString templateName() const { return m_templateName; } void warn(const char *fileName,int line,const char *fmt,...) const; private: - const TemplateEngine *m_engine; + const TemplateEngine *m_engine = 0; QCString m_templateName; QList<TemplateToken> &m_tokens; }; @@ -2282,9 +2282,9 @@ class ExpressionParser return TRUE; } - const TemplateParser *m_parser; + const TemplateParser *m_parser = 0; ExprToken m_curToken; - int m_line; + int m_line = 0; const char *m_tokenStream; }; @@ -2296,9 +2296,9 @@ class TemplateToken public: enum Type { Text, Variable, Block }; TemplateToken(Type t,const char *d,int l) : type(t), data(d), line(l) {} - Type type; + Type type = Text; QCString data; - int line; + int line = 0; }; //---------------------------------------------------------- @@ -2339,7 +2339,7 @@ class TemplateImpl : public TemplateNode, public Template TemplateBlockContext *blockContext() { return &m_blockContext; } private: - TemplateEngine *m_engine; + TemplateEngine *m_engine = 0; QCString m_name; TemplateNodeList m_nodes; TemplateBlockContext m_blockContext; @@ -2358,8 +2358,8 @@ class TemplateStructWeakRef : public TemplateStructIntf virtual int addRef() { return ++m_refCount; } virtual int release() { int count=--m_refCount; if (count<=0) { delete this; } return count; } private: - TemplateStructIntf *m_ref; - int m_refCount; + TemplateStructIntf *m_ref = 0; + int m_refCount = 0; }; //---------------------------------------------------------- @@ -2789,8 +2789,8 @@ class TemplateNodeVariable : public TemplateNode private: QCString m_templateName; - int m_line; - ExprAst *m_var; + int m_line = 0; + ExprAst *m_var = 0; QList<ExprAst> m_args; }; @@ -2853,7 +2853,7 @@ template<class T> class TemplateNodeCreator : public TemplateNode } } QCString m_templateName; - int m_line; + int m_line = 0; }; //---------------------------------------------------------- @@ -2950,8 +2950,8 @@ class TemplateNodeIf : public TemplateNodeCreator<TemplateNodeIf> { GuardedNodes() : guardAst(0) {} ~GuardedNodes() { delete guardAst; } - int line; - ExprAst *guardAst; + int line = 0; + ExprAst *guardAst = 0; TemplateNodeList trueNodes; }; QList<GuardedNodes> m_ifGuardedNodes; @@ -3009,7 +3009,7 @@ class TemplateNodeRepeat : public TemplateNodeCreator<TemplateNodeRepeat> } private: TemplateNodeList m_repeatNodes; - ExprAst *m_expr; + ExprAst *m_expr = 0; }; //---------------------------------------------------------- @@ -3175,9 +3175,9 @@ class TemplateNodeRange : public TemplateNodeCreator<TemplateNodeRange> } private: - bool m_down; - ExprAst *m_startExpr; - ExprAst *m_endExpr; + bool m_down = false; + ExprAst *m_startExpr = 0; + ExprAst *m_endExpr = 0; QCString m_var; TemplateNodeList m_loopNodes; }; @@ -3332,8 +3332,8 @@ class TemplateNodeFor : public TemplateNodeCreator<TemplateNodeFor> } private: - bool m_reversed; - ExprAst *m_expr; + bool m_reversed = false; + ExprAst *m_expr = 0; QValueList<QCString> m_vars; TemplateNodeList m_loopNodes; TemplateNodeList m_emptyNodes; @@ -3534,7 +3534,7 @@ class TemplateNodeExtend : public TemplateNodeCreator<TemplateNodeExtend> } private: - ExprAst *m_extendExpr; + ExprAst *m_extendExpr = 0; TemplateNodeList m_nodes; }; @@ -3591,7 +3591,7 @@ class TemplateNodeInclude : public TemplateNodeCreator<TemplateNodeInclude> } private: - ExprAst *m_includeExpr; + ExprAst *m_includeExpr = 0; }; //---------------------------------------------------------- @@ -3724,8 +3724,8 @@ class TemplateNodeCreate : public TemplateNodeCreator<TemplateNodeCreate> } private: - ExprAst *m_templateExpr; - ExprAst *m_fileExpr; + ExprAst *m_templateExpr = 0; + ExprAst *m_fileExpr = 0; }; //---------------------------------------------------------- @@ -3839,7 +3839,7 @@ class TemplateNodeTree : public TemplateNodeCreator<TemplateNodeTree> } private: - ExprAst *m_treeExpr; + ExprAst *m_treeExpr = 0; TemplateNodeList m_treeNodes; }; @@ -3853,7 +3853,7 @@ class TemplateNodeIndexEntry : public TemplateNodeCreator<TemplateNodeIndexEntry Mapping(const QCString &n,ExprAst *e) : name(n), value(e) {} ~Mapping() { delete value; } QCString name; - ExprAst *value; + ExprAst *value = 0; }; public: TemplateNodeIndexEntry(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) @@ -4128,7 +4128,7 @@ class TemplateNodeCycle : public TemplateNodeCreator<TemplateNodeCycle> } } private: - uint m_index; + uint m_index = 0; QList<ExprAst> m_args; }; @@ -4142,7 +4142,7 @@ class TemplateNodeSet : public TemplateNodeCreator<TemplateNodeSet> Mapping(const QCString &n,ExprAst *e) : name(n), value(e) {} ~Mapping() { delete value; } QCString name; - ExprAst *value; + ExprAst *value = 0; }; public: TemplateNodeSet(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) @@ -4175,7 +4175,7 @@ class TemplateNodeSet : public TemplateNodeCreator<TemplateNodeSet> } } private: - Mapping *m_mapping; + Mapping *m_mapping = 0; }; //---------------------------------------------------------- @@ -4323,8 +4323,8 @@ class TemplateNodeMarkers : public TemplateNodeCreator<TemplateNodeMarkers> private: TemplateNodeList m_nodes; QCString m_var; - ExprAst *m_listExpr; - ExprAst *m_patternExpr; + ExprAst *m_listExpr = 0; + ExprAst *m_patternExpr = 0; }; //---------------------------------------------------------- @@ -4427,8 +4427,8 @@ class TemplateNodeResource : public TemplateNodeCreator<TemplateNodeResource> } } private: - ExprAst *m_resExpr; - ExprAst *m_asExpr; + ExprAst *m_resExpr = 0; + ExprAst *m_asExpr = 0; }; //---------------------------------------------------------- @@ -4645,11 +4645,11 @@ class TemplateLexer const char *data,int line,int startPos,int endPos, TemplateToken::Type type); void reset(); - const TemplateEngine *m_engine; + const TemplateEngine *m_engine = 0; QCString m_fileName; QCString m_data; - char m_openChar; - char m_closeChar; + char m_openChar = 0; + char m_closeChar = 0; }; TemplateLexer::TemplateLexer(const TemplateEngine *engine,const QCString &fileName,const QCString &data) : @@ -4693,7 +4693,7 @@ void TemplateLexer::tokenize(QList<TemplateToken> &tokens) { state=StateBeginTemplate; } - else if (c!=' ' && c!='\t' && c!='\n') // non-whitepace text + else if (c!=' ' && c!='\t' && c!='\n') // non-whitespace text { emptyOutputLine=FALSE; } @@ -5070,10 +5070,10 @@ class TemplateEngine::Private int line() const { return m_line; } private: - Type m_type; + Type m_type = Template; QCString m_fileName; QCString m_blockName; - int m_line; + int m_line = 0; }; public: Private(TemplateEngine *engine) : m_templateCache(17) /*, m_indent(0)*/, m_engine(engine) @@ -5185,7 +5185,7 @@ class TemplateEngine::Private private: QDict<Template> m_templateCache; //mutable int m_indent; - TemplateEngine *m_engine; + TemplateEngine *m_engine = 0; QList<IncludeEntry> m_includeStack; QCString m_extension; QCString m_templateDirName; diff --git a/src/tooltip.cpp b/src/tooltip.cpp index a30a85c..8cc1f87 100644 --- a/src/tooltip.cpp +++ b/src/tooltip.cpp @@ -115,10 +115,9 @@ void TooltipManager::writeTooltips(CodeOutputInterface &ol) if (d->definitionType()==Definition::TypeMember) { MemberDef *md = dynamic_cast<MemberDef*>(d); - decl = md->declaration(); - if (!decl.isEmpty() && decl.at(0)=='@') // hide enum values + if (!md->isAnonymous()) { - decl.resize(0); + decl = md->declaration(); } } ol.writeTooltip(di.currentKey(), // id diff --git a/src/util.cpp b/src/util.cpp index 8e0884f..55dcc19 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -955,7 +955,7 @@ class AccessStack */ int isAccessibleFrom(const Definition *scope,const FileDef *fileScope,const Definition *item) { - //printf("<isAccesibleFrom(scope=%s,item=%s itemScope=%s)\n", + //printf("<isAccessibleFrom(scope=%s,item=%s itemScope=%s)\n", // scope->name().data(),item->name().data(),item->getOuterScope()->name().data()); static AccessStack accessStack; @@ -2428,7 +2428,7 @@ static QCString getFilterFromList(const char *name,const QStrList &filterList,bo if (i_equals!=-1) { QCString filterPattern = fs.left(i_equals); - QRegExp fpat(filterPattern,portable_fileSystemIsCaseSensitive(),TRUE); + QRegExp fpat(filterPattern,Portable::fileSystemIsCaseSensitive(),TRUE); if (fpat.match(name)!=-1) { // found a match! @@ -2589,7 +2589,7 @@ QCString fileToString(const char *name,bool filter,bool isSourceCode) static QDateTime getCurrentDateTime() { QDateTime current = QDateTime::currentDateTime(); - QCString sourceDateEpoch = portable_getenv("SOURCE_DATE_EPOCH"); + QCString sourceDateEpoch = Portable::getenv("SOURCE_DATE_EPOCH"); if (!sourceDateEpoch.isEmpty()) { bool ok; @@ -4283,7 +4283,7 @@ bool getDefs(const QCString &scName, int ni=namespaceName.findRev("::"); //printf("namespaceName=%s ni=%d\n",namespaceName.data(),ni); bool notInNS = tmd && ni==-1 && tmd->getNamespaceDef()==0 && (mScope.isEmpty() || mScope==tmd->name()); - bool sameNS = tmd && tmd->getNamespaceDef() && namespaceName.left(ni)==tmd->getNamespaceDef()->name(); + bool sameNS = tmd && tmd->getNamespaceDef() && namespaceName.left(ni)==tmd->getNamespaceDef()->name() && namespaceName.mid(ni+2)==tmd->name(); //printf("notInNS=%d sameNS=%d\n",notInNS,sameNS); if (tmd && tmd->isStrong() && // C++11 enum class (notInNS || sameNS) && @@ -7928,14 +7928,22 @@ void stackTrace() p += sprintf(p,"%p ", backtraceFrames[x]); } fprintf(stderr,"========== STACKTRACE START ==============\n"); - if (FILE *fp = popen(cmd, "r")) + #if defined(_WIN32) && !defined(__CYGWIN__) + if (FILE *fp = _popen(cmd, "r")) + #else + if (FILE *fp = ::popen(cmd, "r")) + #endif { char resBuf[512]; while (size_t len = fread(resBuf, 1, sizeof(resBuf), fp)) { fwrite(resBuf, 1, len, stderr); } - pclose(fp); + #if defined(_WIN32) && !defined(__CYGWIN__) + _pclose(fp); + #else + ::pclose(fp); + #endif } fprintf(stderr,"============ STACKTRACE END ==============\n"); //fprintf(stderr,"%s\n", frameStrings[x]); @@ -8011,7 +8019,7 @@ bool readInputFile(const char *fileName,BufStr &inBuf,bool filter,bool isSourceC { QCString cmd=filterName+" \""+fileName+"\""; Debug::print(Debug::ExtCmd,0,"Executing popen(`%s`)\n",qPrint(cmd)); - FILE *f=portable_popen(cmd,"r"); + FILE *f=Portable::popen(cmd,"r"); if (!f) { err("could not execute filter %s\n",filterName.data()); @@ -8025,7 +8033,7 @@ bool readInputFile(const char *fileName,BufStr &inBuf,bool filter,bool isSourceC //printf(">>>>>>>>Reading %d bytes\n",numRead); inBuf.addArray(buf,numRead),size+=numRead; } - portable_pclose(f); + Portable::pclose(f); inBuf.at(inBuf.curPos()) ='\0'; Debug::print(Debug::FilterOutput, 0, "Filter output\n"); Debug::print(Debug::FilterOutput,0,"-------------\n%s\n-------------\n",qPrint(inBuf)); @@ -8033,13 +8041,18 @@ bool readInputFile(const char *fileName,BufStr &inBuf,bool filter,bool isSourceC int start=0; if (size>=2 && - (((uchar)inBuf.at(0)==0xFF && (uchar)inBuf.at(1)==0xFE) || // Little endian BOM - ((uchar)inBuf.at(0)==0xFE && (uchar)inBuf.at(1)==0xFF) // big endian BOM - ) - ) // UCS-2 encoded file + ((uchar)inBuf.at(0)==0xFF && (uchar)inBuf.at(1)==0xFE) // Little endian BOM + ) // UCS-2LE encoded file + { + transcodeCharacterBuffer(fileName,inBuf,inBuf.curPos(), + "UCS-2LE","UTF-8"); + } + else if (size>=2 && + ((uchar)inBuf.at(0)==0xFE && (uchar)inBuf.at(1)==0xFF) // big endian BOM + ) // UCS-2BE encoded file { transcodeCharacterBuffer(fileName,inBuf,inBuf.curPos(), - "UCS-2","UTF-8"); + "UCS-2BE","UTF-8"); } else if (size>=3 && (uchar)inBuf.at(0)==0xEF && @@ -8646,7 +8659,7 @@ bool namespaceHasVisibleChild(const NamespaceDef *nd,bool includeClasses,bool fi const NamespaceDef *cnd; for (cnli.toFirst();(cnd=cnli.current());++cnli) { - if (cnd->isLinkableInProject() && cnd->localName().find('@')==-1) + if (cnd->isLinkableInProject() && !cnd->isAnonymous()) { return TRUE; } diff --git a/src/vhdlcode.h b/src/vhdlcode.h index a7b4687..b79e2ab 100644 --- a/src/vhdlcode.h +++ b/src/vhdlcode.h @@ -1,16 +1,35 @@ #ifndef VHDLCODE_H #define VHDLCODE_H +#include "parserintf.h" + class CodeOutputInterface; class FileDef; class MemberDef; -void parseVhdlCode(CodeOutputInterface &,const char *,const QCString &, - bool ,const char *,FileDef *fd, - int startLine,int endLine,bool inlineFragment, - const MemberDef *memberDef,bool showLineNumbers,const Definition *searchCtx, - bool collectXRefs); -void resetVhdlCodeParserState(); void codeFreeVhdlScanner(); +class VHDLCodeParser : public CodeParserInterface +{ + public: + virtual ~VHDLCodeParser() {} + void parseCode(CodeOutputInterface &codeOutIntf, + const char *scopeName, + const QCString &input, + SrcLangExt lang, + bool isExampleBlock, + const char *exampleName=0, + FileDef *fileDef=0, + int startLine=-1, + int endLine=-1, + bool inlineFragment=FALSE, + const MemberDef *memberDef=0, + bool showLineNumbers=TRUE, + const Definition *searchCtx=0, + bool collectXRefs=TRUE + ); + void resetCodeParserState() {} +}; + + #endif diff --git a/src/vhdlcode.l b/src/vhdlcode.l index 9f128ea..fe5a8d9 100644 --- a/src/vhdlcode.l +++ b/src/vhdlcode.l @@ -33,6 +33,7 @@ #include <qdir.h> #include <qcstringlist.h> +#include "vhdlcode.h" #include "entry.h" #include "doxygen.h" #include "message.h" @@ -1530,17 +1531,26 @@ XILINX "INST"|"NET"|"PIN"|"BLKNM"|"BUFG"|"COLLAPSE"|"CPLD"|"COMPGRP"|"CONFI /*@ ---------------------------------------------------------------------------- */ -void resetVhdlCodeParserState() +static void resetVhdlCodeParserState() { g_vhdlKeyDict.setAutoDelete(TRUE); g_vhdlKeyDict.clear(); } -void parseVhdlCode(CodeOutputInterface &od,const char *className,const QCString &s, - bool exBlock, const char *exName,FileDef *fd, - int startLine,int endLine,bool inlineFragment, - const MemberDef *memberDef,bool,const Definition *searchCtx, - bool /* collectXRefs */) +void VHDLCodeParser::parseCode(CodeOutputInterface &od, + const char *className, + const QCString &s, + SrcLangExt, + bool exBlock, + const char *exName, + FileDef *fd, + int startLine, + int endLine, + bool inlineFragment, + const MemberDef *memberDef, + bool, + const Definition *searchCtx, + bool /* collectXRefs */) { //printf("***parseCode() exBlock=%d exName=%s fd=%p\n",exBlock,exName,fd); if (s.isEmpty()) return; @@ -1634,13 +1644,5 @@ void codeFreeVhdlScanner() #endif } -#if !defined(YY_FLEX_SUBMINOR_VERSION) -extern "C" { // some bogus code to keep the compiler happy - void vhdlcodeYYdummy() { yy_flex_realloc(0,0); } -} -#elif YY_FLEX_MAJOR_VERSION<=2 && YY_FLEX_MINOR_VERSION<=5 && YY_FLEX_SUBMINOR_VERSION<33 -#error "You seem to be using a version of flex newer than 2.5.4 but older than 2.5.33. These versions do NOT work with doxygen! Please use version <=2.5.4 or >=2.5.33 or expect things to be parsed wrongly!" -#endif - #include "vhdlcode.l.h" diff --git a/src/vhdldocgen.cpp b/src/vhdldocgen.cpp index 3585230..66d8384 100644 --- a/src/vhdldocgen.cpp +++ b/src/vhdldocgen.cpp @@ -72,7 +72,7 @@ static void initUCF(Entry* root,const char* type,QCString & qcs,int line,QCStri static void writeUCFLink(const MemberDef* mdef,OutputList &ol); static void assignBinding(VhdlConfNode* conf); static void addInstance(ClassDef* entity, ClassDef* arch, ClassDef *inst, - const std::unique_ptr<Entry> &cur); + const std::shared_ptr<Entry> &cur); //---------- create svg ------------------------------------------------------------- static void createSVG(); @@ -169,7 +169,7 @@ static void createSVG() QCString vlargs="-Tsvg \""+ov+"\" "+dir ; - if (portable_system(Config_getString(DOT_PATH) + "dot",vlargs)!=0) + if (Portable::system(Config_getString(DOT_PATH) + "dot",vlargs)!=0) { err("could not create dot file"); } @@ -717,7 +717,7 @@ static QMap<ClassDef*,QList<ClassDef> > packages; MemberDef* VhdlDocGen::findMember(const QCString& className, const QCString& memName) { - ClassDef* cd,*ecd; + ClassDef* cd,*ecd=0; MemberDef *mdef=0; cd=getClass(className); @@ -793,9 +793,11 @@ MemberDef* VhdlDocGen::findMember(const QCString& className, const QCString& mem if (!packages.contains(ecd)) VhdlDocGen::findAllPackages(ecd); } - QMap<ClassDef*,QList<ClassDef> >::Iterator cList=packages.find(ecd); - if (cList.key()!=0) - { + if (ecd) + { + QMap<ClassDef*,QList<ClassDef> >::Iterator cList=packages.find(ecd); + if (cList!=packages.end()) + { QList<ClassDef> mlist=cList.data(); for (uint j=0;j<mlist.count();j++) { @@ -804,7 +806,8 @@ MemberDef* VhdlDocGen::findMember(const QCString& className, const QCString& mem mdef=VhdlDocGen::findMemberDef(mlist.at(j),memName,MemberListType_pubMethods); if (mdef) return mdef; } - } + } + } return 0; }//findMember @@ -2376,7 +2379,7 @@ void VhdlDocGen::writeStringLink(const MemberDef *mdef,QCString mem, OutputList& void VhdlDocGen::writeSource(const MemberDef *mdef,OutputList& ol,const QCString & cname) { - ParserInterface *pIntf = Doxygen::parserManager->getParser(".vhd"); + CodeParserInterface &intf = Doxygen::parserManager->getCodeParser(".vhd"); // pIntf->resetCodeParserState(); QCString codeFragment=mdef->documentation(); @@ -2402,7 +2405,7 @@ void VhdlDocGen::writeSource(const MemberDef *mdef,OutputList& ol,const QCString codeFragment.prepend("\n"); ol.pushGeneratorState(); ol.startCodeFragment(); - pIntf->parseCode(ol, // codeOutIntf + intf.parseCode( ol, // codeOutIntf 0, // scope codeFragment, // input SrcLangExt_VHDL, // lang @@ -2532,7 +2535,7 @@ static void initUCF(Entry* root,const char* type,QCString & qcs,int line,QCStr qcs.stripPrefix("="); - std::unique_ptr<Entry> current = std::make_unique<Entry>(); + std::shared_ptr<Entry> current = std::make_shared<Entry>(); current->spec=VhdlDocGen::UCF_CONST; current->section=Entry::VARIABLE_SEC; current->bodyLine=line; @@ -2897,7 +2900,7 @@ void VhdlDocGen::computeVhdlComponentRelations() } static void addInstance(ClassDef* classEntity, ClassDef* ar, - ClassDef *cd , const std::unique_ptr<Entry> &cur) + ClassDef *cd , const std::shared_ptr<Entry> &cur) { QCString bName,n1; @@ -3131,13 +3134,13 @@ void VhdlDocGen::createFlowChart(const MemberDef *mdef) bool b=readCodeFragment( fd->absFilePath().data(), actualStart,actualEnd,codeFragment); if (!b) return; - VHDLLanguageScanner *pIntf =(VHDLLanguageScanner*) Doxygen::parserManager->getParser(".vhd"); + VHDLOutlineParser &intf =dynamic_cast<VHDLOutlineParser&>(Doxygen::parserManager->getOutlineParser(".vhd")); VhdlDocGen::setFlowMember(mdef); - std::unique_ptr<Entry> root = std::make_unique<Entry>(); + std::shared_ptr<Entry> root = std::make_shared<Entry>(); QStrList filesInSameTu; - pIntf->startTranslationUnit(""); - pIntf->parseInput("",codeFragment.data(),root,FALSE,filesInSameTu); - pIntf->finishTranslationUnit(); + intf.startTranslationUnit(""); + intf.parseInput("",codeFragment.data(),root,FALSE,filesInSameTu); + intf.finishTranslationUnit(); } void VhdlDocGen::resetCodeVhdlParserState() @@ -3793,7 +3796,7 @@ void FlowChart::createSVG() QCString vlargs="-Tsvg \""+ov+"\" "+dir ; - if (portable_system(Config_getString(DOT_PATH) + "dot",vlargs)!=0) + if (Portable::system(Config_getString(DOT_PATH) + "dot",vlargs)!=0) { err("could not create dot file"); } @@ -4309,42 +4312,3 @@ void FlowChart::writeFlowLinks(FTextStream &t) } //writeFlowLinks -void VHDLLanguageScanner::parseCode(CodeOutputInterface &codeOutIntf, - const char *scopeName, - const QCString &input, - SrcLangExt, // lang - bool isExampleBlock, - const char *exampleName, - FileDef *fileDef, - int startLine, - int endLine, - bool inlineFragment, - const MemberDef *memberDef, - bool showLineNumbers, - const Definition *searchCtx, - bool collectXRefs - ) -{ - -parseVhdlCode(codeOutIntf, - scopeName, - input, - isExampleBlock, - exampleName, - fileDef, - startLine, - endLine, - inlineFragment, - memberDef, - showLineNumbers, - searchCtx, - collectXRefs - -); - - - - - - -}// class diff --git a/src/vhdldocgen.h b/src/vhdldocgen.h index 18985ff..6203196 100644 --- a/src/vhdldocgen.h +++ b/src/vhdldocgen.h @@ -194,7 +194,6 @@ class VhdlDocGen static void correctMemberProperties(MemberDef *md); static void writeSource(const MemberDef *mdef,OutputList& ol,const QCString & cname); - static void writeAlphbeticalClass(OutputList& ol,const ClassDef* cd,const QCString &); static QCString parseForConfig(QCString & entity,QCString & arch); static QCString parseForBinding(QCString & entity,QCString & arch); @@ -308,11 +307,11 @@ class FlowChart ~FlowChart(); private: - int id; - int stamp; - int type; + int id = 0; + int stamp = 0; + int type = 0; - int line; + int line = 0; QCString label; QCString text; diff --git a/src/vhdljjparser.cpp b/src/vhdljjparser.cpp index 39981a0..5dfa9f6 100644 --- a/src/vhdljjparser.cpp +++ b/src/vhdljjparser.cpp @@ -29,11 +29,12 @@ #include "arguments.h" #include "types.h" #include "VhdlParserIF.h" +#include "growbuf.h" using namespace vhdl::parser; using namespace std; -static ParserInterface *g_thisParser; +static OutlineParserInterface *g_thisParser; static QCString yyFileName; static int yyLineNr = 1; @@ -48,16 +49,15 @@ static Entry* oldEntry; static bool varr=FALSE; static QCString varName; -static std::vector< std::unique_ptr<Entry> > instFiles; -static std::vector< std::unique_ptr<Entry> > libUse; +static std::vector< std::shared_ptr<Entry> > instFiles; +static std::vector< std::shared_ptr<Entry> > libUse; static std::vector<Entry*> lineEntry; -Entry* VhdlParser::currentCompound=0; Entry* VhdlParser::tempEntry=0; Entry* VhdlParser::lastEntity=0 ; Entry* VhdlParser::lastCompound=0 ; Entry* VhdlParser::current_root = 0; -std::unique_ptr<Entry> VhdlParser::current=0; +std::shared_ptr<Entry> VhdlParser::current=0; QCString VhdlParser::compSpec; QCString VhdlParser::currName; QCString VhdlParser::confName; @@ -90,7 +90,7 @@ static void insertEntryAtLine(const Entry* ce,int line); //------------------------------------- const QList<VhdlConfNode>& getVhdlConfiguration() { return configL; } -const std::vector<std::unique_ptr<Entry> > &getVhdlInstList() { return instFiles; } +const std::vector<std::shared_ptr<Entry> > &getVhdlInstList() { return instFiles; } Entry* getVhdlCompound() { @@ -105,8 +105,8 @@ bool isConstraintFile(const QCString &fileName,const QCString &ext) } -void VHDLLanguageScanner::parseInput(const char *fileName,const char *fileBuf, - const std::unique_ptr<Entry> &root, bool ,QStrList&) +void VHDLOutlineParser::parseInput(const char *fileName,const char *fileBuf, + const std::shared_ptr<Entry> &root, bool ,QStrList&) { g_thisParser=this; bool inLine=false; @@ -140,10 +140,9 @@ void VHDLLanguageScanner::parseInput(const char *fileName,const char *fileBuf, VhdlParser::current_root=root.get(); VhdlParser::lastCompound=0; VhdlParser::lastEntity=0; - VhdlParser::currentCompound=0; VhdlParser::lastEntity=0; oldEntry = 0; - VhdlParser::current=std::make_unique<Entry>(); + VhdlParser::current=std::make_shared<Entry>(); VhdlParser::initEntry(VhdlParser::current.get()); Doxygen::docGroup.enterFile(fileName,yyLineNr); vhdlFileName = fileName; @@ -171,7 +170,7 @@ void VhdlParser::lineCount(const char* text) { for (const char* c=text ; *c ; ++c ) { - yyLineNr += (*c == '\n') ; + if (*c == '\n') yyLineNr++; } } @@ -321,7 +320,7 @@ void VhdlParser::handleCommentBlock(const char* doc1,bool brief) strComment.resize(0); } -void VHDLLanguageScanner::parsePrototype(const char *text) +void VHDLOutlineParser::parsePrototype(const char *text) { varName=text; varr=TRUE; @@ -347,7 +346,7 @@ void VhdlParser::addCompInst(const char *n, const char* instName, const char* co current->write=genLabels.right(genLabels.length()-u); current->read=genLabels.left(u); } - //printf (" \n genlable: [%s] inst: [%s] name: [%s] %d\n",n,instName,comp,iLine); + //printf (" \n genlabel: [%s] inst: [%s] name: [%s] %d\n",n,instName,comp,iLine); if (lastCompound) { @@ -355,10 +354,10 @@ void VhdlParser::addCompInst(const char *n, const char* instName, const char* co if (true) // !findInstant(current->type)) { initEntry(current.get()); - instFiles.emplace_back(std::make_unique<Entry>(*current)); + instFiles.emplace_back(std::make_shared<Entry>(*current)); } - current=std::make_unique<Entry>(); + current=std::make_shared<Entry>(); } else { @@ -396,7 +395,7 @@ void VhdlParser::addVhdlType(const char *n,int startLine,int section, if (!lastCompound && (section==Entry::VARIABLE_SEC) && (spec == VhdlDocGen::USE || spec == VhdlDocGen::LIBRARY) ) { - libUse.emplace_back(std::make_unique<Entry>(*current)); + libUse.emplace_back(std::make_shared<Entry>(*current)); current->reset(); } newEntry(); @@ -746,3 +745,35 @@ const char *getVhdlFileName(void) { return vhdlFileName; } + +QCString filter2008VhdlComment(const char *s) +{ + GrowBuf growBuf; + const char *p=s+3; // skip /*! + char c='\0'; + while (*p == ' ' || *p == '\t') p++; + while ((c=*p++)) + { + growBuf.addChar(c); + if (c == '\n') + { + // special handling of space followed by * at beginning of line + while (*p == ' ' || *p == '\t') p++; + while (*p == '*') p++; + // special attention in case character at end is / + if (*p == '/') p++; + } + } + // special attention in case */ at end of last line + int len = growBuf.getPos(); + if (growBuf.at(len-1) == '/' && growBuf.at(len-2) == '*') + { + len -= 2; + while (growBuf.at(len-1) == '*') len--; + c = growBuf.at(len-1); + while ((c = growBuf.at(len-1)) == ' ' || c == '\t') len--; + growBuf.setPos(len); + } + growBuf.addChar(0); + return growBuf.get(); +} diff --git a/src/vhdljjparser.h b/src/vhdljjparser.h index d38a731..f6cd17d 100644 --- a/src/vhdljjparser.h +++ b/src/vhdljjparser.h @@ -39,36 +39,20 @@ struct VhdlConfNode; * * This is the VHDL language parser for doxygen. */ -class VHDLLanguageScanner : public ParserInterface +class VHDLOutlineParser : public OutlineParserInterface { public: - virtual ~VHDLLanguageScanner() {} + virtual ~VHDLOutlineParser() {} void startTranslationUnit(const char *) {} void finishTranslationUnit() {} void parseInput(const char * fileName, const char *fileBuf, - const std::unique_ptr<Entry> &root, + const std::shared_ptr<Entry> &root, bool sameTranslationUnit, QStrList &filesInSameTranslationUnit); - - void parseCode(CodeOutputInterface &codeOutIntf, - const char *scopeName, - const QCString &input, - SrcLangExt lang, - bool isExampleBlock, - const char *exampleName=0, - FileDef *fileDef=0, - int startLine=-1, - int endLine=-1, - bool inlineFragment=FALSE, - const MemberDef *memberDef=0, - bool showLineNumbers=TRUE, - const Definition *searchCtx=0, - bool collectXRefs=TRUE - ); - bool needsPreprocessing(const QCString &) { return TRUE; } - void resetCodeParserState(){}; - void parsePrototype(const char *text); + + bool needsPreprocessing(const QCString &) const { return TRUE; } + void parsePrototype(const char *text); }; struct VhdlConfNode @@ -89,15 +73,15 @@ struct VhdlConfNode QCString arch; QCString binding; QCString compSpec; - int level; - bool isLeaf; - bool isInlineConf; + int level = 0; + bool isLeaf = false; + bool isInlineConf = false; }; void vhdlscanFreeScanner(); const QList<VhdlConfNode>& getVhdlConfiguration(); -const std::vector<std::unique_ptr<Entry> >&getVhdlInstList(); - +const std::vector<std::shared_ptr<Entry> >&getVhdlInstList(); +QCString filter2008VhdlComment(const char *s); #endif diff --git a/src/xmlcode.h b/src/xmlcode.h index e463866..4cada9b 100644 --- a/src/xmlcode.h +++ b/src/xmlcode.h @@ -19,7 +19,7 @@ #ifndef XMLCODE_H #define XMLCODE_H -#include "types.h" +#include "parserintf.h" class CodeOutputInterface; class FileDef; @@ -27,11 +27,28 @@ class MemberDef; class QCString; class Definition; -extern void parseXmlCode(CodeOutputInterface &,const char *,const QCString &, - bool ,const char *,FileDef *fd, - int startLine,int endLine,bool inlineFragment, - const MemberDef *memberDef,bool showLineNumbers,const Definition *searchCtx, - bool collectXRefs); -extern void resetXmlCodeParserState(); +/** XML scanner. Only support syntax highlighting of code at the moment. + */ +class XMLCodeParser : public CodeParserInterface +{ + public: + void parseCode(CodeOutputInterface &codeOutIntf, + const char *scopeName, + const QCString &input, + SrcLangExt, + bool isExampleBlock, + const char *exampleName=0, + FileDef *fileDef=0, + int startLine=-1, + int endLine=-1, + bool inlineFragment=FALSE, + const MemberDef *memberDef=0, + bool showLineNumbers=TRUE, + const Definition *searchCtx=0, + bool collectXRefs=TRUE + ); + void resetCodeParserState(); +}; + #endif diff --git a/src/xmlcode.l b/src/xmlcode.l index bd6e8a8..94548f8 100644 --- a/src/xmlcode.l +++ b/src/xmlcode.l @@ -407,12 +407,32 @@ void resetXmlCodeParserState() g_currentMemberDef = 0; } -#if !defined(YY_FLEX_SUBMINOR_VERSION) -extern "C" { // some bogus code to keep the compiler happy - void xmlcodeYYdummy() { yy_flex_realloc(0,0); } +//---------------------------------------------------------------------------- + +void XMLCodeParser::parseCode(CodeOutputInterface &codeOutIntf, + const char *scopeName, + const QCString &input, + SrcLangExt, + bool isExampleBlock, + const char *exampleName, + FileDef *fileDef, + int startLine, + int endLine, + bool inlineFragment, + const MemberDef *memberDef, + bool showLineNumbers, + const Definition *searchCtx, + bool collectXRefs + ) +{ + parseXmlCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName, + fileDef,startLine,endLine,inlineFragment,memberDef, + showLineNumbers,searchCtx,collectXRefs); +} + +void XMLCodeParser::resetCodeParserState() +{ + resetXmlCodeParserState(); } -#elif YY_FLEX_MAJOR_VERSION<=2 && YY_FLEX_MINOR_VERSION<=5 && YY_FLEX_SUBMINOR_VERSION<33 -#error "You seem to be using a version of flex newer than 2.5.4. These are currently incompatible with 2.5.4, and do NOT work with doxygen! Please use version 2.5.4 or expect things to be parsed wrongly! A bug report has been submitted (#732132)." -#endif #include "xmlcode.l.h" diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp index a0afa9d..828c265 100644 --- a/src/xmldocvisitor.cpp +++ b/src/xmldocvisitor.cpp @@ -251,8 +251,8 @@ void XmlDocVisitor::visit(DocVerbatim *s) m_t << " filename=\"" << lang << "\">"; else m_t << ">"; - Doxygen::parserManager->getParser(lang) - ->parseCode(m_ci,s->context(),s->text(),langExt, + Doxygen::parserManager->getCodeParser(lang) + .parseCode(m_ci,s->context(),s->text(),langExt, s->isExample(),s->exampleFile()); m_t << "</programlisting>"; break; @@ -306,8 +306,8 @@ void XmlDocVisitor::visit(DocInclude *inc) m_t << "<programlisting filename=\"" << inc->file() << "\">"; QFileInfo cfi( inc->file() ); FileDef *fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() ); - Doxygen::parserManager->getParser(inc->extension()) - ->parseCode(m_ci,inc->context(), + Doxygen::parserManager->getCodeParser(inc->extension()) + .parseCode(m_ci,inc->context(), inc->text(), langExt, inc->isExample(), @@ -325,8 +325,8 @@ void XmlDocVisitor::visit(DocInclude *inc) break; case DocInclude::Include: m_t << "<programlisting filename=\"" << inc->file() << "\">"; - Doxygen::parserManager->getParser(inc->extension()) - ->parseCode(m_ci,inc->context(), + Doxygen::parserManager->getCodeParser(inc->extension()) + .parseCode(m_ci,inc->context(), inc->text(), langExt, inc->isExample(), @@ -367,8 +367,8 @@ void XmlDocVisitor::visit(DocInclude *inc) break; case DocInclude::Snippet: m_t << "<programlisting filename=\"" << inc->file() << "\">"; - Doxygen::parserManager->getParser(inc->extension()) - ->parseCode(m_ci, + Doxygen::parserManager->getCodeParser(inc->extension()) + .parseCode(m_ci, inc->context(), extractBlock(inc->text(),inc->blockId()), langExt, @@ -382,8 +382,8 @@ void XmlDocVisitor::visit(DocInclude *inc) m_t << "<programlisting filename=\"" << inc->file() << "\">"; QFileInfo cfi( inc->file() ); FileDef *fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() ); - Doxygen::parserManager->getParser(inc->extension()) - ->parseCode(m_ci, + Doxygen::parserManager->getCodeParser(inc->extension()) + .parseCode(m_ci, inc->context(), extractBlock(inc->text(),inc->blockId()), langExt, @@ -436,8 +436,8 @@ void XmlDocVisitor::visit(DocIncOperator *op) fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() ); } - Doxygen::parserManager->getParser(locLangExt) - ->parseCode(m_ci,op->context(), + Doxygen::parserManager->getCodeParser(locLangExt) + .parseCode(m_ci,op->context(), op->text(),langExt,op->isExample(), op->exampleFile(), fd, // fileDef diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp index dfbf630..bf5af84 100644 --- a/src/xmlgen.cpp +++ b/src/xmlgen.cpp @@ -417,11 +417,11 @@ static void writeXMLDocBlock(FTextStream &t, void writeXMLCodeBlock(FTextStream &t,FileDef *fd) { - ParserInterface *pIntf=Doxygen::parserManager->getParser(fd->getDefFileExtension()); + CodeParserInterface &intf=Doxygen::parserManager->getCodeParser(fd->getDefFileExtension()); SrcLangExt langExt = getLanguageFromFileName(fd->getDefFileExtension()); - pIntf->resetCodeParserState(); + intf.resetCodeParserState(); XMLCodeGenerator *xmlGen = new XMLCodeGenerator(t); - pIntf->parseCode(*xmlGen, // codeOutIntf + intf.parseCode(*xmlGen, // codeOutIntf 0, // scopeName fileToString(fd->absFilePath(),Config_getBool(FILTER_SOURCE_FILES)), langExt, // lang @@ -430,7 +430,7 @@ void writeXMLCodeBlock(FTextStream &t,FileDef *fd) fd, // fileDef -1, // startLine -1, // endLine - FALSE, // inlineFragement + FALSE, // inlineFragment 0, // memberDef TRUE // showLineNumbers ); @@ -514,7 +514,6 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream // enum values are written as part of the enum if (md->memberType()==MemberType_EnumValue) return; if (md->isHidden()) return; - //if (md->name().at(0)=='@') return; // anonymous member // group members are only visible in their group //if (def->definitionType()!=Definition::TypeGroup && md->getGroupDef()) return; @@ -900,7 +899,7 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream md->argsString()) // define { if (md->argumentList().empty()) // special case for "foo()" to - // disguish it from "foo". + // distinguish it from "foo". { t << " <param></param>" << endl; } @@ -981,7 +980,7 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream if (md->getDefLine()!=-1) { t << " <location file=\"" - << stripFromPath(md->getDefFileName()) << "\" line=\"" + << convertToXML(stripFromPath(md->getDefFileName())) << "\" line=\"" << md->getDefLine() << "\" column=\"" << md->getDefColumn() << "\"" ; if (md->getStartBodyLine()!=-1) @@ -989,14 +988,14 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream FileDef *bodyDef = md->getBodyDef(); if (bodyDef) { - t << " bodyfile=\"" << stripFromPath(bodyDef->absFilePath()) << "\""; + t << " bodyfile=\"" << convertToXML(stripFromPath(bodyDef->absFilePath())) << "\""; } t << " bodystart=\"" << md->getStartBodyLine() << "\" bodyend=\"" << md->getEndBodyLine() << "\""; } if (md->getDeclLine()!=-1) { - t << " declfile=\"" << stripFromPath(md->getDeclFileName()) << "\" declline=\"" + t << " declfile=\"" << convertToXML(stripFromPath(md->getDeclFileName())) << "\" declline=\"" << md->getDeclLine() << "\" declcolumn=\"" << md->getDeclColumn() << "\""; } @@ -1090,7 +1089,7 @@ static void writeListOfAllMembers(const ClassDef *cd,FTextStream &t) for (mii.toFirst();(mi=mii.current());++mii) { const MemberDef *md=mi->memberDef; - if (md->name().at(0)!='@') // skip anonymous members + if (!md->isAnonymous()) { Protection prot = mi->prot; Specifier virt=md->virtualness(); @@ -1132,7 +1131,7 @@ static void writeInnerClasses(const ClassSDict *cl,FTextStream &t) const ClassDef *cd; for (cli.toFirst();(cd=cli.current());++cli) { - if (!cd->isHidden() && cd->name().find('@')==-1) // skip anonymous scopes + if (!cd->isHidden() && !cd->isAnonymous()) { t << " <innerclass refid=\"" << classOutputFileBase(cd) << "\" prot=\""; @@ -1157,7 +1156,7 @@ static void writeInnerNamespaces(const NamespaceSDict *nl,FTextStream &t) const NamespaceDef *nd; for (nli.toFirst();(nd=nli.current());++nli) { - if (!nd->isHidden() && nd->name().find('@')==-1) // skip anonymous scopes + if (!nd->isHidden() && !nd->isAnonymous()) { t << " <innernamespace refid=\"" << nd->getOutputFileBase() << "\">" << convertToXML(nd->name()) << "</innernamespace>" << endl; @@ -1247,7 +1246,7 @@ static void generateXMLForClass(const ClassDef *cd,FTextStream &ti) if (cd->isReference()) return; // skip external references. if (cd->isHidden()) return; // skip hidden classes. - if (cd->name().find('@')!=-1) return; // skip anonymous compounds. + if (cd->isAnonymous()) return; // skip anonymous compounds. if (cd->templateMaster()!=0) return; // skip generated template instances. if (cd->isArtificial()) return; // skip artificially created classes @@ -1419,7 +1418,7 @@ static void generateXMLForClass(const ClassDef *cd,FTextStream &ti) t << " </collaborationgraph>" << endl; } t << " <location file=\"" - << stripFromPath(cd->getDefFileName()) << "\" line=\"" + << convertToXML(stripFromPath(cd->getDefFileName())) << "\" line=\"" << cd->getDefLine() << "\"" << " column=\"" << cd->getDefColumn() << "\"" ; if (cd->getStartBodyLine()!=-1) @@ -1427,7 +1426,7 @@ static void generateXMLForClass(const ClassDef *cd,FTextStream &ti) FileDef *bodyDef = cd->getBodyDef(); if (bodyDef) { - t << " bodyfile=\"" << stripFromPath(bodyDef->absFilePath()) << "\""; + t << " bodyfile=\"" << convertToXML(stripFromPath(bodyDef->absFilePath())) << "\""; } t << " bodystart=\"" << cd->getStartBodyLine() << "\" bodyend=\"" << cd->getEndBodyLine() << "\""; @@ -1507,7 +1506,7 @@ static void generateXMLForNamespace(const NamespaceDef *nd,FTextStream &ti) writeXMLDocBlock(t,nd->docFile(),nd->docLine(),nd,0,nd->documentation()); t << " </detaileddescription>" << endl; t << " <location file=\"" - << stripFromPath(nd->getDefFileName()) << "\" line=\"" + << convertToXML(stripFromPath(nd->getDefFileName())) << "\" line=\"" << nd->getDefLine() << "\"" << " column=\"" << nd->getDefColumn() << "\"/>" << endl ; t << " </compounddef>" << endl; @@ -1649,7 +1648,7 @@ static void generateXMLForFile(FileDef *fd,FTextStream &ti) writeXMLCodeBlock(t,fd); t << " </programlisting>" << endl; } - t << " <location file=\"" << stripFromPath(fd->getDefFileName()) << "\"/>" << endl; + t << " <location file=\"" << convertToXML(stripFromPath(fd->getDefFileName())) << "\"/>" << endl; t << " </compounddef>" << endl; t << "</doxygen>" << endl; @@ -1763,7 +1762,7 @@ static void generateXMLForDir(DirDef *dd,FTextStream &ti) t << " <detaileddescription>" << endl; writeXMLDocBlock(t,dd->docFile(),dd->docLine(),dd,0,dd->documentation()); t << " </detaileddescription>" << endl; - t << " <location file=\"" << stripFromPath(dd->name()) << "\"/>" << endl; + t << " <location file=\"" << convertToXML(stripFromPath(dd->name())) << "\"/>" << endl; t << " </compounddef>" << endl; t << "</doxygen>" << endl; diff --git a/src/xmlscanner.h b/src/xmlscanner.h deleted file mode 100644 index b54d416..0000000 --- a/src/xmlscanner.h +++ /dev/null @@ -1,65 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 1997-2015 by Dimitri van Heesch. - * - * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software - * for any purpose. It is provided "as is" without express or implied warranty. - * See the GNU General Public License for more details. - * - * Documents produced by Doxygen are derivative works derived from the - * input used in their production; they are not affected by this license. - * - */ - -#ifndef XMLSCANNER_H -#define XMLSCANNER_H - -#include "parserintf.h" -#include "xmlcode.h" - -/** XML scanner. Only support syntax highlighting of code at the moment. - */ -class XMLScanner : public ParserInterface -{ -public: - XMLScanner() {} - virtual ~XMLScanner() {} - void startTranslationUnit(const char *) {} - void finishTranslationUnit() {} - void parseInput(const char *, const char *, const std::unique_ptr<Entry> &, bool , QStrList &) {} - bool needsPreprocessing(const QCString &) { return FALSE; } - - void parseCode(CodeOutputInterface &codeOutIntf, - const char *scopeName, - const QCString &input, - SrcLangExt, - bool isExampleBlock, - const char *exampleName=0, - FileDef *fileDef=0, - int startLine=-1, - int endLine=-1, - bool inlineFragment=FALSE, - const MemberDef *memberDef=0, - bool showLineNumbers=TRUE, - const Definition *searchCtx=0, - bool collectXRefs=TRUE - ) - { - parseXmlCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName, - fileDef,startLine,endLine,inlineFragment,memberDef, - showLineNumbers,searchCtx,collectXRefs); - } - - void resetCodeParserState() - { - resetXmlCodeParserState(); - } - - void parsePrototype(const char *) {} - -private: -}; - -#endif |