diff options
Diffstat (limited to 'src/config.l')
-rw-r--r-- | src/config.l | 1112 |
1 files changed, 1112 insertions, 0 deletions
diff --git a/src/config.l b/src/config.l new file mode 100644 index 0000000..232f531 --- /dev/null +++ b/src/config.l @@ -0,0 +1,1112 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ + +%{ + +/* + * includes + */ +#include <stdio.h> +#include <iostream.h> +#include <assert.h> +#include <ctype.h> + +#include <qstring.h> +#include <qfileinf.h> +#include <qdir.h> +#include <qtstream.h> + +#include "doxygen.h" +#include "config.h" +#include "message.h" +#include "pre.h" +#include "version.h" +#include "language.h" + +#define YY_NEVER_INTERACTIVE 1 + +/* ----------------------------------------------------------------- + * + * exported variables + */ + +QString projectName; +QString projectNumber; +QString outputDir; +QString htmlOutputDir; +QString latexOutputDir; +QString manOutputDir; +QString headerFile; +QString footerFile; +QString cgiName; +QString cgiURL; +QString docURL; +QString binAbsPath; +QString docAbsPath; +QString perlPath; +QString genTagFile; +QString inputFilter; +QString paperType; +QString outputLanguage; +QString stripFromPath; +QStrList includePath; +QStrList examplePath; +QStrList inputSources; +QStrList excludeSources; +QStrList filePatternList; +QStrList excludePatternList; +QStrList tagFileList; +QStrList extDocPathList; +QStrList predefined; +QStrList extraPackageList; +bool quietFlag = FALSE; +bool warningFlag = FALSE; +bool recursiveFlag = FALSE; +bool allExtFlag = FALSE; +bool searchEngineFlag = FALSE; +bool extractAllFlag = FALSE; +bool extractPrivateFlag = FALSE; +bool noIndexFlag = FALSE; +bool hideMemberFlag = FALSE; +bool hideClassFlag = FALSE; +bool macroExpansionFlag = FALSE; +bool onlyPredefinedFlag = FALSE; +bool fullPathNameFlag = FALSE; +bool compactLatexFlag = FALSE; +bool internalDocsFlag = FALSE; +bool caseSensitiveNames = FALSE; +bool generateHtml = TRUE; +bool generateLatex = TRUE; +bool generateMan = TRUE; +bool preprocessingFlag = TRUE; +bool briefMemDescFlag = TRUE; +bool searchIncludeFlag = TRUE; +bool classDiagramFlag = TRUE; +bool repeatBriefFlag = TRUE; +bool verbatimHeaderFlag = TRUE; + +/* ----------------------------------------------------------------- + * + * static variables + */ + +static const char * inputString; +static int inputPosition; +static int yyLineNr; +static QString tmpString; +static QString * s=0; +static bool * b=0; +static QStrList * l=0; +static int lastState; +static int lastEnvState; +static QString elemStr; + +/* ----------------------------------------------------------------- + */ +#undef YY_INPUT +#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); + +static int yyread(char *buf,int max_size) +{ + int c=0; + while( c < max_size && inputString[inputPosition] ) + { + *buf = inputString[inputPosition++] ; + c++; buf++; + } + return c; +} + +%} + +%x Start +%x SkipComment +%x GetString +%x GetBool +%x GetStrList +%x GetQuotedString +%x GetEnvVar + +%% + +<*>\0x0d +<Start,GetString,GetStrList,GetBool>"#" { BEGIN(SkipComment); } +<Start>"PROJECT_NAME"[ \t]*"=" { BEGIN(GetString); s=&projectName; } +<Start>"PROJECT_NUMBER"[ \t]*"=" { BEGIN(GetString); s=&projectNumber; } +<Start>"OUTPUT_DIRECTORY"[ \t]*"=" { BEGIN(GetString); s=&outputDir; } +<Start>"HTML_OUTPUT"[ \t]*"=" { BEGIN(GetString); s=&htmlOutputDir; } +<Start>"MAN_OUTPUT"[ \t]*"=" { BEGIN(GetString); s=&manOutputDir; } +<Start>"LATEX_OUTPUT"[ \t]*"=" { BEGIN(GetString); s=&latexOutputDir; } +<Start>"HTML_HEADER"[ \t]*"=" { BEGIN(GetString); s=&headerFile; } +<Start>"HTML_FOOTER"[ \t]*"=" { BEGIN(GetString); s=&footerFile; } +<Start>"CGI_NAME"[ \t]*"=" { BEGIN(GetString); s=&cgiName; } +<Start>"CGI_URL"[ \t]*"=" { BEGIN(GetString); s=&cgiURL; } +<Start>"DOC_URL"[ \t]*"=" { BEGIN(GetString); s=&docURL; } +<Start>"BIN_ABSPATH"[ \t]*"=" { BEGIN(GetString); s=&binAbsPath; } +<Start>"DOC_ABSPATH"[ \t]*"=" { BEGIN(GetString); s=&docAbsPath; } +<Start>"PERL_PATH"[ \t]*"=" { BEGIN(GetString); s=&perlPath; } +<Start>"GENERATE_TAGFILE"[ \t]*"=" { BEGIN(GetString); s=&genTagFile; } +<Start>"INPUT_FILTER"[ \t]*"=" { BEGIN(GetString); s=&inputFilter; } +<Start>"PAPER_TYPE"[ \t]*"=" { BEGIN(GetString); s=&paperType; } +<Start>"OUTPUT_LANGUAGE"[ \t]*"=" { BEGIN(GetString); s=&outputLanguage; } +<Start>"STRIP_FROM_PATH"[ \t]*"=" { BEGIN(GetString); s=&stripFromPath; } +<Start>"INCLUDE_PATH"[ \t]*"=" { BEGIN(GetStrList); l=&includePath; elemStr=""; } +<Start>"EXAMPLE_PATH"[ \t]*"=" { BEGIN(GetStrList); l=&examplePath; elemStr=""; } +<Start>"INPUT"[ \t]*"=" { BEGIN(GetStrList); l=&inputSources; elemStr=""; } +<Start>"EXCLUDE"[ \t]*"=" { BEGIN(GetStrList); l=&excludeSources; elemStr=""; } +<Start>"FILE_PATTERNS"[ \t]*"=" { BEGIN(GetStrList); l=&filePatternList; elemStr=""; } +<Start>"EXCLUDE_PATTERNS"[ \t]*"=" { BEGIN(GetStrList); l=&excludePatternList; elemStr=""; } +<Start>"TAGFILES"[ \t]*"=" { BEGIN(GetStrList); l=&tagFileList; elemStr=""; } +<Start>"EXT_DOC_PATHS"[ \t]*"=" { BEGIN(GetStrList); l=&extDocPathList; elemStr=""; } +<Start>"PREDEFINED"[ \t]*"=" { BEGIN(GetStrList); l=&predefined; elemStr=""; } +<Start>"EXTRA_PACKAGES"[ \t]*"=" { BEGIN(GetStrList); l=&extraPackageList; elemStr=""; } +<Start>"QUIET"[ \t]*"=" { BEGIN(GetBool); b=&quietFlag; } +<Start>"WARNINGS"[ \t]*"=" { BEGIN(GetBool); b=&warningFlag; } +<Start>"RECURSIVE"[ \t]*"=" { BEGIN(GetBool); b=&recursiveFlag; } +<Start>"ALLEXTERNALS"[ \t]*"=" { BEGIN(GetBool); b=&allExtFlag; } +<Start>"SEARCHENGINE"[ \t]*"=" { BEGIN(GetBool); b=&searchEngineFlag; } +<Start>"EXTRACT_ALL"[ \t]*"=" { BEGIN(GetBool); b=&extractAllFlag; } +<Start>"EXTRACT_PRIVATE"[ \t]*"=" { BEGIN(GetBool); b=&extractPrivateFlag; } +<Start>"DISABLE_INDEX"[ \t]*"=" { BEGIN(GetBool); b=&noIndexFlag; } +<Start>"GENERATE_LATEX"[ \t]*"=" { BEGIN(GetBool); b=&generateLatex; } +<Start>"GENERATE_HTML"[ \t]*"=" { BEGIN(GetBool); b=&generateHtml; } +<Start>"GENERATE_MAN"[ \t]*"=" { BEGIN(GetBool); b=&generateMan; } +<Start>"ENABLE_PREPROCESSING"[ \t]*"=" { BEGIN(GetBool); b=&preprocessingFlag; } +<Start>"MACRO_EXPANSION"[ \t]*"=" { BEGIN(GetBool); b=¯oExpansionFlag; } +<Start>"SEARCH_INCLUDES"[ \t]*"=" { BEGIN(GetBool); b=&searchIncludeFlag; } +<Start>"BRIEF_MEMBER_DESC"[ \t]*"=" { BEGIN(GetBool); b=&briefMemDescFlag; } +<Start>"HIDE_UNDOC_MEMBERS"[ \t]*"=" { BEGIN(GetBool); b=&hideMemberFlag; } +<Start>"HIDE_UNDOC_CLASSES"[ \t]*"=" { BEGIN(GetBool); b=&hideClassFlag; } +<Start>"EXPAND_ONLY_PREDEF"[ \t]*"=" { BEGIN(GetBool); b=&onlyPredefinedFlag; } +<Start>"FULL_PATH_NAMES"[ \t]*"=" { BEGIN(GetBool); b=&fullPathNameFlag; } +<Start>"CLASS_DIAGRAMS"[ \t]*"=" { BEGIN(GetBool); b=&classDiagramFlag; } +<Start>"COMPACT_LATEX"[ \t]*"=" { BEGIN(GetBool); b=&compactLatexFlag; } +<Start>"REPEAT_BRIEF"[ \t]*"=" { BEGIN(GetBool); b=&repeatBriefFlag; } +<Start>"INTERNAL_DOCS"[ \t]*"=" { BEGIN(GetBool); b=&internalDocsFlag; } +<Start>"CASE_SENSE_NAMES"[ \t]*"=" { BEGIN(GetBool); b=&caseSensitiveNames; } +<Start>"VERBATIM_HEADERS"[ \t]*"=" { BEGIN(GetBool); b=&verbatimHeaderFlag; } +<Start>[a-z_A-Z0-9]+ { err("Warning: ignoring unknown tag `%s' at line %d\n",yytext,yyLineNr); } +<GetString,GetBool>\n { yyLineNr++; BEGIN(Start); } +<GetStrList>\n { + yyLineNr++; + if (elemStr.length()>0) + { + //printf("elemStr1=`%s'\n",elemStr.data()); + l->append(elemStr); + } + BEGIN(Start); + } +<GetStrList>[ \t]+ { + if (elemStr.length()>0) + { + //printf("elemStr2=`%s'\n",elemStr.data()); + l->append(elemStr); + } + elemStr.resize(0); + } +<GetString>[^ \"\$\t\r\n]+ { (*s)+=yytext; } +<GetString,GetStrList>"\"" { lastState=YY_START; + BEGIN(GetQuotedString); + tmpString.resize(0); + } +<GetString,GetStrList,GetQuotedString>"\$\(" { + //printf(">> Enter env\n"); + lastEnvState=YY_START; + BEGIN(GetEnvVar); + } +<GetEnvVar>[a-z_A-Z0-9]+")" { + yytext[yyleng-1]='\0'; + const char *env=getenv(yytext); + int i; + int l=strlen(env); + //printf("env name=`%s' text=`%s'\n",yytext,env); + for (i=l-1;i>=0;i--) unput(env[i]); + BEGIN(lastEnvState); + } +<GetQuotedString>"\""|"\n" { + //printf("Quoted String = `%s'\n",tmpString.data()); + if (lastState==GetString) + (*s)+=tmpString; + else + elemStr+=tmpString; + if (*yytext=='\n') + { + err("Warning: Missing end quote (\") on line %d\n",yyLineNr); + yyLineNr++; + } + BEGIN(lastState); + } +<GetQuotedString>"\\\"" { + tmpString+='"'; + } +<GetQuotedString>. { tmpString+=*yytext; } +<GetBool>[a-zA-Z]+ { + QString bs=yytext; + bs=bs.upper(); + if (bs=="YES") + *b=TRUE; + else if (bs=="NO") + *b=FALSE; + else + { + *b=FALSE; + warn("Warning: Invalid value `%s' for " + "boolean tag in line %d; use YES or NO\n", + bs.data(),yyLineNr); + } + } + /* +<GetStrList>[a-z_A-Z.*:?~0-9/\\\-]+ { + elemStr+=yytext; + } + */ +<GetStrList>[^ \#\"\$\t\r\n]+ { + elemStr+=yytext; + } +<SkipComment>\n { yyLineNr++; BEGIN(Start); } +<SkipComment>\\[ \r\t]*\n { yyLineNr++; BEGIN(Start); } +<*>\\[ \r\t]*\n { yyLineNr++; } +<*>. +<*>\n { yyLineNr++ ; } + +%% + +/*@ ---------------------------------------------------------------------------- + */ + + +void dumpConfig() +{ + printf("projectName=`%s'\n",projectName.data()); + printf("outputDir=`%s'\n", outputDir.data()); + printf("headerFile=`%s'\n", headerFile.data()); + printf("footerFile=`%s'\n", footerFile.data()); + char *ip=includePath.first(); + while (ip) + { + printf("includePath=`%s'\n",ip); + ip=includePath.next(); + } + printf("quiet=`%d'\n", quietFlag); + printf("warnings=`%d'\n", warningFlag); + char *is=inputSources.first(); + while (is) + { + printf("inputSources=`%s'\n",is); + is=inputSources.next(); + } + char *fp=filePatternList.first(); + while (fp) + { + printf("filePattern=`%s'\n",fp); + fp=filePatternList.next(); + } + printf("recusive=`%d'\n",recursiveFlag); + printf("inputFilter=`%s'\n",inputFilter.data()); + char *tf=tagFileList.first(); + while (tf) + { + printf("tagFile=`%s'\n",tf); + tf=tagFileList.next(); + } + printf("allExternals=`%d'\n",allExtFlag); + printf("searchEngine=`%d'\n",searchEngineFlag); + printf("cgiName=`%s'\n",cgiName.data()); + printf("cgiURL=`%s'\n",cgiURL.data()); + printf("docURL=`%s'\n",docURL.data()); + printf("binAbsPath=`%s'\n",binAbsPath.data()); + char *ed=extDocPathList.first(); + while (ed) + { + printf("binAbsPathFile=`%s'\n",ed); + ed=extDocPathList.next(); + } +} + +void writeTemplateConfig(QFile *f,bool sl) +{ + QTextStream t(f); + t << "# Doxyfile " << versionString << endl; + if (!sl) + { + t << "# This file describes the settings to be used by doxygen for a project\n"; + t << "#\n"; + t << "# All text after a hash (#) is considered a comment and will be ignored\n"; + t << "# The format is:\n"; + t << "# TAG = value [value, ...]\n"; + t << "# Values that contain spaces should be placed between quotes (\" \")\n"; + t << "\n"; + t << "#---------------------------------------------------------------------------\n"; + t << "# General configuration options\n"; + t << "#---------------------------------------------------------------------------\n"; + t << "\n"; + t << "# The PROJECT_NAME tag is a single word (or a sequence of word surrounded\n"; + t << "# by quotes) that should identify the project. \n"; + t << "\n"; + } + t << "PROJECT_NAME =\n"; + if (!sl) + { + t << "\n"; + t << "# The PROJECT_NUMBER tag can be used to enter a project or revision number.\n" ; + t << "# This could be handy for archiving the generated documentation or \n"; + t << "# if some version control system is used.\n"; + t << "\n"; + } + t << "PROJECT_NUMBER =\n"; + if (!sl) + { + t << "\n"; + t << "# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) \n"; + t << "# base path where the generated documentation will be put. \n"; + t << "# If a relative path is entered, it will be relative to the location \n"; + t << "# where doxygen was started. If left blank the current directory will be used.\n"; + t << "\n"; + } + t << "OUTPUT_DIRECTORY =\n"; + if (!sl) + { + t << "\n"; + t << "# The OUTPUT_LANGUAGE tag is used to specify the language in which all\n"; + t << "# documentation generated by doxygen is written. Doxygen will use this\n"; + t << "# information to generate all constant output in the proper language.\n"; + t << "# The default language is English, other supported languages are: Dutch\n"; + t << "\n"; + } + t << "OUTPUT_LANGUAGE = English\n"; + if (!sl) + { + t << "\n"; + t << "# The QUIET tag can be used to turn on/off the messages that are generated\n"; + t << "# by doxygen. Possible values are YES and NO. If left blank NO is used.\n"; + t << "\n"; + } + t << "QUIET = NO\n"; + if (!sl) + { + t << "\n"; + t << "# The WARNINGS tag can be used to turn on/off the warning messages that are\n"; + t << "# generated by doxygen. Possible values are YES and NO. If left blank\n"; + t << "# NO is used.\n"; + t << "\n"; + } + t << "WARNINGS = YES\n"; + if (!sl) + { + t << "\n"; + t << "# The DISABLE_INDEX tag can be used to turn on/off the condensed index at\n"; + t << "# top of each HTML page. The value NO (the default) enables the index and\n"; + t << "# the value YES disables it.\n"; + t << "\n"; + } + t << "DISABLE_INDEX = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the EXTRACT_ALL tag is set to YES all classes and functions will be\n"; + t << "# included in the documentation, even if no documentation was available.\n"; + t << "\n"; + } + t << "EXTRACT_ALL = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the EXTRACT_PRIVATE tag is set to YES all private members of a class\n"; + t << "# will be included in the documentation.\n"; + t << "\n"; + } + t << "EXTRACT_PRIVATE = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all\n"; + t << "# undocumented members inside documented classes or files.\n"; + t << "\n"; + } + t << "HIDE_UNDOC_MEMBERS = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the HIDE_UNDOC_CLASSESS tag is set to YES, Doxygen will hide all\n"; + t << "# undocumented classes.\n"; + t << "\n"; + } + t << "HIDE_UNDOC_CLASSES = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will\n"; + t << "# include brief member descriptions after the members that are listed in \n"; + t << "# the file and class documentation (similar to JavaDoc).\n"; + t << "# Set to NO to disable this.\n"; + t << "\n"; + } + t << "BRIEF_MEMBER_DESC = YES\n"; + if (!sl) + { + t << "\n"; + t << "# The INTERNAL_DOCS tag determines if documentation\n"; + t << "# that is typed after a \\internal command is included. If the tag is set \n"; + t << "# to NO (the default) then the documentation will be excluded.\n"; + t << "# Set it to YES to include the internal documentation.\n"; + t << "\n"; + } + t << "INTERNAL_DOCS = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend\n"; + t << "# the brief description of a member or function before the detailed description.\n"; + t << "# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the \n"; + t << "# brief descriptions will be completely suppressed.\n"; + t << "\n"; + } + t << "REPEAT_BRIEF = YES\n"; + if (!sl) + { + t << "\n"; + t << "# If the FULL_PATH_NAMES tag is set to YES Doxygen will prepend the full\n"; + t << "# path before files name in the file list and in the header files. If set\n" ; + t << "# to NO the shortest path that makes the file name unique will be used.\n"; + t << "\n"; + } + t << "FULL_PATH_NAMES = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag\n"; + t << "# can be used to strip a user defined part of the path. Stripping is\n" ; + t << "# only done if the specified string matches the left-hand part of the path.\n"; + t << "\n"; + } + t << "STRIP_FROM_PATH =\n"; + if (!sl) + { + t << "\n"; + t << "# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will\n"; + t << "# generate a class diagram (in Html and LaTeX) for classes with base or\n"; + t << "# super classes. Setting the tag to NO turns the diagrams off.\n"; + t << "\n"; + } + t << "CLASS_DIAGRAMS = YES\n"; + if (!sl) + { + t << "\n"; + t << "# If the CASE_SENSE_NAMES tag is set to NO (the default) then Doxygen\n"; + t << "# will only generate file names in lower case letters. If set to\n"; + t << "# YES upper case letters are also allowed. This is useful if you have\n"; + t << "# classes or files whose names only differ in case and if your file system\n"; + t << "# supports case sensitive file names.\n"; + t << "\n"; + } + t << "CASE_SENSE_NAMES = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the VERBATIM_HEADERS tag is set the YES (the default) then Doxygen\n"; + t << "# will generate a verbatim copy of the header file for each class for\n"; + t << "# which an include is specified. Set to NO to disable this.\n"; + t << "\n"; + } + t << "VERBATIM_HEADERS = YES\n"; + if (!sl) + { + t << "\n"; + t << "#---------------------------------------------------------------------------\n"; + t << "# configuration options related to the input files\n"; + t << "#---------------------------------------------------------------------------\n"; + t << "\n"; + t << "# The INPUT tag can be used to specify the files and/or directories that contain \n"; + t << "# documented source files. You may enter file names like \"myfile.cpp\" or \n"; + t << "# directories like \"/usr/src/myproject\". Separate the files or directories \n"; + t << "# with spaces.\n"; + t << "\n"; + } + t << "INPUT =\n"; + if (!sl) + { + t << "\n"; + t << "# If the value of the INPUT tag contains directories, you can use the \n"; + t << "# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp \n"; + t << "# and *.h) to filter out the source-files in the directories. If left \n"; + t << "# blank all files are included.\n"; + t << "\n"; + } + t << "FILE_PATTERNS =\n"; + if (!sl) + { + t << "\n"; + t << "# The RECURSIVE tag can be used to turn specify whether or not subdirectories\n"; + t << "# should be searched for input files as well. Possible values are YES and NO.\n"; + t << "# If left blank NO is used.\n"; + t << "\n"; + } + t << "RECURSIVE = NO\n"; + if (!sl) + { + t << "\n"; + t << "# The EXCLUDE tag can be used to specify files and/or directories that should\n"; + t << "# excluded from the INPUT source files. This way you can easily exclude a \n"; + t << "# subdirectory from a directory tree whose root is specified with the INPUT tag.\n"; + t << "\n"; + } + t << "EXCLUDE =\n"; + if (!sl) + { + t << "\n"; + t << "# If the value of the INPUT tag contains directories, you can use the\n"; + t << "# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude\n"; + t << "# certain files from those directories.\n"; + t << "\n"; + } + t << "EXCLUDE_PATTERNS =\n"; + if (!sl) + { + t << "\n"; + t << "# The EXAMPLE_PATH tag can be used to specify one or more files or \n"; + t << "# directories that contain example code fragments that are included (see \n"; + t << "# the \\include command).\n"; + t << "\n"; + } + t << "EXAMPLE_PATH =\n"; + if (!sl) + { + t << "\n"; + t << "# The INPUT_FILTER tag can be used to specify a program that doxygen should\n"; + t << "# invoke to filter for each input file. Doxygen will invoke the filter program \n"; + t << "# by executing (via popen()) the command <filter> <input-file>, where <filter>\n"; + t << "# is the value of the INPUT_FILTER tag, and <input-file> is the name of an\n"; + t << "# input file. Doxygen will then use the output that the filter program writes\n"; + t << "# to standard output.\n"; + t << "\n"; + } + t << "INPUT_FILTER =\n"; + if (!sl) + { + t << "\n"; + t << "#---------------------------------------------------------------------------\n"; + t << "# configuration options related to the HTML output\n"; + t << "#---------------------------------------------------------------------------\n"; + t << "\n"; + t << "# If the GENERATE_HTML tag is set to YES (the default) Doxygen will\n"; + t << "# generate HTML output\n"; + t << "\n"; + } + t << "GENERATE_HTML = YES\n"; + if (!sl) + { + t << "\n"; + t << "# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.\n"; + t << "# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n"; + t << "# put in front of it. If left blank `html' will be used as the default path.\n"; + t << "\n"; + } + t << "HTML_OUTPUT =\n"; + if (!sl) + { + t << "\n"; + t << "# The HTML_HEADER tag can be used to specify a personal HTML header for \n"; + t << "# each generated HTML page. If it is left blank doxygen will generate a \n"; + t << "# standard header.\n"; + t << "\n"; + } + t << "HTML_HEADER =\n"; + if (!sl) + { + t << "\n"; + t << "# The HTML_FOOTER tag can be used to specify a personal HTML footer for \n"; + t << "# each generated HTML page. If it is left blank doxygen will generate a \n"; + t << "# standard footer.\n"; + t << "\n"; + } + t << "HTML_FOOTER =\n"; + if (!sl) + { + t << "\n"; + t << "#---------------------------------------------------------------------------\n"; + t << "# configuration options related to the LaTeX output\n"; + t << "#---------------------------------------------------------------------------\n"; + t << "\n"; + t << "# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will\n"; + t << "# generate Latex output.\n"; + t << "\n"; + } + t << "GENERATE_LATEX = YES\n"; + if (!sl) + { + t << "\n"; + t << "# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.\n"; + t << "# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n"; + t << "# put in front of it. If left blank `latex' will be used as the default path.\n"; + t << "\n"; + } + t << "LATEX_OUTPUT =\n"; + if (!sl) + { + t << "\n"; + t << "# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact\n"; + t << "# LaTeX documents. This may be useful for small projects and may help to\n"; + t << "# save some trees in general.\n"; + t << "\n"; + } + t << "COMPACT_LATEX = NO\n"; + if (!sl) + { + t << "\n"; + t << "# The PAPER_TYPE tag can be used to set the paper type that is used\n"; + t << "# by the printer. Possible values are: a4, a4wide, letter, legal and \n"; + t << "# executive. If left blank a4wide will be used.\n"; + t << "\n"; + } + t << "PAPER_TYPE = a4wide\n"; + if (!sl) + { + t << "\n"; + t << "# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX\n"; + t << "# packages that should be included in the LaTeX output.\n"; + t << "\n"; + } + t << "EXTRA_PACKAGES =\n"; + if (!sl) + { + t << "\n"; + t << "#---------------------------------------------------------------------------\n"; + t << "# configuration options related to the man page output\n"; + t << "#---------------------------------------------------------------------------\n"; + t << "\n"; + t << "# If the GENERATE_MAN tag is set to YES (the default) Doxygen will\n"; + t << "# generate man pages\n"; + t << "\n"; + } + t << "GENERATE_MAN = YES\n"; + if (!sl) + { + t << "\n"; + t << "# The MAN_OUTPUT tag is used to specify where the man pages will be put.\n"; + t << "# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n"; + t << "# put in front of it. If left blank `man' will be used as the default path.\n"; + t << "\n"; + } + t << "MAN_OUTPUT =\n"; + if (!sl) + { + t << "\n"; + t << "#---------------------------------------------------------------------------\n"; + t << "# Configuration options related to the preprocessor \n"; + t << "#---------------------------------------------------------------------------\n"; + t << "\n"; + t << "# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will\n"; + t << "# evaluate all C-preprocessor directives found in the sources and include\n"; + t << "# files.\n"; + t << "\n"; + } + t << "ENABLE_PREPROCESSING = YES\n"; + if (!sl) + { + t << "\n"; + t << "# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro\n"; + t << "# names in the source code. If set to NO (the default) only conditional \n"; + t << "# compilation will be performed.\n"; + t << "\n"; + } + t << "MACRO_EXPANSION = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files\n"; + t << "# in the INCLUDE_PATH (see below) will be search if a #include is found.\n"; + t << "\n"; + } + t << "SEARCH_INCLUDES = YES\n"; + if (!sl) + { + t << "\n"; + t << "# The INCLUDE_PATH tag can be used to specify one or more directories that\n"; + t << "# contain include files that are not input files but should be processed by\n"; + t << "# the preprocessor.\n" ; + t << "\n"; + } + t << "INCLUDE_PATH =\n"; + if (!sl) + { + t << "\n"; + t << "# The PREDEFINED tag can be used to specify one or more macro names that\n"; + t << "# are defined before the preprocessor is started (similar to the -D option of\n"; + t << "# gcc). The argument of the tag is a list of macros of the form: name\n"; + t << "# or name=definition (no spaces). If the definition and the = are \n"; + t << "# omitted =1 is assumed.\n"; + t << "\n"; + } + t << "PREDEFINED =\n"; + if (!sl) + { + t << "\n"; + t << "# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES\n"; + t << "# then the macro expansion is limited to the macros specified with the\n"; + t << "# PREDEFINED tag.\n"; + t << "\n"; + } + t << "EXPAND_ONLY_PREDEF = NO\n"; + if (!sl) + { + t << "\n"; + t << "#---------------------------------------------------------------------------\n"; + t << "# Configuration options related to external references \n"; + t << "#---------------------------------------------------------------------------\n"; + t << "\n"; + t << "# The TAGFILES tag can be used to specify one or more tagfiles. \n"; + t << "\n"; + } + t << "TAGFILES =\n"; + if (!sl) + { + t << "\n"; + t << "# When a file name is specified after GENERATE_TAGFILE, doxygen will create\n"; + t << "# a tag file that is based on the input files it reads.\n"; + t << "\n"; + } + t << "GENERATE_TAGFILE =\n"; + if (!sl) + { + t << "\n"; + t << "# If the ALLEXTERNALS tag is set to YES all external classes will be listed\n"; + t << "# in the class index. If set to NO only the inherited external classes\n"; + t << "# will be listed.\n"; + t << "\n"; + } + t << "ALLEXTERNALS = NO\n"; + if (!sl) + { + t << "\n"; + t << "# The PERL_PATH should be the absolute path and name of the perl script\n"; + t << "# interpreter (i.e. the result of `which perl').\n"; + t << "\n"; + } + t << "PERL_PATH = /usr/local/bin/perl\n"; + if (!sl) + { + t << "\n"; + t << "#---------------------------------------------------------------------------\n"; + t << "# Configuration options related to the search engine \n"; + t << "#---------------------------------------------------------------------------\n"; + t << "\n"; + t << "# The SEARCHENGINE tag specifies whether or not a search engine should be \n"; + t << "# used. If set to NO the values of all tags below this one will be ignored.\n"; + t << "\n"; + } + t << "SEARCHENGINE = NO\n"; + if (!sl) + { + t << "\n"; + t << "# The CGI_NAME tag should be the name of the CGI script that\n"; + t << "# starts the search engine (doxysearch) with the correct parameters.\n"; + t << "# A script with this name will be generated by doxygen.\n"; + t << "\n"; + } + t << "CGI_NAME = search.cgi\n"; + if (!sl) + { + t << "\n"; + t << "# The CGI_URL tag should be the absolute URL to the directory where the\n"; + t << "# cgi binaries are located. See the documentation of your http daemon for \n"; + t << "# details.\n"; + t << "\n"; + } + t << "CGI_URL =\n"; + if (!sl) + { + t << "\n"; + t << "# The DOC_URL tag should be the absolute URL to the directory where the\n"; + t << "# documentation is located. If left blank the absolute path to the \n"; + t << "# documentation, with file:// prepended to it, will be used.\n"; + t << "\n"; + } + t << "DOC_URL =\n"; + if (!sl) + { + t << "\n"; + t << "# The DOC_ABSPATH tag should be the absolute path to the directory where the\n"; + t << "# documentation is located. If left blank the directory on the local machine\n"; + t << "# will be used.\n"; + t << "\n"; + } + t << "DOC_ABSPATH =\n"; + if (!sl) + { + t << "\n"; + t << "# The BIN_ABSPATH tag must point to the directory where the doxysearch binary\n"; + t << "# is installed.\n"; + t << "\n"; + } + t << "BIN_ABSPATH = /usr/local/bin/\n"; + if (!sl) + { + t << "\n"; + t << "# The EXT_DOC_PATHS tag can be used to specify one or more paths to \n"; + t << "# documentation generated for other projects. This allows doxysearch to search\n"; + t << "# the documentation for these projects as well.\n"; + t << "\n"; + } + t << "EXT_DOC_PATHS =\n"; +} + +void checkConfig() +{ + //if (projectName.length()>0) + //{ + // projectName[0]=toupper(projectName[0]); + //} + + paperType = paperType.lower().stripWhiteSpace(); + if (paperType.isEmpty()) + { + paperType = "a4wide"; + } + if (paperType!="a4" && paperType!="a4wide" && paperType!="letter" && + paperType!="legal" && paperType!="executive") + { + err("Error: Unknown page type specified"); + } + + outputLanguage=outputLanguage.stripWhiteSpace(); + if (outputLanguage.isEmpty()) + { + setTranslator("English"); + } + else + { + if (!setTranslator(outputLanguage)) + { + err("Error: Output language %s not supported! Using english instead.\n", + outputLanguage.data()); + } + } + + // Test to see if output directory is valid + if (outputDir.isEmpty()) + outputDir=QDir::currentDirPath(); + else + { + QDir dir(outputDir); + if (!dir.exists()) + { + dir.setPath(QDir::currentDirPath()); + if (!dir.mkdir(outputDir)) + { + err("Error: tag OUTPUT_DIRECTORY: Output directory `%s' does not " + "exist and cannot be created\n",outputDir.data()); + exit(1); + } + else if (!quietFlag) + { + err("Notice: Output directory `%s' does not exist. " + "I have created it for you.\n", outputDir.data()); + } + dir.cd(outputDir); + } + outputDir=dir.absPath(); + } + + if (htmlOutputDir.isEmpty() && generateHtml) + { + htmlOutputDir=outputDir+"/html"; + } + else if (htmlOutputDir && htmlOutputDir[0]!='/') + { + htmlOutputDir.prepend(outputDir+'/'); + } + QDir htmlDir(htmlOutputDir); + if (!htmlDir.exists() && !htmlDir.mkdir(htmlOutputDir)) + { + err("Could not create output directory %s\n",htmlOutputDir.data()); + exit(1); + } + + if (latexOutputDir.isEmpty() && generateLatex) + { + latexOutputDir=outputDir+"/latex"; + } + else if (latexOutputDir && latexOutputDir[0]!='/') + { + latexOutputDir.prepend(outputDir+'/'); + } + QDir latexDir(latexOutputDir); + if (!latexDir.exists() && !latexDir.mkdir(latexOutputDir)) + { + err("Could not create output directory %s\n",latexOutputDir.data()); + exit(1); + } + + if (manOutputDir.isEmpty() && generateMan) + { + manOutputDir=outputDir+"/man"; + } + else if (manOutputDir && manOutputDir[0]!='/') + { + manOutputDir.prepend(outputDir+'/'); + } + QDir manDir(manOutputDir); + if (!manDir.exists() && !manDir.mkdir(manOutputDir)) + { + err("Could not create output directory %s\n",manOutputDir.data()); + exit(1); + } + + // Test to see if HTML header is valid + if (headerFile.length()>0) + { + QFileInfo fi(headerFile); + if (!fi.exists()) + { + err("Error: tag HTML_HEADER: header file `%s' " + "does not exist\n",headerFile.data()); + exit(1); + } + } + // Test to see if HTML footer is valid + if (footerFile.length()>0) + { + QFileInfo fi(footerFile); + if (!fi.exists()) + { + err("Error: tag HTML_FOOTER: footer file `%s' " + "does not exist\n",footerFile.data()); + exit(1); + } + } + // check include path + char *s=includePath.first(); + while (s) + { + QFileInfo fi(s); + if (!fi.exists()) err("Warning: tag INCLUDE_PATH: include path `%s' " + "does not exist\n",s); + addSearchDir(fi.absFilePath()); + s=includePath.next(); + } + // check input + if (inputSources.count()==0) + { + err("Error: tag INPUT: no input files specified after the INPUT tag.\n"); + exit(1); + } + else + { + s=inputSources.first(); + while (s) + { + QFileInfo fi(s); + if (!fi.exists()) + { + err("Error: tag INPUT: input source `%s' does not exist\n",s); + exit(1); + } + s=inputSources.next(); + } + } + // add default pattern if needed + if (filePatternList.count()==0) + { + filePatternList.append("*"); + } + + // more checks needed if and only if the search engine is enabled. + if (searchEngineFlag) + { + // check cgi name + if (cgiName.length()==0) + { + err("Error: tag CGI_NAME: no cgi script name after the CGI_NAME tag.\n"); + exit(1); + } + // check cgi URL + if (cgiURL.length()==0) + { + err("Error: tag CGI_URL: no URL to cgi directory specified.\n"); + exit(1); + } + else if (cgiURL.left(7)!="http://") + { + err("Error: tag CGI_URL: URL to cgi directory is invalid (must " + "start with http://).\n"); + exit(1); + } + // check documentation URL + if (docURL.length()==0) + { + docURL = outputDir.copy().prepend("file://").append("html"); + } + else if (docURL.left(7)!="http://" && docURL.left(7)!="file://") + { + err("Error: tag DOC_URL: URL to documentation is invalid or " + "not absolute.\n"); + exit(1); + } + // check absolute documentation path + if (docAbsPath.length()==0) + { + docAbsPath = outputDir+"/html"; + } + else if (docAbsPath && docAbsPath[0]!='/') + { + err("Error: tag DOC_ABSPATH: path is not absolute\n"); + exit(1); + } + // check path to doxysearch + if (binAbsPath.length()==0) + { + err("Error: tag BIN_ABSPATH: no absolute path to doxysearch " + "specified.\n"); + exit(1); + } + else + { + if (binAbsPath && binAbsPath[0]!='/') + { + err("Error: tag BIN_ABSPATH: path is not absolute " + "(must start with /).\n"); + exit(1); + } + } + // check perl path + if (perlPath.length()==0) + { + perlPath="/usr/local/bin/perl"; + } + QFileInfo fi(perlPath); + if (!fi.exists()) + { + err("Error: tag PERL_PATH: perl interpreter not found at `%s'\n", + perlPath.data()); + exit(1); + } + } +} + +void parseConfig(const QString &s) +{ + inputString = s; + inputPosition = 0; + yyLineNr = 1; + configYYrestart( configYYin ); + BEGIN( Start ); + configYYlex(); + checkConfig(); +} + +extern "C" { // some bogus code to keep the compiler happy + int configYYwrap() { return 1 ; } +} |