source: dev/trunk/abdev/BasicCompiler_Common/BreakPoint.cpp@ 279

Last change on this file since 279 was 279, checked in by dai_9181, 17 years ago

sourceをObjectModuleに入れた

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