21#include <unordered_map>
65 case TIMESTAMP_t::YES:
66 case TIMESTAMP_t::DATETIME:
67 result.
sprintf(
"\\yr%d\\mo%d\\dy%d\\hr%d\\min%d\\sec%d",
68 tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday,
69 tm.tm_hour, tm.tm_min, tm.tm_sec);
71 case TIMESTAMP_t::DATE:
72 result.
sprintf(
"\\yr%d\\mo%d\\dy%d",
73 tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday);
78 return "{\\creatim " + result +
"}\n";
87 const char *p=str.
data();
94 case '{': result +=
"\\{";
break;
95 case '}': result +=
"\\}";
break;
96 case '\\': result +=
"\\\\";
break;
97 default: result += c;
break;
107 result+=
static_cast<char>(i+
'0');
138 *
m_t <<
"{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
141 *
m_t <<
"}{\\fldrslt {\\cs37\\ul\\cf2 ";
161 const char *p=str.
data();
173 int spacesToNextTabStop = tabSize - (
m_col%tabSize);
174 while (spacesToNextTabStop--)
184 case '\n': *
m_t <<
"\\par\n";
187 case '{': *
m_t <<
"\\{";
m_col++;
break;
188 case '}': *
m_t <<
"\\}";
m_col++;
break;
189 case '\\': *
m_t <<
"\\\\";
m_col++;
break;
219 DBG_RTF(*
m_t <<
"{\\comment (startCodeFragment) }\n")
232 DBG_RTF(*
m_t <<
"{\\comment (endCodeFragment) }\n")
251 lineAnchor.
sprintf(
"_l%05d",l);
254 bool showTarget = rtfHyperlinks && !lineAnchor.
isEmpty() && writeLineAnchor;
257 *
m_t <<
"{\\bkmkstart ";
260 *
m_t <<
"{\\bkmkend ";
299 static const std::unordered_map<std::string,int> map {
301 {
"keywordtype", 18 },
302 {
"keywordflow", 19 },
304 {
"preprocessor", 21 },
305 {
"stringliteral", 22 },
306 {
"charliteral", 23 },
309 {
"vhdlkeyword", 26 },
312 auto it = map.find(name.
str());
317 *
m_t <<
"{\\cf" << cod <<
" ";
396 t <<
"# Generated by doxygen " << getDoxygenVersion() <<
"\n\n";
397 t <<
"# This file describes styles used for generating RTF output.\n";
398 t <<
"# All text after a hash (#) is considered a comment and will be ignored.\n";
399 t <<
"# Remove a hash to activate a line.\n\n";
411 t <<
"# Generated by doxygen " << getDoxygenVersion() <<
"\n\n";
412 t <<
"# This file describes extensions used for generating RTF output.\n";
413 t <<
"# All text after a hash (#) is considered a comment and will be ignored.\n";
414 t <<
"# Remove a hash to activate a line.\n\n";
416 t <<
"# Overrides the project title.\n";
418 t <<
"#Title = \n\n";
420 t <<
"# Name of the company that produced this document.\n";
421 t <<
"#Company = \n\n";
423 t <<
"# Filename of a company or project logo.\n";
424 t <<
"#LogoFilename = \n\n";
426 t <<
"# Author of the document.\n";
427 t <<
"#Author = \n\n";
429 t <<
"# Type of document (e.g. Design Specification, User Manual, etc.).\n";
430 t <<
"#DocumentType = \n\n";
432 t <<
"# Document tracking number.\n";
433 t <<
"#DocumentId = \n\n";
435 t <<
"# Name of the author's manager.\n";
436 t <<
"# This field is not displayed in the document itself, but it is \n";
437 t <<
"# available in the information block of the rtf file. In Microsoft \n";
438 t <<
"# Word, it is available under File:Properties.\n";
439 t <<
"#Manager = \n\n";
441 t <<
"# Subject of the document.\n";
442 t <<
"# This field is not displayed in the document itself, but it is \n";
443 t <<
"# available in the information block of the rtf file. In Microsoft \n";
444 t <<
"# Word, it is available under File:Properties.\n";
445 t <<
"#Subject = \n\n";
447 t <<
"# Comments regarding the document.\n";
448 t <<
"# This field is not displayed in the document itself, but it is \n";
449 t <<
"# available in the information block of the rtf file. In Microsoft \n";
450 t <<
"# Word, it is available under File:Properties.\n";
451 t <<
"#Comments = \n\n";
453 t <<
"# Keywords associated with the document.\n";
454 t <<
"# This field is not displayed in the document itself, but it is \n";
455 t <<
"# available in the information block of the rtf file. In Microsoft \n";
456 t <<
"# Word, it is available under File:Properties.\n";
457 t <<
"#Keywords = \n\n";
467 term(
"Could not create output directory {}\n",
dir);
476 err(
"Internal: rtf_Style_Default[{}] has no definition.\n", def->
name);
487 if (!rtfStyleSheetFile.
isEmpty())
494 if (!rtfExtensionsFile.
isEmpty())
503 err(
"Logo '{}' specified by 'LogoFilename' in the rtf extension file '{}' does not exist!\n",
532 m_t <<
"\\uc1 \\deff0\\deflang1033\\deflangfe1033\n";
534 DBG_RTF(
m_t <<
"{\\comment Beginning font list}\n")
535 m_t <<
"{\\fonttbl ";
537 m_t <<
"\\fprq2{\\*\\panose 02020603050405020304}Times New Roman;}\n";
539 m_t <<
"\\fprq2{\\*\\panose 020b0604020202020204}Arial;}\n";
541 m_t <<
"\\fprq1{\\*\\panose 02070309020205020404}Courier New;}\n";
542 m_t <<
"{\\f3\\froman\\fcharset2\\fprq2{\\*\\panose 05050102010706020507}Symbol;}\n";
545 m_t <<
"{\\colortbl;";
546 m_t <<
"\\red0\\green0\\blue0;";
547 m_t <<
"\\red0\\green0\\blue255;";
548 m_t <<
"\\red0\\green255\\blue255;";
549 m_t <<
"\\red0\\green255\\blue0;";
550 m_t <<
"\\red255\\green0\\blue255;";
551 m_t <<
"\\red255\\green0\\blue0;";
552 m_t <<
"\\red255\\green255\\blue0;";
553 m_t <<
"\\red255\\green255\\blue255;";
554 m_t <<
"\\red0\\green0\\blue128;";
555 m_t <<
"\\red0\\green128\\blue128;";
556 m_t <<
"\\red0\\green128\\blue0;";
557 m_t <<
"\\red128\\green0\\blue128;";
558 m_t <<
"\\red128\\green0\\blue0;";
559 m_t <<
"\\red128\\green128\\blue0;";
560 m_t <<
"\\red128\\green128\\blue128;";
561 m_t <<
"\\red192\\green192\\blue192;";
564 m_t <<
"\\red0\\green128\\blue0;";
565 m_t <<
"\\red96\\green64\\blue32;";
566 m_t <<
"\\rede0\\green128\\blue0;";
567 m_t <<
"\\red128\\green0\\blue0;";
568 m_t <<
"\\red128\\green96\\blue32;";
569 m_t <<
"\\red0\\green32\\blue128;";
570 m_t <<
"\\red0\\green128\\blue128;";
571 m_t <<
"\\red255\\green0\\blue255;";
572 m_t <<
"\\red0\\green0\\blue0;";
573 m_t <<
"\\red112\\green0\\blue112;";
574 m_t <<
"\\red255\\green0\\blue0;";
578 DBG_RTF(
m_t <<
"{\\comment Beginning style list}\n")
579 m_t <<
"{\\stylesheet\n";
580 m_t <<
"{\\widctlpar\\adjustright \\fs20\\cgrid \\snext0 Normal;}\n";
588 case PAPER_TYPE_t::a4:
m_t <<
"\\paperw11900\\paperh16840";
break;
589 case PAPER_TYPE_t::letter:
m_t <<
"\\paperw12240\\paperh15840";
break;
590 case PAPER_TYPE_t::legal:
m_t <<
"\\paperw12240\\paperh20160";
break;
591 case PAPER_TYPE_t::executive:
m_t <<
"\\paperw10440\\paperh15120";
break;
593 m_t <<
"\\margl1800\\margr1800\\margt1440\\margb1440\\gutter0\\ltrsect}\n";
596 unsigned maxIndex = 0;
597 for (
const auto &[name,data] :
rtf_Style)
599 uint32_t index = data.index();
600 if (index > maxIndex) maxIndex = index;
602 std::vector<const StyleData*> array(maxIndex + 1,
nullptr);
603 ASSERT(maxIndex < array.size());
605 for (
const auto &[name,data] :
rtf_Style)
607 uint32_t index = data.index();
608 if (array[index] !=
nullptr)
610 err(
"Style '{}' redefines \\s{}.\n", name, index);
612 array[index] = &data;
616 size_t size = array.size();
617 for(
size_t i = 0; i < size; i++)
630 m_t <<
"{\\*\\listtable" <<
"\n";
637 m_t <<
"\\listid" <<
id <<
"}" <<
"\n";
644 m_t <<
"\\listid" <<
id <<
"}" <<
"\n";
646 m_t <<
"{\\listoverridetable" <<
"\n";
653 m_t <<
"{\\listoverride\\listid" <<
id <<
"\\listoverridecount0\\ls" <<
id <<
"}" <<
"\n";
659 m_t <<
"{\\comment begin body}\n";
666 DBG_RTF(
m_t <<
"{\\comment BeginRTFChapter}\n")
673 m_t <<
"\\sect\\sbknone\n";
677 m_t <<
"\\sect\\sbkpage\n";
686 DBG_RTF(
m_t <<
"{\\comment BeginRTFSection}\n")
692 m_t <<
"\\sect\\sbknone\n";
697 m_t <<
"\\sect\\sbkpage\n";
729 DBG_RTF(
m_t <<
"{\\comment startProjectNumber }\n")
735 DBG_RTF(
m_t <<
"{\\comment endProjectNumber }\n")
751 m_t <<
"{\\title {\\comment ";
762 m_t <<
"{\\comment ";
790 DBG_RTF(
m_t <<
"{\\comment start classhierarchy}\n")
810 if (!gd->isReference())
823 if (!mod->isReference() && mod->isPrimaryInterface())
836 if (dd->isLinkableInProject())
849 if (nd->isLinkableInProject())
862 if (cd->isLinkableInProject())
875 if (cd->isLinkableInProject() &&
876 !cd->isImplicitTemplateInstance() &&
877 !cd->isEmbeddedInOuterScope() &&
893 for (
const auto &fd : *fn)
895 if (fd->isLinkableInProject() || fd->generateSourceFile())
940 m_t <<
"}" << projectName;
944 m_t <<
" doxygen " << getDoxygenVersion() <<
".}\n";
946 DBG_RTF(
m_t <<
"{\\comment end of infoblock}\n");
950 m_t <<
"\\sectd\\pgnlcrm\n";
951 m_t <<
"{\\footer "<<
rtf_Style[
"Footer"].reference() <<
"{\\chpgn}}\n";
953 DBG_RTF(
m_t <<
"{\\comment begin title page}\n")
958 m_t <<
"\\vertalc\\qc\\par\\par\\par\\par\\par\\par\\par\n";
962 m_t <<
"\" \\\\d \\\\*MERGEFORMAT} {\\fldrslt IMAGE }}\\par\\par\n";
973 m_t <<
"{\\field\\fldedit {\\*\\fldinst TITLE \\\\*MERGEFORMAT}{\\fldrslt " <<
rtf_title <<
"}}\\par\n";
981 m_t <<
"{\\field\\fldedit {\\*\\fldinst TITLE \\\\*MERGEFORMAT}{\\fldrslt ";
982 writeDoc(ast.get(),
nullptr,
nullptr,0);
997 m_t <<
"\\par\\par\\par\\par\\par\\par\\par\\par\\par\\par\\par\\par\n";
1002 m_t <<
"{\\field\\fldedit {\\*\\fldinst AUTHOR \\\\*MERGEFORMAT}{\\fldrslt "<<
rtf_author <<
" }}\\par\n";
1006 m_t <<
"{\\field\\fldedit {\\*\\fldinst AUTHOR \\\\*MERGEFORMAT}{\\fldrslt AUTHOR}}\\par\n";
1012 case TIMESTAMP_t::YES:
1013 case TIMESTAMP_t::DATETIME:
1014 m_t <<
"{\\field\\fldedit {\\*\\fldinst CREATEDATE \\\\*MERGEFORMAT}"
1017 case TIMESTAMP_t::DATE:
1018 m_t <<
"{\\field\\fldedit {\\*\\fldinst CREATEDATE \\\\*MERGEFORMAT}"
1021 case TIMESTAMP_t::NO:
1024 m_t <<
"\\page\\page";
1025 DBG_RTF(
m_t <<
"{\\comment End title page}\n")
1028 DBG_RTF(
m_t <<
"{\\comment Table of contents}\n")
1029 m_t <<
"\\vertalt\n";
1034 m_t <<
"{\\field\\fldedit {\\*\\fldinst TOC \\\\f \\\\*MERGEFORMAT}{\\fldrslt Table of contents}}\\par\n";
1047 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"topics.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1052 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"modules.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1057 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"dirs.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1070 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"namespaces.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1075 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"concepts.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1080 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"hierarchy.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1096 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"annotated.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1101 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"files.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1106 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"pages.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1113 if (!gd->isReference() && !gd->isASubGroup())
1125 if (!mod->isReference() && mod->isPrimaryInterface())
1138 if (dd->isLinkableInProject())
1146 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
1147 m_t << dd->getOutputFileBase();
1148 m_t <<
".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1158 if (nd->isLinkableInProject() && !nd->isAlias())
1166 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
1167 m_t << nd->getOutputFileBase();
1168 m_t <<
".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1178 if (cd->isLinkableInProject() && !cd->isAlias())
1186 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
1187 m_t << cd->getOutputFileBase();
1188 m_t <<
".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1206 if (cd->isLinkableInProject() &&
1207 !cd->isImplicitTemplateInstance() &&
1208 !cd->isEmbeddedInOuterScope() &&
1218 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
1219 m_t << cd->getOutputFileBase();
1220 m_t <<
".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1232 for (
const auto &fd : *fn)
1234 if (fd->isLinkableInProject())
1242 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
1243 m_t << fd->getOutputFileBase();
1244 m_t <<
".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1246 if (fd->generateSourceFile())
1254 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
1255 m_t << fd->getSourceFileBase();
1256 m_t <<
".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1275 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
1276 m_t << pd->getOutputFileBase();
1277 m_t <<
".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1286 if (!pd->getGroupDef() && !pd->isReference() && !pd->hasParentPage()
1302 m_t <<
"{\\field\\fldedit {\\*\\fldinst INDEX \\\\c2 \\\\*MERGEFORMAT}{\\fldrslt INDEX}}\n";
1311 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
1313 m_t <<
".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1318 DBG_RTF(
m_t <<
"{\\comment Beginning Body of RTF Document}\n")
1320 m_t <<
"\\sect \\sbkpage \\pgndec \\pgnrestart\n";
1321 m_t <<
"\\sect \\sectd \\sbknone\n";
1324 m_t <<
"{\\footer "<<
rtf_Style[
"Footer"].reference() <<
"{\\chpgn}}\n";
1334 DBG_RTF(
m_t <<
"{\\comment (lineBreak)}" <<
"\n")
1346 DBG_RTF(
m_t <<
"{\\comment (startIndexList)}\n")
1356 DBG_RTF(
m_t <<
"{\\comment (endIndexList)}\n")
1372 DBG_RTF(
m_t <<
"{\\comment (startItemList level=" << level <<
") }\n")
1392 DBG_RTF(
m_t <<
"{\\comment (startItemListItem)}\n")
1411 DBG_RTF(
m_t <<
"{\\comment (endItemListItem)}\n")
1416 DBG_RTF(
m_t <<
"{\\comment (startIndexItem)}\n")
1427 DBG_RTF(
m_t <<
"{\\comment (endIndexItem)}\n")
1444 DBG_RTF(
m_t <<
"{\\comment (writeStartAnnoItem)}\n")
1449 m_t <<
"{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
1452 m_t <<
"}{\\fldrslt {\\cs37\\ul\\cf2 ";
1467 DBG_RTF(
m_t <<
"{\\comment (startIndexKey)}\n")
1473 DBG_RTF(
m_t <<
"{\\comment (endIndexKey)}\n")
1478 DBG_RTF(
m_t <<
"{\\comment (startIndexValue)}\n")
1480 if (hasBrief)
m_t <<
"(";
1485 DBG_RTF(
m_t <<
"{\\comment (endIndexValue)}\n")
1486 if (hasBrief)
m_t <<
")";
1506 DBG_RTF(
m_t <<
"{\\comment Begin SubSubSection}\n")
1533 m_t <<
"{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
1536 m_t <<
"}{\\fldrslt {\\cs37\\ul\\cf2 ";
1565 result +=
"{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
1568 result +=
"}{\\fldrslt {\\cs37\\ul\\cf2 ";
1614 DBG_RTF(
m_t <<
"{\\comment startTitleHead}\n")
1617 heading.
sprintf(
"Heading%d", level);
1630 m_t <<
"{\\tc\\tcl" << level <<
" \\v ";
1645 DBG_RTF(
m_t <<
"{\\comment startGroupHeader}\n")
1652 else if (extraIndent==1)
1665 DBG_RTF(
m_t <<
"{\\comment endGroupHeader}\n")
1678 DBG_RTF(
m_t <<
"{\\comment startMemberDoc}\n")
1679 if (!memname.
isEmpty() && memname[0]!=
'@')
1716 DBG_RTF(
m_t <<
"{\\comment startDoxyAnchor}\n")
1732 DBG_RTF(
m_t <<
"{\\comment endDoxyAnchor}\n")
1733 m_t <<
"{\\bkmkstart ";
1736 m_t <<
"{\\bkmkend ";
1751 m_t <<
"{\\xe \\v ";
1765 DBG_RTF(
m_t <<
"{\\comment (startIndent) }\n")
1779 DBG_RTF(
m_t <<
"{\\comment (startMemberDescription)}\n")
1788 DBG_RTF(
m_t <<
"{\\comment (endMemberDescription)}\n")
1798 DBG_RTF(
m_t <<
"{\\comment (startDescForItem) }\n")
1803 DBG_RTF(
m_t <<
"{\\comment (endDescForItem) }\n")
1808 DBG_RTF(
m_t <<
"{\\comment (startSection)}\n")
1812 switch(
type.level())
1821 default:
ASSERT(0);
break;
1825 heading.
sprintf(
"Heading%d",num);
1829 m_t <<
"{\\tc\\tcl" << num <<
" \\v ";
1861 DBG_RTF(
m_t <<
"{\\comment startClassDiagram }\n")
1875 m_t <<
"\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
1877 m_t <<
" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par\n";
1883 DBG_RTF(
m_t <<
"{\\comment startMemberItem }\n")
1889 DBG_RTF(
m_t <<
"{\\comment endMemberItem }\n")
1910 DBG_RTF(
m_t <<
"{\\comment writeAnchor (" << anchor <<
")}\n")
1917 m_t <<
"{\\field\\fldedit {\\*\\fldinst PAGEREF ";
1919 m_t <<
" \\\\*MERGEFORMAT}{\\fldrslt pagenum}}";
1931 DBG_RTF(
m_t <<
"{\\comment (startMemberList) }\n")
1935 m_t <<
"\\begin{CompactItemize}\n";
1941 DBG_RTF(
m_t <<
"{\\comment (endMemberList) }\n")
1945 m_t <<
"\\end{CompactItemize}\n";
1951 DBG_RTF(
m_t <<
"{\\comment (startDescTable) }\n")
1953 m_t <<
"{" <<
rtf_Style[
"Heading5"].reference() <<
"\n";
1957 m_t <<
"\\trowd \\trgaph108\\trleft426\\tblind426"
1958 "\\trbrdrt\\brdrs\\brdrw10\\brdrcf15 "
1959 "\\trbrdrl\\brdrs\\brdrw10\\brdrcf15 "
1960 "\\trbrdrb\\brdrs\\brdrw10\\brdrcf15 "
1961 "\\trbrdrr\\brdrs\\brdrw10\\brdrcf15 "
1962 "\\trbrdrh\\brdrs\\brdrw10\\brdrcf15 "
1963 "\\trbrdrv\\brdrs\\brdrw10\\brdrcf15 \n";
1964 int columnPos2[2] = { 25, 100 };
1965 int columnPos3[3] = { 25, 45, 100 };
1966 for (
int i=0;i<(hasInits?3:2);i++)
1968 m_t <<
"\\clvertalt\\clbrdrt\\brdrs\\brdrw10\\brdrcf15 "
1969 "\\clbrdrl\\brdrs\\brdrw10\\brdrcf15 "
1970 "\\clbrdrb\\brdrs\\brdrw10\\brdrcf15 "
1971 "\\clbrdrr \\brdrs\\brdrw10\\brdrcf15 "
1973 "\\cellx" << (
rtf_pageWidth*(hasInits?columnPos3[i]:columnPos2[i])/100) <<
"\n";
1975 m_t <<
"\\pard \\widctlpar\\intbl\\adjustright\n";
1980 DBG_RTF(
m_t <<
"{\\comment (endDescTable)}\n")
1994 DBG_RTF(
m_t <<
"{\\comment (startDescTableTitle) }\n")
2001 DBG_RTF(
m_t <<
"{\\comment (endDescTableTitle) }\n")
2007 DBG_RTF(
m_t <<
"{\\comment (startDescTableInit) }" << endl)
2015 DBG_RTF(
m_t <<
"{\\comment (endDescTableInit) }" << endl)
2021 DBG_RTF(
m_t <<
"{\\comment (startDescTableData) }\n")
2027 DBG_RTF(
m_t <<
"{\\comment (endDescTableData) }\n")
2028 m_t <<
"\\cell }{\\row }\n";
2045 err(
"Maximum indent level ({}) exceeded while generating RTF output!\n",m);
2055 err(
"Negative indent level while generating RTF output!\n");
2097 DBG_RTF(
m_t <<
"{\\comment startTextBlock}\n")
2122 DBG_RTF(
m_t <<
"{\\comment (newParagraph)}\n")
2130 DBG_RTF(
m_t <<
"{\\comment startParagraph}\n")
2133 if (
QCString(txt) ==
"reference")
m_t <<
"\\ql\n";
2145 DBG_RTF(
m_t <<
"{\\comment startMemberSubtitle}\n")
2152 DBG_RTF(
m_t <<
"{\\comment endMemberSubtitle}\n")
2163 if (codePage ==
"932")
2165 result = (0x81<=c && c<=0x9f) || (0xe0<=c && c<=0xfc);
2167 else if (codePage ==
"936")
2169 result = 0x81<=c && c<=0xFE;
2171 else if (codePage ==
"949")
2173 result = 0x81<=c && c<=0xFE;
2175 else if (codePage ==
"950")
2177 result = 0x81<=c && c<=0xFE;
2187 if (s==
nullptr)
return;
2189 bool converted=
FALSE;
2191 static std::vector<char> enc;
2192 if (l*4>enc.size()) enc.resize(l*4);
2198 if (cd!=
reinterpret_cast<void *
>(-1))
2201 size_t oLeft=enc.size();
2202 const char *inputPtr = s.
data();
2203 char *outputPtr = &enc[0];
2206 enc.resize(enc.size()-oLeft);
2214 memcpy(enc.data(),s.
data(),l);
2217 bool multiByte =
FALSE;
2219 for (
size_t i=0;i<enc.size();i++)
2221 uint8_t c =
static_cast<uint8_t
>(enc.at(i));
2223 if (c>=0x80 || multiByte)
2255 err(
"problems opening rtf file '{}' for reading\n",infName);
2259 const int maxLineLength = 10240;
2267 while (getline(f,line))
2270 if (line.find(
"\\comment begin body")!=std::string::npos)
break;
2274 std::string prevLine;
2276 while (getline(f,line))
2279 size_t pos=prevLine.find(
"INCLUDETEXT \"");
2280 if (pos!=std::string::npos)
2282 size_t startNamePos = prevLine.find(
'"',pos)+1;
2283 size_t endNamePos = prevLine.find(
'"',startNamePos);
2284 std::string fileName = prevLine.substr(startNamePos,endNamePos-startNamePos);
2285 DBG_RTF(t <<
"{\\comment begin include " << fileName <<
"}\n")
2287 DBG_RTF(t <<
"{\\comment end include " << fileName <<
"}\n")
2296 if (!bIncludeHeader)
2298 size_t pos = line.rfind(
'}');
2299 if (pos==std::string::npos)
2301 err(
"Strange, the last char was not a '}}'\n");
2302 pos = line.length();
2318 DBG_RTF(
m_t <<
"{\\comment (startDotGraph)}\n")
2330 m_t <<
"\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
2332 m_t << fn <<
"." << imgExt;
2333 m_t <<
"\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par\n";
2336 DBG_RTF(
m_t <<
"{\\comment (endDotGraph)}\n")
2341 DBG_RTF(
m_t <<
"{\\comment (startInclDepGraph)}\n")
2353 m_t <<
"\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
2355 m_t << fn <<
"." << imgExt;
2356 m_t <<
"\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par\n";
2358 DBG_RTF(
m_t <<
"{\\comment (endInclDepGraph)}\n")
2371 DBG_RTF(
m_t <<
"{\\comment (startCallGraph)}\n")
2383 m_t <<
"\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
2385 m_t << fn <<
"." << imgExt;
2386 m_t <<
"\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par\n";
2388 DBG_RTF(
m_t <<
"{\\comment (endCallGraph)}\n")
2393 DBG_RTF(
m_t <<
"{\\comment (startDirDepGraph)}\n")
2405 m_t <<
"\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
2407 m_t << fn <<
"." << imgExt;
2408 m_t <<
"\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par\n";
2410 DBG_RTF(
m_t <<
"{\\comment (endDirDepGraph)}\n")
2424 while ((c=f.get())!=-1)
2450 if (bcount==0)
return;
2452 err(
"RTF integrity test failed at line {:d} of {} due to a bracket mismatch.\n"
2453 " Please try to create a small code example that produces this error \n"
2454 " and send that to doxygen@gmail.com.\n",line,
name);
2469 err(
"Output dir {} does not exist!\n",path);
2478 QCString combinedName = path+
"/combined.rtf";
2479 QCString mainRTFName = path+
"/"+name;
2484 err(
"Failed to open {} for writing!\n",combinedName);
2509 thisDir.
rename(mainRTFName.
str(),mainRTFName.
str() +
".org");
2528 DBG_RTF(
m_t <<
"{\\comment startMemberGroupHeader}\n")
2536 DBG_RTF(
m_t <<
"{\\comment endMemberGroupHeader}\n")
2543 DBG_RTF(
m_t <<
"{\\comment startMemberGroupDocs}\n")
2549 DBG_RTF(
m_t <<
"{\\comment endMemberGroupDocs}\n")
2556 DBG_RTF(
m_t <<
"{\\comment startMemberGroup}\n")
2562 DBG_RTF(
m_t <<
"{\\comment endMemberGroup}\n")
2569 DBG_RTF(
m_t <<
"{\\comment (startExamples)}\n")
2584 DBG_RTF(
m_t <<
"{\\comment (endExamples)}\n")
2594 DBG_RTF(
m_t <<
"{\\comment (startParameterType)}\n")
2597 m_t <<
" " << key <<
" ";
2603 DBG_RTF(
m_t <<
"{\\comment (endParameterType)}\n")
2609 DBG_RTF(
m_t <<
"{\\comment (exceptionEntry)}\n")
2614 else if (closeBracket)
2623 auto astImpl =
dynamic_cast<const DocNodeAST*
>(ast);
2627 std::visit(visitor,astImpl->root);
2634 DBG_RTF(
m_t <<
"{\\comment (rtfwriteRuler_doubleline)}\n")
2635 m_t <<
"{\\pard\\widctlpar\\brdrb\\brdrdb\\brdrw15\\brsp20 \\adjustright \\par}\n";
2640 DBG_RTF(
m_t <<
"{\\comment (rtfwriteRuler_emboss)}\n")
2641 m_t <<
"{\\pard\\widctlpar\\brdrb\\brdremboss\\brdrw15\\brsp20 \\adjustright \\par}\n";
2646 DBG_RTF(
m_t <<
"{\\comment (rtfwriteRuler_thick)}\n")
2647 m_t <<
"{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw75\\brsp20 \\adjustright \\par}\n";
2652 DBG_RTF(
m_t <<
"{\\comment (rtfwriteRuler_thin)}\n")
2653 m_t <<
"{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw5\\brsp20 \\adjustright \\par}\n";
2658 DBG_RTF(
m_t <<
"{\\comment (startConstraintList)}\n")
2673 DBG_RTF(
m_t <<
"{\\comment (startConstraintParam)}\n")
2679 DBG_RTF(
m_t <<
"{\\comment (endConstraintParam)}\n")
2686 DBG_RTF(
m_t <<
"{\\comment (startConstraintType)}\n")
2692 DBG_RTF(
m_t <<
"{\\comment (endConstraintType)}\n")
2699 DBG_RTF(
m_t <<
"{\\comment (startConstraintDocs)}\n")
2704 DBG_RTF(
m_t <<
"{\\comment (endConstraintDocs)}\n")
2710 DBG_RTF(
m_t <<
"{\\comment (endConstraintList)}\n")
2719 DBG_RTF(
m_t <<
"{\\comment (startIndexListItem)}\n")
2724 DBG_RTF(
m_t <<
"{\\comment (endIndexListItem)}\n")
2730 DBG_RTF(
m_t <<
"{\\comment (startInlineHeader)}\n")
2738 DBG_RTF(
m_t <<
"{\\comment (endInlineHeader)}\n")
2746 DBG_RTF(
m_t <<
"{\\comment (startMemberDocSimple)}\n")
2748 m_t <<
"{" <<
rtf_Style[
"Heading5"].reference() <<
"\n";
2759 m_t <<
"\\trowd \\trgaph108\\trleft426\\tblind426"
2760 "\\trbrdrt\\brdrs\\brdrw10\\brdrcf15 "
2761 "\\trbrdrl\\brdrs\\brdrw10\\brdrcf15 "
2762 "\\trbrdrb\\brdrs\\brdrw10\\brdrcf15 "
2763 "\\trbrdrr\\brdrs\\brdrw10\\brdrcf15 "
2764 "\\trbrdrh\\brdrs\\brdrw10\\brdrcf15 "
2765 "\\trbrdrv\\brdrs\\brdrw10\\brdrcf15 \n";
2766 int n=3,columnPos[3] = { 25, 50, 100 };
2773 for (
int i=0;i<n;i++)
2775 m_t <<
"\\clvertalt\\clbrdrt\\brdrs\\brdrw10\\brdrcf15 "
2776 "\\clbrdrl\\brdrs\\brdrw10\\brdrcf15 "
2777 "\\clbrdrb\\brdrs\\brdrw10\\brdrcf15 "
2778 "\\clbrdrr \\brdrs\\brdrw10\\brdrcf15 "
2782 m_t <<
"\\pard \\widctlpar\\intbl\\adjustright\n";
2787 DBG_RTF(
m_t <<
"{\\comment (endMemberDocSimple)}\n")
2793 DBG_RTF(
m_t <<
"{\\comment (startInlineMemberType)}\n")
2799 DBG_RTF(
m_t <<
"{\\comment (endInlineMemberType)}\n")
2805 DBG_RTF(
m_t <<
"{\\comment (startInlineMemberName)}\n")
2811 DBG_RTF(
m_t <<
"{\\comment (endInlineMemberName)}\n")
2817 DBG_RTF(
m_t <<
"{\\comment (startInlineMemberDoc)}\n")
2823 DBG_RTF(
m_t <<
"{\\comment (endInlineMemberDoc)}\n")
2824 m_t <<
"\\cell }{\\row }\n";
2833 m_t <<
"{\\f2 [" << l <<
"]}";
2834 if (!isLast)
m_t <<
", ";
2856 if (openBracket)
m_t <<
"(";
2861 if (last && closeBracket)
2870static std::unordered_map<std::string,std::string>
g_tagMap;
2895 for (
unsigned int i = 0; i <
g_nextTag.length(); ++i, --nxtTag )
2897 if ( ( ++(*nxtTag) ) >
'Z' )
Class representing a built-in class diagram.
void writeImage(TextStream &t, const QCString &path, const QCString &relPath, const QCString &file, bool generateMap=true) const
static bool isFlagSet(const DebugMask mask)
static void print(DebugMask mask, int prio, fmt::format_string< Args... > fmt, Args &&... args)
The common base class of all entity definitions found in the sources.
virtual QCString getDefFileExtension() const =0
Class representing a directory in the file system.
static std::string currentDirPath()
std::string absPath() const
bool mkdir(const std::string &path, bool acceptsAbsPath=true) const
bool remove(const std::string &path, bool acceptsAbsPath=true) const
std::string filePath(const std::string &path, bool acceptsAbsPath=true) const
bool rename(const std::string &orgName, const std::string &newName, bool acceptsAbsPath=true) const
static bool setCurrent(const std::string &path)
Class representing the abstract syntax tree of a documentation block.
Representation of an call graph.
QCString writeGraph(TextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const QCString &path, const QCString &fileName, const QCString &relPath, bool writeImageMap=TRUE, int graphId=-1)
Representation of a class inheritance or dependency graph.
QCString writeGraph(TextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const QCString &path, const QCString &fileName, const QCString &relPath, bool TBRank=TRUE, bool imageMap=TRUE, int graphId=-1)
Representation of an directory dependency graph.
QCString writeGraph(TextStream &out, GraphOutputFormat gf, EmbeddedOutputFormat ef, const QCString &path, const QCString &fileName, const QCString &relPath, bool writeImageMap=TRUE, int graphId=-1, bool linkRelations=TRUE)
Representation of a group collaboration graph.
Representation of an include dependency graph.
QCString writeGraph(TextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const QCString &path, const QCString &fileName, const QCString &relPath, bool writeImageMap=TRUE, int graphId=-1)
static NamespaceLinkedMap * namespaceLinkedMap
static ConceptLinkedMap * conceptLinkedMap
static std::unique_ptr< PageDef > mainPage
static FileNameLinkedMap * inputNameLinkedMap
static ClassLinkedMap * classLinkedMap
static PageLinkedMap * exampleLinkedMap
static PageLinkedMap * pageLinkedMap
static DirLinkedMap * dirLinkedMap
static GroupLinkedMap * groupLinkedMap
Minimal replacement for QFileInfo.
std::string fileName() const
std::string absFilePath() const
opaque representation of the abstract syntax tree (AST)
A model of a class/file/namespace member symbol.
static ModuleManager & instance()
Class representing a list of different code generators.
void add(OutputCodeIntfPtr &&p)
Abstract interface for output generators.
QCString fileName() const
This is an alternative implementation of QCString.
QCString & prepend(const char *s)
size_t length() const
Returns the length of the string, not counting the 0-terminator.
bool startsWith(const char *s) const
bool isEmpty() const
Returns TRUE iff the string is empty.
const std::string & str() const
void reserve(size_t size)
Reserve space for size bytes without changing the string contents.
QCString & sprintf(const char *format,...)
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
Generator for RTF code fragments.
void startSpecialComment() override
void endCodeLine() override
void startFontClass(const QCString &) override
size_t m_stripIndentAmount
void writeCodeLink(CodeSymbolType type, const QCString &ref, const QCString &file, const QCString &anchor, const QCString &name, const QCString &tooltip) override
void endFontClass() override
void endCodeFragment(const QCString &) override
QCString rtf_Code_DepthStyle()
QCString m_sourceFileName
RTFCodeGenerator(TextStream *t)
void endSpecialComment() override
void stripCodeComments(bool b) override
void setSourceFileName(const QCString &name)
void codify(const QCString &text) override
void startCodeFragment(const QCString &style) override
void writeLineNumber(const QCString &, const QCString &, const QCString &, int l, bool) override
void setStripIndentAmount(size_t amount) override
void startCodeLine(int) override
Concrete visitor implementation for RTF output.
void startTextBlock(bool dense) override
void endMemberGroupHeader() override
void startGroupCollaboration() override
void endClassDiagram(const ClassDiagram &, const QCString &filename, const QCString &name) override
void startCallGraph() override
void endConstraintList() override
void writeStartAnnoItem(const QCString &type, const QCString &file, const QCString &path, const QCString &name) override
void endMemberList() override
void endConstraintType() override
void endDescTableRow() override
void startLabels() override
void startInlineMemberName() override
void writeChar(char c) override
void endDescTableData() override
void startDescTableData() override
void endDescTable() override
OutputType type() const override
RTFCodeGenerator * m_codeGen
void endDirDepGraph(DotDirDeps &g) override
std::unique_ptr< OutputCodeList > m_codeList
void startIndexKey() override
void startConstraintList(const QCString &) override
void endMemberItem(MemberItemType) override
void endPlainFile() override
void startIndexListItem() override
void endCompoundTemplateParams() override
void rtfwriteRuler_thick()
static bool preProcessFileInplace(const QCString &path, const QCString &name)
This is an API to a VERY brittle RTF preprocessor that combines nested RTF files.
static void writeStyleSheetFile(TextStream &t)
void endInlineMemberType() override
void endDescForItem() override
void startIndent() override
void lastIndexPage() override
void endInlineMemberName() override
void startTextLink(const QCString &f, const QCString &anchor) override
void endItemList() override
std::array< RTFListItemInfo, maxIndentLevels > m_listItemInfo
void startDescTableInit() override
void writeDoc(const IDocNodeAST *ast, const Definition *, const MemberDef *, int) override
void endMemberGroup(bool) override
void writeLabel(const QCString &l, bool isLast) override
void writeInheritedSectionTitle(const QCString &, const QCString &, const QCString &, const QCString &, const QCString &, const QCString &) override
void endMemberGroupDocs() override
void exceptionEntry(const QCString &, bool) override
void endMemberDocSimple(bool) override
void startFile(const QCString &name, const QCString &manName, const QCString &title, int id, int hierarchyLevel) override
void startDirDepGraph() override
void startMemberSubtitle() override
void startDotGraph() override
void writePageLink(const QCString &, bool) override
void endTextBlock(bool) override
static void writeExtensionsFile(TextStream &t)
void writeString(const QCString &text) override
void startItemListItem() override
void endDoxyAnchor(const QCString &, const QCString &) override
void startBold() override
void endMemberSubtitle() override
void startPlainFile(const QCString &name) override
void startEmphasis() override
QCString rtf_EList_DepthStyle()
void startParameterType(bool, const QCString &) override
void endMemberDoc(bool) override
void startConstraintDocs() override
void startDescForItem() override
void startMemberGroupHeader(const QCString &, bool) override
void writeRTFReference(const QCString &label)
void endProjectNumber() override
void startDescTableTitle() override
void startParameterList(bool) override
void writeObjectLink(const QCString &ref, const QCString &file, const QCString &anchor, const QCString &name) override
void endDotGraph(DotClassGraph &) override
void endIndexItem(const QCString &ref, const QCString &file) override
void rtfwriteRuler_doubleline()
void startParagraph(const QCString &classDef) override
void endIndexSection(IndexSection) override
void writeNonBreakableSpace(int) override
void endMemberDescription() override
void startIndexList() override
void startIndexItem(const QCString &ref, const QCString &file) override
void rtfwriteRuler_emboss()
void addLabel(const QCString &, const QCString &) override
static const int maxIndentLevels
void docify(const QCString &text) override
QCString rtf_BList_DepthStyle()
QCString rtf_DList_DepthStyle()
void endSection(const QCString &, SectionType) override
void endInclDepGraph(DotInclDepGraph &) override
void startMemberItem(const QCString &, MemberItemType, const QCString &) override
void endDescTableTitle() override
void startItemList() override
void writeAnchor(const QCString &fileName, const QCString &name) override
void endGroupCollaboration(DotGroupCollaboration &g) override
void endItemListItem() override
void addCodeGen(OutputCodeList &list) override
void startMemberDocSimple(bool) override
void startCompoundTemplateParams() override
void startDescTableRow() override
void endPageRef(const QCString &, const QCString &) override
void startDescTable(const QCString &title, const bool hasInits) override
void startInlineMemberType() override
void endParameterExtra(bool, bool, bool) override
void startPageRef() override
void startMemberGroup() override
void rtfwriteRuler_thin()
void startIndexValue(bool) override
void startClassDiagram() override
void setRelativePath(const QCString &path)
void setSourceFileName(const QCString &sourceFileName)
void endInlineHeader() override
void startInlineMemberDoc() override
void addIndexItem(const QCString &, const QCString &) override
void endIndexList() override
void endInlineMemberDoc() override
void endParagraph() override
void endTextLink() override
QCString rtf_LCList_DepthStyle()
void startConstraintType() override
void startInclDepGraph() override
void endIndexKey() override
void endTitleHead(const QCString &, const QCString &name) override
void startMemberGroupDocs() override
void endGroupHeader(int) override
void startExamples() override
void endCallGraph(DotCallGraph &) override
void startTitleHead(const QCString &) override
void endConstraintDocs() override
void endParameterType() override
void endIndexValue(const QCString &, bool) override
void startSection(const QCString &, const QCString &, SectionType) override
void endEmphasis() override
void endConstraintParam() override
void startDoxyAnchor(const QCString &, const QCString &, const QCString &, const QCString &, const QCString &) override
void startProjectNumber() override
void startMemberDoc(const QCString &, const QCString &, const QCString &, const QCString &, int, int, bool) override
void startIndexSection(IndexSection) override
RTFGenerator & operator=(const RTFGenerator &)
void startInlineHeader() override
void startMemberList() override
void endIndent() override
void writeStyleInfo(int part) override
void endDescTableInit() override
void endIndexListItem() override
void startConstraintParam() override
void endLabels() override
void lineBreak(const QCString &style=QCString()) override
void startGroupHeader(const QCString &, int) override
void startMemberDescription(const QCString &, const QCString &, bool) override
QCString rtf_CList_DepthStyle()
void endExamples() override
static constexpr int Section
static constexpr int MaxLevel
static constexpr int Subsection
static constexpr int Subsubsection
static constexpr int Page
static constexpr int MinLevel
static constexpr int Paragraph
static constexpr int Subsubparagraph
static constexpr int Subparagraph
Text streaming class that buffers data.
void flush()
Flushes the buffer.
#define Config_getInt(name)
#define Config_getBool(name)
#define Config_getString(name)
#define Config_getEnum(name)
std::set< std::string > StringSet
QCString dateToString(DateTimeType includeTime)
Returns the current date, when includeTime is set also the time is provided.
std::tm getCurrentDateTime()
Returns the filled in std::tm for the current date and time.
static QCString objectLinkToString(const QCString &, const QCString &f, const QCString &anchor, const QCString &text)
IDocNodeASTPtr validatingParseText(IDocParser &parserIntf, const QCString &input)
IDocParserPtr createDocParser()
factory function to create a parser
@ isNamespaceDocumentation
Translator * theTranslator
static QCString docifyToString(const QCString &str)
std::ifstream openInputStream(const QCString &name, bool binary=false, bool openAtEnd=false)
std::ofstream openOutputStream(const QCString &name, bool append=false)
void unlink(const QCString &fileName)
OutputCodeDefer< RTFCodeGenerator > RTFCodeGeneratorDefer
Portable versions of functions that are platform dependent.
int portable_iconv_close(void *cd)
size_t portable_iconv(void *cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft)
void * portable_iconv_open(const char *tocode, const char *fromcode)
const char * qPrint(const char *s)
static QCString objectLinkToString(const QCString &ref, const QCString &f, const QCString &anchor, const QCString &text)
QCString rtfFormatBmkStr(const QCString &name)
static std::mutex g_rtfFormatMutex
static QCString dateToRTFDateString()
static StringSet removeSet
void testRTFOutput(const QCString &name)
Tests the integrity of the result by counting brackets.
static bool preProcessFile(Dir &d, const QCString &infName, TextStream &t, bool bIncludeHeader=true, bool removeFile=true)
VERY brittle routine inline RTF's included by other RTF's.
static QCString g_nextTag("AAAAAAAAAA")
static QCString makeIndexName(const QCString &s, int i)
static std::unordered_map< std::string, std::string > g_tagMap
static void encodeForOutput(TextStream &t, const QCString &s)
static QCString docifyToString(const QCString &str)
QCString rtfFormatBmkStr(const QCString &name)
QCString rtf_documentType
void loadStylesheet(const QCString &name, StyleDataMap &map)
Rtf_Style_Default rtf_Style_Default[]
void loadExtensions(const QCString &name)
QCString rtf_logoFilename
Rtf_Table_Default rtf_Table_Default[]
const char * definition() const
const char * reference() const
const char * writeUTF8Char(TextStream &t, const char *s)
Writes the UTF8 character pointed to by s to stream t and returns a pointer to the next character.
Various UTF8 related helper functions.
size_t updateColumnCount(const char *s, size_t col)
QCString stripPath(const QCString &s)
QCString relativePathToRoot(const QCString &name)
void clearSubDirs(const Dir &d)
QCString stripExtensionGeneral(const QCString &fName, const QCString &ext)
void createSubDirs(const Dir &d)
QCString getDotImageExtension()
bool copyFile(const QCString &src, const QCString &dest)
Copies the contents of file with name src to the newly created file with name dest.
A bunch of utility functions.