KDevelop API Documentation

parts/doxygen/config.cpp

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