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

Last change on this file since 632 was 632, checked in by dai_9181, 15 years ago

ジェネリッククラスの型パラメータに値型が指定されたときに限り、テンプレート展開を行うようにした。

TODO: libファイルを跨ってテンプレート展開ができていないため、ソースコード管理部分に手を加える必要あり。

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