diff options
author | Dimitri van Heesch <dimitri@stack.nl> | 2006-08-09 08:29:54 (GMT) |
---|---|---|
committer | Dimitri van Heesch <dimitri@stack.nl> | 2006-08-09 08:29:54 (GMT) |
commit | cdd729544999bf6ff5ce3efb5a64957058f040f3 (patch) | |
tree | a09074ed1c9a5c1efb292f69db4f9bbb3a97cb19 /src/util.cpp | |
parent | 243272688a4a3bc7921b7d05dda927f4adf3036c (diff) | |
download | Doxygen-cdd729544999bf6ff5ce3efb5a64957058f040f3.zip Doxygen-cdd729544999bf6ff5ce3efb5a64957058f040f3.tar.gz Doxygen-cdd729544999bf6ff5ce3efb5a64957058f040f3.tar.bz2 |
Release-1.4.7-20060809
Diffstat (limited to 'src/util.cpp')
-rw-r--r-- | src/util.cpp | 1450 |
1 files changed, 805 insertions, 645 deletions
diff --git a/src/util.cpp b/src/util.cpp index 0969ae8..8db8b80 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -706,40 +706,75 @@ QCString substTypedef(Definition *scope,FileDef *fileScope,const QCString &name) if (name.isEmpty()) return result; // lookup scope fragment in the symbol map - DefinitionList *dl = Doxygen::symbolMap->find(name); - if (dl==0) return result; // no matches + DefinitionIntf *di = Doxygen::symbolMap->find(name); + if (di==0) return result; // no matches - // search for the best match - DefinitionListIterator dli(*dl); - Definition *d; - int minDistance=10000; // init at "infinite" MemberDef *bestMatch=0; - for (dli.toFirst();(d=dli.current());++dli) // foreach definition + if (di->definitionType()==DefinitionIntf::TypeSymbolList) // multi symbols { - // only look at members - if (d->definitionType()==Definition::TypeMember) + // search for the best match + DefinitionListIterator dli(*(DefinitionList*)di); + Definition *d; + int minDistance=10000; // init at "infinite" + for (dli.toFirst();(d=dli.current());++dli) // foreach definition { - // that are also typedefs - MemberDef *md = (MemberDef *)d; - if (md->isTypedef()) // d is a typedef + // only look at members + if (d->definitionType()==Definition::TypeMember) { - // test accessibility of typedef within scope. - int distance = isAccessibleFromWithExpScope(scope,fileScope,d,""); - if (distance!=-1 && distance<minDistance) - // definition is accessible and a better match + // that are also typedefs + MemberDef *md = (MemberDef *)d; + if (md->isTypedef()) // d is a typedef { - minDistance=distance; - bestMatch = md; + // test accessibility of typedef within scope. + int distance = isAccessibleFromWithExpScope(scope,fileScope,d,""); + if (distance!=-1 && distance<minDistance) + // definition is accessible and a better match + { + minDistance=distance; + bestMatch = md; + } } } } } + else if (di->definitionType()==DefinitionIntf::TypeMember) // single symbol + { + Definition *d = (Definition*)di; + // that are also typedefs + MemberDef *md = (MemberDef *)di; + if (md->isTypedef()) // d is a typedef + { + // test accessibility of typedef within scope. + int distance = isAccessibleFromWithExpScope(scope,fileScope,d,""); + if (distance!=-1) // definition is accessible + { + bestMatch = md; + } + } + } if (bestMatch) result = bestMatch->typeString(); //printf("substTypedef(%s,%s)=%s\n",scope?scope->name().data():"<global>", // name.data(),result.data()); return result; } +static Definition *endOfPathIsUsedClass(SDict<Definition> *cl,const QCString &localName) +{ + if (cl) + { + SDict<Definition>::Iterator cli(*cl); + Definition *cd; + for (cli.toFirst();(cd=cli.current());++cli) + { + if (cd->localName()==localName) + { + return cd; + } + } + } + return 0; +} + /*! Starting with scope \a start, the string \a path is interpreted as * a part of a qualified scope name (e.g. A::B::C), and the scope is * searched. If found the scope definition is returned, otherwise 0 @@ -755,8 +790,25 @@ static Definition *followPath(Definition *start,FileDef *fileScope,const QCStrin { // try to resolve the part if it is a typedef QCString qualScopePart = substTypedef(current,fileScope,path.mid(is,l)); - current = current->findInnerCompound(qualScopePart); - if (current==0) break; // failed to follow the path + Definition *next = current->findInnerCompound(qualScopePart); + if (next==0) // failed to follow the path + { + if (current->definitionType()==Definition::TypeNamespace) + { + current = endOfPathIsUsedClass( + ((NamespaceDef *)current)->getUsedClasses(),qualScopePart); + } + else if (current->definitionType()==Definition::TypeFile) + { + current = endOfPathIsUsedClass( + ((FileDef *)current)->getUsedClasses(),qualScopePart); + } + if (current==0) break; + } + else // continue to follow scope + { + current = next; + } ps=is+l; } //printf("followPath(start=%s,path=%s) result=%s\n", @@ -791,16 +843,34 @@ bool accessibleViaUsingNamespace(const NamespaceSDict *nl, Definition *item, const QCString &explicitScopePart="") { + static QDict<void> visitedDict; if (nl) // check used namespaces for the class { NamespaceSDict::Iterator nli(*nl); NamespaceDef *und; for (nli.toFirst();(und=nli.current());++nli) { - //printf("Trying via used namespace %s\n",und->name().data()); + //printf("[Trying via used namespace %s\n",und->name().data()); Definition *sc = explicitScopePart.isEmpty() ? und : followPath(und,fileScope,explicitScopePart); - if (sc && item->getOuterScope()==sc) return TRUE; - //printf("Try via used namespace done\n"); + if (sc && item->getOuterScope()==sc) + { + //printf("] found it\n"); + return TRUE; + } + QCString key=und->name(); + if (und->getUsedNamespaces() && visitedDict.find(key)==0) + { + visitedDict.insert(key,(void *)0x08); + + if (accessibleViaUsingNamespace(und->getUsedNamespaces(),fileScope,item,explicitScopePart)) + { + //printf("] found it via recursion\n"); + return TRUE; + } + + visitedDict.remove(key); + } + //printf("] Try via used namespace done\n"); } } return FALSE; @@ -812,13 +882,17 @@ bool accessibleViaUsingNamespace(const NamespaceSDict *nl, */ int isAccessibleFrom(Definition *scope,FileDef *fileScope,Definition *item) { - //fprintf(stderr,"<isAccesibleFrom(scope=%s,item=%s itemScope=%s)\n", + //printf("<isAccesibleFrom(scope=%s,item=%s itemScope=%s)\n", // scope->name().data(),item->name().data(),item->getOuterScope()->name().data()); QCString key(40); key.sprintf("%p:%p:%p",scope,fileScope,item); static QDict<void> visitedDict; - if (visitedDict.find(key)) return -1; // already looked at this + if (visitedDict.find(key)) + { + //printf("> already found\n"); + return -1; // already looked at this + } visitedDict.insert(key,(void *)0x8); int result=0; // assume we found it @@ -826,7 +900,7 @@ int isAccessibleFrom(Definition *scope,FileDef *fileScope,Definition *item) if (item->getOuterScope()==scope) { - //fprintf(stderr,"> found it\n"); + //printf("> found it\n"); } else if (scope==Doxygen::globalScope) { @@ -835,17 +909,17 @@ int isAccessibleFrom(Definition *scope,FileDef *fileScope,Definition *item) SDict<Definition> *cl = fileScope->getUsedClasses(); if (accessibleViaUsingClass(cl,fileScope,item)) { - //fprintf(stderr,"> found via used class\n"); + //printf("> found via used class\n"); goto done; } NamespaceSDict *nl = fileScope->getUsedNamespaces(); if (accessibleViaUsingNamespace(nl,fileScope,item)) { - //fprintf(stderr,"> found via used namespace\n"); + //printf("> found via used namespace\n"); goto done; } } - //fprintf(stderr,"> reached global scope\n"); + //printf("> reached global scope\n"); result=-1; // not found in path to globalScope } else // keep searching @@ -858,19 +932,19 @@ int isAccessibleFrom(Definition *scope,FileDef *fileScope,Definition *item) SDict<Definition> *cl = nscope->getUsedClasses(); if (accessibleViaUsingClass(cl,fileScope,item)) { - //fprintf(stderr,"> found via used class\n"); + //printf("> found via used class\n"); goto done; } NamespaceSDict *nl = nscope->getUsedNamespaces(); if (accessibleViaUsingNamespace(nl,fileScope,item)) { - //fprintf(stderr,"> found via used namespace\n"); + //printf("> found via used namespace\n"); goto done; } } // repeat for the parent scope i=isAccessibleFrom(scope->getOuterScope(),fileScope,item); - //fprintf(stderr,"> result=%d\n",i); + //printf("> result=%d\n",i); result= (i==-1) ? -1 : i+1; } done: @@ -898,7 +972,7 @@ int isAccessibleFromWithExpScope(Definition *scope,FileDef *fileScope, static QDict<void> visitedDict; if (visitedDict.find(key)) return -1; // already looked at this visitedDict.insert(key,(void *)0x8); - + //printf("<isAccessibleFromWithExpScope(%s,%s,%s)\n",scope?scope->name().data():"<global>", // item?item->name().data():"<none>", // explicitScopePart.data()); @@ -930,10 +1004,9 @@ int isAccessibleFromWithExpScope(Definition *scope,FileDef *fileScope, for (cli.toFirst();(cd=cli.current());++cli) { //printf("Trying for class %s\n",cd->name().data()); - i = isAccessibleFromWithExpScope(scope,fileScope,item,cd->name()); - if (i!=-1) + if (cd==item) { - //printf("> found via explicit scope of used class\n"); + //printf("> class is used in this scope\n"); goto done; } } @@ -962,7 +1035,7 @@ int isAccessibleFromWithExpScope(Definition *scope,FileDef *fileScope, if (scope!=Doxygen::globalScope) { i = isAccessibleFromWithExpScope(scope->getOuterScope(),fileScope, - item,explicitScopePart); + item,explicitScopePart); } //printf("> result=%d\n",i); result = (i==-1) ? -1 : i+1; @@ -974,12 +1047,6 @@ int isAccessibleFromWithExpScope(Definition *scope,FileDef *fileScope, if (scope->definitionType()==Definition::TypeNamespace) { NamespaceDef *nscope = (NamespaceDef*)scope; - SDict<Definition> *cl = nscope->getUsedClasses(); - if (accessibleViaUsingClass(cl,fileScope,item,explicitScopePart)) - { - //printf("> found in used class\n"); - goto done; - } NamespaceSDict *nl = nscope->getUsedNamespaces(); if (accessibleViaUsingNamespace(nl,fileScope,item,explicitScopePart)) { @@ -991,12 +1058,6 @@ int isAccessibleFromWithExpScope(Definition *scope,FileDef *fileScope, { if (fileScope) { - SDict<Definition> *cl = fileScope->getUsedClasses(); - if (accessibleViaUsingClass(cl,fileScope,item,explicitScopePart)) - { - //printf("> found in used class\n"); - goto done; - } NamespaceSDict *nl = fileScope->getUsedNamespaces(); if (accessibleViaUsingNamespace(nl,fileScope,item,explicitScopePart)) { @@ -1010,10 +1071,23 @@ int isAccessibleFromWithExpScope(Definition *scope,FileDef *fileScope, else // continue by looking into the parent scope { int i=isAccessibleFromWithExpScope(scope->getOuterScope(),fileScope, - item,explicitScopePart); + item,explicitScopePart); //printf("> result=%d\n",i); result= (i==-1) ? -1 : i+1; } +#if 0 + if (scope!=Doxygen::globalScope) + { + int i=isAccessibleFromWithExpScope(scope->getOuterScope(),fileScope, + item,explicitScopePart); + //printf("> result=%d\n",i); + result= (i==-1) ? -1 : i+1; + } + else + { + result = -1; + } +#endif } done: visitedDict.remove(key); @@ -1027,6 +1101,145 @@ int computeQualifiedIndex(const QCString &name) return name.findRev("::",i==-1 ? name.length() : i); } +void getResolvedSymbol(Definition *scope, + FileDef *fileScope, + Definition *d, + const QCString &explicitScopePart, + int &minDistance, + ClassDef *&bestMatch, + MemberDef *&bestTypedef, + QCString &bestTemplSpec + ) +{ + //printf(" found type %x name=%s (%d/%d) d=%p\n", + // d->definitionType(),d->name().data(),count,dl->count(),d); + + // only look at classes and members + if (d->definitionType()==Definition::TypeClass || + (d->definitionType()==Definition::TypeMember && + (((MemberDef*)d)->isTypedef() || ((MemberDef*)d)->isEnumerate()) + ) + ) + { + g_visitedNamespaces.clear(); + // test accessibility of definition within scope. + int distance = isAccessibleFromWithExpScope(scope,fileScope,d,explicitScopePart); + //printf(" distance %s (%p) is %d\n",d->name().data(),d,distance); + if (distance!=-1) // definition is accessible + { + // see if we are dealing with a class or a typedef + if (d->definitionType()==Definition::TypeClass) // d is a class + { + ClassDef *cd = (ClassDef *)d; + //printf("cd=%s\n",cd->name().data()); + if (!cd->isTemplateArgument()) // skip classes that + // are only there to + // represent a template + // argument + { + //printf("is not a templ arg\n"); + if (distance<minDistance) // found a definition that is "closer" + { + minDistance=distance; + bestMatch = cd; + bestTypedef = 0; + bestTemplSpec.resize(0); + } + else if (distance==minDistance && + fileScope && bestMatch && + fileScope->getUsedNamespaces() && + d->getOuterScope()->definitionType()==Definition::TypeNamespace && + bestMatch->getOuterScope()==Doxygen::globalScope + ) + { + // in case the distance is equal it could be that a class X + // is defined in a namespace and in the global scope. When searched + // in the global scope the distance is 0 in both cases. We have + // to choose one of the definitions: we choose the one in the + // namespace if the fileScope imports namespaces and the definition + // found was in a namespace while the best match so far isn't. + // Just a non-perfect heuristic but it could help in some situations + // (kdecore code is an example). + minDistance=distance; + bestMatch = cd; + bestTypedef = 0; + bestTemplSpec.resize(0); + } + } + else + { + //printf(" is a template argument!\n"); + } + } + else if (d->definitionType()==Definition::TypeMember) + { + MemberDef *md = (MemberDef *)d; + //printf(" member isTypedef()=%d\n",md->isTypedef()); + if (md->isTypedef()) // d is a typedef + { + QCString args=md->argsString(); + if (args.isEmpty()) // do not expand "typedef t a[4];" + { + //printf(" found typedef!\n"); + + // we found a symbol at this distance, but if it didn't + // resolve to a class, we still have to make sure that + // something at a greater distance does not match, since + // that symbol is hidden by this one. + if (distance<minDistance) + { + QCString spec; + minDistance=distance; + MemberDef *enumType = 0; + ClassDef *cd = newResolveTypedef(fileScope,md,&enumType,&spec); + if (cd) // shouldn't be 0, but could in some weird cases + { + //printf(" bestTypeDef=%p spec=%s\n",md,spec.data()); + bestMatch = cd; + bestTypedef = md; + bestTemplSpec = spec; + } + else if (enumType) + { + //printf(" is enum\n"); + bestMatch = 0; + bestTypedef = enumType; + bestTemplSpec = ""; + } + else + { + //printf(" no match\n"); + } + } + else + { + //printf(" not the best match %d min=%d\n",distance,minDistance); + } + } + else + { + //printf(" not a simple typedef\n") + } + } + else if (md->isEnumerate()) + { + if (distance<minDistance) + { + minDistance=distance; + bestMatch = 0; + bestTypedef = md; + bestTemplSpec = ""; + } + } + } + } // if definition accessible + else + { + //printf(" Not accessible!\n"); + } + } // if definition is a class or member +} + /* Find the fully qualified class name refered to by the input class * or typedef name against the input scope. * Loops through scope and each of its parent scopes looking for a @@ -1034,11 +1247,11 @@ int computeQualifiedIndex(const QCString &name) * resolving typedefs. */ ClassDef *getResolvedClassRec(Definition *scope, - FileDef *fileScope, - const char *n, - MemberDef **pTypeDef, - QCString *pTemplSpec - ) + FileDef *fileScope, + const char *n, + MemberDef **pTypeDef, + QCString *pTemplSpec + ) { //printf("[getResolvedClassRec(%s,%s)\n",scope?scope->name().data():"<global>",n); QCString name=n; @@ -1061,19 +1274,19 @@ ClassDef *getResolvedClassRec(Definition *scope, return 0; // empty name } - DefinitionList *dl = Doxygen::symbolMap->find(name); + DefinitionIntf *di = Doxygen::symbolMap->find(name); //printf("Looking for symbol %s result=%p\n",name.data(),dl); - if (dl==0) + if (di==0) { return 0; } bool hasUsingStatements = - (fileScope && ((fileScope->getUsedNamespaces() && - fileScope->getUsedNamespaces()->count()>0) || - (fileScope->getUsedClasses() && - fileScope->getUsedClasses()->count()>0)) - ); + (fileScope && ((fileScope->getUsedNamespaces() && + fileScope->getUsedNamespaces()->count()>0) || + (fileScope->getUsedClasses() && + fileScope->getUsedClasses()->count()>0)) + ); //printf("hasUsingStatements=%d\n",hasUsingStatements); // Since it is often the case that the same name is searched in the same // scope over an over again (especially for the linked source code generation) @@ -1096,7 +1309,7 @@ ClassDef *getResolvedClassRec(Definition *scope, p+=nameLen; qstrcpy(p,explicitScopePart); p+=explicitPartLen; - + // if a file scope is given and it contains using statements we should // also use the file part in the key (as a class name can be in // two different namespaces and a using statement in a file can select @@ -1110,7 +1323,7 @@ ClassDef *getResolvedClassRec(Definition *scope, p+=fileScopeLen-1; } *p='\0'; - + LookupInfo *pval=Doxygen::lookupCache.find(key); //printf("Searching for %s result=%p\n",key.data(),pval); if (pval) @@ -1124,144 +1337,34 @@ ClassDef *getResolvedClassRec(Definition *scope, return pval->classDef; } else // not found yet; we already add a 0 to avoid the possibility of - // endless recursion. + // endless recursion. { Doxygen::lookupCache.insert(key,new LookupInfo); } ClassDef *bestMatch=0; - - //printf(" found %d symbol(s) with name %s\n",dl->count(),name.data()); - // now we look int the list of Definitions and determine which one is the "best" - DefinitionListIterator dli(*dl); - Definition *d; MemberDef *bestTypedef=0; QCString bestTemplSpec; int minDistance=10000; // init at "infinite" - int count=0; - for (dli.toFirst();(d=dli.current());++dli,++count) // foreach definition - { - //printf(" found type %x name=%s (%d/%d) d=%p\n", - // d->definitionType(),d->name().data(),count,dl->count(),d); - // only look at classes and members - if (d->definitionType()==Definition::TypeClass || - d->definitionType()==Definition::TypeMember) + if (di->definitionType()==DefinitionIntf::TypeSymbolList) + { + DefinitionListIterator dli(*(DefinitionList*)di); + Definition *d; + int count=0; + for (dli.toFirst();(d=dli.current());++dli,++count) // foreach definition { - g_visitedNamespaces.clear(); - // test accessibility of definition within scope. - int distance = isAccessibleFromWithExpScope(scope,fileScope,d,explicitScopePart); - //printf(" distance %s is %d\n",d->name().data(),distance); - if (distance!=-1) // definition is accessible - { - // see if we are dealing with a class or a typedef - if (d->definitionType()==Definition::TypeClass) // d is a class - { - ClassDef *cd = (ClassDef *)d; - //printf("cd=%s\n",cd->name().data()); - if (!cd->isTemplateArgument()) // skip classes that - // are only there to - // represent a template - // argument - { - //printf("is not a templ arg\n"); - if (distance<minDistance) // found a definition that is "closer" - { - minDistance=distance; - bestMatch = cd; - bestTypedef = 0; - bestTemplSpec.resize(0); - } - else if (distance==minDistance && - fileScope && bestMatch && - fileScope->getUsedNamespaces() && - d->getOuterScope()->definitionType()==Definition::TypeNamespace && - bestMatch->getOuterScope()==Doxygen::globalScope - ) - { - // in case the distance is equal it could be that a class X - // is defined in a namespace and in the global scope. When searched - // in the global scope the distance is 0 in both cases. We have - // to choose one of the definitions: we choose the one in the - // namespace if the fileScope imports namespaces and the definition - // found was in a namespace while the best match so far isn't. - // Just a non-perfect heuristic but it could help in some situations - // (kdecore code is an example). - minDistance=distance; - bestMatch = cd; - bestTypedef = 0; - bestTemplSpec.resize(0); - } - } - } - else if (d->definitionType()==Definition::TypeMember) - { - MemberDef *md = (MemberDef *)d; - //printf(" member isTypedef()=%d\n",md->isTypedef()); - if (md->isTypedef()) // d is a typedef - { - QCString args=md->argsString(); - if (args.isEmpty()) // do not expand "typedef t a[4];" - { - //printf(" found typedef!\n"); + getResolvedSymbol(scope,fileScope,d,explicitScopePart, + minDistance,bestMatch,bestTypedef,bestTemplSpec); + } + } + else + { + Definition *d = (Definition *)di; + getResolvedSymbol(scope,fileScope,d,explicitScopePart, + minDistance,bestMatch,bestTypedef,bestTemplSpec); + } - // we found a symbol at this distance, but if it didn't - // resolve to a class, we still have to make sure that - // something at a greater distance does not match, since - // that symbol is hidden by this one. - if (distance<minDistance) - { - QCString spec; - minDistance=distance; - MemberDef *enumType = 0; - ClassDef *cd = newResolveTypedef(fileScope,md,&enumType,&spec); - if (cd) // shouldn't be 0, but could in some weird cases - { - //printf(" bestTypeDef=%p spec=%s\n",md,spec.data()); - bestMatch = cd; - bestTypedef = md; - bestTemplSpec = spec; - } - else if (enumType) - { - //printf(" is enum\n"); - bestMatch = 0; - bestTypedef = enumType; - bestTemplSpec = ""; - } - else - { - //printf(" no match\n"); - } - } - else - { - //printf(" not the best match %d min=%d\n",distance,minDistance); - } - } - else - { - //printf(" not a simple typedef\n") - } - } - else if (md->isEnumerate()) - { - if (distance<minDistance) - { - minDistance=distance; - bestMatch = 0; - bestTypedef = md; - bestTemplSpec = ""; - } - } - } - } // if definition accessible - else - { - //printf(" Not accessible!\n"); - } - } // if definition is a class or member - } // foreach definition if (pTypeDef) { *pTypeDef = bestTypedef; @@ -1295,24 +1398,25 @@ ClassDef *getResolvedClassRec(Definition *scope, * match against the input name. */ ClassDef *getResolvedClass(Definition *scope, - FileDef *fileScope, - const char *n, - MemberDef **pTypeDef, - QCString *pTemplSpec, - bool mayBeUnlinkable, - bool mayBeHidden - ) + FileDef *fileScope, + const char *n, + MemberDef **pTypeDef, + QCString *pTemplSpec, + bool mayBeUnlinkable, + bool mayBeHidden + ) { g_resolvedTypedefs.clear(); if (scope==0 || (scope->definitionType()!=Definition::TypeClass && scope->definitionType()!=Definition::TypeNamespace - ) + ) || + (fileScope && fileScope->isJava() && QCString(n).find("::")!=-1) ) { scope=Doxygen::globalScope; } - //printf("getResolvedClass(scope=%s,file=%s,name=%s,mayUnlinkable=%d)\n", + //printf("------------ getResolvedClass(scope=%s,file=%s,name=%s,mayUnlinkable=%d)\n", // scope?scope->name().data():"<global>", // fileScope?fileScope->name().data():"<none>", // n, @@ -1342,7 +1446,7 @@ static bool findOperator(const QCString &s,int i) if (b==-1) return FALSE; // not found b+=8; while (b<i) // check if there are only spaces inbetween - // the operator and the > + // the operator and the > { if (!isspace((uchar)s.at(b))) return FALSE; b++; @@ -1386,37 +1490,37 @@ nextChar: else if (i<l-2 && c=='<' && // current char is a < (isId(s.at(i+1)) || isspace((uchar)s.at(i+1))) && // next char is an id char or space (i<8 || !findOperator(s,i)) // string in front is not "operator" - ) + ) { result+="< "; // insert extra space for layouting (nested) templates } else if (i>0 && c=='>' && // current char is a > - (isId(s.at(i-1)) || isspace((uchar)s.at(i-1)) || s.at(i-1)=='*' || s.at(i-1)=='&') && // prev char is an id char or space - (i<8 || !findOperator(s,i)) // string in front is not "operator" - ) + (isId(s.at(i-1)) || isspace((uchar)s.at(i-1)) || s.at(i-1)=='*' || s.at(i-1)=='&') && // prev char is an id char or space + (i<8 || !findOperator(s,i)) // string in front is not "operator" + ) { result+=" >"; // insert extra space for layouting (nested) templates } else if (i>0 && c==',' && !isspace((uchar)s.at(i-1)) - && ((i<l-1 && isId(s.at(i+1))) - || (i<l-2 && s.at(i+1)=='$' && isId(s.at(i+2))) // for PHP - || (i<l-3 && s.at(i+1)=='&' && s.at(i+2)=='$' && isId(s.at(i+3))))) // for PHP + && ((i<l-1 && isId(s.at(i+1))) + || (i<l-2 && s.at(i+1)=='$' && isId(s.at(i+2))) // for PHP + || (i<l-3 && s.at(i+1)=='&' && s.at(i+2)=='$' && isId(s.at(i+3))))) // for PHP { result+=", "; } else if (i>0 && - ((isId(s.at(i)) && s.at(i-1)==')') || - (s.at(i)=='\'' && s.at(i-1)==' ') - ) - ) + ((isId(s.at(i)) && s.at(i-1)==')') || + (s.at(i)=='\'' && s.at(i-1)==' ') + ) + ) { result+=' '; result+=s.at(i); } else if (c=='t' && csp==5 && - !(isId(s.at(i+1)) /*|| s.at(i+1)==' '*/ || s.at(i+1)==')' || - s.at(i+1)==',' || s.at(i+1)=='\0')) - // prevent const ::A from being converted to const::A + !(isId(s.at(i+1)) /*|| s.at(i+1)==' '*/ || s.at(i+1)==')' || + s.at(i+1)==',' || s.at(i+1)=='\0')) + // prevent const ::A from being converted to const::A { result+="t "; if (s.at(i+1)==' ') i++; @@ -1428,9 +1532,9 @@ nextChar: csp=0; } else if (c=='l' && vsp==7 && - !(isId(s.at(i+1)) /*|| s.at(i+1)==' '*/ || s.at(i+1)==')' || - s.at(i+1)==',' || s.at(i+1)=='\0')) - // prevent virtual ::A from being converted to virtual::A + !(isId(s.at(i+1)) /*|| s.at(i+1)==' '*/ || s.at(i+1)==')' || + s.at(i+1)==',' || s.at(i+1)=='\0')) + // prevent virtual ::A from being converted to virtual::A { result+="l "; if (s.at(i+1)==' ') i++; @@ -1442,17 +1546,17 @@ nextChar: vsp=0; } else if (!isspace((uchar)c) || - ( i>0 && i<l-1 && - (isId(s.at(i-1)) || s.at(i-1)==')' || s.at(i-1)==',' || s.at(i-1)=='>' || s.at(i-1)==']') - && (isId(s.at(i+1)) || (i<l-2 && s.at(i+1)=='$' && isId(s.at(i+2))) - || (i<l-3 && s.at(i+1)=='&' && s.at(i+2)=='$' && isId(s.at(i+3)))) - ) - ) + ( i>0 && i<l-1 && + (isId(s.at(i-1)) || s.at(i-1)==')' || s.at(i-1)==',' || s.at(i-1)=='>' || s.at(i-1)==']') + && (isId(s.at(i+1)) || (i<l-2 && s.at(i+1)=='$' && isId(s.at(i+2))) + || (i<l-3 && s.at(i+1)=='&' && s.at(i+2)=='$' && isId(s.at(i+3)))) + ) + ) { if (c=='*' || c=='&' || c=='@' || c=='$') { uint rl=result.length(); - if (rl>0 && (isId(result.at(rl-1)) || result.at(rl-1)=='>')) result+=' '; + if (rl>0 && (isId(result.at(rl-1)) || result.at(rl-1)=='>')) result+=' '; } result+=c; } @@ -1464,26 +1568,26 @@ nextChar: bool rightScopeMatch(const QCString &scope, const QCString &name) { return (name==scope || // equal - (scope.right(name.length())==name && // substring - scope.at(scope.length()-name.length()-1)==':' // scope - ) - ); + (scope.right(name.length())==name && // substring + scope.at(scope.length()-name.length()-1)==':' // scope + ) + ); } bool leftScopeMatch(const QCString &scope, const QCString &name) { return (name==scope || // equal - (scope.left(name.length())==name && // substring - scope.at(name.length())==':' // scope - ) - ); + (scope.left(name.length())==name && // substring + scope.at(name.length())==':' // scope + ) + ); } void linkifyText(const TextGeneratorIntf &out,Definition *scope, - FileDef *fileScope,const char *, - const char *text, bool autoBreak,bool external, - bool keepSpaces) + FileDef *fileScope,const char *, + const char *text, bool autoBreak,bool external, + bool keepSpaces) { //printf("`%s'\n",text); static QRegExp regExp("[a-z_A-Z][~a-z_A-Z0-9.:]*"); @@ -1501,8 +1605,8 @@ void linkifyText(const TextGeneratorIntf &out,Definition *scope, if (strLen==0) return; // read a word from the text string while ((newIndex=regExp.match(txtStr,index,&matchLen))!=-1 && - (newIndex==0 || !(txtStr.at(newIndex-1)>='0' && txtStr.at(newIndex-1)<='9')) // avoid matching part of hex numbers - ) + (newIndex==0 || !(txtStr.at(newIndex-1)>='0' && txtStr.at(newIndex-1)<='9')) // avoid matching part of hex numbers + ) { // add non-word part to the result floatingIndex+=newIndex-skipIndex; @@ -1512,7 +1616,7 @@ void linkifyText(const TextGeneratorIntf &out,Definition *scope, { if (txtStr.at(i)=='"') insideString=!insideString; } - + if (strLen>30 && floatingIndex>25 && autoBreak) // try to insert a split point { QCString splitText = txtStr.mid(skipIndex,newIndex-skipIndex); @@ -1581,7 +1685,7 @@ void linkifyText(const TextGeneratorIntf &out,Definition *scope, found=TRUE; } } - + QCString scopeName; if (scope && (scope->definitionType()==Definition::TypeClass || @@ -1631,7 +1735,7 @@ void linkifyText(const TextGeneratorIntf &out,Definition *scope, void writeExample(OutputList &ol,ExampleSDict *ed) { QCString exampleLine=theTranslator->trWriteList(ed->count()); - + //bool latexEnabled = ol.isEnabled(OutputGenerator::Latex); //bool manEnabled = ol.isEnabled(OutputGenerator::Man); //bool htmlEnabled = ol.isEnabled(OutputGenerator::Html); @@ -1653,7 +1757,7 @@ void writeExample(OutputList &ol,ExampleSDict *ed) // link for Html / man ol.writeObjectLink(0,e->file,e->anchor,e->name); ol.popGeneratorState(); - + ol.pushGeneratorState(); //if (latexEnabled) ol.enable(OutputGenerator::Latex); ol.disable(OutputGenerator::Man); @@ -1681,7 +1785,7 @@ QCString argListToString(ArgumentList *al,bool useCanonicalType) while (a) { QCString type1 = useCanonicalType && !a->canType.isEmpty() ? - a->canType : a->type; + a->canType : a->type; QCString type2; int i=type1.find(")("); // hack to deal with function pointers if (i!=-1) @@ -1987,7 +2091,7 @@ QCString yearToString() int minClassDistance(ClassDef *cd,ClassDef *bcd,int level) { if (bcd->categoryOf()) // use class that is being extended in case of - // an Objective-C category + // an Objective-C category { bcd=bcd->categoryOf(); } @@ -2029,10 +2133,10 @@ int minClassDistance(ClassDef *cd,ClassDef *bcd,int level) #ifndef NEWMATCH // strip any template specifiers that follow className in string s static QCString trimTemplateSpecifiers( - const QCString &namespaceName, - const QCString &className, - const QCString &s -) + const QCString &namespaceName, + const QCString &className, + const QCString &s + ) { //printf("trimTemplateSpecifiers(%s,%s,%s)\n",namespaceName.data(),className.data(),s.data()); QCString scopeName=mergeScopes(namespaceName,className); @@ -2069,7 +2173,7 @@ static QCString trimTemplateSpecifiers( } //printf("result after specialization: %s\n",result.data()); - + QCString qualName=cd->qualifiedNameWithTemplateParameters(); //printf("QualifiedName = %s\n",qualName.data()); // We strip the template arguments following className (if any) @@ -2092,7 +2196,7 @@ static QCString trimTemplateSpecifiers( } } //printf("result=%s\n",result.data()); - + return result.stripWhiteSpace(); } @@ -2104,7 +2208,7 @@ static QCString trimTemplateSpecifiers( * @returns position on which string is found, or -1 if not found */ static int findScopePattern(const QCString &pattern,const QCString &s, - int p,int *len) + int p,int *len) { int sl=s.length(); int pl=pattern.length(); @@ -2158,7 +2262,7 @@ static int findScopePattern(const QCString &pattern,const QCString &s, } return -1; } - + static QCString trimScope(const QCString &name,const QCString &s) { int scopeOffset=name.length(); @@ -2168,7 +2272,7 @@ static QCString trimScope(const QCString &name,const QCString &s) QCString tmp; QCString scope=name.left(scopeOffset)+"::"; //printf("Trying with scope=`%s'\n",scope.data()); - + int i,p=0,l; while ((i=findScopePattern(scope,result,p,&l))!=-1) // for each occurrence { @@ -2198,8 +2302,8 @@ void trimBaseClassScope(BaseClassList *bcl,QCString &s,int level=0) if (spos!=-1) { s = s.left(spos)+s.right( - s.length()-spos-cd->name().length()-2 - ); + s.length()-spos-cd->name().length()-2 + ); } //printf("base class `%s'\n",cd->name().data()); if (cd->baseClasses()) @@ -2228,7 +2332,7 @@ static void trimNamespaceScope(QCString &t1,QCString &t2,const QCString &nsName) { QCString scope=t1.left(i1); replaceNamespaceAliases(scope,i1); - + int so=nsName.length(); do { @@ -2293,7 +2397,7 @@ static void stripIrrelevantString(QCString &target,const QCString &str) while ((i=target.find(str,p))!=-1) { bool isMatch = (i==0 || !isId(target.at(i-1))) && // not a character before str - (i+l==(int)target.length() || !isId(target.at(i+l))); // not a character after str + (i+l==(int)target.length() || !isId(target.at(i+l))); // not a character after str if (isMatch) { int i1=target.find('*',i+l); @@ -2320,18 +2424,18 @@ static void stripIrrelevantString(QCString &target,const QCString &str) /*! According to the C++ spec and Ivan Vecerina: - Parameter declarations that differ only in the presence or absence - of const and/or volatile are equivalent. + Parameter declarations that differ only in the presence or absence + of const and/or volatile are equivalent. - So the following example, show what is stripped by this routine - for const. The same is done for volatile. + So the following example, show what is stripped by this routine + for const. The same is done for volatile. - \code - const T param -> T param // not relevant - const T& param -> const T& param // const needed - T* const param -> T* param // not relevant - const T* param -> const T* param // const needed - \endcode + \code + const T param -> T param // not relevant + const T& param -> const T& param // const needed + T* const param -> T* param // not relevant + const T* param -> const T* param // const needed + \endcode */ void stripIrrelevantConstVolatile(QCString &s) { @@ -2350,10 +2454,10 @@ void stripIrrelevantConstVolatile(QCString &s) #ifndef NEWMATCH static bool matchArgument(const Argument *srcA,const Argument *dstA, - const QCString &className, - const QCString &namespaceName, - NamespaceSDict *usingNamespaces, - SDict<Definition> *usingClasses) + const QCString &className, + const QCString &namespaceName, + NamespaceSDict *usingNamespaces, + SDict<Definition> *usingClasses) { //printf("match argument start `%s|%s' <-> `%s|%s' using nsp=%p class=%p\n", // srcA->type.data(),srcA->name.data(), @@ -2372,7 +2476,7 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, QCString dstAName=dstA->name.stripWhiteSpace(); srcAType.stripPrefix("class "); dstAType.stripPrefix("class "); - + // allow distingishing "const A" from "const B" even though // from a syntactic point of view they would be two names of the same // type "const". This is not fool prove ofcourse, but should at least @@ -2397,7 +2501,7 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, dstAType+=dstA->name; dstAName.resize(0); } - + stripIrrelevantConstVolatile(srcAType); stripIrrelevantConstVolatile(dstAType); @@ -2410,7 +2514,7 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, { dstAType = dstAType.right(dstAType.length()-9); } - + srcAType = removeRedundantWhiteSpace(srcAType); dstAType = removeRedundantWhiteSpace(dstAType); @@ -2424,7 +2528,7 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, if (srcA->array!=dstA->array) // nomatch for char[] against char { NOMATCH - return FALSE; + return FALSE; } if (srcAType!=dstAType) // check if the argument only differs on name { @@ -2434,7 +2538,7 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, //printf("Trimming %s<->%s: %s\n",srcAType.data(),dstAType.data(),namespaceName.data()); //trimNamespaceScope(srcAType,dstAType,namespaceName); //printf("After Trimming %s<->%s\n",srcAType.data(),dstAType.data()); - + //QCString srcScope; //QCString dstScope; @@ -2486,20 +2590,20 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, //printf("2. srcA=%s|%s dstA=%s|%s\n",srcAType.data(),srcAName.data(), // dstAType.data(),dstAName.data()); - + if (!srcAName.isEmpty() && !dstA->type.isEmpty() && (srcAType+" "+srcAName)==dstAType) { MATCH - return TRUE; + return TRUE; } else if (!dstAName.isEmpty() && !srcA->type.isEmpty() && (dstAType+" "+dstAName)==srcAType) { MATCH - return TRUE; + return TRUE; } - + uint srcPos=0,dstPos=0; bool equal=TRUE; @@ -2517,7 +2621,7 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, if (srcPos==0 || dstPos==0) { NOMATCH - return FALSE; + return FALSE; } if (isId(srcAType.at(srcPos)) && isId(dstAType.at(dstPos))) { @@ -2526,7 +2630,7 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, if (!srcAName.isEmpty() || !dstAName.isEmpty()) { NOMATCH - return FALSE; + return FALSE; } // types only while (srcPos<srcATypeLen && isId(srcAType.at(srcPos))) srcPos++; @@ -2537,7 +2641,7 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, ) { NOMATCH - return FALSE; + return FALSE; } } else @@ -2554,7 +2658,7 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, if (srcPos!=srcATypeLen || dstPos!=dstATypeLen) { NOMATCH - return FALSE; + return FALSE; } } } @@ -2565,13 +2669,13 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, if (!dstAName.isEmpty()) // dst has its name separated from its type { NOMATCH - return FALSE; + return FALSE; } while (dstPos<dstAType.length() && isId(dstAType.at(dstPos))) dstPos++; if (dstPos!=dstAType.length()) { NOMATCH - return FALSE; // more than a difference in name -> no match + return FALSE; // more than a difference in name -> no match } } else // maybe dst has a name while src has not @@ -2581,7 +2685,7 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, if (dstPos!=dstAType.length() || !srcAName.isEmpty()) { NOMATCH - return FALSE; // nope not a name -> no match + return FALSE; // nope not a name -> no match } } } @@ -2592,13 +2696,13 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, if (!srcAName.isEmpty()) // src has its name separated from its type { NOMATCH - return FALSE; + return FALSE; } while (srcPos<srcAType.length() && isId(srcAType.at(srcPos))) srcPos++; if (srcPos!=srcAType.length()) { NOMATCH - return FALSE; // more than a difference in name -> no match + return FALSE; // more than a difference in name -> no match } } else // maybe src has a name while dst has not @@ -2608,13 +2712,13 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, if (srcPos!=srcAType.length() || !dstAName.isEmpty()) { NOMATCH - return FALSE; // nope not a name -> no match + return FALSE; // nope not a name -> no match } } } } MATCH - return TRUE; + return TRUE; } @@ -2626,9 +2730,9 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, * stored in the list should be equal. */ bool matchArguments(ArgumentList *srcAl,ArgumentList *dstAl, - const char *cl,const char *ns,bool checkCV, - NamespaceSDict *usingNamespaces, - SDict<Definition> *usingClasses) + const char *cl,const char *ns,bool checkCV, + NamespaceSDict *usingNamespaces, + SDict<Definition> *usingClasses) { QCString className=cl; QCString namespaceName=ns; @@ -2654,39 +2758,39 @@ bool matchArguments(ArgumentList *srcAl,ArgumentList *dstAl, if (match) { MATCH - return TRUE; + return TRUE; } else { NOMATCH - return FALSE; + return FALSE; } } - + // handle special case with void argument if ( srcAl->count()==0 && dstAl->count()==1 && - dstAl->getFirst()->type=="void" ) + dstAl->getFirst()->type=="void" ) { // special case for finding match between func() and func(void) Argument *a=new Argument; a->type = "void"; srcAl->append(a); MATCH - return TRUE; + return TRUE; } if ( dstAl->count()==0 && srcAl->count()==1 && - srcAl->getFirst()->type=="void" ) + srcAl->getFirst()->type=="void" ) { // special case for finding match between func(void) and func() Argument *a=new Argument; a->type = "void"; dstAl->append(a); MATCH - return TRUE; + return TRUE; } - + if (srcAl->count() != dstAl->count()) { NOMATCH - return FALSE; // different number of arguments -> no match + return FALSE; // different number of arguments -> no match } if (checkCV) @@ -2694,12 +2798,12 @@ bool matchArguments(ArgumentList *srcAl,ArgumentList *dstAl, if (srcAl->constSpecifier != dstAl->constSpecifier) { NOMATCH - return FALSE; // one member is const, the other not -> no match + return FALSE; // one member is const, the other not -> no match } if (srcAl->volatileSpecifier != dstAl->volatileSpecifier) { NOMATCH - return FALSE; // one member is volatile, the other not -> no match + return FALSE; // one member is volatile, the other not -> no match } } @@ -2713,11 +2817,11 @@ bool matchArguments(ArgumentList *srcAl,ArgumentList *dstAl, usingNamespaces,usingClasses)) { NOMATCH - return FALSE; + return FALSE; } } MATCH - return TRUE; // all arguments match + return TRUE; // all arguments match } #endif @@ -2728,7 +2832,7 @@ static QCString resolveSymbolName(FileDef *fs,Definition *symbol,QCString &templ ASSERT(symbol!=0); if (symbol->definitionType()==Definition::TypeMember && ((MemberDef*)symbol)->isTypedef()) // if symbol is a typedef then try - // to resolve it + // to resolve it { MemberDef *md = 0; ClassDef *cd = newResolveTypedef(fs,(MemberDef*)symbol,&md,&templSpec); @@ -2763,15 +2867,15 @@ static QCString extractCanonicalType(Definition *d,FileDef *fs,QCString type); QCString getCanonicalTemplateSpec(Definition *d,FileDef *fs,const QCString& spec) { - QCString templSpec = spec.stripWhiteSpace(); - if (templSpec.isEmpty() || templSpec.at(0) != '<') return templSpec; - return "< " + extractCanonicalType(d,fs,templSpec.right(templSpec.length()-1)); + QCString templSpec = spec.stripWhiteSpace(); + if (templSpec.isEmpty() || templSpec.at(0) != '<') return templSpec; + return "< " + extractCanonicalType(d,fs,templSpec.right(templSpec.length()-1)); } static QCString getCanonicalTypeForIdentifier( - Definition *d,FileDef *fs,const QCString &word, - QCString *tSpec) + Definition *d,FileDef *fs,const QCString &word, + QCString *tSpec) { QCString symName,scope,result,templSpec,tmpName; //DefinitionList *defList=0; @@ -2795,7 +2899,7 @@ static QCString getCanonicalTypeForIdentifier( bool isTemplInst = cd && !templSpec.isEmpty(); if (!cd && !templSpec.isEmpty()) { - // class template specialization not known, look up class template + // class template specialization not known, look up class template cd = getResolvedClass(d,fs,word,&mType,&ts,TRUE); } @@ -2867,7 +2971,7 @@ static QCString extractCanonicalType(Definition *d,FileDef *fs,QCString type) // strip const and volatile keywords that are not relevant for the type stripIrrelevantConstVolatile(type); - + // strip leading keywords type.stripPrefix("class "); type.stripPrefix("struct "); @@ -2879,11 +2983,11 @@ static QCString extractCanonicalType(Definition *d,FileDef *fs,QCString type) //printf("extractCanonicalType(type=%s)\n",type.data()); static QRegExp id("[a-z_A-Z][:a-z_A-Z0-9]*"); - + QCString canType,templSpec,word; int i,p=0,pp=0; while ((i=extractClassNameFromType(type,p,word,templSpec))!=-1) - // foreach identifier in the type + // foreach identifier in the type { //printf(" i=%d p=%d\n",i,p); canType += type.mid(pp,i-pp); @@ -2892,8 +2996,8 @@ static QCString extractCanonicalType(Definition *d,FileDef *fs,QCString type) canType += getCanonicalTypeForIdentifier(d,fs,word,&templSpec); if (!templSpec.isEmpty()) // if we didn't use up the templSpec already - // (i.e. type is not a template specialization) - // then resolve any identifiers inside. + // (i.e. type is not a template specialization) + // then resolve any identifiers inside. { static QRegExp re("[a-z_A-Z][a-z_A-Z0-9]*"); int tp=0,tl,ti; @@ -2907,12 +3011,12 @@ static QCString extractCanonicalType(Definition *d,FileDef *fs,QCString type) } canType+=templSpec.right(templSpec.length()-tp); } - + pp=p; } canType += type.right(type.length()-pp); //printf("extractCanonicalType = %s->%s\n",type.data(),canType.data()); - + return removeRedundantWhiteSpace(canType); } @@ -2936,9 +3040,9 @@ static QCString extractCanonicalArgType(Definition *d,FileDef *fs,const Argument } static bool matchArgument2( - Definition *srcScope,FileDef *srcFileScope,Argument *srcA, - Definition *dstScope,FileDef *dstFileScope,Argument *dstA - ) + Definition *srcScope,FileDef *srcFileScope,Argument *srcA, + Definition *dstScope,FileDef *dstFileScope,Argument *dstA + ) { //printf(">> match argument: %s::`%s|%s' (%s) <-> %s::`%s|%s' (%s)\n", // srcScope ? srcScope->name().data() : "", @@ -2949,7 +3053,7 @@ static bool matchArgument2( if (srcA->array!=dstA->array) // nomatch for char[] against char { NOMATCH - return FALSE; + return FALSE; } QCString sSrcName = " "+srcA->name; QCString sDstName = " "+dstA->name; @@ -2980,27 +3084,27 @@ static bool matchArgument2( { dstA->canType = extractCanonicalArgType(dstScope,dstFileScope,dstA); } - + if (srcA->canType==dstA->canType) { MATCH - return TRUE; + return TRUE; } else { //printf(" Canonical types do not match [%s]<->[%s]\n", // srcA->canType.data(),dstA->canType.data()); NOMATCH - return FALSE; + return FALSE; } } // new algorithm for argument matching bool matchArguments2(Definition *srcScope,FileDef *srcFileScope,ArgumentList *srcAl, - Definition *dstScope,FileDef *dstFileScope,ArgumentList *dstAl, - bool checkCV - ) + Definition *dstScope,FileDef *dstFileScope,ArgumentList *dstAl, + bool checkCV + ) { ASSERT(srcScope!=0 && dstScope!=0); @@ -3010,39 +3114,39 @@ bool matchArguments2(Definition *srcScope,FileDef *srcFileScope,ArgumentList *sr if (match) { MATCH - return TRUE; + return TRUE; } else { NOMATCH - return FALSE; + return FALSE; } } - + // handle special case with void argument if ( srcAl->count()==0 && dstAl->count()==1 && - dstAl->getFirst()->type=="void" ) + dstAl->getFirst()->type=="void" ) { // special case for finding match between func() and func(void) Argument *a=new Argument; a->type = "void"; srcAl->append(a); MATCH - return TRUE; + return TRUE; } if ( dstAl->count()==0 && srcAl->count()==1 && - srcAl->getFirst()->type=="void" ) + srcAl->getFirst()->type=="void" ) { // special case for finding match between func(void) and func() Argument *a=new Argument; a->type = "void"; dstAl->append(a); MATCH - return TRUE; + return TRUE; } if (srcAl->count() != dstAl->count()) { NOMATCH - return FALSE; // different number of arguments -> no match + return FALSE; // different number of arguments -> no match } if (checkCV) @@ -3050,12 +3154,12 @@ bool matchArguments2(Definition *srcScope,FileDef *srcFileScope,ArgumentList *sr if (srcAl->constSpecifier != dstAl->constSpecifier) { NOMATCH - return FALSE; // one member is const, the other not -> no match + return FALSE; // one member is const, the other not -> no match } if (srcAl->volatileSpecifier != dstAl->volatileSpecifier) { NOMATCH - return FALSE; // one member is volatile, the other not -> no match + return FALSE; // one member is volatile, the other not -> no match } } @@ -3066,15 +3170,15 @@ bool matchArguments2(Definition *srcScope,FileDef *srcFileScope,ArgumentList *sr for (;(srcA=srcAli.current(),dstA=dstAli.current());++srcAli,++dstAli) { if (!matchArgument2(srcScope,srcFileScope,srcA, - dstScope,dstFileScope,dstA) + dstScope,dstFileScope,dstA) ) { NOMATCH - return FALSE; + return FALSE; } } MATCH - return TRUE; // all arguments match + return TRUE; // all arguments match } @@ -3232,13 +3336,13 @@ void mergeArguments(ArgumentList *srcAl,ArgumentList *dstAl,bool forceNameOverwr * file fd. */ bool getDefs(const QCString &scName,const QCString &memberName, - const char *args, - MemberDef *&md, - ClassDef *&cd, FileDef *&fd, NamespaceDef *&nd, GroupDef *&gd, - bool forceEmptyScope, - FileDef *currentFile, - bool checkCV - ) + const char *args, + MemberDef *&md, + ClassDef *&cd, FileDef *&fd, NamespaceDef *&nd, GroupDef *&gd, + bool forceEmptyScope, + FileDef *currentFile, + bool checkCV + ) { fd=0, md=0, cd=0, nd=0, gd=0; if (memberName.isEmpty()) return FALSE; /* empty name => nothing to link */ @@ -3246,24 +3350,24 @@ bool getDefs(const QCString &scName,const QCString &memberName, QCString scopeName=scName; //printf("Search for name=%s args=%s in scope=%s\n", // memberName.data(),args,scopeName.data()); - + int is,im=0,pm=0; // strip common part of the scope from the scopeName while ((is=scopeName.findRev("::"))!=-1 && - (im=memberName.find("::",pm))!=-1 && - (scopeName.right(scopeName.length()-is-2)==memberName.mid(pm,im-pm)) - ) + (im=memberName.find("::",pm))!=-1 && + (scopeName.right(scopeName.length()-is-2)==memberName.mid(pm,im-pm)) + ) { scopeName=scopeName.left(is); pm=im+2; } //printf("result after scope corrections scope=%s name=%s\n", // scopeName.data(),memberName.data()); - + QCString mName=memberName; QCString mScope; if (memberName.left(9)!="operator " && // treat operator conversion methods - // as a special case + // as a special case (im=memberName.findRev("::"))!=-1 && im<(int)memberName.length()-2 // not A:: ) @@ -3271,12 +3375,12 @@ bool getDefs(const QCString &scName,const QCString &memberName, mScope=memberName.left(im); mName=memberName.right(memberName.length()-im-2); } - + // handle special the case where both scope name and member scope are equal if (mScope==scopeName) scopeName.resize(0); //printf("mScope=`%s' mName=`%s'\n",mScope.data(),mName.data()); - + MemberName *mn = Doxygen::memberNameSDict[mName]; //printf("mName=%s mn=%p\n",mName.data(),mn); if (!forceEmptyScope && mn && !(scopeName.isEmpty() && mScope.isEmpty())) @@ -3299,7 +3403,7 @@ bool getDefs(const QCString &scName,const QCString &memberName, ClassDef *fcd=0; // todo: fill in correct fileScope! if ((fcd=getResolvedClass(Doxygen::globalScope,0,className)) && // is it a documented class - fcd->isLinkable() + fcd->isLinkable() ) { //printf(" Found fcd=%p\n",fcd); @@ -3316,23 +3420,23 @@ bool getDefs(const QCString &scName,const QCString &memberName, { //if (mmd->isLinkable()) //{ - bool match=args==0 || - matchArguments2(mmd->getOuterScope(),mmd->getFileDef(),mmd->argumentList(), - fcd,fcd->getFileDef(),argList, - checkCV - ); - //printf("match=%d\n",match); - if (match) + bool match=args==0 || + matchArguments2(mmd->getOuterScope(),mmd->getFileDef(),mmd->argumentList(), + fcd,fcd->getFileDef(),argList, + checkCV + ); + //printf("match=%d\n",match); + if (match) + { + ClassDef *mcd=mmd->getClassDef(); + int m=minClassDistance(fcd,mcd); + if (m<mdist && mcd->isLinkable()) { - ClassDef *mcd=mmd->getClassDef(); - int m=minClassDistance(fcd,mcd); - if (m<mdist && mcd->isLinkable()) - { - mdist=m; - cd=mcd; - md=mmd; - } + mdist=m; + cd=mcd; + md=mmd; } + } //} } if (argList) @@ -3347,16 +3451,16 @@ bool getDefs(const QCString &scName,const QCString &memberName, { //if (mmd->isLinkable()) //{ - ClassDef *mcd=mmd->getClassDef(); - //printf(" >Class %s found\n",mcd->name().data()); - int m=minClassDistance(fcd,mcd); - if (m<mdist /* && mcd->isLinkable()*/ ) - { - //printf("Class distance %d\n",m); - mdist=m; - cd=mcd; - md=mmd; - } + ClassDef *mcd=mmd->getClassDef(); + //printf(" >Class %s found\n",mcd->name().data()); + int m=minClassDistance(fcd,mcd); + if (m<mdist /* && mcd->isLinkable()*/ ) + { + //printf("Class distance %d\n",m); + mdist=m; + cd=mcd; + md=mmd; + } //} } } @@ -3378,7 +3482,7 @@ bool getDefs(const QCString &scName,const QCString &memberName, } } /* go to the parent scope */ - + if (scopeOffset==0) { scopeOffset=-1; @@ -3388,9 +3492,50 @@ bool getDefs(const QCString &scName,const QCString &memberName, scopeOffset=0; } } while (scopeOffset>=0); - + // unknown or undocumented scope } + if (mn && scopeName.isEmpty() && mScope.isEmpty()) // Maybe a related function? + { + MemberListIterator mmli(*mn); + MemberDef *mmd, *fuzzy_mmd = 0; + ArgumentList *argList = 0; + bool hasEmptyArgs = args && strcmp(args, "()") == 0; + + if (args) + stringToArgumentList(args, argList = new ArgumentList); + + for (mmli.toFirst(); (mmd = mmli.current()); ++mmli) + { + if (!mmd->isLinkable() || !mmd->isRelated() || !mmd->getClassDef()) + continue; + + if (!args) break; + + QCString className = mmd->getClassDef()->name(); + + if (matchArguments2(mmd->getOuterScope(),mmd->getFileDef(),mmd->argumentList(), + Doxygen::globalScope,mmd->getFileDef(),argList, + checkCV + ) + ) break; + + if (!fuzzy_mmd && hasEmptyArgs) + fuzzy_mmd = mmd; + } + + if (argList) delete argList, argList = 0; + + mmd = mmd ? mmd : fuzzy_mmd; + + if (mmd) + { + md = mmd; + cd = mmd->getClassDef(); + return TRUE; + } + } + // maybe an namespace, file or group member ? //printf("Testing for global function scopeName=`%s' mScope=`%s' :: mName=`%s'\n", @@ -3500,33 +3645,33 @@ bool getDefs(const QCString &scName,const QCString &memberName, { //if (md->isLinkable()) //{ - fd=md->getFileDef(); - gd=md->getGroupDef(); - //printf(" md->name()=`%s' md->args=`%s' fd=%p gd=%p\n", - // md->name().data(),args,fd,gd); - if ( - (gd && gd->isLinkable()) || (fd && fd->isLinkable()) - ) + fd=md->getFileDef(); + gd=md->getGroupDef(); + //printf(" md->name()=`%s' md->args=`%s' fd=%p gd=%p\n", + // md->name().data(),args,fd,gd); + if ( + (gd && gd->isLinkable()) || (fd && fd->isLinkable()) + ) + { + //printf(" fd=%p gd=%p args=`%s'\n",fd,gd,args); + bool match=TRUE; + ArgumentList *argList=0; + if (args && !md->isDefine() && strcmp(args,"()")!=0) { - //printf(" fd=%p gd=%p args=`%s'\n",fd,gd,args); - bool match=TRUE; - ArgumentList *argList=0; - if (args && !md->isDefine() && strcmp(args,"()")!=0) - { - argList=new ArgumentList; - stringToArgumentList(args,argList); - match=matchArguments2( - md->getOuterScope(),fd,md->argumentList(), - Doxygen::globalScope,fd,argList, - checkCV); - delete argList; argList=0; - } - if (match) - { - //printf("Found match!\n"); - members.append(md); - } + argList=new ArgumentList; + stringToArgumentList(args,argList); + match=matchArguments2( + md->getOuterScope(),fd,md->argumentList(), + Doxygen::globalScope,fd,argList, + checkCV); + delete argList; argList=0; } + if (match) + { + //printf("Found match!\n"); + members.append(md); + } + } //} } if (members.count()!=1 && args && !strcmp(args,"()")) @@ -3588,7 +3733,7 @@ bool getDefs(const QCString &scName,const QCString &memberName, } } } - + // no nothing found return FALSE; } @@ -3608,7 +3753,7 @@ bool getDefs(const QCString &scName,const QCString &memberName, * - if `nd' is non zero, the scope was a namespace pointed to by nd. */ bool getScopeDefs(const char *docScope,const char *scope, - ClassDef *&cd, NamespaceDef *&nd) + ClassDef *&cd, NamespaceDef *&nd) { cd=0;nd=0; @@ -3622,7 +3767,7 @@ bool getScopeDefs(const char *docScope,const char *scope, scopeName=scopeName.right(scopeName.length()-2); explicitGlobalScope=TRUE; } - + QCString docScopeName=docScope; int scopeOffset=explicitGlobalScope ? 0 : docScopeName.length(); @@ -3630,7 +3775,7 @@ bool getScopeDefs(const char *docScope,const char *scope, { QCString fullName=scopeName.copy(); if (scopeOffset>0) fullName.prepend(docScopeName.left(scopeOffset)+"::"); - + if ((cd=getClass(fullName)) && cd->isLinkable()) { return TRUE; // class link written => quit @@ -3648,7 +3793,7 @@ bool getScopeDefs(const char *docScope,const char *scope, scopeOffset=0; } } while (scopeOffset>=0); - + return FALSE; } @@ -3667,19 +3812,19 @@ static bool isLowerCase(QCString &s) * @post return value TRUE implies *resContext!=0 or *resMember!=0 */ bool resolveRef(/* in */ const char *scName, - /* in */ const char *name, - /* in */ bool inSeeBlock, - /* out */ Definition **resContext, - /* out */ MemberDef **resMember - ) + /* in */ const char *name, + /* in */ bool inSeeBlock, + /* out */ Definition **resContext, + /* out */ MemberDef **resMember + ) { //printf("resolveRef(scName=%s,name=%s,inSeeBlock=%d)\n",scName,name,inSeeBlock); - + QCString tsName = name; bool memberScopeFirst = tsName.find('#')!=-1; QCString fullName = substitute(tsName,"#","::"); fullName = removeRedundantWhiteSpace(substitute(fullName,".","::")); - + int bracePos=fullName.findRev('('); // reverse is needed for operator()(...) int endNamePos=bracePos!=-1 ? bracePos : fullName.length(); int scopePos=fullName.findRev("::",endNamePos); @@ -3699,7 +3844,7 @@ bool resolveRef(/* in */ const char *scName, } //printf("scName=%s fullName=%s\n",scName,fullName.data()); - + // check if this is a class or namespace reference if (scName!=fullName && getScopeDefs(scName,fullName,cd,nd)) { @@ -3724,14 +3869,14 @@ bool resolveRef(/* in */ const char *scName, } // continue search... } - + // extract userscope+name QCString nameStr=fullName.left(endNamePos); // extract arguments QCString argsStr; if (bracePos!=-1) argsStr=fullName.right(fullName.length()-bracePos); - + // strip template specifier // TODO: match against the correct partial template instantiation int templPos=nameStr.find('<'); @@ -3752,11 +3897,11 @@ bool resolveRef(/* in */ const char *scName, // check if nameStr is a member or global. //printf("getDefs(scope=%s,name=%s,args=%s)\n",scopeStr.data(),nameStr.data(),argsStr.data()); if (getDefs(scopeStr,nameStr,argsStr, - md,cd,fd,nd,gd, - scopePos==0 && !memberScopeFirst, - 0, - TRUE - ) + md,cd,fd,nd,gd, + scopePos==0 && !memberScopeFirst, + 0, + TRUE + ) ) { //printf("after getDefs md=%p cd=%p fd=%p nd=%p gd=%p\n",md,cd,fd,nd,gd); @@ -3832,10 +3977,10 @@ QCString linkToText(const char *link,bool isFileName) */ bool generateRef(OutputDocInterface &od,const char *scName, - const char *name,bool inSeeBlock,const char *rt) + const char *name,bool inSeeBlock,const char *rt) { //printf("generateRef(scName=%s,name=%s,rt=%s)\n",scName,name,rt); - + Definition *compound; MemberDef *md; @@ -3847,8 +3992,8 @@ bool generateRef(OutputDocInterface &od,const char *scName, if (md && md->isLinkable()) // link to member { od.writeObjectLink(md->getReference(), - md->getOutputFileBase(), - md->anchor(),linkText); + md->getOutputFileBase(), + md->anchor(),linkText); // generate the page reference (for LaTeX) if (!md->isReference()) { @@ -3867,8 +4012,8 @@ bool generateRef(OutputDocInterface &od,const char *scName, linkText=linkToText(rt,TRUE); } od.writeObjectLink(compound->getReference(), - compound->getOutputFileBase(), - 0,linkText); + compound->getOutputFileBase(), + 0,linkText); if (!compound->isReference()) { writePageRef(od,compound->getOutputFileBase(),0); @@ -3881,14 +4026,14 @@ bool generateRef(OutputDocInterface &od,const char *scName, } bool resolveLink(/* in */ const char *scName, - /* in */ const char *lr, - /* in */ bool inSeeBlock, - /* out */ Definition **resContext, - /* out */ QCString &resAnchor - ) + /* in */ const char *lr, + /* in */ bool inSeeBlock, + /* out */ Definition **resContext, + /* out */ QCString &resAnchor + ) { *resContext=0; - + QCString linkRef=lr; //printf("ResolveLink linkRef=%s\n",lr); FileDef *fd; @@ -3973,7 +4118,7 @@ bool resolveLink(/* in */ const char *scName, // returns TRUE if a link could be generated. bool generateLink(OutputDocInterface &od,const char *clName, - const char *lr,bool inSeeBlock,const char *lt) + const char *lr,bool inSeeBlock,const char *lt) { //printf("generateLink(clName=%s,lr=%s,lr=%s)\n",clName,lr,lt); Definition *compound; @@ -3995,7 +4140,7 @@ bool generateLink(OutputDocInterface &od,const char *clName, linkText=linkToText(lt,TRUE); } od.writeObjectLink(compound->getReference(), - compound->getOutputFileBase(),anchor,linkText); + compound->getOutputFileBase(),anchor,linkText); if (!compound->isReference()) { writePageRef(od,compound->getOutputFileBase(),anchor); @@ -4107,7 +4252,7 @@ FileDef *findFileDef(const FileNameDict *fnDict,const char *n,bool &ambig) { cachedResult = new FindFileCacheElem(0,FALSE); } - + QCString name=convertToQCString(QDir::cleanDirPath(n)); QCString path; int slashPos; @@ -4203,7 +4348,7 @@ QCString substituteKeywords(const QCString &s,const char *title,const QCString & result = substitute(result,"$relpath$",relPath); return result; } - + //---------------------------------------------------------------------- /*! Returns the character index within \a name of the first prefix @@ -4303,16 +4448,16 @@ QCString escapeCharsInString(const char *name,bool allowDots) case ',': result+="_00"; break; case ' ': result+="_01"; break; default: - if (caseSenseNames || !isupper(c)) - { - result+=c; - } - else - { - result+="_"; - result+=tolower(c); - } - break; + if (caseSenseNames || !isupper(c)) + { + result+=c; + } + else + { + result+="_"; + result+=tolower(c); + } + break; } } return result; @@ -4445,8 +4590,8 @@ void createSubDirs(QDir &d) * namespace part (as large as possible) and a classname part. */ void extractNamespaceName(const QCString &scopeName, - QCString &className,QCString &namespaceName, - bool allowEmptyClass) + QCString &className,QCString &namespaceName, + bool allowEmptyClass) { int i,p; QCString clName=scopeName; @@ -4497,9 +4642,9 @@ QCString insertTemplateSpecifierInScope(const QCString &scope,const QCString &te int si,pi=0; ClassDef *cd=0; while ( - (si=scope.find("::",pi))!=-1 && !getClass(scope.left(si)+templ) && - ((cd=getClass(scope.left(si)))==0 || cd->templateArguments()==0) - ) + (si=scope.find("::",pi))!=-1 && !getClass(scope.left(si)+templ) && + ((cd=getClass(scope.left(si)))==0 || cd->templateArguments()==0) + ) { //printf("Tried `%s'\n",(scope.left(si)+templ).data()); pi=si+2; @@ -4551,8 +4696,8 @@ QCString stripScope(const char *name) case '>': count++; break; case '<': count--; if (count<=0) done=TRUE; break; default: - //printf("c=%c count=%d\n",c,count); - break; + //printf("c=%c count=%d\n",c,count); + break; } } //printf("pos > = %d\n",p+1); @@ -4563,7 +4708,7 @@ QCString stripScope(const char *name) } //printf("stripScope(%s)=%s\n",name,name); return name; - + } /*! Convert nibble (range 0..15) to hex char */ @@ -4589,18 +4734,18 @@ QCString convertToXML(const char *s) case '\'': result+="'"; break; case '"': result+="""; break; default: - //if (c<0) - //{ <- this doesn't work for languages that use - // characters with codes beyond 255 - // result+=(QCString)"&#x" + - // nibbleToHex((((uchar)c)>>4)&0xf)+ - // nibbleToHex(c&0xf)+";"; - //} - //else - //{ - result+=c; - //} - break; + //if (c<0) + //{ <- this doesn't work for languages that use + // characters with codes beyond 255 + // result+=(QCString)"&#x" + + // nibbleToHex((((uchar)c)>>4)&0xf)+ + // nibbleToHex(c&0xf)+";"; + //} + //else + //{ + result+=c; + //} + break; } } return result; @@ -4622,10 +4767,10 @@ QCString getOverloadDocs() // "provided for convenience. It differs from the above " // "function only in what argument(s) it accepts."; } - + void addMembersToMemberGroup(MemberList *ml, - MemberGroupSDict **ppMemberGroupSDict, - Definition *context) + MemberGroupSDict **ppMemberGroupSDict, + Definition *context) { ASSERT(context!=0); //printf("addMemberToMemberGroup()\n"); @@ -4660,12 +4805,12 @@ void addMembersToMemberGroup(MemberList *ml, if (mg==0) { mg = new MemberGroup( - context, - groupId, - info->header, - info->doc, - info->docFile - ); + context, + groupId, + info->header, + info->doc, + info->docFile + ); (*ppMemberGroupSDict)->append(groupId,mg); } mg->insertMember(fmd); // insert in member group @@ -4693,12 +4838,12 @@ void addMembersToMemberGroup(MemberList *ml, if (mg==0) { mg = new MemberGroup( - context, - groupId, - info->header, - info->doc, - info->docFile - ); + context, + groupId, + info->header, + info->doc, + info->docFile + ); (*ppMemberGroupSDict)->append(groupId,mg); } md = ml->take(index); // remove from member list @@ -4777,9 +4922,9 @@ int extractClassNameFromType(const QCString &type,int &pos,QCString &name,QCStri * prevent recursive substitution. */ QCString substituteTemplateArgumentsInString( - const QCString &name, - ArgumentList *formalArgs, - ArgumentList *actualArgs) + const QCString &name, + ArgumentList *formalArgs, + ArgumentList *actualArgs) { //printf("substituteTemplateArgumentsInString(name=%s formal=%s actualArg=%s)\n", // name.data(),argListToString(formalArgs).data(),argListToString(actualArgs).data()); @@ -4817,23 +4962,23 @@ QCString substituteTemplateArgumentsInString( result += actArg->type+" "; } else // for case where the actual arg is something like "unsigned int" - // the "int" part is in actArg->name. + // the "int" part is in actArg->name. { result += actArg->type+" "+actArg->name+" "; } found=TRUE; } else if (formArg->name==n && actArg==0 && !formArg->defval.isEmpty() && - formArg->defval!=name /* to prevent recursion */ - ) + formArg->defval!=name /* to prevent recursion */ + ) { result += substituteTemplateArgumentsInString(formArg->defval,formalArgs,actualArgs)+" "; found=TRUE; } } else if (formArg->name==n && actArg==0 && !formArg->defval.isEmpty() && - formArg->defval!=name /* to prevent recursion */ - ) + formArg->defval!=name /* to prevent recursion */ + ) { result += substituteTemplateArgumentsInString(formArg->defval,formalArgs,actualArgs)+" "; found=TRUE; @@ -4894,8 +5039,8 @@ QList<ArgumentList> *copyArgumentLists(const QList<ArgumentList> *srcLists) * strip both unless A<T> or B<S> are specialized template classes. */ QCString stripTemplateSpecifiersFromScope(const QCString &fullName, - bool parentOnly, - QCString *pLastScopeStripped) + bool parentOnly, + QCString *pLastScopeStripped) { QCString result; int p=0; @@ -4923,7 +5068,7 @@ QCString stripTemplateSpecifiersFromScope(const QCString &fullName, int si= fullName.find("::",e); if (parentOnly && si==-1) break; - // we only do the parent scope, so we stop here if needed + // we only do the parent scope, so we stop here if needed result+=fullName.mid(p,i-p); //printf(" trying %s\n",(result+fullName.mid(i,e-i)).data()); @@ -5036,13 +5181,13 @@ found: //---------------------------------------------------------------------------- PageDef *addRelatedPage(const char *name,const QCString &ptitle, - const QCString &doc, - QList<SectionInfo> * /*anchors*/, - const char *fileName,int startLine, - const QList<ListItemInfo> *sli, - GroupDef *gd, - TagInfo *tagInfo - ) + const QCString &doc, + QList<SectionInfo> * /*anchors*/, + const char *fileName,int startLine, + const QList<ListItemInfo> *sli, + GroupDef *gd, + TagInfo *tagInfo + ) { PageDef *pd=0; //printf("addRelatedPage(name=%s gd=%p)\n",name,gd); @@ -5059,7 +5204,7 @@ PageDef *addRelatedPage(const char *name,const QCString &ptitle, baseName=baseName.left(baseName.length()-4); else if (baseName.right(Doxygen::htmlFileExtension.length())==Doxygen::htmlFileExtension) baseName=baseName.left(baseName.length()-Doxygen::htmlFileExtension.length()); - + QCString title=ptitle.stripWhiteSpace(); pd=new PageDef(fileName,startLine,baseName,doc,title); @@ -5081,7 +5226,7 @@ PageDef *addRelatedPage(const char *name,const QCString &ptitle, Doxygen::pageSDict->append(baseName,pd); if (gd) gd->addPage(pd); - + if (!pd->title().isEmpty()) { //outputList->writeTitle(pi->name,pi->title); @@ -5116,8 +5261,8 @@ PageDef *addRelatedPage(const char *name,const QCString &ptitle, //---------------------------------------------------------------------------- void addRefItem(const QList<ListItemInfo> *sli, - const char *prefix, - const char *name,const char *title,const char *args) + const char *prefix, + const char *name,const char *title,const char *args) { //printf("addRefItem(sli=%p,prefix=%s,name=%s,title=%s,args=%s)\n",sli,prefix,name,title,args); if (sli) @@ -5179,7 +5324,7 @@ void addGroupListToTitle(OutputList &ol,Definition *d) { if (!first) { ol.docify(","); ol.writeNonBreakableSpace(1); } else first=FALSE; ol.writeObjectLink(gd->getReference(), - gd->getOutputFileBase(),0,gd->groupTitle()); + gd->getOutputFileBase(),0,gd->groupTitle()); } ol.docify("]"); ol.endSmall(); @@ -5377,18 +5522,18 @@ static void latin2ToLatex(QTextStream &t,unsigned char c) } void filterLatexString(QTextStream &t,const char *str, - bool insideTabbing,bool insidePre,bool insideItem) + bool insideTabbing,bool insidePre,bool insideItem) { static bool isCzech = theTranslator->idLanguage()=="czech"; static bool isJapanese = theTranslator->idLanguage()=="japanese" || - theTranslator->idLanguage()=="japanese-en"; + theTranslator->idLanguage()=="japanese-en"; static bool isKorean = theTranslator->idLanguage()=="korean" || - theTranslator->idLanguage()=="korean-en"; + theTranslator->idLanguage()=="korean-en"; static bool isRussian = theTranslator->idLanguage()=="russian"; static bool isUkrainian = theTranslator->idLanguage()=="ukrainian"; static bool isSlovene = theTranslator->idLanguage()=="solvene"; static bool isChinese = theTranslator->idLanguage()=="chinese" || - theTranslator->idLanguage()=="chinese-traditional"; + theTranslator->idLanguage()=="chinese-traditional"; static bool isLatin2 = theTranslator->idLanguageCharset()=="iso-8859-2"; static bool isGreek = theTranslator->idLanguage()=="greek"; //printf("filterLatexString(%s)\n",str); @@ -5410,23 +5555,23 @@ void filterLatexString(QTextStream &t,const char *str, case '}': t << "\\}"; break; case '_': t << "\\_"; break; default: - { - // Some languages use wide characters - if (c>=128 && (isJapanese || isKorean || isChinese)) - { - t << (char)c; - if (*p) - { - c = *p++; - t << (char)c; - } - } - else - { - t << (char)c; - } - break; - } + { + // Some languages use wide characters + if (c>=128 && (isJapanese || isKorean || isChinese)) + { + t << (char)c; + if (*p) + { + c = *p++; + t << (char)c; + } + } + else + { + t << (char)c; + } + break; + } } } else @@ -5454,13 +5599,13 @@ void filterLatexString(QTextStream &t,const char *str, t << "["; break; case ']': if (pc=='[') t << "$\\,$"; - if (Config_getBool("PDF_HYPERLINKS") || insideItem) - t << "\\mbox{]}"; - else - t << "]"; + if (Config_getBool("PDF_HYPERLINKS") || insideItem) + t << "\\mbox{]}"; + else + t << "]"; break; case '-': if (*p=='>') - { t << " $\\rightarrow$ "; p++; } + { t << " $\\rightarrow$ "; p++; } else { t << (char)c; } break; @@ -5475,75 +5620,75 @@ void filterLatexString(QTextStream &t,const char *str, break; default: - { - // Some languages use wide characters - if (isJapanese || isKorean || isChinese) - { - if (c>=128) - { - t << (char)c; - if (*p) - { - c = *p++; - t << (char)c; - } - } - else // ascii char => see if we can insert a hypenation hint - { - if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-"; - t << (char)c; - } - } - else if (isCzech || isRussian || isUkrainian || isSlovene) - { - if (c>=128) - { - t << (char)c; - } - else // ascii char => see if we can insert a hypenation hint - { - if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-"; - t << (char)c; - } - } - else if (isGreek) - { - if (c<128) - { - t << "\\textlatin{" << (char)c << "}"; - } - else - { - t << (char)c; - } - } - else if (isLatin2) - { - if (c>=128) - { - latin2ToLatex(t,c); - } - else - { - // see if we can insert an hyphenation hint - if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-"; - t << (char)c; - } - } - else // another language => assume latin1 charset - { - if (c>=128) - { - latin1ToLatex(t,c); - } - else - { - // see if we can insert an hyphenation hint - if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-"; - t << (char)c; - } - } - } + { + // Some languages use wide characters + if (isJapanese || isKorean || isChinese) + { + if (c>=128) + { + t << (char)c; + if (*p) + { + c = *p++; + t << (char)c; + } + } + else // ascii char => see if we can insert a hypenation hint + { + if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-"; + t << (char)c; + } + } + else if (isCzech || isRussian || isUkrainian || isSlovene) + { + if (c>=128) + { + t << (char)c; + } + else // ascii char => see if we can insert a hypenation hint + { + if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-"; + t << (char)c; + } + } + else if (isGreek) + { + if (c<128) + { + t << "\\textlatin{" << (char)c << "}"; + } + else + { + t << (char)c; + } + } + else if (isLatin2) + { + if (c>=128) + { + latin2ToLatex(t,c); + } + else + { + // see if we can insert an hyphenation hint + if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-"; + t << (char)c; + } + } + else // another language => assume latin1 charset + { + if (c>=128) + { + latin1ToLatex(t,c); + } + else + { + // see if we can insert an hyphenation hint + if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-"; + t << (char)c; + } + } + } } } pc = c; @@ -5567,28 +5712,28 @@ QCString rtfFormatBmkStr(const char *name) QCString* tag = g_tagDict.find( key ); if ( !tag ) { - // This particular name has not yet been added - // to the list. Add it, associating it with the - // next tag value, and increment the next tag. - tag = new QCString( g_nextTag.copy() ); // Make sure to use a deep copy! - g_tagDict.insert( key, tag ); - - // This is the increment part - char* nxtTag = g_nextTag.data() + g_nextTag.length() - 1; - for ( unsigned int i = 0; i < g_nextTag.length(); ++i, --nxtTag ) - { - if ( ( ++(*nxtTag) ) > 'Z' ) - { - *nxtTag = 'A'; - } - else - { - // Since there was no carry, we can stop now - break; - } - } + // This particular name has not yet been added + // to the list. Add it, associating it with the + // next tag value, and increment the next tag. + tag = new QCString( g_nextTag.copy() ); // Make sure to use a deep copy! + g_tagDict.insert( key, tag ); + + // This is the increment part + char* nxtTag = g_nextTag.data() + g_nextTag.length() - 1; + for ( unsigned int i = 0; i < g_nextTag.length(); ++i, --nxtTag ) + { + if ( ( ++(*nxtTag) ) > 'Z' ) + { + *nxtTag = 'A'; + } + else + { + // Since there was no carry, we can stop now + break; + } + } } - + return *tag; } @@ -5703,7 +5848,7 @@ QCString stripLeadingAndTrailingEmptyLines(const QCString &s) } void stringToSearchIndex(const QCString &docBaseUrl,const QCString &title, - const QCString &str,bool priority,const QCString &anchor) + const QCString &str,bool priority,const QCString &anchor) { static bool searchEngine = Config_getBool("SEARCHENGINE"); if (searchEngine) @@ -5773,8 +5918,8 @@ bool checkIfTypedef(Definition *scope,FileDef *fileScope,const char *n) if (name.isEmpty()) return FALSE; // no name was given - DefinitionList *dl = Doxygen::symbolMap->find(name); - if (dl==0) + DefinitionIntf *di = Doxygen::symbolMap->find(name); + if (di==0) return FALSE; // could not find any matching symbols // mostly copied from getResolvedClassRec() @@ -5787,24 +5932,39 @@ bool checkIfTypedef(Definition *scope,FileDef *fileScope,const char *n) name = name.mid(qualifierIndex+2); } - // find the closest closest matching definition - DefinitionListIterator dli(*dl); - Definition *d; int minDistance = 10000; MemberDef *bestMatch = 0; - for (dli.toFirst();(d=dli.current());++dli) + + if (di->definitionType()==DefinitionIntf::TypeSymbolList) { - if (d->definitionType()==Definition::TypeMember) + // find the closest closest matching definition + DefinitionListIterator dli(*(DefinitionList*)di); + Definition *d; + for (dli.toFirst();(d=dli.current());++dli) { - g_visitedNamespaces.clear(); - int distance = isAccessibleFromWithExpScope(scope,fileScope,d,explicitScopePart); - if (distance!=-1 && distance<minDistance) + if (d->definitionType()==Definition::TypeMember) { - minDistance = distance; - bestMatch = (MemberDef *)d; + g_visitedNamespaces.clear(); + int distance = isAccessibleFromWithExpScope(scope,fileScope,d,explicitScopePart); + if (distance!=-1 && distance<minDistance) + { + minDistance = distance; + bestMatch = (MemberDef *)d; + } } } } + else if (di->definitionType()==Definition::TypeMember) + { + Definition *d = (Definition *)di; + g_visitedNamespaces.clear(); + int distance = isAccessibleFromWithExpScope(scope,fileScope,d,explicitScopePart); + if (distance!=-1 && distance<minDistance) + { + minDistance = distance; + bestMatch = (MemberDef *)d; + } + } if (bestMatch && bestMatch->isTypedef()) return TRUE; // closest matching symbol is a typedef |