You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
5167 lines
182 KiB
5167 lines
182 KiB
const char *portable_commandExtension()
|
|
{
|
|
#if defined(_WIN32) && !defined(__CYGWIN__)
|
|
return ".exe";
|
|
#else
|
|
return "";
|
|
#endif
|
|
}
|
|
|
|
bool portable_fileSystemIsCaseSensitive()
|
|
{
|
|
#if defined(_WIN32) || defined(macintosh) || defined(__MACOSX__) || defined(__APPLE__)
|
|
return false;
|
|
#else
|
|
return true;
|
|
#endif
|
|
}
|
|
|
|
#define yy_create_buffer configYY_create_buffer
|
|
#define yy_delete_buffer configYY_delete_buffer
|
|
#define yy_scan_buffer configYY_scan_buffer
|
|
#define yy_scan_string configYY_scan_string
|
|
#define yy_scan_bytes configYY_scan_bytes
|
|
#define yy_flex_debug configYY_flex_debug
|
|
#define yy_init_buffer configYY_init_buffer
|
|
#define yy_flush_buffer configYY_flush_buffer
|
|
#define yy_load_buffer_state configYY_load_buffer_state
|
|
#define yy_switch_to_buffer configYY_switch_to_buffer
|
|
#define yyin configYYin
|
|
#define yyleng configYYleng
|
|
#define yylex configYYlex
|
|
#define yyout configYYout
|
|
#define yyrestart configYYrestart
|
|
#define yytext configYYtext
|
|
|
|
/* A lexical scanner generated by flex */
|
|
|
|
#define FLEX_SCANNER
|
|
#define YY_FLEX_MAJOR_VERSION 2
|
|
#define YY_FLEX_MINOR_VERSION 5
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
|
|
#ifdef c_plusplus
|
|
#ifndef __cplusplus
|
|
#define __cplusplus
|
|
#endif
|
|
#endif
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
|
|
/* Use prototypes in function declarations. */
|
|
#define YY_USE_PROTOS
|
|
|
|
/* The "const" storage-class-modifier is valid. */
|
|
#define YY_USE_CONST
|
|
|
|
#else /* ! __cplusplus */
|
|
|
|
#if __STDC__
|
|
|
|
#define YY_USE_PROTOS
|
|
#define YY_USE_CONST
|
|
|
|
#endif /* __STDC__ */
|
|
#endif /* ! __cplusplus */
|
|
|
|
#ifdef __TURBOC__
|
|
#pragma warn -rch
|
|
#pragma warn -use
|
|
#include <io.h>
|
|
#include <stdlib.h>
|
|
#define YY_USE_CONST
|
|
#define YY_USE_PROTOS
|
|
#endif
|
|
|
|
#ifdef YY_USE_CONST
|
|
#define yyconst const
|
|
#else
|
|
#define yyconst
|
|
#endif
|
|
|
|
|
|
#ifdef YY_USE_PROTOS
|
|
#define YY_PROTO(proto) proto
|
|
#else
|
|
#define YY_PROTO(proto) ()
|
|
#endif
|
|
|
|
/* Returned upon end-of-file. */
|
|
#define YY_NULL 0
|
|
|
|
/* Promotes a possibly negative, possibly signed char to an unsigned
|
|
* integer for use as an array index. If the signed char is negative,
|
|
* we want to instead treat it as an 8-bit unsigned char, hence the
|
|
* double cast.
|
|
*/
|
|
#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
|
|
|
|
/* Enter a start condition. This macro really ought to take a parameter,
|
|
* but we do it the disgusting crufty way forced on us by the ()-less
|
|
* definition of BEGIN.
|
|
*/
|
|
#define BEGIN yy_start = 1 + 2 *
|
|
|
|
/* Translate the current start state into a value that can be later handed
|
|
* to BEGIN to return to the state. The YYSTATE alias is for lex
|
|
* compatibility.
|
|
*/
|
|
#define YY_START ((yy_start - 1) / 2)
|
|
#define YYSTATE YY_START
|
|
|
|
/* Action number for EOF rule of a given start state. */
|
|
#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
|
|
|
|
/* Special action meaning "start processing a new file". */
|
|
#define YY_NEW_FILE yyrestart( yyin )
|
|
|
|
#define YY_END_OF_BUFFER_CHAR 0
|
|
|
|
/* Size of default input buffer. */
|
|
#define YY_BUF_SIZE 16384
|
|
|
|
typedef struct yy_buffer_state *YY_BUFFER_STATE;
|
|
|
|
extern int yyleng;
|
|
extern FILE *yyin, *yyout;
|
|
|
|
#define EOB_ACT_CONTINUE_SCAN 0
|
|
#define EOB_ACT_END_OF_FILE 1
|
|
#define EOB_ACT_LAST_MATCH 2
|
|
|
|
/* The funky do-while in the following #define is used to turn the definition
|
|
* int a single C statement (which needs a semi-colon terminator). This
|
|
* avoids problems with code like:
|
|
*
|
|
* if ( condition_holds )
|
|
* yyless( 5 );
|
|
* else
|
|
* do_something_else();
|
|
*
|
|
* Prior to using the do-while the compiler would get upset at the
|
|
* "else" because it interpreted the "if" statement as being all
|
|
* done when it reached the ';' after the yyless() call.
|
|
*/
|
|
|
|
/* Return all but the first 'n' matched characters back to the input stream. */
|
|
|
|
#define yyless(n) \
|
|
do \
|
|
{ \
|
|
/* Undo effects of setting up yytext. */ \
|
|
*yy_cp = yy_hold_char; \
|
|
YY_RESTORE_YY_MORE_OFFSET \
|
|
yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
|
|
YY_DO_BEFORE_ACTION; /* set up yytext again */ \
|
|
} \
|
|
while ( 0 )
|
|
|
|
#define unput(c) yyunput( c, yytext_ptr )
|
|
|
|
/* The following is because we cannot portably get our hands on size_t
|
|
* (without autoconf's help, which isn't available because we want
|
|
* flex-generated scanners to compile on their own).
|
|
*/
|
|
typedef unsigned int yy_size_t;
|
|
|
|
|
|
struct yy_buffer_state
|
|
{
|
|
FILE *yy_input_file;
|
|
|
|
char *yy_ch_buf; /* input buffer */
|
|
char *yy_buf_pos; /* current position in input buffer */
|
|
|
|
/* Size of input buffer in bytes, not including room for EOB
|
|
* characters.
|
|
*/
|
|
yy_size_t yy_buf_size;
|
|
|
|
/* Number of characters read into yy_ch_buf, not including EOB
|
|
* characters.
|
|
*/
|
|
int yy_n_chars;
|
|
|
|
/* Whether we "own" the buffer - i.e., we know we created it,
|
|
* and can realloc() it to grow it, and should free() it to
|
|
* delete it.
|
|
*/
|
|
int yy_is_our_buffer;
|
|
|
|
/* Whether this is an "interactive" input source; if so, and
|
|
* if we're using stdio for input, then we want to use getc()
|
|
* instead of fread(), to make sure we stop fetching input after
|
|
* each newline.
|
|
*/
|
|
int yy_is_interactive;
|
|
|
|
/* Whether we're considered to be at the beginning of a line.
|
|
* If so, '^' rules will be active on the next match, otherwise
|
|
* not.
|
|
*/
|
|
int yy_at_bol;
|
|
|
|
/* Whether to try to fill the input buffer when we reach the
|
|
* end of it.
|
|
*/
|
|
int yy_fill_buffer;
|
|
|
|
int yy_buffer_status;
|
|
#define YY_BUFFER_NEW 0
|
|
#define YY_BUFFER_NORMAL 1
|
|
/* When an EOF's been seen but there's still some text to process
|
|
* then we mark the buffer as YY_EOF_PENDING, to indicate that we
|
|
* shouldn't try reading from the input source any more. We might
|
|
* still have a bunch of tokens to match, though, because of
|
|
* possible backing-up.
|
|
*
|
|
* When we actually see the EOF, we change the status to "new"
|
|
* (via yyrestart()), so that the user can continue scanning by
|
|
* just pointing yyin at a new input file.
|
|
*/
|
|
#define YY_BUFFER_EOF_PENDING 2
|
|
};
|
|
|
|
static YY_BUFFER_STATE yy_current_buffer = 0;
|
|
|
|
/* We provide macros for accessing buffer states in case in the
|
|
* future we want to put the buffer states in a more general
|
|
* "scanner state".
|
|
*/
|
|
#define YY_CURRENT_BUFFER yy_current_buffer
|
|
|
|
|
|
/* yy_hold_char holds the character lost when yytext is formed. */
|
|
static char yy_hold_char;
|
|
|
|
static int yy_n_chars; /* number of characters read into yy_ch_buf */
|
|
|
|
|
|
int yyleng;
|
|
|
|
/* Points to current character in buffer. */
|
|
static char *yy_c_buf_p = (char *) 0;
|
|
static int yy_init = 1; /* whether we need to initialize */
|
|
static int yy_start = 0; /* start state number */
|
|
|
|
/* Flag which is used to allow yywrap()'s to do buffer switches
|
|
* instead of setting up a fresh yyin. A bit of a hack ...
|
|
*/
|
|
static int yy_did_buffer_switch_on_eof;
|
|
|
|
void yyrestart YY_PROTO(( FILE *input_file ));
|
|
|
|
void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
|
|
void yy_load_buffer_state YY_PROTO(( void ));
|
|
YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
|
|
void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
|
|
void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
|
|
void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
|
|
#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
|
|
|
|
YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
|
|
YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
|
|
YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
|
|
|
|
static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
|
|
static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
|
|
static void yy_flex_free YY_PROTO(( void * ));
|
|
|
|
#define yy_new_buffer yy_create_buffer
|
|
|
|
#define yy_set_interactive(is_interactive) \
|
|
{ \
|
|
if ( ! yy_current_buffer ) \
|
|
yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
|
|
yy_current_buffer->yy_is_interactive = is_interactive; \
|
|
}
|
|
|
|
#define yy_set_bol(at_bol) \
|
|
{ \
|
|
if ( ! yy_current_buffer ) \
|
|
yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
|
|
yy_current_buffer->yy_at_bol = at_bol; \
|
|
}
|
|
|
|
#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
|
|
|
|
|
|
#define yywrap() 1
|
|
#define YY_SKIP_YYWRAP
|
|
typedef unsigned char YY_CHAR;
|
|
FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
|
|
typedef int yy_state_type;
|
|
extern char *yytext;
|
|
#define yytext_ptr yytext
|
|
|
|
static yy_state_type yy_get_previous_state YY_PROTO(( void ));
|
|
static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
|
|
static int yy_get_next_buffer YY_PROTO(( void ));
|
|
static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
|
|
|
|
/* Done after the current pattern has been matched and before the
|
|
* corresponding action - sets up yytext.
|
|
*/
|
|
#define YY_DO_BEFORE_ACTION \
|
|
yytext_ptr = yy_bp; \
|
|
yyleng = (int) (yy_cp - yy_bp); \
|
|
yy_hold_char = *yy_cp; \
|
|
*yy_cp = '\0'; \
|
|
yy_c_buf_p = yy_cp;
|
|
|
|
#define YY_NUM_RULES 24
|
|
#define YY_END_OF_BUFFER 25
|
|
static yyconst short int yy_accept[100] =
|
|
{ 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
25, 22, 23, 22, 22, 2, 8, 22, 8, 19,
|
|
22, 9, 13, 12, 2, 12, 12, 17, 18, 11,
|
|
10, 18, 18, 16, 14, 14, 16, 16, 7, 22,
|
|
7, 7, 0, 21, 0, 8, 0, 0, 0, 8,
|
|
3, 0, 20, 12, 12, 17, 18, 11, 18, 15,
|
|
7, 0, 7, 0, 0, 4, 12, 18, 7, 7,
|
|
1, 0, 1, 1, 1, 0, 0, 0, 0, 0,
|
|
6, 0, 0, 0, 0, 0, 0, 5, 0
|
|
|
|
} ;
|
|
|
|
static yyconst int yy_ec[256] =
|
|
{ 0,
|
|
1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
|
|
1, 1, 4, 1, 1, 1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
1, 2, 1, 5, 6, 1, 1, 1, 1, 1,
|
|
1, 1, 7, 1, 1, 1, 1, 8, 9, 9,
|
|
9, 9, 9, 9, 9, 9, 9, 1, 1, 1,
|
|
10, 1, 1, 11, 12, 13, 14, 15, 16, 13,
|
|
13, 17, 18, 13, 13, 19, 13, 20, 13, 21,
|
|
13, 13, 13, 22, 23, 13, 13, 13, 13, 13,
|
|
1, 24, 1, 1, 25, 1, 13, 13, 13, 26,
|
|
|
|
13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
|
|
13, 13, 13, 13, 13, 13, 13, 13, 13, 27,
|
|
13, 13, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 1
|
|
} ;
|
|
|
|
static yyconst int yy_meta[29] =
|
|
{ 0,
|
|
1, 2, 3, 4, 3, 5, 6, 7, 7, 6,
|
|
1, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
|
8, 8, 8, 1, 7, 8, 8, 1
|
|
} ;
|
|
|
|
static yyconst short int yy_base[112] =
|
|
{ 0,
|
|
0, 1, 29, 0, 55, 56, 82, 108, 135, 162,
|
|
190, 0, 217, 244, 58, 65, 66, 68, 271, 298,
|
|
145, 408, 408, 3, 117, 408, 0, 125, 6, 408,
|
|
7, 408, 408, 0, 0, 15, 115, 0, 0, 133,
|
|
408, 18, 107, 408, 408, 408, 62, 106, 0, 0,
|
|
70, 104, 73, 408, 122, 0, 109, 93, 118, 95,
|
|
408, 105, 408, 0, 118, 0, 0, 123, 116, 408,
|
|
0, 117, 113, 94, 105, 408, 92, 91, 408, 90,
|
|
408, 82, 0, 0, 0, 75, 66, 62, 102, 13,
|
|
408, 41, 48, 5, 9, 89, 113, 408, 408, 326,
|
|
|
|
334, 342, 350, 358, 360, 367, 375, 4, 383, 391,
|
|
399
|
|
} ;
|
|
|
|
static yyconst short int yy_def[112] =
|
|
{ 0,
|
|
100, 100, 99, 3, 100, 100, 100, 100, 101, 101,
|
|
99, 11, 102, 102, 103, 103, 100, 100, 104, 104,
|
|
99, 99, 99, 99, 99, 99, 105, 99, 106, 99,
|
|
99, 99, 99, 107, 107, 107, 107, 108, 109, 99,
|
|
99, 109, 109, 99, 99, 99, 99, 99, 110, 111,
|
|
110, 110, 99, 99, 99, 105, 99, 99, 99, 106,
|
|
99, 99, 99, 107, 107, 108, 109, 99, 109, 99,
|
|
110, 111, 110, 99, 99, 99, 107, 109, 99, 110,
|
|
99, 99, 107, 109, 110, 99, 99, 99, 99, 99,
|
|
99, 99, 99, 99, 99, 99, 99, 99, 0, 99,
|
|
|
|
99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
|
|
99
|
|
} ;
|
|
|
|
static yyconst short int yy_nxt[437] =
|
|
{ 0,
|
|
99, 99, 23, 23, 53, 54, 53, 58, 62, 63,
|
|
62, 66, 59, 99, 90, 61, 53, 54, 53, 53,
|
|
54, 53, 91, 24, 24, 96, 95, 25, 25, 22,
|
|
22, 23, 22, 22, 26, 22, 27, 27, 22, 28,
|
|
29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
|
|
29, 29, 24, 29, 29, 29, 25, 30, 30, 94,
|
|
45, 93, 46, 53, 54, 53, 70, 45, 23, 46,
|
|
23, 53, 54, 53, 53, 54, 53, 89, 31, 31,
|
|
88, 47, 25, 25, 32, 48, 33, 26, 47, 24,
|
|
97, 24, 48, 25, 58, 25, 58, 87, 98, 59,
|
|
|
|
86, 59, 61, 90, 61, 24, 62, 63, 62, 25,
|
|
32, 91, 33, 26, 97, 85, 84, 83, 82, 81,
|
|
80, 79, 98, 78, 68, 77, 92, 76, 75, 74,
|
|
73, 24, 55, 69, 68, 25, 22, 32, 22, 33,
|
|
35, 65, 57, 55, 99, 99, 99, 99, 99, 99,
|
|
99, 99, 99, 99, 99, 99, 99, 99, 36, 99,
|
|
99, 99, 37, 22, 32, 22, 33, 35, 99, 99,
|
|
99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
|
|
99, 99, 99, 99, 99, 36, 99, 99, 99, 37,
|
|
22, 22, 32, 22, 22, 26, 22, 22, 22, 22,
|
|
|
|
22, 38, 38, 38, 38, 38, 38, 38, 38, 38,
|
|
38, 38, 38, 24, 22, 38, 38, 25, 40, 41,
|
|
22, 33, 26, 99, 99, 99, 99, 99, 99, 99,
|
|
99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
|
|
42, 99, 99, 99, 43, 40, 41, 22, 33, 26,
|
|
99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
|
|
99, 99, 99, 99, 99, 99, 99, 42, 99, 99,
|
|
99, 43, 22, 23, 22, 50, 99, 99, 99, 99,
|
|
99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
|
|
99, 99, 99, 99, 51, 99, 99, 99, 52, 22,
|
|
|
|
23, 22, 50, 99, 99, 99, 99, 99, 99, 99,
|
|
99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
|
|
99, 51, 99, 99, 99, 52, 22, 22, 22, 22,
|
|
22, 22, 22, 22, 34, 34, 34, 34, 34, 34,
|
|
34, 34, 39, 39, 39, 39, 39, 39, 39, 39,
|
|
44, 44, 44, 44, 44, 44, 44, 44, 49, 49,
|
|
49, 49, 49, 49, 49, 49, 56, 56, 60, 99,
|
|
99, 99, 60, 60, 60, 64, 99, 99, 99, 64,
|
|
64, 64, 64, 67, 99, 99, 99, 99, 67, 67,
|
|
67, 71, 99, 99, 99, 71, 71, 71, 71, 72,
|
|
|
|
72, 99, 72, 72, 72, 72, 72, 21, 99, 99,
|
|
99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
|
|
99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
|
|
99, 99, 99, 99, 99, 99
|
|
} ;
|
|
|
|
static yyconst short int yy_chk[437] =
|
|
{ 0,
|
|
0, 0, 1, 2, 24, 24, 24, 29, 31, 31,
|
|
31, 108, 29, 0, 90, 29, 36, 36, 36, 42,
|
|
42, 42, 90, 1, 2, 95, 94, 1, 2, 3,
|
|
3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
|
|
3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
|
|
3, 3, 3, 3, 3, 3, 3, 5, 6, 93,
|
|
15, 92, 15, 47, 47, 47, 47, 16, 17, 16,
|
|
18, 51, 51, 51, 53, 53, 53, 88, 5, 6,
|
|
87, 15, 5, 6, 7, 15, 7, 7, 16, 17,
|
|
96, 18, 16, 17, 58, 18, 60, 86, 96, 58,
|
|
|
|
82, 60, 58, 89, 60, 7, 62, 62, 62, 7,
|
|
8, 89, 8, 8, 97, 80, 78, 77, 75, 74,
|
|
73, 72, 97, 69, 68, 65, 89, 59, 57, 55,
|
|
52, 8, 48, 43, 40, 8, 9, 9, 9, 9,
|
|
9, 37, 28, 25, 21, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 9, 0,
|
|
0, 0, 9, 10, 10, 10, 10, 10, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 10, 0, 0, 0, 10,
|
|
11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
|
|
|
|
11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
|
|
11, 11, 11, 11, 11, 11, 11, 11, 13, 13,
|
|
13, 13, 13, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
13, 0, 0, 0, 13, 14, 14, 14, 14, 14,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 14, 0, 0,
|
|
0, 14, 19, 19, 19, 19, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 19, 0, 0, 0, 19, 20,
|
|
|
|
20, 20, 20, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 20, 0, 0, 0, 20, 100, 100, 100, 100,
|
|
100, 100, 100, 100, 101, 101, 101, 101, 101, 101,
|
|
101, 101, 102, 102, 102, 102, 102, 102, 102, 102,
|
|
103, 103, 103, 103, 103, 103, 103, 103, 104, 104,
|
|
104, 104, 104, 104, 104, 104, 105, 105, 106, 0,
|
|
0, 0, 106, 106, 106, 107, 0, 0, 0, 107,
|
|
107, 107, 107, 109, 0, 0, 0, 0, 109, 109,
|
|
109, 110, 0, 0, 0, 110, 110, 110, 110, 111,
|
|
|
|
111, 0, 111, 111, 111, 111, 111, 99, 99, 99,
|
|
99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
|
|
99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
|
|
99, 99, 99, 99, 99, 99
|
|
} ;
|
|
|
|
static yy_state_type yy_last_accepting_state;
|
|
static char *yy_last_accepting_cpos;
|
|
|
|
/* The intent behind this definition is that it'll catch
|
|
* any uses of REJECT which flex missed.
|
|
*/
|
|
#define REJECT reject_used_but_not_detected
|
|
#define yymore() yymore_used_but_not_detected
|
|
#define YY_MORE_ADJ 0
|
|
#define YY_RESTORE_YY_MORE_OFFSET
|
|
char *yytext;
|
|
#line 1 "config.l"
|
|
#define INITIAL 0
|
|
/******************************************************************************
|
|
*
|
|
*
|
|
*
|
|
* Copyright (C) 1997-2006 by Dimitri van Heesch.
|
|
*
|
|
* Permission to use, copy, modify, and distribute this software and its
|
|
* documentation under the terms of the GNU General Public License is hereby
|
|
* granted. No representations are made about the suitability of this software
|
|
* for any purpose. It is provided "as is" without express or implied warranty.
|
|
* See the GNU General Public License for more details.
|
|
*
|
|
*/
|
|
#line 16 "config.l"
|
|
|
|
/*
|
|
* includes
|
|
*/
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <assert.h>
|
|
#include <ctype.h>
|
|
#include <stdarg.h>
|
|
|
|
#include <qfileinfo.h>
|
|
#include <qfile.h>
|
|
#include <qdir.h>
|
|
#include <qtextstream.h>
|
|
#include <qregexp.h>
|
|
#include <qptrstack.h>
|
|
|
|
#include "config.h"
|
|
#include "version.h"
|
|
|
|
#include "lang_cfg.h"
|
|
|
|
#undef Config_getString
|
|
#undef Config_getInt
|
|
#undef Config_getList
|
|
#undef Config_getEnum
|
|
#undef Config_getBool
|
|
|
|
// use in-class definitions
|
|
#define Config_getString(val) getString(__FILE__,__LINE__,val)
|
|
#define Config_getInt(val) getInt(__FILE__,__LINE__,val)
|
|
#define Config_getList(val) getList(__FILE__,__LINE__,val)
|
|
#define Config_getEnum(val) getEnum(__FILE__,__LINE__,val)
|
|
#define Config_getBool(val) getBool(__FILE__,__LINE__,val)
|
|
|
|
void config_err(const char *fmt, ...)
|
|
{
|
|
va_list args;
|
|
va_start(args, fmt);
|
|
vfprintf(stderr, fmt, args);
|
|
va_end(args);
|
|
}
|
|
void config_warn(const char *fmt, ...)
|
|
{
|
|
va_list args;
|
|
va_start(args, fmt);
|
|
vfprintf(stderr, fmt, args);
|
|
va_end(args);
|
|
}
|
|
|
|
#define MAX_INCLUDE_DEPTH 10
|
|
#define YY_NEVER_INTERACTIVE 1
|
|
|
|
/* -----------------------------------------------------------------
|
|
*/
|
|
|
|
QCString ConfigOption::convertToComment(const QCString &s)
|
|
{
|
|
QCString result;
|
|
if (s.isEmpty()) return result;
|
|
else
|
|
{
|
|
result+="# ";
|
|
QCString tmp=s.stripWhiteSpace();
|
|
char *p=tmp.data();
|
|
char c;
|
|
while ((c=*p++))
|
|
{
|
|
if (c=='\n') result+="\n# ";
|
|
else result+=c;
|
|
}
|
|
result+='\n';
|
|
}
|
|
return result;
|
|
}
|
|
|
|
void ConfigOption::writeBoolValue(QTextStream &t,bool v)
|
|
{
|
|
if (v) t << "YES"; else t << "NO";
|
|
}
|
|
|
|
void ConfigOption::writeIntValue(QTextStream &t,int i)
|
|
{
|
|
t << i;
|
|
}
|
|
|
|
void ConfigOption::writeStringValue(QTextStream &t,QCString &s)
|
|
{
|
|
const char *p=s.data();
|
|
char c;
|
|
bool needsEscaping=FALSE;
|
|
if (p)
|
|
{
|
|
while ((c=*p++)!=0 && !needsEscaping)
|
|
needsEscaping = (c==' ' || c=='\n' || c=='\t' || c=='"' || c=='#');
|
|
if (needsEscaping)
|
|
{
|
|
t << "\"";
|
|
p=s.data();
|
|
while (*p)
|
|
{
|
|
if (*p=='"') t << "\\"; // escape quotes
|
|
t << *p++;
|
|
}
|
|
t << "\"";
|
|
}
|
|
else
|
|
{
|
|
t << s;
|
|
}
|
|
}
|
|
}
|
|
|
|
void ConfigOption::writeStringList(QTextStream &t,QStrList &l)
|
|
{
|
|
const char *p = l.first();
|
|
bool first=TRUE;
|
|
while (p)
|
|
{
|
|
QCString s=p;
|
|
if (!first) t << " ";
|
|
first=FALSE;
|
|
writeStringValue(t,s);
|
|
p = l.next();
|
|
if (p) t << " \\" << endl;
|
|
}
|
|
}
|
|
|
|
/* -----------------------------------------------------------------
|
|
*/
|
|
|
|
Config *Config::m_instance = 0;
|
|
|
|
void ConfigInt::convertStrToVal()
|
|
{
|
|
if (!m_valueString.isEmpty())
|
|
{
|
|
bool ok;
|
|
int val = m_valueString.toInt(&ok);
|
|
if (!ok || val<m_minVal || val>m_maxVal)
|
|
{
|
|
config_warn("Warning: argument `%s' for option %s is not a valid number in the range [%d..%d]!\n"
|
|
"Using the default: %d!\n",m_valueString.data(),m_name.data(),m_minVal,m_maxVal,m_value);
|
|
}
|
|
m_value=val;
|
|
}
|
|
}
|
|
|
|
void ConfigBool::convertStrToVal()
|
|
{
|
|
QCString val = m_valueString.stripWhiteSpace().lower();
|
|
if (!val.isEmpty())
|
|
{
|
|
if (val=="yes" || val=="true" || val=="1")
|
|
{
|
|
m_value=TRUE;
|
|
}
|
|
else if (val=="no" || val=="false" || val=="0")
|
|
{
|
|
m_value=FALSE;
|
|
}
|
|
else
|
|
{
|
|
config_warn("Warning: argument `%s' for option %s is not a valid boolean value\n"
|
|
"Using the default: %s!\n",m_valueString.data(),m_name.data(),m_value?"YES":"NO");
|
|
}
|
|
}
|
|
}
|
|
|
|
QCString &Config::getString(const char *fileName,int num,const char *name) const
|
|
{
|
|
ConfigOption *opt = m_dict->find(name);
|
|
if (opt==0)
|
|
{
|
|
config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
|
|
exit(1);
|
|
}
|
|
else if (opt->kind()!=ConfigOption::O_String)
|
|
{
|
|
config_err("%s<%d>: Internal error: Requested option %s not of string type!\n",fileName,num,name);
|
|
exit(1);
|
|
}
|
|
return *((ConfigString *)opt)->valueRef();
|
|
}
|
|
|
|
QStrList &Config::getList(const char *fileName,int num,const char *name) const
|
|
{
|
|
ConfigOption *opt = m_dict->find(name);
|
|
if (opt==0)
|
|
{
|
|
config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
|
|
exit(1);
|
|
}
|
|
else if (opt->kind()!=ConfigOption::O_List)
|
|
{
|
|
config_err("%d<%d>: Internal error: Requested option %s not of list type!\n",fileName,num,name);
|
|
exit(1);
|
|
}
|
|
return *((ConfigList *)opt)->valueRef();
|
|
}
|
|
|
|
QCString &Config::getEnum(const char *fileName,int num,const char *name) const
|
|
{
|
|
ConfigOption *opt = m_dict->find(name);
|
|
if (opt==0)
|
|
{
|
|
config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
|
|
exit(1);
|
|
}
|
|
else if (opt->kind()!=ConfigOption::O_Enum)
|
|
{
|
|
config_err("%s<%d>: Internal error: Requested option %s not of enum type!\n",fileName,num,name);
|
|
exit(1);
|
|
}
|
|
return *((ConfigEnum *)opt)->valueRef();
|
|
}
|
|
|
|
int &Config::getInt(const char *fileName,int num,const char *name) const
|
|
{
|
|
ConfigOption *opt = m_dict->find(name);
|
|
if (opt==0)
|
|
{
|
|
config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
|
|
exit(1);
|
|
}
|
|
else if (opt->kind()!=ConfigOption::O_Int)
|
|
{
|
|
config_err("%s<%d>: Internal error: Requested option %s not of integer type!\n",fileName,num,name);
|
|
exit(1);
|
|
}
|
|
return *((ConfigInt *)opt)->valueRef();
|
|
}
|
|
|
|
bool &Config::getBool(const char *fileName,int num,const char *name) const
|
|
{
|
|
ConfigOption *opt = m_dict->find(name);
|
|
if (opt==0)
|
|
{
|
|
config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
|
|
exit(1);
|
|
}
|
|
else if (opt->kind()!=ConfigOption::O_Bool)
|
|
{
|
|
config_err("%s<%d>: Internal error: Requested option %s not of integer type!\n",fileName,num,name);
|
|
exit(1);
|
|
}
|
|
return *((ConfigBool *)opt)->valueRef();
|
|
}
|
|
|
|
/* -----------------------------------------------------------------
|
|
*
|
|
* static variables
|
|
*/
|
|
|
|
struct ConfigFileState
|
|
{
|
|
int lineNr;
|
|
FILE *filePtr;
|
|
YY_BUFFER_STATE oldState;
|
|
YY_BUFFER_STATE newState;
|
|
QCString fileName;
|
|
};
|
|
|
|
static const char *inputString;
|
|
static int inputPosition;
|
|
static int yyLineNr;
|
|
static QCString yyFileName;
|
|
static QCString tmpString;
|
|
static QCString *s=0;
|
|
static bool *b=0;
|
|
static QStrList *l=0;
|
|
static int lastState;
|
|
static QCString elemStr;
|
|
static QCString includeName;
|
|
static QStrList includePathList;
|
|
static QPtrStack<ConfigFileState> includeStack;
|
|
static int includeDepth;
|
|
|
|
static QCString tabSizeString;
|
|
static QCString maxInitLinesString;
|
|
static QCString colsInAlphaIndexString;
|
|
static QCString enumValuesPerLineString;
|
|
static QCString treeViewWidthString;
|
|
static QCString maxDotGraphWidthString;
|
|
static QCString maxDotGraphHeightString;
|
|
|
|
static Config *config;
|
|
|
|
/* -----------------------------------------------------------------
|
|
*/
|
|
#undef YY_INPUT
|
|
#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
|
|
|
|
static int yyread(char *buf,int max_size)
|
|
{
|
|
// no file included
|
|
if (includeStack.isEmpty())
|
|
{
|
|
int c=0;
|
|
if (inputString==0) return c;
|
|
while( c < max_size && inputString[inputPosition] )
|
|
{
|
|
*buf = inputString[inputPosition++] ;
|
|
c++; buf++;
|
|
}
|
|
return c;
|
|
}
|
|
else
|
|
{
|
|
//assert(includeStack.current()->newState==YY_CURRENT_BUFFER);
|
|
return (int)fread(buf,1,max_size,includeStack.current()->filePtr);
|
|
}
|
|
}
|
|
|
|
|
|
static FILE *tryPath(const char *path,const char *fileName)
|
|
{
|
|
QCString absName=(path ? (QCString)path+"/"+fileName : (QCString)fileName);
|
|
QFileInfo fi(absName);
|
|
if (fi.exists() && fi.isFile())
|
|
{
|
|
FILE *f=fopen(absName,"r");
|
|
if (!f) config_err("Error: could not open file %s for reading\n",absName.data());
|
|
return f;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static void substEnvVarsInStrList(QStrList &sl);
|
|
static void substEnvVarsInString(QCString &s);
|
|
|
|
static bool isAbsolute(const char * fileName)
|
|
{
|
|
# ifdef _WIN32
|
|
if (isalpha (fileName [0]) && fileName[1] == ':')
|
|
fileName += 2;
|
|
# endif
|
|
char const fst = fileName [0];
|
|
if (fst == '/') {
|
|
return true;
|
|
}
|
|
# ifdef _WIN32
|
|
if (fst == '\\')
|
|
return true;
|
|
# endif
|
|
return false;
|
|
}
|
|
|
|
static FILE *findFile(const char *fileName)
|
|
{
|
|
if(isAbsolute(fileName))
|
|
return tryPath(NULL, fileName);
|
|
substEnvVarsInStrList(includePathList);
|
|
char *s=includePathList.first();
|
|
while (s) // try each of the include paths
|
|
{
|
|
FILE *f = tryPath(s,fileName);
|
|
if (f) return f;
|
|
s=includePathList.next();
|
|
}
|
|
// try cwd if includePathList fails
|
|
return tryPath(".",fileName);
|
|
}
|
|
|
|
static void readIncludeFile(const char *incName)
|
|
{
|
|
if (includeDepth==MAX_INCLUDE_DEPTH) {
|
|
config_err("Error: maximum include depth (%d) reached, %s is not included. Aborting...\n",
|
|
MAX_INCLUDE_DEPTH,incName);
|
|
exit(1);
|
|
}
|
|
|
|
QCString inc = incName;
|
|
substEnvVarsInString(inc);
|
|
inc = inc.stripWhiteSpace();
|
|
uint incLen = inc.length();
|
|
if (inc.at(0)=='"' && inc.at(incLen-1)=='"') // strip quotes
|
|
{
|
|
inc=inc.mid(1,incLen-2);
|
|
}
|
|
|
|
FILE *f;
|
|
|
|
if ((f=findFile(inc))) // see if the include file can be found
|
|
{
|
|
// For debugging
|
|
#if SHOW_INCLUDES
|
|
for (i=0;i<includeStack.count();i++) msg(" ");
|
|
msg("@INCLUDE = %s: parsing...\n",inc.data());
|
|
#endif
|
|
|
|
// store the state of the old file
|
|
ConfigFileState *fs=new ConfigFileState;
|
|
fs->oldState=YY_CURRENT_BUFFER;
|
|
fs->lineNr=yyLineNr;
|
|
fs->fileName=yyFileName;
|
|
fs->filePtr=f;
|
|
// push the state on the stack
|
|
includeStack.push(fs);
|
|
// set the scanner to the include file
|
|
yy_switch_to_buffer(yy_create_buffer(f, YY_BUF_SIZE));
|
|
fs->newState=YY_CURRENT_BUFFER;
|
|
yyFileName=inc;
|
|
includeDepth++;
|
|
}
|
|
else
|
|
{
|
|
config_err("Error: @INCLUDE = %s: not found!\n",inc.data());
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
|
|
#define YY_NO_UNPUT 1
|
|
#define Start 1
|
|
|
|
#define SkipComment 2
|
|
|
|
#define SkipInvalid 3
|
|
|
|
#define GetString 4
|
|
|
|
#define GetBool 5
|
|
|
|
#define GetStrList 6
|
|
|
|
#define GetQuotedString 7
|
|
|
|
#define GetEnvVar 8
|
|
|
|
#define Include 9
|
|
|
|
|
|
/* Macros after this point can all be overridden by user definitions in
|
|
* section 1.
|
|
*/
|
|
|
|
#ifndef YY_SKIP_YYWRAP
|
|
#ifdef __cplusplus
|
|
extern "C" int yywrap YY_PROTO(( void ));
|
|
#else
|
|
extern int yywrap YY_PROTO(( void ));
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef YY_NO_UNPUT
|
|
static void yyunput YY_PROTO(( int c, char *buf_ptr ));
|
|
#endif
|
|
|
|
#ifndef yytext_ptr
|
|
static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
|
|
#endif
|
|
|
|
#ifdef YY_NEED_STRLEN
|
|
static int yy_flex_strlen YY_PROTO(( yyconst char * ));
|
|
#endif
|
|
|
|
#ifndef YY_NO_INPUT
|
|
#ifdef __cplusplus
|
|
static int yyinput YY_PROTO(( void ));
|
|
#else
|
|
static int input YY_PROTO(( void ));
|
|
#endif
|
|
#endif
|
|
|
|
#if YY_STACK_USED
|
|
static int yy_start_stack_ptr = 0;
|
|
static int yy_start_stack_depth = 0;
|
|
static int *yy_start_stack = 0;
|
|
#ifndef YY_NO_PUSH_STATE
|
|
static void yy_push_state YY_PROTO(( int new_state ));
|
|
#endif
|
|
#ifndef YY_NO_POP_STATE
|
|
static void yy_pop_state YY_PROTO(( void ));
|
|
#endif
|
|
#ifndef YY_NO_TOP_STATE
|
|
static int yy_top_state YY_PROTO(( void ));
|
|
#endif
|
|
|
|
#else
|
|
#define YY_NO_PUSH_STATE 1
|
|
#define YY_NO_POP_STATE 1
|
|
#define YY_NO_TOP_STATE 1
|
|
#endif
|
|
|
|
#ifdef YY_MALLOC_DECL
|
|
YY_MALLOC_DECL
|
|
#else
|
|
#if __STDC__
|
|
#ifndef __cplusplus
|
|
#include <stdlib.h>
|
|
#endif
|
|
#else
|
|
/* Just try to get by without declaring the routines. This will fail
|
|
* miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
|
|
* or sizeof(void*) != sizeof(int).
|
|
*/
|
|
#endif
|
|
#endif
|
|
|
|
/* Amount of stuff to slurp up with each read. */
|
|
#ifndef YY_READ_BUF_SIZE
|
|
#define YY_READ_BUF_SIZE 8192
|
|
#endif
|
|
|
|
/* Copy whatever the last rule matched to the standard output. */
|
|
|
|
#ifndef ECHO
|
|
/* This used to be an fputs(), but since the string might contain NUL's,
|
|
* we now use fwrite().
|
|
*/
|
|
#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
|
|
#endif
|
|
|
|
/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
|
|
* is returned in "result".
|
|
*/
|
|
#ifndef YY_INPUT
|
|
#define YY_INPUT(buf,result,max_size) \
|
|
if ( yy_current_buffer->yy_is_interactive ) \
|
|
{ \
|
|
int c = '*', n; \
|
|
for ( n = 0; n < max_size && \
|
|
(c = getc( yyin )) != EOF && c != '\n'; ++n ) \
|
|
buf[n] = (char) c; \
|
|
if ( c == '\n' ) \
|
|
buf[n++] = (char) c; \
|
|
if ( c == EOF && ferror( yyin ) ) \
|
|
YY_FATAL_ERROR( "input in flex scanner failed" ); \
|
|
result = n; \
|
|
} \
|
|
else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
|
|
&& ferror( yyin ) ) \
|
|
YY_FATAL_ERROR( "input in flex scanner failed" );
|
|
#endif
|
|
|
|
/* No semi-colon after return; correct usage is to write "yyterminate();" -
|
|
* we don't want an extra ';' after the "return" because that will cause
|
|
* some compilers to complain about unreachable statements.
|
|
*/
|
|
#ifndef yyterminate
|
|
#define yyterminate() return YY_NULL
|
|
#endif
|
|
|
|
/* Number of entries by which start-condition stack grows. */
|
|
#ifndef YY_START_STACK_INCR
|
|
#define YY_START_STACK_INCR 25
|
|
#endif
|
|
|
|
/* Report a fatal error. */
|
|
#ifndef YY_FATAL_ERROR
|
|
#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
|
|
#endif
|
|
|
|
/* Default declaration of generated scanner - a define so the user can
|
|
* easily add parameters.
|
|
*/
|
|
#ifndef YY_DECL
|
|
#define YY_DECL int yylex YY_PROTO(( void ))
|
|
#endif
|
|
|
|
/* Code executed at the beginning of each rule, after yytext and yyleng
|
|
* have been set up.
|
|
*/
|
|
#ifndef YY_USER_ACTION
|
|
#define YY_USER_ACTION
|
|
#endif
|
|
|
|
/* Code executed at the end of each rule. */
|
|
#ifndef YY_BREAK
|
|
#define YY_BREAK break;
|
|
#endif
|
|
|
|
#define YY_RULE_SETUP \
|
|
YY_USER_ACTION
|
|
|
|
YY_DECL
|
|
{
|
|
register yy_state_type yy_current_state;
|
|
register char *yy_cp, *yy_bp;
|
|
register int yy_act;
|
|
|
|
#line 425 "config.l"
|
|
|
|
|
|
|
|
if ( yy_init )
|
|
{
|
|
yy_init = 0;
|
|
|
|
#ifdef YY_USER_INIT
|
|
YY_USER_INIT;
|
|
#endif
|
|
|
|
if ( ! yy_start )
|
|
yy_start = 1; /* first start state */
|
|
|
|
if ( ! yyin )
|
|
yyin = stdin;
|
|
|
|
if ( ! yyout )
|
|
yyout = stdout;
|
|
|
|
if ( ! yy_current_buffer )
|
|
yy_current_buffer =
|
|
yy_create_buffer( yyin, YY_BUF_SIZE );
|
|
|
|
yy_load_buffer_state();
|
|
}
|
|
|
|
while ( 1 ) /* loops until end-of-file is reached */
|
|
{
|
|
yy_cp = yy_c_buf_p;
|
|
|
|
/* Support of yytext. */
|
|
*yy_cp = yy_hold_char;
|
|
|
|
/* yy_bp points to the position in yy_ch_buf of the start of
|
|
* the current run.
|
|
*/
|
|
yy_bp = yy_cp;
|
|
|
|
yy_current_state = yy_start;
|
|
yy_match:
|
|
do
|
|
{
|
|
register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
|
|
if ( yy_accept[yy_current_state] )
|
|
{
|
|
yy_last_accepting_state = yy_current_state;
|
|
yy_last_accepting_cpos = yy_cp;
|
|
}
|
|
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
|
|
{
|
|
yy_current_state = (int) yy_def[yy_current_state];
|
|
if ( yy_current_state >= 100 )
|
|
yy_c = yy_meta[(unsigned int) yy_c];
|
|
}
|
|
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
|
|
++yy_cp;
|
|
}
|
|
while ( yy_base[yy_current_state] != 408 );
|
|
|
|
yy_find_action:
|
|
yy_act = yy_accept[yy_current_state];
|
|
if ( yy_act == 0 )
|
|
{ /* have to back up */
|
|
yy_cp = yy_last_accepting_cpos;
|
|
yy_current_state = yy_last_accepting_state;
|
|
yy_act = yy_accept[yy_current_state];
|
|
}
|
|
|
|
YY_DO_BEFORE_ACTION;
|
|
|
|
|
|
do_action: /* This label is used only to access EOF actions. */
|
|
|
|
|
|
switch ( yy_act )
|
|
{ /* beginning of action switch */
|
|
case 0: /* must back up */
|
|
/* undo the effects of YY_DO_BEFORE_ACTION */
|
|
*yy_cp = yy_hold_char;
|
|
yy_cp = yy_last_accepting_cpos;
|
|
yy_current_state = yy_last_accepting_state;
|
|
goto yy_find_action;
|
|
|
|
case 1:
|
|
YY_RULE_SETUP
|
|
#line 427 "config.l"
|
|
|
|
YY_BREAK
|
|
case 2:
|
|
YY_RULE_SETUP
|
|
#line 428 "config.l"
|
|
{ BEGIN(SkipComment); }
|
|
YY_BREAK
|
|
case 3:
|
|
YY_RULE_SETUP
|
|
#line 429 "config.l"
|
|
{ QCString cmd=yytext;
|
|
cmd=cmd.left(cmd.length()-1).stripWhiteSpace();
|
|
ConfigOption *option = config->get(cmd);
|
|
if (option==0) // oops not known
|
|
{
|
|
config_err("Warning: ignoring unsupported tag `%s' at line %d, file %s\n",
|
|
yytext,yyLineNr,yyFileName.data());
|
|
BEGIN(SkipInvalid);
|
|
}
|
|
else // known tag
|
|
{
|
|
switch(option->kind())
|
|
{
|
|
case ConfigOption::O_Info:
|
|
// shouldn't get here!
|
|
BEGIN(SkipInvalid);
|
|
break;
|
|
case ConfigOption::O_List:
|
|
l = ((ConfigList *)option)->valueRef();
|
|
l->clear();
|
|
elemStr="";
|
|
BEGIN(GetStrList);
|
|
break;
|
|
case ConfigOption::O_Enum:
|
|
s = ((ConfigEnum *)option)->valueRef();
|
|
s->resize(0);
|
|
BEGIN(GetString);
|
|
break;
|
|
case ConfigOption::O_String:
|
|
s = ((ConfigString *)option)->valueRef();
|
|
s->resize(0);
|
|
BEGIN(GetString);
|
|
break;
|
|
case ConfigOption::O_Int:
|
|
s = ((ConfigInt *)option)->valueStringRef();
|
|
s->resize(0);
|
|
BEGIN(GetString);
|
|
break;
|
|
case ConfigOption::O_Bool:
|
|
s = ((ConfigBool *)option)->valueStringRef();
|
|
s->resize(0);
|
|
BEGIN(GetString);
|
|
break;
|
|
case ConfigOption::O_Obsolete:
|
|
config_err("Warning: Tag `%s' at line %d of file %s has become obsolete.\n"
|
|
"To avoid this warning please update your configuration "
|
|
"file using \"doxygen -u\"\n", cmd.data(),yyLineNr,yyFileName.data());
|
|
BEGIN(SkipInvalid);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
YY_BREAK
|
|
case 4:
|
|
YY_RULE_SETUP
|
|
#line 481 "config.l"
|
|
{ QCString cmd=yytext;
|
|
cmd=cmd.left(cmd.length()-2).stripWhiteSpace();
|
|
ConfigOption *option = config->get(cmd);
|
|
if (option==0) // oops not known
|
|
{
|
|
config_err("Warning: ignoring unsupported tag `%s' at line %d, file %s\n",
|
|
yytext,yyLineNr,yyFileName.data());
|
|
BEGIN(SkipInvalid);
|
|
}
|
|
else // known tag
|
|
{
|
|
switch(option->kind())
|
|
{
|
|
case ConfigOption::O_Info:
|
|
// shouldn't get here!
|
|
BEGIN(SkipInvalid);
|
|
break;
|
|
case ConfigOption::O_List:
|
|
l = ((ConfigList *)option)->valueRef();
|
|
elemStr="";
|
|
BEGIN(GetStrList);
|
|
break;
|
|
case ConfigOption::O_Enum:
|
|
case ConfigOption::O_String:
|
|
case ConfigOption::O_Int:
|
|
case ConfigOption::O_Bool:
|
|
config_err("Warning: operator += not supported for `%s'. Ignoring line at line %d, file %s\n",
|
|
yytext,yyLineNr,yyFileName.data());
|
|
BEGIN(SkipInvalid);
|
|
break;
|
|
case ConfigOption::O_Obsolete:
|
|
config_err("Warning: Tag `%s' at line %d of file %s has become obsolete.\n"
|
|
"To avoid this warning please update your configuration "
|
|
"file using \"doxygen -u\"\n", cmd.data(),yyLineNr,yyFileName.data());
|
|
BEGIN(SkipInvalid);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
YY_BREAK
|
|
case 5:
|
|
YY_RULE_SETUP
|
|
#line 520 "config.l"
|
|
{ BEGIN(GetStrList); l=&includePathList; l->clear(); elemStr=""; }
|
|
YY_BREAK
|
|
/* include a config file */
|
|
case 6:
|
|
YY_RULE_SETUP
|
|
#line 522 "config.l"
|
|
{ BEGIN(Include);}
|
|
YY_BREAK
|
|
case 7:
|
|
YY_RULE_SETUP
|
|
#line 523 "config.l"
|
|
{
|
|
readIncludeFile(yytext);
|
|
BEGIN(Start);
|
|
}
|
|
YY_BREAK
|
|
case YY_STATE_EOF(INITIAL):
|
|
case YY_STATE_EOF(Start):
|
|
case YY_STATE_EOF(SkipComment):
|
|
case YY_STATE_EOF(SkipInvalid):
|
|
case YY_STATE_EOF(GetString):
|
|
case YY_STATE_EOF(GetBool):
|
|
case YY_STATE_EOF(GetStrList):
|
|
case YY_STATE_EOF(GetQuotedString):
|
|
case YY_STATE_EOF(GetEnvVar):
|
|
case YY_STATE_EOF(Include):
|
|
#line 527 "config.l"
|
|
{
|
|
//printf("End of include file\n");
|
|
//printf("Include stack depth=%d\n",g_includeStack.count());
|
|
if (includeStack.isEmpty())
|
|
{
|
|
//printf("Terminating scanner!\n");
|
|
yyterminate();
|
|
}
|
|
else
|
|
{
|
|
ConfigFileState *fs=includeStack.pop();
|
|
fclose(fs->filePtr);
|
|
YY_BUFFER_STATE oldBuf = YY_CURRENT_BUFFER;
|
|
yy_switch_to_buffer( fs->oldState );
|
|
yy_delete_buffer( oldBuf );
|
|
yyLineNr=fs->lineNr;
|
|
yyFileName=fs->fileName;
|
|
delete fs; fs=0;
|
|
includeDepth--;
|
|
}
|
|
}
|
|
YY_BREAK
|
|
case 8:
|
|
YY_RULE_SETUP
|
|
#line 549 "config.l"
|
|
{ config_err("Warning: ignoring unknown tag `%s' at line %d, file %s\n",yytext,yyLineNr,yyFileName.data()); }
|
|
YY_BREAK
|
|
case 9:
|
|
YY_RULE_SETUP
|
|
#line 550 "config.l"
|
|
{ yyLineNr++; BEGIN(Start); }
|
|
YY_BREAK
|
|
case 10:
|
|
YY_RULE_SETUP
|
|
#line 551 "config.l"
|
|
{
|
|
yyLineNr++;
|
|
if (!elemStr.isEmpty())
|
|
{
|
|
//printf("elemStr1=`%s'\n",elemStr.data());
|
|
l->append(elemStr);
|
|
}
|
|
BEGIN(Start);
|
|
}
|
|
YY_BREAK
|
|
case 11:
|
|
YY_RULE_SETUP
|
|
#line 560 "config.l"
|
|
{
|
|
if (!elemStr.isEmpty())
|
|
{
|
|
//printf("elemStr2=`%s'\n",elemStr.data());
|
|
l->append(elemStr);
|
|
}
|
|
elemStr.resize(0);
|
|
}
|
|
YY_BREAK
|
|
case 12:
|
|
YY_RULE_SETUP
|
|
#line 568 "config.l"
|
|
{ (*s)+=yytext; }
|
|
YY_BREAK
|
|
case 13:
|
|
YY_RULE_SETUP
|
|
#line 569 "config.l"
|
|
{ lastState=YY_START;
|
|
BEGIN(GetQuotedString);
|
|
tmpString.resize(0);
|
|
}
|
|
YY_BREAK
|
|
case 14:
|
|
YY_RULE_SETUP
|
|
#line 573 "config.l"
|
|
{
|
|
//printf("Quoted String = `%s'\n",tmpString.data());
|
|
if (lastState==GetString)
|
|
(*s)+=tmpString;
|
|
else
|
|
elemStr+=tmpString;
|
|
if (*yytext=='\n')
|
|
{
|
|
config_err("Warning: Missing end quote (\") on line %d, file %s\n",yyLineNr,yyFileName.data());
|
|
yyLineNr++;
|
|
}
|
|
BEGIN(lastState);
|
|
}
|
|
YY_BREAK
|
|
case 15:
|
|
YY_RULE_SETUP
|
|
#line 586 "config.l"
|
|
{
|
|
tmpString+='"';
|
|
}
|
|
YY_BREAK
|
|
case 16:
|
|
YY_RULE_SETUP
|
|
#line 589 "config.l"
|
|
{ tmpString+=*yytext; }
|
|
YY_BREAK
|
|
case 17:
|
|
YY_RULE_SETUP
|
|
#line 590 "config.l"
|
|
{
|
|
QCString bs=yytext;
|
|
bs=bs.upper();
|
|
if (bs=="YES" || bs=="1")
|
|
*b=TRUE;
|
|
else if (bs=="NO" || bs=="0")
|
|
*b=FALSE;
|
|
else
|
|
{
|
|
*b=FALSE;
|
|
config_warn("Warning: Invalid value `%s' for "
|
|
"boolean tag in line %d, file %s; use YES or NO\n",
|
|
bs.data(),yyLineNr,yyFileName.data());
|
|
}
|
|
}
|
|
YY_BREAK
|
|
case 18:
|
|
YY_RULE_SETUP
|
|
#line 605 "config.l"
|
|
{
|
|
elemStr+=yytext;
|
|
}
|
|
YY_BREAK
|
|
case 19:
|
|
YY_RULE_SETUP
|
|
#line 608 "config.l"
|
|
{ yyLineNr++; BEGIN(Start); }
|
|
YY_BREAK
|
|
case 20:
|
|
YY_RULE_SETUP
|
|
#line 609 "config.l"
|
|
{ yyLineNr++; BEGIN(Start); }
|
|
YY_BREAK
|
|
case 21:
|
|
YY_RULE_SETUP
|
|
#line 610 "config.l"
|
|
{ yyLineNr++; }
|
|
YY_BREAK
|
|
case 22:
|
|
YY_RULE_SETUP
|
|
#line 611 "config.l"
|
|
|
|
YY_BREAK
|
|
case 23:
|
|
YY_RULE_SETUP
|
|
#line 612 "config.l"
|
|
{ yyLineNr++ ; }
|
|
YY_BREAK
|
|
case 24:
|
|
YY_RULE_SETUP
|
|
#line 614 "config.l"
|
|
ECHO;
|
|
YY_BREAK
|
|
|
|
case YY_END_OF_BUFFER:
|
|
{
|
|
/* Amount of text matched not including the EOB char. */
|
|
int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
|
|
|
|
/* Undo the effects of YY_DO_BEFORE_ACTION. */
|
|
*yy_cp = yy_hold_char;
|
|
YY_RESTORE_YY_MORE_OFFSET
|
|
|
|
if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
|
|
{
|
|
/* We're scanning a new file or input source. It's
|
|
* possible that this happened because the user
|
|
* just pointed yyin at a new source and called
|
|
* yylex(). If so, then we have to assure
|
|
* consistency between yy_current_buffer and our
|
|
* globals. Here is the right place to do so, because
|
|
* this is the first action (other than possibly a
|
|
* back-up) that will match for the new input source.
|
|
*/
|
|
yy_n_chars = yy_current_buffer->yy_n_chars;
|
|
yy_current_buffer->yy_input_file = yyin;
|
|
yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
|
|
}
|
|
|
|
/* Note that here we test for yy_c_buf_p "<=" to the position
|
|
* of the first EOB in the buffer, since yy_c_buf_p will
|
|
* already have been incremented past the NUL character
|
|
* (since all states make transitions on EOB to the
|
|
* end-of-buffer state). Contrast this with the test
|
|
* in input().
|
|
*/
|
|
if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
|
|
{ /* This was really a NUL. */
|
|
yy_state_type yy_next_state;
|
|
|
|
yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
|
|
|
|
yy_current_state = yy_get_previous_state();
|
|
|
|
/* Okay, we're now positioned to make the NUL
|
|
* transition. We couldn't have
|
|
* yy_get_previous_state() go ahead and do it
|
|
* for us because it doesn't know how to deal
|
|
* with the possibility of jamming (and we don't
|
|
* want to build jamming into it because then it
|
|
* will run more slowly).
|
|
*/
|
|
|
|
yy_next_state = yy_try_NUL_trans( yy_current_state );
|
|
|
|
yy_bp = yytext_ptr + YY_MORE_ADJ;
|
|
|
|
if ( yy_next_state )
|
|
{
|
|
/* Consume the NUL. */
|
|
yy_cp = ++yy_c_buf_p;
|
|
yy_current_state = yy_next_state;
|
|
goto yy_match;
|
|
}
|
|
|
|
else
|
|
{
|
|
yy_cp = yy_c_buf_p;
|
|
goto yy_find_action;
|
|
}
|
|
}
|
|
|
|
else switch ( yy_get_next_buffer() )
|
|
{
|
|
case EOB_ACT_END_OF_FILE:
|
|
{
|
|
yy_did_buffer_switch_on_eof = 0;
|
|
|
|
if ( yywrap() )
|
|
{
|
|
/* Note: because we've taken care in
|
|
* yy_get_next_buffer() to have set up
|
|
* yytext, we can now set up
|
|
* yy_c_buf_p so that if some total
|
|
* hoser (like flex itself) wants to
|
|
* call the scanner after we return the
|
|
* YY_NULL, it'll still work - another
|
|
* YY_NULL will get returned.
|
|
*/
|
|
yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
|
|
|
|
yy_act = YY_STATE_EOF(YY_START);
|
|
goto do_action;
|
|
}
|
|
|
|
else
|
|
{
|
|
if ( ! yy_did_buffer_switch_on_eof )
|
|
YY_NEW_FILE;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case EOB_ACT_CONTINUE_SCAN:
|
|
yy_c_buf_p =
|
|
yytext_ptr + yy_amount_of_matched_text;
|
|
|
|
yy_current_state = yy_get_previous_state();
|
|
|
|
yy_cp = yy_c_buf_p;
|
|
yy_bp = yytext_ptr + YY_MORE_ADJ;
|
|
goto yy_match;
|
|
|
|
case EOB_ACT_LAST_MATCH:
|
|
yy_c_buf_p =
|
|
&yy_current_buffer->yy_ch_buf[yy_n_chars];
|
|
|
|
yy_current_state = yy_get_previous_state();
|
|
|
|
yy_cp = yy_c_buf_p;
|
|
yy_bp = yytext_ptr + YY_MORE_ADJ;
|
|
goto yy_find_action;
|
|
}
|
|
break;
|
|
}
|
|
|
|
default:
|
|
YY_FATAL_ERROR(
|
|
"fatal flex scanner internal error--no action found" );
|
|
} /* end of action switch */
|
|
} /* end of scanning one token */
|
|
} /* end of yylex */
|
|
|
|
|
|
/* yy_get_next_buffer - try to read in a new buffer
|
|
*
|
|
* Returns a code representing an action:
|
|
* EOB_ACT_LAST_MATCH -
|
|
* EOB_ACT_CONTINUE_SCAN - continue scanning from current position
|
|
* EOB_ACT_END_OF_FILE - end of file
|
|
*/
|
|
|
|
static int yy_get_next_buffer()
|
|
{
|
|
register char *dest = yy_current_buffer->yy_ch_buf;
|
|
register char *source = yytext_ptr;
|
|
register int number_to_move, i;
|
|
int ret_val;
|
|
|
|
if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
|
|
YY_FATAL_ERROR(
|
|
"fatal flex scanner internal error--end of buffer missed" );
|
|
|
|
if ( yy_current_buffer->yy_fill_buffer == 0 )
|
|
{ /* Don't try to fill the buffer, so this is an EOF. */
|
|
if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
|
|
{
|
|
/* We matched a single character, the EOB, so
|
|
* treat this as a final EOF.
|
|
*/
|
|
return EOB_ACT_END_OF_FILE;
|
|
}
|
|
|
|
else
|
|
{
|
|
/* We matched some text prior to the EOB, first
|
|
* process it.
|
|
*/
|
|
return EOB_ACT_LAST_MATCH;
|
|
}
|
|
}
|
|
|
|
/* Try to read more data. */
|
|
|
|
/* First move last chars to start of buffer. */
|
|
number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
|
|
|
|
for ( i = 0; i < number_to_move; ++i )
|
|
*(dest++) = *(source++);
|
|
|
|
if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
|
|
/* don't do the read, it's not guaranteed to return an EOF,
|
|
* just force an EOF
|
|
*/
|
|
yy_current_buffer->yy_n_chars = yy_n_chars = 0;
|
|
|
|
else
|
|
{
|
|
int num_to_read =
|
|
yy_current_buffer->yy_buf_size - number_to_move - 1;
|
|
|
|
while ( num_to_read <= 0 )
|
|
{ /* Not enough room in the buffer - grow it. */
|
|
#ifdef YY_USES_REJECT
|
|
YY_FATAL_ERROR(
|
|
"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
|
|
#else
|
|
|
|
/* just a shorter name for the current buffer */
|
|
YY_BUFFER_STATE b = yy_current_buffer;
|
|
|
|
int yy_c_buf_p_offset =
|
|
(int) (yy_c_buf_p - b->yy_ch_buf);
|
|
|
|
if ( b->yy_is_our_buffer )
|
|
{
|
|
int new_size = b->yy_buf_size * 2;
|
|
|
|
if ( new_size <= 0 )
|
|
b->yy_buf_size += b->yy_buf_size / 8;
|
|
else
|
|
b->yy_buf_size *= 2;
|
|
|
|
b->yy_ch_buf = (char *)
|
|
/* Include room in for 2 EOB chars. */
|
|
yy_flex_realloc( (void *) b->yy_ch_buf,
|
|
b->yy_buf_size + 2 );
|
|
}
|
|
else
|
|
/* Can't grow it, we don't own it. */
|
|
b->yy_ch_buf = 0;
|
|
|
|
if ( ! b->yy_ch_buf )
|
|
YY_FATAL_ERROR(
|
|
"fatal error - scanner input buffer overflow" );
|
|
|
|
yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
|
|
|
|
num_to_read = yy_current_buffer->yy_buf_size -
|
|
number_to_move - 1;
|
|
#endif
|
|
}
|
|
|
|
if ( num_to_read > YY_READ_BUF_SIZE )
|
|
num_to_read = YY_READ_BUF_SIZE;
|
|
|
|
/* Read in more data. */
|
|
YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
|
|
yy_n_chars, num_to_read );
|
|
|
|
yy_current_buffer->yy_n_chars = yy_n_chars;
|
|
}
|
|
|
|
if ( yy_n_chars == 0 )
|
|
{
|
|
if ( number_to_move == YY_MORE_ADJ )
|
|
{
|
|
ret_val = EOB_ACT_END_OF_FILE;
|
|
yyrestart( yyin );
|
|
}
|
|
|
|
else
|
|
{
|
|
ret_val = EOB_ACT_LAST_MATCH;
|
|
yy_current_buffer->yy_buffer_status =
|
|
YY_BUFFER_EOF_PENDING;
|
|
}
|
|
}
|
|
|
|
else
|
|
ret_val = EOB_ACT_CONTINUE_SCAN;
|
|
|
|
yy_n_chars += number_to_move;
|
|
yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
|
|
yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
|
|
|
|
yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
|
|
|
|
return ret_val;
|
|
}
|
|
|
|
|
|
/* yy_get_previous_state - get the state just before the EOB char was reached */
|
|
|
|
static yy_state_type yy_get_previous_state()
|
|
{
|
|
register yy_state_type yy_current_state;
|
|
register char *yy_cp;
|
|
|
|
yy_current_state = yy_start;
|
|
|
|
for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
|
|
{
|
|
register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 28);
|
|
if ( yy_accept[yy_current_state] )
|
|
{
|
|
yy_last_accepting_state = yy_current_state;
|
|
yy_last_accepting_cpos = yy_cp;
|
|
}
|
|
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
|
|
{
|
|
yy_current_state = (int) yy_def[yy_current_state];
|
|
if ( yy_current_state >= 100 )
|
|
yy_c = yy_meta[(unsigned int) yy_c];
|
|
}
|
|
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
|
|
}
|
|
|
|
return yy_current_state;
|
|
}
|
|
|
|
|
|
/* yy_try_NUL_trans - try to make a transition on the NUL character
|
|
*
|
|
* synopsis
|
|
* next_state = yy_try_NUL_trans( current_state );
|
|
*/
|
|
|
|
#ifdef YY_USE_PROTOS
|
|
static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
|
|
#else
|
|
static yy_state_type yy_try_NUL_trans( yy_current_state )
|
|
yy_state_type yy_current_state;
|
|
#endif
|
|
{
|
|
register int yy_is_jam;
|
|
register char *yy_cp = yy_c_buf_p;
|
|
|
|
register YY_CHAR yy_c = 28;
|
|
if ( yy_accept[yy_current_state] )
|
|
{
|
|
yy_last_accepting_state = yy_current_state;
|
|
yy_last_accepting_cpos = yy_cp;
|
|
}
|
|
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
|
|
{
|
|
yy_current_state = (int) yy_def[yy_current_state];
|
|
if ( yy_current_state >= 100 )
|
|
yy_c = yy_meta[(unsigned int) yy_c];
|
|
}
|
|
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
|
|
yy_is_jam = (yy_current_state == 99);
|
|
|
|
return yy_is_jam ? 0 : yy_current_state;
|
|
}
|
|
|
|
|
|
#ifndef YY_NO_UNPUT
|
|
#ifdef YY_USE_PROTOS
|
|
static void yyunput( int c, register char *yy_bp )
|
|
#else
|
|
static void yyunput( c, yy_bp )
|
|
int c;
|
|
register char *yy_bp;
|
|
#endif
|
|
{
|
|
register char *yy_cp = yy_c_buf_p;
|
|
|
|
/* undo effects of setting up yytext */
|
|
*yy_cp = yy_hold_char;
|
|
|
|
if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
|
|
{ /* need to shift things up to make room */
|
|
/* +2 for EOB chars. */
|
|
register int number_to_move = yy_n_chars + 2;
|
|
register char *dest = &yy_current_buffer->yy_ch_buf[
|
|
yy_current_buffer->yy_buf_size + 2];
|
|
register char *source =
|
|
&yy_current_buffer->yy_ch_buf[number_to_move];
|
|
|
|
while ( source > yy_current_buffer->yy_ch_buf )
|
|
*--dest = *--source;
|
|
|
|
yy_cp += (int) (dest - source);
|
|
yy_bp += (int) (dest - source);
|
|
yy_current_buffer->yy_n_chars =
|
|
yy_n_chars = yy_current_buffer->yy_buf_size;
|
|
|
|
if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
|
|
YY_FATAL_ERROR( "flex scanner push-back overflow" );
|
|
}
|
|
|
|
*--yy_cp = (char) c;
|
|
|
|
|
|
yytext_ptr = yy_bp;
|
|
yy_hold_char = *yy_cp;
|
|
yy_c_buf_p = yy_cp;
|
|
}
|
|
#endif /* ifndef YY_NO_UNPUT */
|
|
|
|
|
|
#ifdef __cplusplus
|
|
static int yyinput()
|
|
#else
|
|
static int input()
|
|
#endif
|
|
{
|
|
int c;
|
|
|
|
*yy_c_buf_p = yy_hold_char;
|
|
|
|
if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
|
|
{
|
|
/* yy_c_buf_p now points to the character we want to return.
|
|
* If this occurs *before* the EOB characters, then it's a
|
|
* valid NUL; if not, then we've hit the end of the buffer.
|
|
*/
|
|
if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
|
|
/* This was really a NUL. */
|
|
*yy_c_buf_p = '\0';
|
|
|
|
else
|
|
{ /* need more input */
|
|
int offset = yy_c_buf_p - yytext_ptr;
|
|
++yy_c_buf_p;
|
|
|
|
switch ( yy_get_next_buffer() )
|
|
{
|
|
case EOB_ACT_LAST_MATCH:
|
|
/* This happens because yy_g_n_b()
|
|
* sees that we've accumulated a
|
|
* token and flags that we need to
|
|
* try matching the token before
|
|
* proceeding. But for input(),
|
|
* there's no matching to consider.
|
|
* So convert the EOB_ACT_LAST_MATCH
|
|
* to EOB_ACT_END_OF_FILE.
|
|
*/
|
|
|
|
/* Reset buffer status. */
|
|
yyrestart( yyin );
|
|
|
|
/* fall through */
|
|
|
|
case EOB_ACT_END_OF_FILE:
|
|
{
|
|
if ( yywrap() )
|
|
return EOF;
|
|
|
|
if ( ! yy_did_buffer_switch_on_eof )
|
|
YY_NEW_FILE;
|
|
#ifdef __cplusplus
|
|
return yyinput();
|
|
#else
|
|
return input();
|
|
#endif
|
|
}
|
|
|
|
case EOB_ACT_CONTINUE_SCAN:
|
|
yy_c_buf_p = yytext_ptr + offset;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */
|
|
*yy_c_buf_p = '\0'; /* preserve yytext */
|
|
yy_hold_char = *++yy_c_buf_p;
|
|
|
|
|
|
return c;
|
|
}
|
|
|
|
|
|
#ifdef YY_USE_PROTOS
|
|
void yyrestart( FILE *input_file )
|
|
#else
|
|
void yyrestart( input_file )
|
|
FILE *input_file;
|
|
#endif
|
|
{
|
|
if ( ! yy_current_buffer )
|
|
yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
|
|
|
|
yy_init_buffer( yy_current_buffer, input_file );
|
|
yy_load_buffer_state();
|
|
}
|
|
|
|
|
|
#ifdef YY_USE_PROTOS
|
|
void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
|
|
#else
|
|
void yy_switch_to_buffer( new_buffer )
|
|
YY_BUFFER_STATE new_buffer;
|
|
#endif
|
|
{
|
|
if ( yy_current_buffer == new_buffer )
|
|
return;
|
|
|
|
if ( yy_current_buffer )
|
|
{
|
|
/* Flush out information for old buffer. */
|
|
*yy_c_buf_p = yy_hold_char;
|
|
yy_current_buffer->yy_buf_pos = yy_c_buf_p;
|
|
yy_current_buffer->yy_n_chars = yy_n_chars;
|
|
}
|
|
|
|
yy_current_buffer = new_buffer;
|
|
yy_load_buffer_state();
|
|
|
|
/* We don't actually know whether we did this switch during
|
|
* EOF (yywrap()) processing, but the only time this flag
|
|
* is looked at is after yywrap() is called, so it's safe
|
|
* to go ahead and always set it.
|
|
*/
|
|
yy_did_buffer_switch_on_eof = 1;
|
|
}
|
|
|
|
|
|
#ifdef YY_USE_PROTOS
|
|
void yy_load_buffer_state( void )
|
|
#else
|
|
void yy_load_buffer_state()
|
|
#endif
|
|
{
|
|
yy_n_chars = yy_current_buffer->yy_n_chars;
|
|
yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
|
|
yyin = yy_current_buffer->yy_input_file;
|
|
yy_hold_char = *yy_c_buf_p;
|
|
}
|
|
|
|
|
|
#ifdef YY_USE_PROTOS
|
|
YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
|
|
#else
|
|
YY_BUFFER_STATE yy_create_buffer( file, size )
|
|
FILE *file;
|
|
int size;
|
|
#endif
|
|
{
|
|
YY_BUFFER_STATE b;
|
|
|
|
b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
|
|
if ( ! b )
|
|
YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
|
|
|
|
b->yy_buf_size = size;
|
|
|
|
/* yy_ch_buf has to be 2 characters longer than the size given because
|
|
* we need to put in 2 end-of-buffer characters.
|
|
*/
|
|
b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
|
|
if ( ! b->yy_ch_buf )
|
|
YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
|
|
|
|
b->yy_is_our_buffer = 1;
|
|
|
|
yy_init_buffer( b, file );
|
|
|
|
return b;
|
|
}
|
|
|
|
|
|
#ifdef YY_USE_PROTOS
|
|
void yy_delete_buffer( YY_BUFFER_STATE b )
|
|
#else
|
|
void yy_delete_buffer( b )
|
|
YY_BUFFER_STATE b;
|
|
#endif
|
|
{
|
|
if ( ! b )
|
|
return;
|
|
|
|
if ( b == yy_current_buffer )
|
|
yy_current_buffer = (YY_BUFFER_STATE) 0;
|
|
|
|
if ( b->yy_is_our_buffer )
|
|
yy_flex_free( (void *) b->yy_ch_buf );
|
|
|
|
yy_flex_free( (void *) b );
|
|
}
|
|
|
|
|
|
#ifndef YY_ALWAYS_INTERACTIVE
|
|
#ifndef YY_NEVER_INTERACTIVE
|
|
extern int isatty YY_PROTO(( int ));
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef YY_USE_PROTOS
|
|
void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
|
|
#else
|
|
void yy_init_buffer( b, file )
|
|
YY_BUFFER_STATE b;
|
|
FILE *file;
|
|
#endif
|
|
|
|
|
|
{
|
|
yy_flush_buffer( b );
|
|
|
|
b->yy_input_file = file;
|
|
b->yy_fill_buffer = 1;
|
|
|
|
#if YY_ALWAYS_INTERACTIVE
|
|
b->yy_is_interactive = 1;
|
|
#else
|
|
#if YY_NEVER_INTERACTIVE
|
|
b->yy_is_interactive = 0;
|
|
#else
|
|
b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
|
|
#endif
|
|
#endif
|
|
}
|
|
|
|
|
|
#ifdef YY_USE_PROTOS
|
|
void yy_flush_buffer( YY_BUFFER_STATE b )
|
|
#else
|
|
void yy_flush_buffer( b )
|
|
YY_BUFFER_STATE b;
|
|
#endif
|
|
|
|
{
|
|
if ( ! b )
|
|
return;
|
|
|
|
b->yy_n_chars = 0;
|
|
|
|
/* We always need two end-of-buffer characters. The first causes
|
|
* a transition to the end-of-buffer state. The second causes
|
|
* a jam in that state.
|
|
*/
|
|
b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
|
|
b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
|
|
|
|
b->yy_buf_pos = &b->yy_ch_buf[0];
|
|
|
|
b->yy_at_bol = 1;
|
|
b->yy_buffer_status = YY_BUFFER_NEW;
|
|
|
|
if ( b == yy_current_buffer )
|
|
yy_load_buffer_state();
|
|
}
|
|
|
|
|
|
#ifndef YY_NO_SCAN_BUFFER
|
|
#ifdef YY_USE_PROTOS
|
|
YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
|
|
#else
|
|
YY_BUFFER_STATE yy_scan_buffer( base, size )
|
|
char *base;
|
|
yy_size_t size;
|
|
#endif
|
|
{
|
|
YY_BUFFER_STATE b;
|
|
|
|
if ( size < 2 ||
|
|
base[size-2] != YY_END_OF_BUFFER_CHAR ||
|
|
base[size-1] != YY_END_OF_BUFFER_CHAR )
|
|
/* They forgot to leave room for the EOB's. */
|
|
return 0;
|
|
|
|
b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
|
|
if ( ! b )
|
|
YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
|
|
|
|
b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
|
|
b->yy_buf_pos = b->yy_ch_buf = base;
|
|
b->yy_is_our_buffer = 0;
|
|
b->yy_input_file = 0;
|
|
b->yy_n_chars = b->yy_buf_size;
|
|
b->yy_is_interactive = 0;
|
|
b->yy_at_bol = 1;
|
|
b->yy_fill_buffer = 0;
|
|
b->yy_buffer_status = YY_BUFFER_NEW;
|
|
|
|
yy_switch_to_buffer( b );
|
|
|
|
return b;
|
|
}
|
|
#endif
|
|
|
|
|
|
#ifndef YY_NO_SCAN_STRING
|
|
#ifdef YY_USE_PROTOS
|
|
YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
|
|
#else
|
|
YY_BUFFER_STATE yy_scan_string( yy_str )
|
|
yyconst char *yy_str;
|
|
#endif
|
|
{
|
|
int len;
|
|
for ( len = 0; yy_str[len]; ++len )
|
|
;
|
|
|
|
return yy_scan_bytes( yy_str, len );
|
|
}
|
|
#endif
|
|
|
|
|
|
#ifndef YY_NO_SCAN_BYTES
|
|
#ifdef YY_USE_PROTOS
|
|
YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
|
|
#else
|
|
YY_BUFFER_STATE yy_scan_bytes( bytes, len )
|
|
yyconst char *bytes;
|
|
int len;
|
|
#endif
|
|
{
|
|
YY_BUFFER_STATE b;
|
|
char *buf;
|
|
yy_size_t n;
|
|
int i;
|
|
|
|
/* Get memory for full buffer, including space for trailing EOB's. */
|
|
n = len + 2;
|
|
buf = (char *) yy_flex_alloc( n );
|
|
if ( ! buf )
|
|
YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
|
|
|
|
for ( i = 0; i < len; ++i )
|
|
buf[i] = bytes[i];
|
|
|
|
buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
|
|
|
|
b = yy_scan_buffer( buf, n );
|
|
if ( ! b )
|
|
YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
|
|
|
|
/* It's okay to grow etc. this buffer, and we should throw it
|
|
* away when we're done.
|
|
*/
|
|
b->yy_is_our_buffer = 1;
|
|
|
|
return b;
|
|
}
|
|
#endif
|
|
|
|
|
|
#ifndef YY_NO_PUSH_STATE
|
|
#ifdef YY_USE_PROTOS
|
|
static void yy_push_state( int new_state )
|
|
#else
|
|
static void yy_push_state( new_state )
|
|
int new_state;
|
|
#endif
|
|
{
|
|
if ( yy_start_stack_ptr >= yy_start_stack_depth )
|
|
{
|
|
yy_size_t new_size;
|
|
|
|
yy_start_stack_depth += YY_START_STACK_INCR;
|
|
new_size = yy_start_stack_depth * sizeof( int );
|
|
|
|
if ( ! yy_start_stack )
|
|
yy_start_stack = (int *) yy_flex_alloc( new_size );
|
|
|
|
else
|
|
yy_start_stack = (int *) yy_flex_realloc(
|
|
(void *) yy_start_stack, new_size );
|
|
|
|
if ( ! yy_start_stack )
|
|
YY_FATAL_ERROR(
|
|
"out of memory expanding start-condition stack" );
|
|
}
|
|
|
|
yy_start_stack[yy_start_stack_ptr++] = YY_START;
|
|
|
|
BEGIN(new_state);
|
|
}
|
|
#endif
|
|
|
|
|
|
#ifndef YY_NO_POP_STATE
|
|
static void yy_pop_state()
|
|
{
|
|
if ( --yy_start_stack_ptr < 0 )
|
|
YY_FATAL_ERROR( "start-condition stack underflow" );
|
|
|
|
BEGIN(yy_start_stack[yy_start_stack_ptr]);
|
|
}
|
|
#endif
|
|
|
|
|
|
#ifndef YY_NO_TOP_STATE
|
|
static int yy_top_state()
|
|
{
|
|
return yy_start_stack[yy_start_stack_ptr - 1];
|
|
}
|
|
#endif
|
|
|
|
#ifndef YY_EXIT_FAILURE
|
|
#define YY_EXIT_FAILURE 2
|
|
#endif
|
|
|
|
#ifdef YY_USE_PROTOS
|
|
static void yy_fatal_error( yyconst char msg[] )
|
|
#else
|
|
static void yy_fatal_error( msg )
|
|
char msg[];
|
|
#endif
|
|
{
|
|
(void) fprintf( stderr, "%s\n", msg );
|
|
exit( YY_EXIT_FAILURE );
|
|
}
|
|
|
|
|
|
|
|
/* Redefine yyless() so it works in section 3 code. */
|
|
|
|
#undef yyless
|
|
#define yyless(n) \
|
|
do \
|
|
{ \
|
|
/* Undo effects of setting up yytext. */ \
|
|
yytext[yyleng] = yy_hold_char; \
|
|
yy_c_buf_p = yytext + n; \
|
|
yy_hold_char = *yy_c_buf_p; \
|
|
*yy_c_buf_p = '\0'; \
|
|
yyleng = n; \
|
|
} \
|
|
while ( 0 )
|
|
|
|
|
|
/* Internal utility routines. */
|
|
|
|
#ifndef yytext_ptr
|
|
#ifdef YY_USE_PROTOS
|
|
static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
|
|
#else
|
|
static void yy_flex_strncpy( s1, s2, n )
|
|
char *s1;
|
|
yyconst char *s2;
|
|
int n;
|
|
#endif
|
|
{
|
|
register int i;
|
|
for ( i = 0; i < n; ++i )
|
|
s1[i] = s2[i];
|
|
}
|
|
#endif
|
|
|
|
#ifdef YY_NEED_STRLEN
|
|
#ifdef YY_USE_PROTOS
|
|
static int yy_flex_strlen( yyconst char *s )
|
|
#else
|
|
static int yy_flex_strlen( s )
|
|
yyconst char *s;
|
|
#endif
|
|
{
|
|
register int n;
|
|
for ( n = 0; s[n]; ++n )
|
|
;
|
|
|
|
return n;
|
|
}
|
|
#endif
|
|
|
|
|
|
#ifdef YY_USE_PROTOS
|
|
static void *yy_flex_alloc( yy_size_t size )
|
|
#else
|
|
static void *yy_flex_alloc( size )
|
|
yy_size_t size;
|
|
#endif
|
|
{
|
|
return (void *) malloc( size );
|
|
}
|
|
|
|
#ifdef YY_USE_PROTOS
|
|
static void *yy_flex_realloc( void *ptr, yy_size_t size )
|
|
#else
|
|
static void *yy_flex_realloc( ptr, size )
|
|
void *ptr;
|
|
yy_size_t size;
|
|
#endif
|
|
{
|
|
/* The cast to (char *) in the following accommodates both
|
|
* implementations that use char* generic pointers, and those
|
|
* that use void* generic pointers. It works with the latter
|
|
* because both ANSI C and C++ allow castless assignment from
|
|
* any pointer type to void*, and deal with argument conversions
|
|
* as though doing an assignment.
|
|
*/
|
|
return (void *) realloc( (char *) ptr, size );
|
|
}
|
|
|
|
#ifdef YY_USE_PROTOS
|
|
static void yy_flex_free( void *ptr )
|
|
#else
|
|
static void yy_flex_free( ptr )
|
|
void *ptr;
|
|
#endif
|
|
{
|
|
free( ptr );
|
|
}
|
|
|
|
#if YY_MAIN
|
|
int main()
|
|
{
|
|
yylex();
|
|
return 0;
|
|
}
|
|
#endif
|
|
#line 614 "config.l"
|
|
|
|
|
|
/*@ ----------------------------------------------------------------------------
|
|
*/
|
|
|
|
#if 0
|
|
static void writeBoolValue(QTextStream &t,bool v)
|
|
{
|
|
if (v) t << "YES"; else t << "NO";
|
|
}
|
|
|
|
static void writeIntValue(QTextStream &t,int i)
|
|
{
|
|
t << i;
|
|
}
|
|
|
|
static void writeStringValue(QTextStream &t,QCString &s)
|
|
{
|
|
const char *p=s.data();
|
|
char c;
|
|
bool hasBlanks=FALSE;
|
|
if (p)
|
|
{
|
|
while ((c=*p++)!=0 && !hasBlanks) hasBlanks = (c==' ' || c=='\n' || c=='\t');
|
|
if (hasBlanks)
|
|
t << "\"" << s << "\"";
|
|
else
|
|
t << s;
|
|
}
|
|
}
|
|
|
|
static void writeStringList(QTextStream &t,QStrList &l)
|
|
{
|
|
const char *p = l.first();
|
|
bool first=TRUE;
|
|
while (p)
|
|
{
|
|
char c;
|
|
const char *s=p;
|
|
bool hasBlanks=FALSE;
|
|
while ((c=*p++)!=0 && !hasBlanks) hasBlanks = (c==' ' || c=='\n' || c=='\t');
|
|
if (!first) t << " ";
|
|
first=FALSE;
|
|
if (hasBlanks) t << "\"" << s << "\""; else t << s;
|
|
p = l.next();
|
|
if (p) t << " \\" << endl;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
void Config::writeTemplate(QTextStream &t,bool sl,bool upd)
|
|
{
|
|
t << "# Doxyfile " << versionString << endl << endl;
|
|
if (!sl)
|
|
{
|
|
t << "# This file describes the settings to be used by the documentation system\n";
|
|
t << "# doxygen (www.doxygen.org) for a project\n";
|
|
t << "#\n";
|
|
t << "# All text after a hash (#) is considered a comment and will be ignored\n";
|
|
t << "# The format is:\n";
|
|
t << "# TAG = value [value, ...]\n";
|
|
t << "# For lists items can also be appended using:\n";
|
|
t << "# TAG += value [value, ...]\n";
|
|
t << "# Values that contain spaces should be placed between quotes (\" \")\n";
|
|
}
|
|
ConfigOption *option = m_options->first();
|
|
while (option)
|
|
{
|
|
option->writeTemplate(t,sl,upd);
|
|
option = m_options->next();
|
|
}
|
|
}
|
|
|
|
void Config::convertStrToVal()
|
|
{
|
|
ConfigOption *option = m_options->first();
|
|
while (option)
|
|
{
|
|
option->convertStrToVal();
|
|
option = m_options->next();
|
|
}
|
|
}
|
|
|
|
static void substEnvVarsInString(QCString &s)
|
|
{
|
|
static QRegExp re("\\$\\([a-z_A-Z0-9]+\\)");
|
|
if (s.isEmpty()) return;
|
|
int p=0;
|
|
int i,l;
|
|
//printf("substEnvVarInString(%s) start\n",s.data());
|
|
while ((i=re.search(s,p))!=-1)
|
|
{
|
|
l = re.matchedLength();
|
|
//printf("Found environment var s.mid(%d,%d)=`%s'\n",i+2,l-3,s.mid(i+2,l-3).data());
|
|
QCString env=getenv(s.mid(i+2,l-3));
|
|
substEnvVarsInString(env); // recursively expand variables if needed.
|
|
s = s.left(i)+env+s.right(s.length()-i-l);
|
|
p=i+env.length(); // next time start at the end of the expanded string
|
|
}
|
|
s=s.stripWhiteSpace(); // to strip the bogus space that was added when an argument
|
|
// has quotes
|
|
//printf("substEnvVarInString(%s) end\n",s.data());
|
|
}
|
|
|
|
static void substEnvVarsInStrList(QStrList &sl)
|
|
{
|
|
char *s = sl.first();
|
|
while (s)
|
|
{
|
|
QCString result(s);
|
|
// an argument with quotes will have an extra space at the end, so wasQuoted will be TRUE.
|
|
bool wasQuoted = (result.find(' ')!=-1) || (result.find('\t')!=-1);
|
|
// here we strip the quote again
|
|
substEnvVarsInString(result);
|
|
|
|
//printf("Result %s was quoted=%d\n",result.data(),wasQuoted);
|
|
|
|
if (!wasQuoted) /* as a result of the expansion, a single string
|
|
may have expanded into a list, which we'll
|
|
add to sl. If the orginal string already
|
|
contained multiple elements no further
|
|
splitting is done to allow quoted items with spaces! */
|
|
{
|
|
int l=result.length();
|
|
int i,p=0;
|
|
// skip spaces
|
|
// search for a "word"
|
|
for (i=0;i<l;i++)
|
|
{
|
|
char c=0;
|
|
// skip until start of new word
|
|
while (i<l && ((c=result.at(i))==' ' || c=='\t')) i++;
|
|
p=i; // p marks the start index of the word
|
|
// skip until end of a word
|
|
while (i<l && ((c=result.at(i))!=' ' && c!='\t' && c!='"')) i++;
|
|
if (i<l) // not at the end of the string
|
|
{
|
|
if (c=='"') // word within quotes
|
|
{
|
|
p=i+1;
|
|
for (i++;i<l;i++)
|
|
{
|
|
c=result.at(i);
|
|
if (c=='"') // end quote
|
|
{
|
|
// replace the string in the list and go to the next item.
|
|
sl.insert(sl.at(),result.mid(p,i-p)); // insert new item before current item.
|
|
sl.next(); // current item is now the old item
|
|
p=i+1;
|
|
break;
|
|
}
|
|
else if (c=='\\') // skip escaped stuff
|
|
{
|
|
i++;
|
|
}
|
|
}
|
|
}
|
|
else if (c==' ' || c=='\t') // separator
|
|
{
|
|
// replace the string in the list and go to the next item.
|
|
sl.insert(sl.at(),result.mid(p,i-p)); // insert new item before current item.
|
|
sl.next(); // current item is now the old item
|
|
p=i+1;
|
|
}
|
|
}
|
|
}
|
|
if (p!=l) // add the leftover as a string
|
|
{
|
|
// replace the string in the list and go to the next item.
|
|
sl.insert(sl.at(),result.right(l-p)); // insert new item before current item.
|
|
sl.next(); // current item is now the old item
|
|
}
|
|
}
|
|
else // just goto the next element in the list
|
|
{
|
|
sl.insert(sl.at(),result);
|
|
sl.next();
|
|
}
|
|
// remove the old unexpanded string from the list
|
|
int i=sl.at();
|
|
sl.remove(); // current item index changes if the last element is removed.
|
|
if (sl.at()==i) // not last item
|
|
s = sl.current();
|
|
else // just removed last item
|
|
s = 0;
|
|
}
|
|
}
|
|
|
|
void ConfigString::substEnvVars()
|
|
{
|
|
substEnvVarsInString(m_value);
|
|
}
|
|
|
|
void ConfigList::substEnvVars()
|
|
{
|
|
substEnvVarsInStrList(m_value);
|
|
}
|
|
|
|
void ConfigBool::substEnvVars()
|
|
{
|
|
substEnvVarsInString(m_valueString);
|
|
}
|
|
|
|
void ConfigInt::substEnvVars()
|
|
{
|
|
substEnvVarsInString(m_valueString);
|
|
}
|
|
|
|
void ConfigEnum::substEnvVars()
|
|
{
|
|
substEnvVarsInString(m_value);
|
|
}
|
|
|
|
void Config::substituteEnvironmentVars()
|
|
{
|
|
ConfigOption *option = m_options->first();
|
|
while (option)
|
|
{
|
|
option->substEnvVars();
|
|
option = m_options->next();
|
|
}
|
|
}
|
|
|
|
static void cleanUpPaths(QStrList &str)
|
|
{
|
|
char *sfp = str.first();
|
|
while (sfp)
|
|
{
|
|
register char *p = sfp;
|
|
if (p)
|
|
{
|
|
char c;
|
|
while ((c=*p))
|
|
{
|
|
if (c=='\\') *p='/';
|
|
p++;
|
|
}
|
|
}
|
|
QCString path = sfp;
|
|
if ((path.at(0)!='/' && (path.length()<=2 || path.at(1)!=':')) ||
|
|
path.at(path.length()-1)!='/'
|
|
)
|
|
{
|
|
QFileInfo fi(path);
|
|
if (fi.exists() && fi.isDir())
|
|
{
|
|
int i = str.at();
|
|
str.remove();
|
|
if (str.at()==i) // did not remove last item
|
|
str.insert(i,QFile::encodeName(fi.absFilePath()+"/"));
|
|
else
|
|
str.append(QFile::encodeName(fi.absFilePath()+"/"));
|
|
}
|
|
}
|
|
sfp = str.next();
|
|
}
|
|
}
|
|
|
|
void Config::check()
|
|
{
|
|
//if (!projectName.isEmpty())
|
|
//{
|
|
// projectName[0]=toupper(projectName[0]);
|
|
//}
|
|
|
|
QCString &warnFormat = Config_getString("WARN_FORMAT");
|
|
if (warnFormat.stripWhiteSpace().isEmpty())
|
|
{
|
|
warnFormat="$file:$line $text";
|
|
}
|
|
else
|
|
{
|
|
if (warnFormat.find("$file")==-1)
|
|
{
|
|
config_err("Warning: warning format does not contain a $file tag!\n");
|
|
}
|
|
if (warnFormat.find("$line")==-1)
|
|
{
|
|
config_err("Warning: warning format does not contain a $line tag!\n");
|
|
}
|
|
if (warnFormat.find("$text")==-1)
|
|
{
|
|
config_err("Warning: warning format foes not contain a $text tag!\n");
|
|
}
|
|
}
|
|
|
|
QCString &manExtension = Config_getString("MAN_EXTENSION");
|
|
|
|
// set default man page extension if non is given by the user
|
|
if (manExtension.isEmpty())
|
|
{
|
|
manExtension=".3";
|
|
}
|
|
|
|
QCString &paperType = Config_getEnum("PAPER_TYPE");
|
|
paperType=paperType.lower().stripWhiteSpace();
|
|
if (paperType.isEmpty())
|
|
{
|
|
paperType = "a4wide";
|
|
}
|
|
if (paperType!="a4" && paperType!="a4wide" && paperType!="letter" &&
|
|
paperType!="legal" && paperType!="executive")
|
|
{
|
|
config_err("Error: Unknown page type specified");
|
|
}
|
|
|
|
QCString &outputLanguage=Config_getEnum("OUTPUT_LANGUAGE");
|
|
outputLanguage=outputLanguage.stripWhiteSpace();
|
|
if (outputLanguage.isEmpty())
|
|
{
|
|
outputLanguage = "English";
|
|
}
|
|
|
|
QCString &htmlFileExtension=Config_getString("HTML_FILE_EXTENSION");
|
|
htmlFileExtension=htmlFileExtension.stripWhiteSpace();
|
|
if (htmlFileExtension.isEmpty())
|
|
{
|
|
htmlFileExtension = ".html";
|
|
}
|
|
|
|
// expand the relative stripFromPath values
|
|
QStrList &stripFromPath = Config_getList("STRIP_FROM_PATH");
|
|
char *sfp = stripFromPath.first();
|
|
if (sfp==0) // by default use the current path
|
|
{
|
|
stripFromPath.append(QFile::encodeName(QDir::currentDirPath()+"/"));
|
|
}
|
|
else
|
|
{
|
|
cleanUpPaths(stripFromPath);
|
|
}
|
|
|
|
// expand the relative stripFromPath values
|
|
QStrList &stripFromIncPath = Config_getList("STRIP_FROM_INC_PATH");
|
|
cleanUpPaths(stripFromIncPath);
|
|
|
|
// Test to see if HTML header is valid
|
|
QCString &headerFile = Config_getString("HTML_HEADER");
|
|
if (!headerFile.isEmpty())
|
|
{
|
|
QFileInfo fi(headerFile);
|
|
if (!fi.exists())
|
|
{
|
|
config_err("Error: tag HTML_HEADER: header file `%s' "
|
|
"does not exist\n",headerFile.data());
|
|
exit(1);
|
|
}
|
|
}
|
|
// Test to see if HTML footer is valid
|
|
QCString &footerFile = Config_getString("HTML_FOOTER");
|
|
if (!footerFile.isEmpty())
|
|
{
|
|
QFileInfo fi(footerFile);
|
|
if (!fi.exists())
|
|
{
|
|
config_err("Error: tag HTML_FOOTER: footer file `%s' "
|
|
"does not exist\n",footerFile.data());
|
|
exit(1);
|
|
}
|
|
}
|
|
// Test to see if LaTeX header is valid
|
|
QCString &latexHeaderFile = Config_getString("LATEX_HEADER");
|
|
if (!latexHeaderFile.isEmpty())
|
|
{
|
|
QFileInfo fi(latexHeaderFile);
|
|
if (!fi.exists())
|
|
{
|
|
config_err("Error: tag LATEX_HEADER: header file `%s' "
|
|
"does not exist\n",latexHeaderFile.data());
|
|
exit(1);
|
|
}
|
|
}
|
|
// check include path
|
|
QStrList &includePath = Config_getList("INCLUDE_PATH");
|
|
char *s=includePath.first();
|
|
while (s)
|
|
{
|
|
QFileInfo fi(s);
|
|
if (!fi.exists()) config_err("Warning: tag INCLUDE_PATH: include path `%s' "
|
|
"does not exist\n",s);
|
|
s=includePath.next();
|
|
}
|
|
|
|
// check aliases
|
|
QStrList &aliasList = Config_getList("ALIASES");
|
|
s=aliasList.first();
|
|
while (s)
|
|
{
|
|
QRegExp re1("[a-z_A-Z][a-z_A-Z0-9]*[ \t]*="); // alias without argument
|
|
QRegExp re2("[a-z_A-Z][a-z_A-Z0-9]*{[0-9]*}[ \t]*="); // alias with argument
|
|
QCString alias=s;
|
|
alias=alias.stripWhiteSpace();
|
|
if (alias.find(re1)!=0 && alias.find(re2)!=0)
|
|
{
|
|
config_err("Illegal alias format `%s'. Use \"name=value\" or \"name(n)=value\", where n is the number of arguments\n",
|
|
alias.data());
|
|
}
|
|
s=aliasList.next();
|
|
}
|
|
|
|
// check dot image format
|
|
QCString &dotImageFormat=Config_getEnum("DOT_IMAGE_FORMAT");
|
|
dotImageFormat=dotImageFormat.stripWhiteSpace();
|
|
if (dotImageFormat.isEmpty())
|
|
{
|
|
dotImageFormat = "png";
|
|
}
|
|
else if (dotImageFormat!="gif" && dotImageFormat!="png" && dotImageFormat!="jpg")
|
|
{
|
|
config_err("Invalid value for DOT_IMAGE_FORMAT: `%s'. Using the default.\n",dotImageFormat.data());
|
|
dotImageFormat = "png";
|
|
}
|
|
|
|
|
|
// check dot path
|
|
QCString &dotPath = Config_getString("DOT_PATH");
|
|
if (!dotPath.isEmpty())
|
|
{
|
|
QFileInfo dp(dotPath+"/dot"+portable_commandExtension());
|
|
if (!dp.exists() || !dp.isFile())
|
|
{
|
|
config_err("Warning: the dot tool could not be found at %s\n",dotPath.data());
|
|
dotPath="";
|
|
}
|
|
else
|
|
{
|
|
dotPath=QFile::encodeName( dp.dirPath(TRUE)+"/" );
|
|
#if defined(_WIN32) // convert slashes
|
|
uint i=0,l=dotPath.length();
|
|
for (i=0;i<l;i++) if (dotPath.at(i)=='/') dotPath.at(i)='\\';
|
|
#endif
|
|
}
|
|
}
|
|
else // make sure the string is empty but not null!
|
|
{
|
|
dotPath="";
|
|
}
|
|
|
|
// check mscgen path
|
|
QCString &mscgenPath = Config_getString("MSCGEN_PATH");
|
|
if (!mscgenPath.isEmpty())
|
|
{
|
|
QFileInfo dp(mscgenPath+"/mscgen"+portable_commandExtension());
|
|
if (!dp.exists() || !dp.isFile())
|
|
{
|
|
config_err("Warning: the mscgen tool could not be found at %s\n",mscgenPath.data());
|
|
mscgenPath="";
|
|
}
|
|
else
|
|
{
|
|
mscgenPath=QFile::encodeName( dp.dirPath(TRUE)+"/" );
|
|
#if defined(_WIN32) // convert slashes
|
|
uint i=0,l=mscgenPath.length();
|
|
for (i=0;i<l;i++) if (mscgenPath.at(i)=='/') mscgenPath.at(i)='\\';
|
|
#endif
|
|
}
|
|
}
|
|
else // make sure the string is empty but not null!
|
|
{
|
|
mscgenPath="";
|
|
}
|
|
|
|
|
|
// check input
|
|
QStrList &inputSources=Config_getList("INPUT");
|
|
if (inputSources.count()==0)
|
|
{
|
|
// use current dir as the default
|
|
inputSources.append(QFile::encodeName( QDir::currentDirPath() ));
|
|
}
|
|
else
|
|
{
|
|
s=inputSources.first();
|
|
while (s)
|
|
{
|
|
QFileInfo fi(s);
|
|
if (!fi.exists())
|
|
{
|
|
config_err("Warning: tag INPUT: input source `%s' does not exist\n",s);
|
|
}
|
|
s=inputSources.next();
|
|
}
|
|
}
|
|
|
|
// add default pattern if needed
|
|
QStrList &filePatternList = Config_getList("FILE_PATTERNS");
|
|
if (filePatternList.isEmpty())
|
|
{
|
|
filePatternList.append("*.c");
|
|
filePatternList.append("*.cc");
|
|
filePatternList.append("*.cxx");
|
|
filePatternList.append("*.cpp");
|
|
filePatternList.append("*.c++");
|
|
filePatternList.append("*.d");
|
|
filePatternList.append("*.java");
|
|
filePatternList.append("*.ii");
|
|
filePatternList.append("*.ixx");
|
|
filePatternList.append("*.ipp");
|
|
filePatternList.append("*.i++");
|
|
filePatternList.append("*.inl");
|
|
filePatternList.append("*.h");
|
|
filePatternList.append("*.hh");
|
|
filePatternList.append("*.hxx");
|
|
filePatternList.append("*.hpp");
|
|
filePatternList.append("*.h++");
|
|
filePatternList.append("*.idl");
|
|
filePatternList.append("*.odl");
|
|
filePatternList.append("*.cs");
|
|
filePatternList.append("*.php");
|
|
filePatternList.append("*.php3");
|
|
filePatternList.append("*.inc");
|
|
filePatternList.append("*.m");
|
|
filePatternList.append("*.mm");
|
|
filePatternList.append("*.dox");
|
|
filePatternList.append("*.py");
|
|
filePatternList.append("*.f90");
|
|
filePatternList.append("*.f");
|
|
filePatternList.append("*.vhd");
|
|
filePatternList.append("*.vhdl");
|
|
if (portable_fileSystemIsCaseSensitive())
|
|
{
|
|
// unix => case sensitive match => also include useful uppercase versions
|
|
filePatternList.append("*.C");
|
|
filePatternList.append("*.CC");
|
|
filePatternList.append("*.C++");
|
|
filePatternList.append("*.II");
|
|
filePatternList.append("*.I++");
|
|
filePatternList.append("*.H");
|
|
filePatternList.append("*.HH");
|
|
filePatternList.append("*.H++");
|
|
filePatternList.append("*.CS");
|
|
filePatternList.append("*.PHP");
|
|
filePatternList.append("*.PHP3");
|
|
filePatternList.append("*.M");
|
|
filePatternList.append("*.MM");
|
|
filePatternList.append("*.PY");
|
|
filePatternList.append("*.F90");
|
|
filePatternList.append("*.F");
|
|
filePatternList.append("*.VHD");
|
|
filePatternList.append("*.VHDL");
|
|
}
|
|
}
|
|
|
|
// add default pattern if needed
|
|
QStrList &examplePatternList = Config_getList("EXAMPLE_PATTERNS");
|
|
if (examplePatternList.isEmpty())
|
|
{
|
|
examplePatternList.append("*");
|
|
}
|
|
|
|
// if no output format is enabled, warn the user
|
|
if (!Config_getBool("GENERATE_HTML") &&
|
|
!Config_getBool("GENERATE_LATEX") &&
|
|
!Config_getBool("GENERATE_MAN") &&
|
|
!Config_getBool("GENERATE_RTF") &&
|
|
!Config_getBool("GENERATE_XML") &&
|
|
!Config_getBool("GENERATE_PERLMOD") &&
|
|
!Config_getBool("GENERATE_RTF") &&
|
|
!Config_getBool("GENERATE_AUTOGEN_DEF") &&
|
|
Config_getString("GENERATE_TAGFILE").isEmpty()
|
|
)
|
|
{
|
|
config_err("Warning: No output formats selected! Set at least one of the main GENERATE_* options to YES.\n");
|
|
}
|
|
|
|
// check HTMLHELP creation requirements
|
|
if (!Config_getBool("GENERATE_HTML") &&
|
|
Config_getBool("GENERATE_HTMLHELP"))
|
|
{
|
|
config_err("Warning: GENERATE_HTMLHELP=YES requires GENERATE_HTML=YES.\n");
|
|
}
|
|
|
|
#undef PUTENV
|
|
#undef SEP
|
|
#if defined(_WIN32) && (__BORLANDC__ < 0x0550)
|
|
#define PUTENV _putenv
|
|
#define SEP ";"
|
|
#else
|
|
#define PUTENV putenv
|
|
#define SEP ":"
|
|
#endif
|
|
// check QHP creation requirements
|
|
if (Config_getBool("GENERATE_QHP"))
|
|
{
|
|
bool quit = false;
|
|
if (!Config_getBool("GENERATE_HTML"))
|
|
{
|
|
config_err("Warning: GENERATE_QHP=YES requires GENERATE_HTML=YES.\n");
|
|
quit = true;
|
|
}
|
|
|
|
if (Config_getString("QHP_NAMESPACE").isEmpty())
|
|
{
|
|
config_err("Warning: GENERATE_QHP=YES requires QHP_NAMESPACE to be set.\n");
|
|
quit = true;
|
|
}
|
|
|
|
if (Config_getString("QHP_VIRTUAL_FOLDER").isEmpty())
|
|
{
|
|
config_err("Warning: GENERATE_QHP=YES requires QHP_VIRTUAL_FOLDER to be set.\n");
|
|
quit = true;
|
|
}
|
|
|
|
if (quit)
|
|
{
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
// check QCH creation requirements
|
|
if (!Config_getString("QHG_LOCATION").isEmpty() &&
|
|
!Config_getBool("GENERATE_QHP"))
|
|
{
|
|
config_err("Warning: Specifying QHG_LOCATION requires GENERATE_QHP=YES.\n");
|
|
}
|
|
if (!Config_getString("QCH_FILE").isEmpty() &&
|
|
Config_getString("QHG_LOCATION").isEmpty())
|
|
{
|
|
config_err("Warning: Specifying QCH_FILE requires QHG_LOCATION to be set.\n");
|
|
}
|
|
|
|
if (Config_getBool("HAVE_DOT"))
|
|
{
|
|
char *curFontPath = getenv("DOTFONTPATH");
|
|
int l=curFontPath ? strlen(curFontPath)+1 : 0;
|
|
static char *buf = 0;
|
|
buf = (char *)realloc(buf,strlen("DOTFONTPATH=.")+l+1);
|
|
strcpy(buf,"DOTFONTPATH=.");
|
|
if (l>0)
|
|
{
|
|
strcat(buf,SEP);
|
|
strcat(buf,curFontPath);
|
|
}
|
|
PUTENV(buf);
|
|
}
|
|
|
|
if (Config_getBool("OPTIMIZE_OUTPUT_JAVA") && Config_getBool("INLINE_INFO"))
|
|
{
|
|
// don't show inline info for Java output, since Java has no inline
|
|
// concept.
|
|
Config_getBool("INLINE_INFO")=FALSE;
|
|
}
|
|
|
|
int &depth = Config_getInt("MAX_DOT_GRAPH_DEPTH");
|
|
if (depth==0)
|
|
{
|
|
depth=1000;
|
|
}
|
|
|
|
|
|
// add default words if needed
|
|
QStrList &annotationFromBrief = Config_getList("ABBREVIATE_BRIEF");
|
|
if (annotationFromBrief.isEmpty())
|
|
{
|
|
annotationFromBrief.append("The $name class");
|
|
annotationFromBrief.append("The $name widget");
|
|
annotationFromBrief.append("The $name file");
|
|
annotationFromBrief.append("is");
|
|
annotationFromBrief.append("provides");
|
|
annotationFromBrief.append("specifies");
|
|
annotationFromBrief.append("contains");
|
|
annotationFromBrief.append("represents");
|
|
annotationFromBrief.append("a");
|
|
annotationFromBrief.append("an");
|
|
annotationFromBrief.append("the");
|
|
}
|
|
|
|
// some default settings for vhdl
|
|
if (Config_getBool("OPTIMIZE_OUTPUT_VHDL") &&
|
|
(Config_getBool("INLINE_INHERITED_MEMB") ||
|
|
Config_getBool("INHERIT_DOCS") ||
|
|
!Config_getBool("HIDE_SCOPE_NAMES") ||
|
|
!Config_getBool("EXTRACT_PRIVATE")
|
|
)
|
|
)
|
|
{
|
|
bool b1 = Config_getBool("INLINE_INHERITED_MEMB");
|
|
bool b2 = Config_getBool("INHERIT_DOCS");
|
|
bool b3 = Config_getBool("HIDE_SCOPE_NAMES");
|
|
bool b4 = Config_getBool("EXTRACT_PRIVATE");
|
|
const char *s1,*s2,*s3,*s4;
|
|
if (b1) s1=" INLINDE_INHERITED_MEMB = NO (was YES)\n"; else s1="";
|
|
if (b2) s2=" INHERIT_DOCS = NO (was YES)\n"; else s2="";
|
|
if (!b3) s3=" HIDE_SCOPE_NAMES = YES (was NO)\n"; else s3="";
|
|
if (!b4) s4=" EXTRACT_PRIVATE = YES (was NO)\n"; else s4="";
|
|
|
|
config_err("Warning: enabling OPTIMIZE_OUTPUT_VHDL assumes the following settings:\n"
|
|
"%s%s%s%s",s1,s2,s3,s4
|
|
);
|
|
|
|
Config_getBool("INLINE_INHERITED_MEMB") = FALSE;
|
|
Config_getBool("INHERIT_DOCS") = FALSE;
|
|
Config_getBool("HIDE_SCOPE_NAMES") = TRUE;
|
|
Config_getBool("EXTRACT_PRIVATE") = TRUE;
|
|
}
|
|
|
|
}
|
|
|
|
void Config::init()
|
|
{
|
|
ConfigOption *option = m_options->first();
|
|
while (option)
|
|
{
|
|
option->init();
|
|
option = m_options->next();
|
|
}
|
|
}
|
|
|
|
void Config::create()
|
|
{
|
|
if (m_initialized) return;
|
|
m_initialized = TRUE;
|
|
|
|
ConfigString *cs;
|
|
ConfigEnum *ce;
|
|
ConfigList *cl;
|
|
ConfigInt *ci;
|
|
ConfigBool *cb;
|
|
|
|
// option definitions
|
|
//-----------------------------------------------------------------------------------------------
|
|
addInfo("Project","Project related configuration options");
|
|
//-----------------------------------------------------------------------------------------------
|
|
|
|
cs = addString(
|
|
"DOXYFILE_ENCODING",
|
|
"This tag specifies the encoding used for all characters in the config file \n"
|
|
"that follow. The default is UTF-8 which is also the encoding used for all \n"
|
|
"text before the first occurrence of this tag. Doxygen uses libiconv (or the \n"
|
|
"iconv built into libc) for the transcoding. See \n"
|
|
"http://www.gnu.org/software/libiconv for the list of possible encodings.\n"
|
|
);
|
|
cs->setDefaultValue("UTF-8");
|
|
cs = addString(
|
|
"PROJECT_NAME",
|
|
"The PROJECT_NAME tag is a single word (or a sequence of words surrounded \n"
|
|
"by quotes) that should identify the project. "
|
|
);
|
|
cs = addString(
|
|
"PROJECT_NUMBER",
|
|
"The PROJECT_NUMBER tag can be used to enter a project or revision number. \n"
|
|
"This could be handy for archiving the generated documentation or \n"
|
|
"if some version control system is used.\n"
|
|
);
|
|
cs = addString(
|
|
"OUTPUT_DIRECTORY",
|
|
"The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) \n"
|
|
"base path where the generated documentation will be put. \n"
|
|
"If a relative path is entered, it will be relative to the location \n"
|
|
"where doxygen was started. If left blank the current directory will be used.\n"
|
|
);
|
|
cs->setWidgetType(ConfigString::Dir);
|
|
cb = addBool(
|
|
"CREATE_SUBDIRS",
|
|
"If the CREATE_SUBDIRS tag is set to YES, then doxygen will create \n"
|
|
"4096 sub-directories (in 2 levels) under the output directory of each output \n"
|
|
"format and will distribute the generated files over these directories. \n"
|
|
"Enabling this option can be useful when feeding doxygen a huge amount of \n"
|
|
"source files, where putting all generated files in the same directory would \n"
|
|
"otherwise cause performance problems for the file system. \n",
|
|
FALSE
|
|
);
|
|
ce = addEnum(
|
|
"OUTPUT_LANGUAGE",
|
|
"The OUTPUT_LANGUAGE tag is used to specify the language in which all \n"
|
|
"documentation generated by doxygen is written. Doxygen will use this \n"
|
|
"information to generate all constant output in the proper language. \n"
|
|
"The default language is English, other supported languages are: \n"
|
|
"Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, \n"
|
|
"Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, \n"
|
|
"Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), \n"
|
|
"Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, \n"
|
|
"Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene, \n"
|
|
"Spanish, Swedish, and Ukrainian.\n",
|
|
"English"
|
|
);
|
|
#ifdef LANG_ZA
|
|
ce->addValue("Afrikaans");
|
|
#endif
|
|
#ifdef LANG_AR
|
|
ce->addValue("Arabic");
|
|
#endif
|
|
#ifdef LANG_BR
|
|
ce->addValue("Brazilian");
|
|
#endif
|
|
#ifdef LANG_CA
|
|
ce->addValue("Catalan");
|
|
#endif
|
|
#ifdef LANG_CN
|
|
ce->addValue("Chinese");
|
|
#endif
|
|
#ifdef LANG_TW
|
|
ce->addValue("Chinese-Traditional");
|
|
#endif
|
|
#ifdef LANG_HR
|
|
ce->addValue("Croatian");
|
|
#endif
|
|
#ifdef LANG_CZ
|
|
ce->addValue("Czech");
|
|
#endif
|
|
#ifdef LANG_DK
|
|
ce->addValue("Danish");
|
|
#endif
|
|
#ifdef LANG_NL
|
|
ce->addValue("Dutch");
|
|
#endif
|
|
ce->addValue("English");
|
|
#ifdef LANG_FI
|
|
ce->addValue("Finnish");
|
|
#endif
|
|
#ifdef LANG_FR
|
|
ce->addValue("French");
|
|
#endif
|
|
#ifdef LANG_DE
|
|
ce->addValue("German");
|
|
#endif
|
|
#ifdef LANG_GR
|
|
ce->addValue("Greek");
|
|
#endif
|
|
#ifdef LANG_HU
|
|
ce->addValue("Hungarian");
|
|
#endif
|
|
#ifdef LANG_IT
|
|
ce->addValue("Italian");
|
|
#endif
|
|
#ifdef LANG_JP
|
|
ce->addValue("Japanese");
|
|
ce->addValue("Japanese-en");
|
|
#endif
|
|
#ifdef LANG_KR
|
|
ce->addValue("Korean");
|
|
ce->addValue("Korean-en");
|
|
#endif
|
|
#ifdef LANG_LI
|
|
ce->addValue("Lithuanian");
|
|
#endif
|
|
#ifdef LANG_NO
|
|
ce->addValue("Norwegian");
|
|
#endif
|
|
#ifdef LANG_MK
|
|
ce->addValue("Macedonian");
|
|
#endif
|
|
#ifdef LANG_FA
|
|
ce->addValue("Farsi");
|
|
ce->addValue("Persian");
|
|
#endif
|
|
#ifdef LANG_PL
|
|
ce->addValue("Polish");
|
|
#endif
|
|
#ifdef LANG_PT
|
|
ce->addValue("Portuguese");
|
|
#endif
|
|
#ifdef LANG_RO
|
|
ce->addValue("Romanian");
|
|
#endif
|
|
#ifdef LANG_RU
|
|
ce->addValue("Russian");
|
|
#endif
|
|
#ifdef LANG_SR
|
|
ce->addValue("Serbian");
|
|
#endif
|
|
#ifdef LANG_SC
|
|
ce->addValue("Serbian-Cyrilic");
|
|
#endif
|
|
#ifdef LANG_SK
|
|
ce->addValue("Slovak");
|
|
#endif
|
|
#ifdef LANG_SI
|
|
ce->addValue("Slovene");
|
|
#endif
|
|
#ifdef LANG_ES
|
|
ce->addValue("Spanish");
|
|
#endif
|
|
#ifdef LANG_SE
|
|
ce->addValue("Swedish");
|
|
#endif
|
|
#ifdef LANG_UA
|
|
ce->addValue("Ukrainian");
|
|
#endif
|
|
|
|
#if 0
|
|
cb = addBool(
|
|
"USE_WINDOWS_ENCODING",
|
|
"This tag can be used to specify the encoding used in the generated output. \n"
|
|
"The encoding is not always determined by the language that is chosen, \n"
|
|
"but also whether or not the output is meant for Windows or non-Windows users. \n"
|
|
"In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES \n"
|
|
"forces the Windows encoding (this is the default for the Windows binary), \n"
|
|
"whereas setting the tag to NO uses a Unix-style encoding (the default for \n"
|
|
"all platforms other than Windows).\n",
|
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
|
TRUE
|
|
#else
|
|
FALSE
|
|
#endif
|
|
);
|
|
#endif
|
|
addObsolete("USE_WINDOWS_ENCODING");
|
|
|
|
cb = addBool(
|
|
"BRIEF_MEMBER_DESC",
|
|
"If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will \n"
|
|
"include brief member descriptions after the members that are listed in \n"
|
|
"the file and class documentation (similar to JavaDoc). \n"
|
|
"Set to NO to disable this. \n",
|
|
TRUE
|
|
);
|
|
cb = addBool(
|
|
"REPEAT_BRIEF",
|
|
"If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend \n"
|
|
"the brief description of a member or function before the detailed description. \n"
|
|
"Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the \n"
|
|
"brief descriptions will be completely suppressed. \n",
|
|
TRUE
|
|
);
|
|
cl = addList(
|
|
"ABBREVIATE_BRIEF",
|
|
"This tag implements a quasi-intelligent brief description abbreviator \n"
|
|
"that is used to form the text in various listings. Each string \n"
|
|
"in this list, if found as the leading text of the brief description, will be \n"
|
|
"stripped from the text and the result after processing the whole list, is \n"
|
|
"used as the annotated text. Otherwise, the brief description is used as-is. \n"
|
|
"If left blank, the following values are used (\"$name\" is automatically \n"
|
|
"replaced with the name of the entity): \"The $name class\" \"The $name widget\" \n"
|
|
"\"The $name file\" \"is\" \"provides\" \"specifies\" \"contains\" \n"
|
|
"\"represents\" \"a\" \"an\" \"the\"\n"
|
|
);
|
|
cb = addBool(
|
|
"ALWAYS_DETAILED_SEC",
|
|
"If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then \n"
|
|
"Doxygen will generate a detailed section even if there is only a brief \n"
|
|
"description. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"INLINE_INHERITED_MEMB",
|
|
"If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all \n"
|
|
"inherited members of a class in the documentation of that class as if those \n"
|
|
"members were ordinary class members. Constructors, destructors and assignment \n"
|
|
"operators of the base classes will not be shown. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"FULL_PATH_NAMES",
|
|
"If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full \n"
|
|
"path before files name in the file list and in the header files. If set \n"
|
|
"to NO the shortest path that makes the file name unique will be used. \n",
|
|
TRUE
|
|
);
|
|
cl = addList(
|
|
"STRIP_FROM_PATH",
|
|
"If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag \n"
|
|
"can be used to strip a user-defined part of the path. Stripping is \n"
|
|
"only done if one of the specified strings matches the left-hand part of \n"
|
|
"the path. The tag can be used to show relative paths in the file list. \n"
|
|
"If left blank the directory from which doxygen is run is used as the \n"
|
|
"path to strip. \n"
|
|
);
|
|
cl->addDependency("FULL_PATH_NAMES");
|
|
cl = addList(
|
|
"STRIP_FROM_INC_PATH",
|
|
"The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of \n"
|
|
"the path mentioned in the documentation of a class, which tells \n"
|
|
"the reader which header file to include in order to use a class. \n"
|
|
"If left blank only the name of the header file containing the class \n"
|
|
"definition is used. Otherwise one should specify the include paths that \n"
|
|
"are normally passed to the compiler using the -I flag.\n"
|
|
);
|
|
cb = addBool(
|
|
"SHORT_NAMES",
|
|
"If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter \n"
|
|
"(but less readable) file names. This can be useful is your file systems \n"
|
|
"doesn't support long names like on DOS, Mac, or CD-ROM. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"JAVADOC_AUTOBRIEF",
|
|
"If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen \n"
|
|
"will interpret the first line (until the first dot) of a JavaDoc-style \n"
|
|
"comment as the brief description. If set to NO, the JavaDoc \n"
|
|
"comments will behave just like regular Qt-style comments \n"
|
|
"(thus requiring an explicit @brief command for a brief description.) \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"QT_AUTOBRIEF",
|
|
"If the QT_AUTOBRIEF tag is set to YES then Doxygen will \n"
|
|
"interpret the first line (until the first dot) of a Qt-style \n"
|
|
"comment as the brief description. If set to NO, the comments \n"
|
|
"will behave just like regular Qt-style comments (thus requiring \n"
|
|
"an explicit \\brief command for a brief description.) \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"MULTILINE_CPP_IS_BRIEF",
|
|
"The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen \n"
|
|
"treat a multi-line C++ special comment block (i.e. a block of //! or /// \n"
|
|
"comments) as a brief description. This used to be the default behaviour. \n"
|
|
"The new default is to treat a multi-line C++ comment block as a detailed \n"
|
|
"description. Set this tag to YES if you prefer the old behaviour instead. \n",
|
|
FALSE
|
|
);
|
|
//cb = addBool(
|
|
// "DETAILS_AT_TOP",
|
|
// "If the DETAILS_AT_TOP tag is set to YES then Doxygen \n"
|
|
// "will output the detailed description near the top, like JavaDoc.\n"
|
|
// "If set to NO, the detailed description appears after the member \n"
|
|
// "documentation. \n",
|
|
// FALSE
|
|
// );
|
|
cb = addBool(
|
|
"INHERIT_DOCS",
|
|
"If the INHERIT_DOCS tag is set to YES (the default) then an undocumented \n"
|
|
"member inherits the documentation from any documented member that it \n"
|
|
"re-implements. \n",
|
|
TRUE
|
|
);
|
|
cb = addBool(
|
|
"SEPARATE_MEMBER_PAGES",
|
|
"If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce \n"
|
|
"a new page for each member. If set to NO, the documentation of a member will \n"
|
|
"be part of the file/class/namespace that contains it.\n",
|
|
FALSE
|
|
);
|
|
ci = addInt(
|
|
"TAB_SIZE",
|
|
"The TAB_SIZE tag can be used to set the number of spaces in a tab. \n"
|
|
"Doxygen uses this value to replace tabs by spaces in code fragments. \n",
|
|
1,16,8
|
|
);
|
|
cl = addList(
|
|
"ALIASES",
|
|
"This tag can be used to specify a number of aliases that acts \n"
|
|
"as commands in the documentation. An alias has the form \"name=value\". \n"
|
|
"For example adding \"sideeffect=\\par Side Effects:\\n\" will allow you to \n"
|
|
"put the command \\sideeffect (or @sideeffect) in the documentation, which \n"
|
|
"will result in a user-defined paragraph with heading \"Side Effects:\". \n"
|
|
"You can put \\n's in the value part of an alias to insert newlines. \n"
|
|
);
|
|
cb = addBool(
|
|
"OPTIMIZE_OUTPUT_FOR_C",
|
|
"Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C \n"
|
|
"sources only. Doxygen will then generate output that is more tailored for C. \n"
|
|
"For instance, some of the names that are used will be different. The list \n"
|
|
"of all members will be omitted, etc. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"OPTIMIZE_OUTPUT_JAVA",
|
|
"Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java \n"
|
|
"sources only. Doxygen will then generate output that is more tailored for \n"
|
|
"Java. For instance, namespaces will be presented as packages, qualified \n"
|
|
"scopes will look different, etc. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"OPTIMIZE_FOR_FORTRAN",
|
|
"Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran \n"
|
|
"sources only. Doxygen will then generate output that is more tailored for \n"
|
|
"Fortran. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"OPTIMIZE_OUTPUT_VHDL",
|
|
"Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL \n"
|
|
"sources. Doxygen will then generate output that is tailored for \n"
|
|
"VHDL. \n",
|
|
FALSE
|
|
);
|
|
cl = addList( "EXTENSION_MAPPING",
|
|
"Doxygen selects the parser to use depending on the extension of the files it parses. \n"
|
|
"With this tag you can assign which parser to use for a given extension. \n"
|
|
"Doxygen has a built-in mapping, but you can override or extend it using this tag. \n"
|
|
"The format is ext=language, where ext is a file extension, and language is one of \n"
|
|
"the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, \n"
|
|
"Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat \n"
|
|
".inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), \n"
|
|
"use: inc=Fortran f=C\n"
|
|
);
|
|
cb = addBool(
|
|
"BUILTIN_STL_SUPPORT",
|
|
"If you use STL classes (i.e. std::string, std::vector, etc.) but do not want \n"
|
|
"to include (a tag file for) the STL sources as input, then you should \n"
|
|
"set this tag to YES in order to let doxygen match functions declarations and \n"
|
|
"definitions whose arguments contain STL classes (e.g. func(std::string); v.s. \n"
|
|
"func(std::string) {}). This also make the inheritance and collaboration \n"
|
|
"diagrams that involve STL classes more complete and accurate. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"CPP_CLI_SUPPORT",
|
|
"If you use Microsoft's C++/CLI language, you should set this option to YES to\n"
|
|
"enable parsing support.\n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"SIP_SUPPORT",
|
|
"Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. \n"
|
|
"Doxygen will parse them like normal C++ but will assume all classes use public \n"
|
|
"instead of private inheritance when no explicit protection keyword is present. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool( "IDL_PROPERTY_SUPPORT",
|
|
"For Microsoft's IDL there are propget and propput attributes to indicate getter \n"
|
|
"and setter methods for a property. Setting this option to YES (the default) \n"
|
|
"will make doxygen to replace the get and set methods by a property in the \n"
|
|
"documentation. This will only work if the methods are indeed getting or \n"
|
|
"setting a simple type. If this is not the case, or you want to show the \n"
|
|
"methods anyway, you should set this option to NO. \n",
|
|
TRUE
|
|
);
|
|
cb = addBool(
|
|
"DISTRIBUTE_GROUP_DOC",
|
|
"If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC \n"
|
|
"tag is set to YES, then doxygen will reuse the documentation of the first \n"
|
|
"member in the group (if any) for the other members of the group. By default \n"
|
|
"all members of a group must be documented explicitly.\n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"SUBGROUPING",
|
|
"Set the SUBGROUPING tag to YES (the default) to allow class member groups of \n"
|
|
"the same type (for instance a group of public functions) to be put as a \n"
|
|
"subgroup of that type (e.g. under the Public Functions section). Set it to \n"
|
|
"NO to prevent subgrouping. Alternatively, this can be done per class using \n"
|
|
"the \\nosubgrouping command. \n",
|
|
TRUE
|
|
);
|
|
cb = addBool( "TYPEDEF_HIDES_STRUCT",
|
|
"When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum \n"
|
|
"is documented as struct, union, or enum with the name of the typedef. So \n"
|
|
"typedef struct TypeS {} TypeT, will appear in the documentation as a struct \n"
|
|
"with name TypeT. When disabled the typedef will appear as a member of a file, \n"
|
|
"namespace, or class. And the struct will be named TypeS. This can typically \n"
|
|
"be useful for C code in case the coding convention dictates that all compound \n"
|
|
"types are typedef'ed and only the typedef is referenced, never the tag name.\n",
|
|
FALSE
|
|
);
|
|
ci = addInt(
|
|
"SYMBOL_CACHE_SIZE",
|
|
"The SYMBOL_CACHE_SIZE determines the size of the internal cache use to \n"
|
|
"determine which symbols to keep in memory and which to flush to disk.\n"
|
|
"When the cache is full, less often used symbols will be written to disk.\n"
|
|
"For small to medium size projects (<1000 input files) the default value is \n"
|
|
"probably good enough. For larger projects a too small cache size can cause \n"
|
|
"doxygen to be busy swapping symbols to and from disk most of the time \n"
|
|
"causing a significant performance penality. \n"
|
|
"If the system has enough physical memory increasing the cache will improve the \n"
|
|
"performance by keeping more symbols in memory. Note that the value works on \n"
|
|
"a logarithmic scale so increasing the size by one will rougly double the \n"
|
|
"memory usage. The cache size is given by this formula: \n"
|
|
"2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, \n"
|
|
"corresponding to a cache size of 2^16 = 65536 symbols\n",
|
|
0,9,0
|
|
);
|
|
|
|
//-----------------------------------------------------------------------------------------------
|
|
addInfo("Build","Build related configuration options");
|
|
//-----------------------------------------------------------------------------------------------
|
|
cb = addBool(
|
|
"EXTRACT_ALL",
|
|
"If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in \n"
|
|
"documentation are documented, even if no documentation was available. \n"
|
|
"Private class members and static file members will be hidden unless \n"
|
|
"the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"EXTRACT_PRIVATE",
|
|
"If the EXTRACT_PRIVATE tag is set to YES all private members of a class \n"
|
|
"will be included in the documentation. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"EXTRACT_STATIC",
|
|
"If the EXTRACT_STATIC tag is set to YES all static members of a file \n"
|
|
"will be included in the documentation. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"EXTRACT_LOCAL_CLASSES",
|
|
"If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) \n"
|
|
"defined locally in source files will be included in the documentation. \n"
|
|
"If set to NO only classes defined in header files are included. \n",
|
|
TRUE
|
|
);
|
|
cb = addBool(
|
|
"EXTRACT_LOCAL_METHODS",
|
|
"This flag is only useful for Objective-C code. When set to YES local \n"
|
|
"methods, which are defined in the implementation section but not in \n"
|
|
"the interface are included in the documentation. \n"
|
|
"If set to NO (the default) only methods in the interface are included. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"EXTRACT_ANON_NSPACES",
|
|
"If this flag is set to YES, the members of anonymous namespaces will be \n"
|
|
"extracted and appear in the documentation as a namespace called \n"
|
|
"'anonymous_namespace{file}', where file will be replaced with the base \n"
|
|
"name of the file that contains the anonymous namespace. By default \n"
|
|
"anonymous namespace are hidden. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"HIDE_UNDOC_MEMBERS",
|
|
"If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all \n"
|
|
"undocumented members of documented classes, files or namespaces. \n"
|
|
"If set to NO (the default) these members will be included in the \n"
|
|
"various overviews, but no documentation section is generated. \n"
|
|
"This option has no effect if EXTRACT_ALL is enabled. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"HIDE_UNDOC_CLASSES",
|
|
"If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all \n"
|
|
"undocumented classes that are normally visible in the class hierarchy. \n"
|
|
"If set to NO (the default) these classes will be included in the various \n"
|
|
"overviews. This option has no effect if EXTRACT_ALL is enabled. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"HIDE_FRIEND_COMPOUNDS",
|
|
"If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all \n"
|
|
"friend (class|struct|union) declarations. \n"
|
|
"If set to NO (the default) these declarations will be included in the \n"
|
|
"documentation. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"HIDE_IN_BODY_DOCS",
|
|
"If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any \n"
|
|
"documentation blocks found inside the body of a function. \n"
|
|
"If set to NO (the default) these blocks will be appended to the \n"
|
|
"function's detailed documentation block. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"INTERNAL_DOCS",
|
|
"The INTERNAL_DOCS tag determines if documentation \n"
|
|
"that is typed after a \\internal command is included. If the tag is set \n"
|
|
"to NO (the default) then the documentation will be excluded. \n"
|
|
"Set it to YES to include the internal documentation. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"CASE_SENSE_NAMES",
|
|
"If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate \n"
|
|
"file names in lower-case letters. If set to YES upper-case letters are also \n"
|
|
"allowed. This is useful if you have classes or files whose names only differ \n"
|
|
"in case and if your file system supports case sensitive file names. Windows \n"
|
|
"and Mac users are advised to set this option to NO.\n",
|
|
portable_fileSystemIsCaseSensitive()
|
|
);
|
|
cb = addBool(
|
|
"HIDE_SCOPE_NAMES",
|
|
"If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen \n"
|
|
"will show members with their full class and namespace scopes in the \n"
|
|
"documentation. If set to YES the scope will be hidden. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"SHOW_INCLUDE_FILES",
|
|
"If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen \n"
|
|
"will put a list of the files that are included by a file in the documentation \n"
|
|
"of that file. \n",
|
|
TRUE
|
|
);
|
|
cb = addBool(
|
|
"INLINE_INFO",
|
|
"If the INLINE_INFO tag is set to YES (the default) then a tag [inline] \n"
|
|
"is inserted in the documentation for inline members. \n",
|
|
TRUE
|
|
);
|
|
cb = addBool(
|
|
"SORT_MEMBER_DOCS",
|
|
"If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen \n"
|
|
"will sort the (detailed) documentation of file and class members \n"
|
|
"alphabetically by member name. If set to NO the members will appear in \n"
|
|
"declaration order. \n",
|
|
TRUE
|
|
);
|
|
cb = addBool(
|
|
"SORT_BRIEF_DOCS",
|
|
"If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the \n"
|
|
"brief documentation of file, namespace and class members alphabetically \n"
|
|
"by member name. If set to NO (the default) the members will appear in \n"
|
|
"declaration order. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"SORT_GROUP_NAMES",
|
|
"If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the \n"
|
|
"hierarchy of group names into alphabetical order. If set to NO (the default) \n"
|
|
"the group names will appear in their defined order. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"SORT_BY_SCOPE_NAME",
|
|
"If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be \n"
|
|
"sorted by fully-qualified names, including namespaces. If set to \n"
|
|
"NO (the default), the class list will be sorted only by class name, \n"
|
|
"not including the namespace part. \n"
|
|
"Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.\n"
|
|
"Note: This option applies only to the class list, not to the \n"
|
|
"alphabetical list.\n",
|
|
FALSE
|
|
);
|
|
|
|
cb = addBool(
|
|
"GENERATE_TODOLIST",
|
|
"The GENERATE_TODOLIST tag can be used to enable (YES) or \n"
|
|
"disable (NO) the todo list. This list is created by putting \\todo \n"
|
|
"commands in the documentation.\n",
|
|
TRUE
|
|
);
|
|
cb = addBool(
|
|
"GENERATE_TESTLIST",
|
|
"The GENERATE_TESTLIST tag can be used to enable (YES) or \n"
|
|
"disable (NO) the test list. This list is created by putting \\test \n"
|
|
"commands in the documentation.\n",
|
|
TRUE
|
|
);
|
|
cb = addBool(
|
|
"GENERATE_BUGLIST",
|
|
"The GENERATE_BUGLIST tag can be used to enable (YES) or \n"
|
|
"disable (NO) the bug list. This list is created by putting \\bug \n"
|
|
"commands in the documentation.\n",
|
|
TRUE
|
|
);
|
|
cb = addBool(
|
|
"GENERATE_DEPRECATEDLIST",
|
|
"The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or \n"
|
|
"disable (NO) the deprecated list. This list is created by putting \n"
|
|
"\\deprecated commands in the documentation.\n",
|
|
TRUE
|
|
);
|
|
cl = addList(
|
|
"ENABLED_SECTIONS",
|
|
"The ENABLED_SECTIONS tag can be used to enable conditional \n"
|
|
"documentation sections, marked by \\if sectionname ... \\endif. \n"
|
|
);
|
|
ci = addInt(
|
|
"MAX_INITIALIZER_LINES",
|
|
"The MAX_INITIALIZER_LINES tag determines the maximum number of lines \n"
|
|
"the initial value of a variable or define consists of for it to appear in \n"
|
|
"the documentation. If the initializer consists of more lines than specified \n"
|
|
"here it will be hidden. Use a value of 0 to hide initializers completely. \n"
|
|
"The appearance of the initializer of individual variables and defines in the \n"
|
|
"documentation can be controlled using \\showinitializer or \\hideinitializer \n"
|
|
"command in the documentation regardless of this setting. \n",
|
|
0,10000,30
|
|
);
|
|
cb = addBool(
|
|
"SHOW_USED_FILES",
|
|
"Set the SHOW_USED_FILES tag to NO to disable the list of files generated \n"
|
|
"at the bottom of the documentation of classes and structs. If set to YES the \n"
|
|
"list will mention the files that were used to generate the documentation. \n",
|
|
TRUE
|
|
);
|
|
cb = addBool(
|
|
"SHOW_DIRECTORIES",
|
|
"If the sources in your project are distributed over multiple directories \n"
|
|
"then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy \n"
|
|
"in the documentation. The default is NO.\n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"SHOW_FILES",
|
|
"Set the SHOW_FILES tag to NO to disable the generation of the Files page.\n"
|
|
"This will remove the Files entry from the Quick Index and from the \n"
|
|
"Folder Tree View (if specified). The default is YES.\n",
|
|
TRUE
|
|
);
|
|
cb = addBool(
|
|
"SHOW_NAMESPACES",
|
|
"Set the SHOW_NAMESPACES tag to NO to disable the generation of the \n"
|
|
"Namespaces page. This will remove the Namespaces entry from the Quick Index\n"
|
|
"and from the Folder Tree View (if specified). The default is YES.\n",
|
|
TRUE
|
|
);
|
|
cs = addString( "FILE_VERSION_FILTER",
|
|
"The FILE_VERSION_FILTER tag can be used to specify a program or script that \n"
|
|
"doxygen should invoke to get the current version for each file (typically from \n"
|
|
"the version control system). Doxygen will invoke the program by executing (via \n"
|
|
"popen()) the command <command> <input-file>, where <command> is the value of \n"
|
|
"the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file \n"
|
|
"provided by doxygen. Whatever the program writes to standard output \n"
|
|
"is used as the file version. See the manual for examples. \n"
|
|
);
|
|
cs->setWidgetType(ConfigString::File);
|
|
cs = addString( "LAYOUT_FILE",
|
|
"The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by \n"
|
|
"doxygen. The layout file controls the global structure of the generated output files \n"
|
|
"in an output format independent way. The create the layout file that represents \n"
|
|
"doxygen's defaults, run doxygen with the -l option. You can optionally specify a \n"
|
|
"file name after the option, if omitted DoxygenLayout.xml will be used as the name \n"
|
|
"of the layout file.\n"
|
|
);
|
|
cs->setWidgetType(ConfigString::File);
|
|
addObsolete("DETAILS_AT_TOP");
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------
|
|
addInfo( "Messages","configuration options related to warning and progress messages");
|
|
//-----------------------------------------------------------------------------------------------
|
|
|
|
cb = addBool(
|
|
"QUIET",
|
|
"The QUIET tag can be used to turn on/off the messages that are generated \n"
|
|
"by doxygen. Possible values are YES and NO. If left blank NO is used. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"WARNINGS",
|
|
"The WARNINGS tag can be used to turn on/off the warning messages that are \n"
|
|
"generated by doxygen. Possible values are YES and NO. If left blank \n"
|
|
"NO is used. \n",
|
|
TRUE
|
|
);
|
|
cb = addBool(
|
|
"WARN_IF_UNDOCUMENTED",
|
|
"If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings \n"
|
|
"for undocumented members. If EXTRACT_ALL is set to YES then this flag will \n"
|
|
"automatically be disabled. \n",
|
|
TRUE
|
|
);
|
|
cb = addBool(
|
|
"WARN_IF_DOC_ERROR",
|
|
"If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for \n"
|
|
"potential errors in the documentation, such as not documenting some \n"
|
|
"parameters in a documented function, or documenting parameters that \n"
|
|
"don't exist or using markup commands wrongly. \n",
|
|
TRUE
|
|
);
|
|
cb = addBool( "WARN_NO_PARAMDOC",
|
|
"This WARN_NO_PARAMDOC option can be abled to get warnings for \n"
|
|
"functions that are documented, but have no documentation for their parameters \n"
|
|
"or return value. If set to NO (the default) doxygen will only warn about \n"
|
|
"wrong or incomplete parameter documentation, but not about the absence of \n"
|
|
"documentation.\n",
|
|
FALSE
|
|
);
|
|
cs = addString(
|
|
"WARN_FORMAT",
|
|
"The WARN_FORMAT tag determines the format of the warning messages that \n"
|
|
"doxygen can produce. The string should contain the $file, $line, and $text \n"
|
|
"tags, which will be replaced by the file and line number from which the \n"
|
|
"warning originated and the warning text. Optionally the format may contain \n"
|
|
"$version, which will be replaced by the version of the file (if it could \n"
|
|
"be obtained via FILE_VERSION_FILTER)\n"
|
|
);
|
|
cs->setDefaultValue("$file:$line: $text");
|
|
cs = addString(
|
|
"WARN_LOGFILE",
|
|
"The WARN_LOGFILE tag can be used to specify a file to which warning \n"
|
|
"and error messages should be written. If left blank the output is written \n"
|
|
"to stderr. \n"
|
|
);
|
|
cs->setWidgetType(ConfigString::File);
|
|
//-----------------------------------------------------------------------------------------------
|
|
addInfo( "Input","configuration options related to the input files");
|
|
//-----------------------------------------------------------------------------------------------
|
|
cl = addList(
|
|
"INPUT",
|
|
"The INPUT tag can be used to specify the files and/or directories that contain \n"
|
|
"documented source files. You may enter file names like \"myfile.cpp\" or \n"
|
|
"directories like \"/usr/src/myproject\". Separate the files or directories \n"
|
|
"with spaces. \n"
|
|
);
|
|
cl->setWidgetType(ConfigList::FileAndDir);
|
|
cs = addString( "INPUT_ENCODING",
|
|
"This tag can be used to specify the character encoding of the source files \n"
|
|
"that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is \n"
|
|
"also the default input encoding. Doxygen uses libiconv (or the iconv built \n"
|
|
"into libc) for the transcoding. See http://www.gnu.org/software/libiconv for \n"
|
|
"the list of possible encodings.\n"
|
|
);
|
|
cs->setDefaultValue("UTF-8");
|
|
cl = addList(
|
|
"FILE_PATTERNS",
|
|
"If the value of the INPUT tag contains directories, you can use the \n"
|
|
"FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp \n"
|
|
"and *.h) to filter out the source-files in the directories. If left \n"
|
|
"blank the following patterns are tested: \n"
|
|
"*.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx \n"
|
|
"*.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90\n"
|
|
);
|
|
cb = addBool(
|
|
"RECURSIVE",
|
|
"The RECURSIVE tag can be used to turn specify whether or not subdirectories \n"
|
|
"should be searched for input files as well. Possible values are YES and NO. \n"
|
|
"If left blank NO is used. \n",
|
|
FALSE
|
|
);
|
|
cl = addList(
|
|
"EXCLUDE",
|
|
"The EXCLUDE tag can be used to specify files and/or directories that should \n"
|
|
"excluded from the INPUT source files. This way you can easily exclude a \n"
|
|
"subdirectory from a directory tree whose root is specified with the INPUT tag. \n"
|
|
);
|
|
cb = addBool(
|
|
"EXCLUDE_SYMLINKS",
|
|
"The EXCLUDE_SYMLINKS tag can be used select whether or not files or \n"
|
|
"directories that are symbolic links (a Unix filesystem feature) are excluded \n"
|
|
"from the input. \n",
|
|
FALSE
|
|
);
|
|
cl->setWidgetType(ConfigList::FileAndDir);
|
|
cl = addList(
|
|
"EXCLUDE_PATTERNS",
|
|
"If the value of the INPUT tag contains directories, you can use the \n"
|
|
"EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude \n"
|
|
"certain files from those directories. Note that the wildcards are matched \n"
|
|
"against the file with absolute path, so to exclude all test directories \n"
|
|
"for example use the pattern */test/* \n"
|
|
);
|
|
cl = addList(
|
|
"EXCLUDE_SYMBOLS",
|
|
"The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names \n"
|
|
"(namespaces, classes, functions, etc.) that should be excluded from the \n"
|
|
"output. The symbol name can be a fully qualified name, a word, or if the \n"
|
|
"wildcard * is used, a substring. Examples: ANamespace, AClass, \n"
|
|
"AClass::ANamespace, ANamespace::*Test \n"
|
|
);
|
|
cl = addList(
|
|
"EXAMPLE_PATH",
|
|
"The EXAMPLE_PATH tag can be used to specify one or more files or \n"
|
|
"directories that contain example code fragments that are included (see \n"
|
|
"the \\include command). \n"
|
|
);
|
|
cl->setWidgetType(ConfigList::Dir);
|
|
cl = addList(
|
|
"EXAMPLE_PATTERNS",
|
|
"If the value of the EXAMPLE_PATH tag contains directories, you can use the \n"
|
|
"EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp \n"
|
|
"and *.h) to filter out the source-files in the directories. If left \n"
|
|
"blank all files are included. \n"
|
|
);
|
|
cb = addBool(
|
|
"EXAMPLE_RECURSIVE",
|
|
"If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be \n"
|
|
"searched for input files to be used with the \\include or \\dontinclude \n"
|
|
"commands irrespective of the value of the RECURSIVE tag. \n"
|
|
"Possible values are YES and NO. If left blank NO is used. \n",
|
|
FALSE
|
|
);
|
|
cl = addList(
|
|
"IMAGE_PATH",
|
|
"The IMAGE_PATH tag can be used to specify one or more files or \n"
|
|
"directories that contain image that are included in the documentation (see \n"
|
|
"the \\image command). \n"
|
|
);
|
|
cl->setWidgetType(ConfigList::Dir);
|
|
cs = addString(
|
|
"INPUT_FILTER",
|
|
"The INPUT_FILTER tag can be used to specify a program that doxygen should \n"
|
|
"invoke to filter for each input file. Doxygen will invoke the filter program \n"
|
|
"by executing (via popen()) the command <filter> <input-file>, where <filter> \n"
|
|
"is the value of the INPUT_FILTER tag, and <input-file> is the name of an \n"
|
|
"input file. Doxygen will then use the output that the filter program writes \n"
|
|
"to standard output. If FILTER_PATTERNS is specified, this tag will be \n"
|
|
"ignored. \n"
|
|
);
|
|
cs->setWidgetType(ConfigString::File);
|
|
cl = addList(
|
|
"FILTER_PATTERNS",
|
|
"The FILTER_PATTERNS tag can be used to specify filters on a per file pattern \n"
|
|
"basis. Doxygen will compare the file name with each pattern and apply the \n"
|
|
"filter if there is a match. The filters are a list of the form: \n"
|
|
"pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further \n"
|
|
"info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER \n"
|
|
"is applied to all files. \n"
|
|
);
|
|
cl->setWidgetType(ConfigList::File);
|
|
cb = addBool(
|
|
"FILTER_SOURCE_FILES",
|
|
"If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using \n"
|
|
"INPUT_FILTER) will be used to filter the input files when producing source \n"
|
|
"files to browse (i.e. when SOURCE_BROWSER is set to YES). \n",
|
|
FALSE
|
|
);
|
|
//-----------------------------------------------------------------------------------------------
|
|
addInfo( "Source Browser","configuration options related to source browsing");
|
|
//-----------------------------------------------------------------------------------------------
|
|
cb = addBool(
|
|
"SOURCE_BROWSER",
|
|
"If the SOURCE_BROWSER tag is set to YES then a list of source files will \n"
|
|
"be generated. Documented entities will be cross-referenced with these sources. \n"
|
|
"Note: To get rid of all source code in the generated output, make sure also \n"
|
|
"VERBATIM_HEADERS is set to NO. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"INLINE_SOURCES",
|
|
"Setting the INLINE_SOURCES tag to YES will include the body \n"
|
|
"of functions and classes directly in the documentation. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"STRIP_CODE_COMMENTS",
|
|
"Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct \n"
|
|
"doxygen to hide any special comment blocks from generated source code \n"
|
|
"fragments. Normal C and C++ comments will always remain visible. \n",
|
|
TRUE
|
|
);
|
|
cb = addBool( "REFERENCED_BY_RELATION",
|
|
"If the REFERENCED_BY_RELATION tag is set to YES \n"
|
|
"then for each documented function all documented \n"
|
|
"functions referencing it will be listed. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool( "REFERENCES_RELATION",
|
|
"If the REFERENCES_RELATION tag is set to YES \n"
|
|
"then for each documented function all documented entities \n"
|
|
"called/used by that function will be listed. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool( "REFERENCES_LINK_SOURCE",
|
|
"If the REFERENCES_LINK_SOURCE tag is set to YES (the default)\n"
|
|
"and SOURCE_BROWSER tag is set to YES, then the hyperlinks from\n"
|
|
"functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will\n"
|
|
"link to the source code. Otherwise they will link to the documentstion.\n",
|
|
TRUE
|
|
);
|
|
cb = addBool(
|
|
"USE_HTAGS",
|
|
"If the USE_HTAGS tag is set to YES then the references to source code \n"
|
|
"will point to the HTML generated by the htags(1) tool instead of doxygen \n"
|
|
"built-in source browser. The htags tool is part of GNU's global source \n"
|
|
"tagging system (see http://www.gnu.org/software/global/global.html). You \n"
|
|
"will need version 4.8.6 or higher. \n",
|
|
FALSE
|
|
);
|
|
cb->addDependency("SOURCE_BROWSER");
|
|
cb = addBool(
|
|
"VERBATIM_HEADERS",
|
|
"If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen \n"
|
|
"will generate a verbatim copy of the header file for each class for \n"
|
|
"which an include is specified. Set to NO to disable this. \n",
|
|
TRUE
|
|
);
|
|
|
|
//-----------------------------------------------------------------------------------------------
|
|
addInfo( "Index","configuration options related to the alphabetical class index");
|
|
//-----------------------------------------------------------------------------------------------
|
|
|
|
cb = addBool(
|
|
"ALPHABETICAL_INDEX",
|
|
"If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index \n"
|
|
"of all compounds will be generated. Enable this if the project \n"
|
|
"contains a lot of classes, structs, unions or interfaces. \n",
|
|
FALSE
|
|
);
|
|
ci = addInt(
|
|
"COLS_IN_ALPHA_INDEX",
|
|
"If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then \n"
|
|
"the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns \n"
|
|
"in which this list will be split (can be a number in the range [1..20]) \n",
|
|
1,20,5
|
|
);
|
|
cl = addList(
|
|
"IGNORE_PREFIX",
|
|
"In case all classes in a project start with a common prefix, all \n"
|
|
"classes will be put under the same header in the alphabetical index. \n"
|
|
"The IGNORE_PREFIX tag can be used to specify one or more prefixes that \n"
|
|
"should be ignored while generating the index headers. \n"
|
|
);
|
|
//-----------------------------------------------------------------------------------------------
|
|
addInfo( "HTML","configuration options related to the HTML output");
|
|
//-----------------------------------------------------------------------------------------------
|
|
cb = addBool(
|
|
"GENERATE_HTML",
|
|
"If the GENERATE_HTML tag is set to YES (the default) Doxygen will \n"
|
|
"generate HTML output. \n",
|
|
TRUE
|
|
);
|
|
cs = addString(
|
|
"HTML_OUTPUT",
|
|
"The HTML_OUTPUT tag is used to specify where the HTML docs will be put. \n"
|
|
"If a relative path is entered the value of OUTPUT_DIRECTORY will be \n"
|
|
"put in front of it. If left blank `html' will be used as the default path. \n"
|
|
);
|
|
cs->setDefaultValue("html");
|
|
cs->setWidgetType(ConfigString::Dir);
|
|
cs->addDependency("GENERATE_HTML");
|
|
cs = addString(
|
|
"HTML_FILE_EXTENSION",
|
|
"The HTML_FILE_EXTENSION tag can be used to specify the file extension for \n"
|
|
"each generated HTML page (for example: .htm,.php,.asp). If it is left blank \n"
|
|
"doxygen will generate files with .html extension.\n"
|
|
);
|
|
cs->setDefaultValue(".html");
|
|
cs->addDependency("GENERATE_HTML");
|
|
cs = addString(
|
|
"HTML_HEADER",
|
|
"The HTML_HEADER tag can be used to specify a personal HTML header for \n"
|
|
"each generated HTML page. If it is left blank doxygen will generate a \n"
|
|
"standard header.\n"
|
|
);
|
|
cs->setWidgetType(ConfigString::File);
|
|
cs->addDependency("GENERATE_HTML");
|
|
cs = addString(
|
|
"HTML_FOOTER",
|
|
"The HTML_FOOTER tag can be used to specify a personal HTML footer for \n"
|
|
"each generated HTML page. If it is left blank doxygen will generate a \n"
|
|
"standard footer.\n"
|
|
);
|
|
cs->setWidgetType(ConfigString::File);
|
|
cs->addDependency("GENERATE_HTML");
|
|
cs = addString(
|
|
"HTML_STYLESHEET",
|
|
"The HTML_STYLESHEET tag can be used to specify a user-defined cascading \n"
|
|
"style sheet that is used by each HTML page. It can be used to \n"
|
|
"fine-tune the look of the HTML output. If the tag is left blank doxygen \n"
|
|
"will generate a default style sheet. Note that doxygen will try to copy \n"
|
|
"the style sheet file to the HTML output directory, so don't put your own \n"
|
|
"stylesheet in the HTML output directory as well, or it will be erased! \n"
|
|
);
|
|
cs->setWidgetType(ConfigString::File);
|
|
cs->addDependency("GENERATE_HTML");
|
|
cb = addBool(
|
|
"HTML_ALIGN_MEMBERS",
|
|
"If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, \n"
|
|
"files or namespaces will be aligned in HTML using tables. If set to \n"
|
|
"NO a bullet list will be used. \n",
|
|
TRUE
|
|
);
|
|
cb->addDependency("GENERATE_HTML");
|
|
cb = addBool(
|
|
"HTML_DYNAMIC_SECTIONS",
|
|
"If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML \n"
|
|
"documentation will contain sections that can be hidden and shown after the \n"
|
|
"page has loaded. For this to work a browser that supports \n"
|
|
"JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox \n"
|
|
"Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). \n",
|
|
FALSE
|
|
);
|
|
cb->addDependency("GENERATE_HTML");
|
|
|
|
/////////////////////////////////////////////////////////
|
|
// Docsets //////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////
|
|
|
|
cb = addBool( "GENERATE_DOCSET",
|
|
"If the GENERATE_DOCSET tag is set to YES, additional index files \n"
|
|
"will be generated that can be used as input for Apple's Xcode 3 \n"
|
|
"integrated development environment, introduced with OSX 10.5 (Leopard). \n"
|
|
"To create a documentation set, doxygen will generate a Makefile in the \n"
|
|
"HTML output directory. Running make will produce the docset in that \n"
|
|
"directory and running \"make install\" will install the docset in \n"
|
|
"~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find \n"
|
|
"it at startup. \n"
|
|
"See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html "
|
|
"for more information. \n",
|
|
FALSE
|
|
);
|
|
cb->addDependency("GENERATE_HTML");
|
|
cs = addString(
|
|
"DOCSET_FEEDNAME",
|
|
"When GENERATE_DOCSET tag is set to YES, this tag determines the name of the \n"
|
|
"feed. A documentation feed provides an umbrella under which multiple \n"
|
|
"documentation sets from a single provider (such as a company or product suite) \n"
|
|
"can be grouped. \n"
|
|
);
|
|
cs->setDefaultValue("Doxygen generated docs");
|
|
cs->addDependency("GENERATE_DOCSET");
|
|
cs = addString(
|
|
"DOCSET_BUNDLE_ID",
|
|
"When GENERATE_DOCSET tag is set to YES, this tag specifies a string that \n"
|
|
"should uniquely identify the documentation set bundle. This should be a \n"
|
|
"reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen \n"
|
|
"will append .docset to the name. \n"
|
|
);
|
|
cs->setDefaultValue("org.doxygen.Project");
|
|
cs->addDependency("GENERATE_DOCSET");
|
|
|
|
/////////////////////////////////////////////////////////
|
|
// HTMLHELP /////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////
|
|
|
|
cb = addBool(
|
|
"GENERATE_HTMLHELP",
|
|
"If the GENERATE_HTMLHELP tag is set to YES, additional index files \n"
|
|
"will be generated that can be used as input for tools like the \n"
|
|
"Microsoft HTML help workshop to generate a compiled HTML help file (.chm) \n"
|
|
"of the generated HTML documentation. \n",
|
|
FALSE
|
|
);
|
|
cb->addDependency("GENERATE_HTML");
|
|
cs = addString(
|
|
"CHM_FILE",
|
|
"If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can \n"
|
|
"be used to specify the file name of the resulting .chm file. You \n"
|
|
"can add a path in front of the file if the result should not be \n"
|
|
"written to the html output directory. \n"
|
|
);
|
|
cs->setWidgetType(ConfigString::File);
|
|
cs->addDependency("GENERATE_HTML");
|
|
cs = addString(
|
|
"HHC_LOCATION",
|
|
"If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can \n"
|
|
"be used to specify the location (absolute path including file name) of \n"
|
|
"the HTML help compiler (hhc.exe). If non-empty doxygen will try to run \n"
|
|
"the HTML help compiler on the generated index.hhp.\n"
|
|
);
|
|
cs->setWidgetType(ConfigString::File);
|
|
cs->addDependency("GENERATE_HTML");
|
|
#if 0
|
|
cs = addString(
|
|
"QTHELP_FILE",
|
|
"If the GENERATE_HTMLHELP tag is set to YES, the QTHELP_FILE tag can \n"
|
|
"be used to specify the file name of the resulting .(qch|qhp) file. \n"
|
|
"You can add a path in front of the file if the result should not be \n"
|
|
"written to the html output directory. \n"
|
|
);
|
|
cs->setWidgetType(ConfigString::File);
|
|
cs->addDependency("GENERATE_HTML");
|
|
cs = addString(
|
|
"QTHELP_CONFIG",
|
|
"If DOXYGEN2QTHELP_LOC is set, QTHELP_CONFIG must specify the file name \n"
|
|
"of a config file to pass to doxygen2qthelp. \n"
|
|
);
|
|
cs->setWidgetType(ConfigString::File);
|
|
cs->addDependency("GENERATE_HTML");
|
|
cs = addString(
|
|
"DOXYGEN2QTHELP_LOC",
|
|
"If the GENERATE_HTMLHELP tag is set to YES, the DOXYGEN2QTHELP_LOC tag \n"
|
|
"can be used to specify the location (absolute path including file name) of \n"
|
|
"the doxygen2qthelp tool. If non-empty doxygen will try to run doxygen2qthelp \n"
|
|
"on the generated index.hhp.\n"
|
|
);
|
|
cs->setWidgetType(ConfigString::File);
|
|
cs->addDependency("GENERATE_HTML");
|
|
#endif
|
|
addObsolete("QTHELP_FILE");
|
|
addObsolete("QTHELP_CONFIG");
|
|
addObsolete("DOXYGEN2QTHELP_LOC");
|
|
cb = addBool(
|
|
"GENERATE_CHI",
|
|
"If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag \n"
|
|
"controls if a separate .chi index file is generated (YES) or that \n"
|
|
"it should be included in the master .chm file (NO).\n",
|
|
FALSE
|
|
);
|
|
cb->addDependency("GENERATE_HTML");
|
|
cs = addString(
|
|
"CHM_INDEX_ENCODING",
|
|
"If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING\n"
|
|
"is used to encode HtmlHelp index (hhk), content (hhc) and project file\n"
|
|
"content.\n"
|
|
);
|
|
cs->addDependency("GENERATE_HTML");
|
|
cb = addBool(
|
|
"BINARY_TOC",
|
|
"If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag \n"
|
|
"controls whether a binary table of contents is generated (YES) or a \n"
|
|
"normal table of contents (NO) in the .chm file.\n",
|
|
FALSE
|
|
);
|
|
cb->addDependency("GENERATE_HTML");
|
|
cb = addBool(
|
|
"TOC_EXPAND",
|
|
"The TOC_EXPAND flag can be set to YES to add extra items for group members \n"
|
|
"to the contents of the HTML help documentation and to the tree view. \n",
|
|
FALSE
|
|
);
|
|
cb->addDependency("GENERATE_HTML");
|
|
|
|
/////////////////////////////////////////////////////////
|
|
// QT HELP //////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////
|
|
|
|
cb = addBool(
|
|
"GENERATE_QHP",
|
|
"If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER \n"
|
|
"are set, an additional index file will be generated that can be used as input for \n"
|
|
"Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated \n"
|
|
"HTML documentation. \n",
|
|
FALSE
|
|
);
|
|
cb->addDependency("GENERATE_HTML");
|
|
cs = addString(
|
|
"QCH_FILE",
|
|
"If the QHG_LOCATION tag is specified, the QCH_FILE tag can \n"
|
|
"be used to specify the file name of the resulting .qch file. \n"
|
|
"The path specified is relative to the HTML output folder. \n"
|
|
);
|
|
cs->setWidgetType(ConfigString::File);
|
|
cs->addDependency("GENERATE_QHP");
|
|
cs = addString(
|
|
"QHP_NAMESPACE",
|
|
"The QHP_NAMESPACE tag specifies the namespace to use when generating \n"
|
|
"Qt Help Project output. For more information please see \n"
|
|
"http://doc.trolltech.com/qthelpproject.html#namespace \n"
|
|
);
|
|
cs->addDependency("GENERATE_QHP");
|
|
cs = addString(
|
|
"QHP_VIRTUAL_FOLDER",
|
|
"The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating \n"
|
|
"Qt Help Project output. For more information please see \n"
|
|
"http://doc.trolltech.com/qthelpproject.html#virtual-folders \n"
|
|
);
|
|
cs->setDefaultValue("doc");
|
|
cs->addDependency("GENERATE_QHP");
|
|
|
|
cs = addString(
|
|
"QHP_CUSTOM_FILTER_NAME",
|
|
"If QHP_CUSTOM_FILTER_NAME is set, it specifies the name of a custom filter to add. \n"
|
|
"For more information please see \n"
|
|
"http://doc.trolltech.com/qthelpproject.html#custom-filters \n"
|
|
);
|
|
cs->addDependency("GENERATE_QHP");
|
|
|
|
cs = addString(
|
|
"QHP_CUST_FILTER_ATTRS",
|
|
"The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add."
|
|
"For more information please see \n"
|
|
"<a href=\"http://doc.trolltech.com/qthelpproject.html#custom-filters\">Qt Help Project / Custom Filters</a>. \n"
|
|
);
|
|
cs->addDependency("GENERATE_QHP");
|
|
|
|
cs = addString(
|
|
"QHP_SECT_FILTER_ATTRS",
|
|
"The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's \n"
|
|
"filter section matches. \n"
|
|
"<a href=\"http://doc.trolltech.com/qthelpproject.html#filter-attributes\">Qt Help Project / Filter Attributes</a>. \n"
|
|
);
|
|
cs->addDependency("GENERATE_QHP");
|
|
|
|
cs = addString(
|
|
"QHG_LOCATION",
|
|
"If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can \n"
|
|
"be used to specify the location of Qt's qhelpgenerator. \n"
|
|
"If non-empty doxygen will try to run qhelpgenerator on the generated \n"
|
|
".qhp file .\n"
|
|
);
|
|
cs->setWidgetType(ConfigString::File);
|
|
cs->addDependency("GENERATE_QHP");
|
|
|
|
/////////////////////////////////////////////////////////
|
|
// MISC /////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////
|
|
|
|
cb = addBool(
|
|
"DISABLE_INDEX",
|
|
"The DISABLE_INDEX tag can be used to turn on/off the condensed index at \n"
|
|
"top of each HTML page. The value NO (the default) enables the index and \n"
|
|
"the value YES disables it. \n",
|
|
FALSE
|
|
);
|
|
cb->addDependency("GENERATE_HTML");
|
|
ci = addInt(
|
|
"ENUM_VALUES_PER_LINE",
|
|
"This tag can be used to set the number of enum values (range [1..20]) \n"
|
|
"that doxygen will group on one line in the generated HTML documentation. \n",
|
|
1,20,4
|
|
);
|
|
ci->addDependency("GENERATE_HTML");
|
|
ce = addEnum(
|
|
"GENERATE_TREEVIEW",
|
|
"The GENERATE_TREEVIEW tag is used to specify whether a tree-like index\n"
|
|
"structure should be generated to display hierarchical information.\n"
|
|
"If the tag value is set to FRAME, a side panel will be generated\n"
|
|
"containing a tree-like index structure (just like the one that \n"
|
|
"is generated for HTML Help). For this to work a browser that supports \n"
|
|
"JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, \n"
|
|
"Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are \n"
|
|
"probably better off using the HTML help feature. Other possible values \n"
|
|
"for this tag are: HIERARCHIES, which will generate the Groups, Directories,\n"
|
|
"and Class Hierarchy pages using a tree view instead of an ordered list;\n"
|
|
"ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which\n"
|
|
"disables this behavior completely. For backwards compatibility with previous\n"
|
|
"releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE\n"
|
|
"respectively.\n",
|
|
"NONE"
|
|
);
|
|
ce->addValue("NONE");
|
|
ce->addValue("FRAME");
|
|
ce->addValue("HIERARCHIES");
|
|
ce->addValue("ALL");
|
|
cb->addDependency("GENERATE_HTML");
|
|
ci = addInt(
|
|
"TREEVIEW_WIDTH",
|
|
"If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be \n"
|
|
"used to set the initial width (in pixels) of the frame in which the tree \n"
|
|
"is shown. \n",
|
|
0,1500,250
|
|
);
|
|
ci->addDependency("GENERATE_HTML");
|
|
ci = addInt(
|
|
"FORMULA_FONTSIZE",
|
|
"Use this tag to change the font size of Latex formulas included \n"
|
|
"as images in the HTML documentation. The default is 10. Note that \n"
|
|
"when you change the font size after a successful doxygen run you need \n"
|
|
"to manually remove any form_*.png images from the HTML output directory \n"
|
|
"to force them to be regenerated. \n",
|
|
8,50,10
|
|
);
|
|
ci->addDependency("GENERATE_HTML");
|
|
|
|
//-----------------------------------------------------------------------------------------------
|
|
addInfo( "LaTeX","configuration options related to the LaTeX output");
|
|
//-----------------------------------------------------------------------------------------------
|
|
cb = addBool(
|
|
"GENERATE_LATEX",
|
|
"If the GENERATE_LATEX tag is set to YES (the default) Doxygen will \n"
|
|
"generate Latex output. \n",
|
|
TRUE
|
|
);
|
|
cs = addString(
|
|
"LATEX_OUTPUT",
|
|
"The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. \n"
|
|
"If a relative path is entered the value of OUTPUT_DIRECTORY will be \n"
|
|
"put in front of it. If left blank `latex' will be used as the default path. \n"
|
|
);
|
|
cs->setDefaultValue("latex");
|
|
cs->setWidgetType(ConfigString::Dir);
|
|
cs->addDependency("GENERATE_LATEX");
|
|
#if 0
|
|
cs = addString( "LATEX_OUTPUT_ENCODING",
|
|
"The LATEX_OUTPUT_ENCODING specifies the character encoding of the LaTeX output.\n"
|
|
"produced by doxygen. If left blank ISO-8859-1 will be used. Doxygen uses \n"
|
|
"libiconv for the transcoding. See http://www.gnu.org/software/libiconv for \n"
|
|
"the list of possible encodings.\n"
|
|
);
|
|
cs->setDefaultValue("ISO-8859-1");
|
|
cs->addDependency("GENERATE_LATEX");
|
|
#endif
|
|
cs = addString(
|
|
"LATEX_CMD_NAME",
|
|
"The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be \n"
|
|
"invoked. If left blank `latex' will be used as the default command name. \n"
|
|
);
|
|
cs->setDefaultValue("latex");
|
|
cs->setWidgetType(ConfigString::File);
|
|
cs->addDependency("GENERATE_LATEX");
|
|
cs = addString(
|
|
"MAKEINDEX_CMD_NAME",
|
|
"The MAKEINDEX_CMD_NAME tag can be used to specify the command name to \n"
|
|
"generate index for LaTeX. If left blank `makeindex' will be used as the \n"
|
|
"default command name. \n"
|
|
);
|
|
cs->setDefaultValue("makeindex");
|
|
cs->setWidgetType(ConfigString::File);
|
|
cs->addDependency("GENERATE_LATEX");
|
|
cb = addBool(
|
|
"COMPACT_LATEX",
|
|
"If the COMPACT_LATEX tag is set to YES Doxygen generates more compact \n"
|
|
"LaTeX documents. This may be useful for small projects and may help to \n"
|
|
"save some trees in general. \n",
|
|
FALSE
|
|
);
|
|
cb->addDependency("GENERATE_LATEX");
|
|
ce = addEnum(
|
|
"PAPER_TYPE",
|
|
"The PAPER_TYPE tag can be used to set the paper type that is used \n"
|
|
"by the printer. Possible values are: a4, a4wide, letter, legal and \n"
|
|
"executive. If left blank a4wide will be used. \n",
|
|
"a4wide"
|
|
);
|
|
ce->addValue("a4");
|
|
ce->addValue("a4wide");
|
|
ce->addValue("letter");
|
|
ce->addValue("legal");
|
|
ce->addValue("executive");
|
|
ce->addDependency("GENERATE_LATEX");
|
|
cl = addList(
|
|
"EXTRA_PACKAGES",
|
|
"The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX \n"
|
|
"packages that should be included in the LaTeX output. \n"
|
|
);
|
|
cl->addDependency("GENERATE_LATEX");
|
|
cs = addString(
|
|
"LATEX_HEADER",
|
|
"The LATEX_HEADER tag can be used to specify a personal LaTeX header for \n"
|
|
"the generated latex document. The header should contain everything until \n"
|
|
"the first chapter. If it is left blank doxygen will generate a \n"
|
|
"standard header. Notice: only use this tag if you know what you are doing! \n"
|
|
);
|
|
cs->setWidgetType(ConfigString::File);
|
|
cs->addDependency("GENERATE_LATEX");
|
|
cb = addBool(
|
|
"PDF_HYPERLINKS",
|
|
"If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated \n"
|
|
"is prepared for conversion to pdf (using ps2pdf). The pdf file will \n"
|
|
"contain links (just like the HTML output) instead of page references \n"
|
|
"This makes the output suitable for online browsing using a pdf viewer. \n",
|
|
TRUE
|
|
);
|
|
cb->addDependency("GENERATE_LATEX");
|
|
cb = addBool(
|
|
"USE_PDFLATEX",
|
|
"If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of \n"
|
|
"plain latex in the generated Makefile. Set this option to YES to get a \n"
|
|
"higher quality PDF documentation. \n",
|
|
TRUE
|
|
);
|
|
cb->addDependency("GENERATE_LATEX");
|
|
cb = addBool(
|
|
"LATEX_BATCHMODE",
|
|
"If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\\\batchmode. \n"
|
|
"command to the generated LaTeX files. This will instruct LaTeX to keep \n"
|
|
"running if errors occur, instead of asking the user for help. \n"
|
|
"This option is also used when generating formulas in HTML. \n",
|
|
FALSE
|
|
);
|
|
cb->addDependency("GENERATE_LATEX");
|
|
cb = addBool(
|
|
"LATEX_HIDE_INDICES",
|
|
"If LATEX_HIDE_INDICES is set to YES then doxygen will not \n"
|
|
"include the index chapters (such as File Index, Compound Index, etc.) \n"
|
|
"in the output. \n",
|
|
FALSE
|
|
);
|
|
cb->addDependency("GENERATE_LATEX");
|
|
//-----------------------------------------------------------------------------------------------
|
|
addInfo( "RTF","configuration options related to the RTF output");
|
|
//-----------------------------------------------------------------------------------------------
|
|
cb = addBool(
|
|
"GENERATE_RTF",
|
|
"If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output \n"
|
|
"The RTF output is optimized for Word 97 and may not look very pretty with \n"
|
|
"other RTF readers or editors.\n",
|
|
FALSE
|
|
);
|
|
cs = addString(
|
|
"RTF_OUTPUT",
|
|
"The RTF_OUTPUT tag is used to specify where the RTF docs will be put. \n"
|
|
"If a relative path is entered the value of OUTPUT_DIRECTORY will be \n"
|
|
"put in front of it. If left blank `rtf' will be used as the default path. \n"
|
|
);
|
|
cs->setDefaultValue("rtf");
|
|
cs->setWidgetType(ConfigString::Dir);
|
|
cs->addDependency("GENERATE_RTF");
|
|
#if 0
|
|
cs = addString( "RTF_OUTPUT_ENCODING",
|
|
"The RTF_OUTPUT_ENCODING specifies the character encoding of the RTF output.\n"
|
|
"produced by doxygen. If left blank ISO-8859-1 will be used. Doxygen uses \n"
|
|
"libiconv for the transcoding. See http://www.gnu.org/software/libiconv for \n"
|
|
"the list of possible encodings.\n"
|
|
);
|
|
cs->setDefaultValue("ISO-8859-1");
|
|
cs->addDependency("GENERATE_RTF");
|
|
#endif
|
|
cb = addBool(
|
|
"COMPACT_RTF",
|
|
"If the COMPACT_RTF tag is set to YES Doxygen generates more compact \n"
|
|
"RTF documents. This may be useful for small projects and may help to \n"
|
|
"save some trees in general. \n",
|
|
FALSE
|
|
);
|
|
cb->addDependency("GENERATE_RTF");
|
|
cb = addBool(
|
|
"RTF_HYPERLINKS",
|
|
"If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated \n"
|
|
"will contain hyperlink fields. The RTF file will \n"
|
|
"contain links (just like the HTML output) instead of page references. \n"
|
|
"This makes the output suitable for online browsing using WORD or other \n"
|
|
"programs which support those fields. \n"
|
|
"Note: wordpad (write) and others do not support links. \n",
|
|
FALSE
|
|
);
|
|
cb->addDependency("GENERATE_RTF");
|
|
cs = addString(
|
|
"RTF_STYLESHEET_FILE",
|
|
"Load stylesheet definitions from file. Syntax is similar to doxygen's \n"
|
|
"config file, i.e. a series of assignments. You only have to provide \n"
|
|
"replacements, missing definitions are set to their default value. \n"
|
|
);
|
|
cs->setWidgetType(ConfigString::File);
|
|
cs->addDependency("GENERATE_RTF");
|
|
cs = addString(
|
|
"RTF_EXTENSIONS_FILE",
|
|
"Set optional variables used in the generation of an rtf document. \n"
|
|
"Syntax is similar to doxygen's config file.\n"
|
|
);
|
|
cs->setWidgetType(ConfigString::File);
|
|
cs->addDependency("GENERATE_RTF");
|
|
|
|
//-----------------------------------------------------------------------------------------------
|
|
addInfo( "Man","configuration options related to the man page output");
|
|
//-----------------------------------------------------------------------------------------------
|
|
cb = addBool(
|
|
"GENERATE_MAN",
|
|
"If the GENERATE_MAN tag is set to YES (the default) Doxygen will \n"
|
|
"generate man pages \n",
|
|
FALSE
|
|
);
|
|
cs = addString(
|
|
"MAN_OUTPUT",
|
|
"The MAN_OUTPUT tag is used to specify where the man pages will be put. \n"
|
|
"If a relative path is entered the value of OUTPUT_DIRECTORY will be \n"
|
|
"put in front of it. If left blank `man' will be used as the default path. \n"
|
|
);
|
|
cs->setDefaultValue("man");
|
|
cs->setWidgetType(ConfigString::Dir);
|
|
cs->addDependency("GENERATE_MAN");
|
|
cs = addString(
|
|
"MAN_EXTENSION",
|
|
"The MAN_EXTENSION tag determines the extension that is added to \n"
|
|
"the generated man pages (default is the subroutine's section .3) \n"
|
|
);
|
|
cs->setDefaultValue(".3");
|
|
cs->addDependency("GENERATE_MAN");
|
|
cb = addBool(
|
|
"MAN_LINKS",
|
|
"If the MAN_LINKS tag is set to YES and Doxygen generates man output, \n"
|
|
"then it will generate one additional man file for each entity \n"
|
|
"documented in the real man page(s). These additional files \n"
|
|
"only source the real man page, but without them the man command \n"
|
|
"would be unable to find the correct page. The default is NO. \n",
|
|
FALSE
|
|
);
|
|
cb->addDependency("GENERATE_MAN");
|
|
//-----------------------------------------------------------------------------------------------
|
|
addInfo( "XML","configuration options related to the XML output");
|
|
//-----------------------------------------------------------------------------------------------
|
|
cb = addBool(
|
|
"GENERATE_XML",
|
|
"If the GENERATE_XML tag is set to YES Doxygen will \n"
|
|
"generate an XML file that captures the structure of \n"
|
|
"the code including all documentation. \n",
|
|
FALSE
|
|
);
|
|
cs = addString(
|
|
"XML_OUTPUT",
|
|
"The XML_OUTPUT tag is used to specify where the XML pages will be put. \n"
|
|
"If a relative path is entered the value of OUTPUT_DIRECTORY will be \n"
|
|
"put in front of it. If left blank `xml' will be used as the default path. \n"
|
|
);
|
|
cs->setDefaultValue("xml");
|
|
cs->setWidgetType(ConfigString::Dir);
|
|
cs->addDependency("GENERATE_XML");
|
|
cs = addString(
|
|
"XML_SCHEMA",
|
|
"The XML_SCHEMA tag can be used to specify an XML schema, \n"
|
|
"which can be used by a validating XML parser to check the \n"
|
|
"syntax of the XML files. \n"
|
|
);
|
|
cs->addDependency("GENERATE_XML");
|
|
cs = addString(
|
|
"XML_DTD",
|
|
"The XML_DTD tag can be used to specify an XML DTD, \n"
|
|
"which can be used by a validating XML parser to check the \n"
|
|
"syntax of the XML files. \n"
|
|
);
|
|
cs->addDependency("GENERATE_XML");
|
|
cb = addBool(
|
|
"XML_PROGRAMLISTING",
|
|
"If the XML_PROGRAMLISTING tag is set to YES Doxygen will \n"
|
|
"dump the program listings (including syntax highlighting \n"
|
|
"and cross-referencing information) to the XML output. Note that \n"
|
|
"enabling this will significantly increase the size of the XML output. \n",
|
|
TRUE
|
|
);
|
|
cb->addDependency("GENERATE_XML");
|
|
|
|
//--------------------------------------------------------------------------
|
|
addInfo( "DEF","configuration options for the AutoGen Definitions output");
|
|
//--------------------------------------------------------------------------
|
|
cb = addBool("GENERATE_AUTOGEN_DEF",
|
|
|
|
"If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will \n"
|
|
"generate an AutoGen Definitions (see autogen.sf.net) file \n"
|
|
"that captures the structure of the code including all \n"
|
|
"documentation. Note that this feature is still experimental \n"
|
|
"and incomplete at the moment. \n",
|
|
|
|
FALSE );
|
|
//-----------------------------------------------------------------------------------------------
|
|
addInfo( "PerlMod","configuration options related to the Perl module output");
|
|
//-----------------------------------------------------------------------------------------------
|
|
cb = addBool(
|
|
"GENERATE_PERLMOD",
|
|
"If the GENERATE_PERLMOD tag is set to YES Doxygen will \n"
|
|
"generate a Perl module file that captures the structure of \n"
|
|
"the code including all documentation. Note that this \n"
|
|
"feature is still experimental and incomplete at the \n"
|
|
"moment. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"PERLMOD_LATEX",
|
|
"If the PERLMOD_LATEX tag is set to YES Doxygen will generate \n"
|
|
"the necessary Makefile rules, Perl scripts and LaTeX code to be able \n"
|
|
"to generate PDF and DVI output from the Perl module output. \n",
|
|
FALSE
|
|
);
|
|
cb->addDependency("GENERATE_PERLMOD");
|
|
cb = addBool(
|
|
"PERLMOD_PRETTY",
|
|
"If the PERLMOD_PRETTY tag is set to YES the Perl module output will be \n"
|
|
"nicely formatted so it can be parsed by a human reader. This is useful \n"
|
|
"if you want to understand what is going on. On the other hand, if this \n"
|
|
"tag is set to NO the size of the Perl module output will be much smaller \n"
|
|
"and Perl will parse it just the same. \n",
|
|
TRUE
|
|
);
|
|
cb->addDependency("GENERATE_PERLMOD");
|
|
cs = addString(
|
|
"PERLMOD_MAKEVAR_PREFIX",
|
|
"The names of the make variables in the generated doxyrules.make file \n"
|
|
"are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. \n"
|
|
"This is useful so different doxyrules.make files included by the same \n"
|
|
"Makefile don't overwrite each other's variables."
|
|
);
|
|
cs->addDependency("GENERATE_PERLMOD");
|
|
|
|
//-----------------------------------------------------------------------------------------------
|
|
addInfo( "Preprocessor","Configuration options related to the preprocessor ");
|
|
//-----------------------------------------------------------------------------------------------
|
|
cb = addBool(
|
|
"ENABLE_PREPROCESSING",
|
|
"If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will \n"
|
|
"evaluate all C-preprocessor directives found in the sources and include \n"
|
|
"files. \n",
|
|
TRUE
|
|
);
|
|
cb = addBool(
|
|
"MACRO_EXPANSION",
|
|
"If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro \n"
|
|
"names in the source code. If set to NO (the default) only conditional \n"
|
|
"compilation will be performed. Macro expansion can be done in a controlled \n"
|
|
"way by setting EXPAND_ONLY_PREDEF to YES. \n",
|
|
FALSE
|
|
);
|
|
cb->addDependency("ENABLE_PREPROCESSING");
|
|
cb = addBool(
|
|
"EXPAND_ONLY_PREDEF",
|
|
"If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES \n"
|
|
"then the macro expansion is limited to the macros specified with the \n"
|
|
"PREDEFINED and EXPAND_AS_DEFINED tags. \n",
|
|
FALSE
|
|
);
|
|
cb->addDependency("ENABLE_PREPROCESSING");
|
|
cb = addBool(
|
|
"SEARCH_INCLUDES",
|
|
"If the SEARCH_INCLUDES tag is set to YES (the default) the includes files \n"
|
|
"in the INCLUDE_PATH (see below) will be search if a #include is found. \n",
|
|
TRUE
|
|
);
|
|
cb->addDependency("ENABLE_PREPROCESSING");
|
|
cl = addList(
|
|
"INCLUDE_PATH",
|
|
"The INCLUDE_PATH tag can be used to specify one or more directories that \n"
|
|
"contain include files that are not input files but should be processed by \n"
|
|
"the preprocessor.\n"
|
|
);
|
|
cl->setWidgetType(ConfigList::Dir);
|
|
cl->addDependency("ENABLE_PREPROCESSING");
|
|
cl = addList(
|
|
"INCLUDE_FILE_PATTERNS",
|
|
"You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard \n"
|
|
"patterns (like *.h and *.hpp) to filter out the header-files in the \n"
|
|
"directories. If left blank, the patterns specified with FILE_PATTERNS will \n"
|
|
"be used. \n"
|
|
);
|
|
cl->addDependency("ENABLE_PREPROCESSING");
|
|
cl = addList(
|
|
"PREDEFINED",
|
|
"The PREDEFINED tag can be used to specify one or more macro names that \n"
|
|
"are defined before the preprocessor is started (similar to the -D option of \n"
|
|
"gcc). The argument of the tag is a list of macros of the form: name \n"
|
|
"or name=definition (no spaces). If the definition and the = are \n"
|
|
"omitted =1 is assumed. To prevent a macro definition from being \n"
|
|
"undefined via #undef or recursively expanded use the := operator \n"
|
|
"instead of the = operator.\n"
|
|
);
|
|
cl->addDependency("ENABLE_PREPROCESSING");
|
|
cl = addList(
|
|
"EXPAND_AS_DEFINED",
|
|
"If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then \n"
|
|
"this tag can be used to specify a list of macro names that should be expanded. \n"
|
|
"The macro definition that is found in the sources will be used. \n"
|
|
"Use the PREDEFINED tag if you want to use a different macro definition. \n"
|
|
);
|
|
cl->addDependency("ENABLE_PREPROCESSING");
|
|
cb = addBool(
|
|
"SKIP_FUNCTION_MACROS",
|
|
"If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then \n"
|
|
"doxygen's preprocessor will remove all function-like macros that are alone \n"
|
|
"on a line, have an all uppercase name, and do not end with a semicolon. Such \n"
|
|
"function macros are typically used for boiler-plate code, and will confuse \n"
|
|
"the parser if not removed. \n",
|
|
TRUE
|
|
);
|
|
cb->addDependency("ENABLE_PREPROCESSING");
|
|
//-----------------------------------------------------------------------------------------------
|
|
addInfo( "External","Configuration::additions related to external references ");
|
|
//-----------------------------------------------------------------------------------------------
|
|
cl = addList(
|
|
"TAGFILES",
|
|
"The TAGFILES option can be used to specify one or more tagfiles. \n"
|
|
"Optionally an initial location of the external documentation \n"
|
|
"can be added for each tagfile. The format of a tag file without \n"
|
|
"this location is as follows: \n"
|
|
" TAGFILES = file1 file2 ... \n"
|
|
"Adding location for the tag files is done as follows: \n"
|
|
" TAGFILES = file1=loc1 \"file2 = loc2\" ... \n"
|
|
"where \"loc1\" and \"loc2\" can be relative or absolute paths or \n"
|
|
"URLs. If a location is present for each tag, the installdox tool \n"
|
|
"does not have to be run to correct the links.\n"
|
|
"Note that each tag file must have a unique name\n"
|
|
"(where the name does NOT include the path)\n"
|
|
"If a tag file is not located in the directory in which doxygen \n"
|
|
"is run, you must also specify the path to the tagfile here. \n"
|
|
);
|
|
cl->setWidgetType(ConfigList::File);
|
|
cs = addString(
|
|
"GENERATE_TAGFILE",
|
|
"When a file name is specified after GENERATE_TAGFILE, doxygen will create \n"
|
|
"a tag file that is based on the input files it reads. \n"
|
|
);
|
|
cs->setWidgetType(ConfigString::File);
|
|
cb = addBool(
|
|
"ALLEXTERNALS",
|
|
"If the ALLEXTERNALS tag is set to YES all external classes will be listed \n"
|
|
"in the class index. If set to NO only the inherited external classes \n"
|
|
"will be listed. \n",
|
|
FALSE
|
|
);
|
|
cb = addBool(
|
|
"EXTERNAL_GROUPS",
|
|
"If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed \n"
|
|
"in the modules index. If set to NO, only the current project's groups will \n"
|
|
"be listed. \n",
|
|
TRUE
|
|
);
|
|
cs = addString(
|
|
"PERL_PATH",
|
|
"The PERL_PATH should be the absolute path and name of the perl script \n"
|
|
"interpreter (i.e. the result of `which perl'). \n"
|
|
);
|
|
cs->setDefaultValue("/usr/bin/perl");
|
|
cs->setWidgetType(ConfigString::Dir);
|
|
|
|
//-----------------------------------------------------------------------------------------------
|
|
addInfo( "Dot","Configuration options related to the dot tool ");
|
|
//-----------------------------------------------------------------------------------------------
|
|
cb = addBool(
|
|
"CLASS_DIAGRAMS",
|
|
"If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will \n"
|
|
"generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base \n"
|
|
"or super classes. Setting the tag to NO turns the diagrams off. Note that \n"
|
|
"this option is superseded by the HAVE_DOT option below. This is only a \n"
|
|
"fallback. It is recommended to install and use dot, since it yields more \n"
|
|
"powerful graphs. \n",
|
|
TRUE
|
|
);
|
|
cs = addString( "MSCGEN_PATH",
|
|
"You can define message sequence charts within doxygen comments using the \\msc \n"
|
|
"command. Doxygen will then run the mscgen tool (see \n"
|
|
"http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the \n"
|
|
"documentation. The MSCGEN_PATH tag allows you to specify the directory where \n"
|
|
"the mscgen tool resides. If left empty the tool is assumed to be found in the \n"
|
|
"default search path. \n"
|
|
);
|
|
cb = addBool(
|
|
"HIDE_UNDOC_RELATIONS",
|
|
"If set to YES, the inheritance and collaboration graphs will hide \n"
|
|
"inheritance and usage relations if the target is undocumented \n"
|
|
"or is not a class. \n",
|
|
TRUE
|
|
);
|
|
cb = addBool(
|
|
"HAVE_DOT",
|
|
"If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is \n"
|
|
"available from the path. This tool is part of Graphviz, a graph visualization \n"
|
|
"toolkit from AT&T and Lucent Bell Labs. The other options in this section \n"
|
|
"have no effect if this option is set to NO (the default) \n",
|
|
FALSE
|
|
);
|
|
cs = addString( "DOT_FONTNAME",
|
|
"By default doxygen will write a font called FreeSans.ttf to the output \n"
|
|
"directory and reference it in all dot files that doxygen generates. This \n"
|
|
"font does not include all possible unicode characters however, so when you need \n"
|
|
"these (or just want a differently looking font) you can specify the font name \n"
|
|
"using DOT_FONTNAME. You need need to make sure dot is able to find the font, \n"
|
|
"which can be done by putting it in a standard location or by setting the \n"
|
|
"DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory \n"
|
|
"containing the font. \n"
|
|
);
|
|
cs->setDefaultValue("FreeSans");
|
|
cb->addDependency("HAVE_DOT");
|
|
ci = addInt( "DOT_FONTSIZE",
|
|
"The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. \n"
|
|
"The default size is 10pt. \n",
|
|
4,24,10
|
|
);
|
|
ci->addDependency("HAVE_DOT");
|
|
cs = addString( "DOT_FONTPATH",
|
|
"By default doxygen will tell dot to use the output directory to look for the \n"
|
|
"FreeSans.ttf font (which doxygen will put there itself). If you specify a \n"
|
|
"different font using DOT_FONTNAME you can set the path where dot \n"
|
|
"can find it using this tag. \n"
|
|
);
|
|
cs->addDependency("HAVE_DOT");
|
|
cb = addBool(
|
|
"CLASS_GRAPH",
|
|
"If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen \n"
|
|
"will generate a graph for each documented class showing the direct and \n"
|
|
"indirect inheritance relations. Setting this tag to YES will force the \n"
|
|
"the CLASS_DIAGRAMS tag to NO.\n",
|
|
TRUE
|
|
);
|
|
cb->addDependency("HAVE_DOT");
|
|
cb = addBool(
|
|
"COLLABORATION_GRAPH",
|
|
"If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen \n"
|
|
"will generate a graph for each documented class showing the direct and \n"
|
|
"indirect implementation dependencies (inheritance, containment, and \n"
|
|
"class references variables) of the class with other documented classes. \n",
|
|
TRUE
|
|
);
|
|
cb->addDependency("HAVE_DOT");
|
|
cb = addBool(
|
|
"GROUP_GRAPHS",
|
|
"If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen \n"
|
|
"will generate a graph for groups, showing the direct groups dependencies\n",
|
|
TRUE
|
|
);
|
|
cb->addDependency("HAVE_DOT");
|
|
cb = addBool(
|
|
"UML_LOOK",
|
|
"If the UML_LOOK tag is set to YES doxygen will generate inheritance and \n"
|
|
"collaboration diagrams in a style similar to the OMG's Unified Modeling \n"
|
|
"Language. \n",
|
|
FALSE
|
|
);
|
|
cb->addDependency("HAVE_DOT");
|
|
cb = addBool(
|
|
"TEMPLATE_RELATIONS",
|
|
"If set to YES, the inheritance and collaboration graphs will show the \n"
|
|
"relations between templates and their instances. \n",
|
|
FALSE
|
|
);
|
|
cb->addDependency("HAVE_DOT");
|
|
cb = addBool(
|
|
"INCLUDE_GRAPH",
|
|
"If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT \n"
|
|
"tags are set to YES then doxygen will generate a graph for each documented \n"
|
|
"file showing the direct and indirect include dependencies of the file with \n"
|
|
"other documented files. \n",
|
|
TRUE
|
|
);
|
|
cb->addDependency("HAVE_DOT");
|
|
cb = addBool(
|
|
"INCLUDED_BY_GRAPH",
|
|
"If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and \n"
|
|
"HAVE_DOT tags are set to YES then doxygen will generate a graph for each \n"
|
|
"documented header file showing the documented files that directly or \n"
|
|
"indirectly include this file. \n",
|
|
TRUE
|
|
);
|
|
cb->addDependency("HAVE_DOT");
|
|
cb = addBool(
|
|
"CALL_GRAPH",
|
|
"If the CALL_GRAPH and HAVE_DOT options are set to YES then \n"
|
|
"doxygen will generate a call dependency graph for every global function \n"
|
|
"or class method. Note that enabling this option will significantly increase \n"
|
|
"the time of a run. So in most cases it will be better to enable call graphs \n"
|
|
"for selected functions only using the \\callgraph command.\n",
|
|
FALSE
|
|
);
|
|
cb->addDependency("HAVE_DOT");
|
|
cb = addBool(
|
|
"CALLER_GRAPH",
|
|
"If the CALLER_GRAPH and HAVE_DOT tags are set to YES then \n"
|
|
"doxygen will generate a caller dependency graph for every global function \n"
|
|
"or class method. Note that enabling this option will significantly increase \n"
|
|
"the time of a run. So in most cases it will be better to enable caller \n"
|
|
"graphs for selected functions only using the \\callergraph command.\n",
|
|
FALSE
|
|
);
|
|
cb->addDependency("HAVE_DOT");
|
|
cb = addBool(
|
|
"GRAPHICAL_HIERARCHY",
|
|
"If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen \n"
|
|
"will graphical hierarchy of all classes instead of a textual one. \n",
|
|
TRUE
|
|
);
|
|
cb->addDependency("HAVE_DOT");
|
|
cb = addBool(
|
|
"DIRECTORY_GRAPH",
|
|
"If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES \n"
|
|
"then doxygen will show the dependencies a directory has on other directories \n"
|
|
"in a graphical way. The dependency relations are determined by the #include\n"
|
|
"relations between the files in the directories.\n",
|
|
TRUE
|
|
);
|
|
cb->addDependency("HAVE_DOT");
|
|
ce = addEnum(
|
|
"DOT_IMAGE_FORMAT",
|
|
"The DOT_IMAGE_FORMAT tag can be used to set the image format of the images \n"
|
|
"generated by dot. Possible values are png, jpg, or gif\n"
|
|
"If left blank png will be used. \n",
|
|
"png"
|
|
);
|
|
ce->addValue("png");
|
|
ce->addValue("jpg");
|
|
ce->addValue("gif");
|
|
ce->addDependency("HAVE_DOT");
|
|
cs = addString(
|
|
"DOT_PATH",
|
|
"The tag DOT_PATH can be used to specify the path where the dot tool can be \n"
|
|
"found. If left blank, it is assumed the dot tool can be found in the path. \n"
|
|
);
|
|
cs->setWidgetType(ConfigString::Dir);
|
|
cs->addDependency("HAVE_DOT");
|
|
cl = addList(
|
|
"DOTFILE_DIRS",
|
|
"The DOTFILE_DIRS tag can be used to specify one or more directories that \n"
|
|
"contain dot files that are included in the documentation (see the \n"
|
|
"\\dotfile command). \n"
|
|
);
|
|
cl->setWidgetType(ConfigList::Dir);
|
|
cl->addDependency("HAVE_DOT");
|
|
ci = addInt(
|
|
"DOT_GRAPH_MAX_NODES",
|
|
"The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of \n"
|
|
"nodes that will be shown in the graph. If the number of nodes in a graph \n"
|
|
"becomes larger than this value, doxygen will truncate the graph, which is \n"
|
|
"visualized by representing a node as a red box. Note that doxygen if the \n"
|
|
"number of direct children of the root node in a graph is already larger than \n"
|
|
"DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note \n"
|
|
"that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. \n",
|
|
0,10000, 50
|
|
);
|
|
ci->addDependency("HAVE_DOT");
|
|
ci = addInt(
|
|
"MAX_DOT_GRAPH_DEPTH",
|
|
"The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the \n"
|
|
"graphs generated by dot. A depth value of 3 means that only nodes reachable \n"
|
|
"from the root by following a path via at most 3 edges will be shown. Nodes \n"
|
|
"that lay further from the root node will be omitted. Note that setting this \n"
|
|
"option to 1 or 2 may greatly reduce the computation time needed for large \n"
|
|
"code bases. Also note that the size of a graph can be further restricted by \n"
|
|
"DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.\n",
|
|
0,1000,0
|
|
);
|
|
ci->addDependency("HAVE_DOT");
|
|
addObsolete("MAX_DOT_GRAPH_WIDTH");
|
|
addObsolete("MAX_DOT_GRAPH_HEIGHT");
|
|
cb = addBool(
|
|
"DOT_TRANSPARENT",
|
|
"Set the DOT_TRANSPARENT tag to YES to generate images with a transparent \n"
|
|
"background. This is disabled by default, because dot on Windows does not \n"
|
|
"seem to support this out of the box. Warning: Depending on the platform used, \n"
|
|
"enabling this option may lead to badly anti-aliased labels on the edges of \n"
|
|
"a graph (i.e. they become hard to read). \n",
|
|
FALSE
|
|
);
|
|
cb->addDependency("HAVE_DOT");
|
|
cb = addBool(
|
|
"DOT_MULTI_TARGETS",
|
|
"Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output \n"
|
|
"files in one run (i.e. multiple -o and -T options on the command line). This \n"
|
|
"makes dot run faster, but since only newer versions of dot (>1.8.10) \n"
|
|
"support this, this feature is disabled by default. \n",
|
|
FALSE
|
|
);
|
|
cb->addDependency("HAVE_DOT");
|
|
cb = addBool(
|
|
"GENERATE_LEGEND",
|
|
"If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will \n"
|
|
"generate a legend page explaining the meaning of the various boxes and \n"
|
|
"arrows in the dot generated graphs. \n",
|
|
TRUE
|
|
);
|
|
cb->addDependency("HAVE_DOT");
|
|
cb = addBool(
|
|
"DOT_CLEANUP",
|
|
"If the DOT_CLEANUP tag is set to YES (the default) Doxygen will \n"
|
|
"remove the intermediate dot files that are used to generate \n"
|
|
"the various graphs. \n",
|
|
TRUE
|
|
);
|
|
cb->addDependency("HAVE_DOT");
|
|
|
|
//-----------------------------------------------------------------------------------------------
|
|
addInfo( "Search","Configuration::additions related to the search engine ");
|
|
//-----------------------------------------------------------------------------------------------
|
|
cb = addBool(
|
|
"SEARCHENGINE",
|
|
"The SEARCHENGINE tag specifies whether or not a search engine should be \n"
|
|
"used. If set to NO the values of all tags below this one will be ignored. \n",
|
|
FALSE
|
|
);
|
|
addObsolete("CGI_NAME");
|
|
addObsolete("CGI_URL");
|
|
addObsolete("DOC_URL");
|
|
addObsolete("DOC_ABSPATH");
|
|
addObsolete("BIN_ABSPATH");
|
|
addObsolete("EXT_DOC_PATHS");
|
|
|
|
// The IMAGE_PATTERNS tag is now officially obsolete.
|
|
}
|
|
|
|
static QCString configFileToString(const char *name)
|
|
{
|
|
if (name==0 || name[0]==0) return 0;
|
|
QFile f;
|
|
|
|
bool fileOpened=FALSE;
|
|
if (name[0]=='-' && name[1]==0) // read from stdin
|
|
{
|
|
fileOpened=f.open(IO_ReadOnly,stdin);
|
|
if (fileOpened)
|
|
{
|
|
const int bSize=4096;
|
|
QCString contents(bSize);
|
|
int totalSize=0;
|
|
int size;
|
|
while ((size=f.readBlock(contents.data()+totalSize,bSize))==bSize)
|
|
{
|
|
totalSize+=bSize;
|
|
contents.resize(totalSize+bSize);
|
|
}
|
|
totalSize+=size+2;
|
|
contents.resize(totalSize);
|
|
contents.at(totalSize-2)='\n'; // to help the scanner
|
|
contents.at(totalSize-1)='\0';
|
|
return contents;
|
|
}
|
|
}
|
|
else // read from file
|
|
{
|
|
QFileInfo fi(name);
|
|
if (!fi.exists() || !fi.isFile())
|
|
{
|
|
config_err("Error: file `%s' not found\n",name);
|
|
return "";
|
|
}
|
|
f.setName(name);
|
|
fileOpened=f.open(IO_ReadOnly);
|
|
if (fileOpened)
|
|
{
|
|
int fsize=f.size();
|
|
QCString contents(fsize+2);
|
|
f.readBlock(contents.data(),fsize);
|
|
f.close();
|
|
if (fsize==0 || contents[fsize-1]=='\n')
|
|
contents[fsize]='\0';
|
|
else
|
|
contents[fsize]='\n'; // to help the scanner
|
|
contents[fsize+1]='\0';
|
|
return contents;
|
|
}
|
|
}
|
|
if (!fileOpened)
|
|
{
|
|
config_err("Error: cannot open file `%s' for reading\n",name);
|
|
}
|
|
return "";
|
|
}
|
|
|
|
bool Config::parseString(const char *fn,const char *str)
|
|
{
|
|
config = Config::instance();
|
|
inputString = str;
|
|
inputPosition = 0;
|
|
yyFileName = fn;
|
|
yyLineNr = 1;
|
|
includeStack.setAutoDelete(TRUE);
|
|
includeStack.clear();
|
|
includeDepth = 0;
|
|
configYYrestart( configYYin );
|
|
BEGIN( Start );
|
|
configYYlex();
|
|
inputString = 0;
|
|
return TRUE;
|
|
}
|
|
|
|
bool Config::parse(const char *fn)
|
|
{
|
|
return parseString(fn,configFileToString(fn));
|
|
}
|
|
|
|
extern "C" { // some bogus code to keep the compiler happy
|
|
//int configYYwrap() { return 1 ; }
|
|
}
|
|
|