Blame addon/doxywizard/config_doxyw.l

Packit 1c1d7e
/******************************************************************************
Packit 1c1d7e
 *
Packit 1c1d7e
 * $Id: config_templ.l,v 1.8 2001/01/01 10:15:16 root Exp $
Packit 1c1d7e
 *
Packit 1c1d7e
 * Copyright (C) 1997-2015 by Dimitri van Heesch.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Permission to use, copy, modify, and distribute this software and its
Packit 1c1d7e
 * documentation under the terms of the GNU General Public License is hereby 
Packit 1c1d7e
 * granted. No representations are made about the suitability of this software 
Packit 1c1d7e
 * for any purpose. It is provided "as is" without express or implied warranty.
Packit 1c1d7e
 * See the GNU General Public License for more details.
Packit 1c1d7e
 *
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
%option never-interactive
Packit 1c1d7e
%option prefix="config_doxywYY"
Packit 1c1d7e
%{
Packit 1c1d7e
Packit 1c1d7e
/*
Packit 1c1d7e
 *	includes
Packit 1c1d7e
 */
Packit 1c1d7e
#include "config.h"
Packit 1c1d7e
#include "input.h"
Packit 1c1d7e
Packit 1c1d7e
#include <QString>
Packit 1c1d7e
#include <QVariant>
Packit 1c1d7e
#include <QStack>
Packit 1c1d7e
#include <QTextCodec>
Packit 1c1d7e
#include <QByteArray>
Packit 1c1d7e
#include <QFileInfo>
Packit 1c1d7e
#include <QStringList>
Packit 1c1d7e
#include <QRegExp>
Packit 1c1d7e
#include <QTextStream>
Packit 1c1d7e
Packit 1c1d7e
#define YY_NO_UNISTD_H 1
Packit 1c1d7e
Packit 1c1d7e
#define MAX_INCLUDE_DEPTH 10
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
/* -----------------------------------------------------------------
Packit 1c1d7e
 *
Packit 1c1d7e
 *	static variables
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
struct ConfigFileState
Packit 1c1d7e
{
Packit 1c1d7e
  int lineNr;
Packit 1c1d7e
  FILE *file;
Packit 1c1d7e
  YY_BUFFER_STATE oldState;
Packit 1c1d7e
  YY_BUFFER_STATE newState;
Packit 1c1d7e
  QString fileName;
Packit 1c1d7e
};  
Packit 1c1d7e
Packit 1c1d7e
static const QHash<QString,Input*>   *g_options;
Packit 1c1d7e
static FILE                          *g_file;
Packit 1c1d7e
static QString                        g_yyFileName;
Packit 1c1d7e
static QString                        g_includeName;
Packit 1c1d7e
static QVariant                       g_includePathList;
Packit 1c1d7e
static QStack<ConfigFileState*>       g_includeStack;  
Packit 1c1d7e
static int                            g_includeDepth;
Packit 1c1d7e
static QVariant                      *g_arg;
Packit 1c1d7e
static Input                         *g_curOption=0;
Packit 1c1d7e
static QString                        g_elemStr;
Packit 1c1d7e
static QTextCodec                    *g_codec     = QTextCodec::codecForName("UTF-8");
Packit 1c1d7e
static QString                        g_codecName = QString::fromLatin1("UTF-8");
Packit 1c1d7e
static int                            g_lastState;
Packit 1c1d7e
static QByteArray                     g_tmpString;
Packit 1c1d7e
Packit 1c1d7e
/* -----------------------------------------------------------------
Packit 1c1d7e
 */
