config.cpp

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



Generated on Mon Mar 31 10:58:33 2008 by  doxygen 1.5.1