source: dev/BasicCompiler_Common/common.h@ 69

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

一時文字列をNewしたときに、bUseHeapフラグを立たせないようにした(bUseHeapが立つのは一時構造体のときのみ)。
DEF_PTR_CHARを廃止し、typeOfPtrCharを導入。

File size: 15.6 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 "β15 (x64)"
46#else
47#define VER_INFO "β15"
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;
90extern bool isUnicode;
91extern int typeOfPtrChar;
92
93
94
95//////////////////////////////////////////
96// BasicCompiler、ProjectEditor共通の定数
97//////////////////////////////////////////
98
99//サイズ変更枠の太さ
100#define LEVER_THICK 5
101
102#define WM_SHOWERROR WM_USER+70 //エラー表示メッセージ
103
104#define WM_SETCOMPILEVIEW WM_USER+71 //コンパイラウィンドウが表示されたとき
105#define WM_DESTROYCOMPILEVIEW WM_USER+72 //コンパイラウィンドウが破棄されたとき
106
107#define WM_SETDEBUGGERBASE WM_USER+73 //デバッガベースウィンドウが表示されたとき
108#define WM_DESTROYDEBUGGERBASE WM_USER+74 //デバッガベースウィンドウが破棄されたとき
109
110#define WM_SETDEBUGGERVIEW WM_USER+75 //デバッガウィンドウが表示されたとき
111#define WM_DESTROYDEBUGGERVIEW WM_USER+76 //デバッガウィンドウが表示されたとき
112
113///////////////////////////////////////////
114
115
116#define WM_SHOWVARLIST WM_USER+80
117#define WM_VARLIST_CLOSE WM_USER+81 //変数リストの終了メッセージ(破棄のみ、解放なし)
118
119
120
121///////////////////////////////////////////
122// デバッグ コマンド
123
124#define WM_DEBUG_CONTINUE WM_USER+200
125#define WM_STEP_IN WM_USER+201
126#define WM_STEP_OVER WM_USER+202
127#define WM_STEP_CURSOR WM_USER+203
128#define WM_DEBUG_STOP WM_USER+204
129#define WM_DEBUG_PAUSE WM_USER+205
130#define WM_CLOSE_DEBUGGER WM_USER+206
131
132///////////////////////////////////////////
133
134
135
136
137#define FILE_ALIGNMENT 0x1000
138#define MEM_ALIGNMENT 0x1000
139#define EXE_HEADER_SIZE 0x1000
140
141
142//クラス管理用のクラス
143#include "Class.h"
144
145//列挙体管理用のクラス
146#include "Enum.h"
147
148//定数管理用のクラス
149#include "Const.h"
150
151
152struct ERRORINFO{
153 char *FileName;
154 int line;
155};
156struct INCLUDEFILEINFO{
157 char **ppFileNames;
158 int FilesNum;
159 int LineOfFile[MAX_LEN];
160};
161
162
163//変数
164#define REF_PARAMETER 1
165#define OBJECT_PARAMETER 2
166#define REF_VARIABLE 4
167struct VARIABLE{
168 char name[255];
169 int type;
170 union{
171 LONG_PTR index;
172 CClass *pobj_c;
173 }u;
174
175 DWORD fRef;
176
177 //定数変数かどうか
178 bool bConst;
179
180 BOOL bArray;
181 int SubScripts[MAX_ARRAYDIM];
182
183 //コンストラクタ用パラメータ
184 char *ConstractParameter;
185
186 /* --- オフセット ---
187
188 ※グローバル変数で初期バッファがない場合は最上位ビットに1がセットされ、
189 初期バッファの有無が識別される。
190 (その後、スケジュール実行により、実際の配置に並び替えられる)*/
191 int offset;
192
193
194 //レキシカルスコープ用
195 int ScopeStartAddress;
196 int ScopeEndAddress;
197 int ScopeLevel;
198 BOOL bLiving;
199
200
201 int source_code_address;
202};
203
204//変数の相対情報
205struct RELATIVE_VAR{
206 DWORD dwKind;
207 LONG_PTR offset;
208 BOOL bOffsetOffset;
209};
210
211//パラメータ
212struct PARAMETER_INFO{
213 char *name;
214 int type;
215 union{
216 LONG_PTR index;
217 CClass *pobj_c;
218 }u;
219
220 BOOL bByVal;
221 BOOL bArray;
222 int SubScripts[MAX_ARRAYDIM];
223};
224
225#define SUBTYPE_SUB 1
226#define SUBTYPE_FUNCTION 2
227#define SUBTYPE_MACRO 3
228struct SUBINFO{
229 DWORD dwType;
230
231 //クラス情報
232 CClass *pobj_ParentClass;
233
234 long id;
235
236 char *name;
237 long address;
238
239 //パラメータ
240 PARAMETER_INFO *pParmInfo;
241 int ParmNum;
242 int SecondParmNum;
243 PARAMETER_INFO *pRealParmInfo;
244 int RealParmNum;
245 int RealSecondParmNum;
246
247 //戻り値
248 int ReturnType;
249 union{
250 LONG_PTR ReturnIndex;
251 CClass *Return_pobj_c;
252 }u;
253 bool isReturnRef;
254
255 DWORD CompileAddress;
256 DWORD EndOpAddr;
257 VARIABLE *pVar;
258 int VarNum;
259
260 BOOL bExport;
261 BOOL bCdecl;
262 BOOL bVirtual;
263 BOOL bUse;
264 BOOL bCompile;
265 BOOL bSystem;
266
267 SUBINFO *pNextData;
268};
269#define DECLARE_DYNAMIC 1
270#define DECLARE_STATIC 2
271struct DECLAREINFO{
272 DWORD dwType;
273
274 char *file;
275 char *name;
276 char *alias;
277 BOOL bCdecl;
278
279 //パラメータ
280 PARAMETER_INFO *pParmInfo;
281 int ParmNum;
282
283 //戻り値
284 int ReturnType;
285 union{
286 LONG_PTR ReturnIndex;
287 CClass *Return_pobj_c;
288 }u;
289
290 union{
291 int LookupAddress;
292 int StaticProc_CodeAddress;
293 };
294
295 BOOL bUse;
296
297 int pos;
298
299 DECLAREINFO *pNextData;
300};
301struct PROCPTRINFO{
302 PARAMETER_INFO *pParmInfo;
303 int ParmNum;
304
305 int ReturnType;
306 union{
307 LONG_PTR ReturnIndex;
308 CClass *Return_pobj_c;
309 }u;
310};
311struct CONSTINFO{
312 char *name;
313 char *StrValue;
314
315 double DblValue;
316 _int64 i64Value;
317 int type;
318 LONG_PTR lpIndex;
319
320 int ParmNum;
321 char **ppParm;
322
323 CONSTINFO *pNextData;
324};
325
326
327#define CODETYPE_SYSTEMPROC 0x0001
328#define CODETYPE_DEBUGPROC 0x0002
329struct LINEINFO{
330 int TopCp;
331 int TopObp;
332 DWORD dwCodeType;
333};
334struct RESOURCEDATAINFO{
335 DWORD dwId;
336 char FileName[MAX_PATH];
337};
338
339
340//////////////////////////////////////////
341// リソース ヘッダ(アイコン、カーソル用)
342typedef struct{
343 WORD idReserved;
344 WORD idType;
345 WORD idCount;
346}ICONDIR,CURSORDIR;
347
348
349/////////////////////////////
350// .curファイルのヘッダ情報
351struct CURSORDIRENTRY{
352 BYTE bWidth;
353 BYTE bHeight;
354 BYTE bColorCount;
355 BYTE bReserved;
356 WORD wXHotspot;
357 WORD wYHotspot;
358 DWORD dwBytesInRes;
359 DWORD dwImageOffset;
360};
361struct CURSORDIRENTRY_RES{
362 WORD wWidth;
363 WORD wHeight;
364 WORD wXHotspot;
365 WORD wYHotspot;
366 DWORD dwBytesInRes;
367 WORD wCursorNum;
368};
369
370
371////////////////////////////
372//.icoファイルのヘッダ情報
373struct ICONDIRENTRY{
374 BYTE bWidth;
375 BYTE bHeight;
376 BYTE bColorCount;
377 BYTE bReserved;
378 WORD wPlanes;
379 WORD wBitCount;
380 DWORD dwBytesInRes;
381 DWORD dwImageOffset;
382};
383struct ICONDIRENTRY_RES{
384 BYTE bWidth;
385 BYTE bHeight;
386 BYTE bColorCount;
387 BYTE bReserved;
388 WORD wPlanes;
389 WORD wBitCount;
390 DWORD dwBytesInRes;
391 WORD wIconNum;
392};
393
394
395
396#include "../BasicCompiler_Common/PESchedule.h"
397#include "../BasicCompiler_Common/DebugSection.h"
398#include "../BasicCompiler_Common/LexicalScoping.h"
399#include "../BasicCompiler_Common/Variable.h"
400#include "../BasicCompiler_Common/Exception.h"
401
402
403
404int StaticCalculation(bool enableerror, const char *Command,int BaseType,_int64 *pi64data,LONG_PTR *plpIndex,BOOL bDebuggingWatchList=0);
405
406
407//BasicCompiler.cpp
408void HeapDefaultFree(LPVOID lpMem);
409void ts(int i);
410void ts(int i,int i2);
411void ts(char *msg);
412void ts(char *msg,char *title);
413void epi_check();
414void GetRelationalPath(char *path,char *dir);
415void GetFullPath(char *path,char *dir);
416void ShowErrorLine(int LineNum,char *FileName);
417BOOL GetFilePathDialog(HWND hwnd,char *filename,LPSTR Filter,LPSTR Title,BOOL bOpen);
418void MakeMessageText(char *buffer,char *msg,int flag);
419
420//hash.cpp
421int hash_default(char *name);
422CONSTINFO *GetConstHash(char *name);
423DECLAREINFO *GetDeclareHash(char *name);
424SUBINFO *GetSubHash(const char *name,BOOL bError=0);
425SUBINFO *GetMethodHash(char *ObjectName,char *MethodName,char *Parameter,BOOL bError=0);
426void GetOverloadSubHash( const char *lpszName, std::vector<SUBINFO *> &subs );
427
428//Object.cpp
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(const TYPEINFO &TypeInfo);
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//DataTable.cpp
594class DataTable{
595 void *pdata;
596 int size;
597
598public:
599 DataTable();
600 ~DataTable();
601 void Init();
602
603 int AddBinary( const void *pdata, int size );
604 int Add( _int64 i64data );
605 int Add( int i32data );
606 int Add( double dbl );
607 int Add( float flt );
608 int AddString( const char *str, int length );
609 int AddString( const char *str );
610
611 const void *GetPtr() const;
612 int GetSize() const;
613};
614extern DataTable dataTable;
615
616//error.cpp
617void SetError(int ErrorNum,const char *KeyWord,int pos);
618void SetError();
619void CompileMessage(char *buffer);
620bool CheckDifferentType(const int VarType,const LONG_PTR lpVarIndex,const int CalcType,const LONG_PTR lpCalcIndex,const char *pszFuncName,const int ParmNum);
621
622//Compile.cpp
623void GetIdentifierToken( char *token, const char *source, int &pos );
624int JumpStatement(const char *source, int &pos);
625void DebugVariable(void);
626void Compile(void);
627
628//gc.cpp
629void InitGCVariables(void);
630void PerformedGcVarSchedule(void);
631
632
633
634#ifdef _DEBUG
635/*Debug*/
636/*
637#define HeapAlloc CheckHeapAlloc
638#define HeapReAlloc CheckHeapReAlloc
639LPVOID CheckHeapAlloc(HANDLE hHeap,DWORD dwFlags,DWORD dwBytes);
640LPVOID CheckHeapReAlloc(HANDLE hHeap,DWORD dwFlags,LPVOID lpMem,DWORD dwBytes);
641*/
642#endif
Note: See TracBrowser for help on using the repository browser.