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