diff options
Diffstat (limited to 'src/util.cpp')
-rw-r--r-- | src/util.cpp | 175 |
1 files changed, 139 insertions, 36 deletions
diff --git a/src/util.cpp b/src/util.cpp index 12399cc..3ecdfb6 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -309,12 +309,15 @@ int guessSection(const char *name) n.right(4)==".cpp" || n.right(4)==".c++" || n.right(5)==".java" || + n.right(2)==".m" || + n.right(2)==".M" || + n.right(3)==".mm" || n.right(3)==".ii" || // inline n.right(4)==".ixx" || n.right(4)==".ipp" || n.right(4)==".i++" || n.right(4)==".inl" || - n.right(4)==".xml" + n.right(4)==".xml" ) return Entry::SOURCE_SEC; if (n.right(2)==".h" || // header n.right(3)==".hh" || @@ -1475,7 +1478,7 @@ ClassDef *getResolvedClass(Definition *scope, (scope->definitionType()!=Definition::TypeClass && scope->definitionType()!=Definition::TypeNamespace ) || - (fileScope && fileScope->isJava() && QCString(n).find("::")!=-1) + (scope->getLanguage()==SrcLangExt_Java && QCString(n).find("::")!=-1) ) { scope=Doxygen::globalScope; @@ -3716,15 +3719,16 @@ bool getDefs(const QCString &scName,const QCString &memberName, if (memberName.isEmpty()) return FALSE; /* empty name => nothing to link */ QCString scopeName=scName; + scopeName = substitute(scopeName,"\\","::"); // for PHP //printf("Search for name=%s args=%s in scope=%s forceEmpty=%d\n", // memberName.data(),args,scopeName.data(),forceEmptyScope); 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; @@ -4300,9 +4304,9 @@ bool resolveRef(/* in */ const char *scName, return FALSE; } -QCString linkToText(const char *link,bool isFileName) +QCString linkToText(SrcLangExt lang,const char *link,bool isFileName) { - static bool optimizeOutputJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA"); + //static bool optimizeOutputJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA"); QCString result=link; if (!result.isEmpty()) { @@ -4315,9 +4319,10 @@ QCString linkToText(const char *link,bool isFileName) { result=result.right(result.length()-2); } - if (optimizeOutputJava) + QCString sep = getLanguageSpecificSeparator(lang); + if (sep!="::") { - result=substitute(result,"::","."); + result=substitute(result,"::",sep); } } return result; @@ -4499,7 +4504,7 @@ bool generateLink(OutputDocInterface &od,const char *clName, //printf("generateLink(clName=%s,lr=%s,lr=%s)\n",clName,lr,lt); Definition *compound; //PageDef *pageDef=0; - QCString anchor,linkText=linkToText(lt,FALSE); + QCString anchor,linkText=linkToText(SrcLangExt_Unknown,lt,FALSE); //printf("generateLink linkText=%s\n",linkText.data()); if (resolveLink(clName,lr,inSeeBlock,&compound,anchor)) { @@ -4513,7 +4518,7 @@ bool generateLink(OutputDocInterface &od,const char *clName, } else if (compound->definitionType()==Definition::TypeFile) { - linkText=linkToText(lt,TRUE); + linkText=linkToText(compound->getLanguage(),lt,TRUE); } od.writeObjectLink(compound->getReference(), compound->getOutputFileBase(),anchor,linkText); @@ -4830,6 +4835,7 @@ QCString escapeCharsInString(const char *name,bool allowDots,bool allowUnderscor case ')': strBuf.addStr("_08"); break; case '+': strBuf.addStr("_09"); break; case '=': strBuf.addStr("_0A"); break; + case '$': strBuf.addStr("_0B"); break; default: if (c<0) { @@ -5273,6 +5279,7 @@ QCString convertToJSString(const char *s) switch (c) { case '"': strBuf.addStr("\\\""); break; + case '\\': strBuf.addStr("\\\\"); break; default: strBuf.addChar(c); break; } } @@ -5489,7 +5496,7 @@ int extractClassNameFromType(const QCString &type,int &pos,QCString &name,QCStri static const QRegExp re_ftn("[a-z_A-Z\\x80-\\xFF][()=_a-z_A-Z0-9:\\x80-\\xFF]*"); QRegExp re; - if (lang == SrcLangExt_F90) + if (lang == SrcLangExt_Fortran) { if (type.at(pos)==',') return -1; if (type.left(4).lower()=="type") @@ -5981,9 +5988,11 @@ void addGroupListToTitle(OutputList &ol,Definition *d) } void filterLatexString(FTextStream &t,const char *str, - bool insideTabbing,bool insidePre,bool insideItem,bool forceBreaks) + bool insideTabbing,bool insidePre,bool insideItem) { if (str==0) return; + //printf("filterLatexString(%s)\n",str); + //if (strlen(str)<2) stackTrace(); const unsigned char *p=(const unsigned char *)str; unsigned char c; unsigned char pc='\0'; @@ -6013,7 +6022,8 @@ void filterLatexString(FTextStream &t,const char *str, case '^': t << "$^\\wedge$"; break; case '&': t << "\\&"; break; case '*': t << "$\\ast$"; break; - case '_': t << "\\_"; + case '_': if (!insideTabbing) t << "\\-"; + t << "\\_"; if (!insideTabbing) t << "\\-"; break; case '{': t << "\\{"; break; @@ -6046,7 +6056,10 @@ void filterLatexString(FTextStream &t,const char *str, break; default: - if (!insideTabbing && forceBreaks && c!=' ' && *p!=' ') + //if (!insideTabbing && forceBreaks && c!=' ' && *p!=' ') + if (!insideTabbing && + ((c>='A' && c<='Z' && pc!=' ') || (c==':' && pc!=':') || (pc=='.' && isId(c))) + ) { t << "\\-"; } @@ -6239,25 +6252,25 @@ static struct Lang2ExtMap g_lang2extMap[] = { // language parser parser option - { "idl", "c", SrcLangExt_IDL }, - { "java", "c", SrcLangExt_Java }, - { "javascript", "c", SrcLangExt_JS }, - { "csharp", "c", SrcLangExt_CSharp }, - { "d", "c", SrcLangExt_D }, - { "php", "c", SrcLangExt_PHP }, - { "objective-c", "c", SrcLangExt_ObjC }, - { "c", "c", SrcLangExt_Cpp }, - { "c++", "c", SrcLangExt_Cpp }, - { "python", "python", SrcLangExt_Python }, - { "fortran", "fortran", SrcLangExt_F90 }, - { "vhdl", "vhdl", SrcLangExt_VHDL }, - { "dbusxml", "dbusxml", SrcLangExt_XML }, - { 0, 0, (SrcLangExt)0 } + { "idl", "c", SrcLangExt_IDL }, + { "java", "c", SrcLangExt_Java }, + { "javascript", "c", SrcLangExt_JS }, + { "csharp", "c", SrcLangExt_CSharp }, + { "d", "c", SrcLangExt_D }, + { "php", "c", SrcLangExt_PHP }, + { "objective-c", "c", SrcLangExt_ObjC }, + { "c", "c", SrcLangExt_Cpp }, + { "c++", "c", SrcLangExt_Cpp }, + { "python", "python", SrcLangExt_Python }, + { "fortran", "fortran", SrcLangExt_Fortran }, + { "vhdl", "vhdl", SrcLangExt_VHDL }, + { "dbusxml", "dbusxml", SrcLangExt_XML }, + { "tcl", "tcl", SrcLangExt_Tcl }, + { 0, 0, (SrcLangExt)0 } }; bool updateLanguageMapping(const QCString &extension,const QCString &language) { - //getLanguageFromFileName("dummy"); // force initialization of the g_extLookup map const Lang2ExtMap *p = g_lang2extMap; QCString langName = language.lower(); while (p->langName) @@ -6316,6 +6329,7 @@ void initDefaultExtensionMapping() updateLanguageMapping(".f90", "fortran"); updateLanguageMapping(".vhd", "vhdl"); updateLanguageMapping(".vhdl", "vhdl"); + updateLanguageMapping(".tcl", "tcl"); //updateLanguageMapping(".xml", "dbusxml"); } @@ -6609,8 +6623,8 @@ static QCString replaceAliasArgument(const QCString &aliasValue,int paramNum, result = substitute(result,"\\{","{"); result = substitute(result,"\\}","}"); result = expandAliasRec(substitute(result,"\\,",",")); - printf("replaceAliasArgument('%s',%d,'%s')->%s\n", - aliasValue.data(),paramNum,paramValue.data(),result.data()); + //printf("replaceAliasArgument('%s',%d,'%s')->%s\n", + // aliasValue.data(),paramNum,paramValue.data(),result.data()); return result; } @@ -6820,7 +6834,7 @@ bool readInputFile(const char *fileName,BufStr &inBuf) } int start=0; - if (inBuf.size()>=2 && + if (size>=2 && ((inBuf.at(0)==-1 && inBuf.at(1)==-2) || // Litte endian BOM (inBuf.at(0)==-2 && inBuf.at(1)==-1) // big endian BOM ) @@ -6829,13 +6843,12 @@ bool readInputFile(const char *fileName,BufStr &inBuf) transcodeCharacterBuffer(fileName,inBuf,inBuf.curPos(), "UCS-2","UTF-8"); } - else if (inBuf.size()>=3 && + else if (size>=3 && (uchar)inBuf.at(0)==0xEF && (uchar)inBuf.at(1)==0xBB && (uchar)inBuf.at(2)==0xBF - ) + ) // UTF-8 encoded file { - // UTF-8 encoded file inBuf.dropFromStart(3); // remove UTF-8 BOM: no translation needed } else // transcode according to the INPUT_ENCODING setting @@ -6961,6 +6974,9 @@ QCString externalRef(const QCString &relPath,const QCString &ref,bool href) return result; } +/** Writes the intensity only bitmap representated by \a data as an image to + * directory \a dir using the colors defined by HTML_COLORSTYLE_*. + */ void writeColoredImgData(const char *dir,ColoredImgDataItem data[]) { static int hue = Config_getInt("HTML_COLORSTYLE_HUE"); @@ -6986,6 +7002,11 @@ void writeColoredImgData(const char *dir,ColoredImgDataItem data[]) } } +/** Replaces any markers of the form \#\#AA in input string \a str + * by new markers of the form \#AABBCC, where \#AABBCC represents a + * valid color, based on the intensity represented by hex number AA + * and the current HTML_COLORSTYLE_* settings. + */ QCString replaceColorMarkers(const char *str) { QCString result; @@ -7030,6 +7051,9 @@ QCString replaceColorMarkers(const char *str) return result; } +/** Copies the contents of file with name \a src to the newly created + * file with name \a dest. Returns TRUE if successful. + */ bool copyFile(const QCString &src,const QCString &dest) { QFile sf(src); @@ -7059,3 +7083,82 @@ bool copyFile(const QCString &src,const QCString &dest) return TRUE; } +/** Returns the section of text, in between a pair of markers. + * Full lines are returned, excluding the lines on which the markers appear. + */ +QCString extractBlock(const QCString text,const QCString marker) +{ + QCString result; + int p=0,i; + bool found=FALSE; + + // find the character positions of the markers + int m1 = text.find(marker); + if (m1==-1) return result; + int m2 = text.find(marker,m1+marker.length()); + if (m2==-1) return result; + + // find start and end line positions for the markers + int l1=-1,l2=-1; + while (!found && (i=text.find('\n',p))!=-1) + { + found = (p<=m1 && m1<i); // found the line with the start marker + p=i+1; + } + l1=p; + if (found) + { + while ((i=text.find('\n',p))!=-1) + { + if (p<=m2 && m2<i) // found the line with the end marker + { + l2=p; + break; + } + p=i+1; + } + } + //printf("text=[%s]\n",text.mid(l1,l2-l1).data()); + return text.mid(l1,l2-l1); +} + +/** Returns a string representation of \a lang. */ +QCString langToString(SrcLangExt lang) +{ + switch(lang) + { + case SrcLangExt_Unknown: return "Unknown"; + case SrcLangExt_IDL: return "IDL"; + case SrcLangExt_Java: return "Java"; + case SrcLangExt_CSharp: return "C#"; + case SrcLangExt_D: return "D"; + case SrcLangExt_PHP: return "PHP"; + case SrcLangExt_ObjC: return "Objective-C"; + case SrcLangExt_Cpp: return "C++"; + case SrcLangExt_JS: return "Javascript"; + case SrcLangExt_Python: return "Python"; + case SrcLangExt_Fortran: return "Fortran"; + case SrcLangExt_VHDL: return "VHDL"; + case SrcLangExt_XML: return "XML"; + case SrcLangExt_Tcl: return "Tcl"; + } + return "Unknown"; +} + +/** Returns the scope separator to use given the programming language \a lang */ +QCString getLanguageSpecificSeparator(SrcLangExt lang) +{ + if (lang==SrcLangExt_Java || lang==SrcLangExt_CSharp || lang==SrcLangExt_VHDL) + { + return "."; + } + else if (lang==SrcLangExt_PHP) + { + return "\\"; + } + else + { + return "::"; + } +} + |