KDevelop API Documentation

config.cpp

Go to the documentation of this file.
00001 #define yy_create_buffer configYY_create_buffer
00002 #define yy_delete_buffer configYY_delete_buffer
00003 #define yy_scan_buffer configYY_scan_buffer
00004 #define yy_scan_string configYY_scan_string
00005 #define yy_scan_bytes configYY_scan_bytes
00006 #define yy_flex_debug configYY_flex_debug
00007 #define yy_init_buffer configYY_init_buffer
00008 #define yy_flush_buffer configYY_flush_buffer
00009 #define yy_load_buffer_state configYY_load_buffer_state
00010 #define yy_switch_to_buffer configYY_switch_to_buffer
00011 #define yyin configYYin
00012 #define yyleng configYYleng
00013 #define yylex configYYlex
00014 #define yyout configYYout
00015 #define yyrestart configYYrestart
00016 #define yytext configYYtext
00017 
00018 /* A lexical scanner generated by flex */
00019 
00020 /* Scanner skeleton version:
00021  * $Header: /home/kde/kdevelop/parts/doxygen/config.cpp,v 1.25 2004/07/11 20:58:38 aclu Exp $
00022  */
00023 
00024 #define FLEX_SCANNER
00025 #define YY_FLEX_MAJOR_VERSION 2
00026 #define YY_FLEX_MINOR_VERSION 5
00027 
00028 #include <stdio.h>
00029 
00030 
00031 /* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
00032 #ifdef c_plusplus
00033 #ifndef __cplusplus
00034 #define __cplusplus
00035 #endif
00036 #endif
00037 
00038 
00039 #ifdef __cplusplus
00040 
00041 #include <stdlib.h>
00042 #include <unistd.h>
00043 
00044 /* Use prototypes in function declarations. */
00045 #define YY_USE_PROTOS
00046 
00047 /* The "const" storage-class-modifier is valid. */
00048 #define YY_USE_CONST
00049 
00050 #else   /* ! __cplusplus */
00051 
00052 #if __STDC__
00053 
00054 #define YY_USE_PROTOS
00055 #define YY_USE_CONST
00056 
00057 #endif  /* __STDC__ */
00058 #endif  /* ! __cplusplus */
00059 
00060 #ifdef __TURBOC__
00061  #pragma warn -rch
00062  #pragma warn -use
00063 #include <io.h>
00064 #include <stdlib.h>
00065 #define YY_USE_CONST
00066 #define YY_USE_PROTOS
00067 #endif
00068 
00069 #ifdef YY_USE_CONST
00070 #define yyconst const
00071 #else
00072 #define yyconst
00073 #endif
00074 
00075 
00076 #ifdef YY_USE_PROTOS
00077 #define YY_PROTO(proto) proto
00078 #else
00079 #define YY_PROTO(proto) ()
00080 #endif
00081 
00082 /* Returned upon end-of-file. */
00083 #define YY_NULL 0
00084 
00085 /* Promotes a possibly negative, possibly signed char to an unsigned
00086  * integer for use as an array index.  If the signed char is negative,
00087  * we want to instead treat it as an 8-bit unsigned char, hence the
00088  * double cast.
00089  */
00090 #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
00091 
00092 /* Enter a start condition.  This macro really ought to take a parameter,
00093  * but we do it the disgusting crufty way forced on us by the ()-less
00094  * definition of BEGIN.
00095  */
00096 #define BEGIN yy_start = 1 + 2 *
00097 
00098 /* Translate the current start state into a value that can be later handed
00099  * to BEGIN to return to the state.  The YYSTATE alias is for lex
00100  * compatibility.
00101  */
00102 #define YY_START ((yy_start - 1) / 2)
00103 #define YYSTATE YY_START
00104 
00105 /* Action number for EOF rule of a given start state. */
00106 #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
00107 
00108 /* Special action meaning "start processing a new file". */
00109 #define YY_NEW_FILE yyrestart( yyin )
00110 
00111 #define YY_END_OF_BUFFER_CHAR 0
00112 
00113 /* Size of default input buffer. */
00114 #define YY_BUF_SIZE 16384
00115 
00116 typedef struct yy_buffer_state *YY_BUFFER_STATE;
00117 
00118 extern int yyleng;
00119 extern FILE *yyin, *yyout;
00120 
00121 #define EOB_ACT_CONTINUE_SCAN 0
00122 #define EOB_ACT_END_OF_FILE 1
00123 #define EOB_ACT_LAST_MATCH 2
00124 
00125 /* The funky do-while in the following #define is used to turn the definition
00126  * int a single C statement (which needs a semi-colon terminator).  This
00127  * avoids problems with code like:
00128  *
00129  *  if ( condition_holds )
00130  *      yyless( 5 );
00131  *  else
00132  *      do_something_else();
00133  *
00134  * Prior to using the do-while the compiler would get upset at the
00135  * "else" because it interpreted the "if" statement as being all
00136  * done when it reached the ';' after the yyless() call.
00137  */
00138 
00139 /* Return all but the first 'n' matched characters back to the input stream. */
00140 
00141 #define yyless(n) \
00142     do \
00143         { \
00144         /* Undo effects of setting up yytext. */ \
00145         *yy_cp = yy_hold_char; \
00146         YY_RESTORE_YY_MORE_OFFSET \
00147         yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
00148         YY_DO_BEFORE_ACTION; /* set up yytext again */ \
00149         } \
00150     while ( 0 )
00151 
00152 #define unput(c) yyunput( c, yytext_ptr )
00153 
00154 /* The following is because we cannot portably get our hands on size_t
00155  * (without autoconf's help, which isn't available because we want
00156  * flex-generated scanners to compile on their own).
00157  */
00158 typedef unsigned int yy_size_t;
00159 
00160 
00161 struct yy_buffer_state
00162     {
00163     FILE *yy_input_file;
00164 
00165     char *yy_ch_buf;        /* input buffer */
00166     char *yy_buf_pos;       /* current position in input buffer */
00167 
00168     /* Size of input buffer in bytes, not including room for EOB
00169      * characters.
00170      */
00171     yy_size_t yy_buf_size;
00172 
00173     /* Number of characters read into yy_ch_buf, not including EOB
00174      * characters.
00175      */
00176     int yy_n_chars;
00177 
00178     /* Whether we "own" the buffer - i.e., we know we created it,
00179      * and can realloc() it to grow it, and should free() it to
00180      * delete it.
00181      */
00182     int yy_is_our_buffer;
00183 
00184     /* Whether this is an "interactive" input source; if so, and
00185      * if we're using stdio for input, then we want to use getc()
00186      * instead of fread(), to make sure we stop fetching input after
00187      * each newline.
00188      */
00189     int yy_is_interactive;
00190 
00191     /* Whether we're considered to be at the beginning of a line.
00192      * If so, '^' rules will be active on the next match, otherwise
00193      * not.
00194      */
00195     int yy_at_bol;
00196 
00197     /* Whether to try to fill the input buffer when we reach the
00198      * end of it.
00199      */
00200     int yy_fill_buffer;
00201 
00202     int yy_buffer_status;
00203 #define YY_BUFFER_NEW 0
00204 #define YY_BUFFER_NORMAL 1
00205     /* When an EOF's been seen but there's still some text to process
00206      * then we mark the buffer as YY_EOF_PENDING, to indicate that we
00207      * shouldn't try reading from the input source any more.  We might
00208      * still have a bunch of tokens to match, though, because of
00209      * possible backing-up.
00210      *
00211      * When we actually see the EOF, we change the status to "new"
00212      * (via yyrestart()), so that the user can continue scanning by
00213      * just pointing yyin at a new input file.
00214      */
00215 #define YY_BUFFER_EOF_PENDING 2
00216     };
00217 
00218 static YY_BUFFER_STATE yy_current_buffer = 0;
00219 
00220 /* We provide macros for accessing buffer states in case in the
00221  * future we want to put the buffer states in a more general
00222  * "scanner state".
00223  */
00224 #define YY_CURRENT_BUFFER yy_current_buffer
00225 
00226 
00227 /* yy_hold_char holds the character lost when yytext is formed. */
00228 static char yy_hold_char;
00229 
00230 static int yy_n_chars;      /* number of characters read into yy_ch_buf */
00231 
00232 
00233 int yyleng;
00234 
00235 /* Points to current character in buffer. */
00236 static char *yy_c_buf_p = (char *) 0;
00237 static int yy_init = 1;     /* whether we need to initialize */
00238 static int yy_start = 0;    /* start state number */
00239 
00240 /* Flag which is used to allow yywrap()'s to do buffer switches
00241  * instead of setting up a fresh yyin.  A bit of a hack ...
00242  */
00243 static int yy_did_buffer_switch_on_eof;
00244 
00245 void yyrestart YY_PROTO(( FILE *input_file ));
00246 
00247 void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
00248 void yy_load_buffer_state YY_PROTO(( void ));
00249 YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
00250 void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
00251 void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
00252 void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
00253 #define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
00254 
00255 YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
00256 YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
00257 YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
00258 
00259 static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
00260 static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
00261 static void yy_flex_free YY_PROTO(( void * ));
00262 
00263 #define yy_new_buffer yy_create_buffer
00264 
00265 #define yy_set_interactive(is_interactive) \
00266     { \
00267     if ( ! yy_current_buffer ) \
00268         yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
00269     yy_current_buffer->yy_is_interactive = is_interactive; \
00270     }
00271 
00272 #define yy_set_bol(at_bol) \
00273     { \
00274     if ( ! yy_current_buffer ) \
00275         yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
00276     yy_current_buffer->yy_at_bol = at_bol; \
00277     }
00278 
00279 #define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
00280 
00281 
00282 #define yywrap() 1
00283 #define YY_SKIP_YYWRAP
00284 typedef unsigned char YY_CHAR;
00285 FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
00286 typedef int yy_state_type;
00287 extern char *yytext;
00288 #define yytext_ptr yytext
00289 
00290 static yy_state_type yy_get_previous_state YY_PROTO(( void ));
00291 static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
00292 static int yy_get_next_buffer YY_PROTO(( void ));
00293 static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
00294 
00295 /* Done after the current pattern has been matched and before the
00296  * corresponding action - sets up yytext.
00297  */
00298 #define YY_DO_BEFORE_ACTION \
00299     yytext_ptr = yy_bp; \
00300     yyleng = (int) (yy_cp - yy_bp); \
00301     yy_hold_char = *yy_cp; \
00302     *yy_cp = '\0'; \
00303     yy_c_buf_p = yy_cp;
00304 
00305 #define YY_NUM_RULES 24
00306 #define YY_END_OF_BUFFER 25
00307 static yyconst short int yy_accept[100] =
00308     {   0,
00309         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
00310         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
00311        25,   22,   23,   22,   22,    2,    8,   22,    8,   19,
00312        22,    9,   13,   12,    2,   12,   12,   17,   18,   11,
00313        10,   18,   18,   16,   14,   14,   16,   16,    7,   22,
00314         7,    7,    0,   21,    0,    8,    0,    0,    0,    8,
00315         3,    0,   20,   12,   12,   17,   18,   11,   18,   15,
00316         7,    0,    7,    0,    0,    4,   12,   18,    7,    7,
00317         1,    0,    1,    1,    1,    0,    0,    0,    0,    0,
00318         6,    0,    0,    0,    0,    0,    0,    5,    0
00319 
00320     } ;
00321 
00322 static yyconst int yy_ec[256] =
00323     {   0,
00324         1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
00325         1,    1,    4,    1,    1,    1,    1,    1,    1,    1,
00326         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
00327         1,    2,    1,    5,    6,    1,    1,    1,    1,    1,
00328         1,    1,    7,    1,    1,    1,    1,    8,    9,    9,
00329         9,    9,    9,    9,    9,    9,    9,    1,    1,    1,
00330        10,    1,    1,   11,   12,   13,   14,   15,   16,   13,
00331        13,   17,   18,   13,   13,   19,   13,   20,   13,   21,
00332        13,   13,   13,   22,   23,   13,   13,   13,   13,   13,
00333         1,   24,    1,    1,   25,    1,   13,   13,   13,   26,
00334 
00335        13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
00336        13,   13,   13,   13,   13,   13,   13,   13,   13,   27,
00337        13,   13,    1,    1,    1,    1,    1,    1,    1,    1,
00338         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
00339         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
00340         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
00341         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
00342         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
00343         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
00344         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
00345 
00346         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
00347         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
00348         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
00349         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
00350         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
00351         1,    1,    1,    1,    1
00352     } ;
00353 
00354 static yyconst int yy_meta[29] =
00355     {   0,
00356         1,    2,    3,    4,    3,    5,    6,    7,    7,    6,
00357         1,    8,    8,    8,    8,    8,    8,    8,    8,    8,
00358         8,    8,    8,    1,    7,    8,    8,    1
00359     } ;
00360 
00361 static yyconst short int yy_base[112] =
00362     {   0,
00363         0,    1,   29,    0,   55,   56,   82,  108,  135,  162,
00364       190,    0,  217,  244,   58,   65,   66,   68,  271,  298,
00365       145,  408,  408,    3,  117,  408,    0,  125,    6,  408,
00366         7,  408,  408,    0,    0,   15,  115,    0,    0,  133,
00367       408,   18,  107,  408,  408,  408,   62,  106,    0,    0,
00368        70,  104,   73,  408,  122,    0,  109,   93,  118,   95,
00369       408,  105,  408,    0,  118,    0,    0,  123,  116,  408,
00370         0,  117,  113,   94,  105,  408,   92,   91,  408,   90,
00371       408,   82,    0,    0,    0,   75,   66,   62,  102,   13,
00372       408,   41,   48,    5,    9,   89,  113,  408,  408,  326,
00373 
00374       334,  342,  350,  358,  360,  367,  375,    4,  383,  391,
00375       399
00376     } ;
00377 
00378 static yyconst short int yy_def[112] =
00379     {   0,
00380       100,  100,   99,    3,  100,  100,  100,  100,  101,  101,
00381        99,   11,  102,  102,  103,  103,  100,  100,  104,  104,
00382        99,   99,   99,   99,   99,   99,  105,   99,  106,   99,
00383        99,   99,   99,  107,  107,  107,  107,  108,  109,   99,
00384        99,  109,  109,   99,   99,   99,   99,   99,  110,  111,
00385       110,  110,   99,   99,   99,  105,   99,   99,   99,  106,
00386        99,   99,   99,  107,  107,  108,  109,   99,  109,   99,
00387       110,  111,  110,   99,   99,   99,  107,  109,   99,  110,
00388        99,   99,  107,  109,  110,   99,   99,   99,   99,   99,
00389        99,   99,   99,   99,   99,   99,   99,   99,    0,   99,
00390 
00391        99,   99,   99,   99,   99,   99,   99,   99,   99,   99,
00392        99
00393     } ;
00394 
00395 static yyconst short int yy_nxt[437] =
00396     {   0,
00397        99,   99,   23,   23,   53,   54,   53,   58,   62,   63,
00398        62,   66,   59,   99,   90,   61,   53,   54,   53,   53,
00399        54,   53,   91,   24,   24,   96,   95,   25,   25,   22,
00400        22,   23,   22,   22,   26,   22,   27,   27,   22,   28,
00401        29,   29,   29,   29,   29,   29,   29,   29,   29,   29,
00402        29,   29,   24,   29,   29,   29,   25,   30,   30,   94,
00403        45,   93,   46,   53,   54,   53,   70,   45,   23,   46,
00404        23,   53,   54,   53,   53,   54,   53,   89,   31,   31,
00405        88,   47,   25,   25,   32,   48,   33,   26,   47,   24,
00406        97,   24,   48,   25,   58,   25,   58,   87,   98,   59,
00407 
00408        86,   59,   61,   90,   61,   24,   62,   63,   62,   25,
00409        32,   91,   33,   26,   97,   85,   84,   83,   82,   81,
00410        80,   79,   98,   78,   68,   77,   92,   76,   75,   74,
00411        73,   24,   55,   69,   68,   25,   22,   32,   22,   33,
00412        35,   65,   57,   55,   99,   99,   99,   99,   99,   99,
00413        99,   99,   99,   99,   99,   99,   99,   99,   36,   99,
00414        99,   99,   37,   22,   32,   22,   33,   35,   99,   99,
00415        99,   99,   99,   99,   99,   99,   99,   99,   99,   99,
00416        99,   99,   99,   99,   99,   36,   99,   99,   99,   37,
00417        22,   22,   32,   22,   22,   26,   22,   22,   22,   22,
00418 
00419        22,   38,   38,   38,   38,   38,   38,   38,   38,   38,
00420        38,   38,   38,   24,   22,   38,   38,   25,   40,   41,
00421        22,   33,   26,   99,   99,   99,   99,   99,   99,   99,
00422        99,   99,   99,   99,   99,   99,   99,   99,   99,   99,
00423        42,   99,   99,   99,   43,   40,   41,   22,   33,   26,
00424        99,   99,   99,   99,   99,   99,   99,   99,   99,   99,
00425        99,   99,   99,   99,   99,   99,   99,   42,   99,   99,
00426        99,   43,   22,   23,   22,   50,   99,   99,   99,   99,
00427        99,   99,   99,   99,   99,   99,   99,   99,   99,   99,
00428        99,   99,   99,   99,   51,   99,   99,   99,   52,   22,
00429 
00430        23,   22,   50,   99,   99,   99,   99,   99,   99,   99,
00431        99,   99,   99,   99,   99,   99,   99,   99,   99,   99,
00432        99,   51,   99,   99,   99,   52,   22,   22,   22,   22,
00433        22,   22,   22,   22,   34,   34,   34,   34,   34,   34,
00434        34,   34,   39,   39,   39,   39,   39,   39,   39,   39,
00435        44,   44,   44,   44,   44,   44,   44,   44,   49,   49,
00436        49,   49,   49,   49,   49,   49,   56,   56,   60,   99,
00437        99,   99,   60,   60,   60,   64,   99,   99,   99,   64,
00438        64,   64,   64,   67,   99,   99,   99,   99,   67,   67,
00439        67,   71,   99,   99,   99,   71,   71,   71,   71,   72,
00440 
00441        72,   99,   72,   72,   72,   72,   72,   21,   99,   99,
00442        99,   99,   99,   99,   99,   99,   99,   99,   99,   99,
00443        99,   99,   99,   99,   99,   99,   99,   99,   99,   99,
00444        99,   99,   99,   99,   99,   99
00445     } ;
00446 
00447 static yyconst short int yy_chk[437] =
00448     {   0,
00449         0,    0,    1,    2,   24,   24,   24,   29,   31,   31,
00450        31,  108,   29,    0,   90,   29,   36,   36,   36,   42,
00451        42,   42,   90,    1,    2,   95,   94,    1,    2,    3,
00452         3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
00453         3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
00454         3,    3,    3,    3,    3,    3,    3,    5,    6,   93,
00455        15,   92,   15,   47,   47,   47,   47,   16,   17,   16,
00456        18,   51,   51,   51,   53,   53,   53,   88,    5,    6,
00457        87,   15,    5,    6,    7,   15,    7,    7,   16,   17,
00458        96,   18,   16,   17,   58,   18,   60,   86,   96,   58,
00459 
00460        82,   60,   58,   89,   60,    7,   62,   62,   62,    7,
00461         8,   89,    8,    8,   97,   80,   78,   77,   75,   74,
00462        73,   72,   97,   69,   68,   65,   89,   59,   57,   55,
00463        52,    8,   48,   43,   40,    8,    9,    9,    9,    9,
00464         9,   37,   28,   25,   21,    0,    0,    0,    0,    0,
00465         0,    0,    0,    0,    0,    0,    0,    0,    9,    0,
00466         0,    0,    9,   10,   10,   10,   10,   10,    0,    0,
00467         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
00468         0,    0,    0,    0,    0,   10,    0,    0,    0,   10,
00469        11,   11,   11,   11,   11,   11,   11,   11,   11,   11,
00470 
00471        11,   11,   11,   11,   11,   11,   11,   11,   11,   11,
00472        11,   11,   11,   11,   11,   11,   11,   11,   13,   13,
00473        13,   13,   13,    0,    0,    0,    0,    0,    0,    0,
00474         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
00475        13,    0,    0,    0,   13,   14,   14,   14,   14,   14,
00476         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
00477         0,    0,    0,    0,    0,    0,    0,   14,    0,    0,
00478         0,   14,   19,   19,   19,   19,    0,    0,    0,    0,
00479         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
00480         0,    0,    0,    0,   19,    0,    0,    0,   19,   20,
00481 
00482        20,   20,   20,    0,    0,    0,    0,    0,    0,    0,
00483         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
00484         0,   20,    0,    0,    0,   20,  100,  100,  100,  100,
00485       100,  100,  100,  100,  101,  101,  101,  101,  101,  101,
00486       101,  101,  102,  102,  102,  102,  102,  102,  102,  102,
00487       103,  103,  103,  103,  103,  103,  103,  103,  104,  104,
00488       104,  104,  104,  104,  104,  104,  105,  105,  106,    0,
00489         0,    0,  106,  106,  106,  107,    0,    0,    0,  107,
00490       107,  107,  107,  109,    0,    0,    0,    0,  109,  109,
00491       109,  110,    0,    0,    0,  110,  110,  110,  110,  111,
00492 
00493       111,    0,  111,  111,  111,  111,  111,   99,   99,   99,
00494        99,   99,   99,   99,   99,   99,   99,   99,   99,   99,
00495        99,   99,   99,   99,   99,   99,   99,   99,   99,   99,
00496        99,   99,   99,   99,   99,   99
00497     } ;
00498 
00499 static yy_state_type yy_last_accepting_state;
00500 static char *yy_last_accepting_cpos;
00501 
00502 /* The intent behind this definition is that it'll catch
00503  * any uses of REJECT which flex missed.
00504  */
00505 #define REJECT reject_used_but_not_detected
00506 #define yymore() yymore_used_but_not_detected
00507 #define YY_MORE_ADJ 0
00508 #define YY_RESTORE_YY_MORE_OFFSET
00509 char *yytext;
00510 #line 1 "config.l"
00511 #define INITIAL 0
00512 /******************************************************************************
00513  *
00514  * 
00515  *
00516  * Copyright (C) 1997-2004 by Dimitri van Heesch.
00517  *
00518  * Permission to use, copy, modify, and distribute this software and its
00519  * documentation under the terms of the GNU General Public License is hereby 
00520  * granted. No representations are made about the suitability of this software 
00521  * for any purpose. It is provided "as is" without express or implied warranty.
00522  * See the GNU General Public License for more details.
00523  *
00524  */
00525 #line 16 "config.l"
00526 
00527 /*
00528  *  includes
00529  */
00530 #include <stdio.h>
00531 #include <stdlib.h>
00532 #include <assert.h>
00533 #include <ctype.h>
00534 #include <stdarg.h>
00535 
00536 #include <qfileinfo.h>
00537 #include <qfile.h>
00538 #include <qdir.h>
00539 #include <qtextstream.h>
00540 #include <qregexp.h>
00541 #include <qptrstack.h>
00542   
00543 #include "config.h"
00544 #include "version.h"
00545 
00546 #include "lang_cfg.h"
00547 
00548 #undef Config_getString
00549 #undef Config_getInt
00550 #undef Config_getList
00551 #undef Config_getEnum
00552 #undef Config_getBool
00553 
00554 // use in-class definitions
00555 #define Config_getString(val)  getString(__FILE__,__LINE__,val)
00556 #define Config_getInt(val)     getInt(__FILE__,__LINE__,val)
00557 #define Config_getList(val)    getList(__FILE__,__LINE__,val)
00558 #define Config_getEnum(val)    getEnum(__FILE__,__LINE__,val)
00559 #define Config_getBool(val)    getBool(__FILE__,__LINE__,val)
00560   
00561 void config_err(const char *fmt, ...)
00562 {
00563   va_list args;
00564   va_start(args, fmt);
00565   vfprintf(stderr, fmt, args);
00566   va_end(args); 
00567 }
00568 void config_warn(const char *fmt, ...)
00569 {
00570   va_list args;
00571   va_start(args, fmt);
00572   vfprintf(stderr, fmt, args);
00573   va_end(args);
00574 }
00575 
00576 #define MAX_INCLUDE_DEPTH 10
00577 #define YY_NEVER_INTERACTIVE 1
00578 
00579 /* -----------------------------------------------------------------
00580  */
00581 
00582 QCString ConfigOption::convertToComment(const QCString &s)
00583 {
00584   QCString result;
00585   if (s.isEmpty()) return result;
00586   else
00587   {
00588     result+="# ";
00589     QCString tmp=s.stripWhiteSpace();
00590     char *p=tmp.data();
00591     char c;
00592     while ((c=*p++))
00593     {
00594       if (c=='\n') result+="\n# ";
00595       else result+=c;
00596     }
00597     result+='\n';
00598   }
00599   return result;
00600 }
00601 
00602 void ConfigOption::writeBoolValue(QTextStream &t,bool v)
00603 {
00604   if (v) t << "YES"; else t << "NO";
00605 }
00606 
00607 void ConfigOption::writeIntValue(QTextStream &t,int i)
00608 {
00609   t << i;
00610 }
00611 
00612 void ConfigOption::writeStringValue(QTextStream &t,QCString &s)
00613 {
00614   const char *p=s.data();
00615   char c;
00616   bool needsEscaping=FALSE;
00617   if (p)
00618   {
00619     while ((c=*p++)!=0 && !needsEscaping) 
00620       needsEscaping = (c==' ' || c=='\n' || c=='\t' || c=='"');
00621     if (needsEscaping)
00622     { 
00623       t << "\"";
00624       p=s.data();
00625       while (*p)
00626       {
00627     if (*p=='"') t << "\\"; // escape quotes
00628     t << *p++;
00629       }
00630       t << "\"";
00631     }
00632     else
00633     {
00634       t << s;
00635     }
00636   }
00637 }
00638 
00639 void ConfigOption::writeStringList(QTextStream &t,QStrList &l)
00640 {
00641   const char *p = l.first();
00642   bool first=TRUE;
00643   while (p)
00644   {
00645     QCString s=p;
00646     if (!first) t << "                         ";
00647     first=FALSE;
00648     writeStringValue(t,s);
00649     p = l.next();
00650     if (p) t << " \\" << endl;
00651   }
00652 }
00653 
00654 /* -----------------------------------------------------------------
00655  */
00656 
00657 Config *Config::m_instance = 0;
00658 
00659 void ConfigInt::convertStrToVal() 
00660 {
00661   if (!m_valueString.isEmpty())
00662   {
00663     bool ok;
00664     int val = m_valueString.toInt(&ok);
00665     if (!ok || val<m_minVal || val>m_maxVal)
00666     {
00667       config_warn("Warning: argument `%s' for option %s is not a valid number in the range [%d..%d]!\n"
00668                 "Using the default: %d!\n",m_valueString.data(),m_name.data(),m_minVal,m_maxVal,m_value);
00669     }
00670     m_value=val;
00671   }
00672 }
00673 
00674 void ConfigBool::convertStrToVal()
00675 {
00676   QCString val = m_valueString.stripWhiteSpace().lower();
00677   if (!val.isEmpty())
00678   {
00679     if (val=="yes" || val=="true" || val=="1") 
00680     {
00681       m_value=TRUE;
00682     }
00683     else if (val=="no" || val=="false" || val=="0")
00684     {
00685       m_value=FALSE;
00686     }
00687     else
00688     {
00689       config_warn("Warning: argument `%s' for option %s is not a valid boolean value\n"
00690                 "Using the default: %s!\n",m_valueString.data(),m_name.data(),m_value?"YES":"NO");
00691     }
00692   }
00693 }
00694 
00695 QCString &Config::getString(const char *fileName,int num,const char *name) const
00696 {
00697   ConfigOption *opt = m_dict->find(name);
00698   if (opt==0) 
00699   {
00700     config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
00701     exit(1);
00702   }
00703   else if (opt->kind()!=ConfigOption::O_String)
00704   {
00705     config_err("%s<%d>: Internal error: Requested option %s not of string type!\n",fileName,num,name);
00706     exit(1);
00707   }
00708   return *((ConfigString *)opt)->valueRef();
00709 }
00710 
00711 QStrList &Config::getList(const char *fileName,int num,const char *name) const
00712 {
00713   ConfigOption *opt = m_dict->find(name);
00714   if (opt==0) 
00715   {
00716     config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
00717     exit(1);
00718   }
00719   else if (opt->kind()!=ConfigOption::O_List)
00720   {
00721     config_err("%d<%d>: Internal error: Requested option %s not of list type!\n",fileName,num,name);
00722     exit(1);
00723   }
00724   return *((ConfigList *)opt)->valueRef();
00725 }
00726 
00727 QCString &Config::getEnum(const char *fileName,int num,const char *name) const
00728 {
00729   ConfigOption *opt = m_dict->find(name);
00730   if (opt==0) 
00731   {
00732     config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
00733     exit(1);
00734   }
00735   else if (opt->kind()!=ConfigOption::O_Enum)
00736   {
00737     config_err("%s<%d>: Internal error: Requested option %s not of enum type!\n",fileName,num,name);
00738     exit(1);
00739   }
00740   return *((ConfigEnum *)opt)->valueRef();
00741 }
00742 
00743 int &Config::getInt(const char *fileName,int num,const char *name) const
00744 {
00745   ConfigOption *opt = m_dict->find(name);
00746   if (opt==0) 
00747   {
00748     config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
00749     exit(1);
00750   }
00751   else if (opt->kind()!=ConfigOption::O_Int)
00752   {
00753     config_err("%s<%d>: Internal error: Requested option %s not of integer type!\n",fileName,num,name);
00754     exit(1);
00755   }
00756   return *((ConfigInt *)opt)->valueRef();
00757 }
00758 
00759 bool &Config::getBool(const char *fileName,int num,const char *name) const
00760 {
00761   ConfigOption *opt = m_dict->find(name);
00762   if (opt==0) 
00763   {
00764     config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
00765     exit(1);
00766   }
00767   else if (opt->kind()!=ConfigOption::O_Bool)
00768   {
00769     config_err("%s<%d>: Internal error: Requested option %s not of integer type!\n",fileName,num,name);
00770     exit(1);
00771   }
00772   return *((ConfigBool *)opt)->valueRef();
00773 }
00774 
00775 /* -----------------------------------------------------------------
00776  *
00777  *  static variables
00778  */
00779 
00780 struct ConfigFileState
00781 {
00782   int lineNr;
00783   FILE *filePtr;
00784   YY_BUFFER_STATE oldState;
00785   YY_BUFFER_STATE newState;
00786   QCString fileName;
00787 };  
00788 
00789 static const char       *inputString;
00790 static int           inputPosition;
00791 static int               yyLineNr;
00792 static QCString          yyFileName;
00793 static QCString          tmpString;
00794 static QCString         *s=0;
00795 static bool             *b=0;
00796 static QStrList         *l=0;
00797 static int               lastState;
00798 static QCString          elemStr;
00799 static QCString          includeName;
00800 static QStrList          includePathList;
00801 static QPtrStack<ConfigFileState> includeStack;
00802 static int               includeDepth;
00803 
00804 static QCString     tabSizeString;
00805 static QCString     maxInitLinesString;
00806 static QCString     colsInAlphaIndexString;
00807 static QCString     enumValuesPerLineString;
00808 static QCString     treeViewWidthString;
00809 static QCString     maxDotGraphWidthString;
00810 static QCString     maxDotGraphHeightString;
00811 
00812 static Config      *config;
00813 
00814 /* -----------------------------------------------------------------
00815  */
00816 #undef  YY_INPUT
00817 #define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
00818 
00819 static int yyread(char *buf,int max_size)
00820 {
00821     // no file included
00822     if (includeStack.isEmpty()) 
00823     {
00824         int c=0;
00825     while( c < max_size && inputString[inputPosition] )
00826     {
00827           *buf = inputString[inputPosition++] ;
00828           c++; buf++;
00829     }
00830     return c;
00831     } 
00832     else 
00833     {
00834         //assert(includeStack.current()->newState==YY_CURRENT_BUFFER);
00835     return fread(buf,1,max_size,includeStack.current()->filePtr);
00836     }
00837 }
00838 
00839 
00840 static FILE *tryPath(const char *path,const char *fileName)
00841 {
00842   QCString absName=(QCString)path+"/"+fileName;
00843   QFileInfo fi(absName);
00844   if (fi.exists() && fi.isFile())
00845   {
00846     FILE *f=fopen(absName,"r");
00847     if (!f) config_err("Error: could not open file %s for reading\n",absName.data());
00848     return f;
00849   }
00850   return 0;
00851 }
00852 
00853 static void substEnvVarsInStrList(QStrList &sl);
00854 static void substEnvVarsInString(QCString &s);
00855 
00856 static FILE *findFile(const char *fileName)
00857 {
00858   substEnvVarsInStrList(includePathList);
00859   char *s=includePathList.first();
00860   while (s) // try each of the include paths
00861   {
00862     FILE *f = tryPath(s,fileName);
00863     if (f) return f;
00864     s=includePathList.next();
00865   } 
00866   // try cwd if includePathList fails
00867   return tryPath(".",fileName);
00868 }
00869 
00870 static void readIncludeFile(const char *incName)
00871 {
00872   if (includeDepth==MAX_INCLUDE_DEPTH) {
00873     config_err("Error: maximum include depth (%d) reached, %s is not included. Aborting...\n",
00874     MAX_INCLUDE_DEPTH,incName);
00875     exit(1);
00876   } 
00877 
00878   QCString inc = incName;
00879   substEnvVarsInString(inc);
00880   inc = inc.stripWhiteSpace();
00881   uint incLen = inc.length();
00882   if (inc.at(0)=='"' && inc.at(incLen-1)=='"') // strip quotes
00883   {
00884     inc=inc.mid(1,incLen-2);
00885   }
00886 
00887   FILE *f;
00888 
00889   //printf("Searching for `%s'\n",incFileName.data());
00890   if ((f=findFile(inc))) // see if the include file can be found
00891   {
00892     // For debugging
00893 #if SHOW_INCLUDES
00894     for (i=0;i<includeStack.count();i++) msg("  ");
00895     msg("@INCLUDE = %s: parsing...\n",inc.data());
00896 #endif
00897 
00898     // store the state of the old file 
00899     ConfigFileState *fs=new ConfigFileState;
00900     fs->oldState=YY_CURRENT_BUFFER;
00901     fs->lineNr=yyLineNr;
00902     fs->fileName=yyFileName;
00903     fs->filePtr=f;
00904     // push the state on the stack
00905     includeStack.push(fs);
00906     // set the scanner to the include file
00907     yy_switch_to_buffer(yy_create_buffer(f, YY_BUF_SIZE));
00908     fs->newState=YY_CURRENT_BUFFER;
00909     yyFileName=inc;
00910     includeDepth++;
00911   } 
00912   else
00913   {
00914     config_err("Error: @INCLUDE = %s: not found!\n",inc.data());
00915     exit(1);
00916   }
00917 }
00918 
00919 
00920 #define YY_NO_UNPUT 1
00921 #define Start 1
00922 
00923 #define SkipComment 2
00924 
00925 #define SkipInvalid 3
00926 
00927 #define GetString 4
00928 
00929 #define GetBool 5
00930 
00931 #define GetStrList 6
00932 
00933 #define GetQuotedString 7
00934 
00935 #define GetEnvVar 8
00936 
00937 #define Include 9
00938 
00939 
00940 /* Macros after this point can all be overridden by user definitions in
00941  * section 1.
00942  */
00943 
00944 #ifndef YY_SKIP_YYWRAP
00945 #ifdef __cplusplus
00946 extern "C" int yywrap YY_PROTO(( void ));
00947 #else
00948 extern int yywrap YY_PROTO(( void ));
00949 #endif
00950 #endif
00951 
00952 #ifndef YY_NO_UNPUT
00953 static void yyunput YY_PROTO(( int c, char *buf_ptr ));
00954 #endif
00955 
00956 #ifndef yytext_ptr
00957 static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
00958 #endif
00959 
00960 #ifdef YY_NEED_STRLEN
00961 static int yy_flex_strlen YY_PROTO(( yyconst char * ));
00962 #endif
00963 
00964 #ifndef YY_NO_INPUT
00965 #ifdef __cplusplus
00966 static int yyinput YY_PROTO(( void ));
00967 #else
00968 static int input YY_PROTO(( void ));
00969 #endif
00970 #endif
00971 
00972 #if YY_STACK_USED
00973 static int yy_start_stack_ptr = 0;
00974 static int yy_start_stack_depth = 0;
00975 static int *yy_start_stack = 0;
00976 #ifndef YY_NO_PUSH_STATE
00977 static void yy_push_state YY_PROTO(( int new_state ));
00978 #endif
00979 #ifndef YY_NO_POP_STATE
00980 static void yy_pop_state YY_PROTO(( void ));
00981 #endif
00982 #ifndef YY_NO_TOP_STATE
00983 static int yy_top_state YY_PROTO(( void ));
00984 #endif
00985 
00986 #else
00987 #define YY_NO_PUSH_STATE 1
00988 #define YY_NO_POP_STATE 1
00989 #define YY_NO_TOP_STATE 1
00990 #endif
00991 
00992 #ifdef YY_MALLOC_DECL
00993 YY_MALLOC_DECL
00994 #else
00995 #if __STDC__
00996 #ifndef __cplusplus
00997 #include <stdlib.h>
00998 #endif
00999 #else
01000 /* Just try to get by without declaring the routines.  This will fail
01001  * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
01002  * or sizeof(void*) != sizeof(int).
01003  */
01004 #endif
01005 #endif
01006 
01007 /* Amount of stuff to slurp up with each read. */
01008 #ifndef YY_READ_BUF_SIZE
01009 #define YY_READ_BUF_SIZE 8192
01010 #endif
01011 
01012 /* Copy whatever the last rule matched to the standard output. */
01013 
01014 #ifndef ECHO
01015 /* This used to be an fputs(), but since the string might contain NUL's,
01016  * we now use fwrite().
01017  */
01018 #define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
01019 #endif
01020 
01021 /* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
01022  * is returned in "result".
01023  */
01024 #ifndef YY_INPUT
01025 #define YY_INPUT(buf,result,max_size) \
01026     if ( yy_current_buffer->yy_is_interactive ) \
01027         { \
01028         int c = '*', n; \
01029         for ( n = 0; n < max_size && \
01030                  (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
01031             buf[n] = (char) c; \
01032         if ( c == '\n' ) \
01033             buf[n++] = (char) c; \
01034         if ( c == EOF && ferror( yyin ) ) \
01035             YY_FATAL_ERROR( "input in flex scanner failed" ); \
01036         result = n; \
01037         } \
01038     else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
01039           && ferror( yyin ) ) \
01040         YY_FATAL_ERROR( "input in flex scanner failed" );
01041 #endif
01042 
01043 /* No semi-colon after return; correct usage is to write "yyterminate();" -
01044  * we don't want an extra ';' after the "return" because that will cause
01045  * some compilers to complain about unreachable statements.
01046  */
01047 #ifndef yyterminate
01048 #define yyterminate() return YY_NULL
01049 #endif
01050 
01051 /* Number of entries by which start-condition stack grows. */
01052 #ifndef YY_START_STACK_INCR
01053 #define YY_START_STACK_INCR 25
01054 #endif
01055 
01056 /* Report a fatal error. */
01057 #ifndef YY_FATAL_ERROR
01058 #define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
01059 #endif
01060 
01061 /* Default declaration of generated scanner - a define so the user can
01062  * easily add parameters.
01063  */
01064 #ifndef YY_DECL
01065 #define YY_DECL int yylex YY_PROTO(( void ))
01066 #endif
01067 
01068 /* Code executed at the beginning of each rule, after yytext and yyleng
01069  * have been set up.
01070  */
01071 #ifndef YY_USER_ACTION
01072 #define YY_USER_ACTION
01073 #endif
01074 
01075 /* Code executed at the end of each rule. */
01076 #ifndef YY_BREAK
01077 #define YY_BREAK break;
01078 #endif
01079 
01080 #define YY_RULE_SETUP \
01081     YY_USER_ACTION
01082 
01083 YY_DECL
01084     {
01085     register yy_state_type yy_current_state;
01086     register char *yy_cp, *yy_bp;
01087     register int yy_act;
01088 
01089 #line 424 "config.l"
01090 
01091 
01092 
01093     if ( yy_init )
01094         {
01095         yy_init = 0;
01096 
01097 #ifdef YY_USER_INIT
01098         YY_USER_INIT;
01099 #endif
01100 
01101         if ( ! yy_start )
01102             yy_start = 1;   /* first start state */
01103 
01104         if ( ! yyin )
01105             yyin = stdin;
01106 
01107         if ( ! yyout )
01108             yyout = stdout;
01109 
01110         if ( ! yy_current_buffer )
01111             yy_current_buffer =
01112                 yy_create_buffer( yyin, YY_BUF_SIZE );
01113 
01114         yy_load_buffer_state();
01115         }
01116 
01117     while ( 1 )     /* loops until end-of-file is reached */
01118         {
01119         yy_cp = yy_c_buf_p;
01120 
01121         /* Support of yytext. */
01122         *yy_cp = yy_hold_char;
01123 
01124         /* yy_bp points to the position in yy_ch_buf of the start of
01125          * the current run.
01126          */
01127         yy_bp = yy_cp;
01128 
01129         yy_current_state = yy_start;
01130 yy_match:
01131         do
01132             {
01133             register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
01134             if ( yy_accept[yy_current_state] )
01135                 {
01136                 yy_last_accepting_state = yy_current_state;
01137                 yy_last_accepting_cpos = yy_cp;
01138                 }
01139             while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
01140                 {
01141                 yy_current_state = (int) yy_def[yy_current_state];
01142                 if ( yy_current_state >= 100 )
01143                     yy_c = yy_meta[(unsigned int) yy_c];
01144                 }
01145             yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
01146             ++yy_cp;
01147             }
01148         while ( yy_base[yy_current_state] != 408 );
01149 
01150 yy_find_action:
01151         yy_act = yy_accept[yy_current_state];
01152         if ( yy_act == 0 )
01153             { /* have to back up */
01154             yy_cp = yy_last_accepting_cpos;
01155             yy_current_state = yy_last_accepting_state;
01156             yy_act = yy_accept[yy_current_state];
01157             }
01158 
01159         YY_DO_BEFORE_ACTION;
01160 
01161 
01162 do_action:  /* This label is used only to access EOF actions. */
01163 
01164 
01165         switch ( yy_act )
01166     { /* beginning of action switch */
01167             case 0: /* must back up */
01168             /* undo the effects of YY_DO_BEFORE_ACTION */
01169             *yy_cp = yy_hold_char;
01170             yy_cp = yy_last_accepting_cpos;
01171             yy_current_state = yy_last_accepting_state;
01172             goto yy_find_action;
01173 
01174 case 1:
01175 YY_RULE_SETUP
01176 #line 426 "config.l"
01177 
01178     YY_BREAK
01179 case 2:
01180 YY_RULE_SETUP
01181 #line 427 "config.l"
01182 { BEGIN(SkipComment); }
01183     YY_BREAK
01184 case 3:
01185 YY_RULE_SETUP
01186 #line 428 "config.l"
01187 { QCString cmd=yytext;
01188                                            cmd=cmd.left(cmd.length()-1).stripWhiteSpace(); 
01189                        ConfigOption *option = config->get(cmd);
01190                        if (option==0) // oops not known
01191                        {
01192                          config_err("Warning: ignoring unsupported tag `%s' at line %d, file %s\n",
01193                          yytext,yyLineNr,yyFileName.data()); 
01194                          BEGIN(SkipInvalid);
01195                        }
01196                        else // known tag
01197                        {
01198                          switch(option->kind())
01199                          {
01200                            case ConfigOption::O_Info:
01201                          // shouldn't get here!
01202                              BEGIN(SkipInvalid);
01203                          break;
01204                            case ConfigOption::O_List:
01205                          l = ((ConfigList *)option)->valueRef();
01206                              l->clear();
01207                          elemStr="";
01208                              BEGIN(GetStrList);
01209                              break;
01210                            case ConfigOption::O_Enum:
01211                          s = ((ConfigEnum *)option)->valueRef();
01212                              s->resize(0);
01213                              BEGIN(GetString);
01214                              break;
01215                            case ConfigOption::O_String:
01216                          s = ((ConfigString *)option)->valueRef();
01217                              s->resize(0);
01218                              BEGIN(GetString);
01219                              break;
01220                            case ConfigOption::O_Int:
01221                          s = ((ConfigInt *)option)->valueStringRef();
01222                              s->resize(0);
01223                              BEGIN(GetString);
01224                              break;
01225                            case ConfigOption::O_Bool:
01226                          s = ((ConfigBool *)option)->valueStringRef();
01227                              s->resize(0);
01228                              BEGIN(GetString);
01229                          break;
01230                            case ConfigOption::O_Obsolete:
01231                              config_err("Warning: Tag `%s' at line %d of file %s has become obsolete.\n"
01232                                     "To avoid this warning please update your configuration "
01233                                 "file using \"doxygen -u\"\n", cmd.data(),yyLineNr,yyFileName.data()); 
01234                              BEGIN(SkipInvalid);
01235                          break;
01236                          }
01237                        }
01238                     }
01239     YY_BREAK
01240 case 4:
01241 YY_RULE_SETUP
01242 #line 480 "config.l"
01243 { QCString cmd=yytext;
01244                                           cmd=cmd.left(cmd.length()-2).stripWhiteSpace(); 
01245                       ConfigOption *option = config->get(cmd);
01246                       if (option==0) // oops not known
01247                       {
01248                         config_err("Warning: ignoring unsupported tag `%s' at line %d, file %s\n",
01249                         yytext,yyLineNr,yyFileName.data()); 
01250                         BEGIN(SkipInvalid);
01251                       }
01252                       else // known tag
01253                       {
01254                         switch(option->kind())
01255                         {
01256                           case ConfigOption::O_Info:
01257                             // shouldn't get here!
01258                             BEGIN(SkipInvalid);
01259                         break;
01260                           case ConfigOption::O_List:
01261                             l = ((ConfigList *)option)->valueRef();
01262                         elemStr="";
01263                             BEGIN(GetStrList);
01264                             break;
01265                           case ConfigOption::O_Enum:
01266                           case ConfigOption::O_String:
01267                           case ConfigOption::O_Int:
01268                           case ConfigOption::O_Bool:
01269                             config_err("Warning: operator += not supported for `%s'. Ignoring line at line %d, file %s\n",
01270                             yytext,yyLineNr,yyFileName.data()); 
01271                             BEGIN(SkipInvalid);
01272                         break;
01273                            case ConfigOption::O_Obsolete:
01274                              config_err("Warning: Tag `%s' at line %d of file %s has become obsolete.\n"
01275                                     "To avoid this warning please update your configuration "
01276                                 "file using \"doxygen -u\"\n", cmd.data(),yyLineNr,yyFileName.data()); 
01277                              BEGIN(SkipInvalid);
01278                          break;
01279                          }
01280                        }
01281                     }
01282     YY_BREAK
01283 case 5:
01284 YY_RULE_SETUP
01285 #line 519 "config.l"
01286 { BEGIN(GetStrList); l=&includePathList; l->clear(); elemStr=""; }
01287     YY_BREAK
01288 /* include a config file */
01289 case 6:
01290 YY_RULE_SETUP
01291 #line 521 "config.l"
01292 { BEGIN(Include);}
01293     YY_BREAK
01294 case 7:
01295 YY_RULE_SETUP
01296 #line 522 "config.l"
01297 { 
01298                       readIncludeFile(yytext); 
01299                       BEGIN(Start);
01300                     }
01301     YY_BREAK
01302 case YY_STATE_EOF(INITIAL):
01303 case YY_STATE_EOF(Start):
01304 case YY_STATE_EOF(SkipComment):
01305 case YY_STATE_EOF(SkipInvalid):
01306 case YY_STATE_EOF(GetString):
01307 case YY_STATE_EOF(GetBool):
01308 case YY_STATE_EOF(GetStrList):
01309 case YY_STATE_EOF(GetQuotedString):
01310 case YY_STATE_EOF(GetEnvVar):
01311 case YY_STATE_EOF(Include):
01312 #line 526 "config.l"
01313 {
01314                                           //printf("End of include file\n");
01315                       //printf("Include stack depth=%d\n",g_includeStack.count());
01316                                           if (includeStack.isEmpty())
01317                       {
01318                         //printf("Terminating scanner!\n");
01319                         yyterminate();
01320                       }
01321                       else
01322                       {
01323                         ConfigFileState *fs=includeStack.pop();
01324                         fclose(fs->filePtr);
01325                         YY_BUFFER_STATE oldBuf = YY_CURRENT_BUFFER;
01326                         yy_switch_to_buffer( fs->oldState );
01327                         yy_delete_buffer( oldBuf );
01328                         yyLineNr=fs->lineNr;
01329                         yyFileName=fs->fileName;
01330                         delete fs; fs=0;
01331                                             includeDepth--;
01332                       }
01333                     }
01334     YY_BREAK
01335 case 8:
01336 YY_RULE_SETUP
01337 #line 548 "config.l"
01338 { config_err("Warning: ignoring unknown tag `%s' at line %d, file %s\n",yytext,yyLineNr,yyFileName.data()); }
01339     YY_BREAK
01340 case 9:
01341 YY_RULE_SETUP
01342 #line 549 "config.l"
01343 { yyLineNr++; BEGIN(Start); }
01344     YY_BREAK
01345 case 10:
01346 YY_RULE_SETUP
01347 #line 550 "config.l"
01348 { 
01349                       yyLineNr++; 
01350                       if (!elemStr.isEmpty())
01351                       {
01352                         //printf("elemStr1=`%s'\n",elemStr.data());
01353                         l->append(elemStr);
01354                       }
01355                       BEGIN(Start); 
01356                     }
01357     YY_BREAK
01358 case 11:
01359 YY_RULE_SETUP
01360 #line 559 "config.l"
01361 {
01362                           if (!elemStr.isEmpty())
01363                       {
01364                         //printf("elemStr2=`%s'\n",elemStr.data());
01365                         l->append(elemStr);
01366                       }
01367                       elemStr.resize(0);
01368                     }
01369     YY_BREAK
01370 case 12:
01371 YY_RULE_SETUP
01372 #line 567 "config.l"
01373 { (*s)+=yytext; }
01374     YY_BREAK
01375 case 13:
01376 YY_RULE_SETUP
01377 #line 568 "config.l"
01378 { lastState=YY_START;
01379                       BEGIN(GetQuotedString); 
01380                                           tmpString.resize(0); 
01381                     }
01382     YY_BREAK
01383 case 14:
01384 YY_RULE_SETUP
01385 #line 572 "config.l"
01386 { 
01387                       //printf("Quoted String = `%s'\n",tmpString.data());
01388                       if (lastState==GetString)
01389                         (*s)+=tmpString;
01390                       else
01391                         elemStr+=tmpString;
01392                       if (*yytext=='\n')
01393                       {
01394                         config_err("Warning: Missing end quote (\") on line %d, file %s\n",yyLineNr,yyFileName.data());
01395                         yyLineNr++;
01396                       }
01397                       BEGIN(lastState);
01398                     }
01399     YY_BREAK
01400 case 15:
01401 YY_RULE_SETUP
01402 #line 585 "config.l"
01403 {
01404                       tmpString+='"';
01405                     }
01406     YY_BREAK
01407 case 16:
01408 YY_RULE_SETUP
01409 #line 588 "config.l"
01410 { tmpString+=*yytext; }
01411     YY_BREAK
01412 case 17:
01413 YY_RULE_SETUP
01414 #line 589 "config.l"
01415 { 
01416                       QCString bs=yytext; 
01417                       bs=bs.upper();
01418                       if (bs=="YES" || bs=="1")
01419                         *b=TRUE;
01420                       else if (bs=="NO" || bs=="0")
01421                         *b=FALSE;
01422                       else 
01423                       {
01424                         *b=FALSE; 
01425                         config_warn("Warning: Invalid value `%s' for "
01426                          "boolean tag in line %d, file %s; use YES or NO\n",
01427                          bs.data(),yyLineNr,yyFileName.data());
01428                       }
01429                     }
01430     YY_BREAK
01431 case 18:
01432 YY_RULE_SETUP
01433 #line 604 "config.l"
01434 {
01435                       elemStr+=yytext;
01436                     }
01437     YY_BREAK
01438 case 19:
01439 YY_RULE_SETUP
01440 #line 607 "config.l"
01441 { yyLineNr++; BEGIN(Start); }
01442     YY_BREAK
01443 case 20:
01444 YY_RULE_SETUP
01445 #line 608 "config.l"
01446 { yyLineNr++; BEGIN(Start); }
01447     YY_BREAK
01448 case 21:
01449 YY_RULE_SETUP
01450 #line 609 "config.l"
01451 { yyLineNr++; }
01452     YY_BREAK
01453 case 22:
01454 YY_RULE_SETUP
01455 #line 610 "config.l"
01456 
01457     YY_BREAK
01458 case 23:
01459 YY_RULE_SETUP
01460 #line 611 "config.l"
01461 { yyLineNr++ ; }
01462     YY_BREAK
01463 case 24:
01464 YY_RULE_SETUP
01465 #line 613 "config.l"
01466 ECHO;
01467     YY_BREAK
01468 
01469     case YY_END_OF_BUFFER:
01470         {
01471         /* Amount of text matched not including the EOB char. */
01472         int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
01473 
01474         /* Undo the effects of YY_DO_BEFORE_ACTION. */
01475         *yy_cp = yy_hold_char;
01476         YY_RESTORE_YY_MORE_OFFSET
01477 
01478         if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
01479             {
01480             /* We're scanning a new file or input source.  It's
01481              * possible that this happened because the user
01482              * just pointed yyin at a new source and called
01483              * yylex().  If so, then we have to assure
01484              * consistency between yy_current_buffer and our
01485              * globals.  Here is the right place to do so, because
01486              * this is the first action (other than possibly a
01487              * back-up) that will match for the new input source.
01488              */
01489             yy_n_chars = yy_current_buffer->yy_n_chars;
01490             yy_current_buffer->yy_input_file = yyin;
01491             yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
01492             }
01493 
01494         /* Note that here we test for yy_c_buf_p "<=" to the position
01495          * of the first EOB in the buffer, since yy_c_buf_p will
01496          * already have been incremented past the NUL character
01497          * (since all states make transitions on EOB to the
01498          * end-of-buffer state).  Contrast this with the test
01499          * in input().
01500          */
01501         if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
01502             { /* This was really a NUL. */
01503             yy_state_type yy_next_state;
01504 
01505             yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
01506 
01507             yy_current_state = yy_get_previous_state();
01508 
01509             /* Okay, we're now positioned to make the NUL
01510              * transition.  We couldn't have
01511              * yy_get_previous_state() go ahead and do it
01512              * for us because it doesn't know how to deal
01513              * with the possibility of jamming (and we don't
01514              * want to build jamming into it because then it
01515              * will run more slowly).
01516              */
01517 
01518             yy_next_state = yy_try_NUL_trans( yy_current_state );
01519 
01520             yy_bp = yytext_ptr + YY_MORE_ADJ;
01521 
01522             if ( yy_next_state )
01523                 {
01524                 /* Consume the NUL. */
01525                 yy_cp = ++yy_c_buf_p;
01526                 yy_current_state = yy_next_state;
01527                 goto yy_match;
01528                 }
01529 
01530             else
01531                 {
01532                 yy_cp = yy_c_buf_p;
01533                 goto yy_find_action;
01534                 }
01535             }
01536 
01537         else switch ( yy_get_next_buffer() )
01538             {
01539             case EOB_ACT_END_OF_FILE:
01540                 {
01541                 yy_did_buffer_switch_on_eof = 0;
01542 
01543                 if ( yywrap() )
01544                     {
01545                     /* Note: because we've taken care in
01546                      * yy_get_next_buffer() to have set up
01547                      * yytext, we can now set up
01548                      * yy_c_buf_p so that if some total
01549                      * hoser (like flex itself) wants to
01550                      * call the scanner after we return the
01551                      * YY_NULL, it'll still work - another
01552                      * YY_NULL will get returned.
01553                      */
01554                     yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
01555 
01556                     yy_act = YY_STATE_EOF(YY_START);
01557                     goto do_action;
01558                     }
01559 
01560                 else
01561                     {
01562                     if ( ! yy_did_buffer_switch_on_eof )
01563                         YY_NEW_FILE;
01564                     }
01565                 break;
01566                 }
01567 
01568             case EOB_ACT_CONTINUE_SCAN:
01569                 yy_c_buf_p =
01570                     yytext_ptr + yy_amount_of_matched_text;
01571 
01572                 yy_current_state = yy_get_previous_state();
01573 
01574                 yy_cp = yy_c_buf_p;
01575                 yy_bp = yytext_ptr + YY_MORE_ADJ;
01576                 goto yy_match;
01577 
01578             case EOB_ACT_LAST_MATCH:
01579                 yy_c_buf_p =
01580                 &yy_current_buffer->yy_ch_buf[yy_n_chars];
01581 
01582                 yy_current_state = yy_get_previous_state();
01583 
01584                 yy_cp = yy_c_buf_p;
01585                 yy_bp = yytext_ptr + YY_MORE_ADJ;
01586                 goto yy_find_action;
01587             }
01588         break;
01589         }
01590 
01591     default:
01592         YY_FATAL_ERROR(
01593             "fatal flex scanner internal error--no action found" );
01594     } /* end of action switch */
01595         } /* end of scanning one token */
01596     } /* end of yylex */
01597 
01598 
01599 /* yy_get_next_buffer - try to read in a new buffer
01600  *
01601  * Returns a code representing an action:
01602  *  EOB_ACT_LAST_MATCH -
01603  *  EOB_ACT_CONTINUE_SCAN - continue scanning from current position
01604  *  EOB_ACT_END_OF_FILE - end of file
01605  */
01606 
01607 static int yy_get_next_buffer()
01608     {
01609     register char *dest = yy_current_buffer->yy_ch_buf;
01610     register char *source = yytext_ptr;
01611     register int number_to_move, i;
01612     int ret_val;
01613 
01614     if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
01615         YY_FATAL_ERROR(
01616         "fatal flex scanner internal error--end of buffer missed" );
01617 
01618     if ( yy_current_buffer->yy_fill_buffer == 0 )
01619         { /* Don't try to fill the buffer, so this is an EOF. */
01620         if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
01621             {
01622             /* We matched a single character, the EOB, so
01623              * treat this as a final EOF.
01624              */
01625             return EOB_ACT_END_OF_FILE;
01626             }
01627 
01628         else
01629             {
01630             /* We matched some text prior to the EOB, first
01631              * process it.
01632              */
01633             return EOB_ACT_LAST_MATCH;
01634             }
01635         }
01636 
01637     /* Try to read more data. */
01638 
01639     /* First move last chars to start of buffer. */
01640     number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
01641 
01642     for ( i = 0; i < number_to_move; ++i )
01643         *(dest++) = *(source++);
01644 
01645     if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
01646         /* don't do the read, it's not guaranteed to return an EOF,
01647          * just force an EOF
01648          */
01649         yy_current_buffer->yy_n_chars = yy_n_chars = 0;
01650 
01651     else
01652         {
01653         int num_to_read =
01654             yy_current_buffer->yy_buf_size - number_to_move - 1;
01655 
01656         while ( num_to_read <= 0 )
01657             { /* Not enough room in the buffer - grow it. */
01658 #ifdef YY_USES_REJECT
01659             YY_FATAL_ERROR(
01660 "input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
01661 #else
01662 
01663             /* just a shorter name for the current buffer */
01664             YY_BUFFER_STATE b = yy_current_buffer;
01665 
01666             int yy_c_buf_p_offset =
01667                 (int) (yy_c_buf_p - b->yy_ch_buf);
01668 
01669             if ( b->yy_is_our_buffer )
01670                 {
01671                 int new_size = b->yy_buf_size * 2;
01672 
01673                 if ( new_size <= 0 )
01674                     b->yy_buf_size += b->yy_buf_size / 8;
01675                 else
01676                     b->yy_buf_size *= 2;
01677 
01678                 b->yy_ch_buf = (char *)
01679                     /* Include room in for 2 EOB chars. */
01680                     yy_flex_realloc( (void *) b->yy_ch_buf,
01681                              b->yy_buf_size + 2 );
01682                 }
01683             else
01684                 /* Can't grow it, we don't own it. */
01685                 b->yy_ch_buf = 0;
01686 
01687             if ( ! b->yy_ch_buf )
01688                 YY_FATAL_ERROR(
01689                 "fatal error - scanner input buffer overflow" );
01690 
01691             yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
01692 
01693             num_to_read = yy_current_buffer->yy_buf_size -
01694                         number_to_move - 1;
01695 #endif
01696             }
01697 
01698         if ( num_to_read > YY_READ_BUF_SIZE )
01699             num_to_read = YY_READ_BUF_SIZE;
01700 
01701         /* Read in more data. */
01702         YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
01703             yy_n_chars, num_to_read );
01704 
01705         yy_current_buffer->yy_n_chars = yy_n_chars;
01706         }
01707 
01708     if ( yy_n_chars == 0 )
01709         {
01710         if ( number_to_move == YY_MORE_ADJ )
01711             {
01712             ret_val = EOB_ACT_END_OF_FILE;
01713             yyrestart( yyin );
01714             }
01715 
01716         else
01717             {
01718             ret_val = EOB_ACT_LAST_MATCH;
01719             yy_current_buffer->yy_buffer_status =
01720                 YY_BUFFER_EOF_PENDING;
01721             }
01722         }
01723 
01724     else
01725         ret_val = EOB_ACT_CONTINUE_SCAN;
01726 
01727     yy_n_chars += number_to_move;
01728     yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
01729     yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
01730 
01731     yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
01732 
01733     return ret_val;
01734     }
01735 
01736 
01737 /* yy_get_previous_state - get the state just before the EOB char was reached */
01738 
01739 static yy_state_type yy_get_previous_state()
01740     {
01741     register yy_state_type yy_current_state;
01742     register char *yy_cp;
01743 
01744     yy_current_state = yy_start;
01745 
01746     for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
01747         {
01748         register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 28);
01749         if ( yy_accept[yy_current_state] )
01750             {
01751             yy_last_accepting_state = yy_current_state;
01752             yy_last_accepting_cpos = yy_cp;
01753             }
01754         while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
01755             {
01756             yy_current_state = (int) yy_def[yy_current_state];
01757             if ( yy_current_state >= 100 )
01758                 yy_c = yy_meta[(unsigned int) yy_c];
01759             }
01760         yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
01761         }
01762 
01763     return yy_current_state;
01764     }
01765 
01766 
01767 /* yy_try_NUL_trans - try to make a transition on the NUL character
01768  *
01769  * synopsis
01770  *  next_state = yy_try_NUL_trans( current_state );
01771  */
01772 
01773 #ifdef YY_USE_PROTOS
01774 static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
01775 #else
01776 static yy_state_type yy_try_NUL_trans( yy_current_state )
01777 yy_state_type yy_current_state;
01778 #endif
01779     {
01780     register int yy_is_jam;
01781     register char *yy_cp = yy_c_buf_p;
01782 
01783     register YY_CHAR yy_c = 28;
01784     if ( yy_accept[yy_current_state] )
01785         {
01786         yy_last_accepting_state = yy_current_state;
01787         yy_last_accepting_cpos = yy_cp;
01788         }
01789     while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
01790         {
01791         yy_current_state = (int) yy_def[yy_current_state];
01792         if ( yy_current_state >= 100 )
01793             yy_c = yy_meta[(unsigned int) yy_c];
01794         }
01795     yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
01796     yy_is_jam = (yy_current_state == 99);
01797 
01798     return yy_is_jam ? 0 : yy_current_state;
01799     }
01800 
01801 
01802 #ifndef YY_NO_UNPUT
01803 #ifdef YY_USE_PROTOS
01804 static void yyunput( int c, register char *yy_bp )
01805 #else
01806 static void yyunput( c, yy_bp )
01807 int c;
01808 register char *yy_bp;
01809 #endif
01810     {
01811     register char *yy_cp = yy_c_buf_p;
01812 
01813     /* undo effects of setting up yytext */
01814     *yy_cp = yy_hold_char;
01815 
01816     if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
01817         { /* need to shift things up to make room */
01818         /* +2 for EOB chars. */
01819         register int number_to_move = yy_n_chars + 2;
01820         register char *dest = &yy_current_buffer->yy_ch_buf[
01821                     yy_current_buffer->yy_buf_size + 2];
01822         register char *source =
01823                 &yy_current_buffer->yy_ch_buf[number_to_move];
01824 
01825         while ( source > yy_current_buffer->yy_ch_buf )
01826             *--dest = *--source;
01827 
01828         yy_cp += (int) (dest - source);
01829         yy_bp += (int) (dest - source);
01830         yy_current_buffer->yy_n_chars =
01831             yy_n_chars = yy_current_buffer->yy_buf_size;
01832 
01833         if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
01834             YY_FATAL_ERROR( "flex scanner push-back overflow" );
01835         }
01836 
01837     *--yy_cp = (char) c;
01838 
01839 
01840     yytext_ptr = yy_bp;
01841     yy_hold_char = *yy_cp;
01842     yy_c_buf_p = yy_cp;
01843     }
01844 #endif  /* ifndef YY_NO_UNPUT */
01845 
01846 
01847 #ifdef __cplusplus
01848 static int yyinput()
01849 #else
01850 static int input()
01851 #endif
01852     {
01853     int c;
01854 
01855     *yy_c_buf_p = yy_hold_char;
01856 
01857     if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
01858         {
01859         /* yy_c_buf_p now points to the character we want to return.
01860          * If this occurs *before* the EOB characters, then it's a
01861          * valid NUL; if not, then we've hit the end of the buffer.
01862          */
01863         if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
01864             /* This was really a NUL. */
01865             *yy_c_buf_p = '\0';
01866 
01867         else
01868             { /* need more input */
01869             int offset = yy_c_buf_p - yytext_ptr;
01870             ++yy_c_buf_p;
01871 
01872             switch ( yy_get_next_buffer() )
01873                 {
01874                 case EOB_ACT_LAST_MATCH:
01875                     /* This happens because yy_g_n_b()
01876                      * sees that we've accumulated a
01877                      * token and flags that we need to
01878                      * try matching the token before
01879                      * proceeding.  But for input(),
01880                      * there's no matching to consider.
01881                      * So convert the EOB_ACT_LAST_MATCH
01882                      * to EOB_ACT_END_OF_FILE.
01883                      */
01884 
01885                     /* Reset buffer status. */
01886                     yyrestart( yyin );
01887 
01888                     /* fall through */
01889 
01890                 case EOB_ACT_END_OF_FILE:
01891                     {
01892                     if ( yywrap() )
01893                         return EOF;
01894 
01895                     if ( ! yy_did_buffer_switch_on_eof )
01896                         YY_NEW_FILE;
01897 #ifdef __cplusplus
01898                     return yyinput();
01899 #else
01900                     return input();
01901 #endif
01902                     }
01903 
01904                 case EOB_ACT_CONTINUE_SCAN:
01905                     yy_c_buf_p = yytext_ptr + offset;
01906                     break;
01907                 }
01908             }
01909         }
01910 
01911     c = *(unsigned char *) yy_c_buf_p;  /* cast for 8-bit char's */
01912     *yy_c_buf_p = '\0'; /* preserve yytext */
01913     yy_hold_char = *++yy_c_buf_p;
01914 
01915 
01916     return c;
01917     }
01918 
01919 
01920 #ifdef YY_USE_PROTOS
01921 void yyrestart( FILE *input_file )
01922 #else
01923 void yyrestart( input_file )
01924 FILE *input_file;
01925 #endif
01926     {
01927     if ( ! yy_current_buffer )
01928         yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
01929 
01930     yy_init_buffer( yy_current_buffer, input_file );
01931     yy_load_buffer_state();
01932     }
01933 
01934 
01935 #ifdef YY_USE_PROTOS
01936 void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
01937 #else
01938 void yy_switch_to_buffer( new_buffer )
01939 YY_BUFFER_STATE new_buffer;
01940 #endif
01941     {
01942     if ( yy_current_buffer == new_buffer )
01943         return;
01944 
01945     if ( yy_current_buffer )
01946         {
01947         /* Flush out information for old buffer. */
01948         *yy_c_buf_p = yy_hold_char;
01949         yy_current_buffer->yy_buf_pos = yy_c_buf_p;
01950         yy_current_buffer->yy_n_chars = yy_n_chars;
01951         }
01952 
01953     yy_current_buffer = new_buffer;
01954     yy_load_buffer_state();
01955 
01956     /* We don't actually know whether we did this switch during
01957      * EOF (yywrap()) processing, but the only time this flag
01958      * is looked at is after yywrap() is called, so it's safe
01959      * to go ahead and always set it.
01960      */
01961     yy_did_buffer_switch_on_eof = 1;
01962     }
01963 
01964 
01965 #ifdef YY_USE_PROTOS
01966 void yy_load_buffer_state( void )
01967 #else
01968 void yy_load_buffer_state()
01969 #endif
01970     {
01971     yy_n_chars = yy_current_buffer->yy_n_chars;
01972     yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
01973     yyin = yy_current_buffer->yy_input_file;
01974     yy_hold_char = *yy_c_buf_p;
01975     }
01976 
01977 
01978 #ifdef YY_USE_PROTOS
01979 YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
01980 #else
01981 YY_BUFFER_STATE yy_create_buffer( file, size )
01982 FILE *file;
01983 int size;
01984 #endif
01985     {
01986     YY_BUFFER_STATE b;
01987 
01988     b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
01989     if ( ! b )
01990         YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
01991 
01992     b->yy_buf_size = size;
01993 
01994     /* yy_ch_buf has to be 2 characters longer than the size given because
01995      * we need to put in 2 end-of-buffer characters.
01996      */
01997     b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
01998     if ( ! b->yy_ch_buf )
01999         YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
02000 
02001     b->yy_is_our_buffer = 1;
02002 
02003     yy_init_buffer( b, file );
02004 
02005     return b;
02006     }
02007 
02008 
02009 #ifdef YY_USE_PROTOS
02010 void yy_delete_buffer( YY_BUFFER_STATE b )
02011 #else
02012 void yy_delete_buffer( b )
02013 YY_BUFFER_STATE b;
02014 #endif
02015     {
02016     if ( ! b )
02017         return;
02018 
02019     if ( b == yy_current_buffer )
02020         yy_current_buffer = (YY_BUFFER_STATE) 0;
02021 
02022     if ( b->yy_is_our_buffer )
02023         yy_flex_free( (void *) b->yy_ch_buf );
02024 
02025     yy_flex_free( (void *) b );
02026     }
02027 
02028 
02029 #ifndef YY_ALWAYS_INTERACTIVE
02030 #ifndef YY_NEVER_INTERACTIVE
02031 extern int isatty YY_PROTO(( int ));
02032 #endif
02033 #endif
02034 
02035 #ifdef YY_USE_PROTOS
02036 void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
02037 #else
02038 void yy_init_buffer( b, file )
02039 YY_BUFFER_STATE b;
02040 FILE *file;
02041 #endif
02042 
02043 
02044     {
02045     yy_flush_buffer( b );
02046 
02047     b->yy_input_file = file;
02048     b->yy_fill_buffer = 1;
02049 
02050 #if YY_ALWAYS_INTERACTIVE
02051     b->yy_is_interactive = 1;
02052 #else
02053 #if YY_NEVER_INTERACTIVE
02054     b->yy_is_interactive = 0;
02055 #else
02056     b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
02057 #endif
02058 #endif
02059     }
02060 
02061 
02062 #ifdef YY_USE_PROTOS
02063 void yy_flush_buffer( YY_BUFFER_STATE b )
02064 #else
02065 void yy_flush_buffer( b )
02066 YY_BUFFER_STATE b;
02067 #endif
02068 
02069     {
02070     if ( ! b )
02071         return;
02072 
02073     b->yy_n_chars = 0;
02074 
02075     /* We always need two end-of-buffer characters.  The first causes
02076      * a transition to the end-of-buffer state.  The second causes
02077      * a jam in that state.
02078      */
02079     b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
02080     b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
02081 
02082     b->yy_buf_pos = &b->yy_ch_buf[0];
02083 
02084     b->yy_at_bol = 1;
02085     b->yy_buffer_status = YY_BUFFER_NEW;
02086 
02087     if ( b == yy_current_buffer )
02088         yy_load_buffer_state();
02089     }
02090 
02091 
02092 #ifndef YY_NO_SCAN_BUFFER
02093 #ifdef YY_USE_PROTOS
02094 YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
02095 #else
02096 YY_BUFFER_STATE yy_scan_buffer( base, size )
02097 char *base;
02098 yy_size_t size;
02099 #endif
02100     {
02101     YY_BUFFER_STATE b;
02102 
02103     if ( size < 2 ||
02104          base[size-2] != YY_END_OF_BUFFER_CHAR ||
02105          base[size-1] != YY_END_OF_BUFFER_CHAR )
02106         /* They forgot to leave room for the EOB's. */
02107         return 0;
02108 
02109     b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
02110     if ( ! b )
02111         YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
02112 
02113     b->yy_buf_size = size - 2;  /* "- 2" to take care of EOB's */
02114     b->yy_buf_pos = b->yy_ch_buf = base;
02115     b->yy_is_our_buffer = 0;
02116     b->yy_input_file = 0;
02117     b->yy_n_chars = b->yy_buf_size;
02118     b->yy_is_interactive = 0;
02119     b->yy_at_bol = 1;
02120     b->yy_fill_buffer = 0;
02121     b->yy_buffer_status = YY_BUFFER_NEW;
02122 
02123     yy_switch_to_buffer( b );
02124 
02125     return b;
02126     }
02127 #endif
02128 
02129 
02130 #ifndef YY_NO_SCAN_STRING
02131 #ifdef YY_USE_PROTOS
02132 YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
02133 #else
02134 YY_BUFFER_STATE yy_scan_string( yy_str )
02135 yyconst char *yy_str;
02136 #endif
02137     {
02138     int len;
02139     for ( len = 0; yy_str[len]; ++len )
02140         ;
02141 
02142     return yy_scan_bytes( yy_str, len );
02143     }
02144 #endif
02145 
02146 
02147 #ifndef YY_NO_SCAN_BYTES
02148 #ifdef YY_USE_PROTOS
02149 YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
02150 #else
02151 YY_BUFFER_STATE yy_scan_bytes( bytes, len )
02152 yyconst char *bytes;
02153 int len;
02154 #endif
02155     {
02156     YY_BUFFER_STATE b;
02157     char *buf;
02158     yy_size_t n;
02159     int i;
02160 
02161     /* Get memory for full buffer, including space for trailing EOB's. */
02162     n = len + 2;
02163     buf = (char *) yy_flex_alloc( n );
02164     if ( ! buf )
02165         YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
02166 
02167     for ( i = 0; i < len; ++i )
02168         buf[i] = bytes[i];
02169 
02170     buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
02171 
02172     b = yy_scan_buffer( buf, n );
02173     if ( ! b )
02174         YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
02175 
02176     /* It's okay to grow etc. this buffer, and we should throw it
02177      * away when we're done.
02178      */
02179     b->yy_is_our_buffer = 1;
02180 
02181     return b;
02182     }
02183 #endif
02184 
02185 
02186 #ifndef YY_NO_PUSH_STATE
02187 #ifdef YY_USE_PROTOS
02188 static void yy_push_state( int new_state )
02189 #else
02190 static void yy_push_state( new_state )
02191 int new_state;
02192 #endif
02193     {
02194     if ( yy_start_stack_ptr >= yy_start_stack_depth )
02195         {
02196         yy_size_t new_size;
02197 
02198         yy_start_stack_depth += YY_START_STACK_INCR;
02199         new_size = yy_start_stack_depth * sizeof( int );
02200 
02201         if ( ! yy_start_stack )
02202             yy_start_stack = (int *) yy_flex_alloc( new_size );
02203 
02204         else
02205             yy_start_stack = (int *) yy_flex_realloc(
02206                     (void *) yy_start_stack, new_size );
02207 
02208         if ( ! yy_start_stack )
02209             YY_FATAL_ERROR(
02210             "out of memory expanding start-condition stack" );
02211         }
02212 
02213     yy_start_stack[yy_start_stack_ptr++] = YY_START;
02214 
02215     BEGIN(new_state);
02216     }
02217 #endif
02218 
02219 
02220 #ifndef YY_NO_POP_STATE
02221 static void yy_pop_state()
02222     {
02223     if ( --yy_start_stack_ptr < 0 )
02224         YY_FATAL_ERROR( "start-condition stack underflow" );
02225 
02226     BEGIN(yy_start_stack[yy_start_stack_ptr]);
02227     }
02228 #endif
02229 
02230 
02231 #ifndef YY_NO_TOP_STATE
02232 static int yy_top_state()
02233     {
02234     return yy_start_stack[yy_start_stack_ptr - 1];
02235     }
02236 #endif
02237 
02238 #ifndef YY_EXIT_FAILURE
02239 #define YY_EXIT_FAILURE 2
02240 #endif
02241 
02242 #ifdef YY_USE_PROTOS
02243 static void yy_fatal_error( yyconst char msg[] )
02244 #else
02245 static void yy_fatal_error( msg )
02246 char msg[];
02247 #endif
02248     {
02249     (void) fprintf( stderr, "%s\n", msg );
02250     exit( YY_EXIT_FAILURE );
02251     }
02252 
02253 
02254 
02255 /* Redefine yyless() so it works in section 3 code. */
02256 
02257 #undef yyless
02258 #define yyless(n) \
02259     do \
02260         { \
02261         /* Undo effects of setting up yytext. */ \
02262         yytext[yyleng] = yy_hold_char; \
02263         yy_c_buf_p = yytext + n; \
02264         yy_hold_char = *yy_c_buf_p; \
02265         *yy_c_buf_p = '\0'; \
02266         yyleng = n; \
02267         } \
02268     while ( 0 )
02269 
02270 
02271 /* Internal utility routines. */
02272 
02273 #ifndef yytext_ptr
02274 #ifdef YY_USE_PROTOS
02275 static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
02276 #else
02277 static void yy_flex_strncpy( s1, s2, n )
02278 char *s1;
02279 yyconst char *s2;
02280 int n;
02281 #endif
02282     {
02283     register int i;
02284     for ( i = 0; i < n; ++i )
02285         s1[i] = s2[i];
02286     }
02287 #endif
02288 
02289 #ifdef YY_NEED_STRLEN
02290 #ifdef YY_USE_PROTOS
02291 static int yy_flex_strlen( yyconst char *s )
02292 #else
02293 static int yy_flex_strlen( s )
02294 yyconst char *s;
02295 #endif
02296     {
02297     register int n;
02298     for ( n = 0; s[n]; ++n )
02299         ;
02300 
02301     return n;
02302     }
02303 #endif
02304 
02305 
02306 #ifdef YY_USE_PROTOS
02307 static void *yy_flex_alloc( yy_size_t size )
02308 #else
02309 static void *yy_flex_alloc( size )
02310 yy_size_t size;
02311 #endif
02312     {
02313     return (void *) malloc( size );
02314     }
02315 
02316 #ifdef YY_USE_PROTOS
02317 static void *yy_flex_realloc( void *ptr, yy_size_t size )
02318 #else
02319 static void *yy_flex_realloc( ptr, size )
02320 void *ptr;
02321 yy_size_t size;
02322 #endif
02323     {
02324     /* The cast to (char *) in the following accommodates both
02325      * implementations that use char* generic pointers, and those
02326      * that use void* generic pointers.  It works with the latter
02327      * because both ANSI C and C++ allow castless assignment from
02328      * any pointer type to void*, and deal with argument conversions
02329      * as though doing an assignment.
02330      */
02331     return (void *) realloc( (char *) ptr, size );
02332     }
02333 
02334 #ifdef YY_USE_PROTOS
02335 static void yy_flex_free( void *ptr )
02336 #else
02337 static void yy_flex_free( ptr )
02338 void *ptr;
02339 #endif
02340     {
02341     free( ptr );
02342     }
02343 
02344 #if YY_MAIN
02345 int main()
02346     {
02347     yylex();
02348     return 0;
02349     }
02350 #endif
02351 #line 613 "config.l"
02352 
02353 
02354 /*@ ----------------------------------------------------------------------------
02355  */
02356 
02357 #if 0
02358 static void writeBoolValue(QTextStream &t,bool v)
02359 {
02360   if (v) t << "YES"; else t << "NO";
02361 }
02362 
02363 static void writeIntValue(QTextStream &t,int i)
02364 {
02365   t << i;
02366 }
02367 
02368 static void writeStringValue(QTextStream &t,QCString &s)
02369 {
02370   const char *p=s.data();
02371   char c;
02372   bool hasBlanks=FALSE;
02373   if (p)
02374   {
02375     while ((c=*p++)!=0 && !hasBlanks) hasBlanks = (c==' ' || c=='\n' || c=='\t');
02376     if (hasBlanks) 
02377       t << "\"" << s << "\"";
02378     else
02379       t << s;
02380   }
02381 }
02382 
02383 static void writeStringList(QTextStream &t,QStrList &l)
02384 {
02385   const char *p = l.first();
02386   bool first=TRUE;
02387   while (p)
02388   {
02389     char c;
02390     const char *s=p;
02391     bool hasBlanks=FALSE;
02392     while ((c=*p++)!=0 && !hasBlanks) hasBlanks = (c==' ' || c=='\n' || c=='\t');
02393     if (!first) t << "                         ";
02394     first=FALSE;
02395     if (hasBlanks) t << "\"" << s << "\""; else t << s;
02396     p = l.next();
02397     if (p) t << " \\" << endl;
02398   }
02399 }
02400 #endif
02401 
02402 void Config::writeTemplate(QFile *f,bool sl,bool upd)
02403 {
02404   QTextStream t(f);
02405   t << "# Doxyfile " << versionString << endl << endl;
02406   if (!sl)
02407   {
02408     t << "# This file describes the settings to be used by the documentation system\n";
02409     t << "# doxygen (www.doxygen.org) for a project\n";
02410     t << "#\n";
02411     t << "# All text after a hash (#) is considered a comment and will be ignored\n";
02412     t << "# The format is:\n";
02413     t << "#       TAG = value [value, ...]\n";
02414     t << "# For lists items can also be appended using:\n";
02415     t << "#       TAG += value [value, ...]\n";
02416     t << "# Values that contain spaces should be placed between quotes (\" \")\n";
02417   }
02418   ConfigOption *option = m_options->first();
02419   while (option)
02420   {
02421     option->writeTemplate(t,sl,upd);
02422     option = m_options->next();
02423   }
02424 }
02425 
02426 void Config::convertStrToVal()
02427 {
02428   ConfigOption *option = m_options->first();
02429   while (option)
02430   {
02431     option->convertStrToVal();
02432     option = m_options->next();
02433   }
02434 }
02435 
02436 static void substEnvVarsInString(QCString &s)
02437 {
02438   static QRegExp re("\\$\\([a-z_A-Z0-9]+\\)");
02439   if (s.isEmpty()) return;
02440   int p=0;
02441   int i,l;
02442   //printf("substEnvVarInString(%s) start\n",s.data());
02443   while ((i=re.search(s,p))!=-1)
02444   {
02445     l = re.matchedLength();
02446     //printf("Found environment var s.mid(%d,%d)=`%s'\n",i+2,l-3,s.mid(i+2,l-3).data());
02447     QCString env=getenv(s.mid(i+2,l-3));
02448     substEnvVarsInString(env); // recursively expand variables if needed.
02449     s = s.left(i)+env+s.right(s.length()-i-l);
02450     p=i+env.length(); // next time start at the end of the expanded string
02451   }
02452   //printf("substEnvVarInString(%s) end\n",s.data());
02453 }
02454 
02455 static void substEnvVarsInStrList(QStrList &sl)
02456 {
02457   char *s = sl.first();
02458   while (s)
02459   {
02460     QCString result(s);
02461     bool wasQuoted = (result.find(' ')!=-1) || (result.find('\t')!=-1);
02462     substEnvVarsInString(result);
02463 
02464     if (!wasQuoted) /* as a result of the expansion, a single string
02465                may have expanded into a list, which we'll
02466                add to sl. If the orginal string already 
02467                contained multiple elements no further 
02468                splitting is done to allow quoted items with spaces! */
02469     {
02470       int l=result.length();
02471       int i,p=0;
02472       // skip spaces
02473       // search for a "word"
02474       for (i=0;i<l;i++)
02475       {
02476     char c=0;
02477     // skip until start of new word
02478     while (i<l && ((c=result.at(i))==' ' || c=='\t')) i++; 
02479     p=i; // p marks the start index of the word
02480     // skip until end of a word
02481     while (i<l && ((c=result.at(i))!=' ' && c!='\t' && c!='"')) i++;
02482     if (i<l) // not at the end of the string
02483     {
02484       if (c=='"') // word within quotes
02485       {
02486         p=i+1;
02487         for (i++;i<l;i++)
02488         {
02489           c=result.at(i);
02490           if (c=='"') // end quote
02491           {
02492         // replace the string in the list and go to the next item.
02493         sl.insert(sl.at(),result.mid(p,i-p)); // insert new item before current item.
02494         sl.next();                 // current item is now the old item
02495         p=i+1;
02496         break; 
02497           }
02498           else if (c=='\\') // skip escaped stuff
02499           {
02500         i++;
02501           }
02502         }
02503       }
02504       else if (c==' ' || c=='\t') // separator
02505       {
02506         // replace the string in the list and go to the next item.
02507         sl.insert(sl.at(),result.mid(p,i-p)); // insert new item before current item.
02508         sl.next();                 // current item is now the old item
02509         p=i+1;
02510       }
02511     }
02512       }
02513       if (p!=l) // add the leftover as a string
02514       {
02515     // replace the string in the list and go to the next item.
02516     sl.insert(sl.at(),result.right(l-p)); // insert new item before current item.
02517     sl.next();                 // current item is now the old item
02518       }
02519     }
02520     else // just goto the next element in the list
02521     {
02522       sl.insert(sl.at(),result);
02523       sl.next();
02524     }
02525     // remove the old unexpanded string from the list
02526     int i=sl.at();
02527     sl.remove(); // current item index changes if the last element is removed.
02528     if (sl.at()==i)     // not last item
02529     s = sl.current();
02530     else                // just removed last item
02531     s = 0;
02532   }
02533 }
02534 
02535 void ConfigString::substEnvVars()
02536 {
02537   substEnvVarsInString(m_value);
02538 }
02539 
02540 void ConfigList::substEnvVars()
02541 {
02542   substEnvVarsInStrList(m_value);
02543 }
02544 
02545 void ConfigBool::substEnvVars()
02546 {
02547   substEnvVarsInString(m_valueString);
02548 }
02549 
02550 void ConfigInt::substEnvVars()
02551 {
02552   substEnvVarsInString(m_valueString);
02553 }
02554 
02555 void ConfigEnum::substEnvVars()
02556 {
02557   substEnvVarsInString(m_value);
02558 }
02559 
02560 void Config::substituteEnvironmentVars()
02561 {
02562   ConfigOption *option = m_options->first();
02563   while (option)
02564   {
02565     option->substEnvVars();
02566     option = m_options->next();
02567   }
02568 }
02569 
02570 static void cleanUpPaths(QStrList &str)
02571 {
02572   char *sfp = str.first();
02573   while (sfp)
02574   {
02575     register char *p = sfp;
02576     if (p)
02577     {
02578       char c;
02579       while ((c=*p))
02580       {
02581     if (c=='\\') *p='/';
02582     p++;
02583       }
02584     }
02585     QCString path = sfp;
02586     if ((path.at(0)!='/' && (path.length()<=2 || path.at(1)!=':')) ||
02587     path.at(path.length()-1)!='/'
02588        )
02589     {
02590       QFileInfo fi(path);
02591       if (fi.exists() && fi.isDir())
02592       {
02593     int i = str.at();
02594     str.remove();
02595     if (str.at()==i) // did not remove last item
02596       str.insert(i,QFile::encodeName(fi.absFilePath()+"/"));
02597     else
02598       str.append(QFile::encodeName(fi.absFilePath()+"/"));
02599       }
02600     }
02601     sfp = str.next();
02602   }
02603 }
02604 
02605 void Config::check()
02606 {
02607   //if (!projectName.isEmpty())
02608   //{
02609   //  projectName[0]=toupper(projectName[0]);
02610   //}
02611 
02612   QCString &warnFormat = Config_getString("WARN_FORMAT");
02613   if (warnFormat.isEmpty())
02614   {
02615     warnFormat="$file:$line $text";
02616   }
02617   else
02618   {
02619     if (warnFormat.find("$file")==-1)
02620     {
02621       config_err("Error: warning format does not contain a $file tag!\n");
02622       exit(1);
02623     }
02624     if (warnFormat.find("$line")==-1)
02625     {
02626       config_err("Error: warning format does not contain a $line tag!\n");
02627       exit(1);
02628     }
02629     if (warnFormat.find("$text")==-1)
02630     {
02631       config_err("Error: wanring format foes not contain a $text tag!\n");
02632       exit(1);
02633     }
02634   }
02635 
02636   QCString &manExtension = Config_getString("MAN_EXTENSION");
02637   
02638   // set default man page extension if non is given by the user
02639   if (manExtension.isEmpty())
02640   {
02641     manExtension=".3";
02642   }
02643   
02644   QCString &paperType = Config_getEnum("PAPER_TYPE");
02645   paperType=paperType.lower().stripWhiteSpace(); 
02646   if (paperType.isEmpty())
02647   {
02648     paperType = "a4wide";
02649   }
02650   if (paperType!="a4" && paperType!="a4wide" && paperType!="letter" && 
02651       paperType!="legal" && paperType!="executive")
02652   {
02653     config_err("Error: Unknown page type specified");
02654   }
02655   
02656   QCString &outputLanguage=Config_getEnum("OUTPUT_LANGUAGE");
02657   outputLanguage=outputLanguage.stripWhiteSpace();
02658   if (outputLanguage.isEmpty())
02659   {
02660     outputLanguage = "English";
02661   }
02662 
02663   QCString &htmlFileExtension=Config_getString("HTML_FILE_EXTENSION");
02664   htmlFileExtension=htmlFileExtension.stripWhiteSpace();
02665   if (htmlFileExtension.isEmpty())
02666   {
02667     htmlFileExtension = ".html";
02668   }
02669   
02670   // expand the relative stripFromPath values
02671   QStrList &stripFromPath = Config_getList("STRIP_FROM_PATH");
02672   char *sfp = stripFromPath.first();
02673   if (sfp==0) // by default use the current path
02674   {
02675     stripFromPath.append(QFile::encodeName(QDir::currentDirPath()+"/"));
02676   }
02677   else
02678   {
02679     cleanUpPaths(stripFromPath);
02680   }
02681 
02682   // expand the relative stripFromPath values
02683   QStrList &stripFromIncPath = Config_getList("STRIP_FROM_INC_PATH");
02684   cleanUpPaths(stripFromIncPath);
02685   
02686   // Test to see if HTML header is valid
02687   QCString &headerFile = Config_getString("HTML_HEADER");
02688   if (!headerFile.isEmpty())
02689   {
02690     QFileInfo fi(headerFile);
02691     if (!fi.exists())
02692     {
02693       config_err("Error: tag HTML_HEADER: header file `%s' "
02694       "does not exist\n",headerFile.data());
02695       exit(1);
02696     }
02697   }
02698   // Test to see if HTML footer is valid
02699   QCString &footerFile = Config_getString("HTML_FOOTER");
02700   if (!footerFile.isEmpty())
02701   {
02702     QFileInfo fi(footerFile);
02703     if (!fi.exists())
02704     {
02705       config_err("Error: tag HTML_FOOTER: footer file `%s' "
02706       "does not exist\n",footerFile.data());
02707       exit(1);
02708     }
02709   }
02710   // Test to see if LaTeX header is valid
02711   QCString &latexHeaderFile = Config_getString("LATEX_HEADER");
02712   if (!latexHeaderFile.isEmpty())
02713   {
02714     QFileInfo fi(latexHeaderFile);
02715     if (!fi.exists())
02716     {
02717       config_err("Error: tag LATEX_HEADER: header file `%s' "
02718       "does not exist\n",latexHeaderFile.data());
02719       exit(1);
02720     }
02721   }
02722   // check include path
02723   QStrList &includePath = Config_getList("INCLUDE_PATH");
02724   char *s=includePath.first();
02725   while (s)
02726   {
02727     QFileInfo fi(s);
02728     if (!fi.exists()) config_err("Warning: tag INCLUDE_PATH: include path `%s' "
02729                       "does not exist\n",s);
02730     s=includePath.next();
02731   }
02732 
02733   // check aliases
02734   QStrList &aliasList = Config_getList("ALIASES");
02735   s=aliasList.first();
02736   while (s)
02737   {
02738     QRegExp re("[a-z_A-Z][a-z_A-Z0-9]*[ \t]*=");
02739     QCString alias=s;
02740     alias=alias.stripWhiteSpace();
02741     if (alias.find(re)!=0)
02742     {
02743       config_err("Illegal alias format `%s'. Use \"name=value\"\n",alias.data());
02744     }
02745     s=aliasList.next();
02746   }
02747 
02748   // check dot image format
02749   QCString &dotImageFormat=Config_getEnum("DOT_IMAGE_FORMAT");
02750   dotImageFormat=dotImageFormat.stripWhiteSpace();
02751   if (dotImageFormat.isEmpty())
02752   {
02753     dotImageFormat = "png";
02754   }
02755   else if (dotImageFormat!="gif" && dotImageFormat!="png" && dotImageFormat!="jpg")
02756   {
02757     config_err("Invalid value for DOT_IMAGE_FORMAT: `%s'. Using the default.\n",dotImageFormat.data());
02758     dotImageFormat = "png";
02759   }
02760   
02761   
02762   // check dot path
02763   QCString &dotPath = Config_getString("DOT_PATH");
02764   if (!dotPath.isEmpty())
02765   {
02766     if (dotPath.find('\\')!=-1)
02767     {
02768       if (dotPath.at(dotPath.length()-1)!='\\')
02769       {
02770     dotPath+='\\';
02771       } 
02772     } 
02773     else if (dotPath.find('/')!=-1)
02774     {
02775       if (dotPath.at(dotPath.length()-1)!='/')
02776       {
02777     dotPath+='/';
02778       } 
02779     } 
02780 #if defined(_WIN32)
02781     QFileInfo dp(dotPath+"dot.exe");
02782 #else
02783     QFileInfo dp(dotPath+"dot");
02784 #endif
02785     if (!dp.exists() || !dp.isFile())
02786     {
02787       config_err("Warning: the dot tool could not be found at %s\n",dotPath.data());
02788       dotPath="";
02789     }
02790     else
02791     {
02792       dotPath=QFile::encodeName( dp.dirPath(TRUE)+"/" );
02793 #if defined(_WIN32) // convert slashes
02794       uint i=0,l=dotPath.length();
02795       for (i=0;i<l;i++) if (dotPath.at(i)=='/') dotPath.at(i)='\\';
02796 #endif
02797     }
02798   }
02799   else // make sure the string is empty but not null!
02800   {
02801     dotPath="";
02802   }
02803   
02804   // check input
02805   QStrList &inputSources=Config_getList("INPUT");
02806   if (inputSources.count()==0)
02807   {
02808     // use current dir as the default
02809     inputSources.append(QFile::encodeName( QDir::currentDirPath() ));
02810   }
02811   else
02812   {
02813     s=inputSources.first();
02814     while (s)
02815     {
02816       QFileInfo fi(s);
02817       if (!fi.exists())
02818       {
02819     config_err("Error: tag INPUT: input source `%s' does not exist\n",s);
02820     exit(1);
02821       }
02822       s=inputSources.next();
02823     }
02824   }
02825 
02826   // add default pattern if needed
02827   QStrList &filePatternList = Config_getList("FILE_PATTERNS");
02828   if (filePatternList.isEmpty())
02829   {
02830     filePatternList.append("*.c");
02831     filePatternList.append("*.cc"); 
02832     filePatternList.append("*.cxx");
02833     filePatternList.append("*.cpp");
02834     filePatternList.append("*.c++");
02835     filePatternList.append("*.java");
02836     filePatternList.append("*.ii");
02837     filePatternList.append("*.ixx");
02838     filePatternList.append("*.ipp");
02839     filePatternList.append("*.i++");
02840     filePatternList.append("*.inl");
02841     filePatternList.append("*.h");
02842     filePatternList.append("*.hh");
02843     filePatternList.append("*.hxx");
02844     filePatternList.append("*.hpp");
02845     filePatternList.append("*.h++");
02846     filePatternList.append("*.idl");
02847     filePatternList.append("*.odl");
02848     filePatternList.append("*.cs");
02849     filePatternList.append("*.php");
02850     filePatternList.append("*.php3");
02851     filePatternList.append("*.inc");
02852     filePatternList.append("*.m");
02853     filePatternList.append("*.mm");
02854 #if !defined(_WIN32)
02855     // unix => case sensitive match => also include useful uppercase versions
02856     filePatternList.append("*.C");
02857     filePatternList.append("*.CC"); 
02858     filePatternList.append("*.C++");
02859     filePatternList.append("*.II");
02860     filePatternList.append("*.I++");
02861     filePatternList.append("*.H");
02862     filePatternList.append("*.HH");
02863     filePatternList.append("*.H++");
02864     filePatternList.append("*.CS");
02865     filePatternList.append("*.PHP");
02866     filePatternList.append("*.PHP3");
02867     filePatternList.append("*.M");
02868     filePatternList.append("*.MM");
02869 #endif
02870   }
02871 
02872   // add default pattern if needed
02873   QStrList &examplePatternList = Config_getList("EXAMPLE_PATTERNS");
02874   if (examplePatternList.isEmpty())
02875   {
02876     examplePatternList.append("*");
02877   }
02878 
02879   // add default pattern if needed
02880   //QStrList &imagePatternList = Config_getList("IMAGE_PATTERNS");
02881   //if (imagePatternList.isEmpty())
02882   //{
02883   //  imagePatternList.append("*");
02884   //}
02885   
02886   // more checks needed if and only if the search engine is enabled.
02887 //  if (Config_getBool("SEARCHENGINE"))
02888 //  {
02889 //    // check cgi name
02890 //    QCString &cgiName = Config_getString("CGI_NAME");
02891 //    if (cgiName.isEmpty())
02892 //    {
02893 //      config_err("Error: tag CGI_NAME: no cgi script name after the CGI_NAME tag.\n");
02894 //      exit(1);
02895 //    }
02896 //    // check cgi URL
02897 //    QCString &cgiURL = Config_getString("CGI_URL");
02898 //    if (cgiURL.isEmpty())
02899 //    {
02900 //      config_err("Error: tag CGI_URL: no URL to cgi directory specified.\n");
02901 //      exit(1);
02902 //    }
02903 //    else if (cgiURL.left(7)!="http://" && 
02904 //       cgiURL.left(8)!="https://" &&
02905 //       cgiURL.left(4)!="cgi:"
02906 //      )
02907 //    {
02908 //      config_err("Error: tag CGI_URL: URL to cgi directory is invalid (must "
02909 //    "start with http:// or https://).\n");
02910 //      exit(1);
02911 //    }
02912 //    // check documentation URL
02913 //    QCString &docURL = Config_getString("DOC_URL");
02914 //    if (docURL.isEmpty())
02915 //    {
02916 //      docURL = Config_getString("OUTPUT_DIRECTORY").copy().prepend("file://").append("html");
02917 //    }
02918 //    else if (docURL.left(7)!="http://" && 
02919 //       docURL.left(8)!="https://" &&
02920 //       docURL.left(7)!="file://"
02921 //      )
02922 //    {
02923 //      config_err("Error: tag DOC_URL: URL to documentation is invalid or "
02924 //    "not absolute.\n"); 
02925 //      exit(1);
02926 //    }
02927 //    // check absolute documentation path
02928 //    QCString &docAbsPath = Config_getString("DOC_ABSPATH");
02929 //    if (docAbsPath.isEmpty())
02930 //    {
02931 //      docAbsPath = Config_getString("OUTPUT_DIRECTORY")+"/html"; 
02932 //    }
02933 //    else if (docAbsPath[0]!='/' && docAbsPath[1]!=':')
02934 //    {
02935 //      config_err("Error: tag DOC_ABSPATH: path is not absolute!\n");
02936 //      exit(1);
02937 //    }
02938 //    // check path to doxysearch
02939 //    QCString &binAbsPath = Config_getString("BIN_ABSPATH");
02940 //    if (binAbsPath.isEmpty())
02941 //    {
02942 //      config_err("Error: tag BIN_ABSPATH: no absolute path to doxysearch "
02943 //    "specified.\n");
02944 //      exit(1);
02945 //    }
02946 //    else if (binAbsPath[0]!='/' && binAbsPath[1]!=':')
02947 //    {
02948 //      config_err("Error: tag BIN_ABSPATH: path is not absolute!\n");
02949 //      exit(1);
02950 //    }
02951 //
02952 //  }
02953 //  // check perl path
02954 //  bool found=FALSE;
02955 //  QCString &perlPath = Config_getString("PERL_PATH");
02956 //  if (perlPath.isEmpty())
02957 //  {
02958 //    QFileInfo fi;
02959 //    fi.setFile("/usr/bin/perl");
02960 //    if (fi.exists()) 
02961 //    {
02962 //      perlPath="/usr/bin/perl";
02963 //      found=TRUE;
02964 //    }
02965 //    else
02966 //    {
02967 //      fi.setFile("/usr/local/bin/perl");
02968 //      if (fi.exists())
02969 //      {
02970 //  perlPath="/usr/local/bin/perl";
02971 //  found=TRUE;
02972 //      }
02973 //    }
02974 //  }
02975 //  if (!found)
02976 //  {
02977 //    QFileInfo fi(perlPath);
02978 //    if (!fi.exists())
02979 //    {
02980 //      config_warn("Warning: tag PERL_PATH: perl interpreter not found at default or"
02981 //    "user specified (%s) location\n",
02982 //    perlPath.data());
02983 //    }
02984 //  }
02985 
02986 #undef PUTENV
02987 #undef SEP
02988 #if defined(_WIN32) && !defined(__GNUC__) && (__BORLANDC__ < 0x0550)
02989 #define PUTENV _putenv
02990 #define SEP ";"
02991 #else 
02992 #define PUTENV putenv
02993 #define SEP ":"
02994 #endif
02995   if (Config_getBool("HAVE_DOT")) 
02996   {
02997     char *curFontPath = getenv("DOTFONTPATH");
02998     int l=curFontPath ? strlen(curFontPath)+1 : 0;
02999     static char *buf = 0;
03000     buf = (char *)realloc(buf,strlen("DOTFONTPATH=.")+l+1);
03001     strcpy(buf,"DOTFONTPATH=.");
03002     if (l>0)
03003     {
03004       strcat(buf,SEP);
03005       strcat(buf,curFontPath);
03006     }
03007     PUTENV(buf);
03008   }
03009 
03010   int &depth = Config_getInt("MAX_DOT_GRAPH_DEPTH");
03011   if (depth==0)
03012   {
03013     depth=1000;
03014   }
03015   
03016   if (Config_getBool("OPTIMIZE_OUTPUT_JAVA") && Config_getBool("INLINE_INFO"))
03017   {
03018     // don't show inline info for Java output, since Java has no inline 
03019     // concept.
03020     Config_getBool("INLINE_INFO")=FALSE;
03021   }
03022   
03023   // add default words if needed
03024   QStrList &annotationFromBrief = Config_getList("ABBREVIATE_BRIEF");
03025   if (annotationFromBrief.isEmpty())
03026   {
03027     annotationFromBrief.append("The $name class");
03028     annotationFromBrief.append("The $name widget");
03029     annotationFromBrief.append("The $name file");
03030     annotationFromBrief.append("is");
03031     annotationFromBrief.append("provides");
03032     annotationFromBrief.append("specifies");
03033     annotationFromBrief.append("contains");
03034     annotationFromBrief.append("represents");
03035     annotationFromBrief.append("a");
03036     annotationFromBrief.append("an");
03037     annotationFromBrief.append("the");
03038   }
03039 }
03040 
03041 void Config::init()
03042 {
03043   ConfigOption *option = m_options->first();
03044   while (option)
03045   {
03046     option->init();
03047     option = m_options->next();
03048   }
03049 }
03050 
03051 void Config::create()
03052 {
03053   if (m_initialized) return; 
03054   m_initialized = TRUE;
03055 
03056   ConfigString *cs;
03057   ConfigEnum   *ce;
03058   ConfigList   *cl;
03059   ConfigInt    *ci;
03060   ConfigBool   *cb;
03061   
03062   // option definitions
03063   //-----------------------------------------------------------------------------------------------
03064   addInfo("Project","Project related configuration options");
03065   //-----------------------------------------------------------------------------------------------
03066   
03067   
03068   cs = addString(
03069                  "PROJECT_NAME",
03070                  "The PROJECT_NAME tag is a single word (or a sequence of words surrounded \n"
03071                  "by quotes) that should identify the project. "
03072                 );
03073   cs = addString(
03074                  "PROJECT_NUMBER",
03075                  "The PROJECT_NUMBER tag can be used to enter a project or revision number. \n"
03076                  "This could be handy for archiving the generated documentation or \n"
03077                  "if some version control system is used.\n"
03078                 );
03079   cs = addString(
03080                  "OUTPUT_DIRECTORY",
03081                  "The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) \n"
03082                  "base path where the generated documentation will be put. \n"
03083                  "If a relative path is entered, it will be relative to the location \n"
03084                  "where doxygen was started. If left blank the current directory will be used.\n"
03085         );
03086   cs->setWidgetType(ConfigString::Dir);
03087   cb = addBool(
03088                  "CREATE_SUBDIRS",
03089                  "If the CREATE_SUBDIRS tag is set to YES, then doxygen will create \n"
03090                  "4096 sub-directories (in 2 levels) under the output directory of each output \n"
03091          "format and will distribute the generated files over these directories. \n"
03092          "Enabling this option can be useful when feeding doxygen a huge amount of source \n"
03093          "files, where putting all generated files in the same directory would otherwise \n"
03094          "cause performance problems for the file system. \n",
03095          FALSE
03096                 );
03097   ce = addEnum(
03098                  "OUTPUT_LANGUAGE",
03099                  "The OUTPUT_LANGUAGE tag is used to specify the language in which all \n"
03100                  "documentation generated by doxygen is written. Doxygen will use this \n"
03101                  "information to generate all constant output in the proper language. \n"
03102                  "The default language is English, other supported languages are: \n"
03103          "Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, \n"
03104          "Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, \n"
03105          "Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, \n"
03106          "Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, \n"
03107          "Swedish, and Ukrainian.\n", 
03108          "English"
03109                 );
03110 #ifdef LANG_BR
03111   ce->addValue("Brazilian");
03112 #endif
03113 #ifdef LANG_CA
03114   ce->addValue("Catalan");
03115 #endif
03116 #ifdef LANG_CN
03117   ce->addValue("Chinese");
03118 #endif
03119 #ifdef LANG_TW
03120   ce->addValue("Chinese-Traditional");
03121 #endif
03122 #ifdef LANG_HR
03123   ce->addValue("Croatian");
03124 #endif
03125 #ifdef LANG_CZ
03126   ce->addValue("Czech");
03127 #endif
03128 #ifdef LANG_DK
03129   ce->addValue("Danish");
03130 #endif
03131 #ifdef LANG_NL
03132   ce->addValue("Dutch");
03133 #endif
03134   ce->addValue("English");
03135 #ifdef LANG_FI
03136   ce->addValue("Finnish");
03137 #endif
03138 #ifdef LANG_FR
03139   ce->addValue("French");
03140 #endif
03141 #ifdef LANG_DE
03142   ce->addValue("German");
03143 #endif
03144 #ifdef LANG_GR
03145   ce->addValue("Greek");
03146 #endif
03147 #ifdef LANG_HU
03148   ce->addValue("Hungarian");
03149 #endif
03150 #ifdef LANG_IT
03151   ce->addValue("Italian");
03152 #endif
03153 #ifdef LANG_JP
03154   ce->addValue("Japanese");
03155   ce->addValue("Japanese-en");
03156 #endif
03157 #ifdef LANG_KR
03158   ce->addValue("Korean");
03159   ce->addValue("Korean-en");
03160 #endif
03161 #ifdef LANG_NO
03162   ce->addValue("Norwegian");
03163 #endif
03164 #ifdef LANG_PL
03165   ce->addValue("Polish");
03166 #endif
03167 #ifdef LANG_PT
03168   ce->addValue("Portuguese");
03169 #endif
03170 #ifdef LANG_RO
03171   ce->addValue("Romanian");
03172 #endif
03173 #ifdef LANG_RU
03174   ce->addValue("Russian");
03175 #endif
03176 #ifdef LANG_SR
03177   ce->addValue("Serbian");
03178 #endif
03179 #ifdef LANG_SK
03180   ce->addValue("Slovak");
03181 #endif
03182 #ifdef LANG_SI
03183   ce->addValue("Slovene");
03184 #endif
03185 #ifdef LANG_ES
03186   ce->addValue("Spanish");
03187 #endif
03188 #ifdef LANG_SE
03189   ce->addValue("Swedish");
03190 #endif
03191 #ifdef LANG_UA
03192   ce->addValue("Ukrainian");
03193 #endif
03194   cb = addBool(
03195                     "USE_WINDOWS_ENCODING",
03196             "This tag can be used to specify the encoding used in the generated output. \n"
03197             "The encoding is not always determined by the language that is chosen, \n"
03198             "but also whether or not the output is meant for Windows or non-Windows users. \n"
03199             "In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES \n"
03200             "forces the Windows encoding (this is the default for the Windows binary), \n"
03201             "whereas setting the tag to NO uses a Unix-style encoding (the default for \n"
03202             "all platforms other than Windows).\n",
03203 #if defined(_WIN32) || defined(__CYGWIN__)
03204             TRUE
03205 #else
03206             FALSE
03207 #endif
03208          );
03209   cb = addBool(
03210                     "BRIEF_MEMBER_DESC",
03211                     "If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will \n"
03212                     "include brief member descriptions after the members that are listed in \n"
03213                     "the file and class documentation (similar to JavaDoc). \n"
03214                     "Set to NO to disable this. \n",
03215                     TRUE
03216                  );
03217   cb = addBool(
03218                     "REPEAT_BRIEF",
03219                     "If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend \n"
03220                     "the brief description of a member or function before the detailed description. \n"
03221                     "Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the \n"
03222                     "brief descriptions will be completely suppressed. \n",
03223                     TRUE
03224                  );
03225   cl = addList(
03226                     "ABBREVIATE_BRIEF",
03227                     "This tag implements a quasi-intelligent brief description abbreviator \n"
03228                     "that is used to form the text in various listings. Each string \n"
03229                     "in this list, if found as the leading text of the brief description, will be \n"
03230                     "stripped from the text and the result after processing the whole list, is used \n"
03231             "as the annotated text. Otherwise, the brief description is used as-is. If left \n"
03232             "blank, the following values are used (\"$name\" is automatically replaced with the \n"
03233             "name of the entity): \"The $name class\" \"The $name widget\" \"The $name file\" \n"
03234             "\"is\" \"provides\" \"specifies\" \"contains\" \"represents\" \"a\" \"an\" \"the\"\n"
03235                  );
03236   cb = addBool(
03237                     "ALWAYS_DETAILED_SEC",
03238                     "If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then \n"
03239                     "Doxygen will generate a detailed section even if there is only a brief \n"
03240                     "description. \n",
03241                     FALSE
03242                  );
03243   cb = addBool(
03244                     "INLINE_INHERITED_MEMB",
03245                     "If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited \n"
03246                     "members of a class in the documentation of that class as if those members were \n"
03247             "ordinary class members. Constructors, destructors and assignment operators of \n"
03248             "the base classes will not be shown. \n",
03249             FALSE
03250                  );
03251   cb = addBool(
03252                     "FULL_PATH_NAMES",
03253                     "If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full \n"
03254                     "path before files name in the file list and in the header files. If set \n"
03255                     "to NO the shortest path that makes the file name unique will be used. \n",
03256                     TRUE
03257                  );
03258   cl = addList(
03259                     "STRIP_FROM_PATH",
03260                     "If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag \n"
03261                     "can be used to strip a user-defined part of the path. Stripping is \n"
03262                     "only done if one of the specified strings matches the left-hand part of \n"
03263                     "the path. The tag can be used to show relative paths in the file list. \n"
03264             "If left blank the directory from which doxygen is run is used as the \n"
03265             "path to strip. \n"
03266                  );
03267   cl->addDependency("FULL_PATH_NAMES");
03268   cl = addList(
03269                     "STRIP_FROM_INC_PATH",
03270                     "The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of \n"
03271             "the path mentioned in the documentation of a class, which tells \n"
03272             "the reader which header file to include in order to use a class. \n"
03273             "If left blank only the name of the header file containing the class \n"
03274             "definition is used. Otherwise one should specify the include paths that \n"
03275             "are normally passed to the compiler using the -I flag.\n"
03276                  );
03277   cb = addBool(
03278                     "SHORT_NAMES",
03279             "If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter \n"
03280             "(but less readable) file names. This can be useful is your file systems \n"
03281             "doesn't support long names like on DOS, Mac, or CD-ROM. \n",
03282             FALSE
03283                  );
03284   cb = addBool(
03285                     "JAVADOC_AUTOBRIEF",
03286                     "If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen \n"
03287                     "will interpret the first line (until the first dot) of a JavaDoc-style \n"
03288                     "comment as the brief description. If set to NO, the JavaDoc \n"
03289                     "comments will behave just like the Qt-style comments (thus requiring an \n"
03290                     "explicit @brief command for a brief description. \n",
03291                     FALSE
03292                  );
03293   cb = addBool(
03294                     "MULTILINE_CPP_IS_BRIEF",
03295                     "The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen \n"
03296                     "treat a multi-line C++ special comment block (i.e. a block of //! or /// \n"
03297             "comments) as a brief description. This used to be the default behaviour. \n"
03298             "The new default is to treat a multi-line C++ comment block as a detailed \n"
03299             "description. Set this tag to YES if you prefer the old behaviour instead. \n",
03300                     FALSE
03301                  );
03302   cb = addBool(
03303                     "DETAILS_AT_TOP",
03304                     "If the DETAILS_AT_TOP tag is set to YES then Doxygen \n"
03305                     "will output the detailed description near the top, like JavaDoc.\n"
03306                     "If set to NO, the detailed description appears after the member \n"
03307                     "documentation. \n",
03308                     FALSE
03309                  );
03310   cb = addBool(
03311                     "INHERIT_DOCS",
03312                     "If the INHERIT_DOCS tag is set to YES (the default) then an undocumented \n"
03313                     "member inherits the documentation from any documented member that it \n"
03314                     "re-implements. \n",
03315                     TRUE
03316                  );
03317   cb = addBool(
03318                     "DISTRIBUTE_GROUP_DOC",
03319                     "If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC \n"
03320                     "tag is set to YES, then doxygen will reuse the documentation of the first \n"
03321                     "member in the group (if any) for the other members of the group. By default \n"
03322                     "all members of a group must be documented explicitly.\n",
03323                     FALSE
03324                  );
03325   ci = addInt(
03326                     "TAB_SIZE",
03327                     "The TAB_SIZE tag can be used to set the number of spaces in a tab. \n"
03328                     "Doxygen uses this value to replace tabs by spaces in code fragments. \n",
03329                     1,16,8
03330                 );
03331   cl = addList(
03332                     "ALIASES",
03333                     "This tag can be used to specify a number of aliases that acts \n"
03334                     "as commands in the documentation. An alias has the form \"name=value\". \n"
03335                     "For example adding \"sideeffect=\\par Side Effects:\\n\" will allow you to \n"
03336                     "put the command \\sideeffect (or @sideeffect) in the documentation, which \n"
03337                     "will result in a user-defined paragraph with heading \"Side Effects:\". \n"
03338                     "You can put \\n's in the value part of an alias to insert newlines. \n" 
03339                  );
03340   cb = addBool(
03341                     "OPTIMIZE_OUTPUT_FOR_C",
03342                     "Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources \n"
03343                     "only. Doxygen will then generate output that is more tailored for C. \n"
03344                     "For instance, some of the names that are used will be different. The list \n"
03345                     "of all members will be omitted, etc. \n",
03346                     FALSE
03347                  );
03348   cb = addBool(
03349                     "OPTIMIZE_OUTPUT_JAVA",
03350                     "Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources \n"
03351                     "only. Doxygen will then generate output that is more tailored for Java. \n"
03352                     "For instance, namespaces will be presented as packages, qualified scopes \n"
03353                     "will look different, etc. \n",
03354                     FALSE
03355                  );
03356   cb = addBool(    
03357                     "SUBGROUPING",
03358             "Set the SUBGROUPING tag to YES (the default) to allow class member groups of \n"
03359             "the same type (for instance a group of public functions) to be put as a \n"
03360             "subgroup of that type (e.g. under the Public Functions section). Set it to \n"
03361             "NO to prevent subgrouping. Alternatively, this can be done per class using \n"
03362             "the \\nosubgrouping command. \n",
03363             TRUE
03364                 );
03365   //-----------------------------------------------------------------------------------------------
03366   addInfo("Build","Build related configuration options");
03367   //-----------------------------------------------------------------------------------------------
03368   cb = addBool(
03369                     "EXTRACT_ALL",
03370                     "If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in \n"
03371                     "documentation are documented, even if no documentation was available. \n"
03372                     "Private class members and static file members will be hidden unless \n"
03373                     "the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES \n",
03374                     FALSE
03375                  );
03376   cb = addBool(
03377                     "EXTRACT_PRIVATE",
03378                     "If the EXTRACT_PRIVATE tag is set to YES all private members of a class \n"
03379                     "will be included in the documentation. \n",
03380                     FALSE
03381                  );
03382   cb = addBool(
03383                     "EXTRACT_STATIC",
03384                     "If the EXTRACT_STATIC tag is set to YES all static members of a file \n"
03385                     "will be included in the documentation. \n",
03386                     FALSE
03387                  );
03388   cb = addBool(
03389                     "EXTRACT_LOCAL_CLASSES",
03390                     "If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) \n"
03391             "defined locally in source files will be included in the documentation. \n"
03392             "If set to NO only classes defined in header files are included. \n",
03393                     TRUE
03394                  );
03395   cb = addBool(
03396                     "EXTRACT_LOCAL_METHODS",
03397                     "This flag is only useful for Objective-C code. When set to YES local \n"
03398             "methods, which are defined in the implementation section but not in \n"
03399             "the interface are included in the documentation. \n"
03400             "If set to NO (the default) only methods in the interface are included. \n",
03401                     FALSE
03402                  );
03403   cb = addBool(
03404                     "HIDE_UNDOC_MEMBERS",
03405                     "If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all \n"
03406                     "undocumented members of documented classes, files or namespaces. \n"
03407                     "If set to NO (the default) these members will be included in the \n"
03408                     "various overviews, but no documentation section is generated. \n"
03409                     "This option has no effect if EXTRACT_ALL is enabled. \n",
03410                     FALSE
03411                  );
03412   cb = addBool(
03413                     "HIDE_UNDOC_CLASSES",
03414                     "If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all \n"
03415                     "undocumented classes that are normally visible in the class hierarchy. \n"
03416                     "If set to NO (the default) these classes will be included in the various \n"
03417                     "overviews. This option has no effect if EXTRACT_ALL is enabled. \n",
03418                     FALSE
03419                  );
03420   cb = addBool(
03421                     "HIDE_FRIEND_COMPOUNDS",
03422                     "If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all \n"
03423                     "friend (class|struct|union) declarations. \n"
03424                     "If set to NO (the default) these declarations will be included in the \n"
03425                     "documentation. \n",
03426                     FALSE
03427                  );
03428   cb = addBool(
03429                     "HIDE_IN_BODY_DOCS",
03430                     "If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any \n"
03431                     "documentation blocks found inside the body of a function. \n"
03432                     "If set to NO (the default) these blocks will be appended to the \n"
03433                     "function's detailed documentation block. \n",
03434                     FALSE
03435                  );
03436   cb = addBool(
03437                     "INTERNAL_DOCS",
03438                     "The INTERNAL_DOCS tag determines if documentation \n"
03439                     "that is typed after a \\internal command is included. If the tag is set \n"
03440                     "to NO (the default) then the documentation will be excluded. \n"
03441                     "Set it to YES to include the internal documentation. \n",
03442                     FALSE
03443                  );
03444   cb = addBool(
03445                     "CASE_SENSE_NAMES",
03446                     "If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate \n"
03447                     "file names in lower-case letters. If set to YES upper-case letters are also \n"
03448                     "allowed. This is useful if you have classes or files whose names only differ \n"
03449                     "in case and if your file system supports case sensitive file names. Windows \n"
03450                     "and Mac users are advised to set this option to NO.\n",
03451 #if defined(_WIN32) || defined(macintosh) || defined(__MACOSX__) || defined(__APPLE__)
03452             FALSE // case insensitive file system expected
03453 #else
03454                     TRUE // case sensitive file system expected
03455 #endif
03456                  );
03457   cb = addBool(
03458                     "HIDE_SCOPE_NAMES",
03459                     "If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen \n"
03460                     "will show members with their full class and namespace scopes in the \n"
03461                     "documentation. If set to YES the scope will be hidden. \n",
03462                     FALSE
03463                  );
03464   cb = addBool(
03465                     "SHOW_INCLUDE_FILES",
03466                     "If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen \n"
03467                     "will put a list of the files that are included by a file in the documentation \n"
03468                     "of that file. \n",
03469                     TRUE
03470                  );
03471   cb = addBool(
03472                     "INLINE_INFO",
03473                     "If the INLINE_INFO tag is set to YES (the default) then a tag [inline] \n"
03474                     "is inserted in the documentation for inline members. \n",
03475                     TRUE
03476                  );
03477   cb = addBool(
03478                     "SORT_MEMBER_DOCS",
03479                     "If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen \n"
03480                     "will sort the (detailed) documentation of file and class members \n"
03481                     "alphabetically by member name. If set to NO the members will appear in \n"
03482                     "declaration order. \n",
03483                     TRUE
03484                  );
03485   cb = addBool(
03486                     "SORT_BRIEF_DOCS",
03487                     "If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the \n"
03488                     "brief documentation of file, namespace and class members alphabetically \n"
03489                     "by member name. If set to NO (the default) the members will appear in \n"
03490                     "declaration order. \n",
03491                     FALSE
03492                  );
03493   cb = addBool(
03494                     "SORT_BY_SCOPE_NAME",
03495                     "If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be \n"
03496                     "sorted by fully-qualified names, including namespaces. If set to \n"
03497             "NO (the default), the class list will be sorted only by class name, \n"
03498             "not including the namespace part. \n"
03499                     "Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.\n"
03500                     "Note: This option applies only to the class list, not to the \n"
03501                     "alphabetical list.\n",
03502                     FALSE
03503                  );
03504 
03505   cb = addBool(
03506                     "GENERATE_TODOLIST",
03507                     "The GENERATE_TODOLIST tag can be used to enable (YES) or \n"
03508                     "disable (NO) the todo list. This list is created by putting \\todo \n"
03509                     "commands in the documentation.\n",
03510                     TRUE
03511                  );
03512   cb = addBool(
03513                     "GENERATE_TESTLIST",
03514                     "The GENERATE_TESTLIST tag can be used to enable (YES) or \n"
03515                     "disable (NO) the test list. This list is created by putting \\test \n"
03516                     "commands in the documentation.\n",
03517                     TRUE
03518                  );
03519   cb = addBool(
03520                     "GENERATE_BUGLIST",
03521                     "The GENERATE_BUGLIST tag can be used to enable (YES) or \n"
03522                     "disable (NO) the bug list. This list is created by putting \\bug \n"
03523                     "commands in the documentation.\n",
03524                     TRUE
03525                  );
03526   cb = addBool(
03527                     "GENERATE_DEPRECATEDLIST",
03528                     "The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or \n"
03529                     "disable (NO) the deprecated list. This list is created by putting \n"
03530             "\\deprecated commands in the documentation.\n",
03531                     TRUE
03532              );
03533   cl = addList(
03534                     "ENABLED_SECTIONS",
03535                     "The ENABLED_SECTIONS tag can be used to enable conditional \n"
03536                     "documentation sections, marked by \\if sectionname ... \\endif. \n"
03537                  );
03538   ci = addInt(
03539                     "MAX_INITIALIZER_LINES",
03540                     "The MAX_INITIALIZER_LINES tag determines the maximum number of lines \n"
03541                     "the initial value of a variable or define consists of for it to appear in \n"
03542                     "the documentation. If the initializer consists of more lines than specified \n"
03543                     "here it will be hidden. Use a value of 0 to hide initializers completely. \n"
03544                     "The appearance of the initializer of individual variables and defines in the \n"
03545                     "documentation can be controlled using \\showinitializer or \\hideinitializer \n"
03546                     "command in the documentation regardless of this setting. \n",
03547                     0,10000,30
03548                  );
03549   cb = addBool(
03550                     "SHOW_USED_FILES",
03551                     "Set the SHOW_USED_FILES tag to NO to disable the list of files generated \n"
03552                     "at the bottom of the documentation of classes and structs. If set to YES the \n"
03553                     "list will mention the files that were used to generate the documentation. \n",
03554                     TRUE
03555                 );
03556   
03557   //-----------------------------------------------------------------------------------------------
03558   addInfo(  "Messages","configuration options related to warning and progress messages");
03559   //-----------------------------------------------------------------------------------------------
03560 
03561   cb = addBool(
03562                     "QUIET",
03563                     "The QUIET tag can be used to turn on/off the messages that are generated \n"
03564                     "by doxygen. Possible values are YES and NO. If left blank NO is used. \n",
03565                     FALSE
03566                  );
03567   cb = addBool(
03568                     "WARNINGS",
03569                     "The WARNINGS tag can be used to turn on/off the warning messages that are \n"
03570                     "generated by doxygen. Possible values are YES and NO. If left blank \n"
03571                     "NO is used. \n",
03572                     TRUE
03573                  );
03574   cb = addBool(
03575                     "WARN_IF_UNDOCUMENTED",
03576                     "If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings \n"
03577                     "for undocumented members. If EXTRACT_ALL is set to YES then this flag will \n"
03578                     "automatically be disabled. \n",
03579                     TRUE
03580                  );
03581   cb = addBool(
03582                     "WARN_IF_DOC_ERROR",
03583                     "If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for \n"
03584                     "potential errors in the documentation, such as not documenting some \n"
03585             "parameters in a documented function, or documenting parameters that \n"
03586             "do not exist or using markup commands wrongly. \n",
03587                     TRUE
03588                  );
03589   cs = addString(
03590                     "WARN_FORMAT",
03591                     "The WARN_FORMAT tag determines the format of the warning messages that \n"
03592                     "doxygen can produce. The string should contain the $file, $line, and $text \n"
03593                     "tags, which will be replaced by the file and line number from which the \n"
03594                     "warning originated and the warning text. \n"
03595                    ); 
03596   cs->setDefaultValue("$file:$line: $text");
03597   cs = addString(
03598                     "WARN_LOGFILE",
03599                     "The WARN_LOGFILE tag can be used to specify a file to which warning \n"
03600                     "and error messages should be written. If left blank the output is written \n"
03601                     "to stderr. \n"
03602                    );
03603   //-----------------------------------------------------------------------------------------------
03604   addInfo(  "Input","configuration options related to the input files");
03605   //-----------------------------------------------------------------------------------------------
03606   cl = addList(
03607                     "INPUT",
03608                     "The INPUT tag can be used to specify the files and/or directories that contain \n"
03609                     "documented source files. You may enter file names like \"myfile.cpp\" or \n"
03610                     "directories like \"/usr/src/myproject\". Separate the files or directories \n"
03611                     "with spaces. \n"
03612                  );
03613   cl->setWidgetType(ConfigList::FileAndDir);
03614   cl = addList(
03615                     "FILE_PATTERNS",
03616                     "If the value of the INPUT tag contains directories, you can use the \n"
03617                     "FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp \n"
03618                     "and *.h) to filter out the source-files in the directories. If left \n"
03619                     "blank the following patterns are tested: \n"
03620             "*.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp \n"
03621             "*.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm\n"
03622                  );
03623   cb = addBool(
03624                     "RECURSIVE",
03625                     "The RECURSIVE tag can be used to turn specify whether or not subdirectories \n"
03626                     "should be searched for input files as well. Possible values are YES and NO. \n"
03627                     "If left blank NO is used. \n",
03628                     FALSE
03629                  );
03630   cl = addList(
03631                     "EXCLUDE",
03632                     "The EXCLUDE tag can be used to specify files and/or directories that should \n"
03633                     "excluded from the INPUT source files. This way you can easily exclude a \n"
03634                     "subdirectory from a directory tree whose root is specified with the INPUT tag. \n"
03635                  );
03636   cb = addBool(
03637                     "EXCLUDE_SYMLINKS",
03638                     "The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories \n"
03639                     "that are symbolic links (a Unix filesystem feature) are excluded from the input. \n",
03640                     FALSE
03641                  );
03642   cl->setWidgetType(ConfigList::FileAndDir);
03643   cl = addList(
03644                     "EXCLUDE_PATTERNS",
03645                     "If the value of the INPUT tag contains directories, you can use the \n"
03646                     "EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude \n"
03647                     "certain files from those directories. \n"
03648                  );
03649   cl = addList(
03650                     "EXAMPLE_PATH",
03651                     "The EXAMPLE_PATH tag can be used to specify one or more files or \n"
03652                     "directories that contain example code fragments that are included (see \n"
03653                     "the \\include command). \n"
03654                  );
03655   cl->setWidgetType(ConfigList::Dir);
03656   cl = addList(
03657                     "EXAMPLE_PATTERNS",
03658                     "If the value of the EXAMPLE_PATH tag contains directories, you can use the \n"
03659                     "EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp \n"
03660                     "and *.h) to filter out the source-files in the directories. If left \n"
03661                     "blank all files are included. \n"
03662                  );
03663   cb = addBool(
03664                     "EXAMPLE_RECURSIVE",
03665                     "If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be \n"
03666                     "searched for input files to be used with the \\include or \\dontinclude \n"
03667                     "commands irrespective of the value of the RECURSIVE tag. \n"
03668                     "Possible values are YES and NO. If left blank NO is used. \n",
03669                     FALSE
03670                  );
03671   cl = addList(
03672                     "IMAGE_PATH",
03673                     "The IMAGE_PATH tag can be used to specify one or more files or \n"
03674                     "directories that contain image that are included in the documentation (see \n"
03675                     "the \\image command). \n"
03676                  );
03677   cl->setWidgetType(ConfigList::Dir);
03678   cs = addString(
03679                     "INPUT_FILTER",
03680                     "The INPUT_FILTER tag can be used to specify a program that doxygen should \n"
03681                     "invoke to filter for each input file. Doxygen will invoke the filter program \n"
03682                     "by executing (via popen()) the command <filter> <input-file>, where <filter> \n"
03683                     "is the value of the INPUT_FILTER tag, and <input-file> is the name of an \n"
03684                     "input file. Doxygen will then use the output that the filter program writes \n"
03685                     "to standard output. \n"
03686                    );
03687   cl->setWidgetType(ConfigList::File);
03688   cb = addBool(
03689                     "FILTER_SOURCE_FILES",
03690                     "If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using \n"
03691                     "INPUT_FILTER) will be used to filter the input files when producing source \n"
03692                     "files to browse (i.e. when SOURCE_BROWSER is set to YES). \n",
03693                     FALSE
03694                 );    
03695   //-----------------------------------------------------------------------------------------------
03696   addInfo(  "Source Browser","configuration options related to source browsing");
03697   //-----------------------------------------------------------------------------------------------
03698   cb = addBool(
03699                     "SOURCE_BROWSER",
03700                     "If the SOURCE_BROWSER tag is set to YES then a list of source files will \n"
03701                     "be generated. Documented entities will be cross-referenced with these sources. \n"
03702             "Note: To get rid of all source code in the generated output, make sure also \n"
03703             "VERBATIM_HEADERS is set to NO. \n",
03704                     FALSE
03705                  );
03706   cb = addBool(
03707                     "INLINE_SOURCES",
03708                     "Setting the INLINE_SOURCES tag to YES will include the body \n"
03709                     "of functions and classes directly in the documentation. \n",
03710                     FALSE
03711                  );
03712   cb = addBool(
03713                     "STRIP_CODE_COMMENTS",
03714                     "Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct \n"
03715                     "doxygen to hide any special comment blocks from generated source code \n"
03716                     "fragments. Normal C and C++ comments will always remain visible. \n",
03717                     TRUE
03718                  );
03719   cb = addBool(     "REFERENCED_BY_RELATION",
03720                     "If the REFERENCED_BY_RELATION tag is set to YES (the default) \n"
03721             "then for each documented function all documented \n"
03722             "functions referencing it will be listed. \n",
03723                     TRUE
03724               );
03725   cb->addDependency("SOURCE_BROWSER");
03726   cb = addBool(     "REFERENCES_RELATION",
03727                     "If the REFERENCES_RELATION tag is set to YES (the default) \n"
03728             "then for each documented function all documented entities \n"
03729             "called/used by that function will be listed. \n",
03730                     TRUE
03731               );
03732   cb->addDependency("SOURCE_BROWSER");
03733   cb = addBool(
03734                     "VERBATIM_HEADERS",
03735                     "If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen \n"
03736                     "will generate a verbatim copy of the header file for each class for \n"
03737                     "which an include is specified. Set to NO to disable this. \n",
03738                     TRUE
03739                  );
03740   //-----------------------------------------------------------------------------------------------
03741   addInfo(  "Index","configuration options related to the alphabetical class index");
03742   //-----------------------------------------------------------------------------------------------
03743   
03744   cb = addBool(
03745                     "ALPHABETICAL_INDEX",
03746                     "If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index \n"
03747                     "of all compounds will be generated. Enable this if the project \n"
03748                     "contains a lot of classes, structs, unions or interfaces. \n",
03749                     FALSE
03750                  );
03751   ci = addInt(
03752                     "COLS_IN_ALPHA_INDEX",
03753                     "If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then \n"
03754                     "the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns \n"
03755                     "in which this list will be split (can be a number in the range [1..20]) \n",
03756                     1,20,5
03757                 );
03758   cl = addList(
03759                     "IGNORE_PREFIX",
03760                     "In case all classes in a project start with a common prefix, all \n"
03761                     "classes will be put under the same header in the alphabetical index. \n"
03762                     "The IGNORE_PREFIX tag can be used to specify one or more prefixes that \n"
03763                     "should be ignored while generating the index headers. \n"
03764                  );
03765   //-----------------------------------------------------------------------------------------------
03766   addInfo(  "HTML","configuration options related to the HTML output");
03767   //-----------------------------------------------------------------------------------------------
03768   cb = addBool(
03769                     "GENERATE_HTML",
03770                     "If the GENERATE_HTML tag is set to YES (the default) Doxygen will \n"
03771                     "generate HTML output. \n",
03772                     TRUE
03773                  );
03774   cs = addString(
03775                     "HTML_OUTPUT",
03776                     "The HTML_OUTPUT tag is used to specify where the HTML docs will be put. \n"
03777                     "If a relative path is entered the value of OUTPUT_DIRECTORY will be \n"
03778                     "put in front of it. If left blank `html' will be used as the default path. \n"
03779                    );
03780   cs->setDefaultValue("html");
03781   cs->setWidgetType(ConfigString::Dir);
03782   cs->addDependency("GENERATE_HTML");
03783   cs = addString(
03784                     "HTML_FILE_EXTENSION",
03785                     "The HTML_FILE_EXTENSION tag can be used to specify the file extension for \n"
03786                     "each generated HTML page (for example: .htm,.php,.asp). If it is left blank \n"
03787                     "doxygen will generate files with .html extension.\n"
03788                    );
03789   cs->setDefaultValue(".html");
03790   cs->addDependency("GENERATE_HTML");
03791   cs = addString(
03792                     "HTML_HEADER",
03793                     "The HTML_HEADER tag can be used to specify a personal HTML header for \n"
03794                     "each generated HTML page. If it is left blank doxygen will generate a \n"
03795                     "standard header.\n"
03796                    );
03797   cs->setWidgetType(ConfigString::File);
03798   cs->addDependency("GENERATE_HTML");
03799   cs = addString(
03800                     "HTML_FOOTER",
03801                     "The HTML_FOOTER tag can be used to specify a personal HTML footer for \n"
03802                     "each generated HTML page. If it is left blank doxygen will generate a \n"
03803                     "standard footer.\n"
03804                    );
03805   cs->setWidgetType(ConfigString::File);
03806   cs->addDependency("GENERATE_HTML");
03807   cs = addString(
03808                     "HTML_STYLESHEET",
03809                     "The HTML_STYLESHEET tag can be used to specify a user-defined cascading \n"
03810                     "style sheet that is used by each HTML page. It can be used to \n"
03811                     "fine-tune the look of the HTML output. If the tag is left blank doxygen \n"
03812                     "will generate a default style sheet. Note that doxygen will try to copy \n"
03813             "the style sheet file to the HTML output directory, so do not put your own \n"
03814             "stylesheet in the HTML output directory as well, or it will be erased! \n"
03815                    );
03816   cs->setWidgetType(ConfigString::File);
03817   cs->addDependency("GENERATE_HTML");
03818   cb = addBool( 
03819                     "HTML_ALIGN_MEMBERS",
03820                     "If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, \n"
03821                     "files or namespaces will be aligned in HTML using tables. If set to \n"
03822                     "NO a bullet list will be used. \n",
03823                     TRUE
03824                  );
03825   cb->addDependency("GENERATE_HTML");
03826   cb = addBool(
03827                     "GENERATE_HTMLHELP",
03828                     "If the GENERATE_HTMLHELP tag is set to YES, additional index files \n"
03829                     "will be generated that can be used as input for tools like the \n"
03830                     "Microsoft HTML help workshop to generate a compressed HTML help file (.chm) \n"
03831                     "of the generated HTML documentation. \n",
03832                     FALSE
03833                  );
03834   cb->addDependency("GENERATE_HTML");
03835   cs = addString(
03836                     "CHM_FILE",
03837                     "If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can \n"
03838                     "be used to specify the file name of the resulting .chm file. You \n"
03839             "can add a path in front of the file if the result should not be \n"
03840             "written to the html output directory. \n"
03841                    );
03842   cs->addDependency("GENERATE_HTML");
03843   cs = addString(
03844                     "HHC_LOCATION",
03845                     "If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can \n"
03846                     "be used to specify the location (absolute path including file name) of \n"
03847             "the HTML help compiler (hhc.exe). If non-empty doxygen will try to run \n"
03848             "the HTML help compiler on the generated index.hhp.\n"
03849                    );
03850   cs->addDependency("GENERATE_HTML");
03851   cb = addBool(
03852                     "GENERATE_CHI",
03853                     "If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag \n"
03854                     "controls if a separate .chi index file is generated (YES) or that \n"
03855                     "it should be included in the master .chm file (NO).\n",
03856                     FALSE
03857                  );
03858   cb->addDependency("GENERATE_HTML");
03859   cb = addBool(
03860                     "BINARY_TOC",
03861                     "If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag \n"
03862                     "controls whether a binary table of contents is generated (YES) or a \n"
03863                     "normal table of contents (NO) in the .chm file.\n",
03864                     FALSE
03865                  );
03866   cb->addDependency("GENERATE_HTML");
03867   cb = addBool(
03868                     "TOC_EXPAND",
03869                     "The TOC_EXPAND flag can be set to YES to add extra items for group members \n"
03870                     "to the contents of the HTML help documentation and to the tree view. \n",
03871                     FALSE
03872                  );
03873   cb->addDependency("GENERATE_HTML");
03874   cb = addBool(
03875                     "DISABLE_INDEX",
03876                     "The DISABLE_INDEX tag can be used to turn on/off the condensed index at \n"
03877                     "top of each HTML page. The value NO (the default) enables the index and \n"
03878                     "the value YES disables it. \n",
03879                     FALSE
03880                  );
03881   cb->addDependency("GENERATE_HTML");
03882   ci = addInt(
03883                     "ENUM_VALUES_PER_LINE",
03884                     "This tag can be used to set the number of enum values (range [1..20]) \n"
03885                     "that doxygen will group on one line in the generated HTML documentation. \n",
03886                     1,20,4
03887                 );
03888   ci->addDependency("GENERATE_HTML");
03889   cb = addBool(
03890                     "GENERATE_TREEVIEW",
03891                     "If the GENERATE_TREEVIEW tag is set to YES, a side panel will be\n"
03892                     "generated containing a tree-like index structure (just like the one that \n"
03893                     "is generated for HTML Help). For this to work a browser that supports \n"
03894                     "JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, \n"
03895             "Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are \n"
03896             "probably better off using the HTML help feature. \n",
03897                     FALSE
03898                  );
03899   cb->addDependency("GENERATE_HTML");
03900   ci = addInt(
03901                     "TREEVIEW_WIDTH",
03902                     "If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be \n"
03903                     "used to set the initial width (in pixels) of the frame in which the tree \n"
03904                     "is shown. \n",
03905                     0,1500,250
03906                  );
03907   ci->addDependency("GENERATE_HTML");
03908 
03909   //-----------------------------------------------------------------------------------------------
03910   addInfo(  "LaTeX","configuration options related to the LaTeX output");
03911   //-----------------------------------------------------------------------------------------------
03912   cb = addBool(
03913                     "GENERATE_LATEX",
03914                     "If the GENERATE_LATEX tag is set to YES (the default) Doxygen will \n"
03915                     "generate Latex output. \n",
03916                     TRUE
03917                  );
03918   cs = addString(
03919                     "LATEX_OUTPUT",
03920                     "The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. \n"
03921                     "If a relative path is entered the value of OUTPUT_DIRECTORY will be \n"
03922                     "put in front of it. If left blank `latex' will be used as the default path. \n"
03923                    );
03924   cs->setDefaultValue("latex");
03925   cs->setWidgetType(ConfigString::Dir);
03926   cs->addDependency("GENERATE_LATEX");
03927   cs = addString(
03928                     "LATEX_CMD_NAME",
03929                     "The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be \n"
03930                     "invoked. If left blank `latex' will be used as the default command name. \n"
03931                    );
03932   cs->setDefaultValue("latex");
03933   cs->setWidgetType(ConfigString::File);
03934   cs->addDependency("GENERATE_LATEX");
03935   cs = addString(
03936                     "MAKEINDEX_CMD_NAME",
03937                     "The MAKEINDEX_CMD_NAME tag can be used to specify the command name to \n"
03938             "generate index for LaTeX. If left blank `makeindex' will be used as the \n"
03939             "default command name. \n"
03940                    );
03941   cs->setDefaultValue("makeindex");
03942   cs->setWidgetType(ConfigString::File);
03943   cs->addDependency("GENERATE_LATEX");
03944   cb = addBool(
03945                     "COMPACT_LATEX",
03946                     "If the COMPACT_LATEX tag is set to YES Doxygen generates more compact \n"
03947                     "LaTeX documents. This may be useful for small projects and may help to \n"
03948                     "save some trees in general. \n",
03949                     FALSE
03950                  );
03951   cb->addDependency("GENERATE_LATEX");
03952   ce = addEnum(
03953                     "PAPER_TYPE",
03954                     "The PAPER_TYPE tag can be used to set the paper type that is used \n"
03955                     "by the printer. Possible values are: a4, a4wide, letter, legal and \n"
03956                     "executive. If left blank a4wide will be used. \n",
03957                     "a4wide"
03958                    );
03959   ce->addValue("a4");
03960   ce->addValue("a4wide");
03961   ce->addValue("letter");
03962   ce->addValue("legal");
03963   ce->addValue("executive");
03964   ce->addDependency("GENERATE_LATEX");
03965   cl = addList(
03966                     "EXTRA_PACKAGES",
03967                     "The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX \n"
03968                     "packages that should be included in the LaTeX output. \n"
03969                  );
03970   cl->addDependency("GENERATE_LATEX");
03971   cs = addString(
03972                     "LATEX_HEADER",
03973                     "The LATEX_HEADER tag can be used to specify a personal LaTeX header for \n"
03974                     "the generated latex document. The header should contain everything until \n"
03975                     "the first chapter. If it is left blank doxygen will generate a \n"
03976                     "standard header. Notice: only use this tag if you know what you are doing! \n"
03977                  );
03978   cs->setWidgetType(ConfigString::File);
03979   cs->addDependency("GENERATE_LATEX");
03980   cb = addBool(
03981                     "PDF_HYPERLINKS",
03982                     "If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated \n"
03983                     "is prepared for conversion to pdf (using ps2pdf). The pdf file will \n"
03984                     "contain links (just like the HTML output) instead of page references \n"
03985                     "This makes the output suitable for online browsing using a pdf viewer. \n",
03986                     FALSE
03987                  );
03988   cb->addDependency("GENERATE_LATEX");
03989   cb = addBool(
03990                     "USE_PDFLATEX",
03991                     "If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of \n"
03992                     "plain latex in the generated Makefile. Set this option to YES to get a \n"
03993                     "higher quality PDF documentation. \n",
03994                     FALSE
03995                  );   
03996   cb->addDependency("GENERATE_LATEX");
03997   cb = addBool(
03998                     "LATEX_BATCHMODE",
03999                     "If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\\\batchmode. \n"
04000                     "command to the generated LaTeX files. This will instruct LaTeX to keep \n"
04001                     "running if errors occur, instead of asking the user for help. \n"
04002                     "This option is also used when generating formulas in HTML. \n",
04003                     FALSE
04004                  );
04005   cb->addDependency("GENERATE_LATEX");
04006   cb = addBool(
04007                     "LATEX_HIDE_INDICES",
04008                     "If LATEX_HIDE_INDICES is set to YES then doxygen will not \n"
04009                     "include the index chapters (such as File Index, Compound Index, etc.) \n"
04010                     "in the output. \n",
04011                     FALSE
04012                  );
04013   cb->addDependency("GENERATE_LATEX");
04014   //-----------------------------------------------------------------------------------------------
04015   addInfo(  "RTF","configuration options related to the RTF output");
04016   //-----------------------------------------------------------------------------------------------
04017   cb = addBool(
04018                     "GENERATE_RTF",
04019                     "If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output \n"
04020                     "The RTF output is optimized for Word 97 and may not look very pretty with \n"
04021                     "other RTF readers or editors.\n",
04022                     FALSE
04023                  );
04024   cs = addString(
04025                     "RTF_OUTPUT",
04026                     "The RTF_OUTPUT tag is used to specify where the RTF docs will be put. \n"
04027                     "If a relative path is entered the value of OUTPUT_DIRECTORY will be \n"
04028                     "put in front of it. If left blank `rtf' will be used as the default path. \n"
04029                  );
04030   cs->setDefaultValue("rtf");
04031   cs->setWidgetType(ConfigString::Dir);
04032   cs->addDependency("GENERATE_RTF");
04033   cb = addBool(
04034                     "COMPACT_RTF",
04035                     "If the COMPACT_RTF tag is set to YES Doxygen generates more compact \n"
04036                     "RTF documents. This may be useful for small projects and may help to \n"
04037                     "save some trees in general. \n",
04038                     FALSE
04039                  );
04040   cb->addDependency("GENERATE_RTF");
04041   cb = addBool(
04042                     "RTF_HYPERLINKS",
04043                     "If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated \n"
04044                     "will contain hyperlink fields. The RTF file will \n"
04045                     "contain links (just like the HTML output) instead of page references. \n"
04046                     "This makes the output suitable for online browsing using WORD or other \n"
04047                     "programs which support those fields. \n"
04048                     "Note: wordpad (write) and others do not support links. \n",
04049                     FALSE
04050                  );
04051   cb->addDependency("GENERATE_RTF");
04052   cs = addString(
04053                     "RTF_STYLESHEET_FILE",
04054                     "Load stylesheet definitions from file. Syntax is similar to doxygen's \n"
04055                     "config file, i.e. a series of assignments. You only have to provide \n"
04056                     "replacements, missing definitions are set to their default value. \n"
04057                    );
04058   cs->setWidgetType(ConfigString::File);
04059   cs->addDependency("GENERATE_RTF");
04060   cs = addString(
04061                     "RTF_EXTENSIONS_FILE",
04062                     "Set optional variables used in the generation of an rtf document. \n"
04063                     "Syntax is similar to doxygen's config file.\n"
04064                 );                  
04065   cs->setWidgetType(ConfigString::File);
04066   cs->addDependency("GENERATE_RTF");
04067 
04068   //-----------------------------------------------------------------------------------------------
04069   addInfo(  "Man","configuration options related to the man page output");
04070   //-----------------------------------------------------------------------------------------------
04071   cb = addBool(
04072                     "GENERATE_MAN",
04073                     "If the GENERATE_MAN tag is set to YES (the default) Doxygen will \n"
04074                     "generate man pages \n",
04075                     FALSE
04076                    );
04077   cs = addString(
04078                     "MAN_OUTPUT",
04079                     "The MAN_OUTPUT tag is used to specify where the man pages will be put. \n"
04080                     "If a relative path is entered the value of OUTPUT_DIRECTORY will be \n"
04081                     "put in front of it. If left blank `man' will be used as the default path. \n"
04082                    );
04083   cs->setDefaultValue("man");
04084   cs->setWidgetType(ConfigString::Dir);
04085   cs->addDependency("GENERATE_MAN");
04086   cs = addString(
04087                     "MAN_EXTENSION",
04088                     "The MAN_EXTENSION tag determines the extension that is added to \n"
04089                     "the generated man pages (default is the subroutine's section .3) \n"
04090                    );
04091   cs->setDefaultValue(".3");
04092   cs->addDependency("GENERATE_MAN");
04093   cb = addBool(
04094                     "MAN_LINKS",
04095                     "If the MAN_LINKS tag is set to YES and Doxygen generates man output, \n"
04096                     "then it will generate one additional man file for each entity \n"
04097                     "documented in the real man page(s). These additional files \n"
04098                     "only source the real man page, but without them the man command \n"
04099                     "would be unable to find the correct page. The default is NO. \n",
04100                     FALSE
04101                    );
04102   cb->addDependency("GENERATE_MAN");
04103   //-----------------------------------------------------------------------------------------------
04104   addInfo(  "XML","configuration options related to the XML output");
04105   //-----------------------------------------------------------------------------------------------
04106   cb = addBool(  
04107                     "GENERATE_XML",
04108                     "If the GENERATE_XML tag is set to YES Doxygen will \n"
04109                     "generate an XML file that captures the structure of \n"
04110                     "the code including all documentation. \n",
04111             FALSE
04112                  );
04113   cs = addString(
04114                     "XML_OUTPUT",
04115                     "The XML_OUTPUT tag is used to specify where the XML pages will be put. \n"
04116                     "If a relative path is entered the value of OUTPUT_DIRECTORY will be \n"
04117                     "put in front of it. If left blank `xml' will be used as the default path. \n"
04118                    );
04119   cs->setDefaultValue("xml");
04120   cs->setWidgetType(ConfigString::Dir);
04121   cs->addDependency("GENERATE_XML");
04122   cs = addString(
04123                     "XML_SCHEMA",
04124             "The XML_SCHEMA tag can be used to specify an XML schema, \n"
04125             "which can be used by a validating XML parser to check the \n"
04126             "syntax of the XML files. \n"
04127                  );
04128   cs->addDependency("GENERATE_XML");
04129   cs = addString(
04130                     "XML_DTD",
04131             "The XML_DTD tag can be used to specify an XML DTD, \n"
04132             "which can be used by a validating XML parser to check the \n"
04133             "syntax of the XML files. \n"
04134                  );
04135   cs->addDependency("GENERATE_XML");
04136   cb = addBool(
04137                     "XML_PROGRAMLISTING",
04138                     "If the XML_PROGRAMLISTING tag is set to YES Doxygen will \n"
04139                     "dump the program listings (including syntax highlighting \n"
04140             "and cross-referencing information) to the XML output. Note that \n"
04141             "enabling this will significantly increase the size of the XML output. \n",
04142                     TRUE
04143                  );
04144   cb->addDependency("GENERATE_XML");
04145 
04146   //--------------------------------------------------------------------------
04147   addInfo(  "DEF","configuration options for the AutoGen Definitions output");
04148   //--------------------------------------------------------------------------
04149   cb = addBool("GENERATE_AUTOGEN_DEF",
04150 
04151                "If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will \n"
04152                "generate an AutoGen Definitions (see autogen.sf.net) file \n"
04153            "that captures the structure of the code including all \n"
04154            "documentation. Note that this feature is still experimental \n"
04155            "and incomplete at the moment. \n",
04156 
04157                FALSE );
04158   //-----------------------------------------------------------------------------------------------
04159   addInfo(  "PerlMod","configuration options related to the Perl module output");
04160   //-----------------------------------------------------------------------------------------------
04161   cb = addBool(  
04162                     "GENERATE_PERLMOD",
04163                     "If the GENERATE_PERLMOD tag is set to YES Doxygen will \n"
04164                     "generate a Perl module file that captures the structure of \n"
04165                     "the code including all documentation. Note that this \n"
04166             "feature is still experimental and incomplete at the \n"
04167             "moment. \n",
04168             FALSE
04169                  );
04170   cb = addBool(  
04171                     "PERLMOD_LATEX",
04172                     "If the PERLMOD_LATEX tag is set to YES Doxygen will generate \n"
04173                     "the necessary Makefile rules, Perl scripts and LaTeX code to be able \n"
04174             "to generate PDF and DVI output from the Perl module output. \n",
04175             FALSE
04176                  );
04177   cb->addDependency("GENERATE_PERLMOD");
04178   cb = addBool(  
04179                     "PERLMOD_PRETTY",
04180                     "If the PERLMOD_PRETTY tag is set to YES the Perl module output will be \n"
04181             "nicely formatted so it can be parsed by a human reader.  This is useful \n"
04182             "if you want to understand what is going on.  On the other hand, if this \n"
04183             "tag is set to NO the size of the Perl module output will be much smaller \n"
04184             "and Perl will parse it just the same. \n",
04185             TRUE
04186                  );
04187   cb->addDependency("GENERATE_PERLMOD");
04188   cs = addString(  
04189                     "PERLMOD_MAKEVAR_PREFIX",
04190                     "The names of the make variables in the generated doxyrules.make file \n"
04191                     "are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. \n"
04192             "This is useful so different doxyrules.make files included by the same \n"
04193             "Makefile do not overwrite each other's variables."
04194                  );
04195   cs->addDependency("GENERATE_PERLMOD");
04196 
04197   //-----------------------------------------------------------------------------------------------
04198   addInfo(  "Preprocessor","Configuration options related to the preprocessor   ");
04199   //-----------------------------------------------------------------------------------------------
04200   cb = addBool(
04201                     "ENABLE_PREPROCESSING",
04202                     "If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will \n"
04203                     "evaluate all C-preprocessor directives found in the sources and include \n"
04204                     "files. \n",
04205                     TRUE
04206                  );
04207   cb = addBool(
04208                     "MACRO_EXPANSION",
04209                     "If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro \n"
04210                     "names in the source code. If set to NO (the default) only conditional \n"
04211                     "compilation will be performed. Macro expansion can be done in a controlled \n"
04212                     "way by setting EXPAND_ONLY_PREDEF to YES. \n",
04213                     FALSE
04214                  );
04215   cb->addDependency("ENABLE_PREPROCESSING");
04216   cb = addBool(
04217                     "EXPAND_ONLY_PREDEF",
04218                     "If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES \n"
04219                     "then the macro expansion is limited to the macros specified with the \n"
04220                     "PREDEFINED and EXPAND_AS_PREDEFINED tags. \n",
04221                     FALSE
04222                  );
04223   cb->addDependency("ENABLE_PREPROCESSING");
04224   cb = addBool(
04225                     "SEARCH_INCLUDES",
04226                     "If the SEARCH_INCLUDES tag is set to YES (the default) the includes files \n"
04227                     "in the INCLUDE_PATH (see below) will be search if a #include is found. \n",
04228                     TRUE
04229                  );
04230   cb->addDependency("ENABLE_PREPROCESSING");
04231   cl = addList(
04232                     "INCLUDE_PATH",
04233                     "The INCLUDE_PATH tag can be used to specify one or more directories that \n"
04234                     "contain include files that are not input files but should be processed by \n"
04235                     "the preprocessor.\n"
04236                  );
04237   cl->setWidgetType(ConfigList::Dir);
04238   cl->addDependency("ENABLE_PREPROCESSING");
04239   cl = addList(
04240                     "INCLUDE_FILE_PATTERNS",
04241                     "You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard \n"
04242                     "patterns (like *.h and *.hpp) to filter out the header-files in the \n"
04243                     "directories. If left blank, the patterns specified with FILE_PATTERNS will \n"
04244                     "be used. \n"
04245                  );
04246   cl->addDependency("ENABLE_PREPROCESSING");
04247   cl = addList(
04248                     "PREDEFINED",
04249                     "The PREDEFINED tag can be used to specify one or more macro names that \n"
04250                     "are defined before the preprocessor is started (similar to the -D option of \n"
04251                     "gcc). The argument of the tag is a list of macros of the form: name \n"
04252                     "or name=definition (no spaces). If the definition and the = are \n"
04253                     "omitted =1 is assumed. \n"
04254                  );
04255   cl->addDependency("ENABLE_PREPROCESSING");
04256   cl = addList(
04257                     "EXPAND_AS_DEFINED",
04258                     "If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then \n"
04259                     "this tag can be used to specify a list of macro names that should be expanded. \n"
04260                     "The macro definition that is found in the sources will be used. \n"
04261                     "Use the PREDEFINED tag if you want to use a different macro definition. \n" 
04262                  );
04263   cl->addDependency("ENABLE_PREPROCESSING");
04264   cb = addBool(
04265                     "SKIP_FUNCTION_MACROS",
04266                     "If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then \n"
04267             "doxygen's preprocessor will remove all function-like macros that are alone \n"
04268             "on a line, have an all uppercase name, and do not end with a semicolon. Such \n"
04269             "function macros are typically used for boiler-plate code, and will confuse the \n"
04270             "parser if not removed. \n",
04271                     TRUE
04272                  );
04273   cb->addDependency("ENABLE_PREPROCESSING");
04274   //-----------------------------------------------------------------------------------------------
04275   addInfo(  "External","Configuration::additions related to external references   ");
04276   //-----------------------------------------------------------------------------------------------
04277   cl = addList(
04278                     "TAGFILES",
04279                     "The TAGFILES option can be used to specify one or more tagfiles. \n"
04280             "Optionally an initial location of the external documentation \n"
04281             "can be added for each tagfile. The format of a tag file without \n"
04282             "this location is as follows: \n"
04283             "  TAGFILES = file1 file2 ... \n" 
04284             "Adding location for the tag files is done as follows: \n"
04285             "  TAGFILES = file1=loc1 \"file2 = loc2\" ... \n"
04286                 "where \"loc1\" and \"loc2\" can be relative or absolute paths or \n"
04287             "URLs. If a location is present for each tag, the installdox tool \n"
04288             "does not have to be run to correct the links.\n"
04289             "Note that each tag file must have a unique name\n"
04290             "(where the name does NOT include the path)\n"
04291                 "If a tag file is not located in the directory in which doxygen \n"
04292                 "is run, you must also specify the path to the tagfile here. \n"
04293                );
04294   cl->setWidgetType(ConfigList::File);
04295   cs = addString(
04296                     "GENERATE_TAGFILE",
04297                     "When a file name is specified after GENERATE_TAGFILE, doxygen will create \n"
04298                     "a tag file that is based on the input files it reads. \n"
04299                    );
04300   cs->setWidgetType(ConfigString::File);
04301   cb = addBool(
04302                     "ALLEXTERNALS",
04303                     "If the ALLEXTERNALS tag is set to YES all external classes will be listed \n"
04304                     "in the class index. If set to NO only the inherited external classes \n"
04305                     "will be listed. \n",
04306                     FALSE
04307                  );
04308   cb = addBool(
04309                     "EXTERNAL_GROUPS",
04310                     "If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed \n"
04311                     "in the modules index. If set to NO, only the current project's groups will \n"
04312                     "be listed. \n",
04313                     TRUE
04314                  );
04315   cs = addString(
04316                     "PERL_PATH",
04317                     "The PERL_PATH should be the absolute path and name of the perl script \n"
04318                     "interpreter (i.e. the result of `which perl'). \n"
04319                    );
04320   cs->setDefaultValue("/usr/bin/perl");
04321   cs->setWidgetType(ConfigString::Dir);
04322 
04323   //-----------------------------------------------------------------------------------------------
04324   addInfo(  "Dot","Configuration options related to the dot tool   ");
04325   //-----------------------------------------------------------------------------------------------
04326   cb = addBool(
04327                     "CLASS_DIAGRAMS",
04328                     "If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will \n"
04329                     "generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or \n"
04330                     "super classes. Setting the tag to NO turns the diagrams off. Note that this \n"
04331             "option is superseded by the HAVE_DOT option below. This is only a fallback. It is \n"
04332             "recommended to install and use dot, since it yields more powerful graphs. \n",
04333                     TRUE
04334                  );
04335   cb = addBool(
04336                     "HIDE_UNDOC_RELATIONS",
04337             "If set to YES, the inheritance and collaboration graphs will hide \n"
04338             "inheritance and usage relations if the target is undocumented \n"
04339             "or is not a class. \n",
04340                     TRUE
04341                  );
04342   cb = addBool(
04343                     "HAVE_DOT",
04344                     "If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is \n"
04345                     "available from the path. This tool is part of Graphviz, a graph visualization \n"
04346                     "toolkit from AT&T and Lucent Bell Labs. The other options in this section \n"
04347                     "have no effect if this option is set to NO (the default) \n",
04348                     FALSE
04349                  );
04350   cb = addBool(
04351                     "CLASS_GRAPH",
04352                     "If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen \n"
04353                     "will generate a graph for each documented class showing the direct and \n"
04354                     "indirect inheritance relations. Setting this tag to YES will force the \n"
04355                     "the CLASS_DIAGRAMS tag to NO.\n",
04356                     TRUE
04357                  );
04358   cb->addDependency("HAVE_DOT");
04359   cb = addBool(
04360                     "COLLABORATION_GRAPH",
04361                     "If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen \n"
04362                     "will generate a graph for each documented class showing the direct and \n"
04363                     "indirect implementation dependencies (inheritance, containment, and \n"
04364                     "class references variables) of the class with other documented classes. \n",
04365                     TRUE
04366                  );
04367   cb->addDependency("HAVE_DOT");
04368   cb = addBool(
04369                     "UML_LOOK",
04370                     "If the UML_LOOK tag is set to YES doxygen will generate inheritance and \n"
04371                 "collaboration diagrams in a style similar to the OMG's Unified Modeling \n"
04372             "Language. \n",
04373                 FALSE
04374           );
04375   cb->addDependency("HAVE_DOT");
04376   cb = addBool(
04377                     "TEMPLATE_RELATIONS",
04378             "If set to YES, the inheritance and collaboration graphs will show the \n"
04379             "relations between templates and their instances. \n",
04380                     FALSE
04381                  );
04382   cb->addDependency("HAVE_DOT");
04383   cb = addBool(
04384                     "INCLUDE_GRAPH",
04385                     "If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT \n"
04386                     "tags are set to YES then doxygen will generate a graph for each documented \n"
04387                     "file showing the direct and indirect include dependencies of the file with \n"
04388                     "other documented files. \n",
04389                     TRUE
04390                  );
04391   cb->addDependency("HAVE_DOT");
04392   cb = addBool(
04393                     "INCLUDED_BY_GRAPH",
04394                     "If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and \n"
04395                     "HAVE_DOT tags are set to YES then doxygen will generate a graph for each \n"
04396                     "documented header file showing the documented files that directly or \n"
04397                     "indirectly include this file. \n",
04398                     TRUE
04399                  );
04400   cb->addDependency("HAVE_DOT");
04401   cb = addBool(
04402                     "CALL_GRAPH",
04403                     "If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will \n"
04404             "generate a call dependency graph for every global function or class method. \n"
04405                     "Note that enabling this option will significantly increase the time of a run. \n"
04406             "So in most cases it will be better to enable call graphs for selected \n"
04407             "functions only using the \\callgraph command.\n",
04408                     FALSE
04409                  );
04410   cb->addDependency("HAVE_DOT");
04411   cb = addBool(
04412                     "GRAPHICAL_HIERARCHY",
04413                     "If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen \n"
04414                     "will graphical hierarchy of all classes instead of a textual one. \n",
04415                     TRUE
04416                  );
04417   cb->addDependency("HAVE_DOT");
04418   ce = addEnum(
04419                     "DOT_IMAGE_FORMAT",
04420                     "The DOT_IMAGE_FORMAT tag can be used to set the image format of the images \n"
04421             "generated by dot. Possible values are png, jpg, or gif\n"
04422                     "If left blank png will be used. \n",
04423                     "png"
04424                    );
04425   ce->addValue("png");
04426   ce->addValue("jpg");
04427   ce->addValue("gif");
04428   ce->addDependency("HAVE_DOT");
04429   cs = addString(
04430                     "DOT_PATH",
04431                     "The tag DOT_PATH can be used to specify the path where the dot tool can be \n"
04432                     "found. If left blank, it is assumed the dot tool can be found on the path. \n"
04433                    );
04434   cs->setWidgetType(ConfigString::Dir);
04435   cs->addDependency("HAVE_DOT");
04436   cl = addList(
04437                     "DOTFILE_DIRS",
04438                     "The DOTFILE_DIRS tag can be used to specify one or more directories that \n"
04439             "contain dot files that are included in the documentation (see the \n"
04440                     "\\dotfile command). \n"
04441                  );
04442   cl->setWidgetType(ConfigList::Dir);
04443   cl->addDependency("HAVE_DOT");
04444   ci = addInt(
04445                     "MAX_DOT_GRAPH_WIDTH",
04446                     "The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width \n"
04447                     "(in pixels) of the graphs generated by dot. If a graph becomes larger than \n"
04448                     "this value, doxygen will try to truncate the graph, so that it fits within \n"
04449                     "the specified constraint. Beware that most browsers cannot cope with very \n"
04450                     "large images. \n",
04451                     100,30000, 1024
04452                 );
04453   ci->addDependency("HAVE_DOT");
04454   ci = addInt(
04455                     "MAX_DOT_GRAPH_HEIGHT",
04456                     "The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height \n"
04457                     "(in pixels) of the graphs generated by dot. If a graph becomes larger than \n"
04458                     "this value, doxygen will try to truncate the graph, so that it fits within \n"
04459                     "the specified constraint. Beware that most browsers cannot cope with very \n"
04460                     "large images. \n",
04461                     100,30000,1024
04462                 );
04463   ci = addInt(
04464                     "MAX_DOT_GRAPH_DEPTH",
04465                     "The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the \n"
04466                     "graphs generated by dot. A depth value of 3 means that only nodes reachable \n"
04467                     "from the root by following a path via at most 3 edges will be shown. Nodes that \n"
04468             "lay further from the root node will be omitted. Note that setting this option to \n"
04469             "1 or 2 may greatly reduce the computation time needed for large code bases. Also \n"
04470             "note that a graph may be further truncated if the graph's image dimensions are \n"
04471             "not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). \n"
04472             "If 0 is used for the depth value (the default), the graph is not depth-constrained. \n",
04473                     0,1000,0
04474                 );
04475   ci->addDependency("HAVE_DOT");
04476   cb = addBool(
04477                     "GENERATE_LEGEND",
04478                     "If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will \n"
04479                     "generate a legend page explaining the meaning of the various boxes and \n"
04480                     "arrows in the dot generated graphs. \n",
04481                     TRUE
04482                  );
04483   cb->addDependency("HAVE_DOT");
04484   cb = addBool(
04485                     "DOT_CLEANUP",
04486                     "If the DOT_CLEANUP tag is set to YES (the default) Doxygen will \n"
04487                     "remove the intermediate dot files that are used to generate \n"
04488                     "the various graphs. \n",
04489                     TRUE
04490                  );
04491   cb->addDependency("HAVE_DOT");
04492 
04493   //-----------------------------------------------------------------------------------------------
04494   addInfo(  "Search","Configuration::additions related to the search engine   ");
04495   //-----------------------------------------------------------------------------------------------
04496   cb = addBool(
04497                     "SEARCHENGINE",
04498                     "The SEARCHENGINE tag specifies whether or not a search engine should be \n"
04499                     "used. If set to NO the values of all tags below this one will be ignored. \n",
04500                     FALSE
04501                  );
04502   addObsolete("CGI_NAME");
04503   addObsolete("CGI_URL");
04504   addObsolete("DOC_URL");
04505   addObsolete("DOC_ABSPATH");
04506   addObsolete("BIN_ABSPATH");
04507   addObsolete("EXT_DOC_PATHS");
04508 
04509   // The IMAGE_PATTERNS tag is now officially obsolete.
04510 }
04511 
04512 static QCString configFileToString(const char *name)
04513 {
04514   if (name==0 || name[0]==0) return 0;
04515   QFile f;
04516 
04517   bool fileOpened=FALSE;
04518   if (name[0]=='-' && name[1]==0) // read from stdin
04519   {
04520     fileOpened=f.open(IO_ReadOnly,stdin);
04521     if (fileOpened)
04522     {
04523       const int bSize=4096;
04524       QCString contents(bSize);
04525       int totalSize=0;
04526       int size;
04527       while ((size=f.readBlock(contents.data()+totalSize,bSize))==bSize)
04528       {
04529         totalSize+=bSize;
04530         contents.resize(totalSize+bSize); 
04531       }
04532       totalSize+=size+2;
04533       contents.resize(totalSize);
04534       contents.at(totalSize-2)='\n'; // to help the scanner
04535       contents.at(totalSize-1)='\0';
04536       return contents;
04537     }
04538   }
04539   else // read from file
04540   {
04541     QFileInfo fi(name);
04542     if (!fi.exists() || !fi.isFile())
04543     {
04544       config_err("Error: file `%s' not found\n",name);
04545       return "";
04546     }
04547       f.setName(name);
04548       fileOpened=f.open(IO_ReadOnly);
04549       if (fileOpened)
04550       {
04551         int fsize=f.size();
04552         QCString contents(fsize+2);
04553         f.readBlock(contents.data(),fsize);
04554         if (fsize==0 || contents[fsize-1]=='\n') 
04555           contents[fsize]='\0';
04556         else
04557           contents[fsize]='\n'; // to help the scanner
04558         contents[fsize+1]='\0';
04559         f.close();
04560         return contents;
04561       }
04562   }
04563   if (!fileOpened)  
04564   {
04565     config_err("Error: cannot open file `%s' for reading\n",name);
04566   }
04567   return "";
04568 }
04569 
04570 
04571 bool Config::parse(const char *fn)
04572 {
04573   QCString contents = configFileToString(fn);
04574   config = Config::instance();
04575   inputString   = contents.data();
04576   inputPosition = 0;
04577   yyLineNr      = 1;
04578   yyFileName=fn;
04579   includeStack.setAutoDelete(TRUE);
04580   includeStack.clear();
04581   includeDepth  = 0;
04582   configYYrestart( configYYin );
04583   BEGIN( Start );
04584   configYYlex();
04585   inputString = 0;
04586   return TRUE;
04587 }
04588 
04589 extern "C" { // some bogus code to keep the compiler happy
04590   //int  configYYwrap() { return 1 ; }
04591 }
KDE Logo
This file is part of the documentation for KDevelop Version 3.1.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Tue Feb 22 09:22:40 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003