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

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

ObjectModuleに関連するクラス一式をab_commonプロジェクトに移動した。

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