Packit 1c1d7e
#undef	YY_INPUT
Packit 1c1d7e
#define	YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
Packit 1c1d7e
Packit 1c1d7e
static int yyread(char *buf,int maxSize)
Packit 1c1d7e
{
Packit 1c1d7e
    // no file included
Packit 1c1d7e
    if (g_includeStack.isEmpty()) 
Packit 1c1d7e
    {
Packit 1c1d7e
      return fread(buf,1,maxSize,g_file);
Packit 1c1d7e
    } 
Packit 1c1d7e
    else 
Packit 1c1d7e
    {
Packit 1c1d7e
      return fread(buf,1,maxSize,g_includeStack.top()->file);
Packit 1c1d7e
    }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static QString warning_str = QString::fromLatin1("warning: ");
Packit 1c1d7e
static QString error_str = QString::fromLatin1("error: ");
Packit 1c1d7e
Packit 1c1d7e
void config_err(const char *fmt, ...)
Packit 1c1d7e
{
Packit 1c1d7e
  QString msg = error_str;
Packit 1c1d7e
  msg.append(QString::fromLatin1(fmt));
Packit 1c1d7e
  va_list args;
Packit 1c1d7e
  va_start(args, fmt);
Packit 1c1d7e
  vfprintf(stderr, qPrintable(msg), args);
Packit 1c1d7e
  va_end(args);
Packit 1c1d7e
}
Packit 1c1d7e
void config_warn(const char *fmt, ...)
Packit 1c1d7e
{
Packit 1c1d7e
  QString msg = warning_str;
Packit 1c1d7e
  msg.append(QString::fromLatin1(fmt));
Packit 1c1d7e
  va_list args;
Packit 1c1d7e
  va_start(args, fmt);
Packit 1c1d7e
  vfprintf(stderr, qPrintable(msg), args);
Packit 1c1d7e
  va_end(args);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void substEnvVarsInStrList(QStringList &sl);
Packit 1c1d7e
static void substEnvVarsInString(QString &s);
Packit 1c1d7e
Packit 1c1d7e
static void checkEncoding()
Packit 1c1d7e
{
Packit 1c1d7e
  Input *option = g_options->value(QString::fromLatin1("DOXYFILE_ENCODING"));
Packit 1c1d7e
  if (option && option->value().toString()!=g_codecName)
Packit 1c1d7e
  {
Packit 1c1d7e
    QTextCodec *newCodec = QTextCodec::codecForName(option->value().toString().toLatin1());
Packit 1c1d7e
    if (newCodec)
Packit 1c1d7e
    {
Packit 1c1d7e
      g_codec = newCodec;
Packit 1c1d7e
      g_codecName = option->value().toString();
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static FILE *tryPath(const QString &path,const QString &fileName)
Packit 1c1d7e
{
Packit 1c1d7e
  QString absName=!path.isEmpty() ? path+QString::fromLatin1("/")+fileName : fileName;
Packit 1c1d7e
  QFileInfo fi(absName);
Packit 1c1d7e
  if (fi.exists() && fi.isFile())
Packit 1c1d7e
  {
Packit 1c1d7e
    FILE *f = fopen(absName.toLocal8Bit(),"r");
Packit 1c1d7e
    if (f==NULL)
Packit 1c1d7e
      config_err("could not open file %s for reading\n",qPrintable(absName));
Packit 1c1d7e
    else 
Packit 1c1d7e
      return f;
Packit 1c1d7e
  }
Packit 1c1d7e
  return NULL;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static FILE *findFile(const QString &fileName)
Packit 1c1d7e
{
Packit 1c1d7e
  if (QFileInfo(fileName).isAbsolute()) // absolute path
Packit 1c1d7e
  {
Packit 1c1d7e
    return tryPath(QString(), fileName);
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  // relative path, try with include paths in the list
Packit 1c1d7e
  QStringList sl = g_includePathList.toStringList();
Packit 1c1d7e
  substEnvVarsInStrList(sl);
Packit 1c1d7e
  foreach (QString s, sl) 
Packit 1c1d7e
  {
Packit 1c1d7e
    FILE *f = tryPath(s,fileName);
Packit 1c1d7e
    if (f) return f;
Packit 1c1d7e
  }
Packit 1c1d7e
  // try cwd if g_includePathList fails
Packit 1c1d7e
  return tryPath(QString::fromLatin1("."),fileName);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void readIncludeFile(const QString &incName)
Packit 1c1d7e
{
Packit 1c1d7e
  if (g_includeDepth==MAX_INCLUDE_DEPTH) 
Packit 1c1d7e
  {
Packit 1c1d7e
    config_err("maximum include depth (%d) reached, %s is not included. Aborting...\n",
Packit 1c1d7e
	MAX_INCLUDE_DEPTH,qPrintable(incName));
Packit 1c1d7e
    exit(1);
Packit 1c1d7e
  } 
Packit 1c1d7e
Packit 1c1d7e
  QString inc = incName;
Packit 1c1d7e
  substEnvVarsInString(inc);
Packit 1c1d7e
  inc = inc.trimmed();
Packit 1c1d7e
  uint incLen = inc.length();
Packit 1c1d7e
  if (inc.at(0)==QChar::fromLatin1('"') && 
Packit 1c1d7e
      inc.at(incLen-1)==QChar::fromLatin1('"')) // strip quotes
Packit 1c1d7e
  {
Packit 1c1d7e
    inc=inc.mid(1,incLen-2);
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  FILE *f = findFile(inc);
Packit 1c1d7e
  if (f) // see if the include file can be found
Packit 1c1d7e
  {
Packit 1c1d7e
    // For debugging
Packit 1c1d7e
#if SHOW_INCLUDES
Packit 1c1d7e
    for (i=0;i
Packit 1c1d7e
    msg("@INCLUDE = %s: parsing...\n",qPrintable(inc));
Packit 1c1d7e
#endif
Packit 1c1d7e
Packit 1c1d7e
    // store the state of the old file 
Packit 1c1d7e
    ConfigFileState *fs=new ConfigFileState;
Packit 1c1d7e
    fs->oldState=YY_CURRENT_BUFFER;
Packit 1c1d7e
    fs->fileName=g_yyFileName;
Packit 1c1d7e
    fs->file=f;
Packit 1c1d7e
    // push the state on the stack
Packit 1c1d7e
    g_includeStack.push(fs);
Packit 1c1d7e
    // set the scanner to the include file
Packit 1c1d7e
    yy_switch_to_buffer(yy_create_buffer(f, YY_BUF_SIZE));
Packit 1c1d7e
    fs->newState=YY_CURRENT_BUFFER;
Packit 1c1d7e
    g_yyFileName=inc;
Packit 1c1d7e
    g_includeDepth++;
Packit 1c1d7e
  } 
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    config_err("@INCLUDE = %s: not found!\n",qPrintable(inc));
Packit 1c1d7e
    exit(1);
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
%}
Packit 1c1d7e
Packit 1c1d7e
%option nounput
Packit 1c1d7e
%option noyywrap
Packit 1c1d7e
%option yylineno
Packit 1c1d7e
Packit 1c1d7e
%x      Start
Packit 1c1d7e
%x	SkipComment
Packit 1c1d7e
%x      SkipInvalid
Packit 1c1d7e
%x      GetString
Packit 1c1d7e
%x      GetStrList
Packit 1c1d7e
%x      GetQuotedString
Packit 1c1d7e
%x      GetEnvVar
Packit 1c1d7e
%x      Include
Packit 1c1d7e
Packit 1c1d7e
%%
Packit 1c1d7e
Packit 1c1d7e
<*>\0x0d
Packit 1c1d7e
<Start,GetString,GetStrList,SkipInvalid>"#"	 { BEGIN(SkipComment); }
Packit 1c1d7e
<Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"="	 { QString cmd = g_codec->toUnicode(yytext);
Packit 1c1d7e
                                           cmd=cmd.left(cmd.length()-1).trimmed(); 
Packit 1c1d7e
					   g_curOption = g_options->value(cmd);
Packit 1c1d7e
					   if (g_curOption==0) // oops not known
Packit 1c1d7e
					   {
Packit 1c1d7e
					     config_warn("ignoring unsupported tag `%s' at line %d, file %s\n",
Packit 1c1d7e
						 qPrintable(cmd),yylineno,qPrintable(g_yyFileName)); 
Packit 1c1d7e
					     BEGIN(SkipInvalid);
Packit 1c1d7e
					   }
Packit 1c1d7e
					   else // known tag
Packit 1c1d7e
					   {
Packit 1c1d7e
					     //option->setEncoding(encoding);
Packit 1c1d7e
					     g_arg = &g_curOption->value();
Packit 1c1d7e
					     switch(g_curOption->kind())
Packit 1c1d7e
					     {
Packit 1c1d7e
					       case Input::StrList:
Packit 1c1d7e
						 g_elemStr = QString();
Packit 1c1d7e
						 *g_arg = QStringList();
Packit 1c1d7e
					         BEGIN(GetStrList);
Packit 1c1d7e
					         break;
Packit 1c1d7e
					       case Input::String:
Packit 1c1d7e
					         BEGIN(GetString);
Packit 1c1d7e
					         break;
Packit 1c1d7e
					       case Input::Int:
Packit 1c1d7e
					         BEGIN(GetString);
Packit 1c1d7e
					         break;
Packit 1c1d7e
					       case Input::Bool:
Packit 1c1d7e
					         BEGIN(GetString);
Packit 1c1d7e
						 break;
Packit 1c1d7e
					       case Input::Obsolete:
Packit 1c1d7e
					         config_warn("Tag `%s' at line %d of file %s has become obsolete.\n"
Packit 1c1d7e
						            "To avoid this warning please update your configuration "
Packit 1c1d7e
							    "file using \"doxygen -u\"\n", qPrintable(cmd),
Packit 1c1d7e
							    yylineno,qPrintable(g_yyFileName)); 
Packit 1c1d7e
					         BEGIN(SkipInvalid);
Packit 1c1d7e
						 break;
Packit 1c1d7e
					     }
Packit 1c1d7e
					   }
Packit 1c1d7e
					}
Packit 1c1d7e
<Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"+="	{ QString cmd=g_codec->toUnicode(yytext);
Packit 1c1d7e
                                          cmd=cmd.left(cmd.length()-2).trimmed(); 
Packit 1c1d7e
					  g_curOption = g_options->value(cmd);
Packit 1c1d7e
					  if (g_curOption==0) // oops not known
Packit 1c1d7e
					  {
Packit 1c1d7e
					    config_warn("ignoring unsupported tag `%s' at line %d, file %s\n",
Packit 1c1d7e
						yytext,yylineno,qPrintable(g_yyFileName)); 
Packit 1c1d7e
					    BEGIN(SkipInvalid);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else // known tag
Packit 1c1d7e
					  {
Packit 1c1d7e
					    switch(g_curOption->kind())
Packit 1c1d7e
					    {
Packit 1c1d7e
					      case Input::StrList:
Packit 1c1d7e
						g_arg = &g_curOption->value();
Packit 1c1d7e
						g_elemStr=QString();
Packit 1c1d7e
					        BEGIN(GetStrList);
Packit 1c1d7e
					        break;
Packit 1c1d7e
					      case Input::String:
Packit 1c1d7e
					      case Input::Int:
Packit 1c1d7e
					      case Input::Bool:
Packit 1c1d7e
					        config_warn("operator += not supported for `%s'. Ignoring line at line %d, file %s\n",
Packit 1c1d7e
						    yytext,yylineno,qPrintable(g_yyFileName)); 
Packit 1c1d7e
					        BEGIN(SkipInvalid);
Packit 1c1d7e
						break;
Packit 1c1d7e
					      case Input::Obsolete:
Packit 1c1d7e
					         config_warn("Tag `%s' at line %d of file %s has become obsolete.\n"
Packit 1c1d7e
						            "To avoid this warning please update your configuration "
Packit 1c1d7e
							    "file using \"doxygen -u\"\n", 
Packit 1c1d7e
							    qPrintable(cmd),yylineno,qPrintable(g_yyFileName)); 
Packit 1c1d7e
					         BEGIN(SkipInvalid);
Packit 1c1d7e
						 break;
Packit 1c1d7e
					     }
Packit 1c1d7e
					   }
Packit 1c1d7e
					}
Packit 1c1d7e
<Start>"@INCLUDE_PATH"[ \t]*"=" 	{ BEGIN(GetStrList); g_arg=&g_includePathList; *g_arg = QStringList(); g_elemStr=QString(); }
Packit 1c1d7e
  /* include a config file */
Packit 1c1d7e
<Start>"@INCLUDE"[ \t]*"="     		{ BEGIN(Include);}
Packit 1c1d7e
<Include>([^ \"\t\r\n]+)|("\""[^\n\"]+"\"") { 
Packit 1c1d7e
  					  readIncludeFile(g_codec->toUnicode(yytext)); 
Packit 1c1d7e
  					  BEGIN(Start);
Packit 1c1d7e
					}
Packit 1c1d7e
<<EOF>>					{
Packit 1c1d7e
                                          //printf("End of include file\n");
Packit 1c1d7e
					  //printf("Include stack depth=%d\n",g_includeStack.count());
Packit 1c1d7e
                                          if (g_includeStack.isEmpty())
Packit 1c1d7e
					  {
Packit 1c1d7e
					    //printf("Terminating scanner!\n");
Packit 1c1d7e
					    yyterminate();
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else
Packit 1c1d7e
					  {
Packit 1c1d7e
					    ConfigFileState *fs = g_includeStack.pop();
Packit 1c1d7e
					    fclose(fs->file);
Packit 1c1d7e
					    YY_BUFFER_STATE oldBuf = YY_CURRENT_BUFFER;
Packit 1c1d7e
					    yy_switch_to_buffer( fs->oldState );
Packit 1c1d7e
					    yy_delete_buffer( oldBuf );
Packit 1c1d7e
					    g_yyFileName=fs->fileName;
Packit 1c1d7e
					    delete fs; 
Packit 1c1d7e
                                            g_includeDepth--;
Packit 1c1d7e
					  }
Packit 1c1d7e
  					}
Packit 1c1d7e
Packit 1c1d7e
<Start>[a-z_A-Z0-9]+			{ config_warn("ignoring unknown tag `%s' at line %d, file %s\n",yytext,yylineno,qPrintable(g_yyFileName)); }
Packit 1c1d7e
<GetString,SkipInvalid>\n	        { BEGIN(Start); }
Packit 1c1d7e
<GetStrList>\n				{ 
Packit 1c1d7e
					  if (!g_elemStr.isEmpty())
Packit 1c1d7e
					  {
Packit 1c1d7e
					    //printf("elemStr1=`%s'\n",qPrintable(elemStr));
Packit 1c1d7e
					    *g_arg = QVariant(g_arg->toStringList() << g_elemStr);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  BEGIN(Start); 
Packit 1c1d7e
					}
Packit 1c1d7e
<GetStrList>[ \t]+			{
Packit 1c1d7e
  				          if (!g_elemStr.isEmpty())
Packit 1c1d7e
					  {
Packit 1c1d7e
					    //printf("elemStr2=`%s'\n",qPrintable(elemStr));
Packit 1c1d7e
  					    *g_arg = QVariant(g_arg->toStringList() << g_elemStr);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  g_elemStr = QString();
Packit 1c1d7e
  					}
Packit 1c1d7e
<GetString>[^ \"\t\r\n]+		{ 
Packit 1c1d7e
                                          *g_arg = QVariant(g_codec->toUnicode(yytext)); 
Packit 1c1d7e
                                          checkEncoding();
Packit 1c1d7e
                                        }
Packit 1c1d7e
<GetString,GetStrList,SkipInvalid>"\""	{ g_lastState=YY_START;
Packit 1c1d7e
  					  BEGIN(GetQuotedString); 
Packit 1c1d7e
                                          g_tmpString="";
Packit 1c1d7e
					}
Packit 1c1d7e
<GetQuotedString>"\""|"\n" 		{ 
Packit 1c1d7e
                                          // we add a bogus space to signal that the string was quoted. This space will be stripped later on.
Packit 1c1d7e
                                          g_tmpString+=" ";
Packit 1c1d7e
  					  //printf("Quoted String = `%s'\n",qPrintable(tmpString));
Packit 1c1d7e
  					  if (g_lastState==GetString)
Packit 1c1d7e
					  {
Packit 1c1d7e
					    *g_arg = g_codec->toUnicode(g_tmpString);
Packit 1c1d7e
                                            checkEncoding();
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_elemStr+=g_codec->toUnicode(g_tmpString);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  if (*yytext=='\n')
Packit 1c1d7e
					  {
Packit 1c1d7e
					    config_warn("Missing end quote (\") on line %d, file %s\n",yylineno,
Packit 1c1d7e
                                                qPrintable(g_yyFileName));
Packit 1c1d7e
					  }
Packit 1c1d7e
					  BEGIN(g_lastState);
Packit 1c1d7e
  					}
Packit 1c1d7e
<GetQuotedString>"\\\""			{
Packit 1c1d7e
  					  g_tmpString+='"';
Packit 1c1d7e
  					}
Packit 1c1d7e
<GetQuotedString>.			{ g_tmpString+=*yytext; }
Packit 1c1d7e
<GetStrList>[^ \#\"\t\r\n]+		{
Packit 1c1d7e
  					  g_elemStr+=g_codec->toUnicode(yytext);
Packit 1c1d7e
  					}
Packit 1c1d7e
<SkipComment>\n				{ BEGIN(Start); }
Packit 1c1d7e
<SkipComment>\\[ \r\t]*\n		{ BEGIN(Start); }
Packit 1c1d7e
<*>\\[ \r\t]*\n				{ }
Packit 1c1d7e
<*>\n
Packit 1c1d7e
<*>.					
Packit 1c1d7e
Packit 1c1d7e
%%
Packit 1c1d7e
Packit 1c1d7e
/*@ ----------------------------------------------------------------------------
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
static void substEnvVarsInString(QString &s)
Packit 1c1d7e
{
Packit 1c1d7e
  static QRegExp re(QString::fromLatin1("\\$\\([a-z_A-Z0-9]+\\)"));
Packit 1c1d7e
  if (s.isEmpty()) return;
Packit 1c1d7e
  int p=0;
Packit 1c1d7e
  int i,l;
Packit 1c1d7e
  //printf("substEnvVarInString(%s) start\n",qPrintable(s));
Packit 1c1d7e
  while ((i=re.indexIn(s,p))!=-1)
Packit 1c1d7e
  {
Packit 1c1d7e
    l = re.matchedLength();
Packit 1c1d7e
    //printf("Found environment var s.mid(%d,%d)=`%s'\n",i+2,l-3,qPrintable(s.mid(i+2,l-3)));
Packit 1c1d7e
    QString env=g_codec->toUnicode(getenv(s.mid(i+2,l-3).toLatin1()));
Packit 1c1d7e
    substEnvVarsInString(env); // recursively expand variables if needed.
Packit 1c1d7e
    s = s.left(i)+env+s.right(s.length()-i-l);
Packit 1c1d7e
    p=i+env.length(); // next time start at the end of the expanded string
Packit 1c1d7e
  }
Packit 1c1d7e
  s=s.trimmed(); // to strip the bogus space that was added when an argument
Packit 1c1d7e
                         // has quotes
Packit 1c1d7e
  //printf("substEnvVarInString(%s) end\n",qPrintable(s));
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void substEnvVarsInStrList(QStringList &sl)
Packit 1c1d7e
{
Packit 1c1d7e
  QStringList out;
Packit 1c1d7e
Packit 1c1d7e
  foreach (QString result, sl)
Packit 1c1d7e
  {
Packit 1c1d7e
    // an argument with quotes will have an extra space at the end, so wasQuoted will be TRUE.
Packit 1c1d7e
    bool wasQuoted = (result.indexOf(QChar::fromLatin1(' '))!=-1) || 
Packit 1c1d7e
                     (result.indexOf(QChar::fromLatin1('\t'))!=-1);
Packit 1c1d7e
    // here we strip the quote again
Packit 1c1d7e
    substEnvVarsInString(result);
Packit 1c1d7e
Packit 1c1d7e
    //printf("Result %s was quoted=%d\n",qPrintable(result),wasQuoted);
Packit 1c1d7e
Packit 1c1d7e
    if (!wasQuoted) /* as a result of the expansion, a single string
Packit 1c1d7e
		       may have expanded into a list, which we'll
Packit 1c1d7e
		       add to sl. If the original string already
Packit 1c1d7e
		       contained multiple elements no further 
Packit 1c1d7e
		       splitting is done to allow quoted items with spaces! */
Packit 1c1d7e
    {
Packit 1c1d7e
      int l=result.length();
Packit 1c1d7e
      int i,p=0;
Packit 1c1d7e
      // skip spaces
Packit 1c1d7e
      // search for a "word"
Packit 1c1d7e
      for (i=0;i
Packit 1c1d7e
      {
Packit 1c1d7e
	QChar c=0;
Packit 1c1d7e
	// skip until start of new word
Packit 1c1d7e
	while (i
Packit 1c1d7e
	p=i; // p marks the start index of the word
Packit 1c1d7e
	// skip until end of a word
Packit 1c1d7e
	while (i
Packit 1c1d7e
	              c!=QChar::fromLatin1('\t') && 
Packit 1c1d7e
		      c!=QChar::fromLatin1('"'))) i++;
Packit 1c1d7e
	if (i
Packit 1c1d7e
	{
Packit 1c1d7e
	  if (c==QChar::fromLatin1('"')) // word within quotes
Packit 1c1d7e
	  {
Packit 1c1d7e
	    p=i+1;
Packit 1c1d7e
	    for (i++;i
Packit 1c1d7e
	    {
Packit 1c1d7e
	      c=result.at(i);
Packit 1c1d7e
	      if (c==QChar::fromLatin1('"')) // end quote
Packit 1c1d7e
	      {
Packit 1c1d7e
                out += result.mid(p,i-p);
Packit 1c1d7e
		p=i+1;
Packit 1c1d7e
		break; 
Packit 1c1d7e
	      }
Packit 1c1d7e
	      else if (c==QChar::fromLatin1('\\')) // skip escaped stuff
Packit 1c1d7e
	      {
Packit 1c1d7e
		i++;
Packit 1c1d7e
	      }
Packit 1c1d7e
	    }
Packit 1c1d7e
	  }
Packit 1c1d7e
	  else if (c==QChar::fromLatin1(' ') || c==QChar::fromLatin1('\t')) // separator
Packit 1c1d7e
	  {
Packit 1c1d7e
            out += result.mid(p,i-p);
Packit 1c1d7e
	    p=i+1;
Packit 1c1d7e
	  }
Packit 1c1d7e
	}
Packit 1c1d7e
      }
Packit 1c1d7e
      if (p!=l) // add the leftover as a string
Packit 1c1d7e
      {
Packit 1c1d7e
        out += result.right(l-p);
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    else // just goto the next element in the list
Packit 1c1d7e
    {
Packit 1c1d7e
      out += result;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  sl = out;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
//--------------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
bool parseConfig(
Packit 1c1d7e
      const QString &fileName,
Packit 1c1d7e
      const QHash<QString,Input *> &options
Packit 1c1d7e
    )
Packit 1c1d7e
{
Packit 1c1d7e
  QHashIterator<QString, Input*> i(options);
Packit 1c1d7e
  g_file = fopen(fileName.toLocal8Bit(),"r");
Packit 1c1d7e
  if (g_file==NULL) return false;
Packit 1c1d7e
Packit 1c1d7e
  // reset all values
Packit 1c1d7e
  i.toFront();
Packit 1c1d7e
  while (i.hasNext()) 
Packit 1c1d7e
  {
Packit 1c1d7e
    i.next();
Packit 1c1d7e
    if (i.value())
Packit 1c1d7e
    {
Packit 1c1d7e
      i.value()->reset();
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  // parse config file
Packit 1c1d7e
  g_options       = &options;
Packit 1c1d7e
  g_yyFileName    = fileName;
Packit 1c1d7e
  g_includeStack.clear();
Packit 1c1d7e
  g_includeDepth  = 0;
Packit 1c1d7e
  config_doxywYYrestart( config_doxywYYin );
Packit 1c1d7e
  BEGIN( Start );
Packit 1c1d7e
  config_doxywYYlex();
Packit 1c1d7e
Packit 1c1d7e
  // update the values in the UI
Packit 1c1d7e
  i.toFront();
Packit 1c1d7e
  while (i.hasNext()) 
Packit 1c1d7e
  {
Packit 1c1d7e
    i.next();
Packit 1c1d7e
    if (i.value())
Packit 1c1d7e
    {
Packit 1c1d7e
      //printf("Updating: %s\n",qPrintable(i.key()));
Packit 1c1d7e
      i.value()->update();
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      printf("Invalid option: %s\n",qPrintable(i.key()));
Packit 1c1d7e
    }
Packit 1c1d7e
  } 
Packit 1c1d7e
  fclose(g_file);
Packit 1c1d7e
  return true;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void writeStringValue(QTextStream &t,QTextCodec *codec,const QString &s)
Packit 1c1d7e
{
Packit 1c1d7e
  QChar c;
Packit 1c1d7e
  bool needsEscaping=false;
Packit 1c1d7e
  // convert the string back to it original encoding
Packit 1c1d7e
  //QByteArray se = codec->fromUnicode(s);
Packit 1c1d7e
  t.setCodec(codec);
Packit 1c1d7e
  const QChar *p=s.data();
Packit 1c1d7e
  if (!s.isEmpty() && !p->isNull())
Packit 1c1d7e
  {
Packit 1c1d7e
    while (!(c=*p++).isNull() && !needsEscaping) 
Packit 1c1d7e
    {
Packit 1c1d7e
      needsEscaping = (c==QChar::fromLatin1(' ')  || 
Packit 1c1d7e
	               c==QChar::fromLatin1('\n') || 
Packit 1c1d7e
		       c==QChar::fromLatin1('\t') || 
Packit 1c1d7e
		       c==QChar::fromLatin1('"'));
Packit 1c1d7e
    }
Packit 1c1d7e
    if (needsEscaping)
Packit 1c1d7e
    { 
Packit 1c1d7e
      t << "\"";
Packit 1c1d7e
      p=s.data();
Packit 1c1d7e
      while (!p->isNull())
Packit 1c1d7e
      {
Packit 1c1d7e
	if (*p   ==QChar::fromLatin1(' ') && 
Packit 1c1d7e
	   *(p+1)==QChar::fromLatin1('\0')) break; // skip inserted space at the end
Packit 1c1d7e
	if (*p   ==QChar::fromLatin1('"')) t << "\\"; // escape quotes
Packit 1c1d7e
	t << *p++;
Packit 1c1d7e
      }
Packit 1c1d7e
      t << "\"";
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      t << s;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e