source: dev/BasicCompiler_Common/common.h@ 50

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

オーバーロード解決用の関数保持リストを "SUBINFO " ではなく、"vector<SUBINFO *>" に変更した。

File size: 15.2 KB
Line 
1//#define _CRT_SECURE_NO_DEPRECATE
2#pragma warning(disable : 4996)
3
4#include <windows.h>
5#include <stdio.h>
6#include <string.h>
7#include <math.h>
8#include <commctrl.h>
9#include <time.h>
10#include <limits.h>
11#include <shlobj.h>
12#include <vector>
13
14//boost libraries
15#include <boost/foreach.hpp>
16
17#define foreach BOOST_FOREACH
18
19#ifdef _AMD64_
20#include "../BasicCompiler64/resource.h"
21#include "../BasicCompiler64/CommandValue.h"
22#include "../BasicCompiler64/FunctionValue.h"
23#define OPCODE_H_PATH "../BasicCompiler64/opcode.h"
24#else
25#include "../BasicCompiler32/resource.h"
26#include "../BasicCompiler32/CommandValue.h"
27#include "../BasicCompiler32/FunctionValue.h"
28#define OPCODE_H_PATH "../BasicCompiler32/opcode.h"
29#endif
30
31#include "../BasicCompiler_Common/BasicFixed.h"
32#include "../BasicCompiler_Common/NonVolatile.h"
33#include "../BasicCompiler_Common/TypeDef.h"
34#include "../BasicCompiler_Common/psapi.h"
35#include "../BasicCompiler_Common/BreakPoint.h"
36
37
38
39//バージョン
40#define MAJOR_VER 5
41#define MINOR_VER 00
42#define REVISION_VER 00
43
44#ifdef _AMD64_
45#define VER_INFO "β11 (x64)"
46#else
47#define VER_INFO "β11"
48#endif
49
50#if defined(JPN)
51//日本語
52#include "common_msg_jpn.h"
53#else
54//英語
55#include "common_msg_eng.h"
56#endif
57
58
59#pragma comment(lib, "psapi.lib")
60
61
62#define PTR_SIZE sizeof(LONG_PTR)
63
64#define MAX_LEN 65535
65#define VN_SIZE 512
66#define DIGIT_SIZE 128
67#define MAX_PARMS 64
68#define MAX_ARRAYDIM 16
69#define MAX_HASH 32761
70
71
72#ifdef _AMD64_
73#define PLATFORM 64
74#else
75#define PLATFORM 32
76typedef long LONG_PTR;
77typedef DWORD ULONG_PTR;
78#endif
79
80
81//未定義の定数情報
82#define IMAGE_FILE_MACHINE_AMD64 0x8664
83
84
85
86extern HWND hOwnerEditor;
87extern HANDLE hHeap;
88extern char BasicSystemDir[MAX_PATH];
89extern int cp;
90
91
92
93//////////////////////////////////////////
94// BasicCompiler、ProjectEditor共通の定数
95//////////////////////////////////////////
96
97//サイズ変更枠の太さ
98#define LEVER_THICK 5
99
100#define WM_SHOWERROR WM_USER+70 //エラー表示メッセージ
101
102#define WM_SETCOMPILEVIEW WM_USER+71 //コンパイラウィンドウが表示されたとき
103#define WM_DESTROYCOMPILEVIEW WM_USER+72 //コンパイラウィンドウが破棄されたとき
104
105#define WM_SETDEBUGGERBASE WM_USER+73 //デバッガベースウィンドウが表示されたとき
106#define WM_DESTROYDEBUGGERBASE WM_USER+74 //デバッガベースウィンドウが破棄されたとき
107
108#define WM_SETDEBUGGERVIEW WM_USER+75 //デバッガウィンドウが表示されたとき
109#define WM_DESTROYDEBUGGERVIEW WM_USER+76 //デバッガウィンドウが表示されたとき
110
111///////////////////////////////////////////
112
113
114#define WM_SHOWVARLIST WM_USER+80
115#define WM_VARLIST_CLOSE WM_USER+81 //変数リストの終了メッセージ(破棄のみ、解放なし)
116
117
118
119///////////////////////////////////////////
120// デバッグ コマンド
121
122#define WM_DEBUG_CONTINUE WM_USER+200
123#define WM_STEP_IN WM_USER+201
124#define WM_STEP_OVER WM_USER+202
125#define WM_STEP_CURSOR WM_USER+203
126#define WM_DEBUG_STOP WM_USER+204
127#define WM_DEBUG_PAUSE WM_USER+205
128#define WM_CLOSE_DEBUGGER WM_USER+206
129
130///////////////////////////////////////////
131
132
133
134
135#define FILE_ALIGNMENT 0x1000
136#define MEM_ALIGNMENT 0x1000
137#define EXE_HEADER_SIZE 0x1000
138
139
140//クラス管理用のクラス
141#include "Class.h"
142
143//列挙体管理用のクラス
144#include "Enum.h"
145
146//定数管理用のクラス
147#include "Const.h"
148
149
150struct ERRORINFO{
151 char *FileName;
152 int line;
153};
154struct INCLUDEFILEINFO{
155 char **ppFileNames;
156 int FilesNum;
157 int LineOfFile[MAX_LEN];
158};
159
160
161//変数
162#define REF_PARAMETER 1
163#define OBJECT_PARAMETER 2
164#define REF_VARIABLE 4
165struct VARIABLE{
166 char name[255];
167 int type;
168 union{
169 LONG_PTR index;
170 CClass *pobj_c;
171 }u;
172
173 DWORD fRef;
174
175 //定数変数かどうか
176 bool bConst;
177
178 BOOL bArray;
179 int SubScripts[MAX_ARRAYDIM];
180
181 //コンストラクタ用パラメータ
182 char *ConstractParameter;
183
184 /* --- オフセット ---
185
186 ※グローバル変数で初期バッファがない場合は最上位ビットに1がセットされ、
187 初期バッファの有無が識別される。
188 (その後、スケジュール実行により、実際の配置に並び替えられる)*/
189 int offset;
190
191
192 //レキシカルスコープ用
193 int ScopeStartAddress;
194 int ScopeEndAddress;
195 int ScopeLevel;
196 BOOL bLiving;
197
198
199 int source_code_address;
200};
201
202//変数の相対情報
203struct RELATIVE_VAR{
204 DWORD dwKind;
205 LONG_PTR offset;
206 BOOL bOffsetOffset;
207};
208
209//パラメータ
210struct PARAMETER_INFO{
211 char *name;
212 int type;
213 union{
214 LONG_PTR index;
215 CClass *pobj_c;
216 }u;
217
218 BOOL bByVal;
219 BOOL bArray;
220 int SubScripts[MAX_ARRAYDIM];
221};
222
223#define SUBTYPE_SUB 1
224#define SUBTYPE_FUNCTION 2
225#define SUBTYPE_MACRO 3
226struct SUBINFO{
227 DWORD dwType;
228
229 //クラス情報
230 CClass *pobj_ParentClass;
231
232 long id;
233
234 char *name;
235 long address;
236
237 //パラメータ
238 PARAMETER_INFO *pParmInfo;
239 int ParmNum;
240 int SecondParmNum;
241 PARAMETER_INFO *pRealParmInfo;
242 int RealParmNum;
243 int RealSecondParmNum;
244
245 //戻り値
246 int ReturnType;
247 union{
248 LONG_PTR ReturnIndex;
249 CClass *Return_pobj_c;
250 }u;
251 bool isReturnRef;
252
253 DWORD CompileAddress;
254 DWORD EndOpAddr;
255 VARIABLE *pVar;
256 int VarNum;
257
258 BOOL bExport;
259 BOOL bCdecl;
260 BOOL bVirtual;
261 BOOL bUse;
262 BOOL bCompile;
263 BOOL bSystem;
264
265 SUBINFO *pNextData;
266};
267#define DECLARE_DYNAMIC 1
268#define DECLARE_STATIC 2
269struct DECLAREINFO{
270 DWORD dwType;
271
272 char *file;
273 char *name;
274 char *alias;
275 BOOL bCdecl;
276
277 //パラメータ
278 PARAMETER_INFO *pParmInfo;
279 int ParmNum;
280
281 //戻り値
282 int ReturnType;
283 union{
284 LONG_PTR ReturnIndex;
285 CClass *Return_pobj_c;
286 }u;
287
288 union{
289 int LookupAddress;
290 int StaticProc_CodeAddress;
291 };
292
293 BOOL bUse;
294
295 int pos;
296
297 DECLAREINFO *pNextData;
298};
299struct PROCPTRINFO{
300 PARAMETER_INFO *pParmInfo;
301 int ParmNum;
302
303 int ReturnType;
304 union{
305 LONG_PTR ReturnIndex;
306 CClass *Return_pobj_c;
307 }u;
308};
309struct CONSTINFO{
310 char *name;
311 char *StrValue;
312
313 double DblValue;
314 _int64 i64Value;
315 int type;
316 LONG_PTR lpIndex;
317
318 int ParmNum;
319 char **ppParm;
320
321 CONSTINFO *pNextData;
322};
323
324
325#define CODETYPE_SYSTEMPROC 0x0001
326#define CODETYPE_DEBUGPROC 0x0002
327struct LINEINFO{
328 int TopCp;
329 int TopObp;
330 DWORD dwCodeType;
331};
332struct RESOURCEDATAINFO{
333 DWORD dwId;
334 char FileName[MAX_PATH];
335};
336
337
338//////////////////////////////////////////
339// リソース ヘッダ(アイコン、カーソル用)
340typedef struct{
341 WORD idReserved;
342 WORD idType;
343 WORD idCount;
344}ICONDIR,CURSORDIR;
345
346
347/////////////////////////////
348// .curファイルのヘッダ情報
349struct CURSORDIRENTRY{
350 BYTE bWidth;
351 BYTE bHeight;
352 BYTE bColorCount;
353 BYTE bReserved;
354 WORD wXHotspot;
355 WORD wYHotspot;
356 DWORD dwBytesInRes;
357 DWORD dwImageOffset;
358};
359struct CURSORDIRENTRY_RES{
360 WORD wWidth;
361 WORD wHeight;
362 WORD wXHotspot;
363 WORD wYHotspot;
364 DWORD dwBytesInRes;
365 WORD wCursorNum;
366};
367
368
369////////////////////////////
370//.icoファイルのヘッダ情報
371struct ICONDIRENTRY{
372 BYTE bWidth;
373 BYTE bHeight;
374 BYTE bColorCount;
375 BYTE bReserved;
376 WORD wPlanes;
377 WORD wBitCount;
378 DWORD dwBytesInRes;
379 DWORD dwImageOffset;
380};
381struct ICONDIRENTRY_RES{
382 BYTE bWidth;
383 BYTE bHeight;
384 BYTE bColorCount;
385 BYTE bReserved;
386 WORD wPlanes;
387 WORD wBitCount;
388 DWORD dwBytesInRes;
389 WORD wIconNum;
390};
391
392
393
394#include "../BasicCompiler_Common/PESchedule.h"
395#include "../BasicCompiler_Common/DebugSection.h"
396#include "../BasicCompiler_Common/LexicalScoping.h"
397#include "../BasicCompiler_Common/Variable.h"
398#include "../BasicCompiler_Common/Exception.h"
399
400
401
402int StaticCalculation(bool enableerror, const char *Command,int BaseType,_int64 *pi64data,LONG_PTR *plpIndex,BOOL bDebuggingWatchList=0);
403
404
405//BasicCompiler.cpp
406void HeapDefaultFree(LPVOID lpMem);
407void ts(int i);
408void ts(int i,int i2);
409void ts(char *msg);
410void ts(char *msg,char *title);
411void epi_check();
412void GetRelationalPath(char *path,char *dir);
413void GetFullPath(char *path,char *dir);
414void ShowErrorLine(int LineNum,char *FileName);
415BOOL GetFilePathDialog(HWND hwnd,char *filename,LPSTR Filter,LPSTR Title,BOOL bOpen);
416void MakeMessageText(char *buffer,char *msg,int flag);
417
418//hash.cpp
419int hash_default(char *name);
420CONSTINFO *GetConstHash(char *name);
421DECLAREINFO *GetDeclareHash(char *name);
422SUBINFO *GetSubHash(const char *name,BOOL bError=0);
423SUBINFO *GetMethodHash(char *ObjectName,char *MethodName,char *Parameter,BOOL bError=0);
424void GetOverloadSubHash( const char *lpszName, std::vector<SUBINFO *> &subs );
425
426//Object.cpp
427int GetSizeOfClassMember(CClass *pobj_c,char *pMemberName,int *pMemberNum);
428int GetSizeOfClass(CClass *pobj_c);
429void AddClassName(char *Parameter,int NowLine);
430void CallConstructor(char *VarName,int *SubScripts,TYPEINFO &TypeInfo,char *Parameter);
431
432//Overload.sbp
433SUBINFO *OverloadSolutionWithStrParam(
434 const char *name,
435 std::vector<SUBINFO *> &subs,
436 const char *Parameter,
437 const char *ObjectName,
438 TYPEINFO *pReturnTypeInfo);
439SUBINFO *OverloadSolution(
440 const char *name,
441 std::vector<SUBINFO *> &subs,
442 const PARAMETER_INFO *ppi,
443 const int ParmNum,
444 TYPEINFO *pReturnTypeInfo);
445
446//Debug.cpp
447void Debugger_StepIn(void);
448void Debugger_StepOver(void);
449void Debugger_StepCursor(void);
450void Debugger_Stop(void);
451void Debugger_Pause(void);
452ULONG_PTR rva_to_real(DWORD p);
453SUBINFO *GetSubFromObp(ULONG_PTR pos);
454void ReadOpBuffer();
455void DebugProgram(void);
456
457//VarList.cpp
458void InitVarList(DWORD dwThreadId);
459BOOL CALLBACK DlgDebugger(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
460BOOL CALLBACK DlgVarList(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
461
462//WatchList.cpp
463ULONG_PTR Debugging_GetVarPtr(RELATIVE_VAR *pRelativeVar);
464ULONG_PTR Debugging_GetThisPtrOffset(LONG_PTR obp_Rip);
465int Debugging_GetVarOffset(char *variable,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss);
466
467//MakeExe.cpp
468void StepCompileProgress(void);
469void DeleteConstInfo(CONSTINFO **ppConstHash);
470void DeleteDeclareInfo(void);
471void AddSourceCode(char *buffer);
472void OutputExe(void);
473int MainThread(DWORD dummy);
474
475//Intermediate_Step1.cpp
476void ChangeReturnCode(char *buffer);
477void DeleteComment(char *buffer);
478void KillReturnCode(char *buffer);
479void CheckParenthesis(char *buffer);
480BOOL CheckParenthesis2(char *buffer);
481void DirectiveCheck(void);
482void NextCommandFormat(char *buffer);
483void SetEscapeSequenceFormat(char *buffer);
484void DefCommandFormat(char *buffer);
485void IfCommandFormat(char *buffer);
486void CheckPareCommand(void);
487
488//Intermediate_Step2.cpp
489bool GetConstInfo(void);
490void ChangeCommandToCode(char *buffer);
491
492//preprocessor.cpp
493char *OpenBasicFile(char *FileName);
494
495//Resource.cpp
496void GetResourceData(char *FileName);
497
498//CommandFormat.cpp
499void ComOpen(char *Parameter,char *buffer,int NowLine);
500void ComClose(char *Parameter,char *buffer);
501void ComField(char *Parameter,char *buffer);
502void ComLine(char *Parameter,char *buffer,int NowLine);
503void ComCircle(char *Parameter,char *buffer,int NowLine);
504void ComPSet(char *Parameter,char *buffer,int NowLine);
505void ComPaint(char *Parameter,char *buffer,int NowLine);
506
507// StrOperation.cpp
508void KillSpaces(char *str1,char *str2);
509void KillStringSpaces(char *str);
510BOOL RemoveStringQuotes(char *str);
511void RemoveStringPare(char *str);
512void RemoveStringBracket(char *str);
513void SetStringQuotes(char *str);
514int FormatString_EscapeSequence(char *buffer);
515void SlideString(char *str,int slide);
516void SlideBuffer(char *buffer,int length,int slide);
517_int8 IsCommandDelimitation(char c);
518BOOL IsBlank(char c);
519int GetOneParameter(char *Parameter,int pos,char *retAns);
520int JumpOneParameter(char *Parameter,int i);
521int GetStringInQuotation(char *buffer,char *ReadBuffer);
522int GetStringInPare(char *buffer,const char *ReadBuffer);
523int GetStringInPare_RemovePare(char *buffer,char *ReadBuffer);
524int GetStringInBracket(char *buffer,const char *ReadBuffer);
525int JumpStringInPare(const char *buffer,int pos);
526int JumpStringInBracket(const char *buffer,int pos);
527int GetCpFromLine(int LineNum);
528BOOL GetLineNum(int pos,int *pLine,char *FileName);
529char GetEndXXXCommand(char es);
530void GetDefaultNameFromES(char es,char *name);
531void GetCalcName(int idCalc,char *name);
532BOOL IsFile(char *path);
533BOOL ShortPathToLongPath(char ShortPath[MAX_PATH],char *LongPath);
534BOOL GetFolder(HWND hWnd,char *folder,char *OpenFolderTitle);
535void ShortPathToLongPath(const char *ShortPath,char *LongPath);
536
537//calculation.cpp
538bool IsNumberTopChar(const char *buffer);
539bool IsNumberChar(const char c);
540BOOL IsNumCalcMark(const char *Command,int p);
541BOOL IsNumCalcMark_Back(const char *Command,int p);
542BOOL IsStrCalcMark(const char c);
543BOOL IsExponent(const char *Command,int p);
544int GetLiteralIndex(_int64 i64data);
545int NeutralizationType(int type1,LONG_PTR index1,int type2,LONG_PTR index2);
546DWORD GetLiteralValue(char *value,_int64 *pi64,int BaseType);
547BOOL GetConstCalcBuffer(char *name,char *Parameter,char *pCalcBuffer);
548DWORD GetConstValue(char *name,double *dbl,char *buffer,LONG_PTR *plpIndex);
549BOOL IsStringObjectType(TYPEINFO *pTypeInfo);
550BOOL IsStringSubsituation(CClass *pobj_c);
551int IsStrCalculation(char *Command);
552BYTE GetCalcId(const char *Command,int *pi);
553BOOL GetNumOpeElements(const char *Command,int *pnum,
554 char *values[255],long calc[255],long stack[255]);
555
556//NumOpe_GetType.cpp
557int AutoBigCast(int BaseType,int CalcType);
558BOOL CheckCalcType(int idCalc,int *type,int sp);
559int NumOpe_GetType(char *Command,TYPEINFO *pBaseType,LONG_PTR *plpIndex);
560
561//Subroutine.cpp
562int GetCallProcName(char *buffer,char *name);
563int GetProc(char *name,void **ppInfo);
564void SplitObjectName(const char *name,char *ObjectName,int *pRefType);
565bool SplitMemberName( const char *desc, char *object, char *member );
566int CallProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex);
567BOOL CallPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo);
568int GetReturnTypeOfProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex);
569BOOL GetReturnTypeOfPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo);
570bool GetReturnTypeOfIndexerGetterProc(CClass *pobj_Class,TYPEINFO &RetTypeInfo);
571BOOL CompareParameter(PARAMETER_INFO *ppi1,int pi_num1,PARAMETER_INFO *ppi2,int pi_num2);
572SUBINFO *AddSubData(char *buffer,int NowLine,BOOL bVirtual,CClass *pobj_c,BOOL bStatic=0);
573void GetSubInfo(void);
574void DeleteSubInfo(SUBINFO **ppSubHash,char **ppMacroNames,int MacroNum);
575void DeleteDeclareInfo(void);
576int AddProcPtrInfo(char *buffer,DWORD dwProcType);
577void DeleteProcPtrInfo(void);
578
579//LoopRefCheck.cpp
580class CLoopRefCheck{
581 char **names;
582 int num;
583 void init();
584public:
585 CLoopRefCheck();
586 ~CLoopRefCheck();
587 void add(char *lpszInheritsClass);
588 void del(char *lpszInheritsClass);
589 BOOL check(char *lpszInheritsClass);
590};
591extern CLoopRefCheck *pobj_LoopRefCheck;
592
593//error.cpp
594void SetError(int ErrorNum,const char *KeyWord,int pos);
595void CompileMessage(char *buffer);
596bool CheckDifferentType(const int VarType,const LONG_PTR lpVarIndex,const int CalcType,const LONG_PTR lpCalcIndex,const char *pszFuncName,const int ParmNum);
597
598//Compile.cpp
599void GetIdentifierToken( char *token, const char *source, int &pos );
600int JumpStatement(const char *source, int &pos);
601void DebugVariable(void);
602void Compile(void);
603
604//gc.cpp
605void InitGCVariables(void);
606void PerformedGcVarSchedule(void);
607
608
609
610#ifdef _DEBUG
611/*Debug*/
612/*
613#define HeapAlloc CheckHeapAlloc
614#define HeapReAlloc CheckHeapReAlloc
615LPVOID CheckHeapAlloc(HANDLE hHeap,DWORD dwFlags,DWORD dwBytes);
616LPVOID CheckHeapReAlloc(HANDLE hHeap,DWORD dwFlags,LPVOID lpMem,DWORD dwBytes);
617*/
618#endif
Note: See TracBrowser for help on using the repository browser.