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