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
void Config::check()
02571 {
02572
02573
02574
02575
02576
02577
QCString &warnFormat =
Config_getString(
"WARN_FORMAT");
02578
if (warnFormat.isEmpty())
02579 {
02580 warnFormat=
"$file:$line $text";
02581 }
02582
else
02583 {
02584
if (warnFormat.find(
"$file")==-1)
02585 {
02586
config_err(
"Error: warning format does not contain a $file tag!\n");
02587 exit(1);
02588 }
02589
if (warnFormat.find(
"$line")==-1)
02590 {
02591
config_err(
"Error: warning format does not contain a $line tag!\n");
02592 exit(1);
02593 }
02594
if (warnFormat.find(
"$text")==-1)
02595 {
02596
config_err(
"Error: wanring format foes not contain a $text tag!\n");
02597 exit(1);
02598 }
02599 }
02600
02601
QCString &manExtension =
Config_getString(
"MAN_EXTENSION");
02602
02603
02604
if (manExtension.isEmpty())
02605 {
02606 manExtension=
".3";
02607 }
02608
02609
QCString &paperType =
Config_getEnum(
"PAPER_TYPE");
02610 paperType=paperType.lower().stripWhiteSpace();
02611
if (paperType.isEmpty())
02612 {
02613 paperType =
"a4wide";
02614 }
02615
if (paperType!=
"a4" && paperType!=
"a4wide" && paperType!=
"letter" &&
02616 paperType!=
"legal" && paperType!=
"executive")
02617 {
02618
config_err(
"Error: Unknown page type specified");
02619 }
02620
02621
QCString &outputLanguage=
Config_getEnum(
"OUTPUT_LANGUAGE");
02622 outputLanguage=outputLanguage.stripWhiteSpace();
02623
if (outputLanguage.isEmpty())
02624 {
02625 outputLanguage =
"English";
02626 }
02627
02628
QCString &htmlFileExtension=
Config_getString(
"HTML_FILE_EXTENSION");
02629 htmlFileExtension=htmlFileExtension.stripWhiteSpace();
02630
if (htmlFileExtension.isEmpty())
02631 {
02632 htmlFileExtension =
".html";
02633 }
02634
02635
02636
QStrList &stripFromPath =
Config_getList(
"STRIP_FROM_PATH");
02637
char *sfp = stripFromPath.first();
02638
if (sfp==0)
02639 {
02640 stripFromPath.append(QFile::encodeName(QDir::currentDirPath()+
"/"));
02641 }
02642
else
02643 {
02644
while (sfp)
02645 {
02646
register char *p = sfp;
02647
if (p)
02648 {
02649
char c;
02650
while ((c=*p))
02651 {
02652
if (c==
'\\') *p=
'/';
02653 p++;
02654 }
02655 }
02656
QCString path = sfp;
02657
if (path.at(0)!=
'/' && (path.length()<=2 || path.at(1)!=
':'))
02658 {
02659
QFileInfo fi(path);
02660
if (fi.exists() && fi.isDir())
02661 {
02662
int i = stripFromPath.at();
02663 stripFromPath.remove();
02664
if (stripFromPath.at()==i)
02665 stripFromPath.insert(i,QFile::encodeName(fi.absFilePath()+
"/"));
02666
else
02667 stripFromPath.append(QFile::encodeName(fi.absFilePath()+
"/"));
02668 }
02669 }
02670 sfp = stripFromPath.next();
02671 }
02672 }
02673
02674
02675
02676
QCString &headerFile =
Config_getString(
"HTML_HEADER");
02677
if (!headerFile.isEmpty())
02678 {
02679
QFileInfo fi(headerFile);
02680
if (!fi.exists())
02681 {
02682
config_err(
"Error: tag HTML_HEADER: header file `%s' "
02683
"does not exist\n",headerFile.data());
02684 exit(1);
02685 }
02686 }
02687
02688
QCString &footerFile =
Config_getString(
"HTML_FOOTER");
02689
if (!footerFile.isEmpty())
02690 {
02691
QFileInfo fi(footerFile);
02692
if (!fi.exists())
02693 {
02694
config_err(
"Error: tag HTML_FOOTER: footer file `%s' "
02695
"does not exist\n",footerFile.data());
02696 exit(1);
02697 }
02698 }
02699
02700
QCString &latexHeaderFile =
Config_getString(
"LATEX_HEADER");
02701
if (!latexHeaderFile.isEmpty())
02702 {
02703
QFileInfo fi(latexHeaderFile);
02704
if (!fi.exists())
02705 {
02706
config_err(
"Error: tag LATEX_HEADER: header file `%s' "
02707
"does not exist\n",latexHeaderFile.data());
02708 exit(1);
02709 }
02710 }
02711
02712
QStrList &includePath =
Config_getList(
"INCLUDE_PATH");
02713
char *
s=includePath.first();
02714
while (
s)
02715 {
02716
QFileInfo fi(s);
02717
if (!fi.exists())
config_err(
"Warning: tag INCLUDE_PATH: include path `%s' "
02718
"does not exist\n",s);
02719
s=includePath.next();
02720 }
02721
02722
02723
QStrList &aliasList =
Config_getList(
"ALIASES");
02724
s=aliasList.first();
02725
while (
s)
02726 {
02727
QRegExp re(
"[a-z_A-Z][a-z_A-Z0-9]*[ \t]*=");
02728
QCString alias=
s;
02729 alias=alias.stripWhiteSpace();
02730
if (alias.find(re)!=0)
02731 {
02732
config_err(
"Illegal alias format `%s'. Use \"name=value\"\n",alias.data());
02733 }
02734
s=aliasList.next();
02735 }
02736
02737
02738
QCString &dotImageFormat=
Config_getEnum(
"DOT_IMAGE_FORMAT");
02739 dotImageFormat=dotImageFormat.stripWhiteSpace();
02740
if (dotImageFormat.isEmpty())
02741 {
02742 dotImageFormat =
"png";
02743 }
02744
else if (dotImageFormat!=
"gif" && dotImageFormat!=
"png" && dotImageFormat!=
"jpg")
02745 {
02746
config_err(
"Invalid value for DOT_IMAGE_FORMAT: `%s'. Using the default.\n",dotImageFormat.data());
02747 dotImageFormat =
"png";
02748 }
02749
02750
02751
02752
QCString &dotPath =
Config_getString(
"DOT_PATH");
02753
if (!dotPath.isEmpty())
02754 {
02755
if (dotPath.find(
'\\')!=-1)
02756 {
02757
if (dotPath.at(dotPath.length()-1)!=
'\\')
02758 {
02759 dotPath+=
'\\';
02760 }
02761 }
02762
else if (dotPath.find(
'/')!=-1)
02763 {
02764
if (dotPath.at(dotPath.length()-1)!=
'/')
02765 {
02766 dotPath+=
'/';
02767 }
02768 }
02769
#if defined(_WIN32)
02770
QFileInfo dp(dotPath+
"dot.exe");
02771
#else
02772
QFileInfo dp(dotPath+
"dot");
02773
#endif
02774
if (!dp.exists() || !dp.isFile())
02775 {
02776
config_err(
"Warning: the dot tool could not be found at %s\n",dotPath.data());
02777 dotPath=
"";
02778 }
02779
else
02780 {
02781 dotPath=QFile::encodeName( dp.dirPath(TRUE)+
"/" );
02782
#if defined(_WIN32) // convert slashes
02783
uint i=0,
l=dotPath.length();
02784
for (i=0;i<
l;i++)
if (dotPath.at(i)==
'/') dotPath.at(i)=
'\\';
02785
#endif
02786
}
02787 }
02788
else
02789 {
02790 dotPath=
"";
02791 }
02792
02793
02794
QStrList &inputSources=
Config_getList(
"INPUT");
02795
if (inputSources.count()==0)
02796 {
02797
02798 inputSources.append(QFile::encodeName( QDir::currentDirPath() ));
02799 }
02800
else
02801 {
02802
s=inputSources.first();
02803
while (
s)
02804 {
02805
QFileInfo fi(s);
02806
if (!fi.exists())
02807 {
02808
config_err(
"Error: tag INPUT: input source `%s' does not exist\n",s);
02809 exit(1);
02810 }
02811
s=inputSources.next();
02812 }
02813 }
02814
02815
02816
QStrList &filePatternList =
Config_getList(
"FILE_PATTERNS");
02817
if (filePatternList.isEmpty())
02818 {
02819 filePatternList.append(
"*.c");
02820 filePatternList.append(
"*.cc");
02821 filePatternList.append(
"*.cxx");
02822 filePatternList.append(
"*.cpp");
02823 filePatternList.append(
"*.c++");
02824 filePatternList.append(
"*.java");
02825 filePatternList.append(
"*.ii");
02826 filePatternList.append(
"*.ixx");
02827 filePatternList.append(
"*.ipp");
02828 filePatternList.append(
"*.i++");
02829 filePatternList.append(
"*.inl");
02830 filePatternList.append(
"*.h");
02831 filePatternList.append(
"*.hh");
02832 filePatternList.append(
"*.hxx");
02833 filePatternList.append(
"*.hpp");
02834 filePatternList.append(
"*.h++");
02835 filePatternList.append(
"*.idl");
02836 filePatternList.append(
"*.odl");
02837 filePatternList.append(
"*.cs");
02838 filePatternList.append(
"*.php");
02839 filePatternList.append(
"*.php3");
02840 filePatternList.append(
"*.inc");
02841 }
02842
02843
02844
QStrList &examplePatternList =
Config_getList(
"EXAMPLE_PATTERNS");
02845
if (examplePatternList.isEmpty())
02846 {
02847 examplePatternList.append(
"*");
02848 }
02849
02850
02851
02852
02853
02854
02855
02856
02857
02858
02859
02860
02861
02862
02863
02864
02865
02866
02867
02868
02869
02870
02871
02872
02873
02874
02875
02876
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
#undef PUTENV
02958
#undef SEP
02959
#if defined(_WIN32) && !defined(__GNUC__) && (__BORLANDC__ < 0x0550)
02960
#define PUTENV _putenv
02961
#define SEP ";"
02962
#else
02963
#define PUTENV putenv
02964
#define SEP ":"
02965
#endif
02966
if (
Config_getBool(
"HAVE_DOT"))
02967 {
02968
char *curFontPath = getenv(
"DOTFONTPATH");
02969
int l=curFontPath ? strlen(curFontPath)+1 : 0;
02970
static char *buf = 0;
02971 buf = (
char *)realloc(buf,strlen(
"DOTFONTPATH=.")+l+1);
02972 strcpy(buf,
"DOTFONTPATH=.");
02973
if (
l>0)
02974 {
02975 strcat(buf,SEP);
02976 strcat(buf,curFontPath);
02977 }
02978
PUTENV(buf);
02979 }
02980
02981
int &depth =
Config_getInt(
"MAX_DOT_GRAPH_DEPTH");
02982
if (depth==0)
02983 {
02984 depth=1000;
02985 }
02986
02987
if (
Config_getBool(
"OPTIMIZE_OUTPUT_JAVA") &&
Config_getBool(
"INLINE_INFO"))
02988 {
02989
02990
02991
Config_getBool(
"INLINE_INFO")=FALSE;
02992 }
02993
02994
02995
QStrList &annotationFromBrief =
Config_getList(
"ABBREVIATE_BRIEF");
02996
if (annotationFromBrief.isEmpty())
02997 {
02998 annotationFromBrief.append(
"The $name class");
02999 annotationFromBrief.append(
"The $name widget");
03000 annotationFromBrief.append(
"The $name file");
03001 annotationFromBrief.append(
"is");
03002 annotationFromBrief.append(
"provides");
03003 annotationFromBrief.append(
"specifies");
03004 annotationFromBrief.append(
"contains");
03005 annotationFromBrief.append(
"represents");
03006 annotationFromBrief.append(
"a");
03007 annotationFromBrief.append(
"an");
03008 annotationFromBrief.append(
"the");
03009 }
03010 }
03011
03012
void Config::init()
03013 {
03014
ConfigOption *option =
m_options->first();
03015
while (option)
03016 {
03017 option->
init();
03018 option =
m_options->next();
03019 }
03020 }
03021
03022
void Config::create()
03023 {
03024
if (
m_initialized)
return;
03025
m_initialized = TRUE;
03026
03027
ConfigString *cs;
03028
ConfigEnum *ce;
03029
ConfigList *cl;
03030
ConfigInt *ci;
03031
ConfigBool *cb;
03032
03033
03034
03035
addInfo(
"Project",
"Project related configuration options");
03036
03037
03038
03039 cs =
addString(
03040
"PROJECT_NAME",
03041
"The PROJECT_NAME tag is a single word (or a sequence of words surrounded \n"
03042
"by quotes) that should identify the project. "
03043 );
03044 cs = addString(
03045
"PROJECT_NUMBER",
03046
"The PROJECT_NUMBER tag can be used to enter a project or revision number. \n"
03047
"This could be handy for archiving the generated documentation or \n"
03048
"if some version control system is used.\n"
03049 );
03050 cs = addString(
03051
"OUTPUT_DIRECTORY",
03052
"The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) \n"
03053
"base path where the generated documentation will be put. \n"
03054
"If a relative path is entered, it will be relative to the location \n"
03055
"where doxygen was started. If left blank the current directory will be used.\n"
03056 );
03057 cs->
setWidgetType(ConfigString::Dir);
03058 ce =
addEnum(
03059
"OUTPUT_LANGUAGE",
03060
"The OUTPUT_LANGUAGE tag is used to specify the language in which all \n"
03061
"documentation generated by doxygen is written. Doxygen will use this \n"
03062
"information to generate all constant output in the proper language. \n"
03063
"The default language is English, other supported languages are: \n"
03064
"Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, \n"
03065
"Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en \n"
03066
"(Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, \n"
03067
"Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.\n",
03068
"English"
03069 );
03070
#ifdef LANG_BR
03071
ce->
addValue(
"Brazilian");
03072
#endif
03073
#ifdef LANG_CA
03074
ce->
addValue(
"Catalan");
03075
#endif
03076
#ifdef LANG_CN
03077
ce->
addValue(
"Chinese");
03078
#endif
03079
#ifdef LANG_TW
03080
ce->
addValue(
"Chinese-Traditional");
03081
#endif
03082
#ifdef LANG_HR
03083
ce->
addValue(
"Croatian");
03084
#endif
03085
#ifdef LANG_CZ
03086
ce->
addValue(
"Czech");
03087
#endif
03088
#ifdef LANG_DK
03089
ce->
addValue(
"Danish");
03090
#endif
03091
#ifdef LANG_NL
03092
ce->
addValue(
"Dutch");
03093
#endif
03094
ce->
addValue(
"English");
03095
#ifdef LANG_FI
03096
ce->
addValue(
"Finnish");
03097
#endif
03098
#ifdef LANG_FR
03099
ce->
addValue(
"French");
03100
#endif
03101
#ifdef LANG_DE
03102
ce->
addValue(
"German");
03103
#endif
03104
#ifdef LANG_GR
03105
ce->
addValue(
"Greek");
03106
#endif
03107
#ifdef LANG_HU
03108
ce->
addValue(
"Hungarian");
03109
#endif
03110
#ifdef LANG_IT
03111
ce->
addValue(
"Italian");
03112
#endif
03113
#ifdef LANG_JP
03114
ce->
addValue(
"Japanese");
03115 ce->
addValue(
"Japanese-en");
03116
#endif
03117
#ifdef LANG_KR
03118
ce->
addValue(
"Korean");
03119 ce->
addValue(
"Korean-en");
03120
#endif
03121
#ifdef LANG_NO
03122
ce->
addValue(
"Norwegian");
03123
#endif
03124
#ifdef LANG_PL
03125
ce->
addValue(
"Polish");
03126
#endif
03127
#ifdef LANG_PT
03128
ce->
addValue(
"Portuguese");
03129
#endif
03130
#ifdef LANG_RO
03131
ce->
addValue(
"Romanian");
03132
#endif
03133
#ifdef LANG_RU
03134
ce->
addValue(
"Russian");
03135
#endif
03136
#ifdef LANG_SR
03137
ce->
addValue(
"Serbian");
03138
#endif
03139
#ifdef LANG_SK
03140
ce->
addValue(
"Slovak");
03141
#endif
03142
#ifdef LANG_SI
03143
ce->
addValue(
"Slovene");
03144
#endif
03145
#ifdef LANG_ES
03146
ce->
addValue(
"Spanish");
03147
#endif
03148
#ifdef LANG_SE
03149
ce->
addValue(
"Swedish");
03150
#endif
03151
#ifdef LANG_UA
03152
ce->
addValue(
"Ukrainian");
03153
#endif
03154
cb =
addBool(
03155
"USE_WINDOWS_ENCODING",
03156
"This tag can be used to specify the encoding used in the generated output. \n"
03157
"The encoding is not always determined by the language that is chosen, \n"
03158
"but also whether or not the output is meant for Windows or non-Windows users. \n"
03159
"In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES \n"
03160
"forces the Windows encoding (this is the default for the Windows binary), \n"
03161
"whereas setting the tag to NO uses a Unix-style encoding (the default for \n"
03162
"all platforms other than Windows).\n",
03163 #
if defined(_WIN32) || defined(__CYGWIN__)
03164 TRUE
03165 #
else
03166 FALSE
03167 #endif
03168 );
03169 cb = addBool(
03170
"BRIEF_MEMBER_DESC",
03171
"If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will \n"
03172
"include brief member descriptions after the members that are listed in \n"
03173
"the file and class documentation (similar to JavaDoc). \n"
03174
"Set to NO to disable this. \n",
03175 TRUE
03176 );
03177 cb = addBool(
03178
"REPEAT_BRIEF",
03179
"If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend \n"
03180
"the brief description of a member or function before the detailed description. \n"
03181
"Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the \n"
03182
"brief descriptions will be completely suppressed. \n",
03183 TRUE
03184 );
03185 cl =
addList(
03186
"ABBREVIATE_BRIEF",
03187
"This tag implements a quasi-intelligent brief description abbreviator \n"
03188
"that is used to form the text in various listings. Each string \n"
03189
"in this list, if found as the leading text of the brief description, will be \n"
03190
"stripped from the text and the result after processing the whole list, is used \n"
03191
"as the annotated text. Otherwise, the brief description is used as-is. If left \n"
03192
"blank, the following values are used (\"$name\" is automatically replaced with the \n"
03193
"name of the entity): \"The $name class\" \"The $name widget\" \"The $name file\" \n"
03194
"\"is\" \"provides\" \"specifies\" \"contains\" \"represents\" \"a\" \"an\" \"the\"\n"
03195 );
03196 cb = addBool(
03197
"ALWAYS_DETAILED_SEC",
03198
"If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then \n"
03199
"Doxygen will generate a detailed section even if there is only a brief \n"
03200
"description. \n",
03201 FALSE
03202 );
03203 cb = addBool(
03204
"INLINE_INHERITED_MEMB",
03205
"If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited \n"
03206
"members of a class in the documentation of that class as if those members were \n"
03207
"ordinary class members. Constructors, destructors and assignment operators of \n"
03208
"the base classes will not be shown. \n",
03209 FALSE
03210 );
03211 cb = addBool(
03212
"FULL_PATH_NAMES",
03213
"If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full \n"
03214
"path before files name in the file list and in the header files. If set \n"
03215
"to NO the shortest path that makes the file name unique will be used. \n",
03216 FALSE
03217 );
03218 cl = addList(
03219
"STRIP_FROM_PATH",
03220
"If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag \n"
03221
"can be used to strip a user-defined part of the path. Stripping is \n"
03222
"only done if one of the specified strings matches the left-hand part of \n"
03223
"the path. It is allowed to use relative paths in the argument list. \n"
03224
"If left blank the directory from which doxygen is run is used as the \n"
03225
"path to strip. \n"
03226 );
03227 cl->
addDependency(
"FULL_PATH_NAMES");
03228 cb = addBool(
03229
"SHORT_NAMES",
03230
"If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter \n"
03231
"(but less readable) file names. This can be useful is your file systems \n"
03232
"doesn't support long names like on DOS, Mac, or CD-ROM. \n",
03233 FALSE
03234 );
03235 cb = addBool(
03236
"JAVADOC_AUTOBRIEF",
03237
"If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen \n"
03238
"will interpret the first line (until the first dot) of a JavaDoc-style \n"
03239
"comment as the brief description. If set to NO, the JavaDoc \n"
03240
"comments will behave just like the Qt-style comments (thus requiring an \n"
03241
"explicit @brief command for a brief description. \n",
03242 FALSE
03243 );
03244 cb = addBool(
03245
"MULTILINE_CPP_IS_BRIEF",
03246
"The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen \n"
03247
"treat a multi-line C++ special comment block (i.e. a block of //! or /// \n"
03248
"comments) as a brief description. This used to be the default behaviour. \n"
03249
"The new default is to treat a multi-line C++ comment block as a detailed \n"
03250
"description. Set this tag to YES if you prefer the old behaviour instead. \n",
03251 FALSE
03252 );
03253 cb = addBool(
03254
"DETAILS_AT_TOP",
03255
"If the DETAILS_AT_TOP tag is set to YES then Doxygen \n"
03256
"will output the detailed description near the top, like JavaDoc.\n"
03257
"If set to NO, the detailed description appears after the member \n"
03258
"documentation. \n",
03259 FALSE
03260 );
03261 cb = addBool(
03262
"INHERIT_DOCS",
03263
"If the INHERIT_DOCS tag is set to YES (the default) then an undocumented \n"
03264
"member inherits the documentation from any documented member that it \n"
03265
"re-implements. \n",
03266 TRUE
03267 );
03268 cb = addBool(
03269
"DISTRIBUTE_GROUP_DOC",
03270
"If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC \n"
03271
"tag is set to YES, then doxygen will reuse the documentation of the first \n"
03272
"member in the group (if any) for the other members of the group. By default \n"
03273
"all members of a group must be documented explicitly.\n",
03274 FALSE
03275 );
03276 ci =
addInt(
03277
"TAB_SIZE",
03278
"The TAB_SIZE tag can be used to set the number of spaces in a tab. \n"
03279
"Doxygen uses this value to replace tabs by spaces in code fragments. \n",
03280 1,16,8
03281 );
03282 cl = addList(
03283
"ALIASES",
03284
"This tag can be used to specify a number of aliases that acts \n"
03285
"as commands in the documentation. An alias has the form \"name=value\". \n"
03286
"For example adding \"sideeffect=\\par Side Effects:\\n\" will allow you to \n"
03287
"put the command \\sideeffect (or @sideeffect) in the documentation, which \n"
03288
"will result in a user-defined paragraph with heading \"Side Effects:\". \n"
03289
"You can put \\n's in the value part of an alias to insert newlines. \n"
03290 );
03291 cb = addBool(
03292
"OPTIMIZE_OUTPUT_FOR_C",
03293
"Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources \n"
03294
"only. Doxygen will then generate output that is more tailored for C. \n"
03295
"For instance, some of the names that are used will be different. The list \n"
03296
"of all members will be omitted, etc. \n",
03297 FALSE
03298 );
03299 cb = addBool(
03300
"OPTIMIZE_OUTPUT_JAVA",
03301
"Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources \n"
03302
"only. Doxygen will then generate output that is more tailored for Java. \n"
03303
"For instance, namespaces will be presented as packages, qualified scopes \n"
03304
"will look different, etc. \n",
03305 FALSE
03306 );
03307 cb = addBool(
03308
"SUBGROUPING",
03309
"Set the SUBGROUPING tag to YES (the default) to allow class member groups of \n"
03310
"the same type (for instance a group of public functions) to be put as a \n"
03311
"subgroup of that type (e.g. under the Public Functions section). Set it to \n"
03312
"NO to prevent subgrouping. Alternatively, this can be done per class using \n"
03313
"the \\nosubgrouping command. \n",
03314 TRUE
03315 );
03316
03317
addInfo(
"Build",
"Build related configuration options");
03318
03319 cb = addBool(
03320
"EXTRACT_ALL",
03321
"If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in \n"
03322
"documentation are documented, even if no documentation was available. \n"
03323
"Private class members and static file members will be hidden unless \n"
03324
"the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES \n",
03325 FALSE
03326 );
03327 cb = addBool(
03328
"EXTRACT_PRIVATE",
03329
"If the EXTRACT_PRIVATE tag is set to YES all private members of a class \n"
03330
"will be included in the documentation. \n",
03331 FALSE
03332 );
03333 cb = addBool(
03334
"EXTRACT_STATIC",
03335
"If the EXTRACT_STATIC tag is set to YES all static members of a file \n"
03336
"will be included in the documentation. \n",
03337 FALSE
03338 );
03339 cb = addBool(
03340
"EXTRACT_LOCAL_CLASSES",
03341
"If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) \n"
03342
"defined locally in source files will be included in the documentation. \n"
03343
"If set to NO only classes defined in header files are included. \n",
03344 TRUE
03345 );
03346 cb = addBool(
03347
"HIDE_UNDOC_MEMBERS",
03348
"If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all \n"
03349
"undocumented members of documented classes, files or namespaces. \n"
03350
"If set to NO (the default) these members will be included in the \n"
03351
"various overviews, but no documentation section is generated. \n"
03352
"This option has no effect if EXTRACT_ALL is enabled. \n",
03353 FALSE
03354 );
03355 cb = addBool(
03356
"HIDE_UNDOC_CLASSES",
03357
"If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all \n"
03358
"undocumented classes that are normally visible in the class hierarchy. \n"
03359
"If set to NO (the default) these classes will be included in the various \n"
03360
"overviews. This option has no effect if EXTRACT_ALL is enabled. \n",
03361 FALSE
03362 );
03363 cb = addBool(
03364
"HIDE_FRIEND_COMPOUNDS",
03365
"If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all \n"
03366
"friend (class|struct|union) declarations. \n"
03367
"If set to NO (the default) these declarations will be included in the \n"
03368
"documentation. \n",
03369 FALSE
03370 );
03371 cb = addBool(
03372
"HIDE_IN_BODY_DOCS",
03373
"If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any \n"
03374
"documentation blocks found inside the body of a function. \n"
03375
"If set to NO (the default) these blocks will be appended to the \n"
03376
"function's detailed documentation block. \n",
03377 FALSE
03378 );
03379 cb = addBool(
03380
"INTERNAL_DOCS",
03381
"The INTERNAL_DOCS tag determines if documentation \n"
03382
"that is typed after a \\internal command is included. If the tag is set \n"
03383
"to NO (the default) then the documentation will be excluded. \n"
03384
"Set it to YES to include the internal documentation. \n",
03385 FALSE
03386 );
03387 cb = addBool(
03388
"CASE_SENSE_NAMES",
03389
"If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate \n"
03390
"file names in lower-case letters. If set to YES upper-case letters are also \n"
03391
"allowed. This is useful if you have classes or files whose names only differ \n"
03392
"in case and if your file system supports case sensitive file names. Windows \n"
03393
"users are advised to set this option to NO.\n",
03394 TRUE
03395 );
03396 cb = addBool(
03397
"HIDE_SCOPE_NAMES",
03398
"If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen \n"
03399
"will show members with their full class and namespace scopes in the \n"
03400
"documentation. If set to YES the scope will be hidden. \n",
03401 FALSE
03402 );
03403 cb = addBool(
03404
"SHOW_INCLUDE_FILES",
03405
"If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen \n"
03406
"will put a list of the files that are included by a file in the documentation \n"
03407
"of that file. \n",
03408 TRUE
03409 );
03410 cb = addBool(
03411
"INLINE_INFO",
03412
"If the INLINE_INFO tag is set to YES (the default) then a tag [inline] \n"
03413
"is inserted in the documentation for inline members. \n",
03414 TRUE
03415 );
03416 cb = addBool(
03417
"SORT_MEMBER_DOCS",
03418
"If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen \n"
03419
"will sort the (detailed) documentation of file and class members \n"
03420
"alphabetically by member name. If set to NO the members will appear in \n"
03421
"declaration order. \n",
03422 TRUE
03423 );
03424 cb = addBool(
03425
"SORT_BRIEF_DOCS",
03426
"If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the \n"
03427
"brief documentation of file, namespace and class members alphabetically \n"
03428
"by member name. If set to NO (the default) the members will appear in \n"
03429
"declaration order. \n",
03430 FALSE
03431 );
03432 cb = addBool(
03433
"SORT_BY_SCOPE_NAME",
03434
"If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be \n"
03435
"sorted by fully-qualified names, including namespaces. If set to \n"
03436
"NO (the default), the class list will be sorted only by class name, \n"
03437
"not including the namespace part. \n"
03438
"Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.\n"
03439
"Note: This option applies only to the class list, not to the \n"
03440
"alphabetical list.\n",
03441 FALSE
03442 );
03443
03444 cb = addBool(
03445
"GENERATE_TODOLIST",
03446
"The GENERATE_TODOLIST tag can be used to enable (YES) or \n"
03447
"disable (NO) the todo list. This list is created by putting \\todo \n"
03448
"commands in the documentation.\n",
03449 TRUE
03450 );
03451 cb = addBool(
03452
"GENERATE_TESTLIST",
03453
"The GENERATE_TESTLIST tag can be used to enable (YES) or \n"
03454
"disable (NO) the test list. This list is created by putting \\test \n"
03455
"commands in the documentation.\n",
03456 TRUE
03457 );
03458 cb = addBool(
03459
"GENERATE_BUGLIST",
03460
"The GENERATE_BUGLIST tag can be used to enable (YES) or \n"
03461
"disable (NO) the bug list. This list is created by putting \\bug \n"
03462
"commands in the documentation.\n",
03463 TRUE
03464 );
03465 cb = addBool(
03466
"GENERATE_DEPRECATEDLIST",
03467
"The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or \n"
03468
"disable (NO) the deprecated list. This list is created by putting \n"
03469
"\\deprecated commands in the documentation.\n",
03470 TRUE
03471 );
03472 cl = addList(
03473
"ENABLED_SECTIONS",
03474
"The ENABLED_SECTIONS tag can be used to enable conditional \n"
03475
"documentation sections, marked by \\if sectionname ... \\endif. \n"
03476 );
03477 ci = addInt(
03478
"MAX_INITIALIZER_LINES",
03479
"The MAX_INITIALIZER_LINES tag determines the maximum number of lines \n"
03480
"the initial value of a variable or define consists of for it to appear in \n"
03481
"the documentation. If the initializer consists of more lines than specified \n"
03482
"here it will be hidden. Use a value of 0 to hide initializers completely. \n"
03483
"The appearance of the initializer of individual variables and defines in the \n"
03484
"documentation can be controlled using \\showinitializer or \\hideinitializer \n"
03485
"command in the documentation regardless of this setting. \n",
03486 0,10000,30
03487 );
03488 cb = addBool(
03489
"SHOW_USED_FILES",
03490
"Set the SHOW_USED_FILES tag to NO to disable the list of files generated \n"
03491
"at the bottom of the documentation of classes and structs. If set to YES the \n"
03492
"list will mention the files that were used to generate the documentation. \n",
03493 TRUE
03494 );
03495
03496
03497
addInfo(
"Messages",
"configuration options related to warning and progress messages");
03498
03499
03500 cb = addBool(
03501
"QUIET",
03502
"The QUIET tag can be used to turn on/off the messages that are generated \n"
03503
"by doxygen. Possible values are YES and NO. If left blank NO is used. \n",
03504 FALSE
03505 );
03506 cb = addBool(
03507
"WARNINGS",
03508
"The WARNINGS tag can be used to turn on/off the warning messages that are \n"
03509
"generated by doxygen. Possible values are YES and NO. If left blank \n"
03510
"NO is used. \n",
03511 TRUE
03512 );
03513 cb = addBool(
03514
"WARN_IF_UNDOCUMENTED",
03515
"If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings \n"
03516
"for undocumented members. If EXTRACT_ALL is set to YES then this flag will \n"
03517
"automatically be disabled. \n",
03518 TRUE
03519 );
03520 cb = addBool(
03521
"WARN_IF_DOC_ERROR",
03522
"If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for \n"
03523
"potential errors in the documentation, such as not documenting some \n"
03524
"parameters in a documented function, or documenting parameters that \n"
03525
"don't exist or using markup commands wrongly. \n",
03526 TRUE
03527 );
03528 cs = addString(
03529
"WARN_FORMAT",
03530
"The WARN_FORMAT tag determines the format of the warning messages that \n"
03531
"doxygen can produce. The string should contain the $file, $line, and $text \n"
03532
"tags, which will be replaced by the file and line number from which the \n"
03533
"warning originated and the warning text. \n"
03534 );
03535 cs->
setDefaultValue(
"$file:$line: $text");
03536 cs = addString(
03537
"WARN_LOGFILE",
03538
"The WARN_LOGFILE tag can be used to specify a file to which warning \n"
03539
"and error messages should be written. If left blank the output is written \n"
03540
"to stderr. \n"
03541 );
03542
03543
addInfo(
"Input",
"configuration options related to the input files");
03544
03545 cl = addList(
03546
"INPUT",
03547
"The INPUT tag can be used to specify the files and/or directories that contain \n"
03548
"documented source files. You may enter file names like \"myfile.cpp\" or \n"
03549
"directories like \"/usr/src/myproject\". Separate the files or directories \n"
03550
"with spaces. \n"
03551 );
03552 cl->
setWidgetType(ConfigList::FileAndDir);
03553 cl = addList(
03554
"FILE_PATTERNS",
03555
"If the value of the INPUT tag contains directories, you can use the \n"
03556
"FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp \n"
03557
"and *.h) to filter out the source-files in the directories. If left \n"
03558
"blank the following patterns are tested: \n"
03559
"*.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp \n"
03560
"*.h++ *.idl *.odl *.cs *.php *.php3 *.inc\n"
03561 );
03562 cb = addBool(
03563
"RECURSIVE",
03564
"The RECURSIVE tag can be used to turn specify whether or not subdirectories \n"
03565
"should be searched for input files as well. Possible values are YES and NO. \n"
03566
"If left blank NO is used. \n",
03567 FALSE
03568 );
03569 cl = addList(
03570
"EXCLUDE",
03571
"The EXCLUDE tag can be used to specify files and/or directories that should \n"
03572
"excluded from the INPUT source files. This way you can easily exclude a \n"
03573
"subdirectory from a directory tree whose root is specified with the INPUT tag. \n"
03574 );
03575 cb = addBool(
03576
"EXCLUDE_SYMLINKS",
03577
"The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories \n"
03578
"that are symbolic links (a Unix filesystem feature) are excluded from the input. \n",
03579 FALSE
03580 );
03581 cl->
setWidgetType(ConfigList::FileAndDir);
03582 cl = addList(
03583
"EXCLUDE_PATTERNS",
03584
"If the value of the INPUT tag contains directories, you can use the \n"
03585
"EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude \n"
03586
"certain files from those directories. \n"
03587 );
03588 cl = addList(
03589
"EXAMPLE_PATH",
03590
"The EXAMPLE_PATH tag can be used to specify one or more files or \n"
03591
"directories that contain example code fragments that are included (see \n"
03592
"the \\include command). \n"
03593 );
03594 cl->
setWidgetType(ConfigList::Dir);
03595 cl = addList(
03596
"EXAMPLE_PATTERNS",
03597
"If the value of the EXAMPLE_PATH tag contains directories, you can use the \n"
03598
"EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp \n"
03599
"and *.h) to filter out the source-files in the directories. If left \n"
03600
"blank all files are included. \n"
03601 );
03602 cb = addBool(
03603
"EXAMPLE_RECURSIVE",
03604
"If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be \n"
03605
"searched for input files to be used with the \\include or \\dontinclude \n"
03606
"commands irrespective of the value of the RECURSIVE tag. \n"
03607
"Possible values are YES and NO. If left blank NO is used. \n",
03608 FALSE
03609 );
03610 cl = addList(
03611
"IMAGE_PATH",
03612
"The IMAGE_PATH tag can be used to specify one or more files or \n"
03613
"directories that contain image that are included in the documentation (see \n"
03614
"the \\image command). \n"
03615 );
03616 cl->
setWidgetType(ConfigList::Dir);
03617 cs = addString(
03618
"INPUT_FILTER",
03619
"The INPUT_FILTER tag can be used to specify a program that doxygen should \n"
03620
"invoke to filter for each input file. Doxygen will invoke the filter program \n"
03621
"by executing (via popen()) the command <filter> <input-file>, where <filter> \n"
03622
"is the value of the INPUT_FILTER tag, and <input-file> is the name of an \n"
03623
"input file. Doxygen will then use the output that the filter program writes \n"
03624
"to standard output. \n"
03625 );
03626 cl->
setWidgetType(ConfigList::File);
03627 cb = addBool(
03628
"FILTER_SOURCE_FILES",
03629
"If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using \n"
03630
"INPUT_FILTER) will be used to filter the input files when producing source \n"
03631
"files to browse (i.e. when SOURCE_BROWSER is set to YES). \n",
03632 FALSE
03633 );
03634
03635
addInfo(
"Source Browser",
"configuration options related to source browsing");
03636
03637 cb = addBool(
03638
"SOURCE_BROWSER",
03639
"If the SOURCE_BROWSER tag is set to YES then a list of source files will \n"
03640
"be generated. Documented entities will be cross-referenced with these sources. \n"
03641
"Note: To get rid of all source code in the generated output, make sure also \n"
03642
"VERBATIM_HEADERS is set to NO. \n",
03643 FALSE
03644 );
03645 cb = addBool(
03646
"INLINE_SOURCES",
03647
"Setting the INLINE_SOURCES tag to YES will include the body \n"
03648
"of functions and classes directly in the documentation. \n",
03649 FALSE
03650 );
03651 cb = addBool(
03652
"STRIP_CODE_COMMENTS",
03653
"Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct \n"
03654
"doxygen to hide any special comment blocks from generated source code \n"
03655
"fragments. Normal C and C++ comments will always remain visible. \n",
03656 TRUE
03657 );
03658 cb = addBool(
"REFERENCED_BY_RELATION",
03659
"If the REFERENCED_BY_RELATION tag is set to YES (the default) \n"
03660
"then for each documented function all documented \n"
03661
"functions referencing it will be listed. \n",
03662 TRUE
03663 );
03664 cb->
addDependency(
"SOURCE_BROWSER");
03665 cb = addBool(
"REFERENCES_RELATION",
03666
"If the REFERENCES_RELATION tag is set to YES (the default) \n"
03667
"then for each documented function all documented entities \n"
03668
"called/used by that function will be listed. \n",
03669 TRUE
03670 );
03671 cb->
addDependency(
"SOURCE_BROWSER");
03672 cb = addBool(
03673
"VERBATIM_HEADERS",
03674
"If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen \n"
03675
"will generate a verbatim copy of the header file for each class for \n"
03676
"which an include is specified. Set to NO to disable this. \n",
03677 TRUE
03678 );
03679
03680
addInfo(
"Index",
"configuration options related to the alphabetical class index");
03681
03682
03683 cb = addBool(
03684
"ALPHABETICAL_INDEX",
03685
"If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index \n"
03686
"of all compounds will be generated. Enable this if the project \n"
03687
"contains a lot of classes, structs, unions or interfaces. \n",
03688 FALSE
03689 );
03690 ci = addInt(
03691
"COLS_IN_ALPHA_INDEX",
03692
"If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then \n"
03693
"the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns \n"
03694
"in which this list will be split (can be a number in the range [1..20]) \n",
03695 1,20,5
03696 );
03697 cl = addList(
03698
"IGNORE_PREFIX",
03699
"In case all classes in a project start with a common prefix, all \n"
03700
"classes will be put under the same header in the alphabetical index. \n"
03701
"The IGNORE_PREFIX tag can be used to specify one or more prefixes that \n"
03702
"should be ignored while generating the index headers. \n"
03703 );
03704
03705
addInfo(
"HTML",
"configuration options related to the HTML output");
03706
03707 cb = addBool(
03708
"GENERATE_HTML",
03709
"If the GENERATE_HTML tag is set to YES (the default) Doxygen will \n"
03710
"generate HTML output. \n",
03711 TRUE
03712 );
03713 cs = addString(
03714
"HTML_OUTPUT",
03715
"The HTML_OUTPUT tag is used to specify where the HTML docs will be put. \n"
03716
"If a relative path is entered the value of OUTPUT_DIRECTORY will be \n"
03717
"put in front of it. If left blank `html' will be used as the default path. \n"
03718 );
03719 cs->
setDefaultValue(
"html");
03720 cs->
setWidgetType(ConfigString::Dir);
03721 cs->
addDependency(
"GENERATE_HTML");
03722 cs = addString(
03723
"HTML_FILE_EXTENSION",
03724
"The HTML_FILE_EXTENSION tag can be used to specify the file extension for \n"
03725
"each generated HTML page (for example: .htm,.php,.asp). If it is left blank \n"
03726
"doxygen will generate files with .html extension.\n"
03727 );
03728 cs->
setDefaultValue(
".html");
03729 cs->
addDependency(
"GENERATE_HTML");
03730 cs = addString(
03731
"HTML_HEADER",
03732
"The HTML_HEADER tag can be used to specify a personal HTML header for \n"
03733
"each generated HTML page. If it is left blank doxygen will generate a \n"
03734
"standard header.\n"
03735 );
03736 cs->
setWidgetType(ConfigString::File);
03737 cs->
addDependency(
"GENERATE_HTML");
03738 cs = addString(
03739
"HTML_FOOTER",
03740
"The HTML_FOOTER tag can be used to specify a personal HTML footer for \n"
03741
"each generated HTML page. If it is left blank doxygen will generate a \n"
03742
"standard footer.\n"
03743 );
03744 cs->
setWidgetType(ConfigString::File);
03745 cs->
addDependency(
"GENERATE_HTML");
03746 cs = addString(
03747
"HTML_STYLESHEET",
03748
"The HTML_STYLESHEET tag can be used to specify a user-defined cascading \n"
03749
"style sheet that is used by each HTML page. It can be used to \n"
03750
"fine-tune the look of the HTML output. If the tag is left blank doxygen \n"
03751
"will generate a default style sheet. Note that doxygen will try to copy \n"
03752
"the style sheet file to the HTML output directory, so don't put your own \n"
03753
"stylesheet in the HTML output directory as well, or it will be erased! \n"
03754 );
03755 cs->
setWidgetType(ConfigString::File);
03756 cs->
addDependency(
"GENERATE_HTML");
03757 cb = addBool(
03758
"HTML_ALIGN_MEMBERS",
03759
"If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, \n"
03760
"files or namespaces will be aligned in HTML using tables. If set to \n"
03761
"NO a bullet list will be used. \n",
03762 TRUE
03763 );
03764 cb->
addDependency(
"GENERATE_HTML");
03765 cb = addBool(
03766
"GENERATE_HTMLHELP",
03767
"If the GENERATE_HTMLHELP tag is set to YES, additional index files \n"
03768
"will be generated that can be used as input for tools like the \n"
03769
"Microsoft HTML help workshop to generate a compressed HTML help file (.chm) \n"
03770
"of the generated HTML documentation. \n",
03771 FALSE
03772 );
03773 cb->
addDependency(
"GENERATE_HTML");
03774 cs = addString(
03775
"CHM_FILE",
03776
"If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can \n"
03777
"be used to specify the file name of the resulting .chm file. You \n"
03778
"can add a path in front of the file if the result should not be \n"
03779
"written to the html output directory. \n"
03780 );
03781 cs->
addDependency(
"GENERATE_HTML");
03782 cs = addString(
03783
"HHC_LOCATION",
03784
"If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can \n"
03785
"be used to specify the location (absolute path including file name) of \n"
03786
"the HTML help compiler (hhc.exe). If non-empty doxygen will try to run \n"
03787
"the HTML help compiler on the generated index.hhp.\n"
03788 );
03789 cs->
addDependency(
"GENERATE_HTML");
03790 cb = addBool(
03791
"GENERATE_CHI",
03792
"If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag \n"
03793
"controls if a separate .chi index file is generated (YES) or that \n"
03794
"it should be included in the master .chm file (NO).\n",
03795 FALSE
03796 );
03797 cb->
addDependency(
"GENERATE_HTML");
03798 cb = addBool(
03799
"BINARY_TOC",
03800
"If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag \n"
03801
"controls whether a binary table of contents is generated (YES) or a \n"
03802
"normal table of contents (NO) in the .chm file.\n",
03803 FALSE
03804 );
03805 cb->
addDependency(
"GENERATE_HTML");
03806 cb = addBool(
03807
"TOC_EXPAND",
03808
"The TOC_EXPAND flag can be set to YES to add extra items for group members \n"
03809
"to the contents of the HTML help documentation and to the tree view. \n",
03810 FALSE
03811 );
03812 cb->
addDependency(
"GENERATE_HTML");
03813 cb = addBool(
03814
"DISABLE_INDEX",
03815
"The DISABLE_INDEX tag can be used to turn on/off the condensed index at \n"
03816
"top of each HTML page. The value NO (the default) enables the index and \n"
03817
"the value YES disables it. \n",
03818 FALSE
03819 );
03820 cb->
addDependency(
"GENERATE_HTML");
03821 ci = addInt(
03822
"ENUM_VALUES_PER_LINE",
03823
"This tag can be used to set the number of enum values (range [1..20]) \n"
03824
"that doxygen will group on one line in the generated HTML documentation. \n",
03825 1,20,4
03826 );
03827 ci->
addDependency(
"GENERATE_HTML");
03828 cb = addBool(
03829
"GENERATE_TREEVIEW",
03830
"If the GENERATE_TREEVIEW tag is set to YES, a side panel will be\n"
03831
"generated containing a tree-like index structure (just like the one that \n"
03832
"is generated for HTML Help). For this to work a browser that supports \n"
03833
"JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, \n"
03834
"Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are \n"
03835
"probably better off using the HTML help feature. \n",
03836 FALSE
03837 );
03838 cb->
addDependency(
"GENERATE_HTML");
03839 ci = addInt(
03840
"TREEVIEW_WIDTH",
03841
"If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be \n"
03842
"used to set the initial width (in pixels) of the frame in which the tree \n"
03843
"is shown. \n",
03844 0,1500,250
03845 );
03846 ci->
addDependency(
"GENERATE_HTML");
03847
03848
03849
addInfo(
"LaTeX",
"configuration options related to the LaTeX output");
03850
03851 cb = addBool(
03852
"GENERATE_LATEX",
03853
"If the GENERATE_LATEX tag is set to YES (the default) Doxygen will \n"
03854
"generate Latex output. \n",
03855 TRUE
03856 );
03857 cs = addString(
03858
"LATEX_OUTPUT",
03859
"The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. \n"
03860
"If a relative path is entered the value of OUTPUT_DIRECTORY will be \n"
03861
"put in front of it. If left blank `latex' will be used as the default path. \n"
03862 );
03863 cs->
setDefaultValue(
"latex");
03864 cs->
setWidgetType(ConfigString::Dir);
03865 cs->
addDependency(
"GENERATE_LATEX");
03866 cs = addString(
03867
"LATEX_CMD_NAME",
03868
"The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be \n"
03869
"invoked. If left blank `latex' will be used as the default command name. \n"
03870 );
03871 cs->
setDefaultValue(
"latex");
03872 cs->
setWidgetType(ConfigString::File);
03873 cs->
addDependency(
"GENERATE_LATEX");
03874 cs = addString(
03875
"MAKEINDEX_CMD_NAME",
03876
"The MAKEINDEX_CMD_NAME tag can be used to specify the command name to \n"
03877
"generate index for LaTeX. If left blank `makeindex' will be used as the \n"
03878
"default command name. \n"
03879 );
03880 cs->
setDefaultValue(
"makeindex");
03881 cs->
setWidgetType(ConfigString::File);
03882 cs->
addDependency(
"GENERATE_LATEX");
03883 cb = addBool(
03884
"COMPACT_LATEX",
03885
"If the COMPACT_LATEX tag is set to YES Doxygen generates more compact \n"
03886
"LaTeX documents. This may be useful for small projects and may help to \n"
03887
"save some trees in general. \n",
03888 FALSE
03889 );
03890 cb->
addDependency(
"GENERATE_LATEX");
03891 ce = addEnum(
03892
"PAPER_TYPE",
03893
"The PAPER_TYPE tag can be used to set the paper type that is used \n"
03894
"by the printer. Possible values are: a4, a4wide, letter, legal and \n"
03895
"executive. If left blank a4wide will be used. \n",
03896
"a4wide"
03897 );
03898 ce->
addValue(
"a4");
03899 ce->
addValue(
"a4wide");
03900 ce->
addValue(
"letter");
03901 ce->
addValue(
"legal");
03902 ce->
addValue(
"executive");
03903 ce->
addDependency(
"GENERATE_LATEX");
03904 cl = addList(
03905
"EXTRA_PACKAGES",
03906
"The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX \n"
03907
"packages that should be included in the LaTeX output. \n"
03908 );
03909 cl->
addDependency(
"GENERATE_LATEX");
03910 cs = addString(
03911
"LATEX_HEADER",
03912
"The LATEX_HEADER tag can be used to specify a personal LaTeX header for \n"
03913
"the generated latex document. The header should contain everything until \n"
03914
"the first chapter. If it is left blank doxygen will generate a \n"
03915
"standard header. Notice: only use this tag if you know what you are doing! \n"
03916 );
03917 cs->
setWidgetType(ConfigString::File);
03918 cs->
addDependency(
"GENERATE_LATEX");
03919 cb = addBool(
03920
"PDF_HYPERLINKS",
03921
"If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated \n"
03922
"is prepared for conversion to pdf (using ps2pdf). The pdf file will \n"
03923
"contain links (just like the HTML output) instead of page references \n"
03924
"This makes the output suitable for online browsing using a pdf viewer. \n",
03925 FALSE
03926 );
03927 cb->
addDependency(
"GENERATE_LATEX");
03928 cb = addBool(
03929
"USE_PDFLATEX",
03930
"If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of \n"
03931
"plain latex in the generated Makefile. Set this option to YES to get a \n"
03932
"higher quality PDF documentation. \n",
03933 FALSE
03934 );
03935 cb->
addDependency(
"GENERATE_LATEX");
03936 cb = addBool(
03937
"LATEX_BATCHMODE",
03938
"If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\\\batchmode. \n"
03939
"command to the generated LaTeX files. This will instruct LaTeX to keep \n"
03940
"running if errors occur, instead of asking the user for help. \n"
03941
"This option is also used when generating formulas in HTML. \n",
03942 FALSE
03943 );
03944 cb->
addDependency(
"GENERATE_LATEX");
03945 cb = addBool(
03946
"LATEX_HIDE_INDICES",
03947
"If LATEX_HIDE_INDICES is set to YES then doxygen will not \n"
03948
"include the index chapters (such as File Index, Compound Index, etc.) \n"
03949
"in the output. \n",
03950 FALSE
03951 );
03952 cb->
addDependency(
"GENERATE_LATEX");
03953
03954
addInfo(
"RTF",
"configuration options related to the RTF output");
03955
03956 cb = addBool(
03957
"GENERATE_RTF",
03958
"If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output \n"
03959
"The RTF output is optimized for Word 97 and may not look very pretty with \n"
03960
"other RTF readers or editors.\n",
03961 FALSE
03962 );
03963 cs = addString(
03964
"RTF_OUTPUT",
03965
"The RTF_OUTPUT tag is used to specify where the RTF docs will be put. \n"
03966
"If a relative path is entered the value of OUTPUT_DIRECTORY will be \n"
03967
"put in front of it. If left blank `rtf' will be used as the default path. \n"
03968 );
03969 cs->
setDefaultValue(
"rtf");
03970 cs->
setWidgetType(ConfigString::Dir);
03971 cs->
addDependency(
"GENERATE_RTF");
03972 cb = addBool(
03973
"COMPACT_RTF",
03974
"If the COMPACT_RTF tag is set to YES Doxygen generates more compact \n"
03975
"RTF documents. This may be useful for small projects and may help to \n"
03976
"save some trees in general. \n",
03977 FALSE
03978 );
03979 cb->
addDependency(
"GENERATE_RTF");
03980 cb = addBool(
03981
"RTF_HYPERLINKS",
03982
"If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated \n"
03983
"will contain hyperlink fields. The RTF 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 WORD or other \n"
03986
"programs which support those fields. \n"
03987
"Note: wordpad (write) and others do not support links. \n",
03988 FALSE
03989 );
03990 cb->
addDependency(
"GENERATE_RTF");
03991 cs = addString(
03992
"RTF_STYLESHEET_FILE",
03993
"Load stylesheet definitions from file. Syntax is similar to doxygen's \n"
03994
"config file, i.e. a series of assignments. You only have to provide \n"
03995
"replacements, missing definitions are set to their default value. \n"
03996 );
03997 cs->
setWidgetType(ConfigString::File);
03998 cs->
addDependency(
"GENERATE_RTF");
03999 cs = addString(
04000
"RTF_EXTENSIONS_FILE",
04001
"Set optional variables used in the generation of an rtf document. \n"
04002
"Syntax is similar to doxygen's config file.\n"
04003 );
04004 cs->
setWidgetType(ConfigString::File);
04005 cs->
addDependency(
"GENERATE_RTF");
04006
04007
04008
addInfo(
"Man",
"configuration options related to the man page output");
04009
04010 cb = addBool(
04011
"GENERATE_MAN",
04012
"If the GENERATE_MAN tag is set to YES (the default) Doxygen will \n"
04013
"generate man pages \n",
04014 FALSE
04015 );
04016 cs = addString(
04017
"MAN_OUTPUT",
04018
"The MAN_OUTPUT tag is used to specify where the man pages will be put. \n"
04019
"If a relative path is entered the value of OUTPUT_DIRECTORY will be \n"
04020
"put in front of it. If left blank `man' will be used as the default path. \n"
04021 );
04022 cs->
setDefaultValue(
"man");
04023 cs->
setWidgetType(ConfigString::Dir);
04024 cs->
addDependency(
"GENERATE_MAN");
04025 cs = addString(
04026
"MAN_EXTENSION",
04027
"The MAN_EXTENSION tag determines the extension that is added to \n"
04028
"the generated man pages (default is the subroutine's section .3) \n"
04029 );
04030 cs->
setDefaultValue(
".3");
04031 cs->
addDependency(
"GENERATE_MAN");
04032 cb = addBool(
04033
"MAN_LINKS",
04034
"If the MAN_LINKS tag is set to YES and Doxygen generates man output, \n"
04035
"then it will generate one additional man file for each entity \n"
04036
"documented in the real man page(s). These additional files \n"
04037
"only source the real man page, but without them the man command \n"
04038
"would be unable to find the correct page. The default is NO. \n",
04039 FALSE
04040 );
04041 cb->
addDependency(
"GENERATE_MAN");
04042
04043
addInfo(
"XML",
"configuration options related to the XML output");
04044
04045 cb = addBool(
04046
"GENERATE_XML",
04047
"If the GENERATE_XML tag is set to YES Doxygen will \n"
04048
"generate an XML file that captures the structure of \n"
04049
"the code including all documentation. \n",
04050 FALSE
04051 );
04052 cs = addString(
04053
"XML_OUTPUT",
04054
"The XML_OUTPUT tag is used to specify where the XML pages will be put. \n"
04055
"If a relative path is entered the value of OUTPUT_DIRECTORY will be \n"
04056
"put in front of it. If left blank `xml' will be used as the default path. \n"
04057 );
04058 cs->
setDefaultValue(
"xml");
04059 cs->
setWidgetType(ConfigString::Dir);
04060 cs->
addDependency(
"GENERATE_XML");
04061 cs = addString(
04062
"XML_SCHEMA",
04063
"The XML_SCHEMA tag can be used to specify an XML schema, \n"
04064
"which can be used by a validating XML parser to check the \n"
04065
"syntax of the XML files. \n"
04066 );
04067 cs->
addDependency(
"GENERATE_XML");
04068 cs = addString(
04069
"XML_DTD",
04070
"The XML_DTD tag can be used to specify an XML DTD, \n"
04071
"which can be used by a validating XML parser to check the \n"
04072
"syntax of the XML files. \n"
04073 );
04074 cs->
addDependency(
"GENERATE_XML");
04075 cb = addBool(
04076
"XML_PROGRAMLISTING",
04077
"If the XML_PROGRAMLISTING tag is set to YES Doxygen will \n"
04078
"dump the program listings (including syntax highlighting \n"
04079
"and cross-referencing information) to the XML output. Note that \n"
04080
"enabling this will significantly increase the size of the XML output. \n",
04081 TRUE
04082 );
04083 cb->
addDependency(
"GENERATE_XML");
04084
04085
04086
addInfo(
"DEF",
"configuration options for the AutoGen Definitions output");
04087
04088 cb = addBool(
"GENERATE_AUTOGEN_DEF",
04089
04090
"If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will \n"
04091
"generate an AutoGen Definitions (see autogen.sf.net) file \n"
04092
"that captures the structure of the code including all \n"
04093
"documentation. Note that this feature is still experimental \n"
04094
"and incomplete at the moment. \n",
04095
04096 FALSE );
04097
04098
addInfo(
"PerlMod",
"configuration options related to the Perl module output");
04099
04100 cb = addBool(
04101
"GENERATE_PERLMOD",
04102
"If the GENERATE_PERLMOD tag is set to YES Doxygen will \n"
04103
"generate a Perl module file that captures the structure of \n"
04104
"the code including all documentation. Note that this \n"
04105
"feature is still experimental and incomplete at the \n"
04106
"moment. \n",
04107 FALSE
04108 );
04109 cb = addBool(
04110
"PERLMOD_LATEX",
04111
"If the PERLMOD_LATEX tag is set to YES Doxygen will generate \n"
04112
"the necessary Makefile rules, Perl scripts and LaTeX code to be able \n"
04113
"to generate PDF and DVI output from the Perl module output. \n",
04114 FALSE
04115 );
04116 cb->
addDependency(
"GENERATE_PERLMOD");
04117 cb = addBool(
04118
"PERLMOD_PRETTY",
04119
"If the PERLMOD_PRETTY tag is set to YES the Perl module output will be \n"
04120
"nicely formatted so it can be parsed by a human reader. This is useful \n"
04121
"if you want to understand what is going on. On the other hand, if this \n"
04122
"tag is set to NO the size of the Perl module output will be much smaller \n"
04123
"and Perl will parse it just the same. \n",
04124 TRUE
04125 );
04126 cb->
addDependency(
"GENERATE_PERLMOD");
04127 cs = addString(
04128
"PERLMOD_MAKEVAR_PREFIX",
04129
"The names of the make variables in the generated doxyrules.make file \n"
04130
"are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. \n"
04131
"This is useful so different doxyrules.make files included by the same \n"
04132
"Makefile don't overwrite each other's variables."
04133 );
04134 cs->
addDependency(
"GENERATE_PERLMOD");
04135
04136
04137
addInfo(
"Preprocessor",
"Configuration options related to the preprocessor ");
04138
04139 cb = addBool(
04140
"ENABLE_PREPROCESSING",
04141
"If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will \n"
04142
"evaluate all C-preprocessor directives found in the sources and include \n"
04143
"files. \n",
04144 TRUE
04145 );
04146 cb = addBool(
04147
"MACRO_EXPANSION",
04148
"If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro \n"
04149
"names in the source code. If set to NO (the default) only conditional \n"
04150
"compilation will be performed. Macro expansion can be done in a controlled \n"
04151
"way by setting EXPAND_ONLY_PREDEF to YES. \n",
04152 FALSE
04153 );
04154 cb->
addDependency(
"ENABLE_PREPROCESSING");
04155 cb = addBool(
04156
"EXPAND_ONLY_PREDEF",
04157
"If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES \n"
04158
"then the macro expansion is limited to the macros specified with the \n"
04159
"PREDEFINED and EXPAND_AS_PREDEFINED tags. \n",
04160 FALSE
04161 );
04162 cb->
addDependency(
"ENABLE_PREPROCESSING");
04163 cb = addBool(
04164
"SEARCH_INCLUDES",
04165
"If the SEARCH_INCLUDES tag is set to YES (the default) the includes files \n"
04166
"in the INCLUDE_PATH (see below) will be search if a #include is found. \n",
04167 TRUE
04168 );
04169 cb->
addDependency(
"ENABLE_PREPROCESSING");
04170 cl = addList(
04171
"INCLUDE_PATH",
04172
"The INCLUDE_PATH tag can be used to specify one or more directories that \n"
04173
"contain include files that are not input files but should be processed by \n"
04174
"the preprocessor. \n"
04175 );
04176 cl->
setWidgetType(ConfigList::Dir);
04177 cl->
addDependency(
"ENABLE_PREPROCESSING");
04178 cl = addList(
04179
"INCLUDE_FILE_PATTERNS",
04180
"You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard \n"
04181
"patterns (like *.h and *.hpp) to filter out the header-files in the \n"
04182
"directories. If left blank, the patterns specified with FILE_PATTERNS will \n"
04183
"be used. \n"
04184 );
04185 cl->
addDependency(
"ENABLE_PREPROCESSING");
04186 cl = addList(
04187
"PREDEFINED",
04188
"The PREDEFINED tag can be used to specify one or more macro names that \n"
04189
"are defined before the preprocessor is started (similar to the -D option of \n"
04190
"gcc). The argument of the tag is a list of macros of the form: name \n"
04191
"or name=definition (no spaces). If the definition and the = are \n"
04192
"omitted =1 is assumed. \n"
04193 );
04194 cl->
addDependency(
"ENABLE_PREPROCESSING");
04195 cl = addList(
04196
"EXPAND_AS_DEFINED",
04197
"If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then \n"
04198
"this tag can be used to specify a list of macro names that should be expanded. \n"
04199
"The macro definition that is found in the sources will be used. \n"
04200
"Use the PREDEFINED tag if you want to use a different macro definition. \n"
04201 );
04202 cl->
addDependency(
"ENABLE_PREPROCESSING");
04203 cb = addBool(
04204
"SKIP_FUNCTION_MACROS",
04205
"If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then \n"
04206
"doxygen's preprocessor will remove all function-like macros that are alone \n"
04207
"on a line, have an all uppercase name, and do not end with a semicolon. Such \n"
04208
"function macros are typically used for boiler-plate code, and will confuse the \n"
04209
"parser if not removed. \n",
04210 TRUE
04211 );
04212 cb->
addDependency(
"ENABLE_PREPROCESSING");
04213
04214
addInfo(
"External",
"Configuration::additions related to external references ");
04215
04216 cl = addList(
04217
"TAGFILES",
04218
"The TAGFILES option can be used to specify one or more tagfiles. \n"
04219
"Optionally an initial location of the external documentation \n"
04220
"can be added for each tagfile. The format of a tag file without \n"
04221
"this location is as follows: \n"
04222
" TAGFILES = file1 file2 ... \n"
04223
"Adding location for the tag files is done as follows: \n"
04224
" TAGFILES = file1=loc1 \"file2 = loc2\" ... \n"
04225
"where \"loc1\" and \"loc2\" can be relative or absolute paths or \n"
04226
"URLs. If a location is present for each tag, the installdox tool \n"
04227
"does not have to be run to correct the links.\n"
04228
"Note that each tag file must have a unique name\n"
04229
"(where the name does NOT include the path)\n"
04230
"If a tag file is not located in the directory in which doxygen \n"
04231
"is run, you must also specify the path to the tagfile here. \n"
04232 );
04233 cl->
setWidgetType(ConfigList::File);
04234 cs = addString(
04235
"GENERATE_TAGFILE",
04236
"When a file name is specified after GENERATE_TAGFILE, doxygen will create \n"
04237
"a tag file that is based on the input files it reads. \n"
04238 );
04239 cs->
setWidgetType(ConfigString::File);
04240 cb = addBool(
04241
"ALLEXTERNALS",
04242
"If the ALLEXTERNALS tag is set to YES all external classes will be listed \n"
04243
"in the class index. If set to NO only the inherited external classes \n"
04244
"will be listed. \n",
04245 FALSE
04246 );
04247 cb = addBool(
04248
"EXTERNAL_GROUPS",
04249
"If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed \n"
04250
"in the modules index. If set to NO, only the current project's groups will \n"
04251
"be listed. \n",
04252 TRUE
04253 );
04254 cs = addString(
04255
"PERL_PATH",
04256
"The PERL_PATH should be the absolute path and name of the perl script \n"
04257
"interpreter (i.e. the result of `which perl'). \n"
04258 );
04259 cs->
setDefaultValue(
"/usr/bin/perl");
04260 cs->
setWidgetType(ConfigString::Dir);
04261
04262
04263
addInfo(
"Dot",
"Configuration options related to the dot tool ");
04264
04265 cb = addBool(
04266
"CLASS_DIAGRAMS",
04267
"If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will \n"
04268
"generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or \n"
04269
"super classes. Setting the tag to NO turns the diagrams off. Note that this \n"
04270
"option is superseded by the HAVE_DOT option below. This is only a fallback. It is \n"
04271
"recommended to install and use dot, since it yields more powerful graphs. \n",
04272 TRUE
04273 );
04274 cb = addBool(
04275
"HIDE_UNDOC_RELATIONS",
04276
"If set to YES, the inheritance and collaboration graphs will hide \n"
04277
"inheritance and usage relations if the target is undocumented \n"
04278
"or is not a class. \n",
04279 TRUE
04280 );
04281 cb = addBool(
04282
"HAVE_DOT",
04283
"If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is \n"
04284
"available from the path. This tool is part of Graphviz, a graph visualization \n"
04285
"toolkit from AT&T and Lucent Bell Labs. The other options in this section \n"
04286
"have no effect if this option is set to NO (the default) \n",
04287 FALSE
04288 );
04289 cb = addBool(
04290
"CLASS_GRAPH",
04291
"If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen \n"
04292
"will generate a graph for each documented class showing the direct and \n"
04293
"indirect inheritance relations. Setting this tag to YES will force the \n"
04294
"the CLASS_DIAGRAMS tag to NO.\n",
04295 TRUE
04296 );
04297 cb->
addDependency(
"HAVE_DOT");
04298 cb = addBool(
04299
"COLLABORATION_GRAPH",
04300
"If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen \n"
04301
"will generate a graph for each documented class showing the direct and \n"
04302
"indirect implementation dependencies (inheritance, containment, and \n"
04303
"class references variables) of the class with other documented classes. \n",
04304 TRUE
04305 );
04306 cb->
addDependency(
"HAVE_DOT");
04307 cb = addBool(
04308
"UML_LOOK",
04309
"If the UML_LOOK tag is set to YES doxygen will generate inheritance and \n"
04310
"collaboration diagrams in a style similar to the OMG's Unified Modeling \n"
04311
"Language. \n",
04312 FALSE
04313 );
04314 cb->
addDependency(
"HAVE_DOT");
04315 cb = addBool(
04316
"TEMPLATE_RELATIONS",
04317
"If set to YES, the inheritance and collaboration graphs will show the \n"
04318
"relations between templates and their instances. \n",
04319 FALSE
04320 );
04321 cb->
addDependency(
"HAVE_DOT");
04322 cb = addBool(
04323
"INCLUDE_GRAPH",
04324
"If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT \n"
04325
"tags are set to YES then doxygen will generate a graph for each documented \n"
04326
"file showing the direct and indirect include dependencies of the file with \n"
04327
"other documented files. \n",
04328 TRUE
04329 );
04330 cb->
addDependency(
"HAVE_DOT");
04331 cb = addBool(
04332
"INCLUDED_BY_GRAPH",
04333
"If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and \n"
04334
"HAVE_DOT tags are set to YES then doxygen will generate a graph for each \n"
04335
"documented header file showing the documented files that directly or \n"
04336
"indirectly include this file. \n",
04337 TRUE
04338 );
04339 cb->
addDependency(
"HAVE_DOT");
04340 cb = addBool(
04341
"CALL_GRAPH",
04342
"If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will \n"
04343
"generate a call dependency graph for every global function or class method. \n"
04344
"Note that enabling this option will significantly increase the time of a run. \n"
04345
"So in most cases it will be better to enable call graphs for selected \n"
04346
"functions only using the \\callgraph command.\n",
04347 FALSE
04348 );
04349 cb->
addDependency(
"HAVE_DOT");
04350 cb = addBool(
04351
"GRAPHICAL_HIERARCHY",
04352
"If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen \n"
04353
"will graphical hierarchy of all classes instead of a textual one. \n",
04354 TRUE
04355 );
04356 cb->
addDependency(
"HAVE_DOT");
04357 ce = addEnum(
04358
"DOT_IMAGE_FORMAT",
04359
"The DOT_IMAGE_FORMAT tag can be used to set the image format of the images \n"
04360
"generated by dot. Possible values are png, jpg, or gif\n"
04361
"If left blank png will be used. \n",
04362
"png"
04363 );
04364 ce->
addValue(
"png");
04365 ce->
addValue(
"jpg");
04366 ce->
addValue(
"gif");
04367 ce->
addDependency(
"HAVE_DOT");
04368 cs = addString(
04369
"DOT_PATH",
04370
"The tag DOT_PATH can be used to specify the path where the dot tool can be \n"
04371
"found. If left blank, it is assumed the dot tool can be found on the path. \n"
04372 );
04373 cs->
setWidgetType(ConfigString::Dir);
04374 cs->
addDependency(
"HAVE_DOT");
04375 cl = addList(
04376
"DOTFILE_DIRS",
04377
"The DOTFILE_DIRS tag can be used to specify one or more directories that \n"
04378
"contain dot files that are included in the documentation (see the \n"
04379
"\\dotfile command). \n"
04380 );
04381 cl->
setWidgetType(ConfigList::Dir);
04382 cl->
addDependency(
"HAVE_DOT");
04383 ci = addInt(
04384
"MAX_DOT_GRAPH_WIDTH",
04385
"The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width \n"
04386
"(in pixels) of the graphs generated by dot. If a graph becomes larger than \n"
04387
"this value, doxygen will try to truncate the graph, so that it fits within \n"
04388
"the specified constraint. Beware that most browsers cannot cope with very \n"
04389
"large images. \n",
04390 100,30000, 1024
04391 );
04392 ci->
addDependency(
"HAVE_DOT");
04393 ci = addInt(
04394
"MAX_DOT_GRAPH_HEIGHT",
04395
"The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height \n"
04396
"(in pixels) of the graphs generated by dot. If a graph becomes larger than \n"
04397
"this value, doxygen will try to truncate the graph, so that it fits within \n"
04398
"the specified constraint. Beware that most browsers cannot cope with very \n"
04399
"large images. \n",
04400 100,30000,1024
04401 );
04402 ci = addInt(
04403
"MAX_DOT_GRAPH_DEPTH",
04404
"The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the \n"
04405
"graphs generated by dot. A depth value of 3 means that only nodes reachable \n"
04406
"from the root by following a path via at most 3 edges will be shown. Nodes that \n"
04407
"lay further from the root node will be omitted. Note that setting this option to \n"
04408
"1 or 2 may greatly reduce the computation time needed for large code bases. Also \n"
04409
"note that a graph may be further truncated if the graph's image dimensions are \n"
04410
"not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). \n"
04411
"If 0 is used for the depth value (the default), the graph is not depth-constrained. \n",
04412 0,1000,0
04413 );
04414 ci->
addDependency(
"HAVE_DOT");
04415 cb = addBool(
04416
"GENERATE_LEGEND",
04417
"If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will \n"
04418
"generate a legend page explaining the meaning of the various boxes and \n"
04419
"arrows in the dot generated graphs. \n",
04420 TRUE
04421 );
04422 cb->
addDependency(
"HAVE_DOT");
04423 cb = addBool(
04424
"DOT_CLEANUP",
04425
"If the DOT_CLEANUP tag is set to YES (the default) Doxygen will \n"
04426
"remove the intermediate dot files that are used to generate \n"
04427
"the various graphs. \n",
04428 TRUE
04429 );
04430 cb->
addDependency(
"HAVE_DOT");
04431
04432
04433
addInfo(
"Search",
"Configuration::additions related to the search engine ");
04434
04435 cb = addBool(
04436
"SEARCHENGINE",
04437
"The SEARCHENGINE tag specifies whether or not a search engine should be \n"
04438
"used. If set to NO the values of all tags below this one will be ignored. \n",
04439 FALSE
04440 );
04441
addObsolete(
"CGI_NAME");
04442
addObsolete(
"CGI_URL");
04443
addObsolete(
"DOC_URL");
04444
addObsolete(
"DOC_ABSPATH");
04445
addObsolete(
"BIN_ABSPATH");
04446
addObsolete(
"EXT_DOC_PATHS");
04447
04448
04449 }
04450
04451
static QCString configFileToString(
const char *name)
04452 {
04453
if (
name==0 ||
name[0]==0)
return 0;
04454
QFile f;
04455
04456
bool fileOpened=FALSE;
04457
if (
name[0]==
'-' &&
name[1]==0)
04458 {
04459 fileOpened=f.open(IO_ReadOnly,stdin);
04460
if (fileOpened)
04461 {
04462
const int bSize=4096;
04463
QCString contents(bSize);
04464
int totalSize=0;
04465
int size;
04466
while ((
size=f.readBlock(contents.data()+totalSize,bSize))==bSize)
04467 {
04468 totalSize+=bSize;
04469 contents.resize(totalSize+bSize);
04470 }
04471 totalSize+=
size+2;
04472 contents.resize(totalSize);
04473 contents.at(totalSize-2)=
'\n';
04474 contents.at(totalSize-1)=
'\0';
04475
return contents;
04476 }
04477 }
04478
else
04479 {
04480
QFileInfo fi(name);
04481
if (!fi.exists() || !fi.isFile())
04482 {
04483
config_err(
"Error: file `%s' not found\n",name);
04484
return "";
04485 }
04486 f.setName(name);
04487 fileOpened=f.open(IO_ReadOnly);
04488
if (fileOpened)
04489 {
04490
int fsize=f.size();
04491
QCString contents(fsize+2);
04492 f.readBlock(contents.data(),fsize);
04493
if (fsize==0 || contents[fsize-1]==
'\n')
04494 contents[fsize]=
'\0';
04495
else
04496 contents[fsize]=
'\n';
04497 contents[fsize+1]=
'\0';
04498 f.close();
04499
return contents;
04500 }
04501 }
04502
if (!fileOpened)
04503 {
04504
config_err(
"Error: cannot open file `%s' for reading\n",name);
04505 }
04506
return "";
04507 }
04508
04509
04510
bool Config::parse(
const char *fn)
04511 {
04512
QCString contents = configFileToString(fn);
04513
config =
Config::instance();
04514
inputString = contents.data();
04515
inputPosition = 0;
04516
yyLineNr = 1;
04517
yyFileName=fn;
04518
includeStack.setAutoDelete(TRUE);
04519
includeStack.clear();
04520
includeDepth = 0;
04521
configYYrestart( configYYin );
04522
BEGIN( Start );
04523
configYYlex();
04524
inputString = 0;
04525
return TRUE;
04526 }
04527
04528
extern "C" {
04529
04530 }