source: dev/trunk/ab5.0/abdev/BasicCompiler_Common/BreakPoint.cpp@ 637

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

リンカの依存関係解決モジュールを製作中

File size: 4.7 KB
Line 
1#include "stdafx.h"
2
3//////////////////////////
4// ブレークポイント
5//////////////////////////
6
7CDBBreakPoint *pobj_DBBreakPoint;
8
9CFileBreakPoint::CFileBreakPoint(char *lpszFileName,int iLineNum){
10 this->lpszFileName=(char *)HeapAlloc(hHeap,0,lstrlen(lpszFileName)+1);
11 lstrcpy(this->lpszFileName,lpszFileName);
12
13 piLine=(int *)HeapAlloc(hHeap,0,sizeof(int));
14 piLine[0]=iLineNum;
15 num=1;
16}
17CFileBreakPoint::~CFileBreakPoint(){
18 HeapDefaultFree(lpszFileName);
19 HeapDefaultFree(piLine);
20}
21void CFileBreakPoint::add(int iLineNum){
22 piLine=(int *)HeapReAlloc(hHeap,0,piLine,(num+1)*sizeof(int));
23 piLine[num]=iLineNum;
24 num++;
25}
26void CFileBreakPoint::remove(int iLineNum){
27 int i;
28 for(i=0;i<num;i++){
29 if(iLineNum==piLine[i]) break;
30 }
31 if(i==num) return;
32
33 num--;
34 for(;i<num;i++){
35 piLine[i]=piLine[i+1];
36 }
37}
38
39void CFileBreakPoint::update(char *nativeCodeBuffer)
40{
41 int FileNum;
42 const IncludedFilesRelation *pIncludedFilesRelation = NULL;
43 const BasicSource *pNowSource = NULL;
44 BOOST_FOREACH( const ObjectModule *pObjectModule, compiler.staticLibraries )
45 {
46 const BasicSource *pSource = &pObjectModule->GetSource();
47
48 pIncludedFilesRelation = &pSource->GetIncludedFilesRelation();
49
50 for(FileNum=0;FileNum<pIncludedFilesRelation->GetFileCounts();FileNum++)
51 {
52 if(lstrcmpi(pIncludedFilesRelation->GetFilePathFromFileNumber(FileNum).c_str(),lpszFileName)==0)
53 {
54 pNowSource = pSource;
55 break;
56 }
57 }
58 if( FileNum == pIncludedFilesRelation->GetFileCounts() )
59 {
60 pIncludedFilesRelation = NULL;
61 }
62 else
63 {
64 break;
65 }
66 }
67
68 if( !pIncludedFilesRelation )
69 {
70 Jenga::Throw( "CFileBreakPoint::update内で不正な処理" );
71 return;
72 }
73
74 int i;
75 for(i=0;;i++){
76 if( pIncludedFilesRelation->GetFileNumber( i ) == FileNum
77 || pIncludedFilesRelation->GetFileNumber( i ) == -1 )
78 {
79 break;
80 }
81 }
82 if( pIncludedFilesRelation->GetFileNumber( i ) == -1 )
83 {
84 return;
85 }
86
87 int FileBaseLine;
88 FileBaseLine=i;
89
90 int i2,nCount=0;
91 for(i2=0;;i2++){
92 if( pIncludedFilesRelation->GetFileNumber( FileBaseLine+i2 ) == -1 )
93 {
94 //ソースコードの終端行
95 break;
96 }
97
98 if(i2==piLine[nCount]){
99 extern SourceLines oldSourceLines;
100
101loop:
102 int tempCp = GetSourceCodeIndexFromLine( pNowSource->GetBuffer(), FileBaseLine+i2 );
103
104 int i3;
105 for(i3=0;i3<(int)oldSourceLines.size()-1;i3++){
106 if(oldSourceLines[i3].GetSourceCodePosition().GetPos()==tempCp) break;
107 }
108 if(i3==oldSourceLines.size()-1){
109 i2--;
110 goto loop;
111 }
112
113 nativeCodeBuffer[oldSourceLines[i3].GetNativeCodePos()]=(char)0xCC;
114
115 nCount++;
116 if(nCount>=num) break;
117 }
118 }
119}
120
121
122CDBBreakPoint::CDBBreakPoint(){
123 ppItem=(CFileBreakPoint **)HeapAlloc(hHeap,0,1);
124 num=0;
125
126 char *buffer;
127 buffer=(char *)HeapAlloc(hHeap,0,65535);
128
129 HANDLE hFile=CreateFile(
130 ( Jenga::Common::Environment::GetAppDir() + "\\ab_breakpoint.tmp" ).c_str(),
131 GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
132 if(hFile!=INVALID_HANDLE_VALUE){
133 DWORD dwAccBytes;
134 ReadFile(hFile,buffer,MAX_PATH,&dwAccBytes,NULL);
135 CloseHandle(hFile);
136 buffer[dwAccBytes]=0;
137 }
138 else buffer[0]=0;
139
140 int i=0,i2;
141 char szFilePath[MAX_PATH];
142 while(buffer[i]){
143 //ファイルパス
144 i=GetOneParameter(buffer,i,szFilePath);
145 RemoveStringQuotes(szFilePath);
146
147 while(buffer[i]!='\n'&&buffer[i]!='\0'){
148 //行番号
149 char temporary[1024];
150 i=GetOneParameter(buffer,i,temporary);
151 i2=atoi(temporary);
152
153 insert(szFilePath,i2);
154 }
155
156 while(buffer[i]=='\n') i++;
157
158 if(buffer[i]=='\0') break;
159 }
160
161 HeapDefaultFree(buffer);
162}
163CDBBreakPoint::~CDBBreakPoint(){
164 int i;
165 for(i=0;i<num;i++){
166 delete ppItem[i];
167 }
168 HeapDefaultFree(ppItem);
169}
170void CDBBreakPoint::insert(char *lpszFileName,int iLineNum){
171 int i;
172 for(i=0;i<num;i++){
173 if(lstrcmpi(ppItem[i]->lpszFileName,lpszFileName)==0){
174 ppItem[i]->add(iLineNum);
175 return;
176 }
177 }
178
179 if(i==num){
180 ppItem=(CFileBreakPoint **)HeapReAlloc(hHeap,0,ppItem,(num+1)*sizeof(CFileBreakPoint *));
181 ppItem[num]=new CFileBreakPoint(lpszFileName,iLineNum);
182 num++;
183 }
184}
185void CDBBreakPoint::remove(char *lpszFileName,int iLineNum){
186 int i;
187 for(i=0;i<num;i++){
188 if(lstrcmpi(lpszFileName,ppItem[i]->lpszFileName)==0){
189 ppItem[i]->remove(iLineNum);
190 break;
191 }
192 }
193 if(i==num) return;
194
195 if(ppItem[i]->num==0){
196 delete ppItem[i];
197
198 num--;
199 for(;i<num;i++){
200 ppItem[i]=ppItem[i+1];
201 }
202 }
203}
204
205char *CDBBreakPoint::update(char *nativeCodeBuffer,int SizeOf_CodeSection){
206 char *buffer;
207 buffer=(char *)HeapAlloc(hHeap,0,SizeOf_CodeSection);
208 memcpy(buffer,nativeCodeBuffer,SizeOf_CodeSection);
209
210 int i;
211 for(i=0;i<num;i++){
212 ppItem[i]->update(buffer);
213 }
214
215 return buffer;
216}
Note: See TracBrowser for help on using the repository browser.