00001 #ifndef init_h
00002 #define init_h
00003
00004 #include "tag.h"
00005
00007 class Init : private Tag
00008 {
00009 public:
00010 enum Type
00011 {
00012 INITOPEN,
00013 INITCLOSE,
00014 INCLUDE,
00015 MACROS,
00016 MENU,
00017 IMAGE,
00018 FILELINK,
00019 FILELIST,
00020 INTERPRETER,
00021 FUNCTIONS,
00022 LOCALE,
00023 CHARSET,
00024 DELETE,
00025 DEFINE,
00026 USER
00027 };
00028
00029 struct Range
00030 {
00031 enum Type
00032 {
00033 FROM_TO,
00034 LEVEL
00035 };
00036
00037 Type type;
00038
00039 int lower;
00040 int upper;
00041 int level;
00042
00043 Range( int lower, int upper ) : type( FROM_TO ), lower( lower ), upper( upper ) {}
00044 Range( int level ) : type( LEVEL), level( level ) {}
00045 Range() {}
00046
00047 bool in_range( int n );
00048 };
00049
00050 typedef std::list<Range> range_list;
00051 typedef range_list::iterator range_list_it;
00052
00053 private:
00054 Type type;
00055
00056 mutable range_list ral;
00057
00058 std::string user_name;
00059
00063 bool insert;
00064 bool append;
00065 bool del;
00066
00067 bool ignore;
00068
00069 public:
00070 Init( Line line );
00071
00072 bool operator!() const { return !Tag::is_valid_tag; }
00073
00074 Type get_type() const { return type; }
00075
00076 bool has_range() const { return !ral.empty(); }
00077
00078 bool has_one_range() const { return get_elements( ral ) == 1; }
00079
00080 Range get_first() const { return *ral.begin(); }
00081
00082 range_list get_range() const { return ral; }
00083
00084
00086
00087
00088
00090 Line get_line() { return Tag::get_line(); }
00091
00092 std::string get_user_name() const { return user_name; }
00093
00094 bool is_insert() const { return insert; }
00095
00096 bool is_append() const { return append; }
00097
00098 bool is_delete() const { return del; }
00099
00100 bool is_ignore() const { return ignore; }
00101
00102 bool is_ignore( bool t ) { ignore = t; set_option("ignore", t ); }
00103
00104 std::string get_tag();
00105
00106 private:
00107 void extract_range( const std::string& level );
00108 void strip_list( Strings::string_list& sl );
00109
00110 #if __GNUC__ == 2
00111
00112
00113 int get_elements( Strings::string_list& sl ) const
00114 {
00115 if( sl.empty() )
00116 return 0;
00117
00118 int i = 0;
00119 for( Strings::string_list_it it = sl.begin(); it != sl.end(); ++it )
00120 ++i;
00121
00122 return i;
00123 }
00124
00125 int get_elements( range_list& sl ) const
00126 {
00127 if( sl.empty() )
00128 return 0;
00129
00130 int i = 0;
00131 for( range_list_it it = sl.begin(); it != sl.end(); ++it )
00132 ++i;
00133
00134 return i;
00135 }
00136
00137 #else
00138
00139 template <class A> int get_elements( std::list<A>& sl ) const
00140 {
00141 if( sl.empty() )
00142 return 0;
00143
00144 int i = 0;
00145 for( std::list<A>::iterator it = sl.begin(); it != sl.end(); ++it )
00146 ++i;
00147
00148 return i;
00149 }
00150
00151 #endif
00152
00153 };
00154
00155 std::string get_init_name( const Init::Type type );
00156
00157 struct InitTableEntry
00158 {
00159 Init::Type type;
00160 bool was_detected;
00161 Init::range_list ranges;
00162 bool has_range;
00163 bool has_one_range;
00164 std::string user_name;
00165
00166 InitTableEntry( Init::Type t, bool wd = false )
00167 : type( t ),
00168 was_detected( wd ),
00169 has_range( false ),
00170 has_one_range( false ),
00171 user_name( get_init_name( t ) )
00172 {
00173
00174 }
00175
00176 InitTableEntry( Init::Type t, bool wd, const Init::range_list& rl, bool hr, bool hor )
00177 : type( t ),
00178 was_detected( wd ),
00179 ranges( rl ),
00180 has_range( hr ),
00181 has_one_range( hor ),
00182 user_name( get_init_name( t ) )
00183 {}
00184 };
00185
00186 inline bool operator==( const Init::Range& range, Init::Range::Type type )
00187 {
00188 return range.type == type;
00189 }
00190
00191 Init::Type get_init_type( const std::string type );
00192
00193 std::string get_init_name( const Init::Type type );
00194
00195 #endif