12%option never-interactive
13%option prefix="configimplYY"
49#define YY_NO_UNISTD_H 1
52#define SHOW_INCLUDES 0
61 fmt::print(stderr,
"{}{}",
error_str,fmt::vformat(
fmt,args));
66 fmt::print(stderr,
"{}{}",
error_str,fmt::vformat(
fmt,args));
67 fmt::print(stderr,
"{}\n",
"Exiting...");
83#define MAX_INCLUDE_DEPTH 10
84#define YY_NEVER_INTERACTIVE 1
95 const char *p=tmp.
data();
121 if (!result.
isEmpty()) result+=
'\n';
129 if (initSpace) t <<
" ";
130 if (v) t <<
"YES";
else t <<
"NO";
135 if (initSpace) t <<
" ";
142 bool needsEscaping=wasQuoted;
146 const char *p=se.
data();
149 if (initSpace) t <<
" ";
150 while ((c=*p++)!=0 && !needsEscaping)
151 needsEscaping = (c==
' ' || c==
',' || c==
'\n' || c==
'\t' || c==
'"' || c==
'#');
158 if (*p==
' ' && *(p+1)==
'\0')
break;
159 if (*p==
'"') t <<
"\\";
174 for (
const auto &p : l)
176 if (!first) t <<
" \\\n";
180 bool wasQuoted = ((s.
at(0)==
'"') && (s.
at(s.
length()-1)==
'"'));
205 if (!ok || val<m_minVal || val>
m_maxVal)
223 if (val==
"yes" || val==
"true" || val==
"1" || val==
"all")
228 else if (val==
"no" || val==
"false" || val==
"0" || val==
"none")
273 if (s.lower() == val)
287 auto it =
m_dict.find(name);
290 config_term(
"{}<{}>: Internal error: Requested unknown option {}!\n",fileName,num,name);
294 config_term(
"{}<{}>: Internal error: Requested option {} not of string type!\n",fileName,num,name);
296 return *(
dynamic_cast<ConfigString *
>(it->second))->valueRef();
301 auto it =
m_dict.find(name);
304 config_term(
"{}<{}>: Internal error: Requested unknown option {}!\n",fileName,num,name);
308 config_term(
"{}<{}>: Internal error: Requested option {} not of list type!\n",fileName,num,name);
310 return *(
dynamic_cast<ConfigList *
>(it->second))->valueRef();
315 auto it =
m_dict.find(name);
318 config_term(
"{}<{}>: Internal error: Requested unknown option {}!\n",fileName,num,name);
322 config_term(
"{}<{}>: Internal error: Requested option {} not of enum type!\n",fileName,num,name);
324 return *(
dynamic_cast<ConfigEnum *
>(it->second))->valueRef();
329 auto it =
m_dict.find(name);
332 config_term(
"{}<{}>: Internal error: Requested unknown option {}!\n",fileName,num,name);
336 config_term(
"{}<{}>: Internal error: Requested option {} not of integer type!\n",fileName,num,name);
338 return *(
dynamic_cast<ConfigInt *
>(it->second))->valueRef();
343 auto it =
m_dict.find(name);
346 config_term(
"{}<{}>: Internal error: Requested unknown option {}!\n",fileName,num,name);
350 config_term(
"{}<{}>: Internal error: Requested option {} not of boolean type!\n",fileName,num,name);
352 return *(
dynamic_cast<ConfigBool *
>(it->second))->valueRef();
363 t <<
"#---------------------------------------------------------------------------\n";
364 t <<
"# " <<
m_doc <<
"\n";
365 t <<
"#---------------------------------------------------------------------------\n";
388 auto is_not_empty = [get_stripped](
const std::string &s) {
return !get_stripped(s).isEmpty(); };
389 size_t defCnt = std::count_if(
m_value.begin(),
m_value.end(),is_not_empty);
391 if ( valCnt != defCnt)
400 while (it1!=
m_value.end() && !is_not_empty(*it1))
406 if (get_stripped(*it1) != get_stripped(*it2))
424 t <<
" <option id='" <<
m_name <<
"'";
425 t <<
" default='" << (
isDefault() ?
"yes" :
"no") <<
"'";
426 t <<
" type='stringlist'";
443 t <<
" <xsd:enumeration value=\"" <<
m_name <<
"\"/>\n";
470 t <<
" <option id='" <<
m_name <<
"'";
471 t <<
" default='" << (
isDefault() ?
"yes" :
"no") <<
"'";
472 t <<
" type='string'";
482 t <<
" <xsd:enumeration value=\"" <<
m_name <<
"\"/>\n";
509 t <<
" <option id='" <<
m_name <<
"'";
510 t <<
" default='" << (
isDefault() ?
"yes" :
"no") <<
"'";
511 t <<
" type='string'";
523 t <<
" <xsd:enumeration value=\"" <<
m_name <<
"\"/>\n";
557 t <<
" <option id='" <<
m_name <<
"'";
558 t <<
" default='" << (
isDefault() ?
"yes" :
"no") <<
"'";
569 t <<
" <xsd:enumeration value=\"" <<
m_name <<
"\"/>\n";
585 t <<
m_name << spaces <<
"=";
604 t <<
" <option id='" <<
m_name <<
"'";
605 t <<
" default='" << (
isDefault() ?
"yes" :
"no") <<
"'";
616 t <<
" <xsd:enumeration value=\"" <<
m_name <<
"\"/>\n";
624 t <<
" <xsd:enumeration value=\"" <<
m_name <<
"\"/>\n";
657#define unput_string(yytext,yyleng) do { for (int i=(int)yyleng-1;i>=0;i--) unput(yytext[i]); } while(0)
661#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
665#define LEX_NO_REENTRANT
685 return static_cast<int>(fread(buf,1,max_size,
g_includeStack.back()->filePtr));
695 if (inputEncoding.
isEmpty() || outputEncoding.
isEmpty() || inputEncoding==outputEncoding)
return str;
696 size_t inputSize=str.
length();
697 size_t outputSize=inputSize*4;
700 if (cd==
reinterpret_cast<void *
>(-1))
703 "Check the 'DOXYFILE_ENCODING' setting in the config file!\n",
704 inputEncoding,outputEncoding);
706 size_t iLeft=inputSize;
707 size_t oLeft=outputSize;
708 const char *inputPtr = str.
data();
709 char *outputPtr = output.
rawData();
713 output.
resize(outputSize);
714 output.
at(outputSize)=
'\0';
720 inputEncoding,outputEncoding,strerror(errno));
735 bool insideQuote=
false;
737 for (
size_t i=0;i<l;i++)
746 insideQuote=!insideQuote;
748 else if (!insideQuote && c==
'#')
750 if (i<l-1 && s.
at(i+1)==
'#')
775 if (l>=2 && s.
at(0)==
'"' && s.
at(l-1)==
'"' &&
776 (s.
at(l-2)!=
'\\' || (s.
at(l-2)==
'\\' && s.
at(l-3)==
'\\')))
785 for (
size_t i=0;i<l;i++)
790 if (i<l-1 && s.
at(i+1)==
'"')
830 bool allowCommaAsSeparator =
g_cmd!=
"PREDEFINED";
839 auto addElem = [&elemStr,&wasQuote]()
845 if (wasQuote) e =
"\""+e+
"\"";
852 bool needsSeparator=
false;
853 bool insideQuote=
false;
855 for (
size_t i=0;i<l;i++)
858 if (!needsSeparator && c==
'\\')
860 if (i<l-1 && s.
at(i+1)==
'"')
874 else if (!needsSeparator && c==
'"')
887 else if (!insideQuote && ((c==
',' && allowCommaAsSeparator) || isspace(c)))
889 needsSeparator=
false;
898 ConfigImpl::config_warn(
"Invalid value for '{}' tag at line {}, file {}: Values in list '{}' are not properly space {}separated\n",
902 needsSeparator=
false;
916 ConfigImpl::config_warn(
"Invalid value for '{}' tag at line {}, file {}: Values in list '{}' are not properly quoted\n",
950 FILE *f =
tryPath(s.c_str(),fileName);
967 size_t incLen = inc.
length();
968 if (incLen>0 && inc.
at(0)==
'"' && inc.
at(incLen-1)==
'"')
970 inc=inc.
mid(1,incLen-2);
980 msg(
"@INCLUDE = {}: parsing...\n",inc);
992 yy_switch_to_buffer(yy_create_buffer(f,
YY_BUF_SIZE));
Class representing a Boolean type option.
void writeTemplate(TextStream &t, bool sl, bool upd) override
bool isDefault() override
void writeXMLDoxyfile(TextStream &t) override
void writeXSDDoxyfile(TextStream &t) override
void compareDoxyfile(TextStream &t, Config::CompareMode compareMode) override
void convertStrToVal(Config::CompareMode compareMode) override
void writeXSDDoxyfile(TextStream &) override
void writeTemplate(TextStream &, bool, bool) override
Class representing an enum type option.
void writeTemplate(TextStream &t, bool sl, bool) override
void writeXSDDoxyfile(TextStream &t) override
void compareDoxyfile(TextStream &t, Config::CompareMode compareMode) override
bool isDefault() override
void writeXMLDoxyfile(TextStream &t) override
std::vector< QCString > m_valueRange
void convertStrToVal(Config::CompareMode compareMode) override
Singleton for configuration variables.
static void config_term(fmt::format_string< Args... > fmt, Args &&... args)
static void config_err(fmt::format_string< Args... > fmt, Args &&... args)
static void config_term_(fmt::string_view fmt, fmt::format_args args)
QCString & getEnum(const char *fileName, int num, const char *name) const
StringVector & getList(const char *fileName, int num, const char *name) const
static void config_err_(fmt::string_view fmt, fmt::format_args args)
static void config_warn(fmt::format_string< Args... > fmt, Args &&... args)
static std::unique_ptr< ConfigImpl > m_instance
static void config_warn_(fmt::string_view fmt, fmt::format_args args)
bool & getBool(const char *fileName, int num, const char *name) const
int & getInt(const char *fileName, int num, const char *name) const
QCString & getString(const char *fileName, int num, const char *name) const
void writeTemplate(TextStream &t, bool sl, bool) override
Class representing an integer type option.
bool isDefault() override
void writeXMLDoxyfile(TextStream &t) override
void convertStrToVal(Config::CompareMode compareMode) override
void writeXSDDoxyfile(TextStream &t) override
void compareDoxyfile(TextStream &t, Config::CompareMode compareMode) override
void writeTemplate(TextStream &t, bool sl, bool upd) override
Class representing a list type option.
void writeTemplate(TextStream &t, bool sl, bool) override
bool isDefault() override
StringVector m_defaultValue
void writeXMLDoxyfile(TextStream &t) override
void writeXSDDoxyfile(TextStream &t) override
void compareDoxyfile(TextStream &t, Config::CompareMode compareMode) override
void writeTemplate(TextStream &, bool, bool) override
void writeStringValue(TextStream &t, const QCString &s, bool initSpace=true, bool wasQuoted=false)
void writeIntValue(TextStream &t, int i, bool initSpace=true)
void writeStringList(TextStream &t, const StringVector &l)
@ O_Enum
A fixed set of items.
void writeBoolValue(TextStream &t, bool v, bool initSpace=true)
Class representing a string type option.
bool isDefault() override
void writeXSDDoxyfile(TextStream &t) override
void writeXMLDoxyfile(TextStream &t) override
void writeTemplate(TextStream &t, bool sl, bool) override
void compareDoxyfile(TextStream &t, Config::CompareMode compareMode) override
Minimal replacement for QFileInfo.
This is an alternative implementation of QCString.
size_t length() const
Returns the length of the string, not counting the 0-terminator.
QCString mid(size_t index, size_t len=static_cast< size_t >(-1)) const
char & at(size_t i)
Returns a reference to the character at index i.
char * rawData()
Returns a writable pointer to the data.
bool isEmpty() const
Returns TRUE iff the string is empty.
QCString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
void resize(size_t newlen)
const std::string & str() const
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
QCString left(size_t len) const
Text streaming class that buffers data.
static QCString * g_string
static void processList()
static QCString g_encoding
static QCString g_localStoreRepl
static void checkEncoding()
static QCString convertToComment(const QCString &s, const QCString &u)
static const char * g_inputString
static void processStoreRepl(QCString &storeReplStr)
static const char * warning_str
static bool containsEnvVar(QCString &str)
static std::vector< std::unique_ptr< ConfigFileState > > g_includeStack
static void processString()
static int g_inputPosition
static FILE * findFile(const QCString &fileName)
#define MAX_INCLUDE_DEPTH
static const char * stateToString(int state)
static void readIncludeFile(const QCString &incName)
static QCString configStringRecode(const QCString &str, const QCString &fromEncoding, const QCString &toEncoding)
static StringVector * g_list
static bool g_configUpdate
static bool convertStringToBool(const QCString &str, bool &isValid)
static StringVector g_includePathList
static QCString stripComment(const QCString &s)
static void substEnvVarsInStrList(StringVector &sl)
static FILE * tryPath(const QCString &path, const QCString &fileName)
static Config::CompareMode g_compareMode
static ConfigImpl * g_config
static const char * getLexerFILE()
static QCString g_listStr
static int yyread(char *buf, int max_size)
static const char * error_str
static void substEnvVarsInString(QCString &s)
static QCString g_yyFileName
std::vector< std::string > StringVector
bool isAbsolutePath(const QCString &fileName)
FILE * fopen(const QCString &fileName, const QCString &mode)
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)
1007REGEX_a [a-z_A-Z\x80-\xFF]
1008REGEX_w [a-z_A-Z0-9\x80-\xFF]
1024 g_config->appendUserComment(yytext);
1033<Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"=" {
g_cmd=yytext;
1046 switch(option->
kind())
1087 " To avoid this warning please remove this line from your configuration "
1108 ConfigImpl::config_warn(
"Tag '{}' at line {} of file '{}' belongs to an option that was not enabled at compile time.\n"
1113 ConfigImpl::config_warn(
"Tag '{}' at line {} of file '{}' belongs to an option that was not enabled at compile time.\n"
1114 " To avoid this warning please remove this line from your configuration "
Section marker for obsolete options.
Abstract base class for any configuration option.
void setEncoding(const QCString &e)
void setUserComment(const QCString &u)
@ O_Disabled
Disabled compile time option.
@ O_Obsolete
An obsolete option.
@ O_Info
A section header.
1122<Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"+=" {
g_cmd=yytext;
1134 switch(option->
kind())
1155 "To avoid this warning please update your configuration "
1169 ConfigImpl::config_warn(
"Tag '{}' at line {} of file {} belongs to an option that was not enabled at compile time.\n"
1170 "To avoid this warning please remove this line from your configuration "
1171 "file, upgrade it using \"doxygen -u\", or recompile doxygen with this feature enabled.\n",
1183<Start>"@INCLUDE"[ \t]*"=" { BEGIN(Include);}
1184<Start>"$("{REGEX_a}({REGEX_w}|[.-])*")" |
1185<Start>"$("{REGEX_a}({REGEX_w}|[.-])*"("{REGEX_a}({REGEX_w}|[.-])*"))" {
1197<Start>"@"{REGEX_a}{REGEX_w}*"@" {
1209<Include>([^ \"\t\r\n]+)|("\""[^\n\"]+"\"") {
1225 YY_BUFFER_STATE oldBuf = YY_CURRENT_BUFFER;
1226 yy_switch_to_buffer( fs->oldState );
1227 yy_delete_buffer( oldBuf );
1251<StoreRepl>[^\n\\]+ {
1266<GetString>[^\n\\]+ {
1282<GetStrList>[^\n\\]+ {
1295<SkipInvalid>[^\n\\]+ {
1317 t <<
"# Doxyfile " << getDoxygenVersion() <<
"\n\n";
1336 t <<
"# Difference with default Doxyfile " << getFullVersion();
1352 t <<
"<?xml version='1.0' encoding='UTF-8' standalone='no'?>\n";
1353 t <<
"<doxyfile xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"doxyfile.xsd\" version=\"" << getDoxygenVersion() <<
"\" xml:lang=\"" <<
theTranslator->trISOLang() <<
"\">\n";
1358 t <<
"</doxyfile>\n";
1396 std::string s = str.
str();
1403 auto replace = [](
const std::string &s,
const reg::Ex &re) -> std::string
1409 for (; it!=
end ; ++it)
1411 const auto &match = *it;
1412 size_t i = match.position();
1413 size_t l = match.length();
1414 result+=s.substr(p,i-p);
1415 std::string matchContents = match[1].str();
1421 result+=s.substr(p);
1431 for (
const auto &s : sl)
1434 bool wasQuoted = ((result.
at(0)==
'"') && (result.
at(result.
length()-1)==
'"'));
1437 result = result.
mid(1,result.
length()-2);
1441 wasQuoted = (result.
find(
' ')!=-1) || (result.
find(
'\t')!=-1) || (result.
find(
'"')!=-1);
1454 int l =
static_cast<int>(result.
length());
1458 for (
int i=0;i<l;i++)
1462 while (i<l && ((c=result.
at(i))==
' ' || c==
'\t')) i++;
1465 while (i<l && ((c=result.
at(i))!=
' ' && c!=
'\t' && c!=
'"')) i++;
1476 results.push_back(result.
mid(p,i-p).
str());
1486 else if (c==
' ' || c==
'\t')
1488 if (i>p) results.push_back(result.
mid(p,i-p).
str());
1495 results.push_back(result.
right(l-p).
str());
1500 if (!result.
isEmpty()) results.push_back(result.
str());
1557 config_term(
"Config option '{}' has invalid depends relation on unknown option '{}'\n",
1558 option->
name(),depName);
1573 auto stream2string = [](std::istream &in) -> std::string
1577 while (in.read(buffer,
sizeof(buffer))) ret.append(buffer,
sizeof(buffer));
1578 ret.append(buffer,
static_cast<uint32_t
>(in.gcount()));
1579 if (!ret.empty() && ret[ret.length()-1]!=
'\n') ret+=
'\n';
1586 return stream2string(std::cin);
1596 return stream2string(f);
1611 configimplYYrestart( configimplYYin );
1632 for (
size_t i=0;i<str.size();i++)
1634 std::string path = str[i];
1635 std::replace(path.begin(),path.end(),
'\\',
'/');
1636 if ((path[0]!=
'/' && (path.size()<=2 || path[1]!=
':')) || path[path.size()-1]!=
'/')
1642 if (path[path.size()-1]!=
'/') path+=
'/';
1652 if ((val==
"yes" || val==
"true" || val==
"1" || val==
"all") ||
1653 (val==
"no" || val==
"false" || val==
"0" || val==
"none"))
1655 err(
"file name expected for option {}, got {} instead. Ignoring...\n",optionName,s);
1669 for (
const auto &s: list)
1673 int i=item.
find(
'=');
1674 if (i==-1 && equalRequired)
1676 err(
"Illegal format for option {}, no equal sign ('=') specified for item '{}'\n",name,item);
1683 err(
"Illegal format for option {}, no name specified for item '{}'\n",name,item);
1685 else if (valueRequired)
1690 err(
"Illegal format for option {}, no value specified for item '{}'\n",name,item);
1700 const ConfigValues::Info *option = ConfigValues::instance().get(optionName);
1701 if (option && option->type==ConfigValues::Info::Bool)
1703 if (ConfigValues::instance().*(option->value.b)!=expectedValue)
1705 err(
"When enabling {} the {} option should be {}. I'll adjust it for you.\n",depOption,optionName,expectedValue?
"enabled" :
"disabled");
1706 ConfigValues::instance().*(option->value.b)=expectedValue;
1714 const ConfigValues::Info *option = ConfigValues::instance().get(optionName);
1715 if (option && option->type==ConfigValues::Info::String)
1717 if (ConfigValues::instance().*(option->value.s)!=expectedValue)
1719 err(
"When enabling {} the {} option should have value '{}'. I'll adjust it for you.\n",depOption,optionName,expectedValue);
1720 ConfigValues::instance().*(option->value.s)=expectedValue;
1727 auto updateColorStyle = [&depOption](HTML_COLORSTYLE_t curStyle,HTML_COLORSTYLE_t newStyle)
1729 err(
"When enabling '{}' the 'HTML_COLORSTYLE' option should be either 'LIGHT' or 'DARK' but has value '{}'. I'll adjust it for you to '{}'.\n",
1731 HTML_COLORSTYLE_enum2str(curStyle),
1732 HTML_COLORSTYLE_enum2str(newStyle));
1738 case HTML_COLORSTYLE_t::LIGHT:
1739 case HTML_COLORSTYLE_t::DARK:
1742 case HTML_COLORSTYLE_t::AUTO_LIGHT:
1743 case HTML_COLORSTYLE_t::TOGGLE:
1744 updateColorStyle(colorStyle,HTML_COLORSTYLE_t::LIGHT);
1746 case HTML_COLORSTYLE_t::AUTO_DARK:
1747 updateColorStyle(colorStyle,HTML_COLORSTYLE_t::DARK);
1755 ConfigValues::instance().init();
1761 if (warnFormat.
find(
"$file")==-1)
1763 warn_uncond(
"warning format does not contain a $file tag!\n");
1765 if (warnFormat.
find(
"$line")==-1)
1767 warn_uncond(
"warning format does not contain a $line tag!\n");
1769 if (warnFormat.
find(
"$text")==-1)
1771 warn_uncond(
"warning format does not contain a $text tag!\n");
1778 if (paperType.
isEmpty() || paperType==
"a4wide")
1783 else if (paperType!=
"a4" && paperType!=
"letter" &&
1784 paperType!=
"legal" && paperType!=
"executive")
1786 err(
"Unknown page type '{}' specified\n",paperType);
1813 if (check && !headerFile.
isEmpty())
1819 "does not exist\n",headerFile);
1826 if (check && !footerFile.
isEmpty())
1832 "does not exist\n",footerFile);
1842 if (mathjaxVersion == MATHJAX_VERSION_t::MathJax_2)
1844 if (mathJaxFormat==MATHJAX_FORMAT_t::chtml)
1851 if (mathJaxFormat==MATHJAX_FORMAT_t::HTML_CSS || mathJaxFormat==MATHJAX_FORMAT_t::NativeMML)
1858 if (check && !mathJaxCodefile.
isEmpty())
1864 "does not exist\n",mathJaxCodefile);
1870 path =
"https://cdn.jsdelivr.net/npm/mathjax@";
1871 switch (mathjaxVersion)
1873 case MATHJAX_VERSION_t::MathJax_2: path +=
"2";
break;
1874 case MATHJAX_VERSION_t::MathJax_3: path +=
"3";
break;
1888 if (check && !latexHeaderFile.
isEmpty())
1894 "does not exist\n",latexHeaderFile);
1901 if (check && !latexFooterFile.
isEmpty())
1907 "does not exist\n",latexFooterFile);
1914 for (
const auto &s : includePath)
1919 warn_uncond(
"tag INCLUDE_PATH: include path '{}' does not exist\n",s);
1928 for (
const auto &s : predefList)
1932 int i_equals=predef.
find(
'=');
1933 int i_obrace=predef.
find(
'(');
1934 if ((i_obrace==0) || (i_equals==0) || (i_equals==1 && predef.
at(i_equals-1)==
':'))
1936 err(
"Illegal PREDEFINED format '{}', no define name specified\n",predef);
1971 numThreads =
static_cast<int>(std::thread::hardware_concurrency());
1980 const char *depOption =
"GENERATE_HTMLHELP";
1990 for (
const auto &s : tagFileList)
1992 bool validUrl =
false;
1993 size_t eqPos = s.find(
'=');
1994 if (eqPos!=std::string::npos)
2001 filteredTagFileList.push_back(s);
2005 err(
"When enabling GENERATE_HTMLHELP the TAGFILES option should only contain destinations "
2006 "with https / http addresses (not: {}). I'll adjust it for you.\n",s);
2015 const char *depOption =
"INLINE_GROUPED_CLASSES";
2022 if (dotNumThreads>32)
2026 else if (dotNumThreads<=0)
2028 dotNumThreads=std::max(2u,std::thread::hardware_concurrency()+1);
2035 if (!plantumlJarPath.
isEmpty())
2044 plantumlJarPath = plantumlJar;
2048 err(
"Jar file 'plantuml.jar' not found at location specified via PLANTUML_JAR_PATH: '{}'\n",plantumlJarPath);
2058 err(
"PLANTUML_JAR_PATH is not a directory with a 'plantuml.jar' file or is not an existing file: {}\n",plantumlJarPath);
2073 warn_uncond(
"dia could not be found at {}\n",diaPath);
2080 size_t i=0,l=diaPath.
length();
2081 for (i=0;i<l;i++)
if (diaPath.
at(i)==
'/') diaPath.
at(i)=
'\\';
2090 if (inputSources.empty())
2097 for (
const auto &s : inputSources)
2102 warn_uncond(
"tag INPUT: input source '{}' does not exist\n",s);
2122 warn_uncond(
"No output formats selected! Set at least one of the main GENERATE_* options to YES.\n");
2130 warn_uncond(
"GENERATE_HTMLHELP=YES requires GENERATE_HTML=YES.\n");
2138 warn_uncond(
"Setting SITEMAP_URL requires GENERATE_HTML=YES.\n");
2147 warn_uncond(
"GENERATE_QHP=YES requires GENERATE_HTML=YES.\n");
2151 err(
"GENERATE_QHP=YES requires QHP_NAMESPACE to be set. Using 'org.doxygen.doc' as default!.\n");
2157 err(
"GENERATE_QHP=YES requires QHP_VIRTUAL_FOLDER to be set. Using 'doc' as default!\n");
2161 if (!tagFileList.empty())
2163 err(
"When enabling GENERATE_QHP the TAGFILES option should be empty. I'll adjust it for you.\n");
2187 if ((
Config_getEnum(DOT_IMAGE_FORMAT) == DOT_IMAGE_FORMAT_t::svg_cairo) ||
2188 (
Config_getEnum(DOT_IMAGE_FORMAT) == DOT_IMAGE_FORMAT_t::svg_cairo_cairo))
2190 err(
"When using DOT_IMAGE_FORMAT with {} the INTERACTIVE_SVG option should be disabled. I'll adjust it for you.\n",
2200 const char *depOption =
"OPTIMIZE_OUTPUT_VHDL";
2217 for (
const auto &option : m_options)
2228 printf(
"disabling option %s\n",
qPrint(option->
name()));
2251 haveDotOpt && classGraphOpt)
2256 if (classDiagramsOpt_ && haveDotOpt_ && classGraphOpt_ &&
2262 bool isValid1=
true, isValid2=
true;
2265 if (isValid1 && isValid2 && !bClassDiagrams && !bHaveDot && classGraphValue.
lower()==
"yes")
2267 warn_uncond(
"Changing CLASS_GRAPH option to TEXT because obsolete option CLASS_DIAGRAM was found and set to NO.\n");
2268 classGraphValue=
"TEXT";
2281 if (htmlTimestamp_ && timestampOpt_ &&
2288 if (isValid && bTimestamp)
2291 timestampValue =
"YES";
2300 if (latexTimestamp_ && timestampOpt_ &&
2307 if (isValid && bTimestamp) timestampValue =
"YES";
2316 (*fontname->valueStringRef() ==
"FreeSans"
2317 || *fontname->valueStringRef() ==
"FreeSans.ttf"))
2318 warn_uncond(
"doxygen no longer ships with the FreeSans font.\n"
2319 " You may want to clear or change DOT_FONTNAME.\n"
2320 " Otherwise you run the risk that the wrong font is being used for dot generated graphs.\n");
2325 QCString& commonAttrStr = *commonAttrOpt->valueRef();
2329 commonAttrStr = commonAttr.
str();
2335 QCString& edgeAttrStr = *edgeAttrOpt->valueRef();
2339 edgeAttrStr = edgeAttr.
str();
2368 if (!parseRes)
return parseRes;
2383 configInst->convertStrToVal(compareMode);
2387 if (clearHeaderAndFooter)
2401#include "configimpl.l.h"
void substEnvVars() override
QCString * valueStringRef()
void substEnvVars() override
ConfigOptionList m_options
static void deleteInstance()
void compareDoxyfile(TextStream &t, Config::CompareMode compareMode)
void convertStrToVal(Config::CompareMode compareMode)
static ConfigImpl * instance()
void substituteEnvironmentVars()
bool parseString(const QCString &fn, const QCString &str, bool upd=FALSE)
bool parse(const QCString &fn, bool upd=FALSE)
QCString takeStartComment()
ConfigOption * get(const QCString &name) const
void writeXMLDoxyfile(TextStream &t)
void writeXSDDoxyfile(TextStream &t)
QCString takeUserComment()
void writeTemplate(TextStream &t, bool shortIndex, bool updateOnly)
ConfigOptionList m_disabled
void emptyValueToDefault()
void substEnvVars() override
void substEnvVars() override
QCString * valueStringRef()
OptionType orgType() const
virtual void convertStrToVal(Config::CompareMode)
virtual void writeXMLDoxyfile(TextStream &t)=0
virtual void writeTemplate(TextStream &t, bool sl, bool upd)=0
virtual void writeXSDDoxyfile(TextStream &t)=0
QCString dependsOn() const
virtual void emptyValueToDefault()
virtual void compareDoxyfile(TextStream &t, Config::CompareMode compareMode)=0
virtual void substEnvVars()=0
void substEnvVars() override
static bool isFlagSet(const DebugMask mask)
static std::string currentDirPath()
Class representing an attribute list of a dot graph object.
void updateValue(const QCString &key, const QCString &inpValue)
QCString str() const
Return the string representation of the attribute list.
std::string dirPath(bool absPath=true) const
std::string absFilePath() const
int find(char c, int index=0, bool cs=TRUE) const
bool startsWith(const char *s) const
QCString right(size_t len) const
Class representing a regular expression.
Iterator class to iterator through matches.
Object representing the matching results.
#define Config_getInt(name)
#define Config_getList(name)
#define Config_updateString(name, value)
#define Config_updateInt(name, value)
#define Config_getEnumAsString(name)
#define Config_updateBool(name, value)
#define Config_getBool(name)
#define Config_getString(name)
#define Config_updateList(name,...)
#define Config_updateEnum(name, value)
#define Config_getEnum(name)
#define ConfigImpl_getBool(val)
static void adjustStringSetting(const char *depOption, const char *optionName, const QCString &expectedValue)
static void adjustColorStyleSetting(const char *depOption)
static void updateAttribute(DotAttributes &attr, QCString name, ConfigObsolete *value)
static QCString configFileToString(const QCString &name)
static const reg::Ex reEnvVarExt(R"(\$\((\a[\w.-]*\(\a[\w.-]*\))\))")
static const reg::Ex reEnvVar(R"(\$\((\a[\w.-]*)\))")
static void cleanUpPaths(StringVector &str)
static void checkList(const StringVector &list, const char *name, bool equalRequired, bool valueRequired)
static bool checkFileName(const QCString &s, const char *optionName)
static const reg::Ex reEnvVar1CMake(R"(\${\a\w*})")
static const reg::Ex reEnvVarCMake(R"(@\a\w*@)")
static void adjustBoolSetting(const char *depOption, const char *optionName, bool expectedValue)
void addConfigOptions(ConfigImpl *cfg)
DirIterator end(const DirIterator &) noexcept
Translator * theTranslator
#define warn_uncond(fmt,...)
void postProcess(bool clearHeaderAndFooter, CompareMode compareMode=CompareMode::Full)
void checkAndCorrect(bool quiet, const bool check)
void writeXMLDoxyfile(TextStream &t)
void compareDoxyfile(TextStream &t, CompareMode compareMode)
bool parse(const QCString &fileName, bool update=FALSE, CompareMode compareMode=CompareMode::Full)
void writeXSDDoxyfile(TextStream &t)
void writeTemplate(TextStream &t, bool shortList, bool updateOnly=FALSE)
std::ifstream openInputStream(const QCString &name, bool binary=false, bool openAtEnd=false)
const char * commandExtension()
QCString getenv(const QCString &variable)
bool search(std::string_view str, Match &match, const Ex &re, size_t pos)
Search in a given string str starting at position pos for a match against regular expression re.
const char * qPrint(const char *s)
static QCString stripFromPath(const QCString &p, const StringVector &l)