summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cite.cpp142
1 files changed, 64 insertions, 78 deletions
diff --git a/src/cite.cpp b/src/cite.cpp
index f0580ed..a1b964a 100644
--- a/src/cite.cpp
+++ b/src/cite.cpp
@@ -37,6 +37,8 @@ static const char *bib2xhtml_pl =
const QCString CiteConsts::fileName("citelist");
const QCString CiteConsts::anchorPrefix("CITEREF_");
+const QCString bibTmpFile("bibTmpFile_");
+const QCString bibTmpDir("bibTmpDir/");
//--------------------------------------------------------------------------
@@ -45,51 +47,6 @@ CiteDict::CiteDict(int size) : m_entries(size, FALSE)
m_entries.setAutoDelete(TRUE);
}
-static QCString getListOfBibFiles(const QCString &sep,bool namesOnly)
-{
- QCString result;
- QStrList &citeDataList = Config_getList("CITE_BIB_FILES");
- const char *bibdata = citeDataList.first();
- while (bibdata)
- {
- int i;
- QCString bibFile = bibdata;
- if (namesOnly && bibFile.right(4)==".bib") // strip extension
- {
- bibFile = bibFile.left(bibFile.length()-4);
- }
- else
- {
- if (!namesOnly && bibFile.right(4)!=".bib") bibFile += ".bib";
- }
- if ((i=bibFile.findRev('/'))!=-1) // strip path
- {
- bibFile = bibFile.mid(i+1);
- }
- if (!bibFile.isEmpty())
- {
- if (namesOnly) // bare names
- {
- result+=bibFile;
- }
- else // add quotes for paths with spaces
- {
- result+="\""+bibFile+"\"";
- }
- bibdata = citeDataList.next();
- if (bibdata)
- {
- result+=sep;
- }
- }
- else
- {
- bibdata = citeDataList.next();
- }
- }
- return result;
-}
-
void CiteDict::writeLatexBibliography(FTextStream &t)
{
if (m_entries.isEmpty())
@@ -108,7 +65,29 @@ void CiteDict::writeLatexBibliography(FTextStream &t)
"\\phantomsection\n"
"\\addcontentsline{toc}{" << unit << "}{" << theTranslator->trCiteReferences() << "}\n"
"\\bibliographystyle{" << style << "}\n"
- "\\bibliography{" << getListOfBibFiles(",",TRUE) << "}\n"
+ "\\bibliography{";
+ QStrList &citeDataList = Config_getList("CITE_BIB_FILES");
+ QCString latexOutputDir = Config_getString("LATEX_OUTPUT")+"/";
+ int i = 0;
+ const char *bibdata = citeDataList.first();
+ while (bibdata)
+ {
+ QCString bibFile = bibdata;
+ // Note: file can now have multiple dots
+ if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib";
+ QFileInfo fi(bibFile);
+ if (fi.exists())
+ {
+ if (!bibFile.isEmpty())
+ {
+ if (i) t << ",";
+ i++;
+ t << bibTmpFile << QString().setNum(i);
+ }
+ }
+ bibdata = citeDataList.next();
+ }
+ t << "}\n"
"\n";
}
@@ -186,39 +165,37 @@ void CiteDict::generatePage() const
f.writeBlock(bstData, bstData.length());
f.close();
- // 4. for html we just copy the bib files to the output so that
- // bibtex can find them without path (bibtex doesn't support path's
- // with spaces!)
- QList<QCString> tempFiles;
- tempFiles.setAutoDelete(TRUE);
+ // 4. for all formats we just copy the bib files to as special output directory
+ // s bibtex can find them without path (bibtex doesn't support paths or
+ // filenames with spaces!)
+ // Strictly not required when only latex is generated
+ // copy bib files to the latex output dir
+ QStrList &citeDataList = Config_getList("CITE_BIB_FILES");
+ QCString bibOutputDir = outputDir+"/"+bibTmpDir;
+ QCString bibOutputFiles = "";
QDir thisDir;
- if (Config_getBool("GENERATE_HTML"))
+ thisDir.mkdir(bibOutputDir);
+ const char *bibdata = citeDataList.first();
+ int i = 0;
+ while (bibdata)
{
- // copy bib files to the latex output dir
- QStrList &citeDataList = Config_getList("CITE_BIB_FILES");
- QCString bibOutputDir = outputDir+"/";
- QFileInfo fo(bibOutputDir);
- const char *bibdata = citeDataList.first();
- while (bibdata)
+ QCString bibFile = bibdata;
+ if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib";
+ QFileInfo fi(bibFile);
+ if (fi.exists())
{
- QCString bibFile = bibdata;
- if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib";
- QFileInfo fi(bibFile);
- if (fi.exists() && fi.dirPath(TRUE)!=fo.absFilePath())
- {
- if (!bibFile.isEmpty())
- {
- QCString destFile=bibOutputDir+fi.fileName().data();
- copyFile(bibFile,destFile);
- tempFiles.append(new QCString(destFile));
- }
- }
- else if (!fi.exists())
+ if (!bibFile.isEmpty())
{
- err("bib file %s not found!\n",bibFile.data());
+ ++i;
+ copyFile(bibFile,bibOutputDir + bibTmpFile + QCString().setNum(i) + ".bib");
+ bibOutputFiles = bibOutputFiles + " " + bibTmpDir + bibTmpFile + QCString().setNum(i) + ".bib";
}
- bibdata = citeDataList.next();
}
+ else if (!fi.exists())
+ {
+ err("bib file %s not found!\n",bibFile.data());
+ }
+ bibdata = citeDataList.next();
}
QCString oldDir = QDir::currentDirPath().utf8();
@@ -226,7 +203,7 @@ void CiteDict::generatePage() const
// 5. run bib2xhtml perl script on the generated file which will insert the
// bibliography in citelist.doc
- portable_system("perl","\""+bib2xhtmlFile+"\" "+getListOfBibFiles(" ",FALSE)+" \""+
+ portable_system("perl","\""+bib2xhtmlFile+"\" "+bibOutputFiles+" \""+
citeListFile+"\"");
QDir::setCurrent(oldDir);
@@ -288,17 +265,22 @@ void CiteDict::generatePage() const
// copy bib files to the latex output dir
QStrList &citeDataList = Config_getList("CITE_BIB_FILES");
QCString latexOutputDir = Config_getString("LATEX_OUTPUT")+"/";
+ int i = 0;
const char *bibdata = citeDataList.first();
while (bibdata)
{
QCString bibFile = bibdata;
+ // Note: file can now have multiple dots
if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib";
QFileInfo fi(bibFile);
if (fi.exists())
{
if (!bibFile.isEmpty())
{
- copyFile(bibFile,latexOutputDir+fi.fileName().data());
+ // bug_700510, multile times the same name were overwriting; creating new names
+ // also for names with spaces
+ ++i;
+ copyFile(bibFile,latexOutputDir + bibTmpFile + QCString().setNum(i) + ".bib");
}
}
else
@@ -313,10 +295,14 @@ void CiteDict::generatePage() const
thisDir.remove(citeListFile);
thisDir.remove(doxygenBstFile);
thisDir.remove(bib2xhtmlFile);
- while (!tempFiles.isEmpty())
+ bibdata = citeDataList.first();
+ // we might try to remove too many files as empty files didn't get a coresponding new file
+ // but the remove function does not emit an error for it and we don't catch the error return
+ // so no problem.
+ for (unsigned int j = 1; j <= citeDataList.count(); j++)
{
- QCString *s=tempFiles.take(0);
- thisDir.remove(*s);
+ thisDir.remove(bibOutputDir + bibTmpFile + QCString().setNum(j) + ".bib");
}
+ thisDir.rmdir(bibOutputDir);
}