Blame src/configimpl.l

Packit Service 50c9f2
/******************************************************************************
Packit Service 50c9f2
 *
Packit Service 50c9f2
 * Copyright (C) 1997-2015 by Dimitri van Heesch.
Packit Service 50c9f2
 *
Packit Service 50c9f2
 * Permission to use, copy, modify, and distribute this software and its
Packit Service 50c9f2
 * documentation under the terms of the GNU General Public License is hereby 
Packit Service 50c9f2
 * granted. No representations are made about the suitability of this software 
Packit Service 50c9f2
 * for any purpose. It is provided "as is" without express or implied warranty.
Packit Service 50c9f2
 * See the GNU General Public License for more details.
Packit Service 50c9f2
 *
Packit Service 50c9f2
 */
Packit Service 50c9f2
%option never-interactive
Packit Service 50c9f2
%option prefix="configimplYY"
Packit Service 50c9f2
Packit Service 50c9f2
%{
Packit Service 50c9f2
Packit Service 50c9f2
/*
Packit Service 50c9f2
 *	includes
Packit Service 50c9f2
 */
Packit Service 50c9f2
#include <stdio.h>
Packit Service 50c9f2
#include <stdlib.h>
Packit Service 50c9f2
#include <assert.h>
Packit Service 50c9f2
#include <ctype.h>
Packit Service 50c9f2
#include <stdarg.h>
Packit Service 50c9f2
#include <errno.h>
Packit Service 50c9f2
Packit Service 50c9f2
#include <qfileinfo.h>
Packit Service 50c9f2
#include <qdir.h>
Packit Service 50c9f2
#include <qtextstream.h>
Packit Service 50c9f2
#include <qregexp.h>
Packit Service 50c9f2
#include <qstack.h>
Packit Service 50c9f2
#include <qglobal.h>
Packit Service 50c9f2
  
Packit Service 50c9f2
#include "configimpl.h"
Packit Service 50c9f2
#include "version.h"
Packit Service 50c9f2
#include "portable.h"
Packit Service 50c9f2
#include "util.h"
Packit Service 50c9f2
#include "message.h"
Packit Service 50c9f2
Packit Service 50c9f2
#include "lang_cfg.h"
Packit Service 50c9f2
#include "configoptions.h"
Packit Service 50c9f2
Packit Service 50c9f2
#define YY_NO_INPUT 1
Packit Service 50c9f2
#define YY_NO_UNISTD_H 1
Packit Service 50c9f2
Packit Service 50c9f2
static const char *warning_str = "warning: ";
Packit Service 50c9f2
static const char *error_str = "error: ";
Packit Service 50c9f2
Packit Service 50c9f2
void config_err(const char *fmt, ...)
Packit Service 50c9f2
{
Packit Service 50c9f2
  va_list args;
Packit Service 50c9f2
  va_start(args, fmt);
Packit Service 50c9f2
  vfprintf(stderr, (QCString(error_str) + fmt).data(), args);
Packit Service 50c9f2
  va_end(args); 
Packit Service 50c9f2
}
Packit Service 50c9f2
void config_warn(const char *fmt, ...)
Packit Service 50c9f2
{
Packit Service 50c9f2
  va_list args;
Packit Service 50c9f2
  va_start(args, fmt);
Packit Service 50c9f2
  vfprintf(stderr, (QCString(warning_str) + fmt).data(), args);
Packit Service 50c9f2
  va_end(args);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
static QCString configStringRecode(
Packit Service 50c9f2
    const QCString &str,
Packit Service 50c9f2
    const char *fromEncoding,
Packit Service 50c9f2
    const char *toEncoding);
Packit Service 50c9f2
Packit Service 50c9f2
#define MAX_INCLUDE_DEPTH 10
Packit Service 50c9f2
#define YY_NEVER_INTERACTIVE 1
Packit Service 50c9f2
Packit Service 50c9f2
/* -----------------------------------------------------------------
Packit Service 50c9f2
 */
Packit Service 50c9f2
static QCString convertToComment(const QCString &s, const QCString &u)
Packit Service 50c9f2
{
Packit Service 50c9f2
  //printf("convertToComment(%s)=%s\n",s.data(),u.data());
Packit Service 50c9f2
  QCString result;
Packit Service 50c9f2
  if (!s.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QCString tmp=s.stripWhiteSpace();
Packit Service 50c9f2
    const char *p=tmp.data();
Packit Service 50c9f2
    char c;
Packit Service 50c9f2
    result+="#";
Packit Service 50c9f2
    if (*p && *p!='\n')
Packit Service 50c9f2
      result+=" ";
Packit Service 50c9f2
    while ((c=*p++))
Packit Service 50c9f2
    {
Packit Service 50c9f2
      if (c=='\n')
Packit Service 50c9f2
      {
Packit Service 50c9f2
        result+="\n#";
Packit Service 50c9f2
        if (*p && *p!='\n')
Packit Service 50c9f2
          result+=" ";
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else result+=c;
Packit Service 50c9f2
    }
Packit Service 50c9f2
    result+='\n';
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (!u.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    if (!result.isEmpty()) result+='\n';
Packit Service 50c9f2
    result+= u;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  return result;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void ConfigOption::writeBoolValue(FTextStream &t,bool v)
Packit Service 50c9f2
{
Packit Service 50c9f2
  t << " ";
Packit Service 50c9f2
  if (v) t << "YES"; else t << "NO";
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void ConfigOption::writeIntValue(FTextStream &t,int i)
Packit Service 50c9f2
{
Packit Service 50c9f2
  t << " " << i;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void ConfigOption::writeStringValue(FTextStream &t,QCString &s)
Packit Service 50c9f2
{
Packit Service 50c9f2
  char c;
Packit Service 50c9f2
  bool needsEscaping=FALSE;
Packit Service 50c9f2
  // convert the string back to it original encoding
Packit Service 50c9f2
  QCString se = configStringRecode(s,"UTF-8",m_encoding);
Packit Service 50c9f2
  const char *p=se.data();
Packit Service 50c9f2
  if (p)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    t << " ";
Packit Service 50c9f2
    while ((c=*p++)!=0 && !needsEscaping) 
Packit Service 50c9f2
      needsEscaping = (c==' ' || c=='\n' || c=='\t' || c=='"' || c=='#');
Packit Service 50c9f2
    if (needsEscaping)
Packit Service 50c9f2
    { 
Packit Service 50c9f2
      t << "\"";
Packit Service 50c9f2
      p=se.data();
Packit Service 50c9f2
      while (*p)
Packit Service 50c9f2
      {
Packit Service 50c9f2
	if (*p==' ' && *(p+1)=='\0') break; // skip inserted space at the end
Packit Service 50c9f2
	if (*p=='"') t << "\\"; // escape quotes
Packit Service 50c9f2
	t << *p++;
Packit Service 50c9f2
      }
Packit Service 50c9f2
      t << "\"";
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else
Packit Service 50c9f2
    {
Packit Service 50c9f2
      t << se;
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void ConfigOption::writeStringList(FTextStream &t,QStrList &l)
Packit Service 50c9f2
{
Packit Service 50c9f2
  const char *p = l.first();
Packit Service 50c9f2
  bool first=TRUE;
Packit Service 50c9f2
  while (p)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QCString s=p;
Packit Service 50c9f2
    if (!first)
Packit Service 50c9f2
      t << "                        ";
Packit Service 50c9f2
    first=FALSE;
Packit Service 50c9f2
    writeStringValue(t,s);
Packit Service 50c9f2
    p = l.next();
Packit Service 50c9f2
    if (p) t << " \\" << endl;
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
/* -----------------------------------------------------------------
Packit Service 50c9f2
 */
Packit Service 50c9f2
Packit Service 50c9f2
ConfigImpl *ConfigImpl::m_instance = 0;
Packit Service 50c9f2
Packit Service 50c9f2
void ConfigInt::convertStrToVal() 
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (!m_valueString.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    bool ok;
Packit Service 50c9f2
    int val = m_valueString.toInt(&ok;;
Packit Service 50c9f2
    if (!ok || val<m_minVal || val>m_maxVal)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      config_warn("argument `%s' for option %s is not a valid number in the range [%d..%d]!\n"
Packit Service 50c9f2
                "Using the default: %d!\n",m_valueString.data(),m_name.data(),m_minVal,m_maxVal,m_value);
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_value=val;
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void ConfigBool::convertStrToVal()
Packit Service 50c9f2
{
Packit Service 50c9f2
  QCString val = m_valueString.stripWhiteSpace().lower();
Packit Service 50c9f2
  if (!val.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    if (val=="yes" || val=="true" || val=="1" || val=="all") 
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_value=TRUE;
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else if (val=="no" || val=="false" || val=="0" || val=="none")
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_value=FALSE;
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else
Packit Service 50c9f2
    {
Packit Service 50c9f2
      config_warn("argument `%s' for option %s is not a valid boolean value\n"
Packit Service 50c9f2
                "Using the default: %s!\n",m_valueString.data(),m_name.data(),m_value?"YES":"NO");
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
QCString &ConfigImpl::getString(const char *fileName,int num,const char *name) const
Packit Service 50c9f2
{
Packit Service 50c9f2
  ConfigOption *opt = m_dict->find(name);
Packit Service 50c9f2
  if (opt==0) 
Packit Service 50c9f2
  {
Packit Service 50c9f2
    config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
Packit Service 50c9f2
    exit(1);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else if (opt->kind()!=ConfigOption::O_String)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    config_err("%s<%d>: Internal error: Requested option %s not of string type!\n",fileName,num,name);
Packit Service 50c9f2
    exit(1);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  return *((ConfigString *)opt)->valueRef();
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
QStrList &ConfigImpl::getList(const char *fileName,int num,const char *name) const
Packit Service 50c9f2
{
Packit Service 50c9f2
  ConfigOption *opt = m_dict->find(name);
Packit Service 50c9f2
  if (opt==0) 
Packit Service 50c9f2
  {
Packit Service 50c9f2
    config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
Packit Service 50c9f2
    exit(1);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else if (opt->kind()!=ConfigOption::O_List)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    config_err("%s<%d>: Internal error: Requested option %s not of list type!\n",fileName,num,name);
Packit Service 50c9f2
    exit(1);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  return *((ConfigList *)opt)->valueRef();
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
QCString &ConfigImpl::getEnum(const char *fileName,int num,const char *name) const
Packit Service 50c9f2
{
Packit Service 50c9f2
  ConfigOption *opt = m_dict->find(name);
Packit Service 50c9f2
  if (opt==0) 
Packit Service 50c9f2
  {
Packit Service 50c9f2
    config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
Packit Service 50c9f2
    exit(1);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else if (opt->kind()!=ConfigOption::O_Enum)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    config_err("%s<%d>: Internal error: Requested option %s not of enum type!\n",fileName,num,name);
Packit Service 50c9f2
    exit(1);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  return *((ConfigEnum *)opt)->valueRef();
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
int &ConfigImpl::getInt(const char *fileName,int num,const char *name) const
Packit Service 50c9f2
{
Packit Service 50c9f2
  ConfigOption *opt = m_dict->find(name);
Packit Service 50c9f2
  if (opt==0) 
Packit Service 50c9f2
  {
Packit Service 50c9f2
    config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
Packit Service 50c9f2
    exit(1);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else if (opt->kind()!=ConfigOption::O_Int)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    config_err("%s<%d>: Internal error: Requested option %s not of integer type!\n",fileName,num,name);
Packit Service 50c9f2
    exit(1);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  return *((ConfigInt *)opt)->valueRef();
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
bool &ConfigImpl::getBool(const char *fileName,int num,const char *name) const
Packit Service 50c9f2
{
Packit Service 50c9f2
  ConfigOption *opt = m_dict->find(name);
Packit Service 50c9f2
  if (opt==0) 
Packit Service 50c9f2
  {
Packit Service 50c9f2
    config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
Packit Service 50c9f2
    exit(1);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else if (opt->kind()!=ConfigOption::O_Bool)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    config_err("%s<%d>: Internal error: Requested option %s not of boolean type!\n",fileName,num,name);
Packit Service 50c9f2
    exit(1);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  return *((ConfigBool *)opt)->valueRef();
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
/* ------------------------------------------ */
Packit Service 50c9f2
Packit Service 50c9f2
void ConfigInfo::writeTemplate(FTextStream &t, bool sl,bool)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (!sl)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    t << "\n";
Packit Service 50c9f2
  }
Packit Service 50c9f2
  t << "#---------------------------------------------------------------------------\n";
Packit Service 50c9f2
  t << "# " << m_doc << endl;
Packit Service 50c9f2
  t << "#---------------------------------------------------------------------------\n";
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void ConfigList::writeTemplate(FTextStream &t,bool sl,bool)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (!sl)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    t << endl;
Packit Service 50c9f2
    t << convertToComment(m_doc, m_userComment);
Packit Service 50c9f2
    t << endl;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else if (!m_userComment.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    t << convertToComment("", m_userComment);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  t << m_name << m_spaces.left(MAX_OPTION_LENGTH-m_name.length()) << "=";
Packit Service 50c9f2
  writeStringList(t,m_value);
Packit Service 50c9f2
  t << "\n";
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void ConfigEnum::writeTemplate(FTextStream &t,bool sl,bool)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (!sl)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    t << endl;
Packit Service 50c9f2
    t << convertToComment(m_doc, m_userComment);
Packit Service 50c9f2
    t << endl;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else if (!m_userComment.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    t << convertToComment("", m_userComment);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  t << m_name << m_spaces.left(MAX_OPTION_LENGTH-m_name.length()) << "=";
Packit Service 50c9f2
  writeStringValue(t,m_value);
Packit Service 50c9f2
  t << "\n";
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void ConfigString::writeTemplate(FTextStream &t,bool sl,bool)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (!sl)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    t << endl;
Packit Service 50c9f2
    t << convertToComment(m_doc, m_userComment);
Packit Service 50c9f2
    t << endl;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else if (!m_userComment.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    t << convertToComment("", m_userComment);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  t << m_name << m_spaces.left(MAX_OPTION_LENGTH-m_name.length()) << "=";
Packit Service 50c9f2
  writeStringValue(t,m_value);
Packit Service 50c9f2
  t << "\n";
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void ConfigInt::writeTemplate(FTextStream &t,bool sl,bool upd)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (!sl)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    t << endl;
Packit Service 50c9f2
    t << convertToComment(m_doc, m_userComment);
Packit Service 50c9f2
    t << endl;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else if (!m_userComment.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    t << convertToComment("", m_userComment);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  t << m_name << m_spaces.left(MAX_OPTION_LENGTH-m_name.length()) << "=";
Packit Service 50c9f2
  if (upd && !m_valueString.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    writeStringValue(t,m_valueString);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else
Packit Service 50c9f2
  {
Packit Service 50c9f2
    writeIntValue(t,m_value);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  t << "\n";
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void ConfigBool::writeTemplate(FTextStream &t,bool sl,bool upd)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (!sl)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    t << endl;
Packit Service 50c9f2
    t << convertToComment(m_doc, m_userComment);
Packit Service 50c9f2
    t << endl;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else if (!m_userComment.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    t << convertToComment("", m_userComment);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  t << m_name << m_spaces.left(MAX_OPTION_LENGTH-m_name.length()) << "=";
Packit Service 50c9f2
  if (upd && !m_valueString.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    writeStringValue(t,m_valueString);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else
Packit Service 50c9f2
  {
Packit Service 50c9f2
    writeBoolValue(t,m_value);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  t << "\n";
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void ConfigObsolete::writeTemplate(FTextStream &,bool,bool) {}
Packit Service 50c9f2
void ConfigDisabled::writeTemplate(FTextStream &,bool,bool) {}
Packit Service 50c9f2
Packit Service 50c9f2
/* -----------------------------------------------------------------
Packit Service 50c9f2
 *
Packit Service 50c9f2
 *	static variables
Packit Service 50c9f2
 */
Packit Service 50c9f2
Packit Service 50c9f2
struct ConfigFileState
Packit Service 50c9f2
{
Packit Service 50c9f2
  int lineNr;
Packit Service 50c9f2
  FILE *filePtr;
Packit Service 50c9f2
  YY_BUFFER_STATE oldState;
Packit Service 50c9f2
  YY_BUFFER_STATE newState;
Packit Service 50c9f2
  QCString fileName;
Packit Service 50c9f2
};  
Packit Service 50c9f2
Packit Service 50c9f2
static const char       *inputString;
Packit Service 50c9f2
static int	         inputPosition;
Packit Service 50c9f2
static int               yyLineNr;
Packit Service 50c9f2
static QCString          yyFileName;
Packit Service 50c9f2
static QCString          tmpString;
Packit Service 50c9f2
static QCString         *s=0;
Packit Service 50c9f2
static bool             *b=0;
Packit Service 50c9f2
static QStrList         *l=0;
Packit Service 50c9f2
static int               lastState;
Packit Service 50c9f2
static QCString          elemStr;
Packit Service 50c9f2
static QStrList          includePathList;
Packit Service 50c9f2
static QStack<ConfigFileState> includeStack;  
Packit Service 50c9f2
static int               includeDepth;
Packit Service 50c9f2
static bool              config_upd = FALSE;
Packit Service 50c9f2
static QCString          encoding;
Packit Service 50c9f2
static ConfigImpl       *config;
Packit Service 50c9f2
Packit Service 50c9f2
/* -----------------------------------------------------------------
Packit Service 50c9f2
 */
Packit Service 50c9f2
#undef	YY_INPUT
Packit Service 50c9f2
#define	YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
Packit Service 50c9f2
Packit Service 50c9f2
static int yyread(char *buf,int max_size)
Packit Service 50c9f2
{
Packit Service 50c9f2
    // no file included
Packit Service 50c9f2
    if (includeStack.isEmpty()) 
Packit Service 50c9f2
    {
Packit Service 50c9f2
        int c=0;
Packit Service 50c9f2
	if (inputString==0) return c;
Packit Service 50c9f2
	while( c < max_size && inputString[inputPosition] )
Packit Service 50c9f2
	{
Packit Service 50c9f2
	      *buf = inputString[inputPosition++] ;
Packit Service 50c9f2
	      c++; buf++;
Packit Service 50c9f2
  	}
Packit Service 50c9f2
	return c;
Packit Service 50c9f2
    } 
Packit Service 50c9f2
    else 
Packit Service 50c9f2
    {
Packit Service 50c9f2
        //assert(includeStack.current()->newState==YY_CURRENT_BUFFER);
Packit Service 50c9f2
	return (int)fread(buf,1,max_size,includeStack.current()->filePtr);
Packit Service 50c9f2
    }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
static QCString configStringRecode(
Packit Service 50c9f2
    const QCString &str,
Packit Service 50c9f2
    const char *fromEncoding,
Packit Service 50c9f2
    const char *toEncoding)
Packit Service 50c9f2
{
Packit Service 50c9f2
  QCString inputEncoding = fromEncoding;
Packit Service 50c9f2
  QCString outputEncoding = toEncoding;
Packit Service 50c9f2
  if (inputEncoding.isEmpty() || outputEncoding.isEmpty() || inputEncoding==outputEncoding) return str;
Packit Service 50c9f2
  int inputSize=str.length();
Packit Service 50c9f2
  int outputSize=inputSize*4+1;
Packit Service 50c9f2
  QCString output(outputSize);
Packit Service 50c9f2
  void *cd = portable_iconv_open(outputEncoding,inputEncoding);
Packit Service 50c9f2
  if (cd==(void *)(-1)) 
Packit Service 50c9f2
  {
Packit Service 50c9f2
    fprintf(stderr,"Error: unsupported character conversion: '%s'->'%s'\n",
Packit Service 50c9f2
        inputEncoding.data(),outputEncoding.data());
Packit Service 50c9f2
    exit(1);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  size_t iLeft=(size_t)inputSize;
Packit Service 50c9f2
  size_t oLeft=(size_t)outputSize;
Packit Service 50c9f2
  char *inputPtr  = str.rawData();
Packit Service 50c9f2
  char *outputPtr = output.rawData();
Packit Service 50c9f2
  if (!portable_iconv(cd, &inputPtr, &iLeft, &outputPtr, &oLeft))
Packit Service 50c9f2
  {
Packit Service 50c9f2
    outputSize-=(int)oLeft;
Packit Service 50c9f2
    output.resize(outputSize+1);
Packit Service 50c9f2
    output.at(outputSize)='\0';
Packit Service 50c9f2
    //printf("iconv: input size=%d output size=%d\n[%s]\n",size,newSize,srcBuf.data());
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else
Packit Service 50c9f2
  {
Packit Service 50c9f2
    fprintf(stderr,"Error: failed to translate characters from %s to %s: %s\n",
Packit Service 50c9f2
        inputEncoding.data(),outputEncoding.data(),strerror(errno));
Packit Service 50c9f2
    exit(1);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  portable_iconv_close(cd);
Packit Service 50c9f2
  return output;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
static void checkEncoding()
Packit Service 50c9f2
{
Packit Service 50c9f2
  ConfigString *option = (ConfigString*)config->get("DOXYFILE_ENCODING");
Packit Service 50c9f2
  encoding = *option->valueRef();
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
static FILE *tryPath(const char *path,const char *fileName)
Packit Service 50c9f2
{
Packit Service 50c9f2
  QCString absName=(path ? (QCString)path+"/"+fileName : (QCString)fileName);
Packit Service 50c9f2
  QFileInfo fi(absName);
Packit Service 50c9f2
  if (fi.exists() && fi.isFile())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    FILE *f=portable_fopen(absName,"r");
Packit Service 50c9f2
    if (!f) config_err("could not open file %s for reading\n",absName.data());
Packit Service 50c9f2
    return f;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  return 0;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
static void substEnvVarsInStrList(QStrList &sl);
Packit Service 50c9f2
static void substEnvVarsInString(QCString &s);
Packit Service 50c9f2
Packit Service 50c9f2
static FILE *findFile(const char *fileName)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (fileName==0)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    return 0;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (portable_isAbsolutePath(fileName))
Packit Service 50c9f2
  {
Packit Service 50c9f2
    return tryPath(NULL, fileName);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  substEnvVarsInStrList(includePathList);
Packit Service 50c9f2
  char *s=includePathList.first();
Packit Service 50c9f2
  while (s) // try each of the include paths
Packit Service 50c9f2
  {
Packit Service 50c9f2
    FILE *f = tryPath(s,fileName);
Packit Service 50c9f2
    if (f) return f;
Packit Service 50c9f2
    s=includePathList.next();
Packit Service 50c9f2
  } 
Packit Service 50c9f2
  // try cwd if includePathList fails
Packit Service 50c9f2
  return tryPath(".",fileName);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
static void readIncludeFile(const char *incName)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (includeDepth==MAX_INCLUDE_DEPTH) {
Packit Service 50c9f2
    config_err("maximum include depth (%d) reached, %s is not included. Aborting...\n",
Packit Service 50c9f2
	MAX_INCLUDE_DEPTH,incName);
Packit Service 50c9f2
    exit(1);
Packit Service 50c9f2
  } 
Packit Service 50c9f2
Packit Service 50c9f2
  QCString inc = incName;
Packit Service 50c9f2
  substEnvVarsInString(inc);
Packit Service 50c9f2
  inc = inc.stripWhiteSpace();
Packit Service 50c9f2
  uint incLen = inc.length();
Packit Service 50c9f2
  if (incLen>0 && inc.at(0)=='"' && inc.at(incLen-1)=='"') // strip quotes
Packit Service 50c9f2
  {
Packit Service 50c9f2
    inc=inc.mid(1,incLen-2);
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  FILE *f;
Packit Service 50c9f2
Packit Service 50c9f2
  if ((f=findFile(inc))) // see if the include file can be found
Packit Service 50c9f2
  {
Packit Service 50c9f2
    // For debugging
Packit Service 50c9f2
#if SHOW_INCLUDES
Packit Service 50c9f2
    for (i=0;i
Packit Service 50c9f2
    msg("@INCLUDE = %s: parsing...\n",inc.data());
Packit Service 50c9f2
#endif
Packit Service 50c9f2
Packit Service 50c9f2
    // store the state of the old file 
Packit Service 50c9f2
    ConfigFileState *fs=new ConfigFileState;
Packit Service 50c9f2
    fs->oldState=YY_CURRENT_BUFFER;
Packit Service 50c9f2
    fs->lineNr=yyLineNr;
Packit Service 50c9f2
    fs->fileName=yyFileName;
Packit Service 50c9f2
    fs->filePtr=f;
Packit Service 50c9f2
    // push the state on the stack
Packit Service 50c9f2
    includeStack.push(fs);
Packit Service 50c9f2
    // set the scanner to the include file
Packit Service 50c9f2
    yy_switch_to_buffer(yy_create_buffer(f, YY_BUF_SIZE));
Packit Service 50c9f2
    fs->newState=YY_CURRENT_BUFFER;
Packit Service 50c9f2
    yyFileName=inc;
Packit Service 50c9f2
    includeDepth++;
Packit Service 50c9f2
  } 
Packit Service 50c9f2
  else
Packit Service 50c9f2
  {
Packit Service 50c9f2
    config_err("@INCLUDE = %s: not found!\n",inc.data());
Packit Service 50c9f2
    exit(1);
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
%}
Packit Service 50c9f2
Packit Service 50c9f2
%option noyywrap
Packit Service 50c9f2
Packit Service 50c9f2
%x      PreStart
Packit Service 50c9f2
%x      Start
Packit Service 50c9f2
%x	SkipComment
Packit Service 50c9f2
%x      SkipInvalid
Packit Service 50c9f2
%x      GetString
Packit Service 50c9f2
%x      GetBool
Packit Service 50c9f2
%x      GetStrList
Packit Service 50c9f2
%x      GetQuotedString
Packit Service 50c9f2
%x      GetEnvVar
Packit Service 50c9f2
%x      Include
Packit Service 50c9f2
Packit Service 50c9f2
%%
Packit Service 50c9f2
Packit Service 50c9f2
<*>\0x0d
Packit Service 50c9f2
<PreStart>"##".*"\n" { config->appendStartComment(yytext);}
Packit Service 50c9f2
<PreStart>. {
Packit Service 50c9f2
              BEGIN(Start);
Packit Service 50c9f2
              unput(*yytext);
Packit Service 50c9f2
            }
Packit Service 50c9f2
<Start,GetString,GetStrList,GetBool,SkipInvalid>"##".*"\n" { config->appendUserComment(yytext);}
Packit Service 50c9f2
<Start,GetString,GetStrList,GetBool,SkipInvalid>"#"	   { BEGIN(SkipComment); }
Packit Service 50c9f2
<Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"="	 { QCString cmd=yytext;
Packit Service 50c9f2
                                           cmd=cmd.left(cmd.length()-1).stripWhiteSpace(); 
Packit Service 50c9f2
					   ConfigOption *option = config->get(cmd);
Packit Service 50c9f2
					   if (option==0) // oops not known
Packit Service 50c9f2
					   {
Packit Service 50c9f2
					     config_warn("ignoring unsupported tag `%s' at line %d, file %s\n",
Packit Service 50c9f2
						 yytext,yyLineNr,yyFileName.data()); 
Packit Service 50c9f2
					     BEGIN(SkipInvalid);
Packit Service 50c9f2
					   }
Packit Service 50c9f2
					   else // known tag
Packit Service 50c9f2
					   {
Packit Service 50c9f2
                                             option->setUserComment(config->takeUserComment());
Packit Service 50c9f2
					     option->setEncoding(encoding);
Packit Service 50c9f2
					     switch(option->kind())
Packit Service 50c9f2
					     {
Packit Service 50c9f2
					       case ConfigOption::O_Info:
Packit Service 50c9f2
						 // shouldn't get here!
Packit Service 50c9f2
					         BEGIN(SkipInvalid);
Packit Service 50c9f2
						 break;
Packit Service 50c9f2
					       case ConfigOption::O_List:
Packit Service 50c9f2
						 l = ((ConfigList *)option)->valueRef();
Packit Service 50c9f2
					         l->clear();
Packit Service 50c9f2
						 elemStr="";
Packit Service 50c9f2
					         BEGIN(GetStrList);
Packit Service 50c9f2
					         break;
Packit Service 50c9f2
					       case ConfigOption::O_Enum:
Packit Service 50c9f2
						 s = ((ConfigEnum *)option)->valueRef();
Packit Service 50c9f2
					         s->resize(0);
Packit Service 50c9f2
					         BEGIN(GetString);
Packit Service 50c9f2
					         break;
Packit Service 50c9f2
					       case ConfigOption::O_String:
Packit Service 50c9f2
						 s = ((ConfigString *)option)->valueRef();
Packit Service 50c9f2
					         s->resize(0);
Packit Service 50c9f2
					         BEGIN(GetString);
Packit Service 50c9f2
					         break;
Packit Service 50c9f2
					       case ConfigOption::O_Int:
Packit Service 50c9f2
						 s = ((ConfigInt *)option)->valueStringRef();
Packit Service 50c9f2
					         s->resize(0);
Packit Service 50c9f2
					         BEGIN(GetString);
Packit Service 50c9f2
					         break;
Packit Service 50c9f2
					       case ConfigOption::O_Bool:
Packit Service 50c9f2
						 s = ((ConfigBool *)option)->valueStringRef();
Packit Service 50c9f2
					         s->resize(0);
Packit Service 50c9f2
					         BEGIN(GetString);
Packit Service 50c9f2
						 break;
Packit Service 50c9f2
					       case ConfigOption::O_Obsolete:
Packit Service 50c9f2
                                                 if (config_upd)
Packit Service 50c9f2
                                                 {
Packit Service 50c9f2
					           config_warn("Tag `%s' at line %d of file `%s' has become obsolete.\n"
Packit Service 50c9f2
						              "         This tag has been removed.\n", cmd.data(),yyLineNr,yyFileName.data());
Packit Service 50c9f2
                                                 }
Packit Service 50c9f2
                                                 else
Packit Service 50c9f2
                                                 {
Packit Service 50c9f2
					           config_warn("Tag `%s' at line %d of file `%s' has become obsolete.\n"
Packit Service 50c9f2
						              "         To avoid this warning please remove this line from your configuration "
Packit Service 50c9f2
							      "file or upgrade it using \"doxygen -u\"\n", cmd.data(),yyLineNr,yyFileName.data()); 
Packit Service 50c9f2
                                                 }
Packit Service 50c9f2
					         BEGIN(SkipInvalid);
Packit Service 50c9f2
						 break;
Packit Service 50c9f2
					       case ConfigOption::O_Disabled:
Packit Service 50c9f2
                                                 if (config_upd)
Packit Service 50c9f2
                                                 {
Packit Service 50c9f2
					           config_warn("Tag `%s' at line %d of file `%s' belongs to an option that was not enabled at compile time.\n"
Packit Service 50c9f2
						              "         This tag has been removed.\n", cmd.data(),yyLineNr,yyFileName.data());
Packit Service 50c9f2
                                                 }
Packit Service 50c9f2
                                                 else
Packit Service 50c9f2
                                                 {
Packit Service 50c9f2
					           config_warn("Tag `%s' at line %d of file `%s' belongs to an option that was not enabled at compile time.\n"
Packit Service 50c9f2
						              "         To avoid this warning please remove this line from your configuration "
Packit Service 50c9f2
							    "file or upgrade it using \"doxygen -u\", or recompile doxygen with this feature enabled.\n", cmd.data(),yyLineNr,yyFileName.data()); 
Packit Service 50c9f2
                                                 }
Packit Service 50c9f2
					         BEGIN(SkipInvalid);
Packit Service 50c9f2
						 break;
Packit Service 50c9f2
					     }
Packit Service 50c9f2
					   }
Packit Service 50c9f2
					}
Packit Service 50c9f2
<Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"+="	{ QCString cmd=yytext;
Packit Service 50c9f2
                                          cmd=cmd.left(cmd.length()-2).stripWhiteSpace(); 
Packit Service 50c9f2
					  ConfigOption *option = config->get(cmd);
Packit Service 50c9f2
					  if (option==0) // oops not known
Packit Service 50c9f2
					  {
Packit Service 50c9f2
					    config_warn("ignoring unsupported tag `%s' at line %d, file %s\n",
Packit Service 50c9f2
						yytext,yyLineNr,yyFileName.data()); 
Packit Service 50c9f2
					    BEGIN(SkipInvalid);
Packit Service 50c9f2
					  }
Packit Service 50c9f2
					  else // known tag
Packit Service 50c9f2
					  {
Packit Service 50c9f2
                                            option->setUserComment(config->takeUserComment());
Packit Service 50c9f2
					    switch(option->kind())
Packit Service 50c9f2
					    {
Packit Service 50c9f2
					      case ConfigOption::O_Info:
Packit Service 50c9f2
					        // shouldn't get here!
Packit Service 50c9f2
					        BEGIN(SkipInvalid);
Packit Service 50c9f2
						break;
Packit Service 50c9f2
					      case ConfigOption::O_List:
Packit Service 50c9f2
					        l = ((ConfigList *)option)->valueRef();
Packit Service 50c9f2
						elemStr="";
Packit Service 50c9f2
					        BEGIN(GetStrList);
Packit Service 50c9f2
					        break;
Packit Service 50c9f2
					      case ConfigOption::O_Enum:
Packit Service 50c9f2
					      case ConfigOption::O_String:
Packit Service 50c9f2
					      case ConfigOption::O_Int:
Packit Service 50c9f2
					      case ConfigOption::O_Bool:
Packit Service 50c9f2
					        config_warn("operator += not supported for `%s'. Ignoring line at line %d, file %s\n",
Packit Service 50c9f2
						    yytext,yyLineNr,yyFileName.data()); 
Packit Service 50c9f2
					        BEGIN(SkipInvalid);
Packit Service 50c9f2
						break;
Packit Service 50c9f2
					       case ConfigOption::O_Obsolete:
Packit Service 50c9f2
					         config_warn("Tag `%s' at line %d of file %s has become obsolete.\n"
Packit Service 50c9f2
						            "To avoid this warning please update your configuration "
Packit Service 50c9f2
							    "file using \"doxygen -u\"\n", cmd.data(),yyLineNr,yyFileName.data()); 
Packit Service 50c9f2
					         BEGIN(SkipInvalid);
Packit Service 50c9f2
						 break;
Packit Service 50c9f2
					       case ConfigOption::O_Disabled:
Packit Service 50c9f2
					         config_warn("Tag `%s' at line %d of file %s belongs to an option that was not enabled at compile time.\n"
Packit Service 50c9f2
						            "To avoid this warning please remove this line from your configuration "
Packit Service 50c9f2
							    "file, upgrade it using \"doxygen -u\", or recompile doxygen with this feature enabled.\n", cmd.data(),yyLineNr,yyFileName.data()); 
Packit Service 50c9f2
					         BEGIN(SkipInvalid);
Packit Service 50c9f2
						 break;
Packit Service 50c9f2
					     }
Packit Service 50c9f2
					   }
Packit Service 50c9f2
					}
Packit Service 50c9f2
<Start>"@INCLUDE_PATH"[ \t]*"=" 	{ BEGIN(GetStrList); l=&includePathList; l->clear(); elemStr=""; }
Packit Service 50c9f2
  /* include a config file */
Packit Service 50c9f2
<Start>"@INCLUDE"[ \t]*"="     		{ BEGIN(Include);}
Packit Service 50c9f2
<Include>([^ \"\t\r\n]+)|("\""[^\n\"]+"\"") { 
Packit Service 50c9f2
  					  readIncludeFile(configStringRecode(yytext,encoding,"UTF-8")); 
Packit Service 50c9f2
  					  BEGIN(Start);
Packit Service 50c9f2
					}
Packit Service 50c9f2
<<EOF>>					{
Packit Service 50c9f2
                                          //printf("End of include file\n");
Packit Service 50c9f2
					  //printf("Include stack depth=%d\n",g_includeStack.count());
Packit Service 50c9f2
                                          if (includeStack.isEmpty())
Packit Service 50c9f2
					  {
Packit Service 50c9f2
					    //printf("Terminating scanner!\n");
Packit Service 50c9f2
					    yyterminate();
Packit Service 50c9f2
					  }
Packit Service 50c9f2
					  else
Packit Service 50c9f2
					  {
Packit Service 50c9f2
					    ConfigFileState *fs=includeStack.pop();
Packit Service 50c9f2
					    fclose(fs->filePtr);
Packit Service 50c9f2
					    YY_BUFFER_STATE oldBuf = YY_CURRENT_BUFFER;
Packit Service 50c9f2
					    yy_switch_to_buffer( fs->oldState );
Packit Service 50c9f2
					    yy_delete_buffer( oldBuf );
Packit Service 50c9f2
					    yyLineNr=fs->lineNr;
Packit Service 50c9f2
					    yyFileName=fs->fileName;
Packit Service 50c9f2
					    delete fs; fs=0;
Packit Service 50c9f2
                                            includeDepth--;
Packit Service 50c9f2
					  }
Packit Service 50c9f2
  					}
Packit Service 50c9f2
Packit Service 50c9f2
<Start>[a-z_A-Z0-9]+			{ config_warn("ignoring unknown tag `%s' at line %d, file %s\n",yytext,yyLineNr,yyFileName.data()); }
Packit Service 50c9f2
<GetString,GetBool,SkipInvalid>\n	{ yyLineNr++; BEGIN(Start); }
Packit Service 50c9f2
<GetStrList>\n				{ 
Packit Service 50c9f2
  					  yyLineNr++; 
Packit Service 50c9f2
					  if (!elemStr.isEmpty())
Packit Service 50c9f2
					  {
Packit Service 50c9f2
					    //printf("elemStr1=`%s'\n",elemStr.data());
Packit Service 50c9f2
					    l->append(elemStr);
Packit Service 50c9f2
					  }
Packit Service 50c9f2
					  BEGIN(Start); 
Packit Service 50c9f2
					}
Packit Service 50c9f2
<GetStrList>[ \t]+			{
Packit Service 50c9f2
  				          if (!elemStr.isEmpty())
Packit Service 50c9f2
					  {
Packit Service 50c9f2
					    //printf("elemStr2=`%s'\n",elemStr.data());
Packit Service 50c9f2
  					    l->append(elemStr);
Packit Service 50c9f2
					  }
Packit Service 50c9f2
					  elemStr.resize(0);
Packit Service 50c9f2
  					}
Packit Service 50c9f2
<GetString>[^ \"\t\r\n]+		{ (*s)+=configStringRecode(yytext,encoding,"UTF-8"); 
Packit Service 50c9f2
                                          checkEncoding();
Packit Service 50c9f2
                                        }
Packit Service 50c9f2
<GetString,GetStrList,SkipInvalid>"\""	{ lastState=YY_START;
Packit Service 50c9f2
  					  BEGIN(GetQuotedString); 
Packit Service 50c9f2
                                          tmpString.resize(0); 
Packit Service 50c9f2
					}
Packit Service 50c9f2
<GetQuotedString>"\""|"\n" 		{ 
Packit Service 50c9f2
                                          // we add a bogus space to signal that the string was quoted. This space will be stripped later on.
Packit Service 50c9f2
                                          tmpString+=" ";
Packit Service 50c9f2
  					  //printf("Quoted String = `%s'\n",tmpString.data());
Packit Service 50c9f2
  					  if (lastState==GetString)
Packit Service 50c9f2
					  {
Packit Service 50c9f2
					    (*s)+=configStringRecode(tmpString,encoding,"UTF-8");
Packit Service 50c9f2
                                            checkEncoding();
Packit Service 50c9f2
					  }
Packit Service 50c9f2
					  else
Packit Service 50c9f2
					  {
Packit Service 50c9f2
					    elemStr+=configStringRecode(tmpString,encoding,"UTF-8");
Packit Service 50c9f2
					  }
Packit Service 50c9f2
					  if (*yytext=='\n')
Packit Service 50c9f2
					  {
Packit Service 50c9f2
					    config_warn("Missing end quote (\") on line %d, file %s\n",yyLineNr,yyFileName.data());
Packit Service 50c9f2
					    yyLineNr++;
Packit Service 50c9f2
					  }
Packit Service 50c9f2
					  BEGIN(lastState);
Packit Service 50c9f2
  					}
Packit Service 50c9f2
<GetQuotedString>"\\\""			{
Packit Service 50c9f2
  					  tmpString+='"';
Packit Service 50c9f2
  					}
Packit Service 50c9f2
<GetQuotedString>.			{ tmpString+=*yytext; }
Packit Service 50c9f2
<GetBool>[a-zA-Z]+			{ 
Packit Service 50c9f2
  					  QCString bs=yytext; 
Packit Service 50c9f2
  					  bs=bs.upper();
Packit Service 50c9f2
  					  if (bs=="YES" || bs=="1")
Packit Service 50c9f2
					    *b=TRUE;
Packit Service 50c9f2
					  else if (bs=="NO" || bs=="0")
Packit Service 50c9f2
					    *b=FALSE;
Packit Service 50c9f2
					  else 
Packit Service 50c9f2
					  {
Packit Service 50c9f2
					    *b=FALSE; 
Packit Service 50c9f2
					    config_warn("Invalid value `%s' for "
Packit Service 50c9f2
						 "boolean tag in line %d, file %s; use YES or NO\n",
Packit Service 50c9f2
						 bs.data(),yyLineNr,yyFileName.data());
Packit Service 50c9f2
					  }
Packit Service 50c9f2
					}
Packit Service 50c9f2
<GetStrList>[^ \#\"\t\r\n]+		{
Packit Service 50c9f2
  					  elemStr+=configStringRecode(yytext,encoding,"UTF-8");
Packit Service 50c9f2
  					}
Packit Service 50c9f2
<SkipComment>\n				{ yyLineNr++; BEGIN(Start); }
Packit Service 50c9f2
<SkipComment>\\[ \r\t]*\n		{ yyLineNr++; BEGIN(Start); }
Packit Service 50c9f2
<*>\\[ \r\t]*\n				{ yyLineNr++; }
Packit Service 50c9f2
<*>.					
Packit Service 50c9f2
<*>\n					{ yyLineNr++ ; }
Packit Service 50c9f2
Packit Service 50c9f2
%%
Packit Service 50c9f2
Packit Service 50c9f2
/*@ ----------------------------------------------------------------------------
Packit Service 50c9f2
 */
Packit Service 50c9f2
Packit Service 50c9f2
void ConfigImpl::writeTemplate(FTextStream &t,bool sl,bool upd)
Packit Service 50c9f2
{
Packit Service 50c9f2
  /* print first lines of user comment that were at the beginning of the file, might have special meaning for editors */
Packit Service 50c9f2
  if (m_startComment)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    t << takeStartComment() << endl; 
Packit Service 50c9f2
  }
Packit Service 50c9f2
  t << "# Doxyfile " << versionString << endl << endl;
Packit Service 50c9f2
  if (!sl)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    t << convertToComment(m_header,"");
Packit Service 50c9f2
  }
Packit Service 50c9f2
  QListIterator<ConfigOption> it = iterator();
Packit Service 50c9f2
  ConfigOption *option;
Packit Service 50c9f2
  for (;(option=it.current());++it)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    option->writeTemplate(t,sl,upd);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  /* print last lines of user comment that were at the end of the file */
Packit Service 50c9f2
  if (m_userComment)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    t << "\n";
Packit Service 50c9f2
    t << takeUserComment();
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void ConfigImpl::convertStrToVal()
Packit Service 50c9f2
{
Packit Service 50c9f2
  QListIterator<ConfigOption> it = iterator();
Packit Service 50c9f2
  ConfigOption *option;
Packit Service 50c9f2
  for (;(option=it.current());++it)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    option->convertStrToVal();
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
static void substEnvVarsInString(QCString &s)
Packit Service 50c9f2
{
Packit Service 50c9f2
  static QRegExp re("\\$\\([a-z_A-Z0-9.-]+\\)");
Packit Service 50c9f2
  static QRegExp re2("\\$\\([a-z_A-Z0-9.-]+\\([a-z_A-Z0-9.-]+\\)\\)"); // For e.g. PROGRAMFILES(X86)
Packit Service 50c9f2
  if (s.isEmpty()) return;
Packit Service 50c9f2
  int p=0;
Packit Service 50c9f2
  int i,l;
Packit Service 50c9f2
  //printf("substEnvVarInString(%s) start\n",s.data());
Packit Service 50c9f2
  while ((i=re.match(s,p,&l))!=-1 || (i=re2.match(s,p,&l))!=-1)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    //printf("Found environment var s.mid(%d,%d)=`%s'\n",i+2,l-3,s.mid(i+2,l-3).data());
Packit Service 50c9f2
    QCString env=portable_getenv(s.mid(i+2,l-3));
Packit Service 50c9f2
    substEnvVarsInString(env); // recursively expand variables if needed.
Packit Service 50c9f2
    s = s.left(i)+env+s.right(s.length()-i-l);
Packit Service 50c9f2
    p=i+env.length(); // next time start at the end of the expanded string
Packit Service 50c9f2
  }
Packit Service 50c9f2
  s=s.stripWhiteSpace(); // to strip the bogus space that was added when an argument
Packit Service 50c9f2
                         // has quotes
Packit Service 50c9f2
  //printf("substEnvVarInString(%s) end\n",s.data());
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
static void substEnvVarsInStrList(QStrList &sl)
Packit Service 50c9f2
{
Packit Service 50c9f2
  char *s = sl.first();
Packit Service 50c9f2
  while (s)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QCString result(s);
Packit Service 50c9f2
    // an argument with quotes will have an extra space at the end, so wasQuoted will be TRUE.
Packit Service 50c9f2
    bool wasQuoted = (result.find(' ')!=-1) || (result.find('\t')!=-1);
Packit Service 50c9f2
    // here we strip the quote again
Packit Service 50c9f2
    substEnvVarsInString(result);
Packit Service 50c9f2
Packit Service 50c9f2
    //printf("Result %s was quoted=%d\n",result.data(),wasQuoted);
Packit Service 50c9f2
Packit Service 50c9f2
    if (!wasQuoted) /* as a result of the expansion, a single string
Packit Service 50c9f2
		       may have expanded into a list, which we'll
Packit Service 50c9f2
		       add to sl. If the original string already 
Packit Service 50c9f2
		       contained multiple elements no further 
Packit Service 50c9f2
		       splitting is done to allow quoted items with spaces! */
Packit Service 50c9f2
    {
Packit Service 50c9f2
      int l=result.length();
Packit Service 50c9f2
      int i,p=0;
Packit Service 50c9f2
      // skip spaces
Packit Service 50c9f2
      // search for a "word"
Packit Service 50c9f2
      for (i=0;i
Packit Service 50c9f2
      {
Packit Service 50c9f2
	char c=0;
Packit Service 50c9f2
	// skip until start of new word
Packit Service 50c9f2
	while (i
Packit Service 50c9f2
	p=i; // p marks the start index of the word
Packit Service 50c9f2
	// skip until end of a word
Packit Service 50c9f2
	while (i
Packit Service 50c9f2
	if (i
Packit Service 50c9f2
	{
Packit Service 50c9f2
	  if (c=='"') // word within quotes
Packit Service 50c9f2
	  {
Packit Service 50c9f2
	    p=i+1;
Packit Service 50c9f2
	    for (i++;i
Packit Service 50c9f2
	    {
Packit Service 50c9f2
	      c=result.at(i);
Packit Service 50c9f2
	      if (c=='"') // end quote
Packit Service 50c9f2
	      {
Packit Service 50c9f2
		// replace the string in the list and go to the next item.
Packit Service 50c9f2
		sl.insert(sl.at(),result.mid(p,i-p)); // insert new item before current item.
Packit Service 50c9f2
		sl.next();                 // current item is now the old item
Packit Service 50c9f2
		p=i+1;
Packit Service 50c9f2
		break; 
Packit Service 50c9f2
	      }
Packit Service 50c9f2
	      else if (c=='\\') // skip escaped stuff
Packit Service 50c9f2
	      {
Packit Service 50c9f2
		i++;
Packit Service 50c9f2
	      }
Packit Service 50c9f2
	    }
Packit Service 50c9f2
	  }
Packit Service 50c9f2
	  else if (c==' ' || c=='\t') // separator
Packit Service 50c9f2
	  {
Packit Service 50c9f2
	    // replace the string in the list and go to the next item.
Packit Service 50c9f2
	    sl.insert(sl.at(),result.mid(p,i-p)); // insert new item before current item.
Packit Service 50c9f2
	    sl.next();                 // current item is now the old item
Packit Service 50c9f2
	    p=i+1;
Packit Service 50c9f2
	  }
Packit Service 50c9f2
	}
Packit Service 50c9f2
      }
Packit Service 50c9f2
      if (p!=l) // add the leftover as a string
Packit Service 50c9f2
      {
Packit Service 50c9f2
	// replace the string in the list and go to the next item.
Packit Service 50c9f2
	sl.insert(sl.at(),result.right(l-p)); // insert new item before current item.
Packit Service 50c9f2
	sl.next();                 // current item is now the old item
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else // just goto the next element in the list
Packit Service 50c9f2
    {
Packit Service 50c9f2
      sl.insert(sl.at(),result);
Packit Service 50c9f2
      sl.next();
Packit Service 50c9f2
    }
Packit Service 50c9f2
    // remove the old unexpanded string from the list
Packit Service 50c9f2
    int i=sl.at();
Packit Service 50c9f2
    sl.remove(); // current item index changes if the last element is removed.
Packit Service 50c9f2
    if (sl.at()==i)     // not last item
Packit Service 50c9f2
	s = sl.current();
Packit Service 50c9f2
    else                // just removed last item
Packit Service 50c9f2
	s = 0;
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void ConfigString::substEnvVars()
Packit Service 50c9f2
{
Packit Service 50c9f2
  substEnvVarsInString(m_value);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void ConfigList::substEnvVars()
Packit Service 50c9f2
{
Packit Service 50c9f2
  substEnvVarsInStrList(m_value);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void ConfigBool::substEnvVars()
Packit Service 50c9f2
{
Packit Service 50c9f2
  substEnvVarsInString(m_valueString);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void ConfigInt::substEnvVars()
Packit Service 50c9f2
{
Packit Service 50c9f2
  substEnvVarsInString(m_valueString);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void ConfigEnum::substEnvVars()
Packit Service 50c9f2
{
Packit Service 50c9f2
  substEnvVarsInString(m_value);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
//---------------------------------------------
Packit Service 50c9f2
Packit Service 50c9f2
void ConfigImpl::substituteEnvironmentVars()
Packit Service 50c9f2
{
Packit Service 50c9f2
  QListIterator<ConfigOption> it = iterator();
Packit Service 50c9f2
  ConfigOption *option;
Packit Service 50c9f2
  for (;(option=it.current());++it)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    option->substEnvVars();
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void ConfigImpl::init()
Packit Service 50c9f2
{
Packit Service 50c9f2
  QListIterator<ConfigOption> it = iterator();
Packit Service 50c9f2
  ConfigOption *option;
Packit Service 50c9f2
  for (;(option=it.current());++it)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    option->init();
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // sanity check if all depends relations are valid
Packit Service 50c9f2
  for (it.toFirst();(option=it.current());++it)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QCString depName = option->dependsOn();
Packit Service 50c9f2
    if (!depName.isEmpty())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      ConfigOption * opt = ConfigImpl::instance()->get(depName);
Packit Service 50c9f2
      if (opt==0)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        config_warn("Config option '%s' has invalid depends relation on unknown option '%s'\n",
Packit Service 50c9f2
            option->name().data(),depName.data());
Packit Service 50c9f2
        exit(1);
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void ConfigImpl::create()
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (m_initialized) return; 
Packit Service 50c9f2
  m_initialized = TRUE;
Packit Service 50c9f2
  addConfigOptions(this);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
static QCString configFileToString(const char *name)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (name==0 || name[0]==0) return 0;
Packit Service 50c9f2
  QFile f;
Packit Service 50c9f2
Packit Service 50c9f2
  bool fileOpened=FALSE;
Packit Service 50c9f2
  if (name[0]=='-' && name[1]==0) // read from stdin
Packit Service 50c9f2
  {
Packit Service 50c9f2
    fileOpened=f.open(IO_ReadOnly,stdin);
Packit Service 50c9f2
    if (fileOpened)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      const int bSize=4096;
Packit Service 50c9f2
      QCString contents(bSize);
Packit Service 50c9f2
      int totalSize=0;
Packit Service 50c9f2
      int size;
Packit Service 50c9f2
      while ((size=f.readBlock(contents.rawData()+totalSize,bSize))==bSize)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        totalSize+=bSize;
Packit Service 50c9f2
        contents.resize(totalSize+bSize); 
Packit Service 50c9f2
      }
Packit Service 50c9f2
      totalSize+=size+2;
Packit Service 50c9f2
      contents.resize(totalSize);
Packit Service 50c9f2
      contents.at(totalSize-2)='\n'; // to help the scanner
Packit Service 50c9f2
      contents.at(totalSize-1)='\0';
Packit Service 50c9f2
      return contents;
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else // read from file
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QFileInfo fi(name);
Packit Service 50c9f2
    if (!fi.exists() || !fi.isFile())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      config_err("file `%s' not found\n",name);
Packit Service 50c9f2
      return "";
Packit Service 50c9f2
    }
Packit Service 50c9f2
    f.setName(name);
Packit Service 50c9f2
    fileOpened=f.open(IO_ReadOnly);
Packit Service 50c9f2
    if (fileOpened)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      int fsize=f.size();
Packit Service 50c9f2
      QCString contents(fsize+2);
Packit Service 50c9f2
      f.readBlock(contents.rawData(),fsize);
Packit Service 50c9f2
      f.close();
Packit Service 50c9f2
      if (fsize==0 || contents[fsize-1]=='\n') 
Packit Service 50c9f2
	contents[fsize]='\0';
Packit Service 50c9f2
      else
Packit Service 50c9f2
	contents[fsize]='\n'; // to help the scanner
Packit Service 50c9f2
      contents[fsize+1]='\0';
Packit Service 50c9f2
      return contents;
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (!fileOpened)  
Packit Service 50c9f2
  {
Packit Service 50c9f2
    config_err("cannot open file `%s' for reading\n",name);
Packit Service 50c9f2
    exit(1);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  return "";
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
bool ConfigImpl::parseString(const char *fn,const char *str,bool update)
Packit Service 50c9f2
{
Packit Service 50c9f2
  config = ConfigImpl::instance();
Packit Service 50c9f2
  inputString   = str;
Packit Service 50c9f2
  inputPosition = 0;
Packit Service 50c9f2
  yyFileName    = fn;
Packit Service 50c9f2
  yyLineNr      = 1;
Packit Service 50c9f2
  includeStack.setAutoDelete(TRUE);
Packit Service 50c9f2
  includeStack.clear();
Packit Service 50c9f2
  includeDepth  = 0;
Packit Service 50c9f2
  configimplYYrestart( configimplYYin );
Packit Service 50c9f2
  BEGIN( PreStart );
Packit Service 50c9f2
  config_upd = update;
Packit Service 50c9f2
  configimplYYlex();
Packit Service 50c9f2
  config_upd = FALSE;
Packit Service 50c9f2
  inputString = 0;
Packit Service 50c9f2
  return TRUE;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
bool ConfigImpl::parse(const char *fn,bool update)
Packit Service 50c9f2
{
Packit Service 50c9f2
  int retval;
Packit Service 50c9f2
  encoding = "UTF-8";
Packit Service 50c9f2
  printlex(yy_flex_debug, TRUE, __FILE__, fn);
Packit Service 50c9f2
  retval =  parseString(fn,configFileToString(fn), update); 
Packit Service 50c9f2
  printlex(yy_flex_debug, FALSE, __FILE__, fn);
Packit Service 50c9f2
  return retval;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
//----------------------------------------------------------------------
Packit Service 50c9f2
Packit Service 50c9f2
static void cleanUpPaths(QStrList &str)
Packit Service 50c9f2
{
Packit Service 50c9f2
  char *sfp = str.first();
Packit Service 50c9f2
  while (sfp)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    register char *p = sfp;
Packit Service 50c9f2
    if (p)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      char c;
Packit Service 50c9f2
      while ((c=*p))
Packit Service 50c9f2
      {
Packit Service 50c9f2
        if (c=='\\') *p='/';
Packit Service 50c9f2
        p++;
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
    QCString path = sfp;
Packit Service 50c9f2
    if ((path.at(0)!='/' && (path.length()<=2 || path.at(1)!=':')) ||
Packit Service 50c9f2
         path.at(path.length()-1)!='/'
Packit Service 50c9f2
       )
Packit Service 50c9f2
    {
Packit Service 50c9f2
      QFileInfo fi(path);
Packit Service 50c9f2
      if (fi.exists() && fi.isDir())
Packit Service 50c9f2
      {
Packit Service 50c9f2
        int i = str.at();
Packit Service 50c9f2
        QString p = fi.absFilePath();
Packit Service 50c9f2
        if (p.at(p.length()-1)!='/')
Packit Service 50c9f2
          p.append('/');
Packit Service 50c9f2
        str.remove();
Packit Service 50c9f2
        if (str.at()==i) // did not remove last item
Packit Service 50c9f2
          str.insert(i,p.utf8());
Packit Service 50c9f2
        else
Packit Service 50c9f2
          str.append(p.utf8());
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
    sfp = str.next();
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
static void checkFileName(QCString &s,const char *optionName)
Packit Service 50c9f2
{
Packit Service 50c9f2
  QCString val = s.stripWhiteSpace().lower();
Packit Service 50c9f2
  if ((val=="yes" || val=="true"  || val=="1" || val=="all") ||
Packit Service 50c9f2
      (val=="no"  || val=="false" || val=="0" || val=="none"))
Packit Service 50c9f2
  {
Packit Service 50c9f2
    err("file name expected for option %s, got %s instead. Ignoring...\n",optionName,s.data());
Packit Service 50c9f2
    s=""; // note the use of &s above: this will change the option value!
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
#include "config.h"
Packit Service 50c9f2
Packit Service 50c9f2
void Config::init()
Packit Service 50c9f2
{
Packit Service 50c9f2
  ConfigImpl::instance()->init();
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Config::checkAndCorrect()
Packit Service 50c9f2
{
Packit Service 50c9f2
  QCString &warnFormat = ConfigImpl_getString("WARN_FORMAT");
Packit Service 50c9f2
  if (warnFormat.stripWhiteSpace().isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    warnFormat="$file:$line $text";
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else
Packit Service 50c9f2
  {
Packit Service 50c9f2
    if (warnFormat.find("$file")==-1)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      warn_uncond("warning format does not contain a $file tag!\n");
Packit Service 50c9f2
Packit Service 50c9f2
    }
Packit Service 50c9f2
    if (warnFormat.find("$line")==-1)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      warn_uncond("warning format does not contain a $line tag!\n");
Packit Service 50c9f2
    }
Packit Service 50c9f2
    if (warnFormat.find("$text")==-1)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      warn_uncond("warning format foes not contain a $text tag!\n");
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  QCString &manExtension = ConfigImpl_getString("MAN_EXTENSION");
Packit Service 50c9f2
Packit Service 50c9f2
  // set default man page extension if non is given by the user
Packit Service 50c9f2
  if (manExtension.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    manExtension=".3";
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  QCString &paperType = ConfigImpl_getEnum("PAPER_TYPE");
Packit Service 50c9f2
  paperType=paperType.lower().stripWhiteSpace();
Packit Service 50c9f2
  if (paperType.isEmpty() || paperType=="a4wide")
Packit Service 50c9f2
  {
Packit Service 50c9f2
    paperType = "a4";
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (paperType!="a4" && paperType!="letter" &&
Packit Service 50c9f2
      paperType!="legal" && paperType!="executive")
Packit Service 50c9f2
  {
Packit Service 50c9f2
    err("Unknown page type specified\n");
Packit Service 50c9f2
    paperType="a4";
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  QCString &outputLanguage=ConfigImpl_getEnum("OUTPUT_LANGUAGE");
Packit Service 50c9f2
  outputLanguage=outputLanguage.stripWhiteSpace();
Packit Service 50c9f2
  if (outputLanguage.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    outputLanguage = "English";
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  QCString &htmlFileExtension=ConfigImpl_getString("HTML_FILE_EXTENSION");
Packit Service 50c9f2
  htmlFileExtension=htmlFileExtension.stripWhiteSpace();
Packit Service 50c9f2
  if (htmlFileExtension.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    htmlFileExtension = ".html";
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // expand the relative stripFromPath values
Packit Service 50c9f2
  QStrList &stripFromPath = ConfigImpl_getList("STRIP_FROM_PATH");
Packit Service 50c9f2
  char *sfp = stripFromPath.first();
Packit Service 50c9f2
  if (sfp==0) // by default use the current path
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QString p = QDir::currentDirPath();
Packit Service 50c9f2
    if (p.at(p.length()-1)!='/')
Packit Service 50c9f2
        p.append('/');
Packit Service 50c9f2
    stripFromPath.append(p.utf8());
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else
Packit Service 50c9f2
  {
Packit Service 50c9f2
    cleanUpPaths(stripFromPath);
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // expand the relative stripFromPath values
Packit Service 50c9f2
  QStrList &stripFromIncPath = ConfigImpl_getList("STRIP_FROM_INC_PATH");
Packit Service 50c9f2
  cleanUpPaths(stripFromIncPath);
Packit Service 50c9f2
Packit Service 50c9f2
  // Test to see if HTML header is valid
Packit Service 50c9f2
  QCString &headerFile = ConfigImpl_getString("HTML_HEADER");
Packit Service 50c9f2
  if (!headerFile.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QFileInfo fi(headerFile);
Packit Service 50c9f2
    if (!fi.exists())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      err("tag HTML_HEADER: header file `%s' "
Packit Service 50c9f2
	  "does not exist\n",headerFile.data());
Packit Service 50c9f2
      exit(1);
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  // Test to see if HTML footer is valid
Packit Service 50c9f2
  QCString &footerFile = ConfigImpl_getString("HTML_FOOTER");
Packit Service 50c9f2
  if (!footerFile.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QFileInfo fi(footerFile);
Packit Service 50c9f2
    if (!fi.exists())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      err("tag HTML_FOOTER: footer file `%s' "
Packit Service 50c9f2
	  "does not exist\n",footerFile.data());
Packit Service 50c9f2
      exit(1);
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // Test to see if MathJax code file is valid
Packit Service 50c9f2
  if (ConfigImpl_getBool("USE_MATHJAX"))
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QCString &MathJaxCodefile = ConfigImpl_getString("MATHJAX_CODEFILE");
Packit Service 50c9f2
    if (!MathJaxCodefile.isEmpty())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      QFileInfo fi(MathJaxCodefile);
Packit Service 50c9f2
      if (!fi.exists())
Packit Service 50c9f2
      {
Packit Service 50c9f2
        err("tag MATHJAX_CODEFILE file `%s' "
Packit Service 50c9f2
	    "does not exist\n",MathJaxCodefile.data());
Packit Service 50c9f2
        exit(1);
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
    QCString &path = ConfigImpl_getString("MATHJAX_RELPATH");
Packit Service 50c9f2
    if (!path.isEmpty() && path.at(path.length()-1)!='/')
Packit Service 50c9f2
    {
Packit Service 50c9f2
      path+="/";
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // Test to see if LaTeX header is valid
Packit Service 50c9f2
  QCString &latexHeaderFile = ConfigImpl_getString("LATEX_HEADER");
Packit Service 50c9f2
  if (!latexHeaderFile.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QFileInfo fi(latexHeaderFile);
Packit Service 50c9f2
    if (!fi.exists())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      err("tag LATEX_HEADER: header file `%s' "
Packit Service 50c9f2
	  "does not exist\n",latexHeaderFile.data());
Packit Service 50c9f2
      exit(1);
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  // Test to see if LaTeX footer is valid
Packit Service 50c9f2
  QCString &latexFooterFile = ConfigImpl_getString("LATEX_FOOTER");
Packit Service 50c9f2
  if (!latexFooterFile.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QFileInfo fi(latexFooterFile);
Packit Service 50c9f2
    if (!fi.exists())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      err("tag LATEX_FOOTER: footer file `%s' "
Packit Service 50c9f2
	  "does not exist\n",latexFooterFile.data());
Packit Service 50c9f2
      exit(1);
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // check include path
Packit Service 50c9f2
  QStrList &includePath = ConfigImpl_getList("INCLUDE_PATH");
Packit Service 50c9f2
  char *s=includePath.first();
Packit Service 50c9f2
  while (s)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QFileInfo fi(s);
Packit Service 50c9f2
    if (!fi.exists()) warn_uncond("tag INCLUDE_PATH: include path `%s' "
Packit Service 50c9f2
	                  "does not exist\n",s);
Packit Service 50c9f2
    s=includePath.next();
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // check aliases
Packit Service 50c9f2
  QStrList &aliasList = ConfigImpl_getList("ALIASES");
Packit Service 50c9f2
  s=aliasList.first();
Packit Service 50c9f2
  while (s)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QRegExp re1("[a-z_A-Z][a-z_A-Z0-9]*[ \t]*=");         // alias without argument
Packit Service 50c9f2
    QRegExp re2("[a-z_A-Z][a-z_A-Z0-9]*{[0-9]*}[ \t]*="); // alias with argument
Packit Service 50c9f2
    QCString alias=s;
Packit Service 50c9f2
    alias=alias.stripWhiteSpace();
Packit Service 50c9f2
    if (alias.find(re1)!=0 && alias.find(re2)!=0)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      err("Illegal alias format `%s'. Use \"name=value\" or \"name(n)=value\", where n is the number of arguments\n",
Packit Service 50c9f2
	  alias.data());
Packit Service 50c9f2
    }
Packit Service 50c9f2
    s=aliasList.next();
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // check if GENERATE_TREEVIEW and GENERATE_HTMLHELP are both enabled
Packit Service 50c9f2
  if (ConfigImpl_getBool("GENERATE_TREEVIEW") && ConfigImpl_getBool("GENERATE_HTMLHELP"))
Packit Service 50c9f2
  {
Packit Service 50c9f2
    err("When enabling GENERATE_HTMLHELP the tree view (GENERATE_TREEVIEW) should be disabled. I'll do it for you.\n");
Packit Service 50c9f2
    ConfigImpl_getBool("GENERATE_TREEVIEW")=FALSE;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (ConfigImpl_getBool("SEARCHENGINE") && ConfigImpl_getBool("GENERATE_HTMLHELP"))
Packit Service 50c9f2
  {
Packit Service 50c9f2
    err("When enabling GENERATE_HTMLHELP the search engine (SEARCHENGINE) should be disabled. I'll do it for you.\n");
Packit Service 50c9f2
    ConfigImpl_getBool("SEARCHENGINE")=FALSE;
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // check if SEPARATE_MEMBER_PAGES and INLINE_GROUPED_CLASSES are both enabled
Packit Service 50c9f2
  if (ConfigImpl_getBool("SEPARATE_MEMBER_PAGES") && ConfigImpl_getBool("INLINE_GROUPED_CLASSES"))
Packit Service 50c9f2
  {
Packit Service 50c9f2
    err("When enabling INLINE_GROUPED_CLASSES the SEPARATE_MEMBER_PAGES option should be disabled. I'll do it for you.\n");
Packit Service 50c9f2
    ConfigImpl_getBool("SEPARATE_MEMBER_PAGES")=FALSE;
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // check dot image format
Packit Service 50c9f2
  QCString &dotImageFormat=ConfigImpl_getEnum("DOT_IMAGE_FORMAT");
Packit Service 50c9f2
  dotImageFormat=dotImageFormat.stripWhiteSpace();
Packit Service 50c9f2
  if (dotImageFormat.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    dotImageFormat = "png";
Packit Service 50c9f2
  }
Packit Service 50c9f2
  //else if (dotImageFormat!="gif" && dotImageFormat!="png" && dotImageFormat!="jpg")
Packit Service 50c9f2
  //{
Packit Service 50c9f2
  //  err("Invalid value for DOT_IMAGE_FORMAT: `%s'. Using the default.\n",dotImageFormat.data());
Packit Service 50c9f2
  //  dotImageFormat = "png";
Packit Service 50c9f2
  //}
Packit Service 50c9f2
Packit Service 50c9f2
  QCString &dotFontName=ConfigImpl_getString("DOT_FONTNAME");
Packit Service 50c9f2
  if (dotFontName=="FreeSans" || dotFontName=="FreeSans.ttf")
Packit Service 50c9f2
  {
Packit Service 50c9f2
    warn_uncond("doxygen no longer ships with the FreeSans font.\n"
Packit Service 50c9f2
               "You may want to clear or change DOT_FONTNAME.\n"
Packit Service 50c9f2
               "Otherwise you run the risk that the wrong font is being used for dot generated graphs.\n");
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
  // check dot path
Packit Service 50c9f2
  QCString &dotPath = ConfigImpl_getString("DOT_PATH");
Packit Service 50c9f2
  if (!dotPath.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QFileInfo fi(dotPath);
Packit Service 50c9f2
    if (fi.exists() && fi.isFile()) // user specified path + exec
Packit Service 50c9f2
    {
Packit Service 50c9f2
      dotPath=fi.dirPath(TRUE).utf8()+"/";
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else
Packit Service 50c9f2
    {
Packit Service 50c9f2
      QFileInfo dp(dotPath+"/dot"+portable_commandExtension());
Packit Service 50c9f2
      if (!dp.exists() || !dp.isFile())
Packit Service 50c9f2
      {
Packit Service 50c9f2
	warn_uncond("the dot tool could not be found at %s\n",dotPath.data());
Packit Service 50c9f2
	dotPath="";
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else
Packit Service 50c9f2
      {
Packit Service 50c9f2
	dotPath=dp.dirPath(TRUE).utf8()+"/";
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
#if defined(_WIN32) // convert slashes
Packit Service 50c9f2
    uint i=0,l=dotPath.length();
Packit Service 50c9f2
    for (i=0;i
Packit Service 50c9f2
#endif
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else // make sure the string is empty but not null!
Packit Service 50c9f2
  {
Packit Service 50c9f2
    dotPath="";
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // check mscgen path
Packit Service 50c9f2
  QCString &mscgenPath = ConfigImpl_getString("MSCGEN_PATH");
Packit Service 50c9f2
  if (!mscgenPath.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QFileInfo dp(mscgenPath+"/mscgen"+portable_commandExtension());
Packit Service 50c9f2
    if (!dp.exists() || !dp.isFile())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      warn_uncond("the mscgen tool could not be found at %s\n",mscgenPath.data());
Packit Service 50c9f2
      mscgenPath="";
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else
Packit Service 50c9f2
    {
Packit Service 50c9f2
      mscgenPath=dp.dirPath(TRUE).utf8()+"/";
Packit Service 50c9f2
#if defined(_WIN32) // convert slashes
Packit Service 50c9f2
      uint i=0,l=mscgenPath.length();
Packit Service 50c9f2
      for (i=0;i
Packit Service 50c9f2
#endif
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else // make sure the string is empty but not null!
Packit Service 50c9f2
  {
Packit Service 50c9f2
    mscgenPath="";
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // check plantuml path
Packit Service 50c9f2
  QCString &plantumlJarPath = ConfigImpl_getString("PLANTUML_JAR_PATH");
Packit Service 50c9f2
  if (!plantumlJarPath.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QFileInfo pu(plantumlJarPath);
Packit Service 50c9f2
    if (pu.exists() && pu.isDir()) // PLANTUML_JAR_PATH is directory
Packit Service 50c9f2
    {
Packit Service 50c9f2
      QFileInfo jar(plantumlJarPath+portable_pathSeparator()+"plantuml.jar");
Packit Service 50c9f2
      if (jar.exists() && jar.isFile())
Packit Service 50c9f2
      {
Packit Service 50c9f2
        plantumlJarPath = jar.dirPath(TRUE).utf8()+portable_pathSeparator();
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else
Packit Service 50c9f2
      {
Packit Service 50c9f2
        err("Jar file plantuml.jar not found at location "
Packit Service 50c9f2
                   "specified via PLANTUML_JAR_PATH: '%s'\n",plantumlJarPath.data());
Packit Service 50c9f2
        plantumlJarPath="";
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else if (pu.exists() && pu.isFile() && plantumlJarPath.right(4)==".jar") // PLANTUML_JAR_PATH is file
Packit Service 50c9f2
    {
Packit Service 50c9f2
      plantumlJarPath = pu.dirPath(TRUE).utf8()+portable_pathSeparator();
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else
Packit Service 50c9f2
    {
Packit Service 50c9f2
      err("path specified via PLANTUML_JAR_PATH does not exist or not a directory: %s\n",
Packit Service 50c9f2
                 plantumlJarPath.data());
Packit Service 50c9f2
      plantumlJarPath="";
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // check dia path
Packit Service 50c9f2
  QCString &diaPath = ConfigImpl_getString("DIA_PATH");
Packit Service 50c9f2
  if (!diaPath.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QFileInfo dp(diaPath+"/dia"+portable_commandExtension());
Packit Service 50c9f2
    if (!dp.exists() || !dp.isFile())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      warn_uncond("dia could not be found at %s\n",diaPath.data());
Packit Service 50c9f2
      diaPath="";
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else
Packit Service 50c9f2
    {
Packit Service 50c9f2
      diaPath=dp.dirPath(TRUE).utf8()+"/";
Packit Service 50c9f2
#if defined(_WIN32) // convert slashes
Packit Service 50c9f2
      uint i=0,l=diaPath.length();
Packit Service 50c9f2
      for (i=0;i
Packit Service 50c9f2
#endif
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else // make sure the string is empty but not null!
Packit Service 50c9f2
  {
Packit Service 50c9f2
    diaPath="";
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // check input
Packit Service 50c9f2
  QStrList &inputSources=ConfigImpl_getList("INPUT");
Packit Service 50c9f2
  if (inputSources.count()==0)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    // use current dir as the default
Packit Service 50c9f2
    inputSources.append(QDir::currentDirPath().utf8());
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else
Packit Service 50c9f2
  {
Packit Service 50c9f2
    s=inputSources.first();
Packit Service 50c9f2
    while (s)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      QFileInfo fi(s);
Packit Service 50c9f2
      if (!fi.exists())
Packit Service 50c9f2
      {
Packit Service 50c9f2
	warn_uncond("tag INPUT: input source `%s' does not exist\n",s);
Packit Service 50c9f2
      }
Packit Service 50c9f2
      s=inputSources.next();
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // add default file patterns if needed
Packit Service 50c9f2
  QStrList &filePatternList = ConfigImpl_getList("FILE_PATTERNS");
Packit Service 50c9f2
  if (filePatternList.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
      ConfigOption * opt = ConfigImpl::instance()->get("FILE_PATTERNS");
Packit Service 50c9f2
      if (opt->kind()==ConfigOption::O_List)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        ((ConfigList*)opt)->init();
Packit Service 50c9f2
      }
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // add default pattern if needed
Packit Service 50c9f2
  QStrList &examplePatternList = ConfigImpl_getList("EXAMPLE_PATTERNS");
Packit Service 50c9f2
  if (examplePatternList.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    examplePatternList.append("*");
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // if no output format is enabled, warn the user
Packit Service 50c9f2
  if (!ConfigImpl_getBool("GENERATE_HTML")    &&
Packit Service 50c9f2
      !ConfigImpl_getBool("GENERATE_LATEX")   &&
Packit Service 50c9f2
      !ConfigImpl_getBool("GENERATE_MAN")     &&
Packit Service 50c9f2
      !ConfigImpl_getBool("GENERATE_RTF")     &&
Packit Service 50c9f2
      !ConfigImpl_getBool("GENERATE_XML")     &&
Packit Service 50c9f2
      !ConfigImpl_getBool("GENERATE_PERLMOD") &&
Packit Service 50c9f2
      !ConfigImpl_getBool("GENERATE_RTF")     &&
Packit Service 50c9f2
      !ConfigImpl_getBool("GENERATE_DOCBOOK") &&
Packit Service 50c9f2
      !ConfigImpl_getBool("GENERATE_AUTOGEN_DEF") &&
Packit Service 50c9f2
      ConfigImpl_getString("GENERATE_TAGFILE").isEmpty()
Packit Service 50c9f2
     )
Packit Service 50c9f2
  {
Packit Service 50c9f2
    warn_uncond("No output formats selected! Set at least one of the main GENERATE_* options to YES.\n");
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // check HTMLHELP creation requirements
Packit Service 50c9f2
  if (!ConfigImpl_getBool("GENERATE_HTML") &&
Packit Service 50c9f2
      ConfigImpl_getBool("GENERATE_HTMLHELP"))
Packit Service 50c9f2
  {
Packit Service 50c9f2
    warn_uncond("GENERATE_HTMLHELP=YES requires GENERATE_HTML=YES.\n");
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // check QHP creation requirements
Packit Service 50c9f2
  if (ConfigImpl_getBool("GENERATE_QHP"))
Packit Service 50c9f2
  {
Packit Service 50c9f2
    if (ConfigImpl_getString("QHP_NAMESPACE").isEmpty())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      err("GENERATE_QHP=YES requires QHP_NAMESPACE to be set. Using 'org.doxygen.doc' as default!.\n");
Packit Service 50c9f2
      ConfigImpl_getString("QHP_NAMESPACE")="org.doxygen.doc";
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    if (ConfigImpl_getString("QHP_VIRTUAL_FOLDER").isEmpty())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      err("GENERATE_QHP=YES requires QHP_VIRTUAL_FOLDER to be set. Using 'doc' as default!\n");
Packit Service 50c9f2
      ConfigImpl_getString("QHP_VIRTUAL_FOLDER")="doc";
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  if (ConfigImpl_getBool("OPTIMIZE_OUTPUT_JAVA") && ConfigImpl_getBool("INLINE_INFO"))
Packit Service 50c9f2
  {
Packit Service 50c9f2
    // don't show inline info for Java output, since Java has no inline
Packit Service 50c9f2
    // concept.
Packit Service 50c9f2
    ConfigImpl_getBool("INLINE_INFO")=FALSE;
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  int &depth = ConfigImpl_getInt("MAX_DOT_GRAPH_DEPTH");
Packit Service 50c9f2
  if (depth==0)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    depth=1000;
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  int &hue = ConfigImpl_getInt("HTML_COLORSTYLE_HUE");
Packit Service 50c9f2
  if (hue<0)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    hue=0;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else if (hue>=360)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    hue=hue%360;
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  int &sat = ConfigImpl_getInt("HTML_COLORSTYLE_SAT");
Packit Service 50c9f2
  if (sat<0)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    sat=0;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else if (sat>255)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    sat=255;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  int &gamma = ConfigImpl_getInt("HTML_COLORSTYLE_GAMMA");
Packit Service 50c9f2
  if (gamma<40)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    gamma=40;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else if (gamma>240)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    gamma=240;
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  QCString mathJaxFormat = ConfigImpl_getEnum("MATHJAX_FORMAT");
Packit Service 50c9f2
  if (!mathJaxFormat.isEmpty() && mathJaxFormat!="HTML-CSS" &&
Packit Service 50c9f2
       mathJaxFormat!="NativeMML" && mathJaxFormat!="SVG")
Packit Service 50c9f2
  {
Packit Service 50c9f2
    err("Unsupported value for MATHJAX_FORMAT: Should be one of HTML-CSS, NativeMML, or SVG\n");
Packit Service 50c9f2
    ConfigImpl_getEnum("MATHJAX_FORMAT")="HTML-CSS";
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // add default words if needed
Packit Service 50c9f2
  QStrList &annotationFromBrief = ConfigImpl_getList("ABBREVIATE_BRIEF");
Packit Service 50c9f2
  if (annotationFromBrief.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    annotationFromBrief.append("The $name class");
Packit Service 50c9f2
    annotationFromBrief.append("The $name widget");
Packit Service 50c9f2
    annotationFromBrief.append("The $name file");
Packit Service 50c9f2
    annotationFromBrief.append("is");
Packit Service 50c9f2
    annotationFromBrief.append("provides");
Packit Service 50c9f2
    annotationFromBrief.append("specifies");
Packit Service 50c9f2
    annotationFromBrief.append("contains");
Packit Service 50c9f2
    annotationFromBrief.append("represents");
Packit Service 50c9f2
    annotationFromBrief.append("a");
Packit Service 50c9f2
    annotationFromBrief.append("an");
Packit Service 50c9f2
    annotationFromBrief.append("the");
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // some default settings for vhdl
Packit Service 50c9f2
  if (ConfigImpl_getBool("OPTIMIZE_OUTPUT_VHDL") &&
Packit Service 50c9f2
      (ConfigImpl_getBool("INLINE_INHERITED_MEMB") ||
Packit Service 50c9f2
       ConfigImpl_getBool("INHERIT_DOCS") ||
Packit Service 50c9f2
       !ConfigImpl_getBool("HIDE_SCOPE_NAMES") ||
Packit Service 50c9f2
       !ConfigImpl_getBool("EXTRACT_PRIVATE") ||
Packit Service 50c9f2
       !ConfigImpl_getBool("EXTRACT_PACKAGE")
Packit Service 50c9f2
      )
Packit Service 50c9f2
     )
Packit Service 50c9f2
  {
Packit Service 50c9f2
    bool b1 = ConfigImpl_getBool("INLINE_INHERITED_MEMB");
Packit Service 50c9f2
    bool b2 = ConfigImpl_getBool("INHERIT_DOCS");
Packit Service 50c9f2
    bool b3 = ConfigImpl_getBool("HIDE_SCOPE_NAMES");
Packit Service 50c9f2
    bool b4 = ConfigImpl_getBool("EXTRACT_PRIVATE");
Packit Service 50c9f2
    bool b5 = ConfigImpl_getBool("SKIP_FUNCTION_MACROS");
Packit Service 50c9f2
    bool b6 = ConfigImpl_getBool("EXTRACT_PACKAGE");
Packit Service 50c9f2
    const char *s1,*s2,*s3,*s4,*s5,*s6;
Packit Service 50c9f2
    if (b1)  s1="  INLINE_INHERITED_MEMB  = NO (was YES)\n"; else s1="";
Packit Service 50c9f2
    if (b2)  s2="  INHERIT_DOCS           = NO (was YES)\n"; else s2="";
Packit Service 50c9f2
    if (!b3) s3="  HIDE_SCOPE_NAMES       = YES (was NO)\n"; else s3="";
Packit Service 50c9f2
    if (!b4) s4="  EXTRACT_PRIVATE        = YES (was NO)\n"; else s4="";
Packit Service 50c9f2
    if (b5)  s5="  ENABLE_PREPROCESSING   = NO (was YES)\n"; else s5="";
Packit Service 50c9f2
    if (!b6) s6="  EXTRACT_PACKAGE        = YES (was NO)\n"; else s6="";
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
    warn_uncond("enabling OPTIMIZE_OUTPUT_VHDL assumes the following settings:\n"
Packit Service 50c9f2
	       "%s%s%s%s%s%s",s1,s2,s3,s4,s5,s6
Packit Service 50c9f2
	      );
Packit Service 50c9f2
Packit Service 50c9f2
    ConfigImpl_getBool("INLINE_INHERITED_MEMB") = FALSE;
Packit Service 50c9f2
    ConfigImpl_getBool("INHERIT_DOCS")          = FALSE;
Packit Service 50c9f2
    ConfigImpl_getBool("HIDE_SCOPE_NAMES")      = TRUE;
Packit Service 50c9f2
    ConfigImpl_getBool("EXTRACT_PRIVATE")       = TRUE;
Packit Service 50c9f2
    ConfigImpl_getBool("ENABLE_PREPROCESSING")  = FALSE;
Packit Service 50c9f2
    ConfigImpl_getBool("EXTRACT_PACKAGE")       = TRUE;
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  checkFileName(ConfigImpl_getString("GENERATE_TAGFILE"),"GENERATE_TAGFILE");
Packit Service 50c9f2
Packit Service 50c9f2
#if 0 // TODO: this breaks test 25; SOURCEBROWSER = NO and SOURCE_TOOLTIPS = YES.
Packit Service 50c9f2
      // So this and other regressions should be analysed and fixed before this can be enabled
Packit Service 50c9f2
  // disable any boolean options that depend on disabled options
Packit Service 50c9f2
  QListIterator<ConfigOption> it = iterator();
Packit Service 50c9f2
  ConfigOption *option;
Packit Service 50c9f2
  for (it.toFirst();(option=it.current());++it)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QCString depName = option->dependsOn(); // option has a dependency
Packit Service 50c9f2
    if (!depName.isEmpty())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      ConfigOption * dep = Config::instance()->get(depName);
Packit Service 50c9f2
      if (dep->kind()==ConfigOption::O_Bool &&
Packit Service 50c9f2
          ConfigImpl_getBool("depName")==FALSE) // dependent option is disabled
Packit Service 50c9f2
      {
Packit Service 50c9f2
        if (option->kind()==ConfigOption::O_Bool)
Packit Service 50c9f2
        {
Packit Service 50c9f2
          printf("disabling option %s\n",option->name().data());
Packit Service 50c9f2
          ConfigImpl_getBool("option->name("))=FALSE; // also disable this option
Packit Service 50c9f2
        }
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
#endif
Packit Service 50c9f2
Packit Service 50c9f2
  ConfigValues::instance().init();
Packit Service 50c9f2
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Config::writeTemplate(FTextStream &t,bool shortList,bool update)
Packit Service 50c9f2
{
Packit Service 50c9f2
  ConfigImpl::instance()->writeTemplate(t,shortList,update);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
bool Config::parse(const char *fileName,bool update)
Packit Service 50c9f2
{
Packit Service 50c9f2
  return ConfigImpl::instance()->parse(fileName,update);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Config::postProcess(bool clearHeaderAndFooter)
Packit Service 50c9f2
{
Packit Service 50c9f2
  ConfigImpl::instance()->substituteEnvironmentVars();
Packit Service 50c9f2
  ConfigImpl::instance()->convertStrToVal();
Packit Service 50c9f2
Packit Service 50c9f2
  // avoid bootstrapping issues when the config file already
Packit Service 50c9f2
  // refers to the files that we are supposed to parse.
Packit Service 50c9f2
  if (clearHeaderAndFooter)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    ConfigImpl_getString("HTML_HEADER")="";
Packit Service 50c9f2
    ConfigImpl_getString("HTML_FOOTER")="";
Packit Service 50c9f2
    ConfigImpl_getString("LATEX_HEADER")="";
Packit Service 50c9f2
    ConfigImpl_getString("LATEX_FOOTER")="";
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Config::deinit()
Packit Service 50c9f2
{
Packit Service 50c9f2
  ConfigImpl::instance()->deleteInstance();
Packit Service 50c9f2
}
Packit Service 50c9f2