source: dev/trunk/ab5.0/abdev/ab_common/include/Lexical/Source.h@ 636

Last change on this file since 636 was 636, checked in by dai_9181, 16 years ago

libファイルを跨ったテンプレート展開に対応。

File size: 6.7 KB
Line 
1#pragma once
2
3class IncludedFilesRelation
4{
5 std::vector<std::string> filePaths;
6 std::vector<int> lineFileNumbers;
7
8 // XMLシリアライズ用
9private:
10 friend class boost::serialization::access;
11 template<class Archive> void serialize(Archive& ar, const unsigned int version)
12 {
13 ar & BOOST_SERIALIZATION_NVP( filePaths );
14 ar & BOOST_SERIALIZATION_NVP( lineFileNumbers );
15 }
16
17public:
18 IncludedFilesRelation()
19 {
20 }
21 ~IncludedFilesRelation()
22 {
23 }
24
25 const int GetFileNumber( int lineNumber ) const
26 {
27 return lineFileNumbers[lineNumber];
28 }
29 const std::string &GetFilePath( int lineNumber ) const
30 {
31 return filePaths[GetFileNumber( lineNumber )];
32 }
33 const std::string &GetFilePathFromFileNumber( int fileNumber ) const
34 {
35 return filePaths[fileNumber];
36 }
37 int GetFileCounts() const
38 {
39 return (int)filePaths.size();
40 }
41
42 int AddFile( const std::string &filePath )
43 {
44 filePaths.push_back( filePath );
45 return (int)filePaths.size()-1;
46 }
47 void AddLine( int fileNumber )
48 {
49 lineFileNumbers.push_back( fileNumber );
50 }
51
52 int GetLineCounts() const
53 {
54 return (int)lineFileNumbers.size();
55 }
56};
57
58class Text{
59protected:
60 char *buffer;
61 int length;
62
63public:
64
65 Text(){
66 buffer = (char *)calloc( 1, 1 );
67 length = 0;
68 }
69 Text( const Text &text )
70 : length( text.length )
71 {
72 buffer = (char *)malloc( length + 1 );
73 memcpy( buffer, text.buffer, length );
74 buffer[length] = 0;
75 }
76 ~Text(){
77 free( buffer );
78 }
79 void Clear()
80 {
81 length = 0;
82 }
83 void Add( const std::string &str )
84 {
85 buffer = (char *)realloc( buffer, length + str.size() + 1 );
86 lstrcpy( buffer + length, str.c_str() );
87 length += (int)str.size();
88 }
89 void Add( const std::vector<char> &str )
90 {
91 buffer = (char *)realloc( buffer, length + str.size() + 1 );
92 lstrcpy( buffer + length, &str[0] );
93 length += (int)str.size();
94 }
95
96 bool ReadFile( const std::string &filePath );
97
98 static void Text::SlideString(char *buffer, int slide){
99 char *temp;
100 temp=(char *)malloc(lstrlen(buffer)+1);
101 lstrcpy(temp,buffer);
102 lstrcpy(buffer+slide,temp);
103 free(temp);
104 }
105};
106
107class BasicSource : public Text
108{
109 static const std::string generateDirectiveName;
110
111 IncludedFilesRelation includedFilesRelation;
112
113 // XMLシリアライズ用
114private:
115 friend class boost::serialization::access;
116 BOOST_SERIALIZATION_SPLIT_MEMBER();
117 template<class Archive> void load(Archive& ar, const unsigned int version)
118 {
119 std::string _buffer;
120 ar & BOOST_SERIALIZATION_NVP( _buffer );
121 ar & BOOST_SERIALIZATION_NVP( length );
122 ar & BOOST_SERIALIZATION_NVP( includedFilesRelation );
123
124 // 読み込み後の処理
125 Realloc( length );
126 for( int i=0; i<length; i++ )
127 {
128 ULONG_PTR l1 = ( ( _buffer[i*3] >= 'a' ) ? ( _buffer[i*3] - 'a' + 0x0a ) : ( _buffer[i*3] - '0' ) ) * 0x10;
129 ULONG_PTR l2 = ( _buffer[i*3+1] >= 'a' ) ? ( _buffer[i*3+1] - 'a' + 0x0a ) : ( _buffer[i*3+1] - '0' );
130 ULONG_PTR l = l1 + l2;
131 buffer[i] = static_cast<char>(l);
132 }
133 buffer[length] = 0;
134 }
135 template<class Archive> void save(Archive& ar, const unsigned int version) const
136 {
137 // 保存準備
138 char *tempCode = (char *)calloc( (length+1) * 3, 1 );
139 for( int i=0; i<length; i++ )
140 {
141 char temp[32];
142 sprintf( temp, "%02x,", (unsigned char)buffer[i] );
143 tempCode[i*3] = temp[0];
144 tempCode[i*3+1] = temp[1];
145 tempCode[i*3+2] = temp[2];
146 }
147
148 std::string _buffer = tempCode;
149 free( tempCode );
150
151 ar & BOOST_SERIALIZATION_NVP( _buffer );
152 ar & BOOST_SERIALIZATION_NVP( length );
153 ar & BOOST_SERIALIZATION_NVP( includedFilesRelation );
154 }
155
156private:
157 void Realloc( int newLength )
158 {
159 bool isEqualBasbuf = false;
160 extern char *basbuf;
161 if( basbuf == buffer + 2 )
162 {
163 isEqualBasbuf = true;
164 }
165
166 buffer = (char *)realloc( buffer, newLength + 255 );
167
168 length = newLength;
169
170 if( isEqualBasbuf )
171 {
172 basbuf = buffer + 2;
173 }
174 }
175
176 void IncludeFiles();
177
178 void ChangeReturnLineChar();
179
180 void RemoveComments();
181
182 bool ReadFile_InIncludeDirective( const std::string &filePath );
183 void DirectiveIncludeOrRequire( const std::string &mainSourceFilePath, const std::string &includeDirPath );
184
185 void RemoveReturnLineUnderbar();
186
187 void Initialize( const std::string &source );
188
189public:
190 BasicSource(){}
191 BasicSource( const BasicSource &basicSource )
192 : Text( basicSource )
193 , includedFilesRelation( basicSource.includedFilesRelation )
194 {
195 }
196 BasicSource( const std::string &source )
197 {
198 Initialize( source );
199 }
200 ~BasicSource(){}
201
202 char *GetBuffer(){
203 return buffer+2;
204 }
205 const char *GetBuffer() const
206 {
207 return buffer+2;
208 }
209 int GetLength() const
210 {
211 return length-2;
212 }
213 void _ResetLength()
214 {
215 length = lstrlen( buffer );
216 }
217
218 const IncludedFilesRelation &GetIncludedFilesRelation() const
219 {
220 return includedFilesRelation;
221 }
222
223 void SetBuffer( const char *buffer );
224
225 bool ReadFile( const std::string &filePath, bool isDebug, bool isDll, bool isUnicode, int majorVer, const std::string &mainSourceFilePath, const std::string &includeDirPath );
226
227 void Addition( const char *buffer );
228
229 bool GetLineInfo( int sourceCodePos, int &line, std::string &fileName ) const;
230
231 void operator = ( const BasicSource &source ){
232 Realloc( source.length );
233 lstrcpy( buffer, source.buffer );
234 }
235
236 char operator[]( int index ) const
237 {
238 if( index>GetLength() )
239 {
240 Jenga::Throw( "BasicSource bad access" );
241 }
242 return buffer[2+index];
243 }
244
245 std::string cannotIncludePath;
246 int cannotIncludeSourcePos;
247};
248class BasicSources
249 : public std::vector<BasicSource>
250 , public Jenga::Common::BoostSerializationSupport<BasicSources>
251{
252 // XMLシリアライズ用
253private:
254 virtual const char *RootTagName() const
255 {
256 return "basicSources";
257 }
258 friend class boost::serialization::access;
259 template<class Archive> void serialize(Archive& ar, const unsigned int version)
260 {
261 ar & boost::serialization::make_nvp("vector_BasicSource", boost::serialization::base_object<std::vector<BasicSource>>(*this));
262 }
263};
264
265class SourceCodePosition
266{
267 std::string objectModuleName;
268 int pos;
269
270 // XMLシリアライズ用
271private:
272 friend class boost::serialization::access;
273 template<class Archive> void serialize(Archive& ar, const unsigned int version)
274 {
275 trace_for_serialize( "serializing - IncludedFilesRelation" );
276
277 ar & BOOST_SERIALIZATION_NVP( objectModuleName );
278 ar & BOOST_SERIALIZATION_NVP( pos );
279 }
280
281public:
282 SourceCodePosition( const std::string &objectModuleName, int pos )
283 : objectModuleName( objectModuleName )
284 , pos( pos )
285 {
286 }
287 SourceCodePosition()
288 : pos( -1 )
289 {
290 }
291
292 const std::string &GetObjectModuleName() const
293 {
294 return objectModuleName;
295 }
296 int GetPos() const
297 {
298 return pos;
299 }
300};
Note: See TracBrowser for help on using the repository browser